10
votes

Pourquoi n'y a-t-il pas d'analyseur SQL décent?

Je fais actuellement une analyse ORACLE SQL et je rencontre souvent une instruction SQL valide qui ne peut pas être correctement analysée par divers analyseurs SQL. Soit ils échouent à l'analyser, soit leur arborescence de syntaxe abstraite générée est en quelque sorte foirée. Il semble que le seul analyseur pouvant vraiment gérer Oracle SQL est celui qui n'est pas disponible publiquement et ne peut être obtenu comme un analyseur autonome.

Je suis conscient du fait qu'il y a différentes grammaires SQL et se conformer à tous peut ne pas être possible. Mais même les parsers qui prétendent être des analyseurs Oracle SQL ne réussissent pas dans tous les cas.

Selon vous, quelles sont les principales raisons pour lesquelles il est difficile de mettre en œuvre des analyseurs SQL en général ou Oracle SQL Parsers en particulier?

meilleur, Sera


2 commentaires

Par "énoncé SQL valide", vous voulez dire ANSI SQL correct? Si tel est le cas, non sûr de savoir pourquoi (avec des normes définies) toute syntaxe conforme ne pourrait pas être analysée. La syntaxe spécifique à Oracle (+) est toujours prise en charge pour des raisons héritées par Oracle, mais le nouveau code doit être écrit dans un style ANSI. Jusque-là, bonne chance;)


Non avec valide, je veux dire valable dans une grammaire spécifique. Dans mon cas, je son oracle SQL, que mon analyseur prétend être conforme à.


5 Réponses :


1
votes

Ils le font mal? :) ... cela peut évidemment être fait puisque les analyses des moteurs de base de données fonctionnent bien;) ... cela pourrait probablement être dû à plusieurs facteurs. La dialecte peut ne pas être bien documentée ni avoir été modifiées récentes sur le dialecte non implémentées dans l'analyseur en question.


0 commentaires

8
votes

Bon parseurs sont difficiles à écrire. Cela commence par le générateur de code pour l'analyseur de code (qui habituellement Eats certains (E) BNF comme la syntaxe qui a ses propres limites).

Erreur de manipulation dans parseurs est un sujet de recherche propre. Ceci est non seulement de détecter les erreurs, mais aussi de donner des informations utiles ce qui pourrait être mal et comment le résoudre. Certains parseurs n'offrent même pas des informations de localisation ( « erreur est survenue à la ligne / colonne »).

Ensuite, vous avez SQL qui signifie "Structured Query Language", et non " Standard Query Language". Il existe une norme SQL, même plusieurs, mais vous ne trouverez pas une base de données unique qui met en œuvre l'un d'eux.

Oracle offre à contrecoeur VARCHAR mais il vaut mieux utiliser VARCHAR2. Certaines bases de données offrent récursive / arbres comme les requêtes. Tous utilisent leur propre syntaxe spéciale pour cela. L'inscription est définie assez clairement dans la norme ( JOIN , se joindre à gauche , ...) mais pourquoi s'embêter si vous pouvez utiliser +

En plus de cela, pour toutes les versions de base de données, de nouvelles fonctionnalités sont ajoutées à la grammaire.

Ainsi, alors que vous pourriez écrire un analyseur qui peut lire les cas standards, l'écriture d'un analyseur qui peut prendre en charge toutes les fonctionnalités qui toutes les bases de données autour de l'offre de monde, est presque impossible. Et je ne parle même pas des insectes que vous pouvez rencontrer dans ces parseurs.

Une solution serait si tous les fournisseurs de bases de données publieraient les fichiers de grammaire. Mais ce sont des joyaux de la couronne (IP). Donc, vous devriez être heureux que vous pouvez utiliser les sans avoir à payer une redevance par caractère * analysable nombre de processeurs.


0 commentaires

3
votes

Lorsqu'un fabricant prétend supporter une langue x, il signifie "quelque chose comme la standard x" mais pas la norme. Les fabricants pour des raisons historiques mettent en œuvre la langue x avant que la norme était en standard, ils commencent donc au mauvais pied; essayer de faire leur version match la norme brise généralement leur grande base de code d'utilisateur; Et ils veulent toujours ajouter leurs propres goodies à verrouiller leurs utilisateurs.

Ceci est vrai pour SQL, C, C ++ ... Les seules langues que je connaises de l'endroit où les gens essaient fort à correspondre à la norme sont ADA, et même il s'agit de plusieurs dialectes. (Regardez ce que les navigateurs acceptent!).

Vous ne pouvez pas vous attendre à un analyseur SQL SQL hors-la-étagère pour analyser PLSQL. Vous devez vraiment avoir un analyseur PLSQL. Et ceux-ci sont difficiles à construire comme la documentation est médiocre, Oracle n'a aucune raison de le réparer et n'a certainement aucune motivation pour aider le constructeur de grammaire.

Ma société (designs sémantiques) a un PLSQL Parser qui couvre 10G jolie Eh bien (la documentation de Oracle est médiocre ... Nous continuons à trouver des variations des documents de référence) et fait la plupart de 11g. Nous l'avons exécuté à travers des millions de lignes de code PLSQL.


0 commentaires

1
votes

métadonnées. xxx

peut signifier identifiant_1 est un schéma ou un package, et identifiant_2 peut être une fonction ou synonyme d'une fonction.

Il y a un tas de raisons pour lesquelles une déclaration peut être correcte mais ne peut être comprise sans les métadonnées sur les objets de base de données. Compte tenu de ces limitations, il y a une limite à la distance d'un analyseur.

Si un analyseur peut effectuer 80% de votre code et que 15% ne peuvent pas être élaborés sans les métadonnées, il y a des rendements décroissants dans l'étirement de l'analyseur pour faire face à la "5%" manquante. < / p>


0 commentaires

0
votes

Si vous jetez un coup d'œil à Oracle SQL Référence: http://docs.oracle.com/cd/b28359_01/server .111 / B28286 / TOC.HTM

Vous saurez à quel point il est difficile de créer un analyseur SQL qui prend en charge entièrement toute la syntaxe SQL Oracle SQL, c'est presque impossible.

Même la documentation énumérée ci-dessus n'a pas documenté toute la syntaxe précisément qui peut être utilisée pour créer un analyseur ORACLE SQL.

Pour chaque version de base de données, une nouvelle syntaxe sera ajoutée constamment.

Je pense qu'un parseur SQL comme General SQL Parser qui couvre la syntaxe SQL la plus importante de diverses bases de données majeures peut-être un choix.


1 commentaires

Cela pourrait être difficile, mais Oracle en a sûrement créé un.