* datatype-specific hash functions of each partition key
                         * attribute.
                         */
-                       hash = FunctionCall2Coll(&partsupfunc[i], partcollation[i], values[i], seed);
+                       hash = FunctionCall2Coll(&partsupfunc[i], partcollation[i],
+                                                                        values[i], seed);
 
                        /* Form a single 64-bit hash value */
                        rowHash = hash_combine64(rowHash, DatumGetUInt64(hash));
                int16           variadic_typlen;
                bool            variadic_typbyval;
                char            variadic_typalign;
-               FmgrInfo        partsupfunc[PARTITION_MAX_KEYS];
+               Oid                     partcollid[PARTITION_MAX_KEYS];
+               FmgrInfo        partsupfunc[FLEXIBLE_ARRAY_MEMBER];
        } ColumnsHashData;
        Oid                     parentId;
        int                     modulus;
                        my_extra = (ColumnsHashData *) fcinfo->flinfo->fn_extra;
                        my_extra->relid = parentId;
                        my_extra->nkeys = key->partnatts;
+                       memcpy(my_extra->partcollid, key->partcollation,
+                                  key->partnatts * sizeof(Oid));
 
                        /* check argument types and save fmgr_infos */
                        for (j = 0; j < key->partnatts; ++j)
                                                           &key->partsupfunc[j],
                                                           fcinfo->flinfo->fn_mcxt);
                        }
-
                }
                else
                {
                                                                 &my_extra->variadic_typlen,
                                                                 &my_extra->variadic_typbyval,
                                                                 &my_extra->variadic_typalign);
+                       my_extra->partcollid[0] = key->partcollation[0];
 
                        /* check argument types */
                        for (j = 0; j < key->partnatts; ++j)
                        if (PG_ARGISNULL(argno))
                                continue;
 
-                       Assert(OidIsValid(my_extra->partsupfunc[i].fn_oid));
-
-                       hash = FunctionCall2(&my_extra->partsupfunc[i],
-                                                                PG_GETARG_DATUM(argno),
-                                                                seed);
+                       hash = FunctionCall2Coll(&my_extra->partsupfunc[i],
+                                                                        my_extra->partcollid[i],
+                                                                        PG_GETARG_DATUM(argno),
+                                                                        seed);
 
                        /* Form a single 64-bit hash value */
                        rowHash = hash_combine64(rowHash, DatumGetUInt64(hash));
                        if (isnull[i])
                                continue;
 
-                       Assert(OidIsValid(my_extra->partsupfunc[0].fn_oid));
-
-                       hash = FunctionCall2(&my_extra->partsupfunc[0],
-                                                                datum[i],
-                                                                seed);
+                       hash = FunctionCall2Coll(&my_extra->partsupfunc[0],
+                                                                        my_extra->partcollid[0],
+                                                                        datum[i],
+                                                                        seed);
 
                        /* Form a single 64-bit hash value */
                        rowHash = hash_combine64(rowHash, DatumGetUInt64(hash));
 
 SELECT satisfies_hash_partition('mcinthash'::regclass, 4, 0,
                                                                variadic array[now(), now()]);
 ERROR:  column 1 of the partition key has type "integer", but supplied value is of type "timestamp with time zone"
+-- check satisfies_hash_partition passes correct collation
+create table text_hashp (a text) partition by hash (a);
+create table text_hashp0 partition of text_hashp for values with (modulus 2, remainder 0);
+create table text_hashp1 partition of text_hashp for values with (modulus 2, remainder 1);
+-- The result here should always be true, because 'xxx' must belong to
+-- one of the two defined partitions
+select satisfies_hash_partition('text_hashp'::regclass, 2, 0, 'xxx'::text) OR
+          satisfies_hash_partition('text_hashp'::regclass, 2, 1, 'xxx'::text) AS satisfies;
+ satisfies 
+-----------
+ t
+(1 row)
+
 -- cleanup
 DROP TABLE mchash;
 DROP TABLE mcinthash;
+DROP TABLE text_hashp;
 
 SELECT satisfies_hash_partition('mcinthash'::regclass, 4, 0,
                                                                variadic array[now(), now()]);
 
+-- check satisfies_hash_partition passes correct collation
+create table text_hashp (a text) partition by hash (a);
+create table text_hashp0 partition of text_hashp for values with (modulus 2, remainder 0);
+create table text_hashp1 partition of text_hashp for values with (modulus 2, remainder 1);
+-- The result here should always be true, because 'xxx' must belong to
+-- one of the two defined partitions
+select satisfies_hash_partition('text_hashp'::regclass, 2, 0, 'xxx'::text) OR
+          satisfies_hash_partition('text_hashp'::regclass, 2, 1, 'xxx'::text) AS satisfies;
+
 -- cleanup
 DROP TABLE mchash;
 DROP TABLE mcinthash;
+DROP TABLE text_hashp;