IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Parser SQL - Algorithme


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 15
    Points : 14
    Points
    14
    Par défaut Parser SQL - Algorithme
    Bonjour à tous,

    j'utilise un langage particulier d'un gros ERP, qui n'est vraiment pas doué en SQL. A ce titre, j'ai développé une sorte d'éditeur SQL, mais je bloque sur un point, l'analyse de la syntaxe. En effet, j'ai besoin de connaitre les champs sélectionnés, et les tables auquels ils font référence (ou bien leur type).

    Google ne m'a pas spécialement aidé, bien qu'un certain nombre de versions plus ou moins payante dans différents langage existent.

    A défaut de trouver un code source d'un Parser existant quelconque dans n'importe quel langage (si qqun connais je suis preneur !! ), quel serait la logique, l'algo a respecter pour mettre ça en oeuvre ?

    J'ai cru comprendre qu'il fallait initier un arbre avec des noeuds comprendant les différents mots de la requête, mais je ne vois pas vraiment comment.

    Idéalement, ce parser devrait pouvoir interpréter des select de select, ainsi que les decode, nvl, etc.

    Merci d'avance de vos idées/retours !

    NiKro

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Ce n'est peut-être pas dans le forum "Langage SQL" que tu auras une réponse adéquate ! C'est plutôt de la programmation !

    Pour quand même te mettre sur la piste, tu peux décomposer la chaîne SQL en morceaux :
    - Ce qui est compris entre SELECT et FROM est normalement constitué de colonnes et éventuellement d'alias, de fonctions de calcul, de branchements (CASE)...
    - Ce qui est compris entre FROM et WHERE ou jusqu'à la fin de la chaîne SQL est constitué de tables avec éventuellement des jointures et leurs conditions ;
    - Ce qui est compris entre WHERE et GROUP BY ou ORDER BY ou jusqu'à la fin est contitué de conditions de restriction sur les données ;
    - Ce qui est compris entre GROUP BY et HAVING ou ORDER BY ou jusqu'à la fin est constitué de colonnes qui doivent normalement figurer parmi la liste des colonnes du SELECT ;
    - Ce qui est compris entre HAVING et ORDER BY ou jusqu'à la fin est constitué de conditions de restriction sur les regroupements de données ;
    - Ce qui est compris entre ORDER BY et la fin est constitué de colonnes et éventuellement de clauses d'ordre (ASC ou DESC)

    Mais bon... bonjour le boulot !

    Bon courage !

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 15
    Points : 14
    Points
    14
    Par défaut
    Merci de ta réponse !

    En effet, j'ai hésité à poster dans une autre section, comme Algorithme, mais je suppose qu'il vaut mieux éviter de poster n fois le même message dans différentes section

    Pour le découpage de la requête, en effet, avec des RegEx, j'arrive à peu près à récupérer ce qu'il y a entre SELECT et FROM, mais dès que j'envisage des cas plus complexe, je bloque. Ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Select A.champ_bis, C.ch
      From ( Select champ As champ_bis
               From matable1, matable2
              Where clé1 = clé2) A
      Join matable C
        on ...
    Je peux certes convenir de limiter les syntaxes complexes, mais l'idéal serait d'en traiter au moins quelques unes

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Ce qui serait bien déjà, c'est d'avoir une seule syntaxe pour les jointures : la normalisée depuis 1992 avec JOIN !

    Après c'est vrai que dans le cas que tu donnes et par rapport à ce que j'ai donné comme piste tout à l'heure :
    - Ce qui est compris entre FROM et WHERE ou jusqu'à la fin de la chaîne SQL est constitué de tables avec éventuellement des jointures et leurs conditions ;
    il y a deux FROM de suite et un WHERE intermédiaire !

  5. #5
    Membre confirmé Avatar de Monstros Velu
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 619
    Points : 601
    Points
    601
    Par défaut
    Les parenthèses servent à séparer les groupes, le parser peut les utiliser.

  6. #6
    Nouveau membre du Club
    Inscrit en
    Février 2003
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 36
    Points : 37
    Points
    37
    Par défaut
    sinon, une petite piste qui peut peut etre te mettre sur la voie...

    grosso modo, tu parses ta chaine de charactere avec une sorte de boucle,
    des bon ptit charindex pour trouver la position de chaque from
    et avec des substring, des len (de charindex de "from" ou "select" etc...), en partant du dernier "from" rencontré jusqu'au premier, tu devrais pouvoir decouper et parser ta chaine comme tu le souhaites.
    je sais pas si je suis super clair, mais je ne pense pas que ce soit insurmontable (attention, je parle de sqlserver).

    Bon courage a toi

  7. #7
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    La creation d'un parser, necessite l'ecriture d'une grammaire non contextuelle adéquate (cf algo d'Earley par exemple).
    La bonne etude de cette grammaire vous permettra de gerer efficacement votre anaylse syntaxique (et lexicale).

    Bon courage

  8. #8
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut !

    Tout à fait d'accord avec Yanika_bzh.

    Je tiens à mettre l'accent sur le fait que coder un parser, c'est pas un "détail". (Cinephil, je pense que dire "je te donne un indice, puis tu devrais y arriver est un peu périeux, sans vouloir remettre en cause ta capacité à pondre un parser SQL...)

    Il faut définir soigneusement ce que sont les expressions de base, toutes les manières de construire une nouvelle expression à partir d'expressions de départ et "d'opérateurs". Bien entendu, comme le montre l'exemple de la table dérivée, c'est totalement récursif... c'est une algèbre, quoi.

    Bon courage...

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 15
    Points : 14
    Points
    14
    Par défaut
    Bonjour,

    et merci à tous pour vos réponses.

    En effet, le langage que j'utilise me permet d'utiliser les RegEx (Expressions Régulières), et me renvoie la position du 1er caractère du mot recherché, voire toutes les occurences. Je sens bien qu'il est possible de créer une sorte d'algo, à base de IF et de CASE, mais je sens que ça ne pas pas être artistique du tout !

    pacmann et Yanika_bzh, c'est bien quelque chose tel que vous décrivez que j'aimerais mettre en place, en espérant que ça ne me prenne pas un temps fou.

    Jusqu'à présent, à part trouver une multitude de Parser existant et plus ou moins, voire pas du tout, gratuit, ni OpenSource, je n'ai pas trop avancé.

    Je vais creuser la piste Earley, si vous en avez d'autres, je suis prenneur !

    PS : et j'avoue que je n'étais pas très assidu à mes cours d'algorithmie...

  10. #10
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    Pour parser un langage complet, c'est assez fastidieux.
    J'avais realiser un petit parseur durant mes (lointaines) etudes avec un champs lexical assez limité et c'etait deja pas simple.

    Cela se repose sur les grammaires formelles avec des regles a enoncer.
    Les sous ensembles se decomposent eux memes selon les fameuses regles afin d'arriver a un element atomique de la regle.

    Il faut donc enumerer les elements terminaux (qui ne peuvent plus beneficier d'une transformation par une regle) et les regles de transformation (qui ont pour but de transformer un element non terminal en elements terminaux apres n etapes)

    Le sujet des grammaires contextuelles et non contextuelles a été traité ici :

    http://www.developpez.net/forums/d25...textuelle-tla/

    Mais la on s'eloigne du SQL a proprement parler ...

    En esperant que cela puisse vous aider
    Bon courage et tenez nous au courant

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Cherche parser SQL
    Par freud dans le forum Bases de données
    Réponses: 2
    Dernier message: 18/08/2013, 19h24
  2. Parser SQL java
    Par smetairie dans le forum Général Java
    Réponses: 2
    Dernier message: 14/08/2009, 11h18
  3. tableau php ver SQL | algorithme pour former l'arborescence
    Par spy74 dans le forum Algorithmes et structures de données
    Réponses: 0
    Dernier message: 17/01/2009, 12h13
  4. Parser SQL en java
    Par boutss dans le forum JDBC
    Réponses: 1
    Dernier message: 22/12/2008, 13h36
  5. [C++] Parser SQL
    Par batbaille dans le forum Langage SQL
    Réponses: 1
    Dernier message: 30/10/2005, 18h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo