]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Prevent satisfies_hash_partition from crashing with VARIADIC NULL.
authorRobert Haas <rhaas@postgresql.org>
Mon, 6 Jul 2026 16:12:41 +0000 (12:12 -0400)
committerRobert Haas <rhaas@postgresql.org>
Mon, 6 Jul 2026 16:31:42 +0000 (12:31 -0400)
Commit f3b0897a1213f46b4d3a99a7f8ef3a4b32e03572 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>
src/backend/partitioning/partbounds.c
src/test/regress/expected/hash_part.out
src/test/regress/sql/hash_part.sql

index 6fb150a87639f45a6bd51395b5ee8eb965b5e45d..a7822a4192b1f3f33a25b8e156422b7dd06db9e5 100644 (file)
@@ -4861,6 +4861,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);
@@ -4931,12 +4937,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,
index cb39161f867220628458385390116b71418c21f2..44b6e461ffe177f0e3948e9d659d2b0dca633e79 100644 (file)
@@ -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)
index 6e2c1f21bfc5af4b3ac849eab7ac20ba80d7c54a..7243299d962e1df9f9d1054d6e9a2b44650ea399 100644 (file)
@@ -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);