[SQL] Regexp qui récupère les tables de la requete

j’essaie de faire un regexp qui me récupère dans une requete SQL quelconque, la liste des tables affectées dans la requête. Ce qui doit tenir compte des JOIN, des FROM table1,table2 etc…

Alors je suis bloqué a ca:
/.from ((\w)+[,\s]+).*/i (qui ne tiens pas compte pour le moment des join). Et ca ne marche pas bien du tout.

Quelqu’un aurait une idée?

Je n’y connais rien en expression régulière mais tu peux essayer de dire que la clause FROM se termine dans le cas où il y a WHERE et/ou GROUP BY et/ou ORDER BY sinon allez jusqu’à la fin. Est-ce que tu peux faire des | successifs ?

J’ai oublié de préciser: la syntaxe doit etre compatible avec des requetes INSERT, UPDATE et DELETE

[quote name=‘phili_b’ date=’ 25 Jan 2005, 16:46’]Je n’y connais rien en expression régulière mais tu peux essayer de dire que la clause FROM se termine dans le cas où il y a WHERE et/ou GROUP BY et/ou ORDER BY sinon allez jusqu’à la fin. Est-ce que tu peux faire des | successifs ?
[right][post=“325604”]<{POST_SNAPBACK}>[/post][/right][/quote]

Sauf s’il veut aussi les tables concernées dans les sous-requêtes (genre select truc from machin where chose = (select count(*) from bidule where id<100)) par exemple

/from (\w+)(?:\s*,\s*(\w+))*/i

Ca te permet de récupérer les noms de table après un from.
Avec un preg_match_all tu auras toutes les occurences.

Oh merci ca m’aide déjà pas mal… et pour les commande JOIN? Pas d’idée par hasard?

[quote name=’[PERE]Cil’ date=’ 26 Jan 2005, 14:59’]Oh merci ca m’aide déjà pas mal… et pour les commande JOIN? Pas d’idée par hasard?
[right][post=“325937”]<{POST_SNAPBACK}>[/post][/right][/quote]
Tu as un exemple de JOIN ? Car là je ne vois pas ce qui te pose problème.

SELECT * FROM table1 LEFT JOIN table2 ON table1.column1=table2.column1

Voila un exemple. Faudra aussi que j’ajoute la gestion des caractères escape (`) de champ SQL.

Là c’est pas compliqué, c’est juste une alternative au from:

/(?:from|join) (\w+)(?:\s*,\s*(\w+))*/i

Et voilà !

trop bien! merci beaucoup!

/me, trop content d’avoir trouvé quelqu’un qui touche en regexp

[quote name=’[PERE]Cil’ date=’ 27 Jan 2005, 11:01’]/me, trop content d’avoir trouvé quelqu’un qui touche en regexp
[right][post=« 326195 »]<{POST_SNAPBACK}>[/post][/right][/quote]
Bah, tu as surtout de la chance que sur mon projet actuel on carbure à la regexp (On pousse sed dans ses derniers retranchements). :stuck_out_tongue:

/me, trop content de faire profiter de mes prises de têtes sur le sujet.

Bon de prime abord je suis reparti sur ce regexp la:

/(from|join)\s+?(\w+)?(\s*,\s*?(\w+)?)*/i

Seulement voila la requete:

SELECT * FROM table1 ,table2 , table3 WHERE table1.id<‘10’

me zappe la table table2.

[quote name=’[PERE]Cil’ date=’ 28 Jan 2005, 16:52’]/(from|join)\s+?(\w+)?(\s*,\s*?(\w+)?)*/i

Seulement voila la requete:

SELECT * FROM batch ,engine , query WHERE batch.id<‹ 10 ›

me zappe la table engine.
[right][post=« 326764 »]<{POST_SNAPBACK}>[/post][/right][/quote]
Je viens de découvrir le problème dans la doc. Seul le dernier match est récupéré dans le cas d’une expression qui se répète. :stuck_out_tongue:
Du coup je ne vois qu’une solution, pas élégante du tout, rajouter autant de bloc b?[/b] que tu prévois d’avoir de tables à la suite.
Ce qui donne pour ton exemple:
/(from|join)\s+?(\w+)?(\s*,\s*?(\w+)?)?(\s*,\s*?(\w+)?)?/i

Je n’ai pas le temps de chercher plus pour l’instant (because départ vacances).

Seul petit problème, je ne sais combien de table j’aurais a l’avance… ca peut être 1 comme 10, en attendant je vais utiliser ta solution…

Up!

Cette requete ne marche pas tres tres bien:

SELECT * FROM table1,table2 , table3 LEFT JOIN table4 ON table4.code = table2.code WHERE table1.id<‘10’ LIMIT 10

[quote name=’[PERE]Cil’ date=’ 1 Feb 2005, 15:30’]Cette requete ne marche pas tres tres bien:

SELECT * FROM table1,table2 , table3 LEFT JOIN table4 ON table4.code = table2.code WHERE table1.id<‘10’ LIMIT 10
[right][post=“327861”]<{POST_SNAPBACK}>[/post][/right][/quote]

Fini les vacances ! Retour au taf…
J’ai trouvé une solution qui est indépendante du nombre de tables :

/(?:from|join)\s*(?\w+?(?:\s*,\s*?\w+?)*)/i

Cette regexp te permet de récupérer des chaînes contenant un ou plusieur noms de table séparés par des virgules.
Avec ton exemple ça donne (je l’ai testé):
chaîne 1 = "table1,table2 , table3"
chaîne 2 = “table4

Ensuite utilisation de split() sur chaque chaîne pour avoir les noms des tables.