mirror of
https://github.com/postgres/postgres.git
synced 2026-07-14 20:31:00 -04:00
Prevent satisfies_hash_partition from crashing with VARIADIC NULL.
Commit f3b0897a12 fixed some
related problems, but overlooked this one. That commit first
appeared in PostgreSQL 11, so back-patch to all supported branches.
Backpatch-through: 14
Discussion: http://postgr.es/m/CA+TgmobsvQw3F+KRYT83=N3teh8D2t-oPR=U06QDZJE3viCJRg@mail.gmail.com
Reviewed-by: Tender Wang <tndrwang@gmail.com>
Reviewed-by: Ewan Young <kdbase.hack@gmail.com>
This commit is contained in:
parent
fffa4d870b
commit
6de480156b
3 changed files with 23 additions and 1 deletions
|
|
@ -4869,6 +4869,12 @@ satisfies_hash_partition(PG_FUNCTION_ARGS)
|
|||
fcinfo->flinfo->fn_mcxt);
|
||||
}
|
||||
}
|
||||
else if (PG_ARGISNULL(3))
|
||||
{
|
||||
/* Special case for VARIADIC NULL::sometype[] */
|
||||
relation_close(parent, NoLock);
|
||||
PG_RETURN_BOOL(false);
|
||||
}
|
||||
else
|
||||
{
|
||||
ArrayType *variadic_array = PG_GETARG_ARRAYTYPE_P(3);
|
||||
|
|
@ -4939,12 +4945,18 @@ satisfies_hash_partition(PG_FUNCTION_ARGS)
|
|||
}
|
||||
else
|
||||
{
|
||||
ArrayType *variadic_array = PG_GETARG_ARRAYTYPE_P(3);
|
||||
ArrayType *variadic_array;
|
||||
int i;
|
||||
int nelems;
|
||||
Datum *datum;
|
||||
bool *isnull;
|
||||
|
||||
/* Special case for VARIADIC NULL::sometype[] */
|
||||
if (PG_ARGISNULL(3))
|
||||
PG_RETURN_BOOL(false);
|
||||
|
||||
variadic_array = PG_GETARG_ARRAYTYPE_P(3);
|
||||
|
||||
deconstruct_array(variadic_array,
|
||||
my_extra->variadic_type,
|
||||
my_extra->variadic_typlen,
|
||||
|
|
|
|||
|
|
@ -40,6 +40,13 @@ SELECT satisfies_hash_partition('mchash'::regclass, 4, NULL, NULL);
|
|||
f
|
||||
(1 row)
|
||||
|
||||
-- variadic null
|
||||
SELECT satisfies_hash_partition('mchash'::regclass, 4, 0, VARIADIC NULL::int[]);
|
||||
satisfies_hash_partition
|
||||
--------------------------
|
||||
f
|
||||
(1 row)
|
||||
|
||||
-- too many arguments
|
||||
SELECT satisfies_hash_partition('mchash'::regclass, 4, 0, NULL::int, NULL::text, NULL::json);
|
||||
ERROR: number of partitioning columns (2) does not match number of partition keys provided (3)
|
||||
|
|
|
|||
|
|
@ -35,6 +35,9 @@ SELECT satisfies_hash_partition('mchash'::regclass, NULL, 0, NULL);
|
|||
-- remainder is null
|
||||
SELECT satisfies_hash_partition('mchash'::regclass, 4, NULL, NULL);
|
||||
|
||||
-- variadic null
|
||||
SELECT satisfies_hash_partition('mchash'::regclass, 4, 0, VARIADIC NULL::int[]);
|
||||
|
||||
-- too many arguments
|
||||
SELECT satisfies_hash_partition('mchash'::regclass, 4, 0, NULL::int, NULL::text, NULL::json);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue