From 136a143dcfb4c6df195caa8f63555bd65194c920 Mon Sep 17 00:00:00 2001 From: mentoswang Date: Fri, 19 May 2023 13:58:03 +0800 Subject: [PATCH] bugfix - drop if exists trigger with wrong schema --- src/common/backend/catalog/objectaddress.cpp | 23 ++++++++++++++----- src/test/regress/expected/mysql_trigger.out | 24 ++++++++++---------- src/test/regress/sql/mysql_trigger.sql | 12 +++++----- 3 files changed, 35 insertions(+), 24 deletions(-) diff --git a/src/common/backend/catalog/objectaddress.cpp b/src/common/backend/catalog/objectaddress.cpp index 656ca9916..d5200fb6c 100644 --- a/src/common/backend/catalog/objectaddress.cpp +++ b/src/common/backend/catalog/objectaddress.cpp @@ -1312,9 +1312,16 @@ static ObjectAddress get_object_address_relobject(ObjectType objtype, List* objn relation = heap_open(reloid, AccessShareLock); if (objtype == OBJECT_TRIGGER && u_sess->attr.attr_sql.sql_compatibility == B_FORMAT && schemaname != NULL) { Oid relNamespaceId = RelationGetNamespace(relation); - if (relNamespaceId != get_namespace_oid(schemaname, false)) { - ereport(ERROR, (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), - errmsg("trigger in wrong schema: \"%s\".\"%s\"", schemaname, depname))); + if (relNamespaceId != get_namespace_oid(schemaname, missing_ok)) { + if(!missing_ok) { + ereport(ERROR, (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("trigger in wrong schema: \"%s\".\"%s\"", schemaname, depname))); + } else { + address.objectId = InvalidOid; + heap_close(relation, AccessShareLock); + relation = NULL; + return address; + } } } } @@ -1339,9 +1346,13 @@ static ObjectAddress get_object_address_relobject(ObjectType objtype, List* objn address.objectSubId = 0; if (OidIsValid(address.objectId) && schemaname != NULL) { Oid relNamespaceId = RelationGetNamespace(relation); - if (relNamespaceId != get_namespace_oid(schemaname, false)) { - ereport(ERROR, (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), - errmsg("trigger in wrong schema: \"%s\".\"%s\"", schemaname, depname))); + if (relNamespaceId != get_namespace_oid(schemaname, missing_ok)) { + if(!missing_ok) { + ereport(ERROR, (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("trigger in wrong schema: \"%s\".\"%s\"", schemaname, depname))); + } else { + address.objectId = InvalidOid; + } } } break; diff --git a/src/test/regress/expected/mysql_trigger.out b/src/test/regress/expected/mysql_trigger.out index 70f49d6e7..4fd4a3cdf 100644 --- a/src/test/regress/expected/mysql_trigger.out +++ b/src/test/regress/expected/mysql_trigger.out @@ -689,14 +689,14 @@ begin insert into food(id, foodtype, remark, time_flag) values (1,'bamboo', 'healthy', now()); end; / --- ERROR: trigger in wrong schema: "testscm"."animals_trigger1" +-- NOTICE: trigger "animals_trigger1" does not exist, skipping drop trigger if exists testscm.animals_trigger1; -ERROR: trigger in wrong schema: "testscm"."animals_trigger1" +NOTICE: trigger "animals_trigger1" does not exist, skipping -- OK drop trigger if exists animals_trigger1; --- ERROR: schema "testscm_no" does not exist +-- NOTICE: trigger "animals_trigger1" does not exist, skipping drop trigger if exists testscm_no.animals_trigger2; -ERROR: schema "testscm_no" does not exist +NOTICE: trigger "animals_trigger2" does not exist, skipping -- OK drop trigger if exists animals_trigger2; select tgname from pg_trigger; @@ -826,12 +826,12 @@ select tgname from pg_trigger; animals_trigger1 (1 row) --- ERROR: trigger in wrong schema: "testscm"."animals_trigger1" +-- NOTICE: trigger "animals.animals_trigger1" for table "animals" does not exist, skipping drop trigger if exists testscm.animals_trigger1 on animals; -ERROR: trigger in wrong schema: "testscm"."animals_trigger1" --- ERROR: schema "testscm_no" does not exist +NOTICE: trigger "animals.animals_trigger1" for table "animals" does not exist, skipping +-- NOTICE: trigger "animals.animals_trigger1" for table "animals" does not exist, skipping drop trigger if exists testscm_no.animals_trigger1 on animals; -ERROR: schema "testscm_no" does not exist +NOTICE: trigger "animals.animals_trigger1" for table "animals" does not exist, skipping -- NOTICE: trigger "animals.animals_trigger_no" for table "animals" does not exist, skipping drop trigger if exists animals_trigger_no on animals; NOTICE: trigger "animals.animals_trigger_no" for table "animals" does not exist, skipping @@ -896,12 +896,12 @@ select tgname from pg_trigger; animals_trigger2 (1 row) --- ERROR: trigger in wrong schema: "testscm2"."animals_trigger2" +-- NOTICE: trigger "testscm.animals_scm.animals_trigger2" for table "testscm.animals_scm" does not exist, skipping drop trigger if exists testscm2.animals_trigger2 on testscm.animals_scm; -ERROR: trigger in wrong schema: "testscm2"."animals_trigger2" --- ERROR: schema "testscm_no" does not exist +NOTICE: trigger "testscm.animals_scm.animals_trigger2" for table "testscm.animals_scm" does not exist, skipping +-- NOTICE: trigger "testscm.animals_scm.animals_trigger2" for table "testscm.animals_scm" does not exist, skipping drop trigger if exists testscm_no.animals_trigger2 on testscm.animals_scm; -ERROR: schema "testscm_no" does not exist +NOTICE: trigger "testscm.animals_scm.animals_trigger2" for table "testscm.animals_scm" does not exist, skipping -- NOTICE: trigger "testscm.animals_scm.animals_trigger_no" for table "testscm.animals_scm" does not exist, skipping drop trigger if exists animals_trigger_no on testscm.animals_scm; NOTICE: trigger "testscm.animals_scm.animals_trigger_no" for table "testscm.animals_scm" does not exist, skipping diff --git a/src/test/regress/sql/mysql_trigger.sql b/src/test/regress/sql/mysql_trigger.sql index 26afe625b..62debccbb 100644 --- a/src/test/regress/sql/mysql_trigger.sql +++ b/src/test/regress/sql/mysql_trigger.sql @@ -391,11 +391,11 @@ begin insert into food(id, foodtype, remark, time_flag) values (1,'bamboo', 'healthy', now()); end; / --- ERROR: trigger in wrong schema: "testscm"."animals_trigger1" +-- NOTICE: trigger "animals_trigger1" does not exist, skipping drop trigger if exists testscm.animals_trigger1; -- OK drop trigger if exists animals_trigger1; --- ERROR: schema "testscm_no" does not exist +-- NOTICE: trigger "animals_trigger1" does not exist, skipping drop trigger if exists testscm_no.animals_trigger2; -- OK drop trigger if exists animals_trigger2; @@ -463,9 +463,9 @@ begin end; / select tgname from pg_trigger; --- ERROR: trigger in wrong schema: "testscm"."animals_trigger1" +-- NOTICE: trigger "animals.animals_trigger1" for table "animals" does not exist, skipping drop trigger if exists testscm.animals_trigger1 on animals; --- ERROR: schema "testscm_no" does not exist +-- NOTICE: trigger "animals.animals_trigger1" for table "animals" does not exist, skipping drop trigger if exists testscm_no.animals_trigger1 on animals; -- NOTICE: trigger "animals.animals_trigger_no" for table "animals" does not exist, skipping drop trigger if exists animals_trigger_no on animals; @@ -503,9 +503,9 @@ begin end; / select tgname from pg_trigger; --- ERROR: trigger in wrong schema: "testscm2"."animals_trigger2" +-- NOTICE: trigger "testscm.animals_scm.animals_trigger2" for table "testscm.animals_scm" does not exist, skipping drop trigger if exists testscm2.animals_trigger2 on testscm.animals_scm; --- ERROR: schema "testscm_no" does not exist +-- NOTICE: trigger "testscm.animals_scm.animals_trigger2" for table "testscm.animals_scm" does not exist, skipping drop trigger if exists testscm_no.animals_trigger2 on testscm.animals_scm; -- NOTICE: trigger "testscm.animals_scm.animals_trigger_no" for table "testscm.animals_scm" does not exist, skipping drop trigger if exists animals_trigger_no on testscm.animals_scm;