diff --git a/src/gausskernel/optimizer/commands/tablecmds.cpp b/src/gausskernel/optimizer/commands/tablecmds.cpp index 636166ffa35a686a0614ce015982c52b4b69038d..3ed0004647c388cae9dc516f54cd88cfd826a225 100644 --- a/src/gausskernel/optimizer/commands/tablecmds.cpp +++ b/src/gausskernel/optimizer/commands/tablecmds.cpp @@ -9224,13 +9224,13 @@ static void ATAddForeignKeyConstraint(AlteredTableInfo* tab, Relation rel, Const ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), errmsg("permission denied: \"%s\" is a system catalog", RelationGetRelationName(pkrel)))); - +#ifdef ENABLE_MULTIPLE_NODES if (RELATION_IS_PARTITIONED(pkrel)) ereport(ERROR, (errcode(ERRCODE_WRONG_OBJECT_TYPE), errmsg("Invalid FOREIGN KEY constraints"), errdetail("Partitioned table cannot be referenced table"))); - +#endif /* * References from permanent or unlogged tables to temp tables, and from * permanent tables to unlogged tables, are disallowed because the diff --git a/src/gausskernel/optimizer/commands/trigger.cpp b/src/gausskernel/optimizer/commands/trigger.cpp index 255c71be48e5ce5fd84a706f01020fc2d086a2e7..c34e47a1e3b658575ad547a7366cbe3d8b298c10 100644 --- a/src/gausskernel/optimizer/commands/trigger.cpp +++ b/src/gausskernel/optimizer/commands/trigger.cpp @@ -83,6 +83,8 @@ static void ConvertTriggerToFK(CreateTrigStmt* stmt, Oid funcoid); static void SetTriggerFlags(TriggerDesc* trigdesc, const Trigger* trigger); static HeapTuple GetTupleForTrigger(EState* estate, EPQState* epqstate, ResultRelInfo* relinfo, Oid targetPartitionOid, int2 bucketid, ItemPointer tid, TupleTableSlot** newSlot); + +static void ReleaseFakeRelation(Relation relation, Partition part, Relation* fakeRelation); static bool TriggerEnabled(EState* estate, ResultRelInfo* relinfo, Trigger* trigger, TriggerEvent event, const Bitmapset* modifiedCols, HeapTuple oldtup, HeapTuple newtup); static HeapTuple ExecCallTriggerFunc( @@ -2624,12 +2626,7 @@ static HeapTuple GetTupleForTrigger(EState* estate, EPQState* epqstate, ResultRe case HeapTupleSelfUpdated: /* treat it as deleted; do not process */ ReleaseBuffer(buffer); - if (RELATION_IS_PARTITIONED(relation)) { - partitionClose(relation, part, NoLock); - } - if (RELATION_OWN_BUCKET(relation)) { - releaseDummyRelation(&fakeRelation); - } + ReleaseFakeRelation(relation, part, &fakeRelation); return NULL; case HeapTupleMayBeUpdated: @@ -2665,12 +2662,7 @@ static HeapTuple GetTupleForTrigger(EState* estate, EPQState* epqstate, ResultRe * if tuple was deleted or PlanQual failed for updated tuple - * we must not process this tuple! */ - if (RELATION_IS_PARTITIONED(relation)) { - partitionClose(relation, part, NoLock); - } - if (RELATION_OWN_BUCKET(relation)) { - releaseDummyRelation(&fakeRelation); - } + ReleaseFakeRelation(relation, part, &fakeRelation); return NULL; default: @@ -2716,14 +2708,18 @@ static HeapTuple GetTupleForTrigger(EState* estate, EPQState* epqstate, ResultRe result = heapCopyTuple(&tuple, RelationGetDescr(relation), BufferGetPage(buffer)); ReleaseBuffer(buffer); + ReleaseFakeRelation(relation, part, &fakeRelation); + + return result; +} + +static void ReleaseFakeRelation(Relation relation, Partition part, Relation* fakeRelation){ if (RELATION_IS_PARTITIONED(relation)) { partitionClose(relation, part, NoLock); + releaseDummyRelation(fakeRelation); + } else if (RELATION_OWN_BUCKET(relation)) { + releaseDummyRelation(fakeRelation); } - if (RELATION_OWN_BUCKET(relation)) { - releaseDummyRelation(&fakeRelation); - } - - return result; } /* diff --git a/src/test/regress/expected/partition_foreign_key.out b/src/test/regress/expected/partition_foreign_key.out new file mode 100644 index 0000000000000000000000000000000000000000..fd91efa4e81927d02ff0d8aaae28ce2d225a6125 --- /dev/null +++ b/src/test/regress/expected/partition_foreign_key.out @@ -0,0 +1,751 @@ +DROP TABLE IF EXISTS pt2; +NOTICE: table "pt2" does not exist, skipping +DROP TABLE IF EXISTS pt1; +NOTICE: table "pt1" does not exist, skipping +CREATE TABLE pt1( + d_date date UNIQUE +)partition BY RANGE (d_date) INTERVAL('1 day') +(PARTITION part1 VALUES LESS THAN ('1900-01-01')); +NOTICE: CREATE TABLE / UNIQUE will create implicit index "pt1_d_date_key" for table "pt1" + +CREATE TABLE pt2( + d_date date +)partition BY RANGE (d_date) INTERVAL('1 day') +(PARTITION part1 VALUES LESS THAN ('1900-01-01')); + +ALTER TABLE pt2 ADD CONSTRAINT test_foreign FOREIGN KEY(d_date) +REFERENCES pt1(d_date) on UPDATE CASCADE ON DELETE CASCADE; + +INSERT into pt1 VALUES('1999-01-01'),('1999-01-02'),('1999-01-03'),('1999-01-04'); + +INSERT into pt2 VALUES('1999-01-01'); + +INSERT into pt2 VALUES('2000-01-01'); +ERROR: insert or update on table "pt2" violates foreign key constraint "test_foreign" +DETAIL: Key (d_date)=(Sat Jan 01 00:00:00 2000) is not present in table "pt1". + +update pt2 set pt2.d_date = '2000-01-01' where pt2.d_date = '1999-01-01'; +ERROR: insert or update on table "pt2" violates foreign key constraint "test_foreign" +DETAIL: Key (d_date)=(Sat Jan 01 00:00:00 2000) is not present in table "pt1". + +update pt2 set pt2.d_date = '1999-01-02' where pt2.d_date = '1999-01-01'; + +SELECT * FROM pt2; + d_date +-------------------------- + Sat Jan 02 00:00:00 1999 +(1 row) + + +SELECT * FROM pt2 PARTITION(sys_p2); + d_date +-------------------------- + Sat Jan 02 00:00:00 1999 +(1 row) + + +delete from pt2; +INSERT into pt2 VALUES('1999-01-01'), ('1999-01-03'),('1999-01-04'); + +INSERT into pt1 VALUES('1999-01-08'); + +INSERT into pt2 VALUES('1999-01-08'); + +update pt1 set pt1.d_date = '2000-01-01' where pt1.d_date = '1999-01-08'; + +delete from pt1 where pt1.d_date = '2000-01-01'; + +DROP TABLE pt2; +DROP TABLE pt1; + +CREATE TABLE pt1( + d_date date UNIQUE +)partition BY RANGE (d_date) INTERVAL('1 month') +(PARTITION part1 VALUES LESS THAN ('1900-01-01')); +NOTICE: CREATE TABLE / UNIQUE will create implicit index "pt1_d_date_key" for table "pt1" + +CREATE TABLE pt2( + d_date date +)partition BY RANGE (d_date) INTERVAL('1 month') +(PARTITION part1 VALUES LESS THAN ('1900-01-01')); + +ALTER TABLE pt2 ADD CONSTRAINT test_foreign FOREIGN KEY(d_date) +REFERENCES pt1(d_date) on UPDATE CASCADE ON DELETE CASCADE; + +INSERT INTO pt1 VALUES +('1999-01-01'),('1999-01-02'),('1999-01-019'),('1999-01-20'), +('1999-02-01'),('1999-02-02'),('1999-02-19'),('1999-02-20'), +('1999-03-01'),('1999-03-02'),('1999-03-19'),('1999-03-20'), +('1999-04-01'),('1999-04-02'),('1999-04-19'),('1999-04-20'), +('1999-05-01'),('1999-05-02'),('1999-05-19'),('1999-05-20'), +('1999-06-01'),('1999-06-02'),('1999-06-19'),('1999-06-20'), +('1999-07-01'),('1999-07-02'),('1999-07-19'),('1999-07-20'), +('1999-08-01'),('1999-08-02'),('1999-08-19'),('1999-08-20'), +('1999-09-01'),('1999-09-02'),('1999-09-19'),('1999-09-20'), +('1999-10-01'),('1999-10-02'),('1999-10-19'),('1999-10-20'), +('1999-11-01'),('1999-11-02'),('1999-11-19'),('1999-11-20'), +('1999-12-01'),('1999-12-02'),('1999-12-19'),('1999-12-20'); + +INSERT INTO pt2 VALUES +('1999-01-01'),('1999-01-02'),('1999-01-019'),('1999-01-20'), +('1999-02-01'),('1999-02-02'),('1999-02-19'),('1999-02-20'), +('1999-03-01'),('1999-03-02'),('1999-03-19'),('1999-03-20'), +('1999-04-01'),('1999-04-02'),('1999-04-19'),('1999-04-20'), +('1999-05-01'),('1999-05-02'),('1999-05-19'),('1999-05-20'), +('1999-06-01'),('1999-06-02'),('1999-06-19'),('1999-06-20'), +('1999-07-01'),('1999-07-02'),('1999-07-19'),('1999-07-20'), +('1999-08-01'),('1999-08-02'),('1999-08-19'),('1999-08-20'), +('1999-09-01'),('1999-09-02'),('1999-09-19'),('1999-09-20'), +('1999-10-01'),('1999-10-02'),('1999-10-19'),('1999-10-20'), +('1999-11-01'),('1999-11-02'),('1999-11-19'),('1999-11-20'), +('1999-12-01'),('1999-12-02'),('1999-12-19'),('1999-12-20'); + +delete from pt2 where pt2.d_date<'1999-03-01'; + +select * from pt2 where pt2.d_date<'1999-06-01'; + d_date +-------------------------- + Mon Mar 01 00:00:00 1999 + Tue Mar 02 00:00:00 1999 + Fri Mar 19 00:00:00 1999 + Sat Mar 20 00:00:00 1999 + Thu Apr 01 00:00:00 1999 + Fri Apr 02 00:00:00 1999 + Mon Apr 19 00:00:00 1999 + Tue Apr 20 00:00:00 1999 + Sat May 01 00:00:00 1999 + Sun May 02 00:00:00 1999 + Wed May 19 00:00:00 1999 + Thu May 20 00:00:00 1999 +(12 rows) + + +delete from pt1 where pt1.d_date<'1999-05-01'; + +delete from pt2 where pt2.d_date>'1999-11-15' and pt2.d_date<'1999-12-15'; +SELECT * FROM pt2 WHERE pt2.d_date>='1999-10-01'; + d_date +-------------------------- + Fri Oct 01 00:00:00 1999 + Sat Oct 02 00:00:00 1999 + Tue Oct 19 00:00:00 1999 + Wed Oct 20 00:00:00 1999 + Mon Nov 01 00:00:00 1999 + Tue Nov 02 00:00:00 1999 + Sun Dec 19 00:00:00 1999 + Mon Dec 20 00:00:00 1999 +(8 rows) + + +delete from pt1 where pt1.d_date>'1999-10-15' and pt1.d_date<'1999-11-15'; +SELECT * FROM pt1 WHERE pt1.d_date>='1999-10-01'; + d_date +-------------------------- + Fri Oct 01 00:00:00 1999 + Sat Oct 02 00:00:00 1999 + Fri Nov 19 00:00:00 1999 + Sat Nov 20 00:00:00 1999 + Wed Dec 01 00:00:00 1999 + Thu Dec 02 00:00:00 1999 + Sun Dec 19 00:00:00 1999 + Mon Dec 20 00:00:00 1999 +(8 rows) + + +SELECT * FROM pt2 WHERE pt2.d_date>='1999-10-01'; + d_date +-------------------------- + Fri Oct 01 00:00:00 1999 + Sat Oct 02 00:00:00 1999 + Sun Dec 19 00:00:00 1999 + Mon Dec 20 00:00:00 1999 +(4 rows) + + +UPDATE pt2 set d_date = d_date - INTERVAL '4' month where d_date>='1999-05-01' and d_date<'1999-06-01'; +ERROR: insert or update on table "pt2" violates foreign key constraint "test_foreign" +DETAIL: Key (d_date)=(Fri Jan 01 00:00:00 1999) is not present in table "pt1". + +UPDATE pt1 set d_date = d_date - INTERVAL '4' month where d_date>='1999-05-01' and d_date<'1999-06-01'; +SELECT * FROM pt1 WHERE d_date<'1999-07-01'; + d_date +-------------------------- + Fri Jan 01 00:00:00 1999 + Sat Jan 02 00:00:00 1999 + Tue Jan 19 00:00:00 1999 + Wed Jan 20 00:00:00 1999 + Tue Jun 01 00:00:00 1999 + Wed Jun 02 00:00:00 1999 + Sat Jun 19 00:00:00 1999 + Sun Jun 20 00:00:00 1999 +(8 rows) + + +SELECT * FROM pt1 WHERE d_date<'1999-07-01'; + d_date +-------------------------- + Fri Jan 01 00:00:00 1999 + Sat Jan 02 00:00:00 1999 + Tue Jan 19 00:00:00 1999 + Wed Jan 20 00:00:00 1999 + Tue Jun 01 00:00:00 1999 + Wed Jun 02 00:00:00 1999 + Sat Jun 19 00:00:00 1999 + Sun Jun 20 00:00:00 1999 +(8 rows) + + +UPDATE pt2 set d_date = d_date - INTERVAL '1' month where d_date>='1999-06-01' and d_date<='1999-07-15'; +ERROR: insert or update on table "pt2" violates foreign key constraint "test_foreign" +DETAIL: Key (d_date)=(Sat May 01 00:00:00 1999) is not present in table "pt1". + +UPDATE pt1 set d_date = d_date - INTERVAL '1' month where d_date>='1999-06-01' and d_date<='1999-07-15'; +SELECT * FROM pt1 WHERE d_date<'1999-08-01'; + d_date +-------------------------- + Fri Jan 01 00:00:00 1999 + Sat Jan 02 00:00:00 1999 + Tue Jan 19 00:00:00 1999 + Wed Jan 20 00:00:00 1999 + Sat May 01 00:00:00 1999 + Sun May 02 00:00:00 1999 + Wed May 19 00:00:00 1999 + Thu May 20 00:00:00 1999 + Tue Jun 01 00:00:00 1999 + Wed Jun 02 00:00:00 1999 + Mon Jul 19 00:00:00 1999 + Tue Jul 20 00:00:00 1999 +(12 rows) + + +SELECT * FROM pt2 WHERE d_date<'1999-08-01'; + d_date +-------------------------- + Fri Jan 01 00:00:00 1999 + Sat Jan 02 00:00:00 1999 + Tue Jan 19 00:00:00 1999 + Wed Jan 20 00:00:00 1999 + Sat May 01 00:00:00 1999 + Sun May 02 00:00:00 1999 + Wed May 19 00:00:00 1999 + Thu May 20 00:00:00 1999 + Tue Jun 01 00:00:00 1999 + Wed Jun 02 00:00:00 1999 + Mon Jul 19 00:00:00 1999 + Tue Jul 20 00:00:00 1999 +(12 rows) + + +DROP TABLE IF EXISTS pt2; +DROP TABLE IF EXISTS pt1; + +CREATE TABLE pt1( +d_date date UNIQUE +)partition BY RANGE (d_date) INTERVAL('1 month') +(PARTITION part1 VALUES LESS THAN ('1900-01-01')) +; +NOTICE: CREATE TABLE / UNIQUE will create implicit index "pt1_d_date_key" for table "pt1" + +CREATE TABLE pt2( +d_date date, +d_date_backup date +)partition BY RANGE (d_date_backup) INTERVAL('1 month') +(PARTITION part1 VALUES LESS THAN ('1900-01-01')); + + +ALTER TABLE pt2 ADD CONSTRAINT test_foreign FOREIGN KEY(d_date) +REFERENCES pt1(d_date) on UPDATE SET NULL ON DELETE SET NULL; + +INSERT INTO pt1 VALUES +('1999-01-01'),('1999-01-02'),('1999-01-019'),('1999-01-20'), +('1999-02-01'),('1999-02-02'),('1999-02-19'),('1999-02-20'), +('1999-03-01'),('1999-03-02'),('1999-03-19'),('1999-03-20'), +('1999-04-01'),('1999-04-02'),('1999-04-19'),('1999-04-20'), +('1999-05-01'),('1999-05-02'),('1999-05-19'),('1999-05-20'), +('1999-06-01'),('1999-06-02'),('1999-06-19'),('1999-06-20'), +('1999-07-01'),('1999-07-02'),('1999-07-19'),('1999-07-20'), +('1999-08-01'),('1999-08-02'),('1999-08-19'),('1999-08-20'), +('1999-09-01'),('1999-09-02'),('1999-09-19'),('1999-09-20'), +('1999-10-01'),('1999-10-02'),('1999-10-19'),('1999-10-20'), +('1999-11-01'),('1999-11-02'),('1999-11-19'),('1999-11-20'), +('1999-12-01'),('1999-12-02'),('1999-12-19'),('1999-12-20'); + +INSERT INTO pt2 VALUES +('1999-01-01','1999-01-01'),('1999-01-02','1999-01-02'), +('1999-01-19','1999-01-19'),('1999-01-20','1999-01-20'), +('1999-02-01','1999-02-01'),('1999-02-02','1999-02-02'), +('1999-02-19','1999-02-19'),('1999-02-20','1999-02-20'), +('1999-03-01','1999-03-01'),('1999-03-02','1999-03-02'), +('1999-03-19','1999-03-19'),('1999-03-20','1999-03-20'), +('1999-04-01','1999-04-01'),('1999-04-02','1999-04-02'), +('1999-04-19','1999-04-19'),('1999-04-20','1999-04-20'), +('1999-05-01','1999-05-01'),('1999-05-02','1999-05-02'), +('1999-05-19','1999-05-19'),('1999-05-20','1999-05-20'), +('1999-06-01','1999-06-01'),('1999-06-02','1999-06-02'), +('1999-06-19','1999-06-19'),('1999-06-20','1999-06-20'), +('1999-07-01','1999-07-01'),('1999-07-02','1999-07-02'), +('1999-07-19','1999-07-19'),('1999-07-20','1999-07-20'), +('1999-08-01','1999-08-01'),('1999-08-02','1999-08-02'), +('1999-08-19','1999-08-19'),('1999-08-20','1999-08-20'), +('1999-09-01','1999-09-01'),('1999-09-02','1999-09-02'), +('1999-09-19','1999-09-19'),('1999-09-20','1999-09-20'), +('1999-10-01','1999-10-01'),('1999-10-02','1999-10-02'), +('1999-10-19','1999-10-19'),('1999-10-20','1999-10-20'), +('1999-11-01','1999-11-01'),('1999-11-02','1999-11-02'), +('1999-11-19','1999-11-19'),('1999-11-20','1999-11-20'), +('1999-12-01','1999-12-01'),('1999-12-02','1999-12-02'), +('1999-12-19','1999-12-19'),('1999-12-20','1999-12-20'); + +insert into pt1 VALUES('2000-01-01'),('2000-01-02'), +('2000-01-19'),('2000-01-20'), +('2000-02-01'),('2000-02-02'), +('2000-02-19'),('2000-02-20'); +SELECT * FROM pt1 WHERE d_date>='2000-01-01'; + d_date +-------------------------- + Sat Jan 01 00:00:00 2000 + Sun Jan 02 00:00:00 2000 + Wed Jan 19 00:00:00 2000 + Thu Jan 20 00:00:00 2000 + Tue Feb 01 00:00:00 2000 + Wed Feb 02 00:00:00 2000 + Sat Feb 19 00:00:00 2000 + Sun Feb 20 00:00:00 2000 +(8 rows) + + +update pt1 set d_date = '2000-02-21' WHERE d_date = '2000-02-20'; +SELECT * FROM pt1 WHERE d_date>='2000-02-01'; + d_date +-------------------------- + Tue Feb 01 00:00:00 2000 + Wed Feb 02 00:00:00 2000 + Sat Feb 19 00:00:00 2000 + Mon Feb 21 00:00:00 2000 +(4 rows) + + +DELETE FROM pt1 WHERE d_date = '2000-02-21'; +SELECT * FROM pt1 WHERE d_date>='2000-02-01'; + d_date +-------------------------- + Tue Feb 01 00:00:00 2000 + Wed Feb 02 00:00:00 2000 + Sat Feb 19 00:00:00 2000 +(3 rows) + + +SELECT * FROM pt1 PARTITION FOR('1999-06-16'); + d_date +-------------------------- + Tue Jun 01 00:00:00 1999 + Wed Jun 02 00:00:00 1999 + Sat Jun 19 00:00:00 1999 + Sun Jun 20 00:00:00 1999 +(4 rows) + + +INSERT into pt2 VALUES('2020-08-19','2020-08-19'); +ERROR: insert or update on table "pt2" violates foreign key constraint "test_foreign" +DETAIL: Key (d_date)=(Wed Aug 19 00:00:00 2020) is not present in table "pt1". + +INSERT into pt2 VALUES('2000-01-01','2000-01-01'); + +update pt2 set pt2.d_date = '2020-08-13' +where pt2.d_date = '1999-01-01'; +ERROR: insert or update on table "pt2" violates foreign key constraint "test_foreign" +DETAIL: Key (d_date)=(Thu Aug 13 00:00:00 2020) is not present in table "pt1". + +update pt2 set pt2.d_date = '2000-02-01',pt2.d_date_backup = '2000-02-01' +where pt2.d_date = '2000-01-01'; + +SELECT * FROM pt2; + d_date | d_date_backup +--------------------------+-------------------------- + Fri Jan 01 00:00:00 1999 | Fri Jan 01 00:00:00 1999 + Sat Jan 02 00:00:00 1999 | Sat Jan 02 00:00:00 1999 + Tue Jan 19 00:00:00 1999 | Tue Jan 19 00:00:00 1999 + Wed Jan 20 00:00:00 1999 | Wed Jan 20 00:00:00 1999 + Mon Feb 01 00:00:00 1999 | Mon Feb 01 00:00:00 1999 + Tue Feb 02 00:00:00 1999 | Tue Feb 02 00:00:00 1999 + Fri Feb 19 00:00:00 1999 | Fri Feb 19 00:00:00 1999 + Sat Feb 20 00:00:00 1999 | Sat Feb 20 00:00:00 1999 + Mon Mar 01 00:00:00 1999 | Mon Mar 01 00:00:00 1999 + Tue Mar 02 00:00:00 1999 | Tue Mar 02 00:00:00 1999 + Fri Mar 19 00:00:00 1999 | Fri Mar 19 00:00:00 1999 + Sat Mar 20 00:00:00 1999 | Sat Mar 20 00:00:00 1999 + Thu Apr 01 00:00:00 1999 | Thu Apr 01 00:00:00 1999 + Fri Apr 02 00:00:00 1999 | Fri Apr 02 00:00:00 1999 + Mon Apr 19 00:00:00 1999 | Mon Apr 19 00:00:00 1999 + Tue Apr 20 00:00:00 1999 | Tue Apr 20 00:00:00 1999 + Sat May 01 00:00:00 1999 | Sat May 01 00:00:00 1999 + Sun May 02 00:00:00 1999 | Sun May 02 00:00:00 1999 + Wed May 19 00:00:00 1999 | Wed May 19 00:00:00 1999 + Thu May 20 00:00:00 1999 | Thu May 20 00:00:00 1999 + Tue Jun 01 00:00:00 1999 | Tue Jun 01 00:00:00 1999 + Wed Jun 02 00:00:00 1999 | Wed Jun 02 00:00:00 1999 + Sat Jun 19 00:00:00 1999 | Sat Jun 19 00:00:00 1999 + Sun Jun 20 00:00:00 1999 | Sun Jun 20 00:00:00 1999 + Thu Jul 01 00:00:00 1999 | Thu Jul 01 00:00:00 1999 + Fri Jul 02 00:00:00 1999 | Fri Jul 02 00:00:00 1999 + Mon Jul 19 00:00:00 1999 | Mon Jul 19 00:00:00 1999 + Tue Jul 20 00:00:00 1999 | Tue Jul 20 00:00:00 1999 + Sun Aug 01 00:00:00 1999 | Sun Aug 01 00:00:00 1999 + Mon Aug 02 00:00:00 1999 | Mon Aug 02 00:00:00 1999 + Thu Aug 19 00:00:00 1999 | Thu Aug 19 00:00:00 1999 + Fri Aug 20 00:00:00 1999 | Fri Aug 20 00:00:00 1999 + Wed Sep 01 00:00:00 1999 | Wed Sep 01 00:00:00 1999 + Thu Sep 02 00:00:00 1999 | Thu Sep 02 00:00:00 1999 + Sun Sep 19 00:00:00 1999 | Sun Sep 19 00:00:00 1999 + Mon Sep 20 00:00:00 1999 | Mon Sep 20 00:00:00 1999 + Fri Oct 01 00:00:00 1999 | Fri Oct 01 00:00:00 1999 + Sat Oct 02 00:00:00 1999 | Sat Oct 02 00:00:00 1999 + Tue Oct 19 00:00:00 1999 | Tue Oct 19 00:00:00 1999 + Wed Oct 20 00:00:00 1999 | Wed Oct 20 00:00:00 1999 + Mon Nov 01 00:00:00 1999 | Mon Nov 01 00:00:00 1999 + Tue Nov 02 00:00:00 1999 | Tue Nov 02 00:00:00 1999 + Fri Nov 19 00:00:00 1999 | Fri Nov 19 00:00:00 1999 + Sat Nov 20 00:00:00 1999 | Sat Nov 20 00:00:00 1999 + Wed Dec 01 00:00:00 1999 | Wed Dec 01 00:00:00 1999 + Thu Dec 02 00:00:00 1999 | Thu Dec 02 00:00:00 1999 + Sun Dec 19 00:00:00 1999 | Sun Dec 19 00:00:00 1999 + Mon Dec 20 00:00:00 1999 | Mon Dec 20 00:00:00 1999 + Tue Feb 01 00:00:00 2000 | Tue Feb 01 00:00:00 2000 +(49 rows) + + +SELECT * FROM pt2 PARTITION(sys_p2); + d_date | d_date_backup +--------------------------+-------------------------- + Mon Feb 01 00:00:00 1999 | Mon Feb 01 00:00:00 1999 + Tue Feb 02 00:00:00 1999 | Tue Feb 02 00:00:00 1999 + Fri Feb 19 00:00:00 1999 | Fri Feb 19 00:00:00 1999 + Sat Feb 20 00:00:00 1999 | Sat Feb 20 00:00:00 1999 +(4 rows) + + +delete from pt2 where pt2.d_date<'1999-03-01'; +select * from pt2 where pt2.d_date<'1999-06-01'; + d_date | d_date_backup +--------------------------+-------------------------- + Mon Mar 01 00:00:00 1999 | Mon Mar 01 00:00:00 1999 + Tue Mar 02 00:00:00 1999 | Tue Mar 02 00:00:00 1999 + Fri Mar 19 00:00:00 1999 | Fri Mar 19 00:00:00 1999 + Sat Mar 20 00:00:00 1999 | Sat Mar 20 00:00:00 1999 + Thu Apr 01 00:00:00 1999 | Thu Apr 01 00:00:00 1999 + Fri Apr 02 00:00:00 1999 | Fri Apr 02 00:00:00 1999 + Mon Apr 19 00:00:00 1999 | Mon Apr 19 00:00:00 1999 + Tue Apr 20 00:00:00 1999 | Tue Apr 20 00:00:00 1999 + Sat May 01 00:00:00 1999 | Sat May 01 00:00:00 1999 + Sun May 02 00:00:00 1999 | Sun May 02 00:00:00 1999 + Wed May 19 00:00:00 1999 | Wed May 19 00:00:00 1999 + Thu May 20 00:00:00 1999 | Thu May 20 00:00:00 1999 +(12 rows) + + +delete from pt1 where d_date<'1999-05-01'; +select * from pt1 where d_date<'1999-06-01'; + d_date +-------------------------- + Sat May 01 00:00:00 1999 + Sun May 02 00:00:00 1999 + Wed May 19 00:00:00 1999 + Thu May 20 00:00:00 1999 +(4 rows) + + +select * from pt2 where d_date_backup<'1999-06-01'; + d_date | d_date_backup +--------------------------+-------------------------- + | Mon Mar 01 00:00:00 1999 + | Tue Mar 02 00:00:00 1999 + | Fri Mar 19 00:00:00 1999 + | Sat Mar 20 00:00:00 1999 + | Thu Apr 01 00:00:00 1999 + | Fri Apr 02 00:00:00 1999 + | Mon Apr 19 00:00:00 1999 + | Tue Apr 20 00:00:00 1999 + Sat May 01 00:00:00 1999 | Sat May 01 00:00:00 1999 + Sun May 02 00:00:00 1999 | Sun May 02 00:00:00 1999 + Wed May 19 00:00:00 1999 | Wed May 19 00:00:00 1999 + Thu May 20 00:00:00 1999 | Thu May 20 00:00:00 1999 +(12 rows) + + +delete from pt2 where pt2.d_date>'1999-11-15' and pt2.d_date<'1999-12-15'; +SELECT * FROM pt2 WHERE pt2.d_date>='1999-10-01'; + d_date | d_date_backup +--------------------------+-------------------------- + Fri Oct 01 00:00:00 1999 | Fri Oct 01 00:00:00 1999 + Sat Oct 02 00:00:00 1999 | Sat Oct 02 00:00:00 1999 + Tue Oct 19 00:00:00 1999 | Tue Oct 19 00:00:00 1999 + Wed Oct 20 00:00:00 1999 | Wed Oct 20 00:00:00 1999 + Mon Nov 01 00:00:00 1999 | Mon Nov 01 00:00:00 1999 + Tue Nov 02 00:00:00 1999 | Tue Nov 02 00:00:00 1999 + Sun Dec 19 00:00:00 1999 | Sun Dec 19 00:00:00 1999 + Mon Dec 20 00:00:00 1999 | Mon Dec 20 00:00:00 1999 + Tue Feb 01 00:00:00 2000 | Tue Feb 01 00:00:00 2000 +(9 rows) + + +delete from pt1 where pt1.d_date>'1999-10-15' and pt1.d_date<'1999-11-15'; +SELECT * FROM pt1 WHERE pt1.d_date>='1999-10-01'; + d_date +-------------------------- + Fri Oct 01 00:00:00 1999 + Sat Oct 02 00:00:00 1999 + Fri Nov 19 00:00:00 1999 + Sat Nov 20 00:00:00 1999 + Wed Dec 01 00:00:00 1999 + Thu Dec 02 00:00:00 1999 + Sun Dec 19 00:00:00 1999 + Mon Dec 20 00:00:00 1999 + Sat Jan 01 00:00:00 2000 + Sun Jan 02 00:00:00 2000 + Wed Jan 19 00:00:00 2000 + Thu Jan 20 00:00:00 2000 + Tue Feb 01 00:00:00 2000 + Wed Feb 02 00:00:00 2000 + Sat Feb 19 00:00:00 2000 +(15 rows) + + +SELECT * FROM pt2 WHERE pt2.d_date_backup>='1999-10-01'; + d_date | d_date_backup +--------------------------+-------------------------- + Fri Oct 01 00:00:00 1999 | Fri Oct 01 00:00:00 1999 + Sat Oct 02 00:00:00 1999 | Sat Oct 02 00:00:00 1999 + | Tue Oct 19 00:00:00 1999 + | Wed Oct 20 00:00:00 1999 + | Mon Nov 01 00:00:00 1999 + | Tue Nov 02 00:00:00 1999 + Sun Dec 19 00:00:00 1999 | Sun Dec 19 00:00:00 1999 + Mon Dec 20 00:00:00 1999 | Mon Dec 20 00:00:00 1999 + Tue Feb 01 00:00:00 2000 | Tue Feb 01 00:00:00 2000 +(9 rows) + + +UPDATE pt2 set d_date = d_date - INTERVAL '4' month where d_date>='1999-05-01' and d_date<'1999-06-01'; +ERROR: insert or update on table "pt2" violates foreign key constraint "test_foreign" +DETAIL: Key (d_date)=(Fri Jan 01 00:00:00 1999) is not present in table "pt1". + +UPDATE pt1 set d_date = d_date - INTERVAL '4' month where d_date>='1999-05-01' and d_date<'1999-06-01'; +SELECT * FROM pt1 WHERE d_date<'1999-07-01'; + d_date +-------------------------- + Fri Jan 01 00:00:00 1999 + Sat Jan 02 00:00:00 1999 + Tue Jan 19 00:00:00 1999 + Wed Jan 20 00:00:00 1999 + Tue Jun 01 00:00:00 1999 + Wed Jun 02 00:00:00 1999 + Sat Jun 19 00:00:00 1999 + Sun Jun 20 00:00:00 1999 +(8 rows) + + +SELECT * FROM pt2 WHERE d_date_backup<'1999-07-01'; + d_date | d_date_backup +--------------------------+-------------------------- + | Mon Mar 01 00:00:00 1999 + | Tue Mar 02 00:00:00 1999 + | Fri Mar 19 00:00:00 1999 + | Sat Mar 20 00:00:00 1999 + | Thu Apr 01 00:00:00 1999 + | Fri Apr 02 00:00:00 1999 + | Mon Apr 19 00:00:00 1999 + | Tue Apr 20 00:00:00 1999 + | Sat May 01 00:00:00 1999 + | Sun May 02 00:00:00 1999 + | Wed May 19 00:00:00 1999 + | Thu May 20 00:00:00 1999 + Tue Jun 01 00:00:00 1999 | Tue Jun 01 00:00:00 1999 + Wed Jun 02 00:00:00 1999 | Wed Jun 02 00:00:00 1999 + Sat Jun 19 00:00:00 1999 | Sat Jun 19 00:00:00 1999 + Sun Jun 20 00:00:00 1999 | Sun Jun 20 00:00:00 1999 +(16 rows) + + +UPDATE pt2 set d_date = d_date - INTERVAL '1' month where d_date>='1999-06-01' and d_date<='1999-07-15'; +ERROR: insert or update on table "pt2" violates foreign key constraint "test_foreign" +DETAIL: Key (d_date)=(Sat May 01 00:00:00 1999) is not present in table "pt1". + +UPDATE pt1 set d_date = d_date - INTERVAL '1' month where d_date>='1999-06-01' and d_date<='1999-07-15'; +SELECT * FROM pt1 WHERE d_date<'1999-08-01'; + d_date +-------------------------- + Fri Jan 01 00:00:00 1999 + Sat Jan 02 00:00:00 1999 + Tue Jan 19 00:00:00 1999 + Wed Jan 20 00:00:00 1999 + Sat May 01 00:00:00 1999 + Sun May 02 00:00:00 1999 + Wed May 19 00:00:00 1999 + Thu May 20 00:00:00 1999 + Tue Jun 01 00:00:00 1999 + Wed Jun 02 00:00:00 1999 + Mon Jul 19 00:00:00 1999 + Tue Jul 20 00:00:00 1999 +(12 rows) + + +SELECT * FROM pt2 WHERE d_date_backup<'1999-08-01'; + d_date | d_date_backup +--------------------------+-------------------------- + | Mon Mar 01 00:00:00 1999 + | Tue Mar 02 00:00:00 1999 + | Fri Mar 19 00:00:00 1999 + | Sat Mar 20 00:00:00 1999 + | Thu Apr 01 00:00:00 1999 + | Fri Apr 02 00:00:00 1999 + | Mon Apr 19 00:00:00 1999 + | Tue Apr 20 00:00:00 1999 + | Sat May 01 00:00:00 1999 + | Sun May 02 00:00:00 1999 + | Wed May 19 00:00:00 1999 + | Thu May 20 00:00:00 1999 + | Tue Jun 01 00:00:00 1999 + | Wed Jun 02 00:00:00 1999 + | Sat Jun 19 00:00:00 1999 + | Sun Jun 20 00:00:00 1999 + Mon Jul 19 00:00:00 1999 | Mon Jul 19 00:00:00 1999 + Tue Jul 20 00:00:00 1999 | Tue Jul 20 00:00:00 1999 + | Thu Jul 01 00:00:00 1999 + | Fri Jul 02 00:00:00 1999 +(20 rows) + + +DROP TABLE IF EXISTS pt2; +DROP TABLE IF EXISTS pt1; + +CREATE TABLE pt1( +d_date date UNIQUE +)partition BY RANGE (d_date) INTERVAL('1 month') +(PARTITION part1 VALUES LESS THAN ('1900-01-01')); +NOTICE: CREATE TABLE / UNIQUE will create implicit index "pt1_d_date_key" for table "pt1" + +CREATE TABLE pt2( +d_date date, +d_date_backup date +)partition BY RANGE (d_date_backup) INTERVAL('1 month') +(PARTITION part1 VALUES LESS THAN ('1900-01-01')); + + +ALTER TABLE pt2 ADD CONSTRAINT test_foreign FOREIGN KEY(d_date) +REFERENCES pt1(d_date) on UPDATE RESTRICT ON DELETE RESTRICT; + +INSERT INTO pt1 VALUES +('1999-01-01'),('1999-01-02'),('1999-01-019'),('1999-01-20'), +('1999-02-01'),('1999-02-02'),('1999-02-19'),('1999-02-20'), +('1999-03-01'),('1999-03-02'),('1999-03-19'),('1999-03-20'), +('1999-04-01'),('1999-04-02'),('1999-04-19'),('1999-04-20'), +('1999-05-01'),('1999-05-02'),('1999-05-19'),('1999-05-20'), +('1999-06-01'),('1999-06-02'),('1999-06-19'),('1999-06-20'), +('1999-07-01'),('1999-07-02'),('1999-07-19'),('1999-07-20'), +('1999-08-01'),('1999-08-02'),('1999-08-19'),('1999-08-20'), +('1999-09-01'),('1999-09-02'),('1999-09-19'),('1999-09-20'), +('1999-10-01'),('1999-10-02'),('1999-10-19'),('1999-10-20'), +('1999-11-01'),('1999-11-02'),('1999-11-19'),('1999-11-20'), +('1999-12-01'),('1999-12-02'),('1999-12-19'),('1999-12-20'); + +INSERT INTO pt2 VALUES +('1999-01-01','1999-01-01'),('1999-01-02','1999-01-02'), +('1999-01-19','1999-01-19'),('1999-01-20','1999-01-20'), +('1999-02-01','1999-02-01'),('1999-02-02','1999-02-02'), +('1999-02-19','1999-02-19'),('1999-02-20','1999-02-20'), +('1999-03-01','1999-03-01'),('1999-03-02','1999-03-02'), +('1999-03-19','1999-03-19'),('1999-03-20','1999-03-20'), +('1999-04-01','1999-04-01'),('1999-04-02','1999-04-02'), +('1999-04-19','1999-04-19'),('1999-04-20','1999-04-20'), +('1999-05-01','1999-05-01'),('1999-05-02','1999-05-02'), +('1999-05-19','1999-05-19'),('1999-05-20','1999-05-20'), +('1999-06-01','1999-06-01'),('1999-06-02','1999-06-02'), +('1999-06-19','1999-06-19'),('1999-06-20','1999-06-20'), +('1999-07-01','1999-07-01'),('1999-07-02','1999-07-02'), +('1999-07-19','1999-07-19'),('1999-07-20','1999-07-20'), +('1999-08-01','1999-08-01'),('1999-08-02','1999-08-02'), +('1999-08-19','1999-08-19'),('1999-08-20','1999-08-20'), +('1999-09-01','1999-09-01'),('1999-09-02','1999-09-02'), +('1999-09-19','1999-09-19'),('1999-09-20','1999-09-20'), +('1999-10-01','1999-10-01'),('1999-10-02','1999-10-02'), +('1999-10-19','1999-10-19'),('1999-10-20','1999-10-20'), +('1999-11-01','1999-11-01'),('1999-11-02','1999-11-02'), +('1999-11-19','1999-11-19'),('1999-11-20','1999-11-20'), +('1999-12-01','1999-12-01'),('1999-12-02','1999-12-02'), +('1999-12-19','1999-12-19'),('1999-12-20','1999-12-20'); + +delete from pt2 where pt2.d_date<'1999-03-01'; +select * from pt2 where pt2.d_date<'1999-06-01'; + d_date | d_date_backup +--------------------------+-------------------------- + Mon Mar 01 00:00:00 1999 | Mon Mar 01 00:00:00 1999 + Tue Mar 02 00:00:00 1999 | Tue Mar 02 00:00:00 1999 + Fri Mar 19 00:00:00 1999 | Fri Mar 19 00:00:00 1999 + Sat Mar 20 00:00:00 1999 | Sat Mar 20 00:00:00 1999 + Thu Apr 01 00:00:00 1999 | Thu Apr 01 00:00:00 1999 + Fri Apr 02 00:00:00 1999 | Fri Apr 02 00:00:00 1999 + Mon Apr 19 00:00:00 1999 | Mon Apr 19 00:00:00 1999 + Tue Apr 20 00:00:00 1999 | Tue Apr 20 00:00:00 1999 + Sat May 01 00:00:00 1999 | Sat May 01 00:00:00 1999 + Sun May 02 00:00:00 1999 | Sun May 02 00:00:00 1999 + Wed May 19 00:00:00 1999 | Wed May 19 00:00:00 1999 + Thu May 20 00:00:00 1999 | Thu May 20 00:00:00 1999 +(12 rows) + + +delete from pt1 where d_date<'1999-05-01'; +ERROR: update or delete on table "pt1" violates foreign key constraint "test_foreign" on table "pt2" +DETAIL: Key (d_date)=(Mon Mar 01 00:00:00 1999) is still referenced from table "pt2". + +delete from pt2 where pt2.d_date>'1999-11-15' and pt2.d_date<'1999-12-15'; +SELECT * FROM pt2 WHERE pt2.d_date>='1999-10-01'; + d_date | d_date_backup +--------------------------+-------------------------- + Fri Oct 01 00:00:00 1999 | Fri Oct 01 00:00:00 1999 + Sat Oct 02 00:00:00 1999 | Sat Oct 02 00:00:00 1999 + Tue Oct 19 00:00:00 1999 | Tue Oct 19 00:00:00 1999 + Wed Oct 20 00:00:00 1999 | Wed Oct 20 00:00:00 1999 + Mon Nov 01 00:00:00 1999 | Mon Nov 01 00:00:00 1999 + Tue Nov 02 00:00:00 1999 | Tue Nov 02 00:00:00 1999 + Sun Dec 19 00:00:00 1999 | Sun Dec 19 00:00:00 1999 + Mon Dec 20 00:00:00 1999 | Mon Dec 20 00:00:00 1999 +(8 rows) + + +delete from pt1 where pt1.d_date>'1999-10-15' and pt1.d_date<'1999-11-15'; +ERROR: update or delete on table "pt1" violates foreign key constraint "test_foreign" on table "pt2" +DETAIL: Key (d_date)=(Tue Oct 19 00:00:00 1999) is still referenced from table "pt2". + +delete from pt2 where pt2.d_date>='1999-01-01' and pt2.d_date<'1999-05-01'; +delete from pt1 where pt1.d_date>='1999-01-01' and pt1.d_date<'1999-05-01'; + +UPDATE pt2 set d_date = d_date - INTERVAL '4' month where d_date>='1999-05-01' and d_date<'1999-06-01'; +ERROR: insert or update on table "pt2" violates foreign key constraint "test_foreign" +DETAIL: Key (d_date)=(Fri Jan 01 00:00:00 1999) is not present in table "pt1". + +UPDATE pt1 set d_date = d_date - INTERVAL '4' month where d_date>='1999-05-01' and d_date<'1999-06-01'; +ERROR: update or delete on table "pt1" violates foreign key constraint "test_foreign" on table "pt2" +DETAIL: Key (d_date)=(Sat May 01 00:00:00 1999) is still referenced from table "pt2". +SELECT * FROM pt1 WHERE d_date<'1999-07-01'; + d_date +-------------------------- + Sat May 01 00:00:00 1999 + Sun May 02 00:00:00 1999 + Wed May 19 00:00:00 1999 + Thu May 20 00:00:00 1999 + Tue Jun 01 00:00:00 1999 + Wed Jun 02 00:00:00 1999 + Sat Jun 19 00:00:00 1999 + Sun Jun 20 00:00:00 1999 +(8 rows) + + +UPDATE pt2 set d_date = d_date - INTERVAL '1' month where d_date>='1999-06-01' and d_date<='1999-07-15'; + +UPDATE pt1 set d_date = d_date - INTERVAL '5' month where d_date>='1999-06-01' and d_date<='1999-07-15'; +ERROR: update or delete on table "pt1" violates foreign key constraint "test_foreign" on table "pt2" +DETAIL: Key (d_date)=(Tue Jun 01 00:00:00 1999) is still referenced from table "pt2". + +delete from pt2 where d_date>='1999-06-01' and d_date<='1999-07-15'; +UPDATE pt1 set d_date = d_date - INTERVAL '5' month where d_date>='1999-06-01' and d_date<='1999-07-15'; + diff --git a/src/test/regress/expected/partition_trigger.out b/src/test/regress/expected/partition_trigger.out new file mode 100644 index 0000000000000000000000000000000000000000..5758af80348c305a78b15f0c11e06dacc71cd312 --- /dev/null +++ b/src/test/regress/expected/partition_trigger.out @@ -0,0 +1,294 @@ +DROP TABLE IF EXISTS pt2; +DROP TABLE IF EXISTS pt1; +DROP FUNCTION IF EXISTS test_function(); +NOTICE: function test_function() does not exist, skipping + +CREATE TABLE pt1( + d_date date UNIQUE +)partition BY RANGE (d_date) INTERVAL('1 month') +(PARTITION part1 VALUES LESS THAN ('1900-01-01')); +NOTICE: CREATE TABLE / UNIQUE will create implicit index "pt1_d_date_key" for table "pt1" + +CREATE TABLE pt2( + d_date date +)partition BY RANGE (d_date) INTERVAL('1 month') +(PARTITION part1 VALUES LESS THAN ('1900-01-01')); + + +INSERT INTO pt1 VALUES +('1999-01-01'),('1999-01-02'),('1999-01-019'),('1999-01-20'), +('1999-02-01'),('1999-02-02'),('1999-02-19'),('1999-02-20'), +('1999-03-01'),('1999-03-02'),('1999-03-19'),('1999-03-20'), +('1999-04-01'),('1999-04-02'),('1999-04-19'),('1999-04-20'), +('1999-05-01'),('1999-05-02'),('1999-05-19'),('1999-05-20'), +('1999-06-01'),('1999-06-02'),('1999-06-19'),('1999-06-20'), +('1999-07-01'),('1999-07-02'),('1999-07-19'),('1999-07-20'), +('1999-08-01'),('1999-08-02'),('1999-08-19'),('1999-08-20'), +('1999-09-01'),('1999-09-02'),('1999-09-19'),('1999-09-20'), +('1999-10-01'),('1999-10-02'),('1999-10-19'),('1999-10-20'), +('1999-11-01'),('1999-11-02'),('1999-11-19'),('1999-11-20'), +('1999-12-01'),('1999-12-02'),('1999-12-19'),('1999-12-20'); + +INSERT INTO pt2 VALUES +('1999-01-01'),('1999-01-02'),('1999-01-019'),('1999-01-20'), +('1999-02-01'),('1999-02-02'),('1999-02-19'),('1999-02-20'), +('1999-03-01'),('1999-03-02'),('1999-03-19'),('1999-03-20'), +('1999-04-01'),('1999-04-02'),('1999-04-19'),('1999-04-20'), +('1999-05-01'),('1999-05-02'),('1999-05-19'),('1999-05-20'), +('1999-06-01'),('1999-06-02'),('1999-06-19'),('1999-06-20'), +('1999-07-01'),('1999-07-02'),('1999-07-19'),('1999-07-20'), +('1999-08-01'),('1999-08-02'),('1999-08-19'),('1999-08-20'), +('1999-09-01'),('1999-09-02'),('1999-09-19'),('1999-09-20'), +('1999-10-01'),('1999-10-02'),('1999-10-19'),('1999-10-20'), +('1999-11-01'),('1999-11-02'),('1999-11-19'),('1999-11-20'), +('1999-12-01'),('1999-12-02'),('1999-12-19'),('1999-12-20'); + + +CREATE FUNCTION test_function() +RETURNS TRIGGER AS $$ +BEGIN + IF(TG_OP = 'DELETE') THEN + DELETE FROM pt2 WHERE d_date=OLD.d_date; + RETURN OLD; + ELSEIF(TG_OP = 'UPDATE') THEN + UPDATE pt2 set d_date=NEW.d_date where d_date=OLD.d_date; + RETURN NEW; + ELSEIF(TG_OP = 'INSERT') THEN + INSERT INTO pt2 VALUES(NEW.d_date); + RETURN NEW; + END IF; + RETURN NULL; +END; +$$ LANGUAGE plpgsql; + + +CREATE TRIGGER test_trigger +AFTER INSERT OR UPDATE OR DELETE on pt1 +FOR EACH ROW EXECUTE PROCEDURE test_function(); + +INSERT INTO pt1 VALUES('2016-01-01'); +UPDATE pt2 set d_date = d_date + INTERVAL '4' month where d_date>='1999-05-01'; +DELETE FROM pt1 WHERE d_date<'1999-05-01'; +SELECT * FROM pt1; + d_date +-------------------------- + Sat May 01 00:00:00 1999 + Sun May 02 00:00:00 1999 + Wed May 19 00:00:00 1999 + Thu May 20 00:00:00 1999 + Tue Jun 01 00:00:00 1999 + Wed Jun 02 00:00:00 1999 + Sat Jun 19 00:00:00 1999 + Sun Jun 20 00:00:00 1999 + Thu Jul 01 00:00:00 1999 + Fri Jul 02 00:00:00 1999 + Mon Jul 19 00:00:00 1999 + Tue Jul 20 00:00:00 1999 + Sun Aug 01 00:00:00 1999 + Mon Aug 02 00:00:00 1999 + Thu Aug 19 00:00:00 1999 + Fri Aug 20 00:00:00 1999 + Wed Sep 01 00:00:00 1999 + Thu Sep 02 00:00:00 1999 + Sun Sep 19 00:00:00 1999 + Mon Sep 20 00:00:00 1999 + Fri Oct 01 00:00:00 1999 + Sat Oct 02 00:00:00 1999 + Tue Oct 19 00:00:00 1999 + Wed Oct 20 00:00:00 1999 + Mon Nov 01 00:00:00 1999 + Tue Nov 02 00:00:00 1999 + Fri Nov 19 00:00:00 1999 + Sat Nov 20 00:00:00 1999 + Wed Dec 01 00:00:00 1999 + Thu Dec 02 00:00:00 1999 + Sun Dec 19 00:00:00 1999 + Mon Dec 20 00:00:00 1999 + Fri Jan 01 00:00:00 2016 +(33 rows) + +SELECT * FROM pt2; + d_date +-------------------------- + Wed Sep 01 00:00:00 1999 + Thu Sep 02 00:00:00 1999 + Sun Sep 19 00:00:00 1999 + Mon Sep 20 00:00:00 1999 + Fri Oct 01 00:00:00 1999 + Sat Oct 02 00:00:00 1999 + Tue Oct 19 00:00:00 1999 + Wed Oct 20 00:00:00 1999 + Mon Nov 01 00:00:00 1999 + Tue Nov 02 00:00:00 1999 + Fri Nov 19 00:00:00 1999 + Sat Nov 20 00:00:00 1999 + Wed Dec 01 00:00:00 1999 + Thu Dec 02 00:00:00 1999 + Sun Dec 19 00:00:00 1999 + Mon Dec 20 00:00:00 1999 + Sat Jan 01 00:00:00 2000 + Sun Jan 02 00:00:00 2000 + Wed Jan 19 00:00:00 2000 + Thu Jan 20 00:00:00 2000 + Tue Feb 01 00:00:00 2000 + Wed Feb 02 00:00:00 2000 + Sat Feb 19 00:00:00 2000 + Sun Feb 20 00:00:00 2000 + Wed Mar 01 00:00:00 2000 + Thu Mar 02 00:00:00 2000 + Sun Mar 19 00:00:00 2000 + Mon Mar 20 00:00:00 2000 + Sat Apr 01 00:00:00 2000 + Sun Apr 02 00:00:00 2000 + Wed Apr 19 00:00:00 2000 + Thu Apr 20 00:00:00 2000 + Sun May 01 00:00:00 2016 +(33 rows) + + +DROP TABLE IF EXISTS pt2; +DROP TABLE IF EXISTS pt1; +DROP FUNCTION IF EXISTS test_function(); + +CREATE TABLE pt1( + d_date date UNIQUE +)partition BY RANGE (d_date) INTERVAL('1 month') +(PARTITION part1 VALUES LESS THAN ('1900-01-01')); +NOTICE: CREATE TABLE / UNIQUE will create implicit index "pt1_d_date_key" for table "pt1" + +CREATE TABLE pt2( + d_date date +)partition BY RANGE (d_date) INTERVAL('1 month') +(PARTITION part1 VALUES LESS THAN ('1900-01-01')); + + +INSERT INTO pt1 VALUES +('1999-01-01'),('1999-01-02'),('1999-01-019'),('1999-01-20'), +('1999-02-01'),('1999-02-02'),('1999-02-19'),('1999-02-20'), +('1999-03-01'),('1999-03-02'),('1999-03-19'),('1999-03-20'), +('1999-04-01'),('1999-04-02'),('1999-04-19'),('1999-04-20'), +('1999-05-01'),('1999-05-02'),('1999-05-19'),('1999-05-20'), +('1999-06-01'),('1999-06-02'),('1999-06-19'),('1999-06-20'), +('1999-07-01'),('1999-07-02'),('1999-07-19'),('1999-07-20'), +('1999-08-01'),('1999-08-02'),('1999-08-19'),('1999-08-20'), +('1999-09-01'),('1999-09-02'),('1999-09-19'),('1999-09-20'), +('1999-10-01'),('1999-10-02'),('1999-10-19'),('1999-10-20'), +('1999-11-01'),('1999-11-02'),('1999-11-19'),('1999-11-20'), +('1999-12-01'),('1999-12-02'),('1999-12-19'),('1999-12-20'); + +INSERT INTO pt2 VALUES +('1999-01-01'),('1999-01-02'),('1999-01-019'),('1999-01-20'), +('1999-02-01'),('1999-02-02'),('1999-02-19'),('1999-02-20'), +('1999-03-01'),('1999-03-02'),('1999-03-19'),('1999-03-20'), +('1999-04-01'),('1999-04-02'),('1999-04-19'),('1999-04-20'), +('1999-05-01'),('1999-05-02'),('1999-05-19'),('1999-05-20'), +('1999-06-01'),('1999-06-02'),('1999-06-19'),('1999-06-20'), +('1999-07-01'),('1999-07-02'),('1999-07-19'),('1999-07-20'), +('1999-08-01'),('1999-08-02'),('1999-08-19'),('1999-08-20'), +('1999-09-01'),('1999-09-02'),('1999-09-19'),('1999-09-20'), +('1999-10-01'),('1999-10-02'),('1999-10-19'),('1999-10-20'), +('1999-11-01'),('1999-11-02'),('1999-11-19'),('1999-11-20'), +('1999-12-01'),('1999-12-02'),('1999-12-19'),('1999-12-20'); + + +CREATE FUNCTION test_function() +RETURNS TRIGGER AS $$ +BEGIN + IF(TG_OP = 'DELETE') THEN + DELETE FROM pt2 WHERE d_date=OLD.d_date; + RETURN OLD; + ELSEIF(TG_OP = 'UPDATE') THEN + UPDATE pt2 set d_date=NEW.d_date where d_date=OLD.d_date; + RETURN NEW; + ELSEIF(TG_OP = 'INSERT') THEN + INSERT INTO pt2 VALUES(NEW.d_date); + RETURN NEW; + END IF; + RETURN NULL; +END; +$$ LANGUAGE plpgsql; + + +CREATE TRIGGER test_trigger +BEFORE INSERT OR UPDATE OR DELETE on pt1 +FOR EACH ROW EXECUTE PROCEDURE test_function(); + +INSERT INTO pt1 VALUES('2016-01-01'); +UPDATE pt2 set d_date = d_date + INTERVAL '4' month where d_date>='1999-05-01'; +DELETE FROM pt1 WHERE d_date<'1999-05-01'; +SELECT * FROM pt1; + d_date +-------------------------- + Sat May 01 00:00:00 1999 + Sun May 02 00:00:00 1999 + Wed May 19 00:00:00 1999 + Thu May 20 00:00:00 1999 + Tue Jun 01 00:00:00 1999 + Wed Jun 02 00:00:00 1999 + Sat Jun 19 00:00:00 1999 + Sun Jun 20 00:00:00 1999 + Thu Jul 01 00:00:00 1999 + Fri Jul 02 00:00:00 1999 + Mon Jul 19 00:00:00 1999 + Tue Jul 20 00:00:00 1999 + Sun Aug 01 00:00:00 1999 + Mon Aug 02 00:00:00 1999 + Thu Aug 19 00:00:00 1999 + Fri Aug 20 00:00:00 1999 + Wed Sep 01 00:00:00 1999 + Thu Sep 02 00:00:00 1999 + Sun Sep 19 00:00:00 1999 + Mon Sep 20 00:00:00 1999 + Fri Oct 01 00:00:00 1999 + Sat Oct 02 00:00:00 1999 + Tue Oct 19 00:00:00 1999 + Wed Oct 20 00:00:00 1999 + Mon Nov 01 00:00:00 1999 + Tue Nov 02 00:00:00 1999 + Fri Nov 19 00:00:00 1999 + Sat Nov 20 00:00:00 1999 + Wed Dec 01 00:00:00 1999 + Thu Dec 02 00:00:00 1999 + Sun Dec 19 00:00:00 1999 + Mon Dec 20 00:00:00 1999 + Fri Jan 01 00:00:00 2016 +(33 rows) + +SELECT * FROM pt2; + d_date +-------------------------- + Wed Sep 01 00:00:00 1999 + Thu Sep 02 00:00:00 1999 + Sun Sep 19 00:00:00 1999 + Mon Sep 20 00:00:00 1999 + Fri Oct 01 00:00:00 1999 + Sat Oct 02 00:00:00 1999 + Tue Oct 19 00:00:00 1999 + Wed Oct 20 00:00:00 1999 + Mon Nov 01 00:00:00 1999 + Tue Nov 02 00:00:00 1999 + Fri Nov 19 00:00:00 1999 + Sat Nov 20 00:00:00 1999 + Wed Dec 01 00:00:00 1999 + Thu Dec 02 00:00:00 1999 + Sun Dec 19 00:00:00 1999 + Mon Dec 20 00:00:00 1999 + Sat Jan 01 00:00:00 2000 + Sun Jan 02 00:00:00 2000 + Wed Jan 19 00:00:00 2000 + Thu Jan 20 00:00:00 2000 + Tue Feb 01 00:00:00 2000 + Wed Feb 02 00:00:00 2000 + Sat Feb 19 00:00:00 2000 + Sun Feb 20 00:00:00 2000 + Wed Mar 01 00:00:00 2000 + Thu Mar 02 00:00:00 2000 + Sun Mar 19 00:00:00 2000 + Mon Mar 20 00:00:00 2000 + Sat Apr 01 00:00:00 2000 + Sun Apr 02 00:00:00 2000 + Wed Apr 19 00:00:00 2000 + Thu Apr 20 00:00:00 2000 + Sun May 01 00:00:00 2016 +(33 rows) + diff --git a/src/test/regress/parallel_schedule10 b/src/test/regress/parallel_schedule10 index 10100e4d0772b6c79b2140f46dfd8401dabd728b..18186d1ef15b03b34181a23702c31298b45d628a 100644 --- a/src/test/regress/parallel_schedule10 +++ b/src/test/regress/parallel_schedule10 @@ -74,3 +74,5 @@ test: with # run alter object to test pg_object #test: pg_object_test +test: partition_foreign_key +test: partition_trigger \ No newline at end of file diff --git a/src/test/regress/sql/partition_foreign_key.sql b/src/test/regress/sql/partition_foreign_key.sql new file mode 100644 index 0000000000000000000000000000000000000000..3158d286f4ee1e9371d65bdf9a683671ce095a6a --- /dev/null +++ b/src/test/regress/sql/partition_foreign_key.sql @@ -0,0 +1,312 @@ +DROP TABLE IF EXISTS pt2; +DROP TABLE IF EXISTS pt1; +CREATE TABLE pt1( + d_date date UNIQUE +)partition BY RANGE (d_date) INTERVAL('1 day') +(PARTITION part1 VALUES LESS THAN ('1900-01-01')); + +CREATE TABLE pt2( + d_date date +)partition BY RANGE (d_date) INTERVAL('1 day') +(PARTITION part1 VALUES LESS THAN ('1900-01-01')); + +ALTER TABLE pt2 ADD CONSTRAINT test_foreign FOREIGN KEY(d_date) +REFERENCES pt1(d_date) on UPDATE CASCADE ON DELETE CASCADE; + +INSERT into pt1 VALUES('1999-01-01'),('1999-01-02'),('1999-01-03'),('1999-01-04'); + +INSERT into pt2 VALUES('1999-01-01'); + +INSERT into pt2 VALUES('2000-01-01'); + +update pt2 set pt2.d_date = '2000-01-01' where pt2.d_date = '1999-01-01'; + +update pt2 set pt2.d_date = '1999-01-02' where pt2.d_date = '1999-01-01'; + +SELECT * FROM pt2; + +SELECT * FROM pt2 PARTITION(sys_p2); + +delete from pt2; +INSERT into pt2 VALUES('1999-01-01'), ('1999-01-03'),('1999-01-04'); + +INSERT into pt1 VALUES('1999-01-08'); + +INSERT into pt2 VALUES('1999-01-08'); + +update pt1 set pt1.d_date = '2000-01-01' where pt1.d_date = '1999-01-08'; + +delete from pt1 where pt1.d_date = '2000-01-01'; + +DROP TABLE pt2; +DROP TABLE pt1; + +CREATE TABLE pt1( + d_date date UNIQUE +)partition BY RANGE (d_date) INTERVAL('1 month') +(PARTITION part1 VALUES LESS THAN ('1900-01-01')); + +CREATE TABLE pt2( + d_date date +)partition BY RANGE (d_date) INTERVAL('1 month') +(PARTITION part1 VALUES LESS THAN ('1900-01-01')); + +ALTER TABLE pt2 ADD CONSTRAINT test_foreign FOREIGN KEY(d_date) +REFERENCES pt1(d_date) on UPDATE CASCADE ON DELETE CASCADE; + +INSERT INTO pt1 VALUES +('1999-01-01'),('1999-01-02'),('1999-01-019'),('1999-01-20'), +('1999-02-01'),('1999-02-02'),('1999-02-19'),('1999-02-20'), +('1999-03-01'),('1999-03-02'),('1999-03-19'),('1999-03-20'), +('1999-04-01'),('1999-04-02'),('1999-04-19'),('1999-04-20'), +('1999-05-01'),('1999-05-02'),('1999-05-19'),('1999-05-20'), +('1999-06-01'),('1999-06-02'),('1999-06-19'),('1999-06-20'), +('1999-07-01'),('1999-07-02'),('1999-07-19'),('1999-07-20'), +('1999-08-01'),('1999-08-02'),('1999-08-19'),('1999-08-20'), +('1999-09-01'),('1999-09-02'),('1999-09-19'),('1999-09-20'), +('1999-10-01'),('1999-10-02'),('1999-10-19'),('1999-10-20'), +('1999-11-01'),('1999-11-02'),('1999-11-19'),('1999-11-20'), +('1999-12-01'),('1999-12-02'),('1999-12-19'),('1999-12-20'); + +INSERT INTO pt2 VALUES +('1999-01-01'),('1999-01-02'),('1999-01-019'),('1999-01-20'), +('1999-02-01'),('1999-02-02'),('1999-02-19'),('1999-02-20'), +('1999-03-01'),('1999-03-02'),('1999-03-19'),('1999-03-20'), +('1999-04-01'),('1999-04-02'),('1999-04-19'),('1999-04-20'), +('1999-05-01'),('1999-05-02'),('1999-05-19'),('1999-05-20'), +('1999-06-01'),('1999-06-02'),('1999-06-19'),('1999-06-20'), +('1999-07-01'),('1999-07-02'),('1999-07-19'),('1999-07-20'), +('1999-08-01'),('1999-08-02'),('1999-08-19'),('1999-08-20'), +('1999-09-01'),('1999-09-02'),('1999-09-19'),('1999-09-20'), +('1999-10-01'),('1999-10-02'),('1999-10-19'),('1999-10-20'), +('1999-11-01'),('1999-11-02'),('1999-11-19'),('1999-11-20'), +('1999-12-01'),('1999-12-02'),('1999-12-19'),('1999-12-20'); + +delete from pt2 where pt2.d_date<'1999-03-01'; + +select * from pt2 where pt2.d_date<'1999-06-01'; + +delete from pt1 where pt1.d_date<'1999-05-01'; + +delete from pt2 where pt2.d_date>'1999-11-15' and pt2.d_date<'1999-12-15'; +SELECT * FROM pt2 WHERE pt2.d_date>='1999-10-01'; + +delete from pt1 where pt1.d_date>'1999-10-15' and pt1.d_date<'1999-11-15'; +SELECT * FROM pt1 WHERE pt1.d_date>='1999-10-01'; + +SELECT * FROM pt2 WHERE pt2.d_date>='1999-10-01'; + +UPDATE pt2 set d_date = d_date - INTERVAL '4' month where d_date>='1999-05-01' and d_date<'1999-06-01'; + +UPDATE pt1 set d_date = d_date - INTERVAL '4' month where d_date>='1999-05-01' and d_date<'1999-06-01'; +SELECT * FROM pt1 WHERE d_date<'1999-07-01'; + +SELECT * FROM pt1 WHERE d_date<'1999-07-01'; + +UPDATE pt2 set d_date = d_date - INTERVAL '1' month where d_date>='1999-06-01' and d_date<='1999-07-15'; + +UPDATE pt1 set d_date = d_date - INTERVAL '1' month where d_date>='1999-06-01' and d_date<='1999-07-15'; +SELECT * FROM pt1 WHERE d_date<'1999-08-01'; + +SELECT * FROM pt2 WHERE d_date<'1999-08-01'; + +DROP TABLE IF EXISTS pt2; +DROP TABLE IF EXISTS pt1; + +CREATE TABLE pt1( +d_date date UNIQUE +)partition BY RANGE (d_date) INTERVAL('1 month') +(PARTITION part1 VALUES LESS THAN ('1900-01-01')) +; + +CREATE TABLE pt2( +d_date date, +d_date_backup date +)partition BY RANGE (d_date_backup) INTERVAL('1 month') +(PARTITION part1 VALUES LESS THAN ('1900-01-01')); + + +ALTER TABLE pt2 ADD CONSTRAINT test_foreign FOREIGN KEY(d_date) +REFERENCES pt1(d_date) on UPDATE SET NULL ON DELETE SET NULL; + +INSERT INTO pt1 VALUES +('1999-01-01'),('1999-01-02'),('1999-01-019'),('1999-01-20'), +('1999-02-01'),('1999-02-02'),('1999-02-19'),('1999-02-20'), +('1999-03-01'),('1999-03-02'),('1999-03-19'),('1999-03-20'), +('1999-04-01'),('1999-04-02'),('1999-04-19'),('1999-04-20'), +('1999-05-01'),('1999-05-02'),('1999-05-19'),('1999-05-20'), +('1999-06-01'),('1999-06-02'),('1999-06-19'),('1999-06-20'), +('1999-07-01'),('1999-07-02'),('1999-07-19'),('1999-07-20'), +('1999-08-01'),('1999-08-02'),('1999-08-19'),('1999-08-20'), +('1999-09-01'),('1999-09-02'),('1999-09-19'),('1999-09-20'), +('1999-10-01'),('1999-10-02'),('1999-10-19'),('1999-10-20'), +('1999-11-01'),('1999-11-02'),('1999-11-19'),('1999-11-20'), +('1999-12-01'),('1999-12-02'),('1999-12-19'),('1999-12-20'); + +INSERT INTO pt2 VALUES +('1999-01-01','1999-01-01'),('1999-01-02','1999-01-02'), +('1999-01-19','1999-01-19'),('1999-01-20','1999-01-20'), +('1999-02-01','1999-02-01'),('1999-02-02','1999-02-02'), +('1999-02-19','1999-02-19'),('1999-02-20','1999-02-20'), +('1999-03-01','1999-03-01'),('1999-03-02','1999-03-02'), +('1999-03-19','1999-03-19'),('1999-03-20','1999-03-20'), +('1999-04-01','1999-04-01'),('1999-04-02','1999-04-02'), +('1999-04-19','1999-04-19'),('1999-04-20','1999-04-20'), +('1999-05-01','1999-05-01'),('1999-05-02','1999-05-02'), +('1999-05-19','1999-05-19'),('1999-05-20','1999-05-20'), +('1999-06-01','1999-06-01'),('1999-06-02','1999-06-02'), +('1999-06-19','1999-06-19'),('1999-06-20','1999-06-20'), +('1999-07-01','1999-07-01'),('1999-07-02','1999-07-02'), +('1999-07-19','1999-07-19'),('1999-07-20','1999-07-20'), +('1999-08-01','1999-08-01'),('1999-08-02','1999-08-02'), +('1999-08-19','1999-08-19'),('1999-08-20','1999-08-20'), +('1999-09-01','1999-09-01'),('1999-09-02','1999-09-02'), +('1999-09-19','1999-09-19'),('1999-09-20','1999-09-20'), +('1999-10-01','1999-10-01'),('1999-10-02','1999-10-02'), +('1999-10-19','1999-10-19'),('1999-10-20','1999-10-20'), +('1999-11-01','1999-11-01'),('1999-11-02','1999-11-02'), +('1999-11-19','1999-11-19'),('1999-11-20','1999-11-20'), +('1999-12-01','1999-12-01'),('1999-12-02','1999-12-02'), +('1999-12-19','1999-12-19'),('1999-12-20','1999-12-20'); + +insert into pt1 VALUES('2000-01-01'),('2000-01-02'), +('2000-01-19'),('2000-01-20'), +('2000-02-01'),('2000-02-02'), +('2000-02-19'),('2000-02-20'); +SELECT * FROM pt1 WHERE d_date>='2000-01-01'; + +update pt1 set d_date = '2000-02-21' WHERE d_date = '2000-02-20'; +SELECT * FROM pt1 WHERE d_date>='2000-02-01'; + +DELETE FROM pt1 WHERE d_date = '2000-02-21'; +SELECT * FROM pt1 WHERE d_date>='2000-02-01'; + +SELECT * FROM pt1 PARTITION FOR('1999-06-16'); + +INSERT into pt2 VALUES('2020-08-19','2020-08-19'); + +INSERT into pt2 VALUES('2000-01-01','2000-01-01'); + +update pt2 set pt2.d_date = '2020-08-13' +where pt2.d_date = '1999-01-01'; + +update pt2 set pt2.d_date = '2000-02-01',pt2.d_date_backup = '2000-02-01' +where pt2.d_date = '2000-01-01'; + +SELECT * FROM pt2; + +SELECT * FROM pt2 PARTITION(sys_p2); + +delete from pt2 where pt2.d_date<'1999-03-01'; +select * from pt2 where pt2.d_date<'1999-06-01'; + +delete from pt1 where d_date<'1999-05-01'; +select * from pt1 where d_date<'1999-06-01'; + +select * from pt2 where d_date_backup<'1999-06-01'; + +delete from pt2 where pt2.d_date>'1999-11-15' and pt2.d_date<'1999-12-15'; +SELECT * FROM pt2 WHERE pt2.d_date>='1999-10-01'; + +delete from pt1 where pt1.d_date>'1999-10-15' and pt1.d_date<'1999-11-15'; +SELECT * FROM pt1 WHERE pt1.d_date>='1999-10-01'; + +SELECT * FROM pt2 WHERE pt2.d_date_backup>='1999-10-01'; + +UPDATE pt2 set d_date = d_date - INTERVAL '4' month where d_date>='1999-05-01' and d_date<'1999-06-01'; + +UPDATE pt1 set d_date = d_date - INTERVAL '4' month where d_date>='1999-05-01' and d_date<'1999-06-01'; +SELECT * FROM pt1 WHERE d_date<'1999-07-01'; + +SELECT * FROM pt2 WHERE d_date_backup<'1999-07-01'; + +UPDATE pt2 set d_date = d_date - INTERVAL '1' month where d_date>='1999-06-01' and d_date<='1999-07-15'; + +UPDATE pt1 set d_date = d_date - INTERVAL '1' month where d_date>='1999-06-01' and d_date<='1999-07-15'; +SELECT * FROM pt1 WHERE d_date<'1999-08-01'; + +SELECT * FROM pt2 WHERE d_date_backup<'1999-08-01'; + +DROP TABLE IF EXISTS pt2; +DROP TABLE IF EXISTS pt1; + +CREATE TABLE pt1( +d_date date UNIQUE +)partition BY RANGE (d_date) INTERVAL('1 month') +(PARTITION part1 VALUES LESS THAN ('1900-01-01')); + +CREATE TABLE pt2( +d_date date, +d_date_backup date +)partition BY RANGE (d_date_backup) INTERVAL('1 month') +(PARTITION part1 VALUES LESS THAN ('1900-01-01')); + + +ALTER TABLE pt2 ADD CONSTRAINT test_foreign FOREIGN KEY(d_date) +REFERENCES pt1(d_date) on UPDATE RESTRICT ON DELETE RESTRICT; + +INSERT INTO pt1 VALUES +('1999-01-01'),('1999-01-02'),('1999-01-019'),('1999-01-20'), +('1999-02-01'),('1999-02-02'),('1999-02-19'),('1999-02-20'), +('1999-03-01'),('1999-03-02'),('1999-03-19'),('1999-03-20'), +('1999-04-01'),('1999-04-02'),('1999-04-19'),('1999-04-20'), +('1999-05-01'),('1999-05-02'),('1999-05-19'),('1999-05-20'), +('1999-06-01'),('1999-06-02'),('1999-06-19'),('1999-06-20'), +('1999-07-01'),('1999-07-02'),('1999-07-19'),('1999-07-20'), +('1999-08-01'),('1999-08-02'),('1999-08-19'),('1999-08-20'), +('1999-09-01'),('1999-09-02'),('1999-09-19'),('1999-09-20'), +('1999-10-01'),('1999-10-02'),('1999-10-19'),('1999-10-20'), +('1999-11-01'),('1999-11-02'),('1999-11-19'),('1999-11-20'), +('1999-12-01'),('1999-12-02'),('1999-12-19'),('1999-12-20'); + +INSERT INTO pt2 VALUES +('1999-01-01','1999-01-01'),('1999-01-02','1999-01-02'), +('1999-01-19','1999-01-19'),('1999-01-20','1999-01-20'), +('1999-02-01','1999-02-01'),('1999-02-02','1999-02-02'), +('1999-02-19','1999-02-19'),('1999-02-20','1999-02-20'), +('1999-03-01','1999-03-01'),('1999-03-02','1999-03-02'), +('1999-03-19','1999-03-19'),('1999-03-20','1999-03-20'), +('1999-04-01','1999-04-01'),('1999-04-02','1999-04-02'), +('1999-04-19','1999-04-19'),('1999-04-20','1999-04-20'), +('1999-05-01','1999-05-01'),('1999-05-02','1999-05-02'), +('1999-05-19','1999-05-19'),('1999-05-20','1999-05-20'), +('1999-06-01','1999-06-01'),('1999-06-02','1999-06-02'), +('1999-06-19','1999-06-19'),('1999-06-20','1999-06-20'), +('1999-07-01','1999-07-01'),('1999-07-02','1999-07-02'), +('1999-07-19','1999-07-19'),('1999-07-20','1999-07-20'), +('1999-08-01','1999-08-01'),('1999-08-02','1999-08-02'), +('1999-08-19','1999-08-19'),('1999-08-20','1999-08-20'), +('1999-09-01','1999-09-01'),('1999-09-02','1999-09-02'), +('1999-09-19','1999-09-19'),('1999-09-20','1999-09-20'), +('1999-10-01','1999-10-01'),('1999-10-02','1999-10-02'), +('1999-10-19','1999-10-19'),('1999-10-20','1999-10-20'), +('1999-11-01','1999-11-01'),('1999-11-02','1999-11-02'), +('1999-11-19','1999-11-19'),('1999-11-20','1999-11-20'), +('1999-12-01','1999-12-01'),('1999-12-02','1999-12-02'), +('1999-12-19','1999-12-19'),('1999-12-20','1999-12-20'); + +delete from pt2 where pt2.d_date<'1999-03-01'; +select * from pt2 where pt2.d_date<'1999-06-01'; + +delete from pt1 where d_date<'1999-05-01'; + +delete from pt2 where pt2.d_date>'1999-11-15' and pt2.d_date<'1999-12-15'; +SELECT * FROM pt2 WHERE pt2.d_date>='1999-10-01'; + +delete from pt1 where pt1.d_date>'1999-10-15' and pt1.d_date<'1999-11-15'; + +delete from pt2 where pt2.d_date>='1999-01-01' and pt2.d_date<'1999-05-01'; +delete from pt1 where pt1.d_date>='1999-01-01' and pt1.d_date<'1999-05-01'; + +UPDATE pt2 set d_date = d_date - INTERVAL '4' month where d_date>='1999-05-01' and d_date<'1999-06-01'; + +UPDATE pt1 set d_date = d_date - INTERVAL '4' month where d_date>='1999-05-01' and d_date<'1999-06-01'; +SELECT * FROM pt1 WHERE d_date<'1999-07-01'; + +UPDATE pt2 set d_date = d_date - INTERVAL '1' month where d_date>='1999-06-01' and d_date<='1999-07-15'; + +UPDATE pt1 set d_date = d_date - INTERVAL '5' month where d_date>='1999-06-01' and d_date<='1999-07-15'; + +delete from pt2 where d_date>='1999-06-01' and d_date<='1999-07-15'; +UPDATE pt1 set d_date = d_date - INTERVAL '5' month where d_date>='1999-06-01' and d_date<='1999-07-15'; + diff --git a/src/test/regress/sql/partition_trigger.sql b/src/test/regress/sql/partition_trigger.sql new file mode 100644 index 0000000000000000000000000000000000000000..38c50e17e7c1d26185f0d083d1f9b17cfe897977 --- /dev/null +++ b/src/test/regress/sql/partition_trigger.sql @@ -0,0 +1,143 @@ +DROP TABLE IF EXISTS pt2; +DROP TABLE IF EXISTS pt1; +DROP FUNCTION IF EXISTS test_function(); + +CREATE TABLE pt1( + d_date date UNIQUE +)partition BY RANGE (d_date) INTERVAL('1 month') +(PARTITION part1 VALUES LESS THAN ('1900-01-01')); + +CREATE TABLE pt2( + d_date date +)partition BY RANGE (d_date) INTERVAL('1 month') +(PARTITION part1 VALUES LESS THAN ('1900-01-01')); + + +INSERT INTO pt1 VALUES +('1999-01-01'),('1999-01-02'),('1999-01-019'),('1999-01-20'), +('1999-02-01'),('1999-02-02'),('1999-02-19'),('1999-02-20'), +('1999-03-01'),('1999-03-02'),('1999-03-19'),('1999-03-20'), +('1999-04-01'),('1999-04-02'),('1999-04-19'),('1999-04-20'), +('1999-05-01'),('1999-05-02'),('1999-05-19'),('1999-05-20'), +('1999-06-01'),('1999-06-02'),('1999-06-19'),('1999-06-20'), +('1999-07-01'),('1999-07-02'),('1999-07-19'),('1999-07-20'), +('1999-08-01'),('1999-08-02'),('1999-08-19'),('1999-08-20'), +('1999-09-01'),('1999-09-02'),('1999-09-19'),('1999-09-20'), +('1999-10-01'),('1999-10-02'),('1999-10-19'),('1999-10-20'), +('1999-11-01'),('1999-11-02'),('1999-11-19'),('1999-11-20'), +('1999-12-01'),('1999-12-02'),('1999-12-19'),('1999-12-20'); + +INSERT INTO pt2 VALUES +('1999-01-01'),('1999-01-02'),('1999-01-019'),('1999-01-20'), +('1999-02-01'),('1999-02-02'),('1999-02-19'),('1999-02-20'), +('1999-03-01'),('1999-03-02'),('1999-03-19'),('1999-03-20'), +('1999-04-01'),('1999-04-02'),('1999-04-19'),('1999-04-20'), +('1999-05-01'),('1999-05-02'),('1999-05-19'),('1999-05-20'), +('1999-06-01'),('1999-06-02'),('1999-06-19'),('1999-06-20'), +('1999-07-01'),('1999-07-02'),('1999-07-19'),('1999-07-20'), +('1999-08-01'),('1999-08-02'),('1999-08-19'),('1999-08-20'), +('1999-09-01'),('1999-09-02'),('1999-09-19'),('1999-09-20'), +('1999-10-01'),('1999-10-02'),('1999-10-19'),('1999-10-20'), +('1999-11-01'),('1999-11-02'),('1999-11-19'),('1999-11-20'), +('1999-12-01'),('1999-12-02'),('1999-12-19'),('1999-12-20'); + + +CREATE FUNCTION test_function() +RETURNS TRIGGER AS $$ +BEGIN + IF(TG_OP = 'DELETE') THEN + DELETE FROM pt2 WHERE d_date=OLD.d_date; + RETURN OLD; + ELSEIF(TG_OP = 'UPDATE') THEN + UPDATE pt2 set d_date=NEW.d_date where d_date=OLD.d_date; + RETURN NEW; + ELSEIF(TG_OP = 'INSERT') THEN + INSERT INTO pt2 VALUES(NEW.d_date); + RETURN NEW; + END IF; + RETURN NULL; +END; +$$ LANGUAGE plpgsql; + + +CREATE TRIGGER test_trigger +AFTER INSERT OR UPDATE OR DELETE on pt1 +FOR EACH ROW EXECUTE PROCEDURE test_function(); + +INSERT INTO pt1 VALUES('2016-01-01'); +UPDATE pt2 set d_date = d_date + INTERVAL '4' month where d_date>='1999-05-01'; +DELETE FROM pt1 WHERE d_date<'1999-05-01'; +SELECT * FROM pt1; +SELECT * FROM pt2; + +DROP TABLE IF EXISTS pt2; +DROP TABLE IF EXISTS pt1; +DROP FUNCTION IF EXISTS test_function(); + +CREATE TABLE pt1( + d_date date UNIQUE +)partition BY RANGE (d_date) INTERVAL('1 month') +(PARTITION part1 VALUES LESS THAN ('1900-01-01')); + +CREATE TABLE pt2( + d_date date +)partition BY RANGE (d_date) INTERVAL('1 month') +(PARTITION part1 VALUES LESS THAN ('1900-01-01')); + + +INSERT INTO pt1 VALUES +('1999-01-01'),('1999-01-02'),('1999-01-019'),('1999-01-20'), +('1999-02-01'),('1999-02-02'),('1999-02-19'),('1999-02-20'), +('1999-03-01'),('1999-03-02'),('1999-03-19'),('1999-03-20'), +('1999-04-01'),('1999-04-02'),('1999-04-19'),('1999-04-20'), +('1999-05-01'),('1999-05-02'),('1999-05-19'),('1999-05-20'), +('1999-06-01'),('1999-06-02'),('1999-06-19'),('1999-06-20'), +('1999-07-01'),('1999-07-02'),('1999-07-19'),('1999-07-20'), +('1999-08-01'),('1999-08-02'),('1999-08-19'),('1999-08-20'), +('1999-09-01'),('1999-09-02'),('1999-09-19'),('1999-09-20'), +('1999-10-01'),('1999-10-02'),('1999-10-19'),('1999-10-20'), +('1999-11-01'),('1999-11-02'),('1999-11-19'),('1999-11-20'), +('1999-12-01'),('1999-12-02'),('1999-12-19'),('1999-12-20'); + +INSERT INTO pt2 VALUES +('1999-01-01'),('1999-01-02'),('1999-01-019'),('1999-01-20'), +('1999-02-01'),('1999-02-02'),('1999-02-19'),('1999-02-20'), +('1999-03-01'),('1999-03-02'),('1999-03-19'),('1999-03-20'), +('1999-04-01'),('1999-04-02'),('1999-04-19'),('1999-04-20'), +('1999-05-01'),('1999-05-02'),('1999-05-19'),('1999-05-20'), +('1999-06-01'),('1999-06-02'),('1999-06-19'),('1999-06-20'), +('1999-07-01'),('1999-07-02'),('1999-07-19'),('1999-07-20'), +('1999-08-01'),('1999-08-02'),('1999-08-19'),('1999-08-20'), +('1999-09-01'),('1999-09-02'),('1999-09-19'),('1999-09-20'), +('1999-10-01'),('1999-10-02'),('1999-10-19'),('1999-10-20'), +('1999-11-01'),('1999-11-02'),('1999-11-19'),('1999-11-20'), +('1999-12-01'),('1999-12-02'),('1999-12-19'),('1999-12-20'); + + +CREATE FUNCTION test_function() +RETURNS TRIGGER AS $$ +BEGIN + IF(TG_OP = 'DELETE') THEN + DELETE FROM pt2 WHERE d_date=OLD.d_date; + RETURN OLD; + ELSEIF(TG_OP = 'UPDATE') THEN + UPDATE pt2 set d_date=NEW.d_date where d_date=OLD.d_date; + RETURN NEW; + ELSEIF(TG_OP = 'INSERT') THEN + INSERT INTO pt2 VALUES(NEW.d_date); + RETURN NEW; + END IF; + RETURN NULL; +END; +$$ LANGUAGE plpgsql; + + +CREATE TRIGGER test_trigger +BEFORE INSERT OR UPDATE OR DELETE on pt1 +FOR EACH ROW EXECUTE PROCEDURE test_function(); + +INSERT INTO pt1 VALUES('2016-01-01'); +UPDATE pt2 set d_date = d_date + INTERVAL '4' month where d_date>='1999-05-01'; +DELETE FROM pt1 WHERE d_date<'1999-05-01'; +SELECT * FROM pt1; +SELECT * FROM pt2; \ No newline at end of file