ADA language (ancestor of PL/SQL and PL/pgSQL languages) has PRAGMA
clause for entering some compiler directives. Unfortunately PL/pgSQL has not this possibility, and it is very low possibility to have a PRAGMA
in future. It is not a fundamental feature, but sometimes compiler directives can be practical.
When I use plpgsql_check
, I usually find a parts of code with false alarms. The static analyse used by plpgsql_check
cannot to work with dynamic SQL, it cannot to work with local temp tables, etc. Can be nice to have a possibility to disable check for these parts.
Now it is possible. I wrote special function plpgsql_check_pragma
, that is identified by plpgsql_check
, and plpgsql_check
can read own directives from an arguments of this function. A implementation of pragma in plpgsql_check
has static block or statement scope:
postgres=# create or replace function test_pragma() returns void language plpgsql as $$ declare r record; begin if false then -- check is disabled just for if body perform plpgsql_check_pragma('disable:check'); raise notice '%', r.y; end if; select 10 as a, 20 as b into r; raise notice '%', r.a; raise notice '%', r.x; end; $$; CREATE FUNCTION postgres=# select * from plpgsql_check_function('test_pragma'); ┌──────────────────────────────────────────────────┐ │ plpgsql_check_function │ ╞══════════════════════════════════════════════════╡ │ error:42703:11:RAISE:record "r" has no field "x" │ │ Context: SQL statement "SELECT r.x" │ └──────────────────────────────────────────────────┘ (2 rows)
On systems without plpgsql_check
you can write own empty implementation of plpgsql_check_pragma
function (because probably you don't want to change already checked source code):
create or replace function plpgsql_check_pragma(variadic text[]) returns int as $$ select 1 $$ language sql immutable;
This functionality is available from 1.13.0 release
No comments:
Post a Comment