From b658e3ed0962894be3f31996334361e0a2890525 Mon Sep 17 00:00:00 2001 From: Richard Guo Date: Mon, 8 Apr 2019 05:54:00 +0000 Subject: [PATCH] Disable shareinputscan with outer refs. Currently shareinputscan doesn't handle rescan properly, and to fully support it, there will be a lot of code changes. After some discussions, we decide to disable shareinputscan with outer refs for now. --- src/backend/optimizer/plan/planshare.c | 11 +++++++++++ src/test/regress/expected/shared_scan.out | 7 +++++++ src/test/regress/sql/shared_scan.sql | 7 +++++++ 3 files changed, 25 insertions(+) diff --git a/src/backend/optimizer/plan/planshare.c b/src/backend/optimizer/plan/planshare.c index 3aa34107e6..4b2d2a62b7 100644 --- a/src/backend/optimizer/plan/planshare.c +++ b/src/backend/optimizer/plan/planshare.c @@ -134,6 +134,15 @@ static ShareInputScan *make_shareinputscan(PlannerInfo *root, Plan *inputplan) Assert(IsA(inputplan, Material) || IsA(inputplan, Sort)); + /* + * Currently GPDB doesn't fully support shareinputscan referencing outer + * rels. + */ + if (!bms_is_empty(inputplan->extParam)) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("shareinputscan with outer refs is not supported by GPDB"))); + sisc = makeNode(ShareInputScan); incr_plan_nsharer(inputplan); @@ -212,6 +221,8 @@ prepare_plan_for_sharing(PlannerInfo *root, Plan *common) shared->plan_width = common->plan_width; shared->dispatch = common->dispatch; shared->flow = copyObject(common->flow); + shared->extParam = bms_copy(common->extParam); + shared->allParam = bms_copy(common->allParam); m->share_id = SHARE_ID_NOT_ASSIGNED; m->share_type = SHARE_MATERIAL; diff --git a/src/test/regress/expected/shared_scan.out b/src/test/regress/expected/shared_scan.out index 284add5006..dfb5b264a5 100644 --- a/src/test/regress/expected/shared_scan.out +++ b/src/test/regress/expected/shared_scan.out @@ -30,3 +30,10 @@ SELECT * FROM ---+---+---+---+---+--- (0 rows) +SELECT *, + ( + WITH cte AS (SELECT * FROM jazz WHERE jazz.e = bar.c) + SELECT 1 FROM cte c1, cte c2 + ) + FROM bar; +ERROR: shareinputscan with outer refs is not supported by GPDB diff --git a/src/test/regress/sql/shared_scan.sql b/src/test/regress/sql/shared_scan.sql index fdae09fa01..f4b8ec53bd 100644 --- a/src/test/regress/sql/shared_scan.sql +++ b/src/test/regress/sql/shared_scan.sql @@ -27,3 +27,10 @@ SELECT * FROM JOIN bar ON b = c ) AS XY JOIN jazz on c = e AND b = f; + +SELECT *, + ( + WITH cte AS (SELECT * FROM jazz WHERE jazz.e = bar.c) + SELECT 1 FROM cte c1, cte c2 + ) + FROM bar; -- GitLab