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

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

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

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

Есть намеки?

7 ответов

Решение

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

Используйте этот трюк для проверки синтаксиса кода PostgreSQL:

DO $SYNTAX_CHECK$ BEGIN RETURN;
    -- insert your SQL code here
END; $SYNTAX_CHECK$;

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

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

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

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

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

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

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

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

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

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

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

Вы можете выполнять запросы из функции 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

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

Он не пройдёт проверку, но на самом деле не будет выполнен. Вот пример плана запроса:

Result  (cost=0.00..0.01 rows=1 width=0)
  One-Time Filter: false
Другие вопросы по тегам