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]

Reply via email to