diff --git a/src/backend/commands/event_trigger.c b/src/backend/commands/event_trigger.c index 5bde507c75..aea38be8db 100644 --- a/src/backend/commands/event_trigger.c +++ b/src/backend/commands/event_trigger.c @@ -1936,8 +1936,18 @@ pg_event_trigger_ddl_commands(PG_FUNCTION_ARGS) else if (cmd->type == SCT_AlterTSConfig) addr = cmd->d.atscfg.address; - type = getObjectTypeDescription(&addr, false); - identity = getObjectIdentity(&addr, false); + /* + * If an object was dropped in the same command we may end + * up in a situation where we generated a message but can + * no longer look up the object information. + * Example: + * ALTER TABLE t ALTER COLUMN f1 DROP IDENTITY, + * ALTER COLUMN f1 SET DATA TYPE bigint; + */ + type = getObjectTypeDescription(&addr, true); + identity = getObjectIdentity(&addr, true); + if (!identity) + continue; /* * Obtain schema name, if any ("pg_temp" if a temp diff --git a/src/test/regress/expected/event_trigger.out b/src/test/regress/expected/event_trigger.out index 369f3d7d84..5c832c330d 100644 --- a/src/test/regress/expected/event_trigger.out +++ b/src/test/regress/expected/event_trigger.out @@ -553,3 +553,24 @@ SELECT DROP EVENT TRIGGER start_rls_command; DROP EVENT TRIGGER end_rls_command; DROP EVENT TRIGGER sql_drop_command; +-- Regression test for the ALTER COLUMN DROP IDENTITY, ALTER COLUMN SET DATA TYPE case +CREATE OR REPLACE FUNCTION ddl_end() +RETURNS event_trigger AS $$ +DECLARE +r RECORD; +BEGIN + FOR r IN SELECT * FROM pg_event_trigger_ddl_commands() + LOOP + RAISE NOTICE 'ddl_end: % %', r.command_tag, r.object_type; + END LOOP; +END; +$$ LANGUAGE plpgsql; +CREATE EVENT TRIGGER ddl_end ON ddl_command_end EXECUTE PROCEDURE ddl_end(); +CREATE TABLE t(f1 int NOT NULL GENERATED ALWAYS AS IDENTITY); +NOTICE: ddl_end: CREATE SEQUENCE sequence +NOTICE: ddl_end: CREATE TABLE table +NOTICE: ddl_end: ALTER SEQUENCE sequence +ALTER TABLE t ALTER COLUMN f1 DROP IDENTITY, ALTER COLUMN f1 SET DATA TYPE bigint; +NOTICE: ddl_end: ALTER TABLE table +DROP TABLE t; +DROP EVENT TRIGGER ddl_end; diff --git a/src/test/regress/sql/event_trigger.sql b/src/test/regress/sql/event_trigger.sql index e79c5f0b5d..81c201fd96 100644 --- a/src/test/regress/sql/event_trigger.sql +++ b/src/test/regress/sql/event_trigger.sql @@ -440,3 +440,23 @@ SELECT DROP EVENT TRIGGER start_rls_command; DROP EVENT TRIGGER end_rls_command; DROP EVENT TRIGGER sql_drop_command; + +-- Regression test for the ALTER COLUMN DROP IDENTITY, ALTER COLUMN SET DATA TYPE case +CREATE OR REPLACE FUNCTION ddl_end() +RETURNS event_trigger AS $$ +DECLARE +r RECORD; +BEGIN + FOR r IN SELECT * FROM pg_event_trigger_ddl_commands() + LOOP + RAISE NOTICE 'ddl_end: % %', r.command_tag, r.object_type; + END LOOP; +END; +$$ LANGUAGE plpgsql; + +CREATE EVENT TRIGGER ddl_end ON ddl_command_end EXECUTE PROCEDURE ddl_end(); +CREATE TABLE t(f1 int NOT NULL GENERATED ALWAYS AS IDENTITY); +ALTER TABLE t ALTER COLUMN f1 DROP IDENTITY, ALTER COLUMN f1 SET DATA TYPE bigint; + +DROP TABLE t; +DROP EVENT TRIGGER ddl_end;