-- -- regress tests of the pragma function (src/pragma.c) -- -- The plpgsql_check_pragma() function has two completely separate -- implementations. When plpgsql_check walks the AST, the arguments are -- taken from the parse tree and applied to the check state. When the -- function is really executed, the arguments are processed as ordinary -- variadic text arguments, and only the tracer can be controlled. -- load 'plpgsql_check'; set client_min_messages to warning; create extension if not exists plpgsql_check; set client_min_messages to notice; -- -- compile time pragmas -- -- STATUS reports the current value of every switch. Note that the -- keyword recognized by STATUS for the constants tracing switch is -- "constants_trancing", while ENABLE and DISABLE use -- "constants_tracing". create function prg_status() returns void as $$ begin perform plpgsql_check_pragma('status:check'); perform plpgsql_check_pragma('status:tracer'); perform plpgsql_check_pragma('status:other_warnings'); perform plpgsql_check_pragma('status:performance_warnings'); perform plpgsql_check_pragma('status:extra_warnings'); perform plpgsql_check_pragma('status:security_warnings'); perform plpgsql_check_pragma('status:compatibility_warnings'); perform plpgsql_check_pragma('status:constants_trancing'); -- spaces around the pragma name and its argument are ignored perform plpgsql_check_pragma(' status: check'); end; $$ language plpgsql; select * from plpgsql_check_function('prg_status'); NOTICE: check is enabled NOTICE: tracer is enabled NOTICE: other_warnings is enabled NOTICE: performance_warnings is enabled NOTICE: extra_warnings is enabled NOTICE: security_warnings is enabled NOTICE: compatibility_warnings is enabled NOTICE: constants_traising is enabled NOTICE: check is enabled plpgsql_check_function ------------------------ (0 rows) -- DISABLE turns every switch off, the following STATUS shows it. create function prg_disable() returns void as $$ begin perform plpgsql_check_pragma(' disable: check'); perform plpgsql_check_pragma('disable:tracer'); perform plpgsql_check_pragma('disable:other_warnings'); perform plpgsql_check_pragma('disable:performance_warnings'); perform plpgsql_check_pragma('disable:extra_warnings'); perform plpgsql_check_pragma('disable:security_warnings'); perform plpgsql_check_pragma('disable:compatibility_warnings'); perform plpgsql_check_pragma('disable:constants_tracing'); perform plpgsql_check_pragma('status:check'); perform plpgsql_check_pragma('status:tracer'); perform plpgsql_check_pragma('status:other_warnings'); perform plpgsql_check_pragma('status:performance_warnings'); perform plpgsql_check_pragma('status:extra_warnings'); perform plpgsql_check_pragma('status:security_warnings'); perform plpgsql_check_pragma('status:compatibility_warnings'); perform plpgsql_check_pragma('status:constants_trancing'); end; $$ language plpgsql; select * from plpgsql_check_function('prg_disable'); NOTICE: check is disabled NOTICE: tracer is disabled NOTICE: other_warnings is disabled NOTICE: performance_warnings is disabled NOTICE: extra_warnings is disabled NOTICE: security_warnings is disabled NOTICE: compatibility_warnings is disabled NOTICE: constants_traising is disabled plpgsql_check_function ------------------------ (0 rows) -- ENABLE turns them on again create function prg_enable() returns void as $$ begin perform plpgsql_check_pragma('disable:check'); perform plpgsql_check_pragma('disable:tracer'); perform plpgsql_check_pragma('disable:other_warnings'); perform plpgsql_check_pragma('disable:performance_warnings'); perform plpgsql_check_pragma('disable:extra_warnings'); perform plpgsql_check_pragma('disable:security_warnings'); perform plpgsql_check_pragma('disable:compatibility_warnings'); perform plpgsql_check_pragma('disable:constants_tracing'); perform plpgsql_check_pragma(' enable: check'); perform plpgsql_check_pragma('enable:tracer'); perform plpgsql_check_pragma('enable:other_warnings'); perform plpgsql_check_pragma('enable:performance_warnings'); perform plpgsql_check_pragma('enable:extra_warnings'); perform plpgsql_check_pragma('enable:security_warnings'); perform plpgsql_check_pragma('enable:compatibility_warnings'); perform plpgsql_check_pragma('enable:constants_tracing'); perform plpgsql_check_pragma('status:check'); perform plpgsql_check_pragma('status:tracer'); perform plpgsql_check_pragma('status:other_warnings'); perform plpgsql_check_pragma('status:performance_warnings'); perform plpgsql_check_pragma('status:extra_warnings'); perform plpgsql_check_pragma('status:security_warnings'); perform plpgsql_check_pragma('status:compatibility_warnings'); perform plpgsql_check_pragma('status:constants_trancing'); end; $$ language plpgsql; select * from plpgsql_check_function('prg_enable'); NOTICE: check is enabled NOTICE: tracer is enabled NOTICE: other_warnings is enabled NOTICE: performance_warnings is enabled NOTICE: extra_warnings is enabled NOTICE: security_warnings is enabled NOTICE: compatibility_warnings is enabled NOTICE: constants_traising is enabled plpgsql_check_function ------------------------ (0 rows) -- an unknown switch is reported for every pragma that takes a switch -- name, and an entirely unknown pragma is reported too create function prg_unsupported() returns void as $$ begin perform plpgsql_check_pragma('status:unknown_switch'); perform plpgsql_check_pragma('enable:unknown_switch'); perform plpgsql_check_pragma('disable:unknown_switch'); perform plpgsql_check_pragma('unknown_pragma: something'); end; $$ language plpgsql; select * from plpgsql_check_function('prg_unsupported'); WARNING: unsuported pragma: unknown_switch WARNING: unsuported pragma: unknown_switch WARNING: unsuported pragma: unknown_switch WARNING: unsupported pragma: unknown_pragma: something plpgsql_check_function ------------------------ (0 rows) -- ECHO prints its argument. The @@name and @@signature placeholders are -- replaced by the name and the signature of the checked function, an -- unknown placeholder is copied to the output. create function prg_echo(a int, b text) returns void as $$ begin perform plpgsql_check_pragma('echo: nothing to substitute here'); perform plpgsql_check_pragma('echo: the name is @@name'); perform plpgsql_check_pragma('echo: the signature is @@signature'); perform plpgsql_check_pragma('echo: @@unknown is not a placeholder'); perform plpgsql_check_pragma('echo:'); end; $$ language plpgsql; select * from plpgsql_check_function('prg_echo'); NOTICE: nothing to substitute here NOTICE: the name is prg_echo NOTICE: the signature is prg_echo(integer,text) NOTICE: @@unknown is not a placeholder NOTICE: plpgsql_check_function ------------------------------------------ warning extra:00000:unused parameter "a" warning extra:00000:unused parameter "b" (2 rows) -- more pragmas can be passed in one call create function prg_multi() returns void as $$ begin perform plpgsql_check_pragma('disable:extra_warnings', 'status:extra_warnings', 'enable:extra_warnings', 'status:extra_warnings'); end; $$ language plpgsql; select * from plpgsql_check_function('prg_multi'); NOTICE: extra_warnings is disabled NOTICE: extra_warnings is enabled plpgsql_check_function ------------------------ (0 rows) drop function prg_multi(); drop function prg_echo(int, text); drop function prg_unsupported(); drop function prg_enable(); drop function prg_disable(); drop function prg_status(); -- -- runtime pragmas -- -- When the pragma function is really executed, only the tracer pragmas -- are recognized, everything else is silently ignored. The tracer is -- only armed here, no tracing is started, because that additionally -- requires plpgsql_check.enable_tracer. -- select plpgsql_check_pragma('status:tracer'); NOTICE: tracer is disabled plpgsql_check_pragma ---------------------- 1 (1 row) select plpgsql_check_pragma('enable:tracer'); plpgsql_check_pragma ---------------------- 1 (1 row) select plpgsql_check_pragma('status:tracer'); NOTICE: tracer is enabled plpgsql_check_pragma ---------------------- 1 (1 row) select plpgsql_check_pragma('disable:tracer'); plpgsql_check_pragma ---------------------- 1 (1 row) select plpgsql_check_pragma('status:tracer'); NOTICE: tracer is disabled plpgsql_check_pragma ---------------------- 1 (1 row) -- leading spaces and spaces after the colon are ignored select plpgsql_check_pragma(' enable: tracer'); plpgsql_check_pragma ---------------------- 1 (1 row) select plpgsql_check_pragma(' status: tracer'); NOTICE: tracer is enabled plpgsql_check_pragma ---------------------- 1 (1 row) select plpgsql_check_pragma(' disable: tracer'); plpgsql_check_pragma ---------------------- 1 (1 row) -- pragmas which are compile time only, and unknown pragmas, are ignored select plpgsql_check_pragma('status:check'); plpgsql_check_pragma ---------------------- 1 (1 row) select plpgsql_check_pragma('enable:check'); plpgsql_check_pragma ---------------------- 1 (1 row) select plpgsql_check_pragma('disable:check'); plpgsql_check_pragma ---------------------- 1 (1 row) select plpgsql_check_pragma('echo: not printed in runtime'); plpgsql_check_pragma ---------------------- 1 (1 row) select plpgsql_check_pragma('this is not a pragma'); plpgsql_check_pragma ---------------------- 1 (1 row) select plpgsql_check_pragma(''); plpgsql_check_pragma ---------------------- 1 (1 row) -- NULL argument is ignored, NULL elements of the argument array are -- skipped select plpgsql_check_pragma(VARIADIC NULL::text[]); plpgsql_check_pragma ---------------------- 0 (1 row) select plpgsql_check_pragma(VARIADIC array[NULL, 'enable:tracer', NULL]::text[]); plpgsql_check_pragma ---------------------- 1 (1 row) select plpgsql_check_pragma('status:tracer'); NOTICE: tracer is enabled plpgsql_check_pragma ---------------------- 1 (1 row) select plpgsql_check_pragma('disable:tracer'); plpgsql_check_pragma ---------------------- 1 (1 row) -- the pragma function called from a really executed function create function prg_runtime() returns void as $$ begin perform plpgsql_check_pragma('enable:tracer'); perform plpgsql_check_pragma('status:tracer'); perform plpgsql_check_pragma('disable:tracer'); perform plpgsql_check_pragma('status:tracer'); end; $$ language plpgsql; select prg_runtime(); NOTICE: tracer is enabled NOTICE: tracer is disabled prg_runtime ------------- (1 row) drop function prg_runtime();