1
0
mirror of https://github.com/postgres/postgres.git synced 2025-11-03 09:13:20 +03:00

Fix possible crash in partition-wise join.

The previous code assumed that we'd always succeed in creating
child-joins for a joinrel for which partition-wise join was considered,
but that's not guaranteed, at least in the case where dummy rels
are involved.

Ashutosh Bapat, with some wordsmithing by me.

Discussion: http://postgr.es/m/CAFjFpRf8=uyMYYfeTBjWDMs1tR5t--FgOe2vKZPULxxdYQ4RNw@mail.gmail.com
This commit is contained in:
Robert Haas
2018-02-05 17:31:57 -05:00
parent 1eb5d43bee
commit f069c91a57
6 changed files with 43 additions and 55 deletions

View File

@@ -666,13 +666,17 @@ typedef struct RelOptInfo
/*
* Is given relation partitioned?
*
* A join between two partitioned relations with same partitioning scheme
* without any matching partitions will not have any partition in it but will
* have partition scheme set. So a relation is deemed to be partitioned if it
* has a partitioning scheme, bounds and positive number of partitions.
* It's not enough to test whether rel->part_scheme is set, because it might
* be that the basic partitioning properties of the input relations matched
* but the partition bounds did not.
*
* We treat dummy relations as unpartitioned. We could alternatively
* treat them as partitioned, but it's not clear whether that's a useful thing
* to do.
*/
#define IS_PARTITIONED_REL(rel) \
((rel)->part_scheme && (rel)->boundinfo && (rel)->nparts > 0)
((rel)->part_scheme && (rel)->boundinfo && (rel)->nparts > 0 && \
(rel)->part_rels && !(IS_DUMMY_REL(rel)))
/*
* Convenience macro to make sure that a partitioned relation has all the