проверка синтаксиса postgresql без выполнения запроса

Я хочу проверить синтаксис файлов, содержащих sql-запросы, прежде чем они могут быть зафиксированы в моем проекте CVS.

Для этого у меня есть скрипт commitinfo, но мне трудно узнать, действительны ли команды sql. psql , похоже, не имеет режима dryrun, и построение моего собственного теста postgresql-dialact из грамматики (то есть в источнике) кажется длинным.

Сценарии могут содержать несколько запросов, поэтому EXPLAIN не может быть обернута вокруг них.

Любые намеки?

Недавно я написал утилиту для статической проверки синтаксиса SQL для PostgreSQL. Он использует ecpg, встроенный препроцессор SQL C для postgres, чтобы проверить синтаксис SQL, поэтому он использует тот же самый синтаксический анализатор, который встроен в Postgres.

Вы можете проверить это на github: http://github.com/markdrago/pgsanity . Вы можете дать README ским, чтобы лучше понять, как он работает, и получить инструкции по его установке. Вот краткий пример того, как можно использовать pgsanity:

 $ pgsanity good1.sql good2.sql bad.sql bad.sql: line 1: ERROR: syntax error at or near "bogus_token" $ find -name '*.sql' | xargs pgsanity ./sql/bad1.sql: line 59: ERROR: syntax error at or near ";" ./sql/bad2.sql: line 41: ERROR: syntax error at or near "insert" ./sql/bad3.sql: line 57: ERROR: syntax error at or near "update" 

Одним из способов было бы превратить его в транзакцию, которую вы откатываете в конце:

 BEGIN; <query>; <query>; <query>; ROLLBACK; 

Имейте в виду, что есть некоторые эффекты, которые нельзя отменить, например вызовы dblink или что-либо, написанное в файловой системе или увеличенные последовательности.

Я бы посоветовал клонировать вашу базу данных для целей тестирования.

Я обычно использую онлайн- проверку достоверности SQL Mimer , единственное, что он проверяет синтаксис SQL для стандартного SQL:

  • SQL-92
  • SQL-99
  • SQL-03

и не специфичны для PostgreSQL … Однако, если вы пишете код, следуя стандарту, вы можете его использовать, и он хорошо работает …

EXPLAIN (без ANALYZE) проанализирует запрос и подготовит план выполнения, фактически не выполнив его.

https://www.postgresql.org/docs/current/static/sql-explain.html

Замечательная утилита для проверки синтаксиса SQL : SQL Fiddle

Поддерживает MySQL, Oracle, PostgreSQL, SQLite, MS SQL.

Вы можете просто обернуть его в SELECT 1 ( <your query> ) AS a WHERE 1 = 0;

Он не будет проверяться, но он фактически не будет выполнен. Вот пример плана запроса:

 Result (cost=0.00..0.01 rows=1 width=0) One-Time Filter: false 

Вы можете запускать запросы как функцию postgresql, а в конце – исключение. Все изменения будут отменены. Например:

 CREATE OR REPLACE FUNCTION run_test(_sp character varying) RETURNS character varying AS $BODY$ BEGIN EXECUTE 'SELECT ' || _sp; RAISE EXCEPTION '#OK'; EXCEPTION WHEN others THEN RETURN SQLERRM; END; $BODY$ LANGUAGE plpgsql VOLATILE COST 100; 

Другое решение – plpgsql_check extension ( on github ), следующее воплощение pgpsql_lint