Maison > base de données > tutoriel mysql > JSqlParser - problème avec la fonction MySQL Convert(expr,type)

JSqlParser - problème avec la fonction MySQL Convert(expr,type)

DDD
Libérer: 2024-12-13 08:03:10
original
293 Les gens l'ont consulté

JSqlParser- problem with MySQL Convert(expr,type) function

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());
  }
}
Copier après la connexion

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()
        )
    )
    ")"
}
Copier après la connexion

Il existe deux solutions à ce problème :

  1. 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

  2. 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(" )");
        }
    }
Copier après la connexion

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!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal