forked from huawei/openGauss-server
commit
3b02afedc7
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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?
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
||||
|
|
@ -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)
|
||||
|
||||
|
|
@ -74,3 +74,5 @@ test: with
|
|||
|
||||
# run alter object to test pg_object
|
||||
#test: pg_object_test
|
||||
test: partition_foreign_key
|
||||
test: partition_trigger
|
||||
|
|
@ -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';
|
||||
|
||||
|
|
@ -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;
|
||||
Loading…
Reference in New Issue