From: Tom Lane <tgl@sss.pgh.pa.us>
To: Dmitry Dolgov <9erthalion6@gmail.com>
Cc: Poot, Bas (B.J.) <bas.poot@politie.nl>
Cc: pgsql-bugs@lists.postgresql.org <pgsql-bugs@lists.postgresql.org>
Subject: Re: XX000: unknown type of jsonb container.
Date: Sun, 30 May 2021 20:59:28 -0400
Message-ID: <2491424.1622422768@sss.pgh.pa.us> (raw)
In-Reply-To: <2433209.1622416353@sss.pgh.pa.us>
References: <534fca83789c4a378c7de379e9067d4f@politie.nl>
<20210407181105.lmi7hgifwzs3eeee@localhost>
<20210413161500.kufk4iyrmcmhhbrc@localhost>
<20210423151505.lxx5ti7ivcza3xqw@localhost>
<2433209.1622416353@sss.pgh.pa.us>
I wrote:
> I'm not sure about creating a test case. The case reported here is
> far too expensive to use in the regression tests.
Ah, we can do it in select_parallel, which reduces all the parallel
costs to zero to favor these sorts of plans.
This test case only fails back to v13, as does the original example.
I suspect we should back-patch the code change further though,
since create_projection_plan will be just as confused by such cases
in earlier branches.
regards, tom lane
Attachments:remove-redundant-ProjectionPath-2.patch (text/x-diff, 3.3K) downloaddiff --git a/src/backend/optimizer/util/pathnode.c b/src/backend/optimizer/util/pathnode.cindex b248b038e0..9ce5f95e3b 100644--- a/src/backend/optimizer/util/pathnode.c+++ b/src/backend/optimizer/util/pathnode.c@@ -2632,7 +2632,23 @@ create_projection_path(PlannerInfo *root,
PathTarget *target)
{
ProjectionPath *pathnode = makeNode(ProjectionPath);
- PathTarget *oldtarget = subpath->pathtarget;+ PathTarget *oldtarget;++ /*+ * We mustn't put a ProjectionPath directly above another; it's useless+ * and will confuse create_projection_plan. Rather than making sure all+ * callers handle that, let's implement it here, by stripping off any+ * ProjectionPath in what we're given. Given this rule, there won't be+ * more than one.+ */+ if (IsA(subpath, ProjectionPath))+ {+ ProjectionPath *subpp = (ProjectionPath *) subpath;++ Assert(subpp->path.parent == rel);+ subpath = subpp->subpath;+ Assert(!IsA(subpath, ProjectionPath));+ }
pathnode->path.pathtype = T_Result;
pathnode->path.parent = rel;
@@ -2658,6 +2674,7 @@ create_projection_path(PlannerInfo *root,
* Note: in the latter case, create_projection_plan has to recheck our
* conclusion; see comments therein.
*/
+ oldtarget = subpath->pathtarget;
if (is_projection_capable_path(subpath) ||
equal(oldtarget->exprs, target->exprs))
{
diff --git a/src/test/regress/expected/select_parallel.out b/src/test/regress/expected/select_parallel.outindex 05ebcb284a..4ea1aa7dfd 100644--- a/src/test/regress/expected/select_parallel.out+++ b/src/test/regress/expected/select_parallel.out@@ -1126,6 +1126,29 @@ ORDER BY 1, 2, 3;
------------------------------+---------------------------+-------------+--------------
(0 rows)
+EXPLAIN (VERBOSE, COSTS OFF)+SELECT generate_series(1, two), array(select generate_series(1, two))+ FROM tenk1 ORDER BY tenthous;+ QUERY PLAN +----------------------------------------------------------------------+ ProjectSet+ Output: generate_series(1, tenk1.two), (SubPlan 1), tenk1.tenthous+ -> Gather Merge+ Output: tenk1.two, tenk1.tenthous+ Workers Planned: 4+ -> Result+ Output: tenk1.two, tenk1.tenthous+ -> Sort+ Output: tenk1.tenthous, tenk1.two+ Sort Key: tenk1.tenthous+ -> Parallel Seq Scan on public.tenk1+ Output: tenk1.tenthous, tenk1.two+ SubPlan 1+ -> ProjectSet+ Output: generate_series(1, tenk1.two)+ -> Result+(16 rows)+
-- test passing expanded-value representations to workers
CREATE FUNCTION make_some_array(int,int) returns int[] as
$$declare x int[];
diff --git a/src/test/regress/sql/select_parallel.sql b/src/test/regress/sql/select_parallel.sqlindex d31e290ec2..f924731248 100644--- a/src/test/regress/sql/select_parallel.sql+++ b/src/test/regress/sql/select_parallel.sql@@ -429,6 +429,10 @@ ORDER BY 1;
SELECT * FROM information_schema.foreign_data_wrapper_options
ORDER BY 1, 2, 3;
+EXPLAIN (VERBOSE, COSTS OFF)+SELECT generate_series(1, two), array(select generate_series(1, two))+ FROM tenk1 ORDER BY tenthous;+
-- test passing expanded-value representations to workers
CREATE FUNCTION make_some_array(int,int) returns int[] as
$$declare x int[];
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: pgsql-bugs@postgresql.org
Cc: tgl@sss.pgh.pa.us, 9erthalion6@gmail.com, bas.poot@politie.nl, pgsql-bugs@lists.postgresql.org
Subject: Re: XX000: unknown type of jsonb container.
In-Reply-To: <2491424.1622422768@sss.pgh.pa.us>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox