summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRobert Haas <rhaas@postgresql.org>2018-02-28 12:16:09 -0500
committerRobert Haas <rhaas@postgresql.org>2018-02-28 12:16:09 -0500
commit2af28e603319224e87fd35ab62f36ef6de45eaac (patch)
treee92ca99fdef719d885db4f51846531a6a42ab675 /src
parent73797b7884ee1722127f27ecfcede99367139dc0 (diff)
downloadpostgresql-2af28e603319224e87fd35ab62f36ef6de45eaac.tar.gz
For partitionwise join, match on partcollation, not parttypcoll.
The previous code considered two tables to have the partition scheme if the underlying columns had the same collation, but what we actually need to compare is not the collations associated with the column but the collation used for partitioning. Fix that. Robert Haas and Amit Langote Discussion: http://postgr.es/m/0f95f924-0efa-4cf5-eb5f-9a3d1bc3c33d@lab.ntt.co.jp
Diffstat (limited to 'src')
-rw-r--r--src/backend/optimizer/util/plancat.c6
-rw-r--r--src/include/nodes/relation.h2
2 files changed, 4 insertions, 4 deletions
diff --git a/src/backend/optimizer/util/plancat.c b/src/backend/optimizer/util/plancat.c
index 60f21711f4..b799e249db 100644
--- a/src/backend/optimizer/util/plancat.c
+++ b/src/backend/optimizer/util/plancat.c
@@ -1891,7 +1891,7 @@ find_partition_scheme(PlannerInfo *root, Relation relation)
sizeof(Oid) * partnatts) != 0 ||
memcmp(partkey->partopcintype, part_scheme->partopcintype,
sizeof(Oid) * partnatts) != 0 ||
- memcmp(partkey->parttypcoll, part_scheme->parttypcoll,
+ memcmp(partkey->partcollation, part_scheme->partcollation,
sizeof(Oid) * partnatts) != 0)
continue;
@@ -1926,8 +1926,8 @@ find_partition_scheme(PlannerInfo *root, Relation relation)
memcpy(part_scheme->partopcintype, partkey->partopcintype,
sizeof(Oid) * partnatts);
- part_scheme->parttypcoll = (Oid *) palloc(sizeof(Oid) * partnatts);
- memcpy(part_scheme->parttypcoll, partkey->parttypcoll,
+ part_scheme->partcollation = (Oid *) palloc(sizeof(Oid) * partnatts);
+ memcpy(part_scheme->partcollation, partkey->partcollation,
sizeof(Oid) * partnatts);
part_scheme->parttyplen = (int16 *) palloc(sizeof(int16) * partnatts);
diff --git a/src/include/nodes/relation.h b/src/include/nodes/relation.h
index db8de2dfd0..d576aa7350 100644
--- a/src/include/nodes/relation.h
+++ b/src/include/nodes/relation.h
@@ -351,7 +351,7 @@ typedef struct PartitionSchemeData
int16 partnatts; /* number of partition attributes */
Oid *partopfamily; /* OIDs of operator families */
Oid *partopcintype; /* OIDs of opclass declared input data types */
- Oid *parttypcoll; /* OIDs of collations of partition keys. */
+ Oid *partcollation; /* OIDs of partitioning collations */
/* Cached information about partition key data types. */
int16 *parttyplen;