From 0164a6b011019964a7a9fff32b5114658bb83cbd Mon Sep 17 00:00:00 2001 From: Jeevan Chalke Date: Mon, 26 Oct 2026 14:52:10 +0530 Subject: [PATCH v1] Initialize FOUND to false in PL/pgSQL event trigger functions. The documentation says that FOUND starts out false within each PL/pgSQL function call, and plpgsql_exec_function() and plpgsql_exec_trigger() do set it so, but plpgsql_exec_event_trigger() did not, leaving it NULL until the first statement that sets it. Fix this by initializing FOUND to false, as the other two entry points do, and add a regression test. --- src/pl/plpgsql/src/pl_exec.c | 5 +++++ src/test/regress/expected/event_trigger.out | 25 +++++++++++++++++++++ src/test/regress/sql/event_trigger.sql | 22 ++++++++++++++++++ 3 files changed, 52 insertions(+) diff --git a/src/pl/plpgsql/src/pl_exec.c b/src/pl/plpgsql/src/pl_exec.c index bc1667f7a13..6d5e18418f6 100644 --- a/src/pl/plpgsql/src/pl_exec.c +++ b/src/pl/plpgsql/src/pl_exec.c @@ -1199,6 +1199,11 @@ plpgsql_exec_event_trigger(PLpgSQL_function *func, EventTriggerData *trigdata) estate.err_text = gettext_noop("during initialization of execution state"); copy_plpgsql_datums(&estate, func); + /* + * Set the magic variable FOUND to false + */ + exec_set_found(&estate, false); + /* * Let the instrumentation plugin peek at this function */ diff --git a/src/test/regress/expected/event_trigger.out b/src/test/regress/expected/event_trigger.out index f57e8ffa7a5..963008ef1b3 100644 --- a/src/test/regress/expected/event_trigger.out +++ b/src/test/regress/expected/event_trigger.out @@ -825,3 +825,28 @@ NOTICE: DROP POLICY dropped policy CREATE POLICY pguc ON event_trigger_test USING (FALSE); SET event_triggers = 'off'; DROP POLICY pguc ON event_trigger_test; +-- event triggers were disabled above; re-enable them for the test below +RESET event_triggers; +-- FOUND should be initially false in a PL/pgSQL event trigger function, +-- and a value set by one call should not carry over to the next +CREATE FUNCTION test_event_trigger_found() RETURNS event_trigger +LANGUAGE plpgsql AS $$ +BEGIN + RAISE NOTICE 'FOUND is %', FOUND; + PERFORM 1; + RAISE NOTICE 'FOUND after PERFORM is %', FOUND; +END; +$$; +CREATE EVENT TRIGGER test_event_trigger_found + ON ddl_command_start + WHEN TAG IN ('CREATE SCHEMA') EXECUTE FUNCTION test_event_trigger_found(); +CREATE SCHEMA test_event_trigger_found_schema; +NOTICE: FOUND is f +NOTICE: FOUND after PERFORM is t +DROP SCHEMA test_event_trigger_found_schema; +CREATE SCHEMA test_event_trigger_found_schema; +NOTICE: FOUND is f +NOTICE: FOUND after PERFORM is t +DROP SCHEMA test_event_trigger_found_schema; +DROP EVENT TRIGGER test_event_trigger_found; +DROP FUNCTION test_event_trigger_found(); diff --git a/src/test/regress/sql/event_trigger.sql b/src/test/regress/sql/event_trigger.sql index 32e9bb58c5e..55b3e8bc4ce 100644 --- a/src/test/regress/sql/event_trigger.sql +++ b/src/test/regress/sql/event_trigger.sql @@ -643,3 +643,25 @@ DROP POLICY pguc ON event_trigger_test; CREATE POLICY pguc ON event_trigger_test USING (FALSE); SET event_triggers = 'off'; DROP POLICY pguc ON event_trigger_test; +-- event triggers were disabled above; re-enable them for the test below +RESET event_triggers; + +-- FOUND should be initially false in a PL/pgSQL event trigger function, +-- and a value set by one call should not carry over to the next +CREATE FUNCTION test_event_trigger_found() RETURNS event_trigger +LANGUAGE plpgsql AS $$ +BEGIN + RAISE NOTICE 'FOUND is %', FOUND; + PERFORM 1; + RAISE NOTICE 'FOUND after PERFORM is %', FOUND; +END; +$$; +CREATE EVENT TRIGGER test_event_trigger_found + ON ddl_command_start + WHEN TAG IN ('CREATE SCHEMA') EXECUTE FUNCTION test_event_trigger_found(); +CREATE SCHEMA test_event_trigger_found_schema; +DROP SCHEMA test_event_trigger_found_schema; +CREATE SCHEMA test_event_trigger_found_schema; +DROP SCHEMA test_event_trigger_found_schema; +DROP EVENT TRIGGER test_event_trigger_found; +DROP FUNCTION test_event_trigger_found(); -- 2.43.0