[前][次][番号順一覧][スレッド一覧]

mysql:177

From: Kengo Jinno <Kengo Jinno <kengo@xxxxxxxxxx>>
Date: Mon, 08 Jun 1998 19:37:39 +0900
Subject: [mysql 177] MB char in identifier which starts with digit char


神野です。
#Subjectはデタラメです(^_^;

MySQLをMultiByte環境で使っている時、次のようなフィールド名を持つテーブルが
作成できませんでした。

create table ほげほげ (
  1回あたり integer
)

「1」を「1」とかに変えたら解決するんですが、「数字やアルファベットは
ASCIIを使う」というルールでやっているので、そうもいきません。
ソース(sql/sql_lex.cc)を見ると、数字から始まる識別子の場合、数字の後に
使えるキャラクタとしては、アルファベットかアンダーバーしか認めていない
ようでした。

そこで次のようなパッチをあてて対処しました。(mysql-3.21.30です)


diff -p old/sql_lex.cc new/sql_lex.cc
*** old/sql_lex.cc	Mon May  4 05:03:06 1998
--- new/sql_lex.cc	Mon Jun  8 16:15:46 1998
*************** int yylex(void *arg)
*** 785,791 ****
--- 785,795 ----
  
      case STATE_NUMBER_IDENT:		// number or ident which starts with num
        while (isdigit((c = yyGet()))) ;
+ #if defined(USE_MB) && defined(USE_MB_IDENT)
+       if (!isalpha(c) && c != '_' && !ismbhead(c))
+ #else
        if (!isalpha(c) && c != '_')
+ #endif
        {					// Can't be identifier
  	state=STATE_INT_OR_REAL;
  	break;


これでうまく行ってる雰囲気なんですが、別の問題が判明しました。
こちらはMB文字でなくても発生します。

create table foo (
 1st integer not null,
 2nd double not null,
 primary key foo_i1 (1st)
)
go
-> 問題なし

select 1st,2nd from foo
go
-> 問題なし

select bar.1st,bar.2nd from foo bar
go
-> ERROR 1064: parse error near '.1st,bar.2nd from foo bar' at line 1

同じく、sql/sql_lex.ccのyylex()あたりだろうと思うのですが、関係しそうな
箇所が多いのと副作用が恐いので手が出せてません(^_^;

-----------------------------
神野健吾 <kengo@xxxxxxxxxx>


[前][次][番号順一覧][スレッド一覧]

->     177 1998-06-08 19:37 [Kengo Jinno <kengo@x] MB char in identifier which starts with digit char
       178 1998-06-11 17:40 ┣[<takeshi@xxxxxxxxxx>]                                       
      1246 1999-09-20 16:25 ┗[朝日生命主計部数理課] パック形式のデータロードについて      
      1247 1999-09-20 22:53  ┗[Satoshi Koiwa <koiwa]