mirror of
https://github.com/postgres/postgres.git
synced 2025-08-27 07:42:10 +03:00
Fix failure with textual partition hash keys.
Commit 5e1963fb7
overlooked two places in partbounds.c that now
need to pass a collation identifier to the hash functions for
a partition key column.
Amit Langote, per report from Jesper Pedersen
Discussion: https://postgr.es/m/a620f85a-42ab-e0f3-3337-b04b97e2e2f5@redhat.com
This commit is contained in:
@@ -2742,7 +2742,8 @@ compute_partition_hash_value(int partnatts, FmgrInfo *partsupfunc, Oid *partcoll
|
||||
* 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));
|
||||
@@ -2777,7 +2778,8 @@ satisfies_hash_partition(PG_FUNCTION_ARGS)
|
||||
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;
|
||||
@@ -2850,6 +2852,8 @@ satisfies_hash_partition(PG_FUNCTION_ARGS)
|
||||
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)
|
||||
@@ -2866,7 +2870,6 @@ satisfies_hash_partition(PG_FUNCTION_ARGS)
|
||||
&key->partsupfunc[j],
|
||||
fcinfo->flinfo->fn_mcxt);
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -2885,6 +2888,7 @@ satisfies_hash_partition(PG_FUNCTION_ARGS)
|
||||
&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)
|
||||
@@ -2926,11 +2930,10 @@ satisfies_hash_partition(PG_FUNCTION_ARGS)
|
||||
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));
|
||||
@@ -2965,11 +2968,10 @@ satisfies_hash_partition(PG_FUNCTION_ARGS)
|
||||
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));
|
||||
|
Reference in New Issue
Block a user