分区表外键开放

代码格式修改

函数逻辑修改
This commit is contained in:
luozihao 2020-08-24 21:43:03 +08:00 committed by luozihao
parent 96d678765a
commit 6c5141b20b
7 changed files with 1519 additions and 20 deletions

View File

@ -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

View File

@ -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,16 +2708,20 @@ static HeapTuple GetTupleForTrigger(EState* estate, EPQState* epqstate, ResultRe
result = heapCopyTuple(&tuple, RelationGetDescr(relation), BufferGetPage(buffer));
ReleaseBuffer(buffer);
if (RELATION_IS_PARTITIONED(relation)) {
partitionClose(relation, part, NoLock);
}
if (RELATION_OWN_BUCKET(relation)) {
releaseDummyRelation(&fakeRelation);
}
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);
}
}
/*
* Is trigger enabled to fire?
*/

View File

@ -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';

View File

@ -0,0 +1,295 @@
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)

View File

@ -74,3 +74,5 @@ test: with
# run alter object to test pg_object
#test: pg_object_test
test: partition_foreign_key
test: partition_trigger

View File

@ -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';

View File

@ -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;