mirror of
https://github.com/postgres/postgres.git
synced 2025-05-15 00:02:24 -04:00
Code review for c94e6942cefe7d20c5feed856e27f672734b1e2b.
validateCheckConstraint() shouldn't try to access the storage for a partitioned table, because it no longer has any. Creating a _RETURN table on a partitioned table shouldn't be allowed, both because there's no value in it and because trying to do so would involve a validation scan against its nonexistent storage. Amit Langote, reviewed by Tom Lane. Regression test outputs updated to pass by me. Discussion: http://postgr.es/m/e5c3cbd3-1551-d6f8-c9e2-51777d632fd2@lab.ntt.co.jp
This commit is contained in:
parent
b935eb7da3
commit
1d5fede4a9
@ -8120,8 +8120,12 @@ validateCheckConstraint(Relation rel, HeapTuple constrtup)
|
|||||||
bool isnull;
|
bool isnull;
|
||||||
Snapshot snapshot;
|
Snapshot snapshot;
|
||||||
|
|
||||||
/* VALIDATE CONSTRAINT is a no-op for foreign tables */
|
/*
|
||||||
if (rel->rd_rel->relkind == RELKIND_FOREIGN_TABLE)
|
* VALIDATE CONSTRAINT is a no-op for foreign tables and partitioned
|
||||||
|
* tables.
|
||||||
|
*/
|
||||||
|
if (rel->rd_rel->relkind == RELKIND_FOREIGN_TABLE ||
|
||||||
|
rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
constrForm = (Form_pg_constraint) GETSTRUCT(constrtup);
|
constrForm = (Form_pg_constraint) GETSTRUCT(constrtup);
|
||||||
|
@ -422,6 +422,12 @@ DefineQueryRewrite(char *rulename,
|
|||||||
HeapScanDesc scanDesc;
|
HeapScanDesc scanDesc;
|
||||||
Snapshot snapshot;
|
Snapshot snapshot;
|
||||||
|
|
||||||
|
if (event_relation->rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
|
||||||
|
ereport(ERROR,
|
||||||
|
(errcode(ERRCODE_WRONG_OBJECT_TYPE),
|
||||||
|
errmsg("could not convert partitioned table \"%s\" to a view",
|
||||||
|
RelationGetRelationName(event_relation))));
|
||||||
|
|
||||||
snapshot = RegisterSnapshot(GetLatestSnapshot());
|
snapshot = RegisterSnapshot(GetLatestSnapshot());
|
||||||
scanDesc = heap_beginscan(event_relation, snapshot, 0, NULL);
|
scanDesc = heap_beginscan(event_relation, snapshot, 0, NULL);
|
||||||
if (heap_getnext(scanDesc, ForwardScanDirection) != NULL)
|
if (heap_getnext(scanDesc, ForwardScanDirection) != NULL)
|
||||||
|
@ -3372,3 +3372,9 @@ ERROR: partition constraint is violated by some row
|
|||||||
-- cleanup
|
-- cleanup
|
||||||
drop table p;
|
drop table p;
|
||||||
drop table p1;
|
drop table p1;
|
||||||
|
-- validate constraint on partitioned tables should only scan leaf partitions
|
||||||
|
create table parted_validate_test (a int) partition by list (a);
|
||||||
|
create table parted_validate_test_1 partition of parted_validate_test for values in (0, 1);
|
||||||
|
alter table parted_validate_test add constraint parted_validate_test_chka check (a > 0) not valid;
|
||||||
|
alter table parted_validate_test validate constraint parted_validate_test_chka;
|
||||||
|
drop table parted_validate_test;
|
||||||
|
@ -2574,6 +2574,11 @@ select reltoastrelid, relkind, relfrozenxid
|
|||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
drop view fooview;
|
drop view fooview;
|
||||||
|
-- trying to convert a partitioned table to view is not allowed
|
||||||
|
create table fooview (x int, y text) partition by list (x);
|
||||||
|
create rule "_RETURN" as on select to fooview do instead
|
||||||
|
select 1 as x, 'aaa'::text as y;
|
||||||
|
ERROR: could not convert partitioned table "fooview" to a view
|
||||||
--
|
--
|
||||||
-- check for planner problems with complex inherited UPDATES
|
-- check for planner problems with complex inherited UPDATES
|
||||||
--
|
--
|
||||||
|
@ -2228,3 +2228,10 @@ alter table p attach partition p1 for values from (1, 2) to (1, 10);
|
|||||||
-- cleanup
|
-- cleanup
|
||||||
drop table p;
|
drop table p;
|
||||||
drop table p1;
|
drop table p1;
|
||||||
|
|
||||||
|
-- validate constraint on partitioned tables should only scan leaf partitions
|
||||||
|
create table parted_validate_test (a int) partition by list (a);
|
||||||
|
create table parted_validate_test_1 partition of parted_validate_test for values in (0, 1);
|
||||||
|
alter table parted_validate_test add constraint parted_validate_test_chka check (a > 0) not valid;
|
||||||
|
alter table parted_validate_test validate constraint parted_validate_test_chka;
|
||||||
|
drop table parted_validate_test;
|
||||||
|
@ -898,6 +898,11 @@ select reltoastrelid, relkind, relfrozenxid
|
|||||||
|
|
||||||
drop view fooview;
|
drop view fooview;
|
||||||
|
|
||||||
|
-- trying to convert a partitioned table to view is not allowed
|
||||||
|
create table fooview (x int, y text) partition by list (x);
|
||||||
|
create rule "_RETURN" as on select to fooview do instead
|
||||||
|
select 1 as x, 'aaa'::text as y;
|
||||||
|
|
||||||
--
|
--
|
||||||
-- check for planner problems with complex inherited UPDATES
|
-- check for planner problems with complex inherited UPDATES
|
||||||
--
|
--
|
||||||
|
Loading…
x
Reference in New Issue
Block a user