Re: Internal error codes triggered by regression tests and user queries, take 2

From: Kirill Reshke <reshkekirill(at)gmail(dot)com>
To: Alexander Lakhin <exclusion(at)gmail(dot)com>
Cc: Michael Paquier <michael(at)paquier(dot)xyz>, Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>, Andres Freund <andres(at)anarazel(dot)de>, pgsql-hackers <pgsql-hackers(at)postgresql(dot)org>, Justin Pryzby <pryzby(at)telsasoft(dot)com>
Subject: Re: Internal error codes triggered by regression tests and user queries, take 2
Date: 2026-11-01 10:01:38
Message-ID: CALdSSPjeif5xn405aEPs_PxRimYoHdodcwuwEfOfqmkRU4Gqmg@mail.gmail.com
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On Sat, 17 Oct 2026 at 16:00, Alexander Lakhin <exclusion(at)gmail(dot)com> wrote:
>
> Hello Michael and Tom,
>
> 22.09.2026 13:49, Michael Paquier wrote:
>
> As a whole, that looks OK, so applied on HEAD. I did not look at
> 0002.
>
>
> Let me share the following set of other internal errors:
> 1)
> CREATE TABLE t AS SELECT ''::text a;
> CREATE INDEX brinidx ON t USING brin
> (a text_bloom_ops(n_distinct_per_range = -1.0));
>
> ERROR: XX000: the bloom filter is too large (44629 > 8144)
> LOCATION: bloom_init, brin_bloom.c:
> -> ERRCODE_PROGRAM_LIMIT_EXCEEDED
>
> 2)
> SELECT pg_identify_object_as_address('1'::regclass, 1, 1);
>
> ERROR: XX000: unsupported object class: 1
> LOCATION: getObjectTypeDescription, objectaddress.c:4731
> -> ERRCODE_INVALID_PARAMETER_VALUE
>
> 3)
> SELECT pg_get_acl('1'::regclass, 1, 0);
>
> ERROR: XX000: unrecognized class ID: 1
> LOCATION: get_object_property_data, objectaddress.c:2821
> -> ERRCODE_INVALID_PARAMETER_VALUE
>
> 4)
> SELECT jsonb_to_tsvector('{}', '[{}]'::jsonb);
>
> ERROR: XX000: unexpected end of flag array
> LOCATION: parse_jsonb_index_flags, jsonfuncs.c:5614
> -> ERRCODE_INVALID_PARAMETER_VALUE
>
> 5)
> CREATE PROCEDURE p(INOUT a integer) LANGUAGE sql
> AS 'SELECT 1 WHERE false;';
> CALL p(1);
>
> ERROR: XX000: procedure returned null record
> LOCATION: ExecuteCallStmt, functioncmds.c:2351
> -> ERRCODE_INVALID_OBJECT_DEFINITION
>
> 6)
> CREATE EXTENSION dblink;
> CREATE FUNCTION connection_parameters() RETURNS text LANGUAGE SQL AS
> $f$ SELECT $$dbname='$$||current_database()||$$' port=$$||current_setting('port'); $f$;
> SELECT dblink_connect('myconn',connection_parameters());
> SELECT * FROM dblink_send_query('myconn', 'SELECT 1');
> SELECT * FROM dblink('myconn', 'SELECT 2') AS t(i int);
>
> ERROR: XX000: could not send query: another command is already in progress
> LOCATION: storeQueryResult, dblink.c:1103
> -> ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE
>
> Please look at the attached patch which defines these error codes.
>
> Best regards,
> Alexander

Hi

I run some fuzzing after you reply in [0]. There are results .

1)
CREATE EXTENSION intarray;
SELECT querytree('1'::query_int);

ERROR: XX000: querytree is no longer implemented
LOCATION: querytree, _int_bool.c:713
-> ERRCODE_FEATURE_NOT_SUPPORTED

2)
CREATE EXTENSION ltree;
CREATE TEMP TABLE t (v ltree);
COPY (SELECT '\x0002036162'::bytea) TO '/tmp/g.bin' BINARY;
COPY t FROM '/tmp/g.bin' BINARY;

ERROR: XX000: unsupported ltree version number 3
LOCATION: ltree_recv, ltree_io.c:239
-> ERRCODE_INVALID_BINARY_REPRESENTATION

The same class in lquery_recv/ltxtq_recv, and in core:
jsonpath_recv/jsonb_recv ("unsupported ... version number"),
tsvector_recv, tsquery_recv:

3)
CREATE TEMP TABLE t (v tsquery);
COPY (SELECT '\x0000000105'::bytea) TO '/tmp/g.bin' BINARY;
COPY t FROM '/tmp/g.bin' BINARY;

ERROR: XX000: unrecognized tsquery node type: 5
-> ERRCODE_INVALID_BINARY_REPRESENTATION

4)
CREATE EXTENSION dblink;
CREATE FUNCTION g(text,text) RETURNS setof int
AS 'dblink','dblink_record' LANGUAGE C;
SELECT dblink_connect('c', 'dbname=test');
SELECT * FROM g('c', 'SELECT 1');

ERROR: XX000: return type must be a row type
LOCATION: materializeResult, dblink.c:915
-> ERRCODDE_DATATYPE_MISMATCH
(together with the "wrong number of arguments" siblings in
dblink_send_query/dblink_record_internal/dblink_exec:
ERRCODE_INVALID_PARAMETER_VALUE)

5)
ALTER COLLATION "default" REFRESH VERSION;

ERROR: XX000: cannot refresh version of default collation
LOCATION: collationcmds.c:445
-> ERRCODE_FEATURE_NOT_SUPPORTED

same as reported in neighbor thread

6)
CREATE OPERATOR FAMILY noeq_fam USING btree;
CREATE FUNCTION noeq_cmp(int,int) RETURNS int AS 'SELECT 0'
LANGUAGE sql IMMUTABLE;
CREATE OPERATOR CLASS noeq_ops FOR TYPE int
USING btree FAMILY noeq_fam AS FUNCTION 1 noeq_cmp(int,int);
CREATE MATERIALIZED VIEW mv AS SELECT 1 AS a;
CREATE UNIQUE INDEX ON mv (a noeq_ops);
REFRESH MATERIALIZED VIEW CONCURRENTLY mv;

ERROR: XX000: missing equality operator for (23,23) in opfamily 16430
LOCATION: refresh_by_diff, matview.c:771
-> ERRCODE_FEATURE_NOT_SUPPORTED

7)
CREATE EXTENSION pg_buffercache;
SELECT * FROM pg_buffercache_evict(0);

ERROR: XX000: bad buffer ID: 0
-> ERRCODE_INVALID_PARAMETER_VALUE

SELECT * FROM pg_buffercache_pages() AS (a int);

ERROR: XX000: incorrect number of output arguments
-> ERRCODE_DATATYPE_MISMATCH

8)
CREATE EXTENSION pgcrypto;
SELECT crypt('secret', '$5$abc$6$xyz');

ERROR: XX000: bogus magic byte found in salt string
LOCATION: crypt-sha.c:309
-> ERRCODE_INVALID_PARAMETER_VALUE

9)
CREATE EXTENSION lo;
SELECT lo_manage();

ERROR: XX000: lo_manage() must be fired by a trigger manager
LOCATION: lo.c:39
-> ERRCODE_E_R_I_E_TRIGGER_PROTOCOL_VIOLATED
(argument-count/column cases: ERRCODE_INVALID_PARAMETER_VALUE,
nonexistent column: ERRCODE_UNDEFINED_COLUMN)

10)
CREATE EXTENSION autoinc;
SELECT autoinc();

ERROR: XX000: autoinc (t): must be fired by row: statement-level trigger
-> ERRCODE_E_R_I_E_TRIGGER_PROTOCOL_VIOLATED

11)
SELECT tsvector_update_trigger();

ERROR: XX000: tsvector_update_trigger: not fired by trigger manager
LOCATION: tsvector_op.c:2763
-> ERRCODE_E_R_I_E_TRIGGER_PROTOCOL_VIOLATED

12) test modules, when installed:

SELECT * FROM test_predtest('SELECT 1');

ERROR: XX000: query must yield two boolean columns
-> ERRCODE_DATATYPE_MISMATCH

13) one case where the XX000 leaks from a missing plan-cache
dependency rather than a bare errcode:

CREATE TEXT SEARCH CONFIGURATION cfg (copy=simple);
PREPARE p(text) AS SELECT to_tsquery('cfg', $1);
EXECUTE p('a & b');
DROP TEXT SEARCH CONFIGURATION cfg CASCADE;
EXECUTE p('a & b');

ERROR: XX000: cache lookup failed for text search configuration 16409

For this one I prepared simple fix

diff --git a/src/backend/optimizer/plan/setrefs.c
b/src/backend/optimizer/plan/setrefs.c
index af78892fafc..c7b8d220fb0 100644
--- a/src/backend/optimizer/plan/setrefs.c
+++ b/src/backend/optimizer/plan/setrefs.c
@@ -2169,6 +2169,21 @@ fix_expr_common(PlannerInfo *root, Node *node)
root->glob->relationOids =
lappend_oid(root->glob->relationOids,
DatumGetObjectId(con->constvalue));
+
+ /* Check for regconfig reference: record an inval-item dependency
+ * so that the plan is revalidated if the text search configuration
+ * is dropped.
+ */
+ if (con->consttype == REGCONFIGOID && !con->constisnull)
+ {
+ PlanInvalItem *inval_item = makeNode(PlanInvalItem);
+
+ inval_item->cacheId = TSCONFIGOID;
+ inval_item->hashValue = GetSysCacheHashValue1(TSCONFIGOID,
+ con->constvalue);
+ root->glob->invalItems =
+ lappend(root->glob->invalItems, inval_item);
+ }
}
else if (IsA(node, GroupingFunc))
{
diff --git a/src/backend/utils/cache/plancache.c
b/src/backend/utils/cache/plancache.c
index a1b406cee29..f641efe2a73 100644
--- a/src/backend/utils/cache/plancache.c
+++ b/src/backend/utils/cache/plancache.c
@@ -156,6 +156,7 @@ InitPlanCache(void)
CacheRegisterRelcacheCallback(PlanCacheRelCallback, (Datum) 0);
CacheRegisterSyscacheCallback(PROCOID, PlanCacheObjectCallback, (Datum) 0);
CacheRegisterSyscacheCallback(TYPEOID, PlanCacheObjectCallback, (Datum) 0);
+ CacheRegisterSyscacheCallback(TSCONFIGOID, PlanCacheSysCallback, (Datum) 0);
CacheRegisterSyscacheCallback(NAMESPACEOID, PlanCacheSysCallback, (Datum) 0);
CacheRegisterSyscacheCallback(OPEROID, PlanCacheSysCallback, (Datum) 0);
CacheRegisterSyscacheCallback(AMOPOPID, PlanCacheSysCallback, (Datum) 0);

I didn't check the novelty of this reports.

[0] https://www.postgresql.org/message-id/c3025db3-3b9d-45dd-af61-845839d73399%40gmail.com

--
Best regards,
Kirill Reshke

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Alexander Lakhin 2026-11-01 11:00:00 Re: Internal error codes triggered by regression tests and user queries, take 2
Previous Message Henson Choi 2026-11-01 06:30:30 Re: [PATCH] Consider window functions when reordering GROUP BY items