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]