mirror of
https://github.com/postgres/postgres.git
synced 2025-04-21 12:05:57 +03:00
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
This commit is contained in:
parent
533463307b
commit
f81a91db4d
@ -1433,6 +1433,7 @@ BeginCopy(ParseState *pstate,
|
|||||||
num_partitions;
|
num_partitions;
|
||||||
|
|
||||||
ExecSetupPartitionTupleRouting(rel,
|
ExecSetupPartitionTupleRouting(rel,
|
||||||
|
1,
|
||||||
&partition_dispatch_info,
|
&partition_dispatch_info,
|
||||||
&partitions,
|
&partitions,
|
||||||
&partition_tupconv_maps,
|
&partition_tupconv_maps,
|
||||||
|
@ -3213,6 +3213,7 @@ EvalPlanQualEnd(EPQState *epqstate)
|
|||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
ExecSetupPartitionTupleRouting(Relation rel,
|
ExecSetupPartitionTupleRouting(Relation rel,
|
||||||
|
Index resultRTindex,
|
||||||
PartitionDispatch **pd,
|
PartitionDispatch **pd,
|
||||||
ResultRelInfo **partitions,
|
ResultRelInfo **partitions,
|
||||||
TupleConversionMap ***tup_conv_maps,
|
TupleConversionMap ***tup_conv_maps,
|
||||||
@ -3271,7 +3272,7 @@ ExecSetupPartitionTupleRouting(Relation rel,
|
|||||||
|
|
||||||
InitResultRelInfo(leaf_part_rri,
|
InitResultRelInfo(leaf_part_rri,
|
||||||
partrel,
|
partrel,
|
||||||
1, /* dummy */
|
resultRTindex,
|
||||||
rel,
|
rel,
|
||||||
0);
|
0);
|
||||||
|
|
||||||
|
@ -1914,6 +1914,7 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags)
|
|||||||
num_partitions;
|
num_partitions;
|
||||||
|
|
||||||
ExecSetupPartitionTupleRouting(rel,
|
ExecSetupPartitionTupleRouting(rel,
|
||||||
|
node->nominalRelation,
|
||||||
&partition_dispatch_info,
|
&partition_dispatch_info,
|
||||||
&partitions,
|
&partitions,
|
||||||
&partition_tupconv_maps,
|
&partition_tupconv_maps,
|
||||||
|
@ -207,6 +207,7 @@ extern void EvalPlanQualSetTuple(EPQState *epqstate, Index rti,
|
|||||||
HeapTuple tuple);
|
HeapTuple tuple);
|
||||||
extern HeapTuple EvalPlanQualGetTuple(EPQState *epqstate, Index rti);
|
extern HeapTuple EvalPlanQualGetTuple(EPQState *epqstate, Index rti);
|
||||||
extern void ExecSetupPartitionTupleRouting(Relation rel,
|
extern void ExecSetupPartitionTupleRouting(Relation rel,
|
||||||
|
Index resultRTindex,
|
||||||
PartitionDispatch **pd,
|
PartitionDispatch **pd,
|
||||||
ResultRelInfo **partitions,
|
ResultRelInfo **partitions,
|
||||||
TupleConversionMap ***tup_conv_maps,
|
TupleConversionMap ***tup_conv_maps,
|
||||||
|
@ -506,5 +506,23 @@ DETAIL: Failing row contains (2, hi there).
|
|||||||
insert into brtrigpartcon1 values (1, 'hi there');
|
insert into brtrigpartcon1 values (1, 'hi there');
|
||||||
ERROR: new row for relation "brtrigpartcon1" violates partition constraint
|
ERROR: new row for relation "brtrigpartcon1" violates partition constraint
|
||||||
DETAIL: Failing row contains (2, hi there).
|
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 table brtrigpartcon;
|
||||||
drop function brtrigpartcon1trigf();
|
drop function brtrigpartcon1trigf();
|
||||||
|
@ -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();
|
create trigger brtrigpartcon1trig before insert on brtrigpartcon1 for each row execute procedure brtrigpartcon1trigf();
|
||||||
insert into brtrigpartcon values (1, 'hi there');
|
insert into brtrigpartcon values (1, 'hi there');
|
||||||
insert into brtrigpartcon1 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 table brtrigpartcon;
|
||||||
drop function brtrigpartcon1trigf();
|
drop function brtrigpartcon1trigf();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user