Collez une requête ou un script : chaque instruction est analysée comme du texte dans ce navigateur, commentaires et chaînes littérales masqués pour qu’un mot-clé qu’ils contiennent ne soit pas pris pour du SQL. Les constats conservent le type réel de l’instruction derrière un WITH, exigent un WHERE de premier niveau pour DELETE et UPDATE et comptent les paramètres hors littéraux et conversions.
Fonctionne localement dans votre navigateurLa page découpe le script collé en instructions et analyse chacune comme du texte : le mot-clé de tête est lu au premier niveau, donc WITH old AS (...) DELETE FROM users est signalé comme DELETE, pas comme SELECT. Rien ne devient un plan d’exécution et rien n’est envoyé à une base de données.
Les contrôles couvrent ce qu’une revue de code regarde en premier : DELETE et UPDATE sans WHERE dans l’instruction elle-même, DROP et TRUNCATE, SELECT * et SELECT sans limite de lignes, un littéral comparé dans un filtre, un 1=1 ou OR TRUE de premier niveau, un gabarit ${...} et une valeur assemblée par concaténation.
Les écritures comptées sont INSERT, UPDATE, DELETE, MERGE, REPLACE, CREATE, ALTER, DROP et TRUNCATE. Un DELETE ou UPDATE sans WHERE dans l’instruction elle-même est un constat de danger — un WHERE dans une sous-requête ne protège pas l’écriture externe. DROP et TRUNCATE sont des constats de danger à eux seuls ; les autres écritures sont des avertissements.
Pour un SELECT, l’analyse cherche un astérisque dans la liste des colonnes (y compris t.*) et une limite de lignes : LIMIT, FETCH FIRST ou NEXT ... ROWS ONLY, TOP n et ROWNUM <= n comptent, donc la note informative d’absence de limite n’apparaît que si le SELECT peut renvoyer un nombre illimité de lignes.
Le comptage des paramètres couvre ?, $1, :name et @name hors commentaires et chaînes littérales ; une conversion comme created_at::text et un identifiant comme @@ROWCOUNT ne sont pas comptés. Un littéral comparé dans un filtre WHERE, AND ou OR est un avertissement qui renvoie à la syntaxe de paramètres de votre pilote.
Deux schémas de construction sont signalés séparément : un gabarit ${...} signifie qu’une valeur est interpolée dans l’instruction, et une concaténation entre un littéral et un identifiant signifie que le texte est assemblé hors du pilote. Ni l’un ni l’autre n’est un paramètre lié — c’est la distinction qui compte pour le texte qui atteint le serveur.
Le découpage comprend les guillemets doublés et les échappements par barre oblique de MySQL, les identifiants entre guillemets doubles et accents graves, les commentaires -- et /* */, les commentaires #, les corps entre $$ de PostgreSQL et les directives DELIMITER : une apostrophe échappée ou un corps de fonction ne fausse donc pas le nombre d’instructions. Un script de plusieurs instructions produit un avertissement, et chaque constat porte son numéro.
La page ne se connecte à aucune base, n’exécute rien et ne voit ni votre schéma, ni vos droits, ni la sécurité au niveau des lignes, ni vos transactions : une instruction validée ici peut rester destructrice dans votre environnement. Utilisez-la comme pré-contrôle textuel avant une revue, à côté d’EXPLAIN et de la lecture du code qui produit la requête.