Un article expliquant les outils de génération SQL

L'outil de génération SQL peut être utilisé pour tester  la compatibilité de Parser  avec d'autres produits de base de données. En analysant  les productions dans le fichier de grammaire YACC  , l'instruction SQL  correspondante  est générée, puis la base de données est utilisée pour exécuter le  SQL en fonction des résultats. , il est jugé si l'instruction est compatible avec une autre syntaxe de base de données.

0 1 Utilisation de l'outil

Prétraitement du fichier de grammaire

Le but du prétraitement est de supprimer le contenu non pertinent dans le fichier de grammaire et de conserver uniquement les productions de chaque instruction. Vous pouvez obtenir les règles de grammaire dans le fichier de grammaire (sans action) via la commande bison -v sql.y, puis supprimer les règles de grammaire. le contenu généré dans le fichier généré, telles que la liste des symboles de terminal, la liste des symboles non terminaux, la table de transition d'état, etc., sont les suivantes :

Le contenu du fichier sql.output généré est le suivant, nous ne retenons que sa section « Syntaxe » :

Remarque : Pour la section réservée « Syntaxe », son numéro de série doit également être supprimé.

 

Pour le processus ci-dessus, nous l'encapsulons via le script de prétraitement preprocess.sh afin que les fichiers traités répondent aux exigences de l'outil. Le format de fichier généré est le suivant et le fichier de sortie .output est le fichier de grammaire prétraité.

 

Génération d'instructions SQL

Après avoir généré un fichier de syntaxe répondant aux conditions, vous pouvez utiliser l'outil pour générer du SQL. L'outil prend en charge les paramètres suivants :

•-b : spécifie le fichier de syntaxe requis. Le fichier de syntaxe est le fichier généré après traitement par le script preprocess.sh.

•-n : Précisez le nom de la production à générer, obligatoire

•-R : mode généré aléatoirement, facultatif, la valeur par défaut est le mode énumération

•-o : Spécifiez le fichier de sauvegarde pour générer les instructions SQL, facultatif, la valeur par défaut est report.csv

•-N : Limiter le nombre d'instructions SQL générées, facultatif, aucune limite par défaut

 

0 2 mise en œuvre de l'outil

Cet outil contient deux packages : yacc_parser et sql_generator, qui sont respectivement responsables de l'analyse des jetons et de la génération SQL.

Méthode de production d'expression

type SeqInfo struct {
    Items []string
}
type Production struct {
    Head  string    // 产生式头部
    Alter []SeqInfo     // 产生式 body
}

​​​​​​​

Analyse des jetons

La fonction Tokenize est utilisée pour tokeniser les caractères dans le fichier de grammaire lu, et chaque appel renverra un jeton. Cette fonction ne gère que les délimiteurs simples et les guillemets et n'implémente pas de correspondance régulière de l'analyseur lexical standard.

La fonction Parse appelle la fonction Tokenize, renvoyant un jeton à chaque fois. Après son retour, la fonction Parse assemble une série de jetons en production en fonction de l'état actuel et du type de jeton.

 

Génération SQL

Il existe deux modes de génération SQL :

1. Parcourez la liste des corps de la production spécifiée dans Production et énumérez pour générer des instructions SQL ;

2. Sélectionnez aléatoirement la liste des corps de la production spécifiée dans Production et générez aléatoirement des instructions SQL.

 

1. Énumération

La mise en œuvre de l'énumération consiste à utiliser une liste chaînée pour enregistrer le jeton à résoudre. Chaque fois qu'un jeton est extrait de la tête de la liste chaînée, le nombre d'occurrences du jeton est incrémenté, puis en fonction du nombre. Le nombre d'occurrences du jeton dans l'enregistrement dans chaque sous-expression est supérieur aux temps spécifiés, filtrez les sous-expressions qui peuvent continuer à être déduites.

D'autre part, deux tableaux sont utilisés pour enregistrer l'indice (choix) de la sous-expression actuellement prise et l'indice (max) de la sous-expression maximale actuelle à enregistrer, afin que l'expression suivante puisse être incrémentée par choix.

Après le filtrage, sélectionnez la bonne sous-expression de la production à la position de choix et insérez tous ses jetons dans l'en-tête de la liste chaînée, puis déterminez si l'en-tête est littéral ou mot-clé. Si tel est le cas, retirez l'en-tête et placez-le dans le. Tableau SQL. Sinon, continuez la boucle dans la liste chaînée.

Lorsque le traitement atteint la fin de la production en cours (la méthode de jugement est choix>max), un « carry » sera tenté à ce moment-là, c'est-à-dire que le dernier chiffre du tableau de positions actuellement enregistré est incrémenté.

Par exemple : le tableau maximum est 1 2 1 3, le tableau de choix est 0 0 0 3, puis le tableau de choix après report est 0 0 1 0, ce qui signifie que la dernière position a été parcourue, et maintenant l'avant-dernière position doit être incrémenté, et la dernière position zéro, continuez à lire la permutation et la combinaison suivantes.

Le processus de génération est mis en œuvre par récursion. Par exemple, pour la production suivante, la logique de traitement est la suivante :

show_tables_stmt : AFFICHER LES TABLES DU nom '.' nom avec_commentaire
                | AFFICHER LES TABLES DE nom avec_commentaire
                | AFFICHER LES TABLES avec_comment

avec_comment : AVEC COMMENTAIRE
            | %

nom vide : ID ENT

 

En fonction de la valeur de choix enregistrée, sélectionnez la sous-expression de choix de la production jusqu'à ce qu'un SQL soit généré. Emportez ensuite le tableau de choix et passez au prochain tour de sélection.

2. Aléatoire

Le mode de génération aléatoire est similaire au mode de génération d'énumération, sauf qu'il ne parcourt pas séquentiellement chaque jeton dans la liste des corps de production, mais sélectionne de manière aléatoire un jeton dans le cadre du SQL.

 

J'ai décidé d'abandonner les logiciels industriels open source. OGG 1.0 est sorti, Huawei a contribué à tout le code source. Ubuntu 24.04 LTS a été officiellement publié. L'équipe de Google Python Foundation a été tuée par la "montagne de merde de code" . ". Fedora Linux 40 a été officiellement lancé. Une société de jeux bien connue a publié de nouvelles réglementations : les cadeaux de mariage des employés ne doivent pas dépasser 100 000 yuans. China Unicom lance la première version chinoise Llama3 8B au monde du modèle open source. Pinduoduo est condamné à compenser 5 millions de yuans pour concurrence déloyale Méthode de saisie dans le cloud domestique - seul Huawei n'a aucun problème de sécurité de téléchargement de données dans le cloud.
{{o.name}}
{{m.nom}}

Je suppose que tu aimes

Origine my.oschina.net/u/5148943/blog/11054997
conseillé
Classement