Skip to content

Commit f81a91d

Browse files
committed
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
1 parent 5334633 commit f81a91d

File tree

6 files changed

+41
-1
lines changed

6 files changed

+41
-1
lines changed

src/backend/commands/copy.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1433,6 +1433,7 @@ BeginCopy(ParseState *pstate,
14331433
num_partitions;
14341434

14351435
ExecSetupPartitionTupleRouting(rel,
1436+
1,
14361437
&partition_dispatch_info,
14371438
&partitions,
14381439
&partition_tupconv_maps,

src/backend/executor/execMain.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3213,6 +3213,7 @@ EvalPlanQualEnd(EPQState *epqstate)
32133213
*/
32143214
void
32153215
ExecSetupPartitionTupleRouting(Relation rel,
3216+
Index resultRTindex,
32163217
PartitionDispatch **pd,
32173218
ResultRelInfo **partitions,
32183219
TupleConversionMap ***tup_conv_maps,
@@ -3271,7 +3272,7 @@ ExecSetupPartitionTupleRouting(Relation rel,
32713272

32723273
InitResultRelInfo(leaf_part_rri,
32733274
partrel,
3274-
1, /* dummy */
3275+
resultRTindex,
32753276
rel,
32763277
0);
32773278

src/backend/executor/nodeModifyTable.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1914,6 +1914,7 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags)
19141914
num_partitions;
19151915

19161916
ExecSetupPartitionTupleRouting(rel,
1917+
node->nominalRelation,
19171918
&partition_dispatch_info,
19181919
&partitions,
19191920
&partition_tupconv_maps,

src/include/executor/executor.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,7 @@ extern void EvalPlanQualSetTuple(EPQState *epqstate, Index rti,
207207
HeapTuple tuple);
208208
extern HeapTuple EvalPlanQualGetTuple(EPQState *epqstate, Index rti);
209209
extern void ExecSetupPartitionTupleRouting(Relation rel,
210+
Index resultRTindex,
210211
PartitionDispatch **pd,
211212
ResultRelInfo **partitions,
212213
TupleConversionMap ***tup_conv_maps,

src/test/regress/expected/insert.out

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -506,5 +506,23 @@ DETAIL: Failing row contains (2, hi there).
506506
insert into brtrigpartcon1 values (1, 'hi there');
507507
ERROR: new row for relation "brtrigpartcon1" violates partition constraint
508508
DETAIL: Failing row contains (2, hi there).
509+
-- check that the message shows the appropriate column description in a
510+
-- situation where the partitioned table is not the primary ModifyTable node
511+
create table inserttest3 (f1 text default 'foo', f2 text default 'bar', f3 int);
512+
create role regress_coldesc_role;
513+
grant insert on inserttest3 to regress_coldesc_role;
514+
grant insert on brtrigpartcon to regress_coldesc_role;
515+
revoke select on brtrigpartcon from regress_coldesc_role;
516+
set role regress_coldesc_role;
517+
with result as (insert into brtrigpartcon values (1, 'hi there') returning 1)
518+
insert into inserttest3 (f3) select * from result;
519+
ERROR: new row for relation "brtrigpartcon1" violates partition constraint
520+
DETAIL: Failing row contains (a, b) = (2, hi there).
521+
reset role;
522+
-- cleanup
523+
revoke all on inserttest3 from regress_coldesc_role;
524+
revoke all on brtrigpartcon from regress_coldesc_role;
525+
drop role regress_coldesc_role;
526+
drop table inserttest3;
509527
drop table brtrigpartcon;
510528
drop function brtrigpartcon1trigf();

src/test/regress/sql/insert.sql

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -340,5 +340,23 @@ create or replace function brtrigpartcon1trigf() returns trigger as $$begin new.
340340
create trigger brtrigpartcon1trig before insert on brtrigpartcon1 for each row execute procedure brtrigpartcon1trigf();
341341
insert into brtrigpartcon values (1, 'hi there');
342342
insert into brtrigpartcon1 values (1, 'hi there');
343+
344+
-- check that the message shows the appropriate column description in a
345+
-- situation where the partitioned table is not the primary ModifyTable node
346+
create table inserttest3 (f1 text default 'foo', f2 text default 'bar', f3 int);
347+
create role regress_coldesc_role;
348+
grant insert on inserttest3 to regress_coldesc_role;
349+
grant insert on brtrigpartcon to regress_coldesc_role;
350+
revoke select on brtrigpartcon from regress_coldesc_role;
351+
set role regress_coldesc_role;
352+
with result as (insert into brtrigpartcon values (1, 'hi there') returning 1)
353+
insert into inserttest3 (f3) select * from result;
354+
reset role;
355+
356+
-- cleanup
357+
revoke all on inserttest3 from regress_coldesc_role;
358+
revoke all on brtrigpartcon from regress_coldesc_role;
359+
drop role regress_coldesc_role;
360+
drop table inserttest3;
343361
drop table brtrigpartcon;
344362
drop function brtrigpartcon1trigf();

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy