This is an automated email from the ASF dual-hosted git repository.
jiaqizho pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/cloudberry.git
The following commit(s) were added to refs/heads/main by this push:
new 36c1e7a92c2 ORCA: Support create plan in singlenode mode
36c1e7a92c2 is described below
commit 36c1e7a92c23ebd3cbdf670f3fd1ab0089c60dab
Author: zhoujiaqi <[email protected]>
AuthorDate: Thu Jul 31 13:49:06 2025 +0800
ORCA: Support create plan in singlenode mode
In single node mode, ORCA may produce incorrect results for some
insert/update/delete operations, or sublink/subselect operations.
I don't have plan to spend a lot of time to support all operators.
The current commit supports singlenode-mode in ORCA and disables
unsupported operators.
---
.github/workflows/build-cloudberry.yml | 6 +-
src/backend/gpopt/config/CConfigParamMapping.cpp | 8 +-
.../gpopt/translate/CTranslatorQueryToDXL.cpp | 47 +++++++++
src/backend/gpopt/translate/CTranslatorUtils.cpp | 1 +
src/backend/gpopt/utils/COptTasks.cpp | 7 +-
.../include/naucrates/traceflags/traceflags.h | 3 +
src/backend/optimizer/plan/planner.c | 2 +-
src/backend/utils/misc/guc_gp.c | 11 --
.../gpopt/translate/CTranslatorQueryToDXL.h | 2 +
src/include/utils/guc.h | 1 -
src/include/utils/unsync_guc_name.h | 1 -
.../singlenode_isolation2/expected/lockmodes.out | 116 +++++++++++----------
src/test/singlenode_regress/expected/explain.out | 1 +
.../singlenode_regress/expected/rowsecurity.out | 38 +++----
src/test/singlenode_regress/expected/select.out | 13 +--
15 files changed, 154 insertions(+), 103 deletions(-)
diff --git a/.github/workflows/build-cloudberry.yml
b/.github/workflows/build-cloudberry.yml
index 8d04d51a095..de702b5790d 100644
--- a/.github/workflows/build-cloudberry.yml
+++ b/.github/workflows/build-cloudberry.yml
@@ -273,7 +273,8 @@ jobs:
"make_configs":["src/test/isolation:installcheck-singlenode",
"src/test/singlenode_regress:installcheck-singlenode",
"src/test/singlenode_isolation2:installcheck-singlenode"],
- "num_primary_mirror_pairs":0
+ "num_primary_mirror_pairs":0,
+ "pg_settings":{"optimizer":"off"}
},
{"test":"ic-resgroup-v2",
"make_configs":["src/test/isolation2:installcheck-resgroup-v2"],
@@ -315,9 +316,6 @@ jobs:
},
{"test":"ic-parallel-retrieve-cursor",
"make_configs":["src/test/isolation2:installcheck-parallel-retrieve-cursor"]
- },
- {"test":"ic-cbdb-parallel",
- "make_configs":["src/test/regress:installcheck-cbdb-parallel"]
}
]
}'
diff --git a/src/backend/gpopt/config/CConfigParamMapping.cpp
b/src/backend/gpopt/config/CConfigParamMapping.cpp
index fcf4889ff8f..ad58148b28b 100644
--- a/src/backend/gpopt/config/CConfigParamMapping.cpp
+++ b/src/backend/gpopt/config/CConfigParamMapping.cpp
@@ -15,7 +15,7 @@
extern "C" {
#include "postgres.h"
-
+#include "cdb/cdbvars.h"
#include "utils/guc.h"
}
@@ -386,6 +386,12 @@ CConfigParamMapping::PackConfigParamInBitset(
}
}
+ if (IS_SINGLENODE()) {
+ traceflag_bitset->ExchangeSet(EopttraceSingleNodeMode);
+ } else {
+ traceflag_bitset->ExchangeClear(EopttraceSingleNodeMode);
+ }
+
if (!optimizer_enable_nljoin)
{
CBitSet *nl_join_bitset = CXform::PbsNLJoinXforms(mp);
diff --git a/src/backend/gpopt/translate/CTranslatorQueryToDXL.cpp
b/src/backend/gpopt/translate/CTranslatorQueryToDXL.cpp
index 20cc6557c28..34b045b6807 100644
--- a/src/backend/gpopt/translate/CTranslatorQueryToDXL.cpp
+++ b/src/backend/gpopt/translate/CTranslatorQueryToDXL.cpp
@@ -210,6 +210,9 @@ CTranslatorQueryToDXL::CTranslatorQueryToDXL(
}
}
+ // check if query has insert/update/delete when is_master_only is true.
+ CheckUnsupportedDDLInSingleMode(m_mp, query);
+
// check if the query has any unsupported node types
CheckUnsupportedNodeTypes(query);
@@ -280,6 +283,50 @@ CTranslatorQueryToDXL::~CTranslatorQueryToDXL()
}
}
+//---------------------------------------------------------------------------
+// @function:
+// CTranslatorQueryToDXL::CheckUnsupportedNodeTypes
+//
+// @doc:
+// Check for unsupported node types, and throws an exception when
found
+//
+//---------------------------------------------------------------------------
+void
+CTranslatorQueryToDXL::CheckUnsupportedDDLInSingleMode(CMemoryPool *mp, Query
*query)
+{
+ static const SUnsupportedFeature unsupported_features[] = {
+ {T_SubLink, GPOS_WSZ_LIT("Sublink")},
+ {T_SubqueryScan, GPOS_WSZ_LIT("Subscan")},
+ };
+
+ List *unsupported_list = NIL;
+ for (ULONG ul = 0; ul < GPOS_ARRAY_SIZE(unsupported_features); ul++)
+ {
+ unsupported_list = gpdb::LAppendInt(unsupported_list,
+
unsupported_features[ul].node_tag);
+ }
+
+ INT unsupported_node = gpdb::FindNodes((Node *) query,
unsupported_list);
+ gpdb::GPDBFree(unsupported_list);
+
+ if (GPOS_FTRACE(EopttraceSingleNodeMode) ||
GPOS_FTRACE(EopttraceDisableMotions)) {
+ if (query->commandType == CMD_INSERT || query->commandType ==
CMD_UPDATE ||
+ query->commandType == CMD_DELETE) {
+ GPOS_RAISE(gpdxl::ExmaDXL,
gpdxl::ExmiQuery2DXLUnsupportedFeature,
+ GPOS_WSZ_LIT("Single-mode not support
insert/update/delete"));
+ }
+
+ if (0 <= unsupported_node) {
+ CWStringDynamic error_message(mp);
+ error_message.AppendFormat(GPOS_WSZ_LIT("Single-mode
not support %s"),
+
unsupported_features[unsupported_node].m_feature_name);
+
+ GPOS_RAISE(gpdxl::ExmaDXL,
gpdxl::ExmiQuery2DXLUnsupportedFeature,
+ error_message.GetBuffer());
+ }
+ }
+}
+
//---------------------------------------------------------------------------
// @function:
// CTranslatorQueryToDXL::CheckUnsupportedNodeTypes
diff --git a/src/backend/gpopt/translate/CTranslatorUtils.cpp
b/src/backend/gpopt/translate/CTranslatorUtils.cpp
index 0887c72725c..356f2668919 100644
--- a/src/backend/gpopt/translate/CTranslatorUtils.cpp
+++ b/src/backend/gpopt/translate/CTranslatorUtils.cpp
@@ -150,6 +150,7 @@ CTranslatorUtils::GetTableDescr(CMemoryPool *mp,
CMDAccessor *md_accessor,
}
else if (IMDRelation::ErelstorageForeign !=
rel->RetrieveRelStorageType() &&
!optimizer_enable_master_only_queries &&
+ !GPOS_FTRACE(EopttraceSingleNodeMode) &&
(IMDRelation::EreldistrMasterOnly ==
distribution_policy))
{
// fall back to the planner for queries on master-only table if
they are disabled with Orca. This is due to
diff --git a/src/backend/gpopt/utils/COptTasks.cpp
b/src/backend/gpopt/utils/COptTasks.cpp
index dd0e61116d8..afdbcc4665c 100644
--- a/src/backend/gpopt/utils/COptTasks.cpp
+++ b/src/backend/gpopt/utils/COptTasks.cpp
@@ -953,10 +953,9 @@ COptTasks::OptimizeTask(void *ptr)
query_to_dxl_translator->GetCTEs();
GPOS_ASSERT(nullptr != query_output_dxlnode_array);
- BOOL is_master_only =
- !optimizer_enable_motions ||
- (!optimizer_enable_motions_masteronly_queries &&
-
!query_to_dxl_translator->HasDistributedTables());
+ BOOL is_master_only =
GPOS_FTRACE(EopttraceDisableMotions) ||
+ GPOS_FTRACE(EopttraceSingleNodeMode) ||
+
!query_to_dxl_translator->HasDistributedTables();
// See NoteDistributionPolicyOpclasses() in
src/backend/gpopt/translate/CTranslatorQueryToDXL.cpp
BOOL use_legacy_opfamilies =
(query_to_dxl_translator->GetDistributionHashOpsKind() ==
diff --git
a/src/backend/gporca/libnaucrates/include/naucrates/traceflags/traceflags.h
b/src/backend/gporca/libnaucrates/include/naucrates/traceflags/traceflags.h
index f433b28d062..473806f4a37 100644
--- a/src/backend/gporca/libnaucrates/include/naucrates/traceflags/traceflags.h
+++ b/src/backend/gporca/libnaucrates/include/naucrates/traceflags/traceflags.h
@@ -83,6 +83,9 @@ enum EOptTraceFlag
// print debug info of CTE
EopttraceDebugCTE = 101020,
+ // Is singlenode
+ EopttraceSingleNodeMode = 101021,
+
///////////////////////////////////////////////////////
////////////////// transformations flags //////////////
///////////////////////////////////////////////////////
diff --git a/src/backend/optimizer/plan/planner.c
b/src/backend/optimizer/plan/planner.c
index e4b25e97b33..5ecb8695205 100644
--- a/src/backend/optimizer/plan/planner.c
+++ b/src/backend/optimizer/plan/planner.c
@@ -384,7 +384,7 @@ standard_planner(Query *parse, const char *query_string,
int cursorOptions,
* PARALLEL RETRIEVE CURSOR is not supported by ORCA yet.
*/
if (optimizer &&
- GP_ROLE_DISPATCH == Gp_role &&
+ IS_QD_OR_SINGLENODE() &&
IS_QUERY_DISPATCHER() &&
(cursorOptions & CURSOR_OPT_SKIP_FOREIGN_PARTITIONS) == 0 &&
(cursorOptions & CURSOR_OPT_PARALLEL_RETRIEVE) == 0)
diff --git a/src/backend/utils/misc/guc_gp.c b/src/backend/utils/misc/guc_gp.c
index 02de621cb54..66c204c1075 100644
--- a/src/backend/utils/misc/guc_gp.c
+++ b/src/backend/utils/misc/guc_gp.c
@@ -322,7 +322,6 @@ char *optimizer_search_strategy_path = NULL;
/* GUCs to tell Optimizer to enable a physical operator */
bool optimizer_enable_nljoin;
bool optimizer_enable_indexjoin;
-bool optimizer_enable_motions_masteronly_queries;
bool optimizer_enable_motions;
bool optimizer_enable_motion_broadcast;
bool optimizer_enable_motion_gather;
@@ -2176,16 +2175,6 @@ struct config_bool ConfigureNamesBool_gp[] =
true,
NULL, NULL, NULL
},
- {
- {"optimizer_enable_motions_masteronly_queries", PGC_USERSET,
DEVELOPER_OPTIONS,
- gettext_noop("Enable plans with Motion operators in the
optimizer for queries with no distributed tables."),
- NULL,
- GUC_NO_SHOW_ALL | GUC_NOT_IN_SAMPLE
- },
- &optimizer_enable_motions_masteronly_queries,
- false,
- NULL, NULL, NULL
- },
{
{"optimizer_enable_motions", PGC_USERSET, DEVELOPER_OPTIONS,
gettext_noop("Enable plans with Motion operators in the
optimizer."),
diff --git a/src/include/gpopt/translate/CTranslatorQueryToDXL.h
b/src/include/gpopt/translate/CTranslatorQueryToDXL.h
index c74892e5df2..392af626d29 100644
--- a/src/include/gpopt/translate/CTranslatorQueryToDXL.h
+++ b/src/include/gpopt/translate/CTranslatorQueryToDXL.h
@@ -147,6 +147,8 @@ private:
// node is found
static void CheckUnsupportedNodeTypes(Query *query);
+ static void CheckUnsupportedDDLInSingleMode(CMemoryPool *mp, Query
*query);
+
// walker to check if SUBLINK node is present in the security quals
static BOOL CheckSublinkInSecurityQuals(Node *node, void *context);
diff --git a/src/include/utils/guc.h b/src/include/utils/guc.h
index 40838ba969d..05ff02dd8f1 100644
--- a/src/include/utils/guc.h
+++ b/src/include/utils/guc.h
@@ -501,7 +501,6 @@ extern char *optimizer_search_strategy_path;
/* GUCs to tell Optimizer to enable a physical operator */
extern bool optimizer_enable_nljoin;
extern bool optimizer_enable_indexjoin;
-extern bool optimizer_enable_motions_masteronly_queries;
extern bool optimizer_enable_motions;
extern bool optimizer_enable_motion_broadcast;
extern bool optimizer_enable_motion_gather;
diff --git a/src/include/utils/unsync_guc_name.h
b/src/include/utils/unsync_guc_name.h
index b3a19ca7b9f..065eca54d6e 100644
--- a/src/include/utils/unsync_guc_name.h
+++ b/src/include/utils/unsync_guc_name.h
@@ -420,7 +420,6 @@
"optimizer_enable_motion_gather",
"optimizer_enable_motion_redistribute",
"optimizer_enable_motions",
- "optimizer_enable_motions_masteronly_queries",
"optimizer_enable_multiple_distinct_aggs",
"optimizer_enable_nljoin",
"optimizer_enable_outerjoin_rewrite",
diff --git a/src/test/singlenode_isolation2/expected/lockmodes.out
b/src/test/singlenode_isolation2/expected/lockmodes.out
index 0caadff3922..40835b507ca 100644
--- a/src/test/singlenode_isolation2/expected/lockmodes.out
+++ b/src/test/singlenode_isolation2/expected/lockmodes.out
@@ -159,13 +159,13 @@ ABORT
1: begin;
BEGIN
1: explain select * from t_lockmods, t_lockmods1 for update;
- QUERY PLAN
-------------------------------------------------------------------------
- Nested Loop (cost=10000000000.00..10000000752.74 rows=51150 width=20)
- -> Seq Scan on t_lockmods1 (cost=0.00..112.30 rows=10230 width=10)
- -> Materialize (cost=0.00..1.07 rows=5 width=10)
- -> Seq Scan on t_lockmods (cost=0.00..1.05 rows=5 width=10)
- Optimizer: Postgres query optimizer
+ QUERY PLAN
+-------------------------------------------------------------------
+ Nested Loop (cost=0.00..1324032.37 rows=5 width=8)
+ Join Filter: true
+ -> Seq Scan on t_lockmods1 (cost=0.00..431.00 rows=1 width=4)
+ -> Seq Scan on t_lockmods (cost=0.00..431.00 rows=5 width=4)
+ Optimizer: GPORCA
(5 rows)
1: select * from t_lockmods, t_lockmods1 for update;
c | c
@@ -185,13 +185,13 @@ ABORT
1: begin;
BEGIN
1: explain select * from t_lockmods, t_lockmods1 for no key update;
- QUERY PLAN
-------------------------------------------------------------------------
- Nested Loop (cost=10000000000.00..10000000752.74 rows=51150 width=20)
- -> Seq Scan on t_lockmods1 (cost=0.00..112.30 rows=10230 width=10)
- -> Materialize (cost=0.00..1.07 rows=5 width=10)
- -> Seq Scan on t_lockmods (cost=0.00..1.05 rows=5 width=10)
- Optimizer: Postgres query optimizer
+ QUERY PLAN
+-------------------------------------------------------------------
+ Nested Loop (cost=0.00..1324032.37 rows=5 width=8)
+ Join Filter: true
+ -> Seq Scan on t_lockmods1 (cost=0.00..431.00 rows=1 width=4)
+ -> Seq Scan on t_lockmods (cost=0.00..431.00 rows=5 width=4)
+ Optimizer: GPORCA
(5 rows)
1: select * from t_lockmods, t_lockmods1 for no key update;
c | c
@@ -211,13 +211,13 @@ ABORT
1: begin;
BEGIN
1: explain select * from t_lockmods, t_lockmods1 for share;
- QUERY PLAN
-------------------------------------------------------------------------
- Nested Loop (cost=10000000000.00..10000000752.74 rows=51150 width=20)
- -> Seq Scan on t_lockmods1 (cost=0.00..112.30 rows=10230 width=10)
- -> Materialize (cost=0.00..1.07 rows=5 width=10)
- -> Seq Scan on t_lockmods (cost=0.00..1.05 rows=5 width=10)
- Optimizer: Postgres query optimizer
+ QUERY PLAN
+-------------------------------------------------------------------
+ Nested Loop (cost=0.00..1324032.37 rows=5 width=8)
+ Join Filter: true
+ -> Seq Scan on t_lockmods1 (cost=0.00..431.00 rows=1 width=4)
+ -> Seq Scan on t_lockmods (cost=0.00..431.00 rows=5 width=4)
+ Optimizer: GPORCA
(5 rows)
1: select * from t_lockmods, t_lockmods1 for share;
c | c
@@ -237,13 +237,13 @@ ABORT
1: begin;
BEGIN
1: explain select * from t_lockmods, t_lockmods1 for key share;
- QUERY PLAN
-------------------------------------------------------------------------
- Nested Loop (cost=10000000000.00..10000000752.74 rows=51150 width=20)
- -> Seq Scan on t_lockmods1 (cost=0.00..112.30 rows=10230 width=10)
- -> Materialize (cost=0.00..1.07 rows=5 width=10)
- -> Seq Scan on t_lockmods (cost=0.00..1.05 rows=5 width=10)
- Optimizer: Postgres query optimizer
+ QUERY PLAN
+-------------------------------------------------------------------
+ Nested Loop (cost=0.00..1324032.37 rows=5 width=8)
+ Join Filter: true
+ -> Seq Scan on t_lockmods1 (cost=0.00..431.00 rows=1 width=4)
+ -> Seq Scan on t_lockmods (cost=0.00..431.00 rows=5 width=4)
+ Optimizer: GPORCA
(5 rows)
1: select * from t_lockmods, t_lockmods1 for key share;
c | c
@@ -583,13 +583,14 @@ ABORT
1: begin;
BEGIN
1: explain select * from t_lockmods_ao, t_lockmods_ao1 for update;
- QUERY PLAN
----------------------------------------------------------------------
- Nested Loop (cost=10000000000.00..10000000001.24 rows=8 width=20)
- -> Seq Scan on t_lockmods_ao (cost=0.00..1.08 rows=8 width=10)
- -> Seq Scan on t_lockmods_ao1 (cost=0.00..0.01 rows=1 width=10)
- Optimizer: Postgres query optimizer
-(4 rows)
+ QUERY PLAN
+----------------------------------------------------------------------
+ Nested Loop (cost=0.00..1324032.57 rows=8 width=8)
+ Join Filter: true
+ -> Seq Scan on t_lockmods_ao1 (cost=0.00..431.00 rows=1 width=4)
+ -> Seq Scan on t_lockmods_ao (cost=0.00..431.00 rows=8 width=4)
+ Optimizer: GPORCA
+(5 rows)
1: select * from t_lockmods_ao, t_lockmods_ao1 for update;
c | c
---+---
@@ -608,13 +609,14 @@ ABORT
1: begin;
BEGIN
1: explain select * from t_lockmods_ao, t_lockmods_ao1 for no key update;
- QUERY PLAN
----------------------------------------------------------------------
- Nested Loop (cost=10000000000.00..10000000001.24 rows=8 width=20)
- -> Seq Scan on t_lockmods_ao (cost=0.00..1.08 rows=8 width=10)
- -> Seq Scan on t_lockmods_ao1 (cost=0.00..0.01 rows=1 width=10)
- Optimizer: Postgres query optimizer
-(4 rows)
+ QUERY PLAN
+----------------------------------------------------------------------
+ Nested Loop (cost=0.00..1324032.57 rows=8 width=8)
+ Join Filter: true
+ -> Seq Scan on t_lockmods_ao1 (cost=0.00..431.00 rows=1 width=4)
+ -> Seq Scan on t_lockmods_ao (cost=0.00..431.00 rows=8 width=4)
+ Optimizer: GPORCA
+(5 rows)
1: select * from t_lockmods_ao, t_lockmods_ao1 for no key update;
c | c
---+---
@@ -633,13 +635,14 @@ ABORT
1: begin;
BEGIN
1: explain select * from t_lockmods_ao, t_lockmods_ao1 for share;
- QUERY PLAN
----------------------------------------------------------------------
- Nested Loop (cost=10000000000.00..10000000001.24 rows=8 width=20)
- -> Seq Scan on t_lockmods_ao (cost=0.00..1.08 rows=8 width=10)
- -> Seq Scan on t_lockmods_ao1 (cost=0.00..0.01 rows=1 width=10)
- Optimizer: Postgres query optimizer
-(4 rows)
+ QUERY PLAN
+----------------------------------------------------------------------
+ Nested Loop (cost=0.00..1324032.57 rows=8 width=8)
+ Join Filter: true
+ -> Seq Scan on t_lockmods_ao1 (cost=0.00..431.00 rows=1 width=4)
+ -> Seq Scan on t_lockmods_ao (cost=0.00..431.00 rows=8 width=4)
+ Optimizer: GPORCA
+(5 rows)
1: select * from t_lockmods_ao, t_lockmods_ao1 for share;
c | c
---+---
@@ -658,13 +661,14 @@ ABORT
1: begin;
BEGIN
1: explain select * from t_lockmods_ao, t_lockmods_ao1 for key share;
- QUERY PLAN
----------------------------------------------------------------------
- Nested Loop (cost=10000000000.00..10000000001.24 rows=8 width=20)
- -> Seq Scan on t_lockmods_ao (cost=0.00..1.08 rows=8 width=10)
- -> Seq Scan on t_lockmods_ao1 (cost=0.00..0.01 rows=1 width=10)
- Optimizer: Postgres query optimizer
-(4 rows)
+ QUERY PLAN
+----------------------------------------------------------------------
+ Nested Loop (cost=0.00..1324032.57 rows=8 width=8)
+ Join Filter: true
+ -> Seq Scan on t_lockmods_ao1 (cost=0.00..431.00 rows=1 width=4)
+ -> Seq Scan on t_lockmods_ao (cost=0.00..431.00 rows=8 width=4)
+ Optimizer: GPORCA
+(5 rows)
1: select * from t_lockmods_ao, t_lockmods_ao1 for key share;
c | c
---+---
diff --git a/src/test/singlenode_regress/expected/explain.out
b/src/test/singlenode_regress/expected/explain.out
index 2803a0b2c50..2c9f373b894 100644
--- a/src/test/singlenode_regress/expected/explain.out
+++ b/src/test/singlenode_regress/expected/explain.out
@@ -471,6 +471,7 @@ select jsonb_pretty(
}, +
"Settings": { +
"Optimizer": "Postgres query optimizer",+
+ "optimizer": "off", +
"parallel_setup_cost": "0", +
"parallel_tuple_cost": "0", +
"min_parallel_table_scan_size": "0" +
diff --git a/src/test/singlenode_regress/expected/rowsecurity.out
b/src/test/singlenode_regress/expected/rowsecurity.out
index 60b1eb0a261..d2b3baec80d 100644
--- a/src/test/singlenode_regress/expected/rowsecurity.out
+++ b/src/test/singlenode_regress/expected/rowsecurity.out
@@ -783,15 +783,16 @@ SELECT * FROM t1 FOR SHARE;
EXPLAIN (COSTS OFF) SELECT * FROM t1 FOR SHARE;
QUERY PLAN
-------------------------------------
- Append
- -> Seq Scan on t1 t1_1
- Filter: ((a % 2) = 0)
- -> Seq Scan on t2 t1_2
- Filter: ((a % 2) = 0)
- -> Seq Scan on t3 t1_3
- Filter: ((a % 2) = 0)
+ LockRows
+ -> Append
+ -> Seq Scan on t1 t1_1
+ Filter: ((a % 2) = 0)
+ -> Seq Scan on t2 t1_2
+ Filter: ((a % 2) = 0)
+ -> Seq Scan on t3 t1_3
+ Filter: ((a % 2) = 0)
Optimizer: Postgres query optimizer
-(8 rows)
+(9 rows)
SELECT * FROM t1 WHERE f_leak(b) FOR SHARE;
NOTICE: f_leak => bbb
@@ -809,17 +810,18 @@ NOTICE: f_leak => yyy
(5 rows)
EXPLAIN (COSTS OFF) SELECT * FROM t1 WHERE f_leak(b) FOR SHARE;
- QUERY PLAN
------------------------------------------------
- Append
- -> Seq Scan on t1 t1_1
- Filter: (((a % 2) = 0) AND f_leak(b))
- -> Seq Scan on t2 t1_2
- Filter: (((a % 2) = 0) AND f_leak(b))
- -> Seq Scan on t3 t1_3
- Filter: (((a % 2) = 0) AND f_leak(b))
+ QUERY PLAN
+-----------------------------------------------------
+ LockRows
+ -> Append
+ -> Seq Scan on t1 t1_1
+ Filter: (((a % 2) = 0) AND f_leak(b))
+ -> Seq Scan on t2 t1_2
+ Filter: (((a % 2) = 0) AND f_leak(b))
+ -> Seq Scan on t3 t1_3
+ Filter: (((a % 2) = 0) AND f_leak(b))
Optimizer: Postgres query optimizer
-(8 rows)
+(9 rows)
-- union all query
SELECT a, b, tableoid::regclass FROM t2 UNION ALL SELECT a, b,
tableoid::regclass FROM t3;
diff --git a/src/test/singlenode_regress/expected/select.out
b/src/test/singlenode_regress/expected/select.out
index a7014af1f98..f393c638962 100644
--- a/src/test/singlenode_regress/expected/select.out
+++ b/src/test/singlenode_regress/expected/select.out
@@ -816,13 +816,14 @@ select unique2 from onek2 where unique2 = 11 and stringu1
< 'B';
-- but if it's an update target, must retest anyway
explain (costs off)
select unique2 from onek2 where unique2 = 11 and stringu1 < 'B' for update;
- QUERY PLAN
------------------------------------------
- Index Scan using onek2_u2_prtl on onek2
- Index Cond: (unique2 = 11)
- Filter: (stringu1 < 'B'::name)
+ QUERY PLAN
+-----------------------------------------------
+ LockRows
+ -> Index Scan using onek2_u2_prtl on onek2
+ Index Cond: (unique2 = 11)
+ Filter: (stringu1 < 'B'::name)
Optimizer: Postgres query optimizer
-(4 rows)
+(5 rows)
select unique2 from onek2 where unique2 = 11 and stringu1 < 'B' for update;
unique2
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]