This is an automated email from the ASF dual-hosted git repository.

chenjinbao1989 pushed a commit to branch cbdb-postgres-merge
in repository https://gitbox.apache.org/repos/asf/cloudberry.git


The following commit(s) were added to refs/heads/cbdb-postgres-merge by this 
push:
     new f379221a3d5 Fix errors for merge
f379221a3d5 is described below

commit f379221a3d5c32e22385179be6094a2b92e1622b
Author: Jinbao Chen <[email protected]>
AuthorDate: Sun Nov 9 23:58:19 2025 +0800

    Fix errors for merge
---
 src/backend/cdb/cdbllize.c             |   3 +-
 src/backend/executor/nodeModifyTable.c |   2 +-
 src/backend/nodes/copyfuncs.c          |  21 +++-
 src/backend/nodes/equalfuncs.c         |  16 ++++
 src/backend/nodes/outfast.c            |   3 +
 src/backend/nodes/outfuncs.c           |  17 ++++
 src/backend/nodes/readfast.c           |   3 +
 src/backend/nodes/readfuncs.c          |  18 ++++
 src/backend/postmaster/autostats.c     |   6 ++
 src/backend/tcop/postgres.c            |   3 +
 src/backend/tcop/pquery.c              |   2 +-
 src/include/postmaster/autostats.h     |   1 +
 src/test/regress/expected/triggers.out | 169 ++++++++++++---------------------
 src/test/regress/serial_schedule       |   5 +-
 src/test/regress/sql/triggers.sql      |   3 -
 15 files changed, 153 insertions(+), 119 deletions(-)

diff --git a/src/backend/cdb/cdbllize.c b/src/backend/cdb/cdbllize.c
index 6469eb34bdf..c0ba9909aa6 100644
--- a/src/backend/cdb/cdbllize.c
+++ b/src/backend/cdb/cdbllize.c
@@ -594,7 +594,8 @@ cdbllize_adjust_top_path(PlannerInfo *root, Path *best_path,
        else if (query->commandType == CMD_SELECT ||
                         query->commandType == CMD_INSERT ||
                         query->commandType == CMD_UPDATE ||
-                        query->commandType == CMD_DELETE)
+                        query->commandType == CMD_DELETE ||
+                        query->commandType == CMD_MERGE)
        {
                Assert(query->parentStmtType == PARENTSTMTTYPE_NONE);
 
diff --git a/src/backend/executor/nodeModifyTable.c 
b/src/backend/executor/nodeModifyTable.c
index c41e5bd67eb..9dd6deabd11 100644
--- a/src/backend/executor/nodeModifyTable.c
+++ b/src/backend/executor/nodeModifyTable.c
@@ -4577,7 +4577,7 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, 
int eflags)
         */
        outerPlanState(mtstate) = ExecInitNode(subplan, estate, eflags);
 
-       if (operation == CMD_UPDATE || operation == CMD_DELETE)
+       if (operation == CMD_UPDATE || operation == CMD_DELETE || operation == 
CMD_MERGE)
        {
                /* Extra GPDB junk columns */
                mtstate->mt_segid_attno =
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index 8305a840b6d..42bd51612a1 100644
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -362,7 +362,8 @@ _copyModifyTable(const ModifyTable *from)
        COPY_NODE_FIELD(exclRelTlist);
        COPY_SCALAR_FIELD(splitUpdate);
        COPY_SCALAR_FIELD(forceTupleRouting);
-
+       COPY_NODE_FIELD(mergeActionLists);
+       
        return newnode;
 }
 
@@ -6441,6 +6442,21 @@ _copyBitmapset(const Bitmapset *from)
        return bms_copy(from);
 }
 
+static MergeAction *
+_copyMergeAction(const MergeAction *from)
+{
+       MergeAction *newnode = makeNode(MergeAction);
+
+       COPY_SCALAR_FIELD(matched);
+       COPY_SCALAR_FIELD(commandType);
+       COPY_SCALAR_FIELD(override);
+       COPY_NODE_FIELD(qual);
+       COPY_NODE_FIELD(targetList);
+       COPY_NODE_FIELD(updateColnos);
+
+       return newnode;
+}
+
 /*
  * copyObjectImpl -- implementation of copyObject(); see nodes/nodes.h
  *
@@ -7636,6 +7652,9 @@ copyObjectImpl(const void *from)
                case T_Bitmapset:
                        retval = _copyBitmapset(from);
                        break;
+               case T_MergeAction:
+                       retval = _copyMergeAction(from);
+                       break;
                default:
                        elog(ERROR, "unrecognized node type: %d", (int) 
nodeTag(from));
                        retval = 0;                     /* keep compiler quiet 
*/
diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c
index 77d7ae92ef0..3891910d80f 100644
--- a/src/backend/nodes/equalfuncs.c
+++ b/src/backend/nodes/equalfuncs.c
@@ -3660,6 +3660,19 @@ _equalBitmapset(const Bitmapset *a, const Bitmapset *b)
        return bms_equal(a, b);
 }
 
+static bool
+_equalMergeAction(const MergeAction *a, const MergeAction *b)
+{
+       COMPARE_SCALAR_FIELD(matched);
+       COMPARE_SCALAR_FIELD(commandType);
+       COMPARE_SCALAR_FIELD(override);
+       COMPARE_NODE_FIELD(qual);
+       COMPARE_NODE_FIELD(targetList);
+       COMPARE_NODE_FIELD(updateColnos);
+
+       return true;
+}
+
 /*
  * equal
  *       returns whether two nodes are equal
@@ -4554,6 +4567,9 @@ equal(const void *a, const void *b)
                case T_Bitmapset:
                        retval = _equalBitmapset(a, b);
                        break;
+               case T_MergeAction:
+                       retval = _equalMergeAction(a, b);
+                       break;
 
                default:
                        elog(ERROR, "unrecognized node type: %d",
diff --git a/src/backend/nodes/outfast.c b/src/backend/nodes/outfast.c
index e7f71879c22..999e99f887d 100644
--- a/src/backend/nodes/outfast.c
+++ b/src/backend/nodes/outfast.c
@@ -1958,6 +1958,9 @@ _outNode(StringInfo str, void *obj)
                        case T_RTEPermissionInfo:
                                _outRTEPermissionInfo(str, obj);
                                break;
+                       case T_MergeAction:
+                               _outMergeAction(str, obj);
+                               break;
                        default:
                                elog(ERROR, "could not serialize unrecognized 
node type: %d",
                                                 (int) nodeTag(obj));
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index 773bdae1787..5c6a2f34c77 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -564,6 +564,7 @@ _outModifyTable(StringInfo str, const ModifyTable *node)
        WRITE_UINT_FIELD(exclRelRTI);
        WRITE_NODE_FIELD(exclRelTlist);
        WRITE_BOOL_FIELD(forceTupleRouting);
+       WRITE_NODE_FIELD(mergeActionLists);
 }
 
 static void
@@ -4301,6 +4302,19 @@ _outGpPolicy(StringInfo str, const GpPolicy *node)
        WRITE_OID_ARRAY(opclasses, node->nattrs);
 }
 
+static void
+_outMergeAction(StringInfo str, const MergeAction *node)
+{
+       WRITE_NODE_TYPE("MERGEACTION");
+
+       WRITE_BOOL_FIELD(matched);
+       WRITE_ENUM_FIELD(commandType, CmdType);
+       WRITE_ENUM_FIELD(override, OverridingKind);
+       WRITE_NODE_FIELD(qual);
+       WRITE_NODE_FIELD(targetList);
+       WRITE_NODE_FIELD(updateColnos);
+}
+
 #include "outfuncs_common.c"
 #ifndef COMPILING_BINARY_FUNCS
 /*
@@ -5500,6 +5514,9 @@ outNode(StringInfo str, const void *obj)
                        case T_GpPolicy:
                                _outGpPolicy(str, obj);
                                break;
+                       case T_MergeAction:
+                               _outMergeAction(str, obj);
+                               break;
                        default:
 
                                /*
diff --git a/src/backend/nodes/readfast.c b/src/backend/nodes/readfast.c
index c35af7d4e69..ef8caba94d9 100644
--- a/src/backend/nodes/readfast.c
+++ b/src/backend/nodes/readfast.c
@@ -2964,6 +2964,9 @@ readNodeBinary(void)
                        case T_RTEPermissionInfo:
                                return_value = _readRTEPermissionInfo();
                                break;
+                       case T_MergeAction:
+                               return_value = _readMergeAction();
+                               break;
                        default:
                                return_value = NULL; /* keep the compiler 
silent */
                                elog(ERROR, "could not deserialize unrecognized 
node type: %d",
diff --git a/src/backend/nodes/readfuncs.c b/src/backend/nodes/readfuncs.c
index ec71a331390..ff083abaa42 100644
--- a/src/backend/nodes/readfuncs.c
+++ b/src/backend/nodes/readfuncs.c
@@ -1781,6 +1781,7 @@ _readModifyTable(void)
        READ_UINT_FIELD(exclRelRTI);
        READ_NODE_FIELD(exclRelTlist);
        READ_BOOL_FIELD(forceTupleRouting);
+       READ_NODE_FIELD(mergeActionLists);
 
        READ_DONE();
 }
@@ -2936,6 +2937,21 @@ _readGpPolicy(void)
        READ_DONE();
 }
 
+static MergeAction *
+_readMergeAction(void)
+{
+       READ_LOCALS(MergeAction);
+
+       READ_BOOL_FIELD(matched);
+       READ_ENUM_FIELD(commandType, CmdType);
+       READ_ENUM_FIELD(override, OverridingKind);
+       READ_NODE_FIELD(qual);
+       READ_NODE_FIELD(targetList);
+       READ_NODE_FIELD(updateColnos);
+
+       READ_DONE();
+}
+
 #include "readfuncs_common.c"
 #ifndef COMPILING_BINARY_FUNCS
 /*
@@ -3457,6 +3473,8 @@ parseNodeString(void)
                return_value = _readRTEPermissionInfo();
        else if (MATCHX("GPPOLICY"))
                return_value = _readGpPolicy();
+       else if (MATCHX("MERGEACTION"))
+               return_value = _readMergeAction();
        else
        {
         ereport(ERROR,
diff --git a/src/backend/postmaster/autostats.c 
b/src/backend/postmaster/autostats.c
index 20122f1b531..ef2909afbdd 100644
--- a/src/backend/postmaster/autostats.c
+++ b/src/backend/postmaster/autostats.c
@@ -104,6 +104,7 @@ autostats_on_change_check(AutoStatsCmdType cmdType, uint64 
ntuples)
                case AUTOSTATS_CMDTYPE_INSERT:
                case AUTOSTATS_CMDTYPE_DELETE:
                case AUTOSTATS_CMDTYPE_UPDATE:
+               case AUTOSTATS_CMDTYPE_MERGE:
                case AUTOSTATS_CMDTYPE_COPY:
                        result = true;
                        break;
@@ -204,6 +205,8 @@ autostats_cmdtype_to_string(AutoStatsCmdType cmdType)
                        return "DELETE";
                case AUTOSTATS_CMDTYPE_UPDATE:
                        return "UPDATE";
+               case AUTOSTATS_CMDTYPE_MERGE:
+                       return "MERGE";
                case AUTOSTATS_CMDTYPE_COPY:
                        return "COPY";
                default:
@@ -246,6 +249,7 @@ autostats_get_cmdtype(QueryDesc *queryDesc, 
AutoStatsCmdType * pcmdType, Oid *pr
                case CMD_INSERT:
                case CMD_UPDATE:
                case CMD_DELETE:
+               case CMD_MERGE:
                        {
                                RangeTblEntry *rte;
 
@@ -259,6 +263,8 @@ autostats_get_cmdtype(QueryDesc *queryDesc, 
AutoStatsCmdType * pcmdType, Oid *pr
                                        cmdType = AUTOSTATS_CMDTYPE_INSERT;
                                else if (stmt->commandType == CMD_UPDATE)
                                        cmdType = AUTOSTATS_CMDTYPE_UPDATE;
+                               else if (stmt->commandType == CMD_MERGE)
+                                       cmdType = AUTOSTATS_CMDTYPE_MERGE;
                                else
                                        cmdType = AUTOSTATS_CMDTYPE_DELETE;
                        }
diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c
index 394a6a5420e..20be306646e 100644
--- a/src/backend/tcop/postgres.c
+++ b/src/backend/tcop/postgres.c
@@ -1293,6 +1293,7 @@ exec_mpp_query(const char *query_string,
                plan->commandType != CMD_INSERT &&
                plan->commandType != CMD_UPDATE &&
                plan->commandType != CMD_DELETE &&
+               plan->commandType != CMD_MERGE &&
                plan->commandType != CMD_UTILITY)
                elog(ERROR, "MPPEXEC: received non-DML Plan");
        commandType = plan->commandType;
@@ -1380,6 +1381,8 @@ exec_mpp_query(const char *query_string,
                        commandName = "MPPEXEC UPDATE";
                else if (commandType == CMD_DELETE)
                        commandName = "MPPEXEC DELETE";
+               else if (commandType == CMD_MERGE)
+                       commandName = "MPPEXEC MERGE";
                else
                        elog(ERROR, "MPPEXEC: received non-DML Plan");
 
diff --git a/src/backend/tcop/pquery.c b/src/backend/tcop/pquery.c
index 329697c10b7..37b346670c7 100644
--- a/src/backend/tcop/pquery.c
+++ b/src/backend/tcop/pquery.c
@@ -276,7 +276,7 @@ ProcessQuery(Portal portal,
                                SetQueryCompletion(qc, CMDTAG_DELETE, 
queryDesc->es_processed);
                                break;
                        case CMD_MERGE:
-                               SetQueryCompletion(qc, CMDTAG_MERGE, 
queryDesc->estate->es_processed);
+                               SetQueryCompletion(qc, CMDTAG_MERGE, 
queryDesc->es_processed);
                                break;
                        default:
                                SetQueryCompletion(qc, CMDTAG_UNKNOWN, 
queryDesc->es_processed);
diff --git a/src/include/postmaster/autostats.h 
b/src/include/postmaster/autostats.h
index a25418382e8..9e7f8dd152d 100644
--- a/src/include/postmaster/autostats.h
+++ b/src/include/postmaster/autostats.h
@@ -30,6 +30,7 @@ typedef enum AutoStatsCmdType
        AUTOSTATS_CMDTYPE_UPDATE,
        AUTOSTATS_CMDTYPE_INSERT,
        AUTOSTATS_CMDTYPE_DELETE,
+       AUTOSTATS_CMDTYPE_MERGE,
        AUTOSTATS_CMDTYPE_COPY,
 
        /*
diff --git a/src/test/regress/expected/triggers.out 
b/src/test/regress/expected/triggers.out
index 78b5060b24a..e935a29b17a 100644
--- a/src/test/regress/expected/triggers.out
+++ b/src/test/regress/expected/triggers.out
@@ -1616,18 +1616,14 @@ select * from parent; select * from child;
 (0 rows)
 
 update parent set val1 = 'b' where aid = 1; -- should fail
-<<<<<<< HEAD
-ERROR:  function cannot execute on a QE slice because it issues a non-SELECT 
statement
+ERROR:  function cannot execute on a QE slice because it issues a non-SELECT 
statement  (seg1 127.0.1.1:7003 pid=464640)
 CONTEXT:  SQL statement "delete from child where child.aid = new.aid and 
child.val1 = new.val1"
 PL/pgSQL function parent_upd_func() line 5 at SQL statement
-=======
-ERROR:  tuple to be updated was already modified by an operation triggered by 
the current command
-HINT:  Consider using an AFTER trigger instead of a BEFORE trigger to 
propagate changes to other rows.
 merge into parent p using (values (1)) as v(id) on p.aid = v.id
   when matched then update set val1 = 'b'; -- should fail
-ERROR:  tuple to be updated or deleted was already modified by an operation 
triggered by the current command
-HINT:  Consider using an AFTER trigger instead of a BEFORE trigger to 
propagate changes to other rows.
->>>>>>> REL_16_9
+ERROR:  function cannot execute on a QE slice because it issues a non-SELECT 
statement  (seg1 127.0.1.1:7003 pid=553339)
+CONTEXT:  SQL statement "delete from child where child.aid = new.aid and 
child.val1 = new.val1"
+PL/pgSQL function parent_upd_func() line 5 at SQL statement
 select * from parent; select * from child;
  aid | val1 | val2 | val3 | val4 | bcnt 
 -----+------+------+------+------+------
@@ -1639,18 +1635,14 @@ select * from parent; select * from child;
 (0 rows)
 
 delete from parent where aid = 1; -- should fail
-<<<<<<< HEAD
-ERROR:  function cannot execute on a QE slice because it issues a non-SELECT 
statement
+ERROR:  function cannot execute on a QE slice because it issues a non-SELECT 
statement  (seg1 127.0.1.1:7003 pid=464640)
 CONTEXT:  SQL statement "delete from child where aid = old.aid"
 PL/pgSQL function parent_del_func() line 3 at SQL statement
-=======
-ERROR:  tuple to be deleted was already modified by an operation triggered by 
the current command
-HINT:  Consider using an AFTER trigger instead of a BEFORE trigger to 
propagate changes to other rows.
 merge into parent p using (values (1)) as v(id) on p.aid = v.id
   when matched then delete; -- should fail
-ERROR:  tuple to be updated or deleted was already modified by an operation 
triggered by the current command
-HINT:  Consider using an AFTER trigger instead of a BEFORE trigger to 
propagate changes to other rows.
->>>>>>> REL_16_9
+ERROR:  function cannot execute on a QE slice because it issues a non-SELECT 
statement  (seg1 127.0.1.1:7003 pid=553339)
+CONTEXT:  SQL statement "delete from child where aid = old.aid"
+PL/pgSQL function parent_del_func() line 3 at SQL statement
 select * from parent; select * from child;
  aid | val1 | val2 | val3 | val4 | bcnt 
 -----+------+------+------+------+------
@@ -2046,13 +2038,9 @@ ERROR:  trigger "trg1" for relation "trigpart3" already 
exists
 drop table trigpart3;
 -- check display of unrelated triggers
 create trigger samename after delete on trigpart execute function 
trigger_nothing();
-<<<<<<< HEAD
 ERROR:  Triggers for statements are not yet supported
 create trigger samename after delete on trigpart1 execute function 
trigger_nothing();
 ERROR:  Triggers for statements are not yet supported
-=======
-create trigger samename after delete on trigpart1 execute function 
trigger_nothing();
->>>>>>> REL_16_9
 \d trigpart1
              Table "public.trigpart1"
  Column |  Type   | Collation | Nullable | Default 
@@ -2061,10 +2049,6 @@ create trigger samename after delete on trigpart1 
execute function trigger_nothi
  b      | integer |           |          | 
 Partition of: trigpart FOR VALUES FROM (0) TO (1000)
 Triggers:
-<<<<<<< HEAD
-=======
-    samename AFTER DELETE ON trigpart1 FOR EACH STATEMENT EXECUTE FUNCTION 
trigger_nothing()
->>>>>>> REL_16_9
     trg1 AFTER INSERT ON trigpart1 FOR EACH ROW EXECUTE FUNCTION 
trigger_nothing(), ON TABLE trigpart
 
 drop table trigpart;
@@ -2220,30 +2204,19 @@ create or replace function trigger_notice() returns 
trigger as $$
   $$ language plpgsql;
 create trigger parted_trig_before_stmt before insert or update or delete on 
parted_trig
    for each statement execute procedure trigger_notice();
+ERROR:  Triggers for statements are not yet supported
 create trigger parted_trig_before_row before insert or update or delete on 
parted_trig
    for each row execute procedure trigger_notice();
 create trigger parted_trig_after_row after insert or update or delete on 
parted_trig
    for each row execute procedure trigger_notice();
 create trigger parted_trig_after_stmt after insert or update or delete on 
parted_trig
    for each statement execute procedure trigger_notice();
+ERROR:  Triggers for statements are not yet supported
 update parted_trig set a = 2 where a = 1;
-NOTICE:  trigger parted_trig_before_stmt on parted_trig BEFORE UPDATE for 
STATEMENT
-NOTICE:  trigger parted_trig_before_row on parted_trig1 BEFORE UPDATE for ROW
-NOTICE:  trigger parted_trig_before_row on parted_trig1 BEFORE DELETE for ROW
-NOTICE:  trigger parted_trig_before_row on parted_trig2 BEFORE INSERT for ROW
-NOTICE:  trigger parted_trig_after_row on parted_trig1 AFTER DELETE for ROW
-NOTICE:  trigger parted_trig_after_row on parted_trig2 AFTER INSERT for ROW
-NOTICE:  trigger parted_trig_after_stmt on parted_trig AFTER UPDATE for 
STATEMENT
+ERROR:  UPDATE on distributed key column not allowed on relation with update 
triggers
 -- update action in merge should behave the same
 merge into parted_trig using (select 1) as ss on true
   when matched and a = 2 then update set a = 1;
-NOTICE:  trigger parted_trig_before_stmt on parted_trig BEFORE UPDATE for 
STATEMENT
-NOTICE:  trigger parted_trig_before_row on parted_trig2 BEFORE UPDATE for ROW
-NOTICE:  trigger parted_trig_before_row on parted_trig2 BEFORE DELETE for ROW
-NOTICE:  trigger parted_trig_before_row on parted_trig1 BEFORE INSERT for ROW
-NOTICE:  trigger parted_trig_after_row on parted_trig2 AFTER DELETE for ROW
-NOTICE:  trigger parted_trig_after_row on parted_trig1 AFTER INSERT for ROW
-NOTICE:  trigger parted_trig_after_stmt on parted_trig AFTER UPDATE for 
STATEMENT
 drop table parted_trig;
 -- Verify propagation of trigger arguments to partitions
 create table parted_trig (a int) partition by list (a);
@@ -2629,27 +2602,27 @@ create trigger tg after insert on parent
   for each row execute procedure trig_nothing();
 create trigger tg_stmt after insert on parent
   for statement execute procedure trig_nothing();
+ERROR:  Triggers for statements are not yet supported
 select tgrelid::regclass, tgname, tgenabled from pg_trigger
   where tgrelid in ('parent'::regclass, 'child1'::regclass)
   order by tgrelid::regclass::text, tgname;
- tgrelid | tgname  | tgenabled 
----------+---------+-----------
- child1  | tg      | O
- parent  | tg      | O
- parent  | tg_stmt | O
-(3 rows)
+ tgrelid | tgname | tgenabled 
+---------+--------+-----------
+ child1  | tg     | O
+ parent  | tg     | O
+(2 rows)
 
 alter table only parent enable always trigger tg;      -- no recursion because 
ONLY
 alter table parent enable always trigger tg_stmt;      -- no recursion because 
statement trigger
+ERROR:  trigger "tg_stmt" for table "parent" does not exist
 select tgrelid::regclass, tgname, tgenabled from pg_trigger
   where tgrelid in ('parent'::regclass, 'child1'::regclass)
   order by tgrelid::regclass::text, tgname;
- tgrelid | tgname  | tgenabled 
----------+---------+-----------
- child1  | tg      | O
- parent  | tg      | A
- parent  | tg_stmt | A
-(3 rows)
+ tgrelid | tgname | tgenabled 
+---------+--------+-----------
+ child1  | tg     | O
+ parent  | tg     | A
+(2 rows)
 
 -- The following is a no-op for the parent trigger but not so
 -- for the child trigger, so recursion should be applied.
@@ -2657,28 +2630,24 @@ alter table parent enable always trigger tg;
 select tgrelid::regclass, tgname, tgenabled from pg_trigger
   where tgrelid in ('parent'::regclass, 'child1'::regclass)
   order by tgrelid::regclass::text, tgname;
- tgrelid | tgname  | tgenabled 
----------+---------+-----------
- child1  | tg      | A
- parent  | tg      | A
- parent  | tg_stmt | A
-(3 rows)
+ tgrelid | tgname | tgenabled 
+---------+--------+-----------
+ child1  | tg     | A
+ parent  | tg     | A
+(2 rows)
 
 -- This variant malfunctioned in some releases.
 alter table parent disable trigger user;
 select tgrelid::regclass, tgname, tgenabled from pg_trigger
   where tgrelid in ('parent'::regclass, 'child1'::regclass)
   order by tgrelid::regclass::text, tgname;
- tgrelid | tgname  | tgenabled 
----------+---------+-----------
- child1  | tg      | D
- parent  | tg      | D
- parent  | tg_stmt | D
-(3 rows)
+ tgrelid | tgname | tgenabled 
+---------+--------+-----------
+ child1  | tg     | D
+ parent  | tg     | D
+(2 rows)
 
 drop table parent, child1;
-<<<<<<< HEAD
-=======
 -- Check processing of foreign key triggers
 create table parent (a int primary key, f int references parent)
   partition by list (a);
@@ -2689,14 +2658,14 @@ select tgrelid::regclass, rtrim(tgname, '0123456789') 
as tgname,
   order by tgrelid::regclass::text, tgfoid;
  tgrelid |         tgname          |         tgfoid         | tgenabled 
 ---------+-------------------------+------------------------+-----------
- child1  | RI_ConstraintTrigger_c_ | "RI_FKey_check_ins"    | O
- child1  | RI_ConstraintTrigger_c_ | "RI_FKey_check_upd"    | O
- child1  | RI_ConstraintTrigger_a_ | "RI_FKey_noaction_del" | O
- child1  | RI_ConstraintTrigger_a_ | "RI_FKey_noaction_upd" | O
- parent  | RI_ConstraintTrigger_c_ | "RI_FKey_check_ins"    | O
- parent  | RI_ConstraintTrigger_c_ | "RI_FKey_check_upd"    | O
- parent  | RI_ConstraintTrigger_a_ | "RI_FKey_noaction_del" | O
- parent  | RI_ConstraintTrigger_a_ | "RI_FKey_noaction_upd" | O
+ child1  | RI_ConstraintTrigger_c_ | "RI_FKey_check_ins"    | D
+ child1  | RI_ConstraintTrigger_c_ | "RI_FKey_check_upd"    | D
+ child1  | RI_ConstraintTrigger_a_ | "RI_FKey_noaction_del" | D
+ child1  | RI_ConstraintTrigger_a_ | "RI_FKey_noaction_upd" | D
+ parent  | RI_ConstraintTrigger_c_ | "RI_FKey_check_ins"    | D
+ parent  | RI_ConstraintTrigger_c_ | "RI_FKey_check_upd"    | D
+ parent  | RI_ConstraintTrigger_a_ | "RI_FKey_noaction_del" | D
+ parent  | RI_ConstraintTrigger_a_ | "RI_FKey_noaction_upd" | D
 (8 rows)
 
 alter table parent disable trigger all;
@@ -2717,7 +2686,6 @@ select tgrelid::regclass, rtrim(tgname, '0123456789') as 
tgname,
 (8 rows)
 
 drop table parent, child1;
->>>>>>> REL_16_9
 -- Verify that firing state propagates correctly on creation, too
 CREATE TABLE trgfire (i int) PARTITION BY RANGE (i);
 CREATE TABLE trgfire1 PARTITION OF trgfire FOR VALUES FROM (1) TO (10);
@@ -2994,26 +2962,27 @@ create table trans_tab_child2 partition of 
trans_tab_parent for values in ('BBB1
 create trigger trans_tab_parent_update_trig
   after update on trans_tab_parent referencing old table as old_table
   for each statement execute procedure dump_update_old();
+ERROR:  Triggers for statements are not yet supported
 create trigger trans_tab_parent_insert_trig
   after insert on trans_tab_parent referencing new table as new_table
   for each statement execute procedure dump_insert();
+ERROR:  Triggers for statements are not yet supported
 create trigger trans_tab_parent_delete_trig
   after delete on trans_tab_parent referencing old table as old_table
   for each statement execute procedure dump_delete();
+ERROR:  Triggers for statements are not yet supported
 insert into trans_tab_parent values ('AAA1'), ('BBB1');
-NOTICE:  trigger = trans_tab_parent_insert_trig, new table = (AAA1), (BBB1)
 -- should not trigger access to new table when moving across partitions.
 update trans_tab_parent set a = 'BBB2' where a = 'AAA1';
-NOTICE:  trigger = trans_tab_parent_update_trig, old table = (AAA1)
 drop trigger trans_tab_parent_update_trig on trans_tab_parent;
+ERROR:  trigger "trans_tab_parent_update_trig" for table "trans_tab_parent" 
does not exist
 create trigger trans_tab_parent_update_trig
   after update on trans_tab_parent referencing new table as new_table
   for each statement execute procedure dump_update_new();
+ERROR:  Triggers for statements are not yet supported
 -- should not trigger access to old table when moving across partitions.
 update trans_tab_parent set a = 'AAA2' where a = 'BBB1';
-NOTICE:  trigger = trans_tab_parent_update_trig, new table = (AAA2)
 delete from trans_tab_parent;
-NOTICE:  trigger = trans_tab_parent_delete_trig, old table = (AAA2), (BBB2)
 -- clean up
 drop table trans_tab_parent, trans_tab_child1, trans_tab_child2;
 drop function dump_update_new, dump_update_old;
@@ -3365,12 +3334,15 @@ create table merge_target_table (a int primary key, b 
text);
 create trigger merge_target_table_insert_trig
   after insert on merge_target_table referencing new table as new_table
   for each statement execute procedure dump_insert();
+ERROR:  Triggers for statements are not yet supported
 create trigger merge_target_table_update_trig
   after update on merge_target_table referencing old table as old_table new 
table as new_table
   for each statement execute procedure dump_update();
+ERROR:  Triggers for statements are not yet supported
 create trigger merge_target_table_delete_trig
   after delete on merge_target_table referencing old table as old_table
   for each statement execute procedure dump_delete();
+ERROR:  Triggers for statements are not yet supported
 create table merge_source_table (a int, b text);
 insert into merge_source_table
   values (1, 'initial1'), (2, 'initial2'),
@@ -3380,7 +3352,6 @@ using merge_source_table s
 on t.a = s.a
 when not matched then
   insert values (a, b);
-NOTICE:  trigger = merge_target_table_insert_trig, new table = (1,initial1), 
(2,initial2), (3,initial3), (4,initial4)
 merge into merge_target_table t
 using merge_source_table s
 on t.a = s.a
@@ -3390,9 +3361,6 @@ when matched and s.a > 2 then
        delete
 when not matched then
   insert values (a, b);
-NOTICE:  trigger = merge_target_table_delete_trig, old table = (3,initial3), 
(4,initial4)
-NOTICE:  trigger = merge_target_table_update_trig, old table = (1,initial1), 
(2,initial2), new table = (1,"initial1 updated by merge"), (2,"initial2 updated 
by merge")
-NOTICE:  trigger = merge_target_table_insert_trig, new table = <NULL>
 merge into merge_target_table t
 using merge_source_table s
 on t.a = s.a
@@ -3402,9 +3370,6 @@ when matched and s.a > 2 then
        delete
 when not matched then
   insert values (a, b);
-NOTICE:  trigger = merge_target_table_delete_trig, old table = <NULL>
-NOTICE:  trigger = merge_target_table_update_trig, old table = (1,"initial1 
updated by merge"), (2,"initial2 updated by merge"), new table = (1,"initial1 
updated by merge updated again by merge"), (2,"initial2 updated by merge 
updated again by merge")
-NOTICE:  trigger = merge_target_table_insert_trig, new table = (3,initial3), 
(4,initial4)
 drop table merge_source_table, merge_target_table;
 -- cleanup
 drop function dump_insert();
@@ -3546,17 +3511,10 @@ return null;
 end; $$;
 create trigger but_trigger after update on convslot_test_child
 referencing new table as new_table
-<<<<<<< HEAD
-for each statement execute function trigger_function2();
-ERROR:  Triggers for statements are not yet supported
-update convslot_test_parent set col1 = col1 || '1';
-create or replace function trigger_function3()
-=======
 for each statement execute function convslot_trig2();
+ERROR:  Triggers for statements are not yet supported
 update convslot_test_parent set col1 = col1 || '1';
-NOTICE:  trigger = but_trigger, new table = (11,tutu), (31,tutu)
 create function convslot_trig3()
->>>>>>> REL_16_9
 returns trigger
 language plpgsql
 AS $$
@@ -3569,21 +3527,13 @@ return null;
 end; $$;
 create trigger but_trigger2 after update on convslot_test_child
 referencing old table as old_table new table as new_table
-<<<<<<< HEAD
-for each statement execute function trigger_function3();
-ERROR:  Triggers for statements are not yet supported
-=======
 for each statement execute function convslot_trig3();
->>>>>>> REL_16_9
+ERROR:  Triggers for statements are not yet supported
 update convslot_test_parent set col1 = col1 || '1';
 create trigger bdt_trigger after delete on convslot_test_child
 referencing old table as old_table
-<<<<<<< HEAD
-for each statement execute function trigger_function1();
-ERROR:  Triggers for statements are not yet supported
-=======
 for each statement execute function convslot_trig1();
->>>>>>> REL_16_9
+ERROR:  Triggers for statements are not yet supported
 delete from convslot_test_parent;
 drop table convslot_test_child, convslot_test_parent;
 drop function convslot_trig1();
@@ -3596,18 +3546,20 @@ partition by range (id);
 create table convslot_test_part (val int, id int not null);
 alter table convslot_test_parent
   attach partition convslot_test_part for values from (1) to (1000);
+ERROR:  distribution policy for "convslot_test_part" must be the same as that 
for "convslot_test_parent"
 create function convslot_trig4() returns trigger as
 $$begin raise exception 'BOOM!'; end$$ language plpgsql;
 create trigger convslot_test_parent_update
     after update on convslot_test_parent
     referencing old table as old_rows new table as new_rows
     for each statement execute procedure convslot_trig4();
+ERROR:  Triggers for statements are not yet supported
 insert into convslot_test_parent (id, val) values (1, 2);
+ERROR:  no partition of relation "convslot_test_parent" found for row  (seg1 
127.0.1.1:7003 pid=464640)
+DETAIL:  Partition key of the failing row contains (id) = (1).
 begin;
 savepoint svp;
 update convslot_test_parent set val = 3;  -- error expected
-ERROR:  BOOM!
-CONTEXT:  PL/pgSQL function convslot_trig4() line 1 at RAISE
 rollback to savepoint svp;
 rollback;
 drop table convslot_test_parent;
@@ -3641,7 +3593,7 @@ ERROR:  syntax error at or near "only"
 LINE 1: alter trigger a on only grandparent rename to b;
                            ^
 alter trigger b on middle rename to c; -- can't rename trigger on partition
-ERROR:  cannot rename trigger "b" on table "middle"
+ERROR:  cannot rename trigger "b" on table "middle" (trigger.c:1608)
 HINT:  Rename the trigger on the partitioned table "grandparent" instead.
 create trigger c after insert on middle
 for each row execute procedure f();
@@ -3649,8 +3601,11 @@ alter trigger b on grandparent rename to c;
 ERROR:  trigger "c" for relation "middle" already exists
 -- Rename cascading does not affect statement triggers
 create trigger p after insert on grandparent for each statement execute 
function f();
+ERROR:  Triggers for statements are not yet supported
 create trigger p after insert on middle for each statement execute function 
f();
+ERROR:  Triggers for statements are not yet supported
 alter trigger p on grandparent rename to q;
+ERROR:  trigger "p" for table "grandparent" does not exist
 select tgrelid::regclass, tgname,
 (select tgname from pg_trigger tr where tr.oid = pg_trigger.tgparentid) 
parent_tgname
 from pg_trigger where tgrelid in (select relid from 
pg_partition_tree('grandparent'))
@@ -3664,9 +3619,7 @@ order by tgname, tgrelid::regclass::text COLLATE "C";
  chi         | c      | c
  cho         | c      | c
  middle      | c      | 
- middle      | p      | 
- grandparent | q      | 
-(9 rows)
+(7 rows)
 
 drop table grandparent;
 -- Trigger renaming does not recurse on legacy inheritance
diff --git a/src/test/regress/serial_schedule b/src/test/regress/serial_schedule
index 9a23517a7cd..2020290ab22 100644
--- a/src/test/regress/serial_schedule
+++ b/src/test/regress/serial_schedule
@@ -53,10 +53,8 @@ test: misc_sanity
 test: comments
 test: expressions
 test: unicode
-# test: create_function_1
 test: create_type
 test: create_table
-# test: create_function_2
 test: copy
 test: copyselect
 test: copydml
@@ -71,10 +69,9 @@ test: create_view
 test: index_including
 test: index_including_gist
 test: create_aggregate
-# test: create_function_3
 test: create_cast
 test: constraints
-# test: triggers
+test: triggers
 # test: select
 # test: inherit
 # test: typed_table
diff --git a/src/test/regress/sql/triggers.sql 
b/src/test/regress/sql/triggers.sql
index 0faffeceefe..999944cfc89 100644
--- a/src/test/regress/sql/triggers.sql
+++ b/src/test/regress/sql/triggers.sql
@@ -1941,8 +1941,6 @@ select tgrelid::regclass, tgname, tgenabled from 
pg_trigger
   order by tgrelid::regclass::text, tgname;
 drop table parent, child1;
 
-<<<<<<< HEAD
-=======
 -- Check processing of foreign key triggers
 create table parent (a int primary key, f int references parent)
   partition by list (a);
@@ -1958,7 +1956,6 @@ select tgrelid::regclass, rtrim(tgname, '0123456789') as 
tgname,
   order by tgrelid::regclass::text, tgfoid;
 drop table parent, child1;
 
->>>>>>> REL_16_9
 -- Verify that firing state propagates correctly on creation, too
 CREATE TABLE trgfire (i int) PARTITION BY RANGE (i);
 CREATE TABLE trgfire1 PARTITION OF trgfire FOR VALUES FROM (1) TO (10);


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to