For partitionwise join, match on partcollation, not parttypcoll.
authorRobert Haas <rhaas@postgresql.org>
Wed, 28 Feb 2018 17:16:09 +0000 (12:16 -0500)
committerRobert Haas <rhaas@postgresql.org>
Wed, 28 Feb 2018 17:16:09 +0000 (12:16 -0500)
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

src/backend/optimizer/util/plancat.c
src/include/nodes/relation.h

index 60f21711f4fb05308c6bc94f5c2331df7771b68d..b799e249db85dbcf25703fdb59b8da71610f7956 100644 (file)
@@ -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);
index db8de2dfd0c4ffc87987713b0f9df1abe285f0cd..d576aa7350fdce713057bd13d39162722cc8377e 100644 (file)
@@ -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;