diff options
author | Robert Haas <rhaas@postgresql.org> | 2017-07-17 21:29:45 -0400 |
---|---|---|
committer | Robert Haas <rhaas@postgresql.org> | 2017-07-17 21:29:45 -0400 |
commit | f81a91db4d1c2032632aa5df9fc14be24f5fe5ec (patch) | |
tree | 01ec760e37fcdc12db679add15f95e24f0d055dc | |
parent | 533463307bf67e1bb7acc345ba7ea535c6aebb78 (diff) | |
download | postgresql-f81a91db4d1c2032632aa5df9fc14be24f5fe5ec.tar.gz postgresql-f81a91db4d1c2032632aa5df9fc14be24f5fe5ec.zip |
Use a real RT index when setting up partition tuple routing.
Before, we always used a dummy value of 1, but that's not right when
the partitioned table being modified is inside of a WITH clause
rather than part of the main query.
Amit Langote, reported and reviewd by Etsuro Fujita, with a comment
change by me.
Discussion: http://postgr.es/m/ee12f648-8907-77b5-afc0-2980bcb0aa37@lab.ntt.co.jp
-rw-r--r-- | src/backend/commands/copy.c | 1 | ||||
-rw-r--r-- | src/backend/executor/execMain.c | 3 | ||||
-rw-r--r-- | src/backend/executor/nodeModifyTable.c | 1 | ||||
-rw-r--r-- | src/include/executor/executor.h | 1 | ||||
-rw-r--r-- | src/test/regress/expected/insert.out | 18 | ||||
-rw-r--r-- | src/test/regress/sql/insert.sql | 18 |
6 files changed, 41 insertions, 1 deletions
diff --git a/src/backend/commands/copy.c b/src/backend/commands/copy.c index fc5f4f66ead..53e296559a9 100644 --- a/src/backend/commands/copy.c +++ b/src/backend/commands/copy.c @@ -1433,6 +1433,7 @@ BeginCopy(ParseState *pstate, num_partitions; ExecSetupPartitionTupleRouting(rel, + 1, &partition_dispatch_info, &partitions, &partition_tupconv_maps, diff --git a/src/backend/executor/execMain.c b/src/backend/executor/execMain.c index 0f08283f81f..df9302896c0 100644 --- a/src/backend/executor/execMain.c +++ b/src/backend/executor/execMain.c @@ -3213,6 +3213,7 @@ EvalPlanQualEnd(EPQState *epqstate) */ void ExecSetupPartitionTupleRouting(Relation rel, + Index resultRTindex, PartitionDispatch **pd, ResultRelInfo **partitions, TupleConversionMap ***tup_conv_maps, @@ -3271,7 +3272,7 @@ ExecSetupPartitionTupleRouting(Relation rel, InitResultRelInfo(leaf_part_rri, partrel, - 1, /* dummy */ + resultRTindex, rel, 0); diff --git a/src/backend/executor/nodeModifyTable.c b/src/backend/executor/nodeModifyTable.c index 8d17425abea..77ba15dd900 100644 --- a/src/backend/executor/nodeModifyTable.c +++ b/src/backend/executor/nodeModifyTable.c @@ -1914,6 +1914,7 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags) num_partitions; ExecSetupPartitionTupleRouting(rel, + node->nominalRelation, &partition_dispatch_info, &partitions, &partition_tupconv_maps, diff --git a/src/include/executor/executor.h b/src/include/executor/executor.h index e25cfa3abab..59c28b709e6 100644 --- a/src/include/executor/executor.h +++ b/src/include/executor/executor.h @@ -207,6 +207,7 @@ extern void EvalPlanQualSetTuple(EPQState *epqstate, Index rti, HeapTuple tuple); extern HeapTuple EvalPlanQualGetTuple(EPQState *epqstate, Index rti); extern void ExecSetupPartitionTupleRouting(Relation rel, + Index resultRTindex, PartitionDispatch **pd, ResultRelInfo **partitions, TupleConversionMap ***tup_conv_maps, diff --git a/src/test/regress/expected/insert.out b/src/test/regress/expected/insert.out index d1153f410ba..dd5dddb20cb 100644 --- a/src/test/regress/expected/insert.out +++ b/src/test/regress/expected/insert.out @@ -506,5 +506,23 @@ DETAIL: Failing row contains (2, hi there). insert into brtrigpartcon1 values (1, 'hi there'); ERROR: new row for relation "brtrigpartcon1" violates partition constraint DETAIL: Failing row contains (2, hi there). +-- check that the message shows the appropriate column description in a +-- situation where the partitioned table is not the primary ModifyTable node +create table inserttest3 (f1 text default 'foo', f2 text default 'bar', f3 int); +create role regress_coldesc_role; +grant insert on inserttest3 to regress_coldesc_role; +grant insert on brtrigpartcon to regress_coldesc_role; +revoke select on brtrigpartcon from regress_coldesc_role; +set role regress_coldesc_role; +with result as (insert into brtrigpartcon values (1, 'hi there') returning 1) + insert into inserttest3 (f3) select * from result; +ERROR: new row for relation "brtrigpartcon1" violates partition constraint +DETAIL: Failing row contains (a, b) = (2, hi there). +reset role; +-- cleanup +revoke all on inserttest3 from regress_coldesc_role; +revoke all on brtrigpartcon from regress_coldesc_role; +drop role regress_coldesc_role; +drop table inserttest3; drop table brtrigpartcon; drop function brtrigpartcon1trigf(); diff --git a/src/test/regress/sql/insert.sql b/src/test/regress/sql/insert.sql index 83c3ad8f534..fe63020768a 100644 --- a/src/test/regress/sql/insert.sql +++ b/src/test/regress/sql/insert.sql @@ -340,5 +340,23 @@ create or replace function brtrigpartcon1trigf() returns trigger as $$begin new. create trigger brtrigpartcon1trig before insert on brtrigpartcon1 for each row execute procedure brtrigpartcon1trigf(); insert into brtrigpartcon values (1, 'hi there'); insert into brtrigpartcon1 values (1, 'hi there'); + +-- check that the message shows the appropriate column description in a +-- situation where the partitioned table is not the primary ModifyTable node +create table inserttest3 (f1 text default 'foo', f2 text default 'bar', f3 int); +create role regress_coldesc_role; +grant insert on inserttest3 to regress_coldesc_role; +grant insert on brtrigpartcon to regress_coldesc_role; +revoke select on brtrigpartcon from regress_coldesc_role; +set role regress_coldesc_role; +with result as (insert into brtrigpartcon values (1, 'hi there') returning 1) + insert into inserttest3 (f3) select * from result; +reset role; + +-- cleanup +revoke all on inserttest3 from regress_coldesc_role; +revoke all on brtrigpartcon from regress_coldesc_role; +drop role regress_coldesc_role; +drop table inserttest3; drop table brtrigpartcon; drop function brtrigpartcon1trigf(); |