SqLite文法からの変更箇所 - hiro80/miniSqlParser GitHub Wiki

SqLite文法からの変更箇所

✔UPDATEとDELETE文のテーブル名でテーブル別名を定義可能

✔ドキュメンテーションコメントでのテーブル別名を定義可能

✔SQL文出力時にコメントも出力する

→ StringifierVisitorにおいて、ASTの各ノードを文字列として出力するたびに、GetHiddenTokensToRight()からCOMMENTチャンネルから コメントトークンの有無を判定し、存在すれば出力する。判定のためにはASTの各ノードに自身のTokenIndexを保持する必要があるだろう

✔多言語対応

✔Window関数対応

✔Merge文対応

✔Call文対応

✔IF文対応

✔Pragma文をPragma Table_Infoに限定

✔引数の区切りにASを使う関数への対応(SUBSTRING, EXTRACT)

✔RIGHT OUTER JOINの追加

✔FULL OUTER JOINの追加

✔プレースホルダ対応

✔TOP句

✔SOME,ANY,ALLを許可

✔exprの文法を標準的なSQLに変更する(a = b > c のような記述を禁止する)

✔IDENTIFIERのエスケープ文字[],"",''のうち[],''を禁止する

✔数値リテラルに16進数表記を追加

✔数値リテラルの末尾に浮動小数点型を示すD,FのSuffixを許可

✔文字列リテラルの先頭にNのPrefixを許可

文字列リテラルにQストリングを許可 ただし、任意文字を区切り文字に指定したQストリングは未実装 日付、時刻、タイムスタンプリテラルの許可

✔IDENTIFIERからSTRING_LITERALを禁止する

✔IDENTIFIERを()で囲むのを禁止する

✔IDENTIFIERから''でエスケープする書式を禁止する

AND,OR,NOT以外の演算子の優先順位はDBMS毎に異なるが、 AND,OR,NOT以外の演算子が、複数連続する記述はできないので(x>y>zのような記述はSQLではできない※) 実質的な演算子の優先順位に差異はない

※ただしSQLiteでは記述できるが、SqlBuilderの文法では実装をシンプルにするため許可しない

✔サブクエリをExpressionに含める

✔DEFAULTキーワードを許可

✔SELECT句の'*'を1つに限定

With Recursiveを許可するか否か?

✔Select文のFor Update

✔With句はサブクエリに記述することを禁止する

✔INSERT文のDEFAULT VALUES句は禁止する テーブルカラムが省略されDEFAULT VALUES句が指定されるとAssignmentsの要素数が決定できないため

✔Stmt直前のコメント(HeaderComment)格納

✔REPLACE文

✔ISNULL、ISNOTNULLを禁止する

✔In演算子の被演算子にTable_Nameを指定することを禁止する