C#は電気羊の夢を見るか?(引っ越し中)

dtiブログが閉鎖とのことでhttp://tanocs.blog.fc2.com/へ引っ越します。

CsharpSQLiteの問題点

C#で実装し直された完全マネージッドなSQLite
http://code.google.com/p/csharp-sqlite/

このCsharpSQLiteは特定の文字列がクエリに含まれていると実行できないバグがある

問題はSqlite3クラスのクエリチェックメソッド『sqlite3GetToken』内にて発生していた
原因はString[]からByteにキャストして、ヌル文字を判定している箇所にて、
string[]に2バイト文字が入った場合、前半1バイト分が情報落ちする。
そのため、下1バイトが'00'の文字でヌル文字と判断されるため、クエリが通らなくなる。

尚、その条件に当てはまるのは以下の16文字
∀、─、一、稀、紀、儀、言、最、蔀、需、退、刀、謀、掘、耀、椀

以上の文字を含むクエリは以下の例外で終了してしまうはずです。
Community.CsharpSqlite.SQLiteClient.SqliteSyntaxException (0x80004005): unrecognized token '対象文字


修正はわりと単純で
Community.CsharpSqliteプロジェクト内の
complete.csとtokenize.csを修正すれば良い

以下は「sqlite_3_7_7_1_71」を元にした場合の修正方法
(尚、12月19日コミット分でも同様の方法で修正できます)

■complete.cs内
◇44行〜

static bool IdChar( u8 C )
{
return ( sqlite3CtypeMap[(char)C] & 0x46 ) != 0;
}

≡変更≡

static bool IdChar(char C)
{
return (sqlite3CtypeMap[C] & 0x46) != 0;
}



◇244行〜

if ( IdChar( (u8)zSql[zIdx] ) )
{
/* Keywords and unquoted identifiers */
int nId;
for ( nId = 1; ( zIdx + nId ) < zSql.Length && IdChar( (u8)zSql[zIdx + nId] ); nId++ )

≡変更≡

if (IdChar(zSql[zIdx]))
{
/* Keywords and unquoted identifiers */
int nId;
for (nId = 1; (zIdx + nId) < zSql.Length && IdChar(zSql[zIdx + nId]); nId++)


■tokenize.cs
◇129行
byte c = 0;
≡変更≡
char c = '¥0'; //¥を半角して下さい


◇201行
c = 0;
≡変更≡
c = '¥0'; //¥を半角して下さい

◇"(byte)z" を "z" に置換



最後に、情けない話ですが、
どなたか、本家のコミュニティに、この事を伝えられる方がいたら伝えてください。
英語とか、読んで雰囲気を感じるのが精一杯なんですorz


追記:2012/12/22
と思ったら既に本家のコミュニティで4月には、わかっていた問題だったようで、
issueとして対策が載っておりMileStone3.7.11として登録済みでした。

尚、それを参考に修正方法を、キャストしない方式に修正しました。

http://code.google.com/p/csharp-sqlite/issues/detail?id=151
このエントリーをはてなブックマークに追加
LINEで送る

コメント

コメントの投稿

管理者にだけ表示を許可する

トラックバック

http://t01a.dtiblog.com/tb.php/161-d429a04e

« ComboBoxへDictionaryを関連付ける  | HOME | 

PAGE TOP ▲

Appendix

■春条

■春条

生息地は愛知
車と甘い物が好きな31歳
特技は無限昼寝

MONOからSharpDXを使う
変態的な手法で、
.NET Frameworkを使わずに
ゲーム作りやってます。

Search

Calender

« | 2017-08 | »
S M T W T F S
- - 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 - -

Twitter

Recent Entries

DTIブログポータルへ
このブログを通報
Report Abuse

利用規約