最近、基本フレームワークを springboot 3.3.5 およびその他の関連ライブラリにアップグレードしました。
テスト中にバグが報告されました。 JSqlParser 5.0.
では一部のクエリが失敗します。これは簡単なデモンストレーションです:
public class Test { public static void main(String[] args) throws JSQLParserException { String sql = "SELECT CONVERT(IF(bill_type = 2, id, ''), char) from dual"; Statement statement2 = CCJSqlParserUtil.parse(sql); System.out.println(statement2.toString()); } }
問題は、JSqlParser 5.0 が MySQL スタイルの CONVERT 構文 CONVERT(expr, type) をサポートしていないことです。以下のみをサポートします:
SQL Server スタイル: CONVERT(type, expr)
文字セット変換: CONVERT(expr USING charset)
これは、特に式が複雑な場合 (IF ステートメントの使用など)、MySQL の CONVERT 関数を使用するクエリに影響します。
JSqlParser の現在の文法:
{ <K_CONVERT> "(" ( LOOKAHEAD(ColDataType() ",") ( colDataType = ColDataType() "," expression = Expression() [ "," style = <S_LONG> ] ) | ( expression = Expression() <K_USING> transcodingName=IdentifierChain() ) ) ")" }
この問題には 2 つの解決策があります:
CONVERT の代わりに CAST を使用してください
CONVERT(expr, type) を CAST(expr AS type) に置き換えるだけです。 MySQL
CONVERT(expr, type) をサポートするように JSqlParser 文法を変更します
MySQL 構文をサポートするには文法規則を変更する必要があります。ただし、TranscodingFunction.appendTo メソッドには注意してください。現在の実装では CONVERT(type, expr) が生成されますが、これは SQL Server では合法ですが、MySQL
では違法です
public StringBuilder appendTo(StringBuilder builder) { if (isTranscodeStyle) { return builder .append("CONVERT( ") .append(expression) .append(" USING ") .append(transcodingName) .append(" )"); } else { return builder .append("CONVERT( ") .append(colDataType) .append(", ") .append(expression) .append(transcodingName != null && !transcodingName.isEmpty() ? ", " + transcodingName : "") .append(" )"); } }
以上がJSqlParser - MySQL Convert(expr,type) 関数の問題の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。