Cole uma consulta ou um script: cada instrução é revisada como texto neste navegador, com comentários e strings mascarados para não confundir palavras-chave com SQL real. Os achados mantêm o tipo da instrução através de um WITH, exigem WHERE de nível superior em DELETE e UPDATE e contam marcadores de parâmetros fora de literais e casts.
Funciona localmente no seu navegadorA página divide o script colado em instruções e revisa cada uma como texto: a palavra-chave inicial é lida no nível superior, então WITH old AS (...) DELETE FROM users é informado como DELETE, não como SELECT. Nada vira plano de execução e nada é enviado a um banco de dados.
As verificações cobrem o que uma revisão de código costuma olhar primeiro: DELETE e UPDATE sem WHERE na própria instrução, DROP e TRUNCATE, SELECT * e SELECT sem limite de linhas, um literal comparado em um filtro, um 1=1 ou OR TRUE de nível superior, um marcador de template ${...} e um valor montado com concatenação de strings.
São contadas como gravações INSERT, UPDATE, DELETE, MERGE, REPLACE, CREATE, ALTER, DROP e TRUNCATE. Um DELETE ou UPDATE sem WHERE na própria instrução é um achado de perigo: um WHERE dentro de subconsulta não protege a gravação externa. DROP e TRUNCATE são achados de perigo por si sós; as demais gravações são avisos.
Em um SELECT são verificados um asterisco na lista de colunas (incluindo t.*) e um limite de linhas: LIMIT, FETCH FIRST ou NEXT ... ROWS ONLY, TOP n e ROWNUM <= n contam, então a nota informativa de limite ausente só aparece quando o SELECT pode retornar um número ilimitado de linhas.
A contagem de marcadores cobre ?, $1, :name e @name fora de comentários e strings; um cast como created_at::text e um identificador como @@ROWCOUNT não são contados. Um literal comparado em um filtro WHERE, AND ou OR é um aviso que aponta para a sintaxe de parâmetros do seu driver.
Dois padrões de construção de strings são informados separadamente: um marcador de template ${...} indica que um valor é interpolado na instrução, e uma concatenação como literal mais identificador indica que o texto é montado fora do driver. Nenhum dos dois é um parâmetro vinculado, e essa é a diferença que importa para o texto que chega ao servidor.
O divisor entende aspas duplicadas e escapes com barra invertida do MySQL, identificadores entre aspas duplas e crases, comentários -- e /* */, comentários #, corpos entre $$ do PostgreSQL e diretivas DELIMITER, então um apóstrofo escapado ou um corpo de função não geram contagem falsa. Um script com mais de uma instrução gera um aviso, e cada achado carrega o número da instrução.
A página não se conecta a banco algum, não executa nada e não enxerga seu esquema, permissões, segurança em nível de linha ou transações: uma instrução aprovada aqui ainda pode ser destrutiva no seu ambiente. Trate o resultado como pré-checagem de texto antes de uma revisão, ao lado de EXPLAIN e da leitura do código que gera a consulta.