Documentation PostgreSQL 7.4.29 | ||||
---|---|---|---|---|
Précédent | Arrière rapide | Chapitre 42. Présentation des mécanismes internes de PostgreSQL | Avance rapide | Suivant |
L'étape d'analyse consiste en deux parties :
L'analyseur défini dans gram.y et scan.l est construit en utilisant les outils Unix yacc et lex.
Le processus de transformation fait des modifications et des ajouts aux structures de données renvoyées par l'analyseur.
L'analyseur doit vérifier la syntaxe valide de la chaîne de la requête (arrivant comme un texte ASCII). Si la syntaxe est correcte, un arbre d'analyse est construit et renvoyé, sinon une erreur est retournée. Les analyseur et vérificateur syntaxiques sont implémentés en utilisant les outils bien connus que sont lex et yacc.
L'analyseur lexical est défini dans le fichier scan.l et est responsable de la reconnaissance des identificateurs, des mots clés SQL, etc. Pour chaque mot clé ou identificateur trouvé, un jeton est généré et renvoyé à l'analyseur.
L'analyseur est défini dans le fichier gram.y et consiste en un ensemble de règles de grammaire et en des actions à exécuter lorsqu'une règle est découverte. Le code des actions (qui est en langage C) est utilisé pour construire l'arbre d'analyse.
Le fichier scan.l est transformé en fichier source C scan.c en utilisant le programme lex et gram.y est transformé en gram.c en utilisant yacc. Après avoir réalisé ces transformations, un compilateur C normal peut être utilisé pour créer l'analyseur. Ne jamais faire de changement aux fichiers C générés car ils seront écrasés la prochaine fois que lex ou yacc seront appelés.
Note : Les transformations et compilations mentionnées sont normalement réalisées automatiquement en utilisant les makefiles distribués avec les sources de PostgreSQL.
Une description détaillée de yacc ou des règles de grammaire données dans gram.y serait en dehors du champ de ce document. Il existe de nombreux livres et documentations en relation avec lex et yacc. Vous devez être familier avec yacc avant de commencer à étudier la grammaire donnée dans gram.y, sinon vous ne comprendrez rien à ce qui s'y passe.
L'étape d'analyse crée un arbre d'analyse utilisant seulement les règles fixes de la structure syntaxique de SQL. Il ne fait aucune recherche dans les catalogues système, donc il n'y a aucune possibilité de comprendre la sémantique détaillée des opérations demandées. Après que l'analyseur ait fini, le processus de transformation prend l'arbre résultant de l'analyseur en entrée et réalise l'interprétation sémantique nécessaire pour connaître les tables, fonctions et opérateurs référencés par la requête. La structure de données construite pour représenter cette information est appelé l'arbre de la requête.
La raison de la séparation de l'analyse brute et de l'analyse sémantique est que les recherches des catalogues système peuvent seulement se faire à l'intérieur d'une transaction, et nous ne voulons pas commencer une transaction immédiatement après avoir reçu une requête. L'analyse brute est suffisante pour identifier les commandes de contrôle des transactions (BEGIN, ROLLBACK, etc) et elles peuvent être correctement exécutées sans plus d'analyse. Une fois que nous savons que nous gérons une vraie requête (telle que SELECT ou UPDATE), nous pouvons commencer une transaction si nous n'y sommes pas déjà. C'est seulement maintenant que le processus de transformation peut être appelé.
La plupart du temps, l'arbre d'une requête créée par le processus de transformation est structurellement similaire à l'arbre d'analyse brute mais il existe beaucoup de différences dans le détail. Par exemple, un nœud FuncCall dans l'arbre d'analyse représente quelque chose qui ressemble syntaxiquement à l'appel d'une fonction. Il peut être transformé soit en nœud FuncExpr soit en nœud Aggref suivant que le nom référencé est une fonction ordinaire ou une fonction d'agrégat. De même, des informations sur les types de données réels des colonnes et des résultats sont ajoutées à l'arbre de la requête.
Précédent | Sommaire | Suivant |
Moyens pour établir des connexions | Niveau supérieur | Système de règles de PostgreSQL |