mirror of
https://github.com/postgres/postgres.git
synced 2025-07-23 03:21:12 +03:00
Fix uninitialized memory reference.
Without this, when partdesc->nparts == 0, we end up calling ExecBuildSlotPartitionKeyDescription without initializing values and isnull. Reported by Coverity via Michael Paquier. Patch by Michael Paquier, reviewed and revised by Amit Langote. Discussion: http://postgr.es/m/CAB7nPqQ3mwkdMoPY-ocgTpPnjd8TKOadMxdTtMLvEzF8480Zfg@mail.gmail.com
This commit is contained in:
@ -206,13 +206,6 @@ ExecFindPartition(ResultRelInfo *resultRelInfo, PartitionDispatch *pd,
|
|||||||
slot = myslot;
|
slot = myslot;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Quick exit */
|
|
||||||
if (partdesc->nparts == 0)
|
|
||||||
{
|
|
||||||
result = -1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Extract partition key from tuple. Expression evaluation machinery
|
* Extract partition key from tuple. Expression evaluation machinery
|
||||||
* that FormPartitionKeyDatum() invokes expects ecxt_scantuple to
|
* that FormPartitionKeyDatum() invokes expects ecxt_scantuple to
|
||||||
@ -223,6 +216,17 @@ ExecFindPartition(ResultRelInfo *resultRelInfo, PartitionDispatch *pd,
|
|||||||
*/
|
*/
|
||||||
ecxt->ecxt_scantuple = slot;
|
ecxt->ecxt_scantuple = slot;
|
||||||
FormPartitionKeyDatum(parent, slot, estate, values, isnull);
|
FormPartitionKeyDatum(parent, slot, estate, values, isnull);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Nothing for get_partition_for_tuple() to do if there are no
|
||||||
|
* partitions to begin with.
|
||||||
|
*/
|
||||||
|
if (partdesc->nparts == 0)
|
||||||
|
{
|
||||||
|
result = -1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
cur_index = get_partition_for_tuple(rel, values, isnull);
|
cur_index = get_partition_for_tuple(rel, values, isnull);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -165,6 +165,10 @@ create table range_parted (
|
|||||||
a text,
|
a text,
|
||||||
b int
|
b int
|
||||||
) partition by range (a, (b+0));
|
) partition by range (a, (b+0));
|
||||||
|
-- no partitions, so fail
|
||||||
|
insert into range_parted values ('a', 11);
|
||||||
|
ERROR: no partition of relation "range_parted" found for row
|
||||||
|
DETAIL: Partition key of the failing row contains (a, (b + 0)) = (a, 11).
|
||||||
create table part1 partition of range_parted for values from ('a', 1) to ('a', 10);
|
create table part1 partition of range_parted for values from ('a', 1) to ('a', 10);
|
||||||
create table part2 partition of range_parted for values from ('a', 10) to ('a', 20);
|
create table part2 partition of range_parted for values from ('a', 10) to ('a', 20);
|
||||||
create table part3 partition of range_parted for values from ('b', 1) to ('b', 10);
|
create table part3 partition of range_parted for values from ('b', 1) to ('b', 10);
|
||||||
|
@ -90,6 +90,10 @@ create table range_parted (
|
|||||||
a text,
|
a text,
|
||||||
b int
|
b int
|
||||||
) partition by range (a, (b+0));
|
) partition by range (a, (b+0));
|
||||||
|
|
||||||
|
-- no partitions, so fail
|
||||||
|
insert into range_parted values ('a', 11);
|
||||||
|
|
||||||
create table part1 partition of range_parted for values from ('a', 1) to ('a', 10);
|
create table part1 partition of range_parted for values from ('a', 1) to ('a', 10);
|
||||||
create table part2 partition of range_parted for values from ('a', 10) to ('a', 20);
|
create table part2 partition of range_parted for values from ('a', 10) to ('a', 20);
|
||||||
create table part3 partition of range_parted for values from ('b', 1) to ('b', 10);
|
create table part3 partition of range_parted for values from ('b', 1) to ('b', 10);
|
||||||
|
Reference in New Issue
Block a user