Nous avons récemment mis à niveau notre framework de base vers Springboot 3.3.5 et d'autres bibliothèques associées.
Un bug m'a été signalé lors des tests. Certaines requêtes échoueraient avec JSqlParser 5.0.
Voici une démonstration simple :
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()); } }
Le problème est que JSqlParser 5.0 ne prend pas en charge la syntaxe CONVERT de style MySQL CONVERT(expr, type). Il prend uniquement en charge :
Style SQL Server : CONVERTIR(type, expr)
Conversion du jeu de caractères : CONVERTIR(expr USING charset)
Cela affecte les requêtes utilisant la fonction CONVERT de MySQL, en particulier lorsque l'expression est complexe (comme l'utilisation d'instructions IF).
Grammaire actuelle dans JSqlParser :
{ <K_CONVERT> "(" ( LOOKAHEAD(ColDataType() ",") ( colDataType = ColDataType() "," expression = Expression() [ "," style = <S_LONG> ] ) | ( expression = Expression() <K_USING> transcodingName=IdentifierChain() ) ) ")" }
Il existe deux solutions à ce problème :
Utilisez CAST au lieu de CONVERT
Remplacez simplement CONVERT(expr, type) par CAST(expr AS type). C'est la solution la plus simple si vous utilisez MySQL
Modifier la grammaire JSqlParser pour prendre en charge CONVERT(expr, type)
Besoin de modifier les règles de grammaire pour prendre en charge la syntaxe MySQL. Soyez cependant prudent avec la méthode TranscodingFunction.appendTo. L'implémentation actuelle génère CONVERT(type, expr) qui est légal dans SQL Server, mais illégal dans 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(" )"); } }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!