From e05b7e2a45c7a151ad3f8771ba7f5d8b4ddd8d0c Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Thu, 22 Oct 2026 13:51:27 -0400 Subject: [PATCH] Accept empty tsquery in binary input. tsqueryrecv() calls findoprnd() even when the input has no query items, so it fails on an empty tsquery, which is legal data. This breaks, for example, binary COPY of a table containing an empty tsquery. Skip the operand walk for an empty query, as parse_tsquery() does. Bug: #19778 Reported-by: Shay Rojansky Author: Ayush Tiwari Reviewed-by: Tom Lane Discussion: https://postgr.es/m/19778-1befc1fba593ab1b@postgresql.org Backpatch-through: 14 --- src/backend/utils/adt/tsquery.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/backend/utils/adt/tsquery.c b/src/backend/utils/adt/tsquery.c index 416cf19f2ca..1f1b573ecc1 100644 --- a/src/backend/utils/adt/tsquery.c +++ b/src/backend/utils/adt/tsquery.c @@ -1343,10 +1343,13 @@ tsqueryrecv(PG_FUNCTION_ARGS) * Fill in the left-pointers. Checks that the tree is well-formed as a * side-effect. */ - findoprnd(item, size, &needcleanup); + if (size > 0) + { + findoprnd(item, size, &needcleanup); - /* Can't have found any QI_VALSTOP nodes */ - Assert(!needcleanup); + /* Can't have found any QI_VALSTOP nodes */ + Assert(!needcleanup); + } /* Copy operands to output struct */ for (i = 0; i < size; i++)