public inbox for [email protected]  
help / color / mirror / Atom feed
From: Tender Wang <[email protected]>
To: Justin Pryzby <[email protected]>
Cc: [email protected]
Cc: Paul Jungwirth <[email protected]>
Cc: Tom Lane <[email protected]>
Subject: Re: pg17: XX000: no relation entry for relid 0
Date: Fri, 10 Apr 2026 20:49:24 +0800
Message-ID: <CAHewXN=_C3apEh4nDndgbOiYnFAYDDuMWAozPP0G3iL=7zQbJg@mail.gmail.com> (raw)
In-Reply-To: <adjW8rfPDkplC7lF@pryzbyj2023>
References: <adjW8rfPDkplC7lF@pryzbyj2023>

Justin Pryzby <[email protected]> 于2026年4月10日周五 18:54写道:
>
> CREATE VIEW x AS SELECT NULL::int[]
> UNION ALL SELECT NULL::int[]
> UNION ALL SELECT ARRAY[NULL::bigint];
>
> SELECT FROM x;
> ERROR:  XX000: no relation entry for relid 0
>
> Since 9391f7152.
The varno = 0 is from below code:

*pTargetList = generate_setop_tlist(colTypes, colCollations,
                                                0,
                                                false,
                                                *pTargetList,
                                                refnames_tlist,
                                                &trivial_tlist);
            *istrivial_tlist = trivial_tlist;
            target = create_pathtarget(root, *pTargetList);

in recurse_set_operations().
When calling set_pathtarget_cost_width(), we estimate the length of
the array that would enter estimate_array_length().
Before 9391f7152, we returned 10 directly.  But now, we see if we can
find any statistics about it.
In examine_variable(), try to find base_rel in find_base_rel(), error
reported. Because the varno of the Var is 0.

I didn't think too much at now, a quick fix as below:
diff --git a/src/backend/utils/adt/selfuncs.c b/src/backend/utils/adt/selfuncs.c
index 4160d2d6e24..ff93fc3ac8a 100644
--- a/src/backend/utils/adt/selfuncs.c
+++ b/src/backend/utils/adt/selfuncs.c
@@ -2265,6 +2265,9 @@ estimate_array_length(PlannerInfo *root, Node *arrayexpr)
                AttStatsSlot sslot;
                double          nelem = 0;

+               if (IsA(arrayexpr, Var) && ((Var *) arrayexpr)->varno == 0)
+                       return 10;
+
                examine_variable(root, arrayexpr, 0, &vardata);
                if (HeapTupleIsValid(vardata.statsTuple))
                {

Any thoughts?

-- 
Thanks,
Tender Wang





view thread (6+ messages)  latest in thread

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: [email protected]
  Cc: [email protected], [email protected], [email protected], [email protected], [email protected]
  Subject: Re: pg17: XX000: no relation entry for relid 0
  In-Reply-To: <CAHewXN=_C3apEh4nDndgbOiYnFAYDDuMWAozPP0G3iL=7zQbJg@mail.gmail.com>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox