Подтвердить что ты не робот

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

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

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

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

Любые подсказки?

4b9b3361

Ответ 1

Недавно я написал утилиту для статической проверки синтаксиса 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"

Ответ 2

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

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

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

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

Ответ 3

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

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

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

Ответ 5

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

Поддержка MySQL, Oracle, PostgreSQL, SQLite, MS SQL.

Ответ 6

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

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

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

Ответ 7

Вы можете запускать запросы как функцию 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 (в github), следующее воплощение pgpsql_lint