OSDN Git Service

Support PostgreSQL 9.6 RC1
authorKyotaro Horiguchi <horiguchi.kyotaro@lab.ntt.co.jp>
Thu, 1 Sep 2016 04:57:30 +0000 (13:57 +0900)
committerKyotaro Horiguchi <horiguchi.kyotaro@lab.ntt.co.jp>
Thu, 1 Sep 2016 05:00:15 +0000 (14:00 +0900)
Edited Makefile and renamed and edited RPM spec file.
Copied functions are updated and follow the changes of internal API.
Modified regressions to pass with 9.6 RC1.

16 files changed:
Makefile
SPECS/pg_hint_plan96.spec [moved from SPECS/pg_hint_plan95.spec with 83% similarity]
core.c
expected/init.out
expected/pg_hint_plan.out
expected/ut-A.out
expected/ut-J.out
expected/ut-L.out
expected/ut-S.out
pg_hint_plan.c
sql/init.sql
sql/pg_hint_plan.sql
sql/ut-A.sql
sql/ut-J.sql
sql/ut-L.sql
sql/ut-S.sql

index 53937eb..46b1c74 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
 #
 # pg_hint_plan: Makefile
 #
-# Copyright (c) 2012-2015, NIPPON TELEGRAPH AND TELEPHONE CORPORATION
+# Copyright (c) 2012-2016, NIPPON TELEGRAPH AND TELEPHONE CORPORATION
 #
 
 MODULES = pg_hint_plan
@@ -23,18 +23,18 @@ PGXS := $(shell $(PG_CONFIG) --pgxs)
 include $(PGXS)
 
 STARBALL = pg_dbms_stats-$(DBMSSTATSVER).tar.gz
-STARBALL95 = pg_hint_plan95-$(HINTPLANVER).tar.gz
-STARBALLS = $(STARBALL) $(STARBALL95)
+STARBALL96 = pg_hint_plan96-$(HINTPLANVER).tar.gz
+STARBALLS = $(STARBALL) $(STARBALL96)
 
-TARSOURCES = Makefile *.c  *.h \
+TARSOURCES = Makefile *.c  *.h COPYRIGHT* \
        pg_hint_plan--*.sql \
        pg_hint_plan.control \
-       doc/* expected/*.out sql/*.sql \
-       input/*.source output/*.source SPECS/*.spec
+       doc/* expected/*.out sql/*.sql sql/maskout.sh \
+       data/data.csv input/*.source output/*.source SPECS/*.spec
 
 installcheck: $(REGRESSION_EXPECTED)
 
-rpms: rpm95
+rpms: rpm96
 
 # pg_hint_plan.c includes core.c and make_join_rel.c
 pg_hint_plan.o: core.c make_join_rel.c # pg_stat_statements.c
@@ -49,7 +49,7 @@ $(STARBALLS): $(TARSOURCES)
        tar -chzf $@ $(addprefix $(subst .tar.gz,,$@)/, $^)
        rm $(subst .tar.gz,,$@)
 
-rpm95: $(STARBALL95)
-       MAKE_ROOT=`pwd` rpmbuild -bb SPECS/pg_hint_plan95.spec
+rpm96: $(STARBALL96)
+       MAKE_ROOT=`pwd` rpmbuild -bb SPECS/pg_hint_plan96.spec
 
 
similarity index 83%
rename from SPECS/pg_hint_plan95.spec
rename to SPECS/pg_hint_plan96.spec
index 62f8a8a..199229e 100644 (file)
@@ -1,7 +1,7 @@
 # SPEC file for pg_store_plans
 # Copyright(C) 2016 NIPPON TELEGRAPH AND TELEPHONE CORPORATION
 
-%define _pgdir   /usr/pgsql-9.5
+%define _pgdir   /usr/pgsql-9.6
 %define _bindir  %{_pgdir}/bin
 %define _libdir  %{_pgdir}/lib
 %define _datadir %{_pgdir}/share
@@ -11,8 +11,8 @@
 %endif
 
 ## Set general information for pg_store_plans.
-Summary:    Optimizer hint on PostgreSQL 9.5
-Name:       pg_hint_plan95
+Summary:    Optimizer hint on PostgreSQL 9.6
+Name:       pg_hint_plan96
 Version:    1.1.3
 Release:    1%{?dist}
 License:    BSD
@@ -23,8 +23,8 @@ BuildRoot:  %{_tmppath}/%{name}-%{version}-%{release}-%(%{__id_u} -n)
 Vendor:     NIPPON TELEGRAPH AND TELEPHONE CORPORATION
 
 ## We use postgresql-devel package
-BuildRequires:  postgresql95-devel
-Requires:  postgresql95-libs
+BuildRequires:  postgresql96-devel
+Requires:  postgresql96-libs
 
 ## Description for "pg_hint_plan"
 %description
@@ -32,11 +32,11 @@ Requires:  postgresql95-libs
 pg_hint_plan provides capability to tweak execution plans to be
 executed on PostgreSQL.
 
-Note that this package is available for only PostgreSQL 9.5.
+Note that this package is available for only PostgreSQL 9.6.
 
 ## pre work for build pg_hint_plan
 %prep
-PATH=/usr/pgsql-9.5/bin:$PATH
+PATH=/usr/pgsql-9.6/bin:$PATH
 if [ "${MAKE_ROOT}" != "" ]; then
   pushd ${MAKE_ROOT}
   make clean %{name}-%{version}.tar.gz
@@ -47,7 +47,7 @@ if [ ! -d %{_rpmdir} ]; then mkdir -p %{_rpmdir}; fi
 
 ## Set variables for build environment
 %build
-PATH=/usr/pgsql-9.5/bin:$PATH
+PATH=/usr/pgsql-9.6/bin:$PATH
 make USE_PGXS=1 %{?_smp_mflags}
 
 ## Set variables for install
@@ -71,7 +71,5 @@ rm -rf %{buildroot}
 
 # History of pg_hint_plan.
 %changelog
-* Fri May 13 2016 Kyotaro Horiguchi
-- Support PostgreSQL 9.5
-
-
+* Thu Jul 21 2016 Kyotaro Horiguchi
+- Support PostgreSQL 9.6
diff --git a/core.c b/core.c
index 94d8031..333d420 100644 (file)
--- a/core.c
+++ b/core.c
@@ -38,6 +38,8 @@ set_append_rel_pathlist(PlannerInfo *root, RelOptInfo *rel,
        List       *live_childrels = NIL;
        List       *subpaths = NIL;
        bool            subpaths_valid = true;
+       List       *partial_subpaths = NIL;
+       bool            partial_subpaths_valid = true;
        List       *all_child_pathkeys = NIL;
        List       *all_child_outers = NIL;
        ListCell   *l;
@@ -66,6 +68,15 @@ set_append_rel_pathlist(PlannerInfo *root, RelOptInfo *rel,
                childrel = root->simple_rel_array[childRTindex];
 
                /*
+                * If set_append_rel_size() decided the parent appendrel was
+                * parallel-unsafe at some point after visiting this child rel, we
+                * need to propagate the unsafety marking down to the child, so that
+                * we don't generate useless partial paths for it.
+                */
+               if (!rel->consider_parallel)
+                       childrel->consider_parallel = false;
+
+               /*
                 * Compute the child's access paths.
                 */
                set_rel_pathlist(root, childrel, childRTindex, childRTE);
@@ -92,6 +103,13 @@ set_append_rel_pathlist(PlannerInfo *root, RelOptInfo *rel,
                else
                        subpaths_valid = false;
 
+               /* Same idea, but for a partial plan. */
+               if (childrel->partial_pathlist != NIL)
+                       partial_subpaths = accumulate_append_subpath(partial_subpaths,
+                                                                          linitial(childrel->partial_pathlist));
+               else
+                       partial_subpaths_valid = false;
+
                /*
                 * Collect lists of all the available path orderings and
                 * parameterizations for all the children.  We use these as a
@@ -163,7 +181,36 @@ set_append_rel_pathlist(PlannerInfo *root, RelOptInfo *rel,
         * if we have zero or one live subpath due to constraint exclusion.)
         */
        if (subpaths_valid)
-               add_path(rel, (Path *) create_append_path(rel, subpaths, NULL));
+               add_path(rel, (Path *) create_append_path(rel, subpaths, NULL, 0));
+
+       /*
+        * Consider an append of partial unordered, unparameterized partial paths.
+        */
+       if (partial_subpaths_valid)
+       {
+               AppendPath *appendpath;
+               ListCell   *lc;
+               int                     parallel_workers = 0;
+
+               /*
+                * Decide on the number of workers to request for this append path.
+                * For now, we just use the maximum value from among the members.  It
+                * might be useful to use a higher number if the Append node were
+                * smart enough to spread out the workers, but it currently isn't.
+                */
+               foreach(lc, partial_subpaths)
+               {
+                       Path       *path = lfirst(lc);
+
+                       parallel_workers = Max(parallel_workers, path->parallel_workers);
+               }
+               Assert(parallel_workers > 0);
+
+               /* Generate a partial append path. */
+               appendpath = create_append_path(rel, partial_subpaths, NULL,
+                                                                               parallel_workers);
+               add_partial_path(rel, (Path *) appendpath);
+       }
 
        /*
         * Also build unparameterized MergeAppend paths based on the collected
@@ -213,7 +260,7 @@ set_append_rel_pathlist(PlannerInfo *root, RelOptInfo *rel,
 
                if (subpaths_valid)
                        add_path(rel, (Path *)
-                                        create_append_path(rel, subpaths, required_outer));
+                                        create_append_path(rel, subpaths, required_outer, 0));
        }
 }
 
@@ -491,12 +538,19 @@ standard_join_search(PlannerInfo *root, int levels_needed, List *initial_rels)
                join_search_one_level(root, lev);
 
                /*
-                * Do cleanup work on each just-processed rel.
+                * Run generate_gather_paths() for each just-processed joinrel.  We
+                * could not do this earlier because both regular and partial paths
+                * can get added to a particular joinrel at multiple times within
+                * join_search_one_level.  After that, we're done creating paths for
+                * the joinrel, so run set_cheapest().
                 */
                foreach(lc, root->join_rel_level[lev])
                {
                        rel = (RelOptInfo *) lfirst(lc);
 
+                       /* Create GatherPaths for any useful partial paths for rel */
+                       generate_gather_paths(root, rel);
+
                        /* Find and save the cheapest paths for this rel */
                        set_cheapest(rel);
 
@@ -1213,9 +1267,10 @@ mark_dummy_rel(RelOptInfo *rel)
 
        /* Evict any previously chosen paths */
        rel->pathlist = NIL;
+       rel->partial_pathlist = NIL;
 
        /* Set up the dummy path */
-       add_path(rel, (Path *) create_append_path(rel, NIL, NULL));
+       add_path(rel, (Path *) create_append_path(rel, NIL, NULL, 0));
 
        /* Set or update cheapest_total_path and related fields */
        set_cheapest(rel);
index 6ee06c8..b143590 100644 (file)
@@ -168,38 +168,42 @@ SELECT name, setting, category
     OR name = 'client_min_messages'
  ORDER BY category, name;
 SELECT * FROM settings;
-           name            |  setting  |                  category                   
----------------------------+-----------+---------------------------------------------
- geqo                      | on        | Query Tuning / Genetic Query Optimizer
- geqo_effort               | 5         | Query Tuning / Genetic Query Optimizer
- geqo_generations          | 0         | Query Tuning / Genetic Query Optimizer
- geqo_pool_size            | 0         | Query Tuning / Genetic Query Optimizer
- geqo_seed                 | 0         | Query Tuning / Genetic Query Optimizer
- geqo_selection_bias       | 2         | Query Tuning / Genetic Query Optimizer
- geqo_threshold            | 12        | Query Tuning / Genetic Query Optimizer
- constraint_exclusion      | partition | Query Tuning / Other Planner Options
- cursor_tuple_fraction     | 0.1       | Query Tuning / Other Planner Options
- default_statistics_target | 100       | Query Tuning / Other Planner Options
- from_collapse_limit       | 8         | Query Tuning / Other Planner Options
- join_collapse_limit       | 8         | Query Tuning / Other Planner Options
- cpu_index_tuple_cost      | 0.005     | Query Tuning / Planner Cost Constants
- cpu_operator_cost         | 0.0025    | Query Tuning / Planner Cost Constants
- cpu_tuple_cost            | 0.01      | Query Tuning / Planner Cost Constants
- effective_cache_size      | 16384     | Query Tuning / Planner Cost Constants
- random_page_cost          | 4         | Query Tuning / Planner Cost Constants
- seq_page_cost             | 1         | Query Tuning / Planner Cost Constants
- enable_bitmapscan         | on        | Query Tuning / Planner Method Configuration
- enable_hashagg            | on        | Query Tuning / Planner Method Configuration
- enable_hashjoin           | on        | Query Tuning / Planner Method Configuration
- enable_indexonlyscan      | on        | Query Tuning / Planner Method Configuration
- enable_indexscan          | on        | Query Tuning / Planner Method Configuration
- enable_material           | on        | Query Tuning / Planner Method Configuration
- enable_mergejoin          | on        | Query Tuning / Planner Method Configuration
- enable_nestloop           | on        | Query Tuning / Planner Method Configuration
- enable_seqscan            | on        | Query Tuning / Planner Method Configuration
- enable_sort               | on        | Query Tuning / Planner Method Configuration
- enable_tidscan            | on        | Query Tuning / Planner Method Configuration
- client_min_messages       | notice    | Reporting and Logging / When to Log
-(30 rows)
+            name            |  setting  |                  category                   
+----------------------------+-----------+---------------------------------------------
+ geqo                       | on        | Query Tuning / Genetic Query Optimizer
+ geqo_effort                | 5         | Query Tuning / Genetic Query Optimizer
+ geqo_generations           | 0         | Query Tuning / Genetic Query Optimizer
+ geqo_pool_size             | 0         | Query Tuning / Genetic Query Optimizer
+ geqo_seed                  | 0         | Query Tuning / Genetic Query Optimizer
+ geqo_selection_bias        | 2         | Query Tuning / Genetic Query Optimizer
+ geqo_threshold             | 12        | Query Tuning / Genetic Query Optimizer
+ constraint_exclusion       | partition | Query Tuning / Other Planner Options
+ cursor_tuple_fraction      | 0.1       | Query Tuning / Other Planner Options
+ default_statistics_target  | 100       | Query Tuning / Other Planner Options
+ force_parallel_mode        | off       | Query Tuning / Other Planner Options
+ from_collapse_limit        | 8         | Query Tuning / Other Planner Options
+ join_collapse_limit        | 8         | Query Tuning / Other Planner Options
+ cpu_index_tuple_cost       | 0.005     | Query Tuning / Planner Cost Constants
+ cpu_operator_cost          | 0.0025    | Query Tuning / Planner Cost Constants
+ cpu_tuple_cost             | 0.01      | Query Tuning / Planner Cost Constants
+ effective_cache_size       | 16384     | Query Tuning / Planner Cost Constants
+ min_parallel_relation_size | 1024      | Query Tuning / Planner Cost Constants
+ parallel_setup_cost        | 1000      | Query Tuning / Planner Cost Constants
+ parallel_tuple_cost        | 0.1       | Query Tuning / Planner Cost Constants
+ random_page_cost           | 4         | Query Tuning / Planner Cost Constants
+ seq_page_cost              | 1         | Query Tuning / Planner Cost Constants
+ enable_bitmapscan          | on        | Query Tuning / Planner Method Configuration
+ enable_hashagg             | on        | Query Tuning / Planner Method Configuration
+ enable_hashjoin            | on        | Query Tuning / Planner Method Configuration
+ enable_indexonlyscan       | on        | Query Tuning / Planner Method Configuration
+ enable_indexscan           | on        | Query Tuning / Planner Method Configuration
+ enable_material            | on        | Query Tuning / Planner Method Configuration
+ enable_mergejoin           | on        | Query Tuning / Planner Method Configuration
+ enable_nestloop            | on        | Query Tuning / Planner Method Configuration
+ enable_seqscan             | on        | Query Tuning / Planner Method Configuration
+ enable_sort                | on        | Query Tuning / Planner Method Configuration
+ enable_tidscan             | on        | Query Tuning / Planner Method Configuration
+ client_min_messages        | notice    | Reporting and Logging / When to Log
+(34 rows)
 
 ANALYZE;
index bb67f7e..c66f6e7 100644 (file)
@@ -1,5 +1,6 @@
 SET search_path TO public;
 SET client_min_messages TO log;
+\set SHOW_CONTEXT always
 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
               QUERY PLAN              
 --------------------------------------
@@ -953,16 +954,16 @@ error hint:
                                QUERY PLAN                               
 ------------------------------------------------------------------------
  Index Only Scan using t1_pkey on t1
-   Index Cond: (id = $2)
-   InitPlan 1 (returns $0)
+   Index Cond: (id = $3)
+   InitPlan 1 (returns $1)
      ->  Aggregate
            ->  Bitmap Heap Scan on t1 v_1
                  Recheck Cond: (id < 10)
                  ->  Bitmap Index Scan on t1_pkey
                        Index Cond: (id < 10)
-   InitPlan 3 (returns $2)
+   InitPlan 3 (returns $3)
      ->  Result
-           InitPlan 2 (returns $1)
+           InitPlan 2 (returns $2)
              ->  Limit
                    ->  Index Only Scan Backward using t1_pkey on t1 v_2
                          Index Cond: ((id IS NOT NULL) AND (id < 10))
@@ -980,14 +981,14 @@ error hint:
                                QUERY PLAN                               
 ------------------------------------------------------------------------
  Index Only Scan using t1_pkey on t1
-   Index Cond: (id = $2)
+   Index Cond: (id = $3)
    InitPlan 2 (returns $1)
      ->  Result
            InitPlan 1 (returns $0)
              ->  Limit
                    ->  Index Only Scan Backward using t1_pkey on t1 v_1
                          Index Cond: ((id IS NOT NULL) AND (id < 10))
-   InitPlan 3 (returns $2)
+   InitPlan 3 (returns $3)
      ->  Aggregate
            ->  Bitmap Heap Scan on t1 v_2
                  Recheck Cond: (id < 10)
@@ -1037,14 +1038,14 @@ error hint:
                     QUERY PLAN                    
 --------------------------------------------------
  Index Only Scan using t1_pkey on t1
-   Index Cond: (id = $1)
-   InitPlan 1 (returns $0)
+   Index Cond: (id = $3)
+   InitPlan 1 (returns $1)
      ->  Aggregate
            ->  Bitmap Heap Scan on t1 v_1
                  Recheck Cond: (id < 10)
                  ->  Bitmap Index Scan on t1_pkey
                        Index Cond: (id < 10)
-   InitPlan 2 (returns $1)
+   InitPlan 2 (returns $3)
      ->  Aggregate
            ->  Bitmap Heap Scan on t1 v_2
                  Recheck Cond: (id < 10)
@@ -1065,21 +1066,21 @@ error hint:
                                QUERY PLAN                               
 ------------------------------------------------------------------------
  Bitmap Heap Scan on t1
-   Recheck Cond: (id = $2)
-   InitPlan 1 (returns $0)
+   Recheck Cond: (id = $3)
+   InitPlan 1 (returns $1)
      ->  Aggregate
            ->  Bitmap Heap Scan on t1 v_1
                  Recheck Cond: (id < 10)
                  ->  Bitmap Index Scan on t1_pkey
                        Index Cond: (id < 10)
-   InitPlan 3 (returns $2)
+   InitPlan 3 (returns $3)
      ->  Result
-           InitPlan 2 (returns $1)
+           InitPlan 2 (returns $2)
              ->  Limit
                    ->  Index Only Scan Backward using t1_pkey on t1 v_2
                          Index Cond: ((id IS NOT NULL) AND (id < 10))
    ->  Bitmap Index Scan on t1_pkey
-         Index Cond: (id = $2)
+         Index Cond: (id = $3)
 (16 rows)
 
 /*+BitmapScan(v_2)BitmapScan(t1)*/
@@ -1095,21 +1096,21 @@ error hint:
                                QUERY PLAN                               
 ------------------------------------------------------------------------
  Bitmap Heap Scan on t1
-   Recheck Cond: (id = $2)
+   Recheck Cond: (id = $3)
    InitPlan 2 (returns $1)
      ->  Result
            InitPlan 1 (returns $0)
              ->  Limit
                    ->  Index Only Scan Backward using t1_pkey on t1 v_1
                          Index Cond: ((id IS NOT NULL) AND (id < 10))
-   InitPlan 3 (returns $2)
+   InitPlan 3 (returns $3)
      ->  Aggregate
            ->  Bitmap Heap Scan on t1 v_2
                  Recheck Cond: (id < 10)
                  ->  Bitmap Index Scan on t1_pkey
                        Index Cond: (id < 10)
    ->  Bitmap Index Scan on t1_pkey
-         Index Cond: (id = $2)
+         Index Cond: (id = $3)
 (16 rows)
 
 /*+BitmapScan(v_1)BitmapScan(v_2)BitmapScan(t1)*/
@@ -1126,21 +1127,21 @@ error hint:
                     QUERY PLAN                    
 --------------------------------------------------
  Bitmap Heap Scan on t1
-   Recheck Cond: (id = $1)
-   InitPlan 1 (returns $0)
+   Recheck Cond: (id = $3)
+   InitPlan 1 (returns $1)
      ->  Aggregate
            ->  Bitmap Heap Scan on t1 v_1
                  Recheck Cond: (id < 10)
                  ->  Bitmap Index Scan on t1_pkey
                        Index Cond: (id < 10)
-   InitPlan 2 (returns $1)
+   InitPlan 2 (returns $3)
      ->  Aggregate
            ->  Bitmap Heap Scan on t1 v_2
                  Recheck Cond: (id < 10)
                  ->  Bitmap Index Scan on t1_pkey
                        Index Cond: (id < 10)
    ->  Bitmap Index Scan on t1_pkey
-         Index Cond: (id = $1)
+         Index Cond: (id = $3)
 (16 rows)
 
 -- full scan hint pattern test
index 00432ac..954783a 100644 (file)
@@ -12,9 +12,11 @@ CREATE EXTENSION pg_hint_plan;
 -- No.A-1-2-3
 DROP EXTENSION pg_hint_plan;
 -- No.A-1-1-4
-CREATE EXTENSION pg_hint_plan SCHEMA other_name;
+CREATE SCHEMA other_schema;
+CREATE EXTENSION pg_hint_plan SCHEMA other_schema;
 ERROR:  extension "pg_hint_plan" must be installed in schema "hint_plan"
 CREATE EXTENSION pg_hint_plan;
+DROP SCHEMA other_schema;
 ----
 ---- No. A-5-1 comment pattern
 ----
@@ -3307,39 +3309,43 @@ NestLoop(t1 t1)
 -- No. A-12-1-1
 -- No. A-12-2-1
 SELECT name, setting FROM settings;
-           name            |  setting  
----------------------------+-----------
- geqo                      | on
- geqo_effort               | 5
- geqo_generations          | 0
- geqo_pool_size            | 0
- geqo_seed                 | 0
- geqo_selection_bias       | 2
- geqo_threshold            | 12
- constraint_exclusion      | partition
- cursor_tuple_fraction     | 0.1
- default_statistics_target | 100
- from_collapse_limit       | 8
- join_collapse_limit       | 8
- cpu_index_tuple_cost      | 0.005
- cpu_operator_cost         | 0.0025
- cpu_tuple_cost            | 0.01
- effective_cache_size      | 16384
- random_page_cost          | 4
- seq_page_cost             | 1
- enable_bitmapscan         | on
- enable_hashagg            | on
- enable_hashjoin           | on
- enable_indexonlyscan      | on
- enable_indexscan          | on
- enable_material           | on
- enable_mergejoin          | on
- enable_nestloop           | on
- enable_seqscan            | on
- enable_sort               | on
- enable_tidscan            | on
- client_min_messages       | log
-(30 rows)
+            name            |  setting  
+----------------------------+-----------
+ geqo                       | on
+ geqo_effort                | 5
+ geqo_generations           | 0
+ geqo_pool_size             | 0
+ geqo_seed                  | 0
+ geqo_selection_bias        | 2
+ geqo_threshold             | 12
+ constraint_exclusion       | partition
+ cursor_tuple_fraction      | 0.1
+ default_statistics_target  | 100
+ force_parallel_mode        | off
+ from_collapse_limit        | 8
+ join_collapse_limit        | 8
+ cpu_index_tuple_cost       | 0.005
+ cpu_operator_cost          | 0.0025
+ cpu_tuple_cost             | 0.01
+ effective_cache_size       | 16384
+ min_parallel_relation_size | 1024
+ parallel_setup_cost        | 1000
+ parallel_tuple_cost        | 0.1
+ random_page_cost           | 4
+ seq_page_cost              | 1
+ enable_bitmapscan          | on
+ enable_hashagg             | on
+ enable_hashjoin            | on
+ enable_indexonlyscan       | on
+ enable_indexscan           | on
+ enable_material            | on
+ enable_mergejoin           | on
+ enable_nestloop            | on
+ enable_seqscan             | on
+ enable_sort                | on
+ enable_tidscan             | on
+ client_min_messages        | log
+(34 rows)
 
 SET pg_hint_plan.parse_messages TO error;
 /*+Set(enable_seqscan off)Set(geqo_threshold 100)SeqScan(t1)MergeJoin(t1 t2)NestLoop(t1 t1)*/
@@ -3347,39 +3353,43 @@ EXPLAIN (COSTS false) SELECT * FROM s1.t1, s1.t2 WHERE t1.c1 = t2.c1;
 ERROR:  pg_hint_plan: hint syntax error at or near "NestLoop(t1 t1)"
 DETAIL:  Relation name "t1" is duplicated.
 SELECT name, setting FROM settings;
-           name            |  setting  
----------------------------+-----------
- geqo                      | on
- geqo_effort               | 5
- geqo_generations          | 0
- geqo_pool_size            | 0
- geqo_seed                 | 0
- geqo_selection_bias       | 2
- geqo_threshold            | 12
- constraint_exclusion      | partition
- cursor_tuple_fraction     | 0.1
- default_statistics_target | 100
- from_collapse_limit       | 8
- join_collapse_limit       | 8
- cpu_index_tuple_cost      | 0.005
- cpu_operator_cost         | 0.0025
- cpu_tuple_cost            | 0.01
- effective_cache_size      | 16384
- random_page_cost          | 4
- seq_page_cost             | 1
- enable_bitmapscan         | on
- enable_hashagg            | on
- enable_hashjoin           | on
- enable_indexonlyscan      | on
- enable_indexscan          | on
- enable_material           | on
- enable_mergejoin          | on
- enable_nestloop           | on
- enable_seqscan            | on
- enable_sort               | on
- enable_tidscan            | on
- client_min_messages       | log
-(30 rows)
+            name            |  setting  
+----------------------------+-----------
+ geqo                       | on
+ geqo_effort                | 5
+ geqo_generations           | 0
+ geqo_pool_size             | 0
+ geqo_seed                  | 0
+ geqo_selection_bias        | 2
+ geqo_threshold             | 12
+ constraint_exclusion       | partition
+ cursor_tuple_fraction      | 0.1
+ default_statistics_target  | 100
+ force_parallel_mode        | off
+ from_collapse_limit        | 8
+ join_collapse_limit        | 8
+ cpu_index_tuple_cost       | 0.005
+ cpu_operator_cost          | 0.0025
+ cpu_tuple_cost             | 0.01
+ effective_cache_size       | 16384
+ min_parallel_relation_size | 1024
+ parallel_setup_cost        | 1000
+ parallel_tuple_cost        | 0.1
+ random_page_cost           | 4
+ seq_page_cost              | 1
+ enable_bitmapscan          | on
+ enable_hashagg             | on
+ enable_hashjoin            | on
+ enable_indexonlyscan       | on
+ enable_indexscan           | on
+ enable_material            | on
+ enable_mergejoin           | on
+ enable_nestloop            | on
+ enable_seqscan             | on
+ enable_sort                | on
+ enable_tidscan             | on
+ client_min_messages        | log
+(34 rows)
 
 /*+Set(enable_seqscan off)Set(geqo_threshold 100)SeqScan(t1)MergeJoin(t1 t2)*/
 EXPLAIN (COSTS false) SELECT * FROM s1.t1, s1.t2 WHERE t1.c1 = t2.c1;
@@ -3406,39 +3416,43 @@ error hint:
 -- No. A-12-1-2
 -- No. A-12-2-2
 SELECT name, setting FROM settings;
-           name            |  setting  
----------------------------+-----------
- geqo                      | on
- geqo_effort               | 5
- geqo_generations          | 0
- geqo_pool_size            | 0
- geqo_seed                 | 0
- geqo_selection_bias       | 2
- geqo_threshold            | 12
- constraint_exclusion      | partition
- cursor_tuple_fraction     | 0.1
- default_statistics_target | 100
- from_collapse_limit       | 8
- join_collapse_limit       | 8
- cpu_index_tuple_cost      | 0.005
- cpu_operator_cost         | 0.0025
- cpu_tuple_cost            | 0.01
- effective_cache_size      | 16384
- random_page_cost          | 4
- seq_page_cost             | 1
- enable_bitmapscan         | on
- enable_hashagg            | on
- enable_hashjoin           | on
- enable_indexonlyscan      | on
- enable_indexscan          | on
- enable_material           | on
- enable_mergejoin          | on
- enable_nestloop           | on
- enable_seqscan            | on
- enable_sort               | on
- enable_tidscan            | on
- client_min_messages       | log
-(30 rows)
+            name            |  setting  
+----------------------------+-----------
+ geqo                       | on
+ geqo_effort                | 5
+ geqo_generations           | 0
+ geqo_pool_size             | 0
+ geqo_seed                  | 0
+ geqo_selection_bias        | 2
+ geqo_threshold             | 12
+ constraint_exclusion       | partition
+ cursor_tuple_fraction      | 0.1
+ default_statistics_target  | 100
+ force_parallel_mode        | off
+ from_collapse_limit        | 8
+ join_collapse_limit        | 8
+ cpu_index_tuple_cost       | 0.005
+ cpu_operator_cost          | 0.0025
+ cpu_tuple_cost             | 0.01
+ effective_cache_size       | 16384
+ min_parallel_relation_size | 1024
+ parallel_setup_cost        | 1000
+ parallel_tuple_cost        | 0.1
+ random_page_cost           | 4
+ seq_page_cost              | 1
+ enable_bitmapscan          | on
+ enable_hashagg             | on
+ enable_hashjoin            | on
+ enable_indexonlyscan       | on
+ enable_indexscan           | on
+ enable_material            | on
+ enable_mergejoin           | on
+ enable_nestloop            | on
+ enable_seqscan             | on
+ enable_sort                | on
+ enable_tidscan             | on
+ client_min_messages        | log
+(34 rows)
 
 SET pg_hint_plan.parse_messages TO error;
 /*+Set(enable_seqscan off)Set(geqo_threshold 100)SeqScan(t1)MergeJoin(t1 t2)NestLoop(t1 t1)*/
@@ -3446,39 +3460,43 @@ EXPLAIN (COSTS false) SELECT * FROM s1.t1, s1.t2 WHERE t1.c1 = t2.c1;
 ERROR:  pg_hint_plan: hint syntax error at or near "NestLoop(t1 t1)"
 DETAIL:  Relation name "t1" is duplicated.
 SELECT name, setting FROM settings;
-           name            |  setting  
----------------------------+-----------
- geqo                      | on
- geqo_effort               | 5
- geqo_generations          | 0
- geqo_pool_size            | 0
- geqo_seed                 | 0
- geqo_selection_bias       | 2
- geqo_threshold            | 12
- constraint_exclusion      | partition
- cursor_tuple_fraction     | 0.1
- default_statistics_target | 100
- from_collapse_limit       | 8
- join_collapse_limit       | 8
- cpu_index_tuple_cost      | 0.005
- cpu_operator_cost         | 0.0025
- cpu_tuple_cost            | 0.01
- effective_cache_size      | 16384
- random_page_cost          | 4
- seq_page_cost             | 1
- enable_bitmapscan         | on
- enable_hashagg            | on
- enable_hashjoin           | on
- enable_indexonlyscan      | on
- enable_indexscan          | on
- enable_material           | on
- enable_mergejoin          | on
- enable_nestloop           | on
- enable_seqscan            | on
- enable_sort               | on
- enable_tidscan            | on
- client_min_messages       | log
-(30 rows)
+            name            |  setting  
+----------------------------+-----------
+ geqo                       | on
+ geqo_effort                | 5
+ geqo_generations           | 0
+ geqo_pool_size             | 0
+ geqo_seed                  | 0
+ geqo_selection_bias        | 2
+ geqo_threshold             | 12
+ constraint_exclusion       | partition
+ cursor_tuple_fraction      | 0.1
+ default_statistics_target  | 100
+ force_parallel_mode        | off
+ from_collapse_limit        | 8
+ join_collapse_limit        | 8
+ cpu_index_tuple_cost       | 0.005
+ cpu_operator_cost          | 0.0025
+ cpu_tuple_cost             | 0.01
+ effective_cache_size       | 16384
+ min_parallel_relation_size | 1024
+ parallel_setup_cost        | 1000
+ parallel_tuple_cost        | 0.1
+ random_page_cost           | 4
+ seq_page_cost              | 1
+ enable_bitmapscan          | on
+ enable_hashagg             | on
+ enable_hashjoin            | on
+ enable_indexonlyscan       | on
+ enable_indexscan           | on
+ enable_material            | on
+ enable_mergejoin           | on
+ enable_nestloop            | on
+ enable_seqscan             | on
+ enable_sort                | on
+ enable_tidscan             | on
+ client_min_messages        | log
+(34 rows)
 
 EXPLAIN (COSTS false) EXECUTE p1;
              QUERY PLAN             
@@ -3494,39 +3512,43 @@ EXPLAIN (COSTS false) EXECUTE p1;
 -- No. A-12-1-3
 -- No. A-12-2-3
 SELECT name, setting FROM settings;
-           name            |  setting  
----------------------------+-----------
- geqo                      | on
- geqo_effort               | 5
- geqo_generations          | 0
- geqo_pool_size            | 0
- geqo_seed                 | 0
- geqo_selection_bias       | 2
- geqo_threshold            | 12
- constraint_exclusion      | partition
- cursor_tuple_fraction     | 0.1
- default_statistics_target | 100
- from_collapse_limit       | 8
- join_collapse_limit       | 8
- cpu_index_tuple_cost      | 0.005
- cpu_operator_cost         | 0.0025
- cpu_tuple_cost            | 0.01
- effective_cache_size      | 16384
- random_page_cost          | 4
- seq_page_cost             | 1
- enable_bitmapscan         | on
- enable_hashagg            | on
- enable_hashjoin           | on
- enable_indexonlyscan      | on
- enable_indexscan          | on
- enable_material           | on
- enable_mergejoin          | on
- enable_nestloop           | on
- enable_seqscan            | on
- enable_sort               | on
- enable_tidscan            | on
- client_min_messages       | log
-(30 rows)
+            name            |  setting  
+----------------------------+-----------
+ geqo                       | on
+ geqo_effort                | 5
+ geqo_generations           | 0
+ geqo_pool_size             | 0
+ geqo_seed                  | 0
+ geqo_selection_bias        | 2
+ geqo_threshold             | 12
+ constraint_exclusion       | partition
+ cursor_tuple_fraction      | 0.1
+ default_statistics_target  | 100
+ force_parallel_mode        | off
+ from_collapse_limit        | 8
+ join_collapse_limit        | 8
+ cpu_index_tuple_cost       | 0.005
+ cpu_operator_cost          | 0.0025
+ cpu_tuple_cost             | 0.01
+ effective_cache_size       | 16384
+ min_parallel_relation_size | 1024
+ parallel_setup_cost        | 1000
+ parallel_tuple_cost        | 0.1
+ random_page_cost           | 4
+ seq_page_cost              | 1
+ enable_bitmapscan          | on
+ enable_hashagg             | on
+ enable_hashjoin            | on
+ enable_indexonlyscan       | on
+ enable_indexscan           | on
+ enable_material            | on
+ enable_mergejoin           | on
+ enable_nestloop            | on
+ enable_seqscan             | on
+ enable_sort                | on
+ enable_tidscan             | on
+ client_min_messages        | log
+(34 rows)
 
 SET pg_hint_plan.parse_messages TO error;
 EXPLAIN (COSTS false) EXECUTE p2;
@@ -3565,76 +3587,84 @@ EXPLAIN (COSTS false) EXECUTE p1;
 (6 rows)
 
 SELECT name, setting FROM settings;
-           name            |  setting  
----------------------------+-----------
- geqo                      | on
- geqo_effort               | 5
- geqo_generations          | 0
- geqo_pool_size            | 0
- geqo_seed                 | 0
- geqo_selection_bias       | 2
- geqo_threshold            | 12
- constraint_exclusion      | partition
- cursor_tuple_fraction     | 0.1
- default_statistics_target | 100
- from_collapse_limit       | 8
- join_collapse_limit       | 8
- cpu_index_tuple_cost      | 0.005
- cpu_operator_cost         | 0.0025
- cpu_tuple_cost            | 0.01
- effective_cache_size      | 16384
- random_page_cost          | 4
- seq_page_cost             | 1
- enable_bitmapscan         | on
- enable_hashagg            | on
- enable_hashjoin           | on
- enable_indexonlyscan      | on
- enable_indexscan          | on
- enable_material           | on
- enable_mergejoin          | on
- enable_nestloop           | on
- enable_seqscan            | on
- enable_sort               | on
- enable_tidscan            | on
- client_min_messages       | log
-(30 rows)
+            name            |  setting  
+----------------------------+-----------
+ geqo                       | on
+ geqo_effort                | 5
+ geqo_generations           | 0
+ geqo_pool_size             | 0
+ geqo_seed                  | 0
+ geqo_selection_bias        | 2
+ geqo_threshold             | 12
+ constraint_exclusion       | partition
+ cursor_tuple_fraction      | 0.1
+ default_statistics_target  | 100
+ force_parallel_mode        | off
+ from_collapse_limit        | 8
+ join_collapse_limit        | 8
+ cpu_index_tuple_cost       | 0.005
+ cpu_operator_cost          | 0.0025
+ cpu_tuple_cost             | 0.01
+ effective_cache_size       | 16384
+ min_parallel_relation_size | 1024
+ parallel_setup_cost        | 1000
+ parallel_tuple_cost        | 0.1
+ random_page_cost           | 4
+ seq_page_cost              | 1
+ enable_bitmapscan          | on
+ enable_hashagg             | on
+ enable_hashjoin            | on
+ enable_indexonlyscan       | on
+ enable_indexscan           | on
+ enable_material            | on
+ enable_mergejoin           | on
+ enable_nestloop            | on
+ enable_seqscan             | on
+ enable_sort                | on
+ enable_tidscan             | on
+ client_min_messages        | log
+(34 rows)
 
 -- No. A-12-1-4
 -- No. A-12-2-4
 SELECT name, setting FROM settings;
-           name            |  setting  
----------------------------+-----------
- geqo                      | on
- geqo_effort               | 5
- geqo_generations          | 0
- geqo_pool_size            | 0
- geqo_seed                 | 0
- geqo_selection_bias       | 2
- geqo_threshold            | 12
- constraint_exclusion      | partition
- cursor_tuple_fraction     | 0.1
- default_statistics_target | 100
- from_collapse_limit       | 8
- join_collapse_limit       | 8
- cpu_index_tuple_cost      | 0.005
- cpu_operator_cost         | 0.0025
- cpu_tuple_cost            | 0.01
- effective_cache_size      | 16384
- random_page_cost          | 4
- seq_page_cost             | 1
- enable_bitmapscan         | on
- enable_hashagg            | on
- enable_hashjoin           | on
- enable_indexonlyscan      | on
- enable_indexscan          | on
- enable_material           | on
- enable_mergejoin          | on
- enable_nestloop           | on
- enable_seqscan            | on
- enable_sort               | on
- enable_tidscan            | on
- client_min_messages       | log
-(30 rows)
+            name            |  setting  
+----------------------------+-----------
+ geqo                       | on
+ geqo_effort                | 5
+ geqo_generations           | 0
+ geqo_pool_size             | 0
+ geqo_seed                  | 0
+ geqo_selection_bias        | 2
+ geqo_threshold             | 12
+ constraint_exclusion       | partition
+ cursor_tuple_fraction      | 0.1
+ default_statistics_target  | 100
+ force_parallel_mode        | off
+ from_collapse_limit        | 8
+ join_collapse_limit        | 8
+ cpu_index_tuple_cost       | 0.005
+ cpu_operator_cost          | 0.0025
+ cpu_tuple_cost             | 0.01
+ effective_cache_size       | 16384
+ min_parallel_relation_size | 1024
+ parallel_setup_cost        | 1000
+ parallel_tuple_cost        | 0.1
+ random_page_cost           | 4
+ seq_page_cost              | 1
+ enable_bitmapscan          | on
+ enable_hashagg             | on
+ enable_hashjoin            | on
+ enable_indexonlyscan       | on
+ enable_indexscan           | on
+ enable_material            | on
+ enable_mergejoin           | on
+ enable_nestloop            | on
+ enable_seqscan             | on
+ enable_sort                | on
+ enable_tidscan             | on
+ client_min_messages        | log
+(34 rows)
 
 SET pg_hint_plan.parse_messages TO error;
 EXPLAIN (COSTS false) EXECUTE p2;
@@ -3651,39 +3681,43 @@ EXPLAIN (COSTS false) EXECUTE p1;
 (6 rows)
 
 SELECT name, setting FROM settings;
-           name            |  setting  
----------------------------+-----------
- geqo                      | on
- geqo_effort               | 5
- geqo_generations          | 0
- geqo_pool_size            | 0
- geqo_seed                 | 0
- geqo_selection_bias       | 2
- geqo_threshold            | 12
- constraint_exclusion      | partition
- cursor_tuple_fraction     | 0.1
- default_statistics_target | 100
- from_collapse_limit       | 8
- join_collapse_limit       | 8
- cpu_index_tuple_cost      | 0.005
- cpu_operator_cost         | 0.0025
- cpu_tuple_cost            | 0.01
- effective_cache_size      | 16384
- random_page_cost          | 4
- seq_page_cost             | 1
- enable_bitmapscan         | on
- enable_hashagg            | on
- enable_hashjoin           | on
- enable_indexonlyscan      | on
- enable_indexscan          | on
- enable_material           | on
- enable_mergejoin          | on
- enable_nestloop           | on
- enable_seqscan            | on
- enable_sort               | on
- enable_tidscan            | on
- client_min_messages       | log
-(30 rows)
+            name            |  setting  
+----------------------------+-----------
+ geqo                       | on
+ geqo_effort                | 5
+ geqo_generations           | 0
+ geqo_pool_size             | 0
+ geqo_seed                  | 0
+ geqo_selection_bias        | 2
+ geqo_threshold             | 12
+ constraint_exclusion       | partition
+ cursor_tuple_fraction      | 0.1
+ default_statistics_target  | 100
+ force_parallel_mode        | off
+ from_collapse_limit        | 8
+ join_collapse_limit        | 8
+ cpu_index_tuple_cost       | 0.005
+ cpu_operator_cost          | 0.0025
+ cpu_tuple_cost             | 0.01
+ effective_cache_size       | 16384
+ min_parallel_relation_size | 1024
+ parallel_setup_cost        | 1000
+ parallel_tuple_cost        | 0.1
+ random_page_cost           | 4
+ seq_page_cost              | 1
+ enable_bitmapscan          | on
+ enable_hashagg             | on
+ enable_hashjoin            | on
+ enable_indexonlyscan       | on
+ enable_indexscan           | on
+ enable_material            | on
+ enable_mergejoin           | on
+ enable_nestloop            | on
+ enable_seqscan             | on
+ enable_sort                | on
+ enable_tidscan             | on
+ client_min_messages        | log
+(34 rows)
 
 DEALLOCATE p1;
 SET pg_hint_plan.parse_messages TO LOG;
@@ -3715,39 +3749,43 @@ EXPLAIN (COSTS false) SELECT * FROM s1.t1, s1.t2 WHERE t1.c1 = t2.c1;
 (5 rows)
 
 SELECT name, setting FROM settings;
-           name            |  setting  
----------------------------+-----------
- geqo                      | on
- geqo_effort               | 5
- geqo_generations          | 0
- geqo_pool_size            | 0
- geqo_seed                 | 0
- geqo_selection_bias       | 2
- geqo_threshold            | 12
- constraint_exclusion      | partition
- cursor_tuple_fraction     | 0.1
- default_statistics_target | 100
- from_collapse_limit       | 8
- join_collapse_limit       | 8
- cpu_index_tuple_cost      | 0.005
- cpu_operator_cost         | 0.0025
- cpu_tuple_cost            | 0.01
- effective_cache_size      | 16384
- random_page_cost          | 4
- seq_page_cost             | 1
- enable_bitmapscan         | on
- enable_hashagg            | on
- enable_hashjoin           | on
- enable_indexonlyscan      | on
- enable_indexscan          | off
- enable_material           | on
- enable_mergejoin          | off
- enable_nestloop           | on
- enable_seqscan            | on
- enable_sort               | on
- enable_tidscan            | on
- client_min_messages       | log
-(30 rows)
+            name            |  setting  
+----------------------------+-----------
+ geqo                       | on
+ geqo_effort                | 5
+ geqo_generations           | 0
+ geqo_pool_size             | 0
+ geqo_seed                  | 0
+ geqo_selection_bias        | 2
+ geqo_threshold             | 12
+ constraint_exclusion       | partition
+ cursor_tuple_fraction      | 0.1
+ default_statistics_target  | 100
+ force_parallel_mode        | off
+ from_collapse_limit        | 8
+ join_collapse_limit        | 8
+ cpu_index_tuple_cost       | 0.005
+ cpu_operator_cost          | 0.0025
+ cpu_tuple_cost             | 0.01
+ effective_cache_size       | 16384
+ min_parallel_relation_size | 1024
+ parallel_setup_cost        | 1000
+ parallel_tuple_cost        | 0.1
+ random_page_cost           | 4
+ seq_page_cost              | 1
+ enable_bitmapscan          | on
+ enable_hashagg             | on
+ enable_hashjoin            | on
+ enable_indexonlyscan       | on
+ enable_indexscan           | off
+ enable_material            | on
+ enable_mergejoin           | off
+ enable_nestloop            | on
+ enable_seqscan             | on
+ enable_sort                | on
+ enable_tidscan             | on
+ client_min_messages        | log
+(34 rows)
 
 /*+Set(enable_indexscan on)Set(geqo_threshold 100)IndexScan(t2)MergeJoin(t1 t2)Leading(t2 t1)*/
 EXPLAIN (COSTS false) SELECT * FROM s1.t1, s1.t2 WHERE t1.c1 = t2.c1;
@@ -3771,39 +3809,43 @@ error hint:
 (4 rows)
 
 SELECT name, setting FROM settings;
-           name            |  setting  
----------------------------+-----------
- geqo                      | on
- geqo_effort               | 5
- geqo_generations          | 0
- geqo_pool_size            | 0
- geqo_seed                 | 0
- geqo_selection_bias       | 2
- geqo_threshold            | 12
- constraint_exclusion      | partition
- cursor_tuple_fraction     | 0.1
- default_statistics_target | 100
- from_collapse_limit       | 8
- join_collapse_limit       | 8
- cpu_index_tuple_cost      | 0.005
- cpu_operator_cost         | 0.0025
- cpu_tuple_cost            | 0.01
- effective_cache_size      | 16384
- random_page_cost          | 4
- seq_page_cost             | 1
- enable_bitmapscan         | on
- enable_hashagg            | on
- enable_hashjoin           | on
- enable_indexonlyscan      | on
- enable_indexscan          | off
- enable_material           | on
- enable_mergejoin          | off
- enable_nestloop           | on
- enable_seqscan            | on
- enable_sort               | on
- enable_tidscan            | on
- client_min_messages       | log
-(30 rows)
+            name            |  setting  
+----------------------------+-----------
+ geqo                       | on
+ geqo_effort                | 5
+ geqo_generations           | 0
+ geqo_pool_size             | 0
+ geqo_seed                  | 0
+ geqo_selection_bias        | 2
+ geqo_threshold             | 12
+ constraint_exclusion       | partition
+ cursor_tuple_fraction      | 0.1
+ default_statistics_target  | 100
+ force_parallel_mode        | off
+ from_collapse_limit        | 8
+ join_collapse_limit        | 8
+ cpu_index_tuple_cost       | 0.005
+ cpu_operator_cost          | 0.0025
+ cpu_tuple_cost             | 0.01
+ effective_cache_size       | 16384
+ min_parallel_relation_size | 1024
+ parallel_setup_cost        | 1000
+ parallel_tuple_cost        | 0.1
+ random_page_cost           | 4
+ seq_page_cost              | 1
+ enable_bitmapscan          | on
+ enable_hashagg             | on
+ enable_hashjoin            | on
+ enable_indexonlyscan       | on
+ enable_indexscan           | off
+ enable_material            | on
+ enable_mergejoin           | off
+ enable_nestloop            | on
+ enable_seqscan             | on
+ enable_sort                | on
+ enable_tidscan             | on
+ client_min_messages        | log
+(34 rows)
 
 EXPLAIN (COSTS false) SELECT * FROM s1.t1, s1.t2 WHERE t1.c1 = t2.c1;
           QUERY PLAN          
@@ -3829,39 +3871,43 @@ EXPLAIN (COSTS false) SELECT * FROM s1.t1, s1.t2 WHERE t1.c1 = t2.c1;
 (5 rows)
 
 SELECT name, setting FROM settings;
-           name            |  setting  
----------------------------+-----------
- geqo                      | on
- geqo_effort               | 5
- geqo_generations          | 0
- geqo_pool_size            | 0
- geqo_seed                 | 0
- geqo_selection_bias       | 2
- geqo_threshold            | 12
- constraint_exclusion      | partition
- cursor_tuple_fraction     | 0.1
- default_statistics_target | 100
- from_collapse_limit       | 8
- join_collapse_limit       | 8
- cpu_index_tuple_cost      | 0.005
- cpu_operator_cost         | 0.0025
- cpu_tuple_cost            | 0.01
- effective_cache_size      | 16384
- random_page_cost          | 4
- seq_page_cost             | 1
- enable_bitmapscan         | on
- enable_hashagg            | on
- enable_hashjoin           | on
- enable_indexonlyscan      | on
- enable_indexscan          | off
- enable_material           | on
- enable_mergejoin          | off
- enable_nestloop           | on
- enable_seqscan            | on
- enable_sort               | on
- enable_tidscan            | on
- client_min_messages       | log
-(30 rows)
+            name            |  setting  
+----------------------------+-----------
+ geqo                       | on
+ geqo_effort                | 5
+ geqo_generations           | 0
+ geqo_pool_size             | 0
+ geqo_seed                  | 0
+ geqo_selection_bias        | 2
+ geqo_threshold             | 12
+ constraint_exclusion       | partition
+ cursor_tuple_fraction      | 0.1
+ default_statistics_target  | 100
+ force_parallel_mode        | off
+ from_collapse_limit        | 8
+ join_collapse_limit        | 8
+ cpu_index_tuple_cost       | 0.005
+ cpu_operator_cost          | 0.0025
+ cpu_tuple_cost             | 0.01
+ effective_cache_size       | 16384
+ min_parallel_relation_size | 1024
+ parallel_setup_cost        | 1000
+ parallel_tuple_cost        | 0.1
+ random_page_cost           | 4
+ seq_page_cost              | 1
+ enable_bitmapscan          | on
+ enable_hashagg             | on
+ enable_hashjoin            | on
+ enable_indexonlyscan       | on
+ enable_indexscan           | off
+ enable_material            | on
+ enable_mergejoin           | off
+ enable_nestloop            | on
+ enable_seqscan             | on
+ enable_sort                | on
+ enable_tidscan             | on
+ client_min_messages        | log
+(34 rows)
 
 BEGIN;
 /*+Set(enable_indexscan on)Set(geqo_threshold 100)IndexScan(t2)MergeJoin(t1 t2)Leading(t2 t1)*/
@@ -3888,39 +3934,43 @@ error hint:
 COMMIT;
 BEGIN;
 SELECT name, setting FROM settings;
-           name            |  setting  
----------------------------+-----------
- geqo                      | on
- geqo_effort               | 5
- geqo_generations          | 0
- geqo_pool_size            | 0
- geqo_seed                 | 0
- geqo_selection_bias       | 2
- geqo_threshold            | 12
- constraint_exclusion      | partition
- cursor_tuple_fraction     | 0.1
- default_statistics_target | 100
- from_collapse_limit       | 8
- join_collapse_limit       | 8
- cpu_index_tuple_cost      | 0.005
- cpu_operator_cost         | 0.0025
- cpu_tuple_cost            | 0.01
- effective_cache_size      | 16384
- random_page_cost          | 4
- seq_page_cost             | 1
- enable_bitmapscan         | on
- enable_hashagg            | on
- enable_hashjoin           | on
- enable_indexonlyscan      | on
- enable_indexscan          | off
- enable_material           | on
- enable_mergejoin          | off
- enable_nestloop           | on
- enable_seqscan            | on
- enable_sort               | on
- enable_tidscan            | on
- client_min_messages       | log
-(30 rows)
+            name            |  setting  
+----------------------------+-----------
+ geqo                       | on
+ geqo_effort                | 5
+ geqo_generations           | 0
+ geqo_pool_size             | 0
+ geqo_seed                  | 0
+ geqo_selection_bias        | 2
+ geqo_threshold             | 12
+ constraint_exclusion       | partition
+ cursor_tuple_fraction      | 0.1
+ default_statistics_target  | 100
+ force_parallel_mode        | off
+ from_collapse_limit        | 8
+ join_collapse_limit        | 8
+ cpu_index_tuple_cost       | 0.005
+ cpu_operator_cost          | 0.0025
+ cpu_tuple_cost             | 0.01
+ effective_cache_size       | 16384
+ min_parallel_relation_size | 1024
+ parallel_setup_cost        | 1000
+ parallel_tuple_cost        | 0.1
+ random_page_cost           | 4
+ seq_page_cost              | 1
+ enable_bitmapscan          | on
+ enable_hashagg             | on
+ enable_hashjoin            | on
+ enable_indexonlyscan       | on
+ enable_indexscan           | off
+ enable_material            | on
+ enable_mergejoin           | off
+ enable_nestloop            | on
+ enable_seqscan             | on
+ enable_sort                | on
+ enable_tidscan             | on
+ client_min_messages        | log
+(34 rows)
 
 EXPLAIN (COSTS false) SELECT * FROM s1.t1, s1.t2 WHERE t1.c1 = t2.c1;
           QUERY PLAN          
@@ -3947,39 +3997,43 @@ EXPLAIN (COSTS false) SELECT * FROM s1.t1, s1.t2 WHERE t1.c1 = t2.c1;
 (5 rows)
 
 SELECT name, setting FROM settings;
-           name            |  setting  
----------------------------+-----------
- geqo                      | on
- geqo_effort               | 5
- geqo_generations          | 0
- geqo_pool_size            | 0
- geqo_seed                 | 0
- geqo_selection_bias       | 2
- geqo_threshold            | 12
- constraint_exclusion      | partition
- cursor_tuple_fraction     | 0.1
- default_statistics_target | 100
- from_collapse_limit       | 8
- join_collapse_limit       | 8
- cpu_index_tuple_cost      | 0.005
- cpu_operator_cost         | 0.0025
- cpu_tuple_cost            | 0.01
- effective_cache_size      | 16384
- random_page_cost          | 4
- seq_page_cost             | 1
- enable_bitmapscan         | on
- enable_hashagg            | on
- enable_hashjoin           | on
- enable_indexonlyscan      | on
- enable_indexscan          | off
- enable_material           | on
- enable_mergejoin          | off
- enable_nestloop           | on
- enable_seqscan            | on
- enable_sort               | on
- enable_tidscan            | on
- client_min_messages       | log
-(30 rows)
+            name            |  setting  
+----------------------------+-----------
+ geqo                       | on
+ geqo_effort                | 5
+ geqo_generations           | 0
+ geqo_pool_size             | 0
+ geqo_seed                  | 0
+ geqo_selection_bias        | 2
+ geqo_threshold             | 12
+ constraint_exclusion       | partition
+ cursor_tuple_fraction      | 0.1
+ default_statistics_target  | 100
+ force_parallel_mode        | off
+ from_collapse_limit        | 8
+ join_collapse_limit        | 8
+ cpu_index_tuple_cost       | 0.005
+ cpu_operator_cost          | 0.0025
+ cpu_tuple_cost             | 0.01
+ effective_cache_size       | 16384
+ min_parallel_relation_size | 1024
+ parallel_setup_cost        | 1000
+ parallel_tuple_cost        | 0.1
+ random_page_cost           | 4
+ seq_page_cost              | 1
+ enable_bitmapscan          | on
+ enable_hashagg             | on
+ enable_hashjoin            | on
+ enable_indexonlyscan       | on
+ enable_indexscan           | off
+ enable_material            | on
+ enable_mergejoin           | off
+ enable_nestloop            | on
+ enable_seqscan             | on
+ enable_sort                | on
+ enable_tidscan             | on
+ client_min_messages        | log
+(34 rows)
 
 /*+Set(enable_indexscan on)Set(geqo_threshold 100)IndexScan(t2)MergeJoin(t1 t2)Leading(t2 t1)*/
 EXPLAIN (COSTS false) SELECT * FROM s1.t1, s1.t2 WHERE t1.c1 = t2.c1;
@@ -4007,39 +4061,43 @@ SET enable_indexscan TO off;
 SET enable_mergejoin TO off;
 LOAD 'pg_hint_plan';
 SELECT name, setting FROM settings;
-           name            |  setting  
----------------------------+-----------
- geqo                      | on
- geqo_effort               | 5
- geqo_generations          | 0
- geqo_pool_size            | 0
- geqo_seed                 | 0
- geqo_selection_bias       | 2
- geqo_threshold            | 12
- constraint_exclusion      | partition
- cursor_tuple_fraction     | 0.1
- default_statistics_target | 100
- from_collapse_limit       | 8
- join_collapse_limit       | 8
- cpu_index_tuple_cost      | 0.005
- cpu_operator_cost         | 0.0025
- cpu_tuple_cost            | 0.01
- effective_cache_size      | 16384
- random_page_cost          | 4
- seq_page_cost             | 1
- enable_bitmapscan         | on
- enable_hashagg            | on
- enable_hashjoin           | on
- enable_indexonlyscan      | on
- enable_indexscan          | off
- enable_material           | on
- enable_mergejoin          | off
- enable_nestloop           | on
- enable_seqscan            | on
- enable_sort               | on
- enable_tidscan            | on
- client_min_messages       | notice
-(30 rows)
+            name            |  setting  
+----------------------------+-----------
+ geqo                       | on
+ geqo_effort                | 5
+ geqo_generations           | 0
+ geqo_pool_size             | 0
+ geqo_seed                  | 0
+ geqo_selection_bias        | 2
+ geqo_threshold             | 12
+ constraint_exclusion       | partition
+ cursor_tuple_fraction      | 0.1
+ default_statistics_target  | 100
+ force_parallel_mode        | off
+ from_collapse_limit        | 8
+ join_collapse_limit        | 8
+ cpu_index_tuple_cost       | 0.005
+ cpu_operator_cost          | 0.0025
+ cpu_tuple_cost             | 0.01
+ effective_cache_size       | 16384
+ min_parallel_relation_size | 1024
+ parallel_setup_cost        | 1000
+ parallel_tuple_cost        | 0.1
+ random_page_cost           | 4
+ seq_page_cost              | 1
+ enable_bitmapscan          | on
+ enable_hashagg             | on
+ enable_hashjoin            | on
+ enable_indexonlyscan       | on
+ enable_indexscan           | off
+ enable_material            | on
+ enable_mergejoin           | off
+ enable_nestloop            | on
+ enable_seqscan             | on
+ enable_sort                | on
+ enable_tidscan             | on
+ client_min_messages        | notice
+(34 rows)
 
 EXPLAIN (COSTS false) SELECT * FROM s1.t1, s1.t2 WHERE t1.c1 = t2.c1;
           QUERY PLAN          
@@ -4137,10 +4195,6 @@ error hint:
 EXPLAIN (COSTS false) SELECT nested_planner(2) FROM s1.t1 t_1 ORDER BY t_1.c1;
 NOTICE:  nested_planner(2)
 NOTICE:  nested_planner(1)
-CONTEXT:  SQL statement "SELECT /*+ IndexScan(t_1) */ nested_planner(cnt - 1)                 FROM s1.t1 t_1
-         JOIN s1.t2 t_2 ON (t_1.c1 = t_2.c1)
-        ORDER BY t_1.c1 LIMIT 1"
-PL/pgSQL function nested_planner(integer) line 12 at SQL statement
 LOG:  pg_hint_plan:
 used hint:
 IndexScan(t_1)
@@ -4148,10 +4202,6 @@ not used hint:
 duplication hint:
 error hint:
 
-CONTEXT:  SQL statement "SELECT /*+ IndexScan(t_1) */ nested_planner(cnt - 1)                 FROM s1.t1 t_1
-         JOIN s1.t2 t_2 ON (t_1.c1 = t_2.c1)
-        ORDER BY t_1.c1 LIMIT 1"
-PL/pgSQL function nested_planner(integer) line 12 at SQL statement
               QUERY PLAN               
 ---------------------------------------
  Index Only Scan using t1_i1 on t1 t_1
@@ -4161,10 +4211,6 @@ PL/pgSQL function nested_planner(integer) line 12 at SQL statement
 EXPLAIN (COSTS false) SELECT nested_planner(2) FROM s1.t1 t_1 ORDER BY t_1.c1;
 NOTICE:  nested_planner(2)
 NOTICE:  nested_planner(1)
-CONTEXT:  SQL statement "SELECT /*+ IndexScan(t_1) */ nested_planner(cnt - 1)                 FROM s1.t1 t_1
-         JOIN s1.t2 t_2 ON (t_1.c1 = t_2.c1)
-        ORDER BY t_1.c1 LIMIT 1"
-PL/pgSQL function nested_planner(integer) line 12 at SQL statement
 LOG:  pg_hint_plan:
 used hint:
 IndexScan(t_1)
@@ -4172,10 +4218,6 @@ not used hint:
 duplication hint:
 error hint:
 
-CONTEXT:  SQL statement "SELECT /*+ IndexScan(t_1) */ nested_planner(cnt - 1)                 FROM s1.t1 t_1
-         JOIN s1.t2 t_2 ON (t_1.c1 = t_2.c1)
-        ORDER BY t_1.c1 LIMIT 1"
-PL/pgSQL function nested_planner(integer) line 12 at SQL statement
 LOG:  pg_hint_plan:
 used hint:
 not used hint:
@@ -4214,67 +4256,11 @@ $$ LANGUAGE plpgsql IMMUTABLE;
 EXPLAIN (COSTS false) SELECT nested_planner(5) FROM s1.t1 t_1 ORDER BY t_1.c1;
 NOTICE:  nested_planner(5)
 NOTICE:  nested_planner(4)
-CONTEXT:  SQL statement "SELECT /*+ IndexScan(t_1) */ nested_planner(cnt - 1)                 FROM s1.t1 t_1
-         JOIN s1.t2 t_2 ON (t_1.c1 = t_2.c1)
-        ORDER BY t_1.c1 LIMIT 1"
-PL/pgSQL function nested_planner(integer) line 12 at SQL statement
 NOTICE:  nested_planner(3)
-CONTEXT:  SQL statement "SELECT /*+ IndexScan(t_1) */ nested_planner(cnt - 1)                 FROM s1.t1 t_1
-         JOIN s1.t2 t_2 ON (t_1.c1 = t_2.c1)
-        ORDER BY t_1.c1 LIMIT 1"
-PL/pgSQL function nested_planner(integer) line 12 at SQL statement
-SQL statement "SELECT /*+ IndexScan(t_1) */ nested_planner(cnt - 1)                 FROM s1.t1 t_1
-         JOIN s1.t2 t_2 ON (t_1.c1 = t_2.c1)
-        ORDER BY t_1.c1 LIMIT 1"
-PL/pgSQL function nested_planner(integer) line 12 at SQL statement
 NOTICE:  nested_planner(2)
-CONTEXT:  SQL statement "SELECT /*+ IndexScan(t_1) */ nested_planner(cnt - 1)                 FROM s1.t1 t_1
-         JOIN s1.t2 t_2 ON (t_1.c1 = t_2.c1)
-        ORDER BY t_1.c1 LIMIT 1"
-PL/pgSQL function nested_planner(integer) line 12 at SQL statement
-SQL statement "SELECT /*+ IndexScan(t_1) */ nested_planner(cnt - 1)                 FROM s1.t1 t_1
-         JOIN s1.t2 t_2 ON (t_1.c1 = t_2.c1)
-        ORDER BY t_1.c1 LIMIT 1"
-PL/pgSQL function nested_planner(integer) line 12 at SQL statement
-SQL statement "SELECT /*+ IndexScan(t_1) */ nested_planner(cnt - 1)                 FROM s1.t1 t_1
-         JOIN s1.t2 t_2 ON (t_1.c1 = t_2.c1)
-        ORDER BY t_1.c1 LIMIT 1"
-PL/pgSQL function nested_planner(integer) line 12 at SQL statement
 NOTICE:  nested_planner(1)
-CONTEXT:  SQL statement "SELECT /*+ IndexScan(t_1) */ nested_planner(cnt - 1)                 FROM s1.t1 t_1
-         JOIN s1.t2 t_2 ON (t_1.c1 = t_2.c1)
-        ORDER BY t_1.c1 LIMIT 1"
-PL/pgSQL function nested_planner(integer) line 12 at SQL statement
-SQL statement "SELECT /*+ IndexScan(t_1) */ nested_planner(cnt - 1)                 FROM s1.t1 t_1
-         JOIN s1.t2 t_2 ON (t_1.c1 = t_2.c1)
-        ORDER BY t_1.c1 LIMIT 1"
-PL/pgSQL function nested_planner(integer) line 12 at SQL statement
-SQL statement "SELECT /*+ IndexScan(t_1) */ nested_planner(cnt - 1)                 FROM s1.t1 t_1
-         JOIN s1.t2 t_2 ON (t_1.c1 = t_2.c1)
-        ORDER BY t_1.c1 LIMIT 1"
-PL/pgSQL function nested_planner(integer) line 12 at SQL statement
-SQL statement "SELECT /*+ IndexScan(t_1) */ nested_planner(cnt - 1)                 FROM s1.t1 t_1
-         JOIN s1.t2 t_2 ON (t_1.c1 = t_2.c1)
-        ORDER BY t_1.c1 LIMIT 1"
-PL/pgSQL function nested_planner(integer) line 12 at SQL statement
 LOG:  pg_hint_plan:
 no hint
-CONTEXT:  SQL statement "SELECT /*+ IndexScan(t_1) */ nested_planner(cnt - 1)                 FROM s1.t1 t_1
-         JOIN s1.t2 t_2 ON (t_1.c1 = t_2.c1)
-        ORDER BY t_1.c1 LIMIT 1"
-PL/pgSQL function nested_planner(integer) line 12 at SQL statement
-SQL statement "SELECT /*+ IndexScan(t_1) */ nested_planner(cnt - 1)                 FROM s1.t1 t_1
-         JOIN s1.t2 t_2 ON (t_1.c1 = t_2.c1)
-        ORDER BY t_1.c1 LIMIT 1"
-PL/pgSQL function nested_planner(integer) line 12 at SQL statement
-SQL statement "SELECT /*+ IndexScan(t_1) */ nested_planner(cnt - 1)                 FROM s1.t1 t_1
-         JOIN s1.t2 t_2 ON (t_1.c1 = t_2.c1)
-        ORDER BY t_1.c1 LIMIT 1"
-PL/pgSQL function nested_planner(integer) line 12 at SQL statement
-SQL statement "SELECT /*+ IndexScan(t_1) */ nested_planner(cnt - 1)                 FROM s1.t1 t_1
-         JOIN s1.t2 t_2 ON (t_1.c1 = t_2.c1)
-        ORDER BY t_1.c1 LIMIT 1"
-PL/pgSQL function nested_planner(integer) line 12 at SQL statement
 LOG:  pg_hint_plan:
 used hint:
 IndexScan(t_1)
@@ -4282,18 +4268,6 @@ not used hint:
 duplication hint:
 error hint:
 
-CONTEXT:  SQL statement "SELECT /*+ IndexScan(t_1) */ nested_planner(cnt - 1)                 FROM s1.t1 t_1
-         JOIN s1.t2 t_2 ON (t_1.c1 = t_2.c1)
-        ORDER BY t_1.c1 LIMIT 1"
-PL/pgSQL function nested_planner(integer) line 12 at SQL statement
-SQL statement "SELECT /*+ IndexScan(t_1) */ nested_planner(cnt - 1)                 FROM s1.t1 t_1
-         JOIN s1.t2 t_2 ON (t_1.c1 = t_2.c1)
-        ORDER BY t_1.c1 LIMIT 1"
-PL/pgSQL function nested_planner(integer) line 12 at SQL statement
-SQL statement "SELECT /*+ IndexScan(t_1) */ nested_planner(cnt - 1)                 FROM s1.t1 t_1
-         JOIN s1.t2 t_2 ON (t_1.c1 = t_2.c1)
-        ORDER BY t_1.c1 LIMIT 1"
-PL/pgSQL function nested_planner(integer) line 12 at SQL statement
 LOG:  pg_hint_plan:
 used hint:
 IndexScan(t_1)
@@ -4301,14 +4275,6 @@ not used hint:
 duplication hint:
 error hint:
 
-CONTEXT:  SQL statement "SELECT /*+ IndexScan(t_1) */ nested_planner(cnt - 1)                 FROM s1.t1 t_1
-         JOIN s1.t2 t_2 ON (t_1.c1 = t_2.c1)
-        ORDER BY t_1.c1 LIMIT 1"
-PL/pgSQL function nested_planner(integer) line 12 at SQL statement
-SQL statement "SELECT /*+ IndexScan(t_1) */ nested_planner(cnt - 1)                 FROM s1.t1 t_1
-         JOIN s1.t2 t_2 ON (t_1.c1 = t_2.c1)
-        ORDER BY t_1.c1 LIMIT 1"
-PL/pgSQL function nested_planner(integer) line 12 at SQL statement
 LOG:  pg_hint_plan:
 used hint:
 IndexScan(t_1)
@@ -4316,10 +4282,6 @@ not used hint:
 duplication hint:
 error hint:
 
-CONTEXT:  SQL statement "SELECT /*+ IndexScan(t_1) */ nested_planner(cnt - 1)                 FROM s1.t1 t_1
-         JOIN s1.t2 t_2 ON (t_1.c1 = t_2.c1)
-        ORDER BY t_1.c1 LIMIT 1"
-PL/pgSQL function nested_planner(integer) line 12 at SQL statement
               QUERY PLAN               
 ---------------------------------------
  Index Only Scan using t1_i1 on t1 t_1
@@ -4329,49 +4291,9 @@ PL/pgSQL function nested_planner(integer) line 12 at SQL statement
 EXPLAIN (COSTS false) SELECT nested_planner(5) FROM s1.t1 t_1 ORDER BY t_1.c1;
 NOTICE:  nested_planner(5)
 NOTICE:  nested_planner(4)
-CONTEXT:  SQL statement "SELECT /*+ IndexScan(t_1) */ nested_planner(cnt - 1)                 FROM s1.t1 t_1
-         JOIN s1.t2 t_2 ON (t_1.c1 = t_2.c1)
-        ORDER BY t_1.c1 LIMIT 1"
-PL/pgSQL function nested_planner(integer) line 12 at SQL statement
 NOTICE:  nested_planner(3)
-CONTEXT:  SQL statement "SELECT /*+ IndexScan(t_1) */ nested_planner(cnt - 1)                 FROM s1.t1 t_1
-         JOIN s1.t2 t_2 ON (t_1.c1 = t_2.c1)
-        ORDER BY t_1.c1 LIMIT 1"
-PL/pgSQL function nested_planner(integer) line 12 at SQL statement
-SQL statement "SELECT /*+ IndexScan(t_1) */ nested_planner(cnt - 1)                 FROM s1.t1 t_1
-         JOIN s1.t2 t_2 ON (t_1.c1 = t_2.c1)
-        ORDER BY t_1.c1 LIMIT 1"
-PL/pgSQL function nested_planner(integer) line 12 at SQL statement
 NOTICE:  nested_planner(2)
-CONTEXT:  SQL statement "SELECT /*+ IndexScan(t_1) */ nested_planner(cnt - 1)                 FROM s1.t1 t_1
-         JOIN s1.t2 t_2 ON (t_1.c1 = t_2.c1)
-        ORDER BY t_1.c1 LIMIT 1"
-PL/pgSQL function nested_planner(integer) line 12 at SQL statement
-SQL statement "SELECT /*+ IndexScan(t_1) */ nested_planner(cnt - 1)                 FROM s1.t1 t_1
-         JOIN s1.t2 t_2 ON (t_1.c1 = t_2.c1)
-        ORDER BY t_1.c1 LIMIT 1"
-PL/pgSQL function nested_planner(integer) line 12 at SQL statement
-SQL statement "SELECT /*+ IndexScan(t_1) */ nested_planner(cnt - 1)                 FROM s1.t1 t_1
-         JOIN s1.t2 t_2 ON (t_1.c1 = t_2.c1)
-        ORDER BY t_1.c1 LIMIT 1"
-PL/pgSQL function nested_planner(integer) line 12 at SQL statement
 NOTICE:  nested_planner(1)
-CONTEXT:  SQL statement "SELECT /*+ IndexScan(t_1) */ nested_planner(cnt - 1)                 FROM s1.t1 t_1
-         JOIN s1.t2 t_2 ON (t_1.c1 = t_2.c1)
-        ORDER BY t_1.c1 LIMIT 1"
-PL/pgSQL function nested_planner(integer) line 12 at SQL statement
-SQL statement "SELECT /*+ IndexScan(t_1) */ nested_planner(cnt - 1)                 FROM s1.t1 t_1
-         JOIN s1.t2 t_2 ON (t_1.c1 = t_2.c1)
-        ORDER BY t_1.c1 LIMIT 1"
-PL/pgSQL function nested_planner(integer) line 12 at SQL statement
-SQL statement "SELECT /*+ IndexScan(t_1) */ nested_planner(cnt - 1)                 FROM s1.t1 t_1
-         JOIN s1.t2 t_2 ON (t_1.c1 = t_2.c1)
-        ORDER BY t_1.c1 LIMIT 1"
-PL/pgSQL function nested_planner(integer) line 12 at SQL statement
-SQL statement "SELECT /*+ IndexScan(t_1) */ nested_planner(cnt - 1)                 FROM s1.t1 t_1
-         JOIN s1.t2 t_2 ON (t_1.c1 = t_2.c1)
-        ORDER BY t_1.c1 LIMIT 1"
-PL/pgSQL function nested_planner(integer) line 12 at SQL statement
 LOG:  pg_hint_plan:
 used hint:
 IndexScan(t_1)
@@ -4379,22 +4301,6 @@ not used hint:
 duplication hint:
 error hint:
 
-CONTEXT:  SQL statement "SELECT /*+ IndexScan(t_1) */ nested_planner(cnt - 1)                 FROM s1.t1 t_1
-         JOIN s1.t2 t_2 ON (t_1.c1 = t_2.c1)
-        ORDER BY t_1.c1 LIMIT 1"
-PL/pgSQL function nested_planner(integer) line 12 at SQL statement
-SQL statement "SELECT /*+ IndexScan(t_1) */ nested_planner(cnt - 1)                 FROM s1.t1 t_1
-         JOIN s1.t2 t_2 ON (t_1.c1 = t_2.c1)
-        ORDER BY t_1.c1 LIMIT 1"
-PL/pgSQL function nested_planner(integer) line 12 at SQL statement
-SQL statement "SELECT /*+ IndexScan(t_1) */ nested_planner(cnt - 1)                 FROM s1.t1 t_1
-         JOIN s1.t2 t_2 ON (t_1.c1 = t_2.c1)
-        ORDER BY t_1.c1 LIMIT 1"
-PL/pgSQL function nested_planner(integer) line 12 at SQL statement
-SQL statement "SELECT /*+ IndexScan(t_1) */ nested_planner(cnt - 1)                 FROM s1.t1 t_1
-         JOIN s1.t2 t_2 ON (t_1.c1 = t_2.c1)
-        ORDER BY t_1.c1 LIMIT 1"
-PL/pgSQL function nested_planner(integer) line 12 at SQL statement
 LOG:  pg_hint_plan:
 used hint:
 IndexScan(t_1)
@@ -4402,18 +4308,6 @@ not used hint:
 duplication hint:
 error hint:
 
-CONTEXT:  SQL statement "SELECT /*+ IndexScan(t_1) */ nested_planner(cnt - 1)                 FROM s1.t1 t_1
-         JOIN s1.t2 t_2 ON (t_1.c1 = t_2.c1)
-        ORDER BY t_1.c1 LIMIT 1"
-PL/pgSQL function nested_planner(integer) line 12 at SQL statement
-SQL statement "SELECT /*+ IndexScan(t_1) */ nested_planner(cnt - 1)                 FROM s1.t1 t_1
-         JOIN s1.t2 t_2 ON (t_1.c1 = t_2.c1)
-        ORDER BY t_1.c1 LIMIT 1"
-PL/pgSQL function nested_planner(integer) line 12 at SQL statement
-SQL statement "SELECT /*+ IndexScan(t_1) */ nested_planner(cnt - 1)                 FROM s1.t1 t_1
-         JOIN s1.t2 t_2 ON (t_1.c1 = t_2.c1)
-        ORDER BY t_1.c1 LIMIT 1"
-PL/pgSQL function nested_planner(integer) line 12 at SQL statement
 LOG:  pg_hint_plan:
 used hint:
 IndexScan(t_1)
@@ -4421,14 +4315,6 @@ not used hint:
 duplication hint:
 error hint:
 
-CONTEXT:  SQL statement "SELECT /*+ IndexScan(t_1) */ nested_planner(cnt - 1)                 FROM s1.t1 t_1
-         JOIN s1.t2 t_2 ON (t_1.c1 = t_2.c1)
-        ORDER BY t_1.c1 LIMIT 1"
-PL/pgSQL function nested_planner(integer) line 12 at SQL statement
-SQL statement "SELECT /*+ IndexScan(t_1) */ nested_planner(cnt - 1)                 FROM s1.t1 t_1
-         JOIN s1.t2 t_2 ON (t_1.c1 = t_2.c1)
-        ORDER BY t_1.c1 LIMIT 1"
-PL/pgSQL function nested_planner(integer) line 12 at SQL statement
 LOG:  pg_hint_plan:
 used hint:
 IndexScan(t_1)
@@ -4436,10 +4322,6 @@ not used hint:
 duplication hint:
 error hint:
 
-CONTEXT:  SQL statement "SELECT /*+ IndexScan(t_1) */ nested_planner(cnt - 1)                 FROM s1.t1 t_1
-         JOIN s1.t2 t_2 ON (t_1.c1 = t_2.c1)
-        ORDER BY t_1.c1 LIMIT 1"
-PL/pgSQL function nested_planner(integer) line 12 at SQL statement
 LOG:  pg_hint_plan:
 used hint:
 not used hint:
@@ -4474,7 +4356,6 @@ not used hint:
 duplication hint:
 error hint:
 
-CONTEXT:  SQL function "recall_planner" during startup
 LOG:  pg_hint_plan:
 used hint:
 HashJoin(t_1 t_2)
@@ -4506,7 +4387,6 @@ HashJoin(st_1 st_2)
 duplication hint:
 error hint:
 
-CONTEXT:  SQL function "recall_planner" during startup
 LOG:  pg_hint_plan:
 used hint:
 HashJoin(st_1 st_2)
@@ -4538,7 +4418,6 @@ not used hint:
 duplication hint:
 error hint:
 
-CONTEXT:  SQL function "recall_planner" during startup
 LOG:  pg_hint_plan:
 used hint:
 not used hint:
@@ -4569,7 +4448,6 @@ HashJoin(st_1 st_2)
 duplication hint:
 error hint:
 
-CONTEXT:  SQL function "recall_planner" during startup
 LOG:  pg_hint_plan:
 used hint:
 not used hint:
@@ -4594,7 +4472,6 @@ EXPLAIN (COSTS false)
   ORDER BY t_1.c1;
 INFO:  pg_hint_plan: hint syntax error at or near "HashJoin(t_1 t_1)"
 DETAIL:  Relation name "t_1" is duplicated.
-CONTEXT:  SQL function "recall_planner" during startup
 LOG:  pg_hint_plan:
 used hint:
 not used hint:
@@ -4602,7 +4479,6 @@ duplication hint:
 error hint:
 HashJoin(t_1 t_1)
 
-CONTEXT:  SQL function "recall_planner" during startup
 LOG:  pg_hint_plan:
 used hint:
 not used hint:
@@ -4647,7 +4523,6 @@ HashJoin(t_1 t_1)
 duplication hint:
 error hint:
 
-CONTEXT:  SQL function "recall_planner_one_t" during startup
 INFO:  pg_hint_plan: hint syntax error at or near "HashJoin(t_1 t_1)"
 DETAIL:  Relation name "t_1" is duplicated.
 LOG:  pg_hint_plan:
@@ -4677,7 +4552,6 @@ EXPLAIN (COSTS false)
   ORDER BY t_1.c1;
 INFO:  pg_hint_plan: hint syntax error at or near "HashJoin(t_1 t_1)"
 DETAIL:  Relation name "t_1" is duplicated.
-CONTEXT:  SQL function "recall_planner" during startup
 LOG:  pg_hint_plan:
 used hint:
 not used hint:
@@ -4685,7 +4559,6 @@ duplication hint:
 error hint:
 HashJoin(t_1 t_1)
 
-CONTEXT:  SQL function "recall_planner" during startup
 INFO:  pg_hint_plan: hint syntax error at or near "HashJoin(t_1 t_1)"
 DETAIL:  Relation name "t_1" is duplicated.
 LOG:  pg_hint_plan:
@@ -4715,7 +4588,6 @@ INFO:  pg_hint_plan: hint syntax error at or near "MergeJoin(t_1 t_2)HashJoin(t_
 DETAIL:  Conflict join method hint.
 INFO:  pg_hint_plan: hint syntax error at or near "MergeJoin(t_1 t_2)HashJoin(t_1 t_2)"
 DETAIL:  Conflict join method hint.
-CONTEXT:  SQL function "recall_planner" during startup
 LOG:  pg_hint_plan:
 used hint:
 HashJoin(t_1 t_2)
@@ -4724,7 +4596,6 @@ duplication hint:
 MergeJoin(t_1 t_2)
 error hint:
 
-CONTEXT:  SQL function "recall_planner" during startup
 LOG:  pg_hint_plan:
 used hint:
 HashJoin(t_1 t_2)
index f728011..704bcc7 100644 (file)
@@ -3,6 +3,7 @@ SET pg_hint_plan.enable_hint TO on;
 SET pg_hint_plan.debug_print TO on;
 SET client_min_messages TO LOG;
 SET search_path TO public;
+SET max_parallel_workers_per_gather TO 0;
 EXPLAIN (COSTS false) SELECT * FROM s1.t1, s1.t2 WHERE t1.c1 = t2.c1;
              QUERY PLAN             
 ------------------------------------
@@ -2691,7 +2692,7 @@ SELECT max(b3t1.c1) FROM s1.t1 b3t1 WHERE b3t1.ctid = '(1,1)'
                    ->  Tid Scan on t1 b2t1
                          TID Cond: (ctid = '(1,1)'::tid)
                          Filter: ((c1 IS NOT NULL) AND (c1 = 1))
-   InitPlan 4 (returns $3)
+   InitPlan 4 (returns $4)
      ->  Aggregate
            ->  Tid Scan on t1 b3t1
                  TID Cond: (ctid = '(1,1)'::tid)
@@ -2705,7 +2706,7 @@ SELECT max(b3t1.c1) FROM s1.t1 b3t1 WHERE b3t1.ctid = '(1,1)'
                            Join Filter: (bmt1.c1 = bmt2.c1)
                            ->  Tid Scan on t1 bmt1
                                  TID Cond: (ctid = '(1,1)'::tid)
-                                 Filter: (c1 <> $3)
+                                 Filter: (c1 <> $4)
                            ->  Seq Scan on t2 bmt2
                                  Filter: (ctid = '(1,1)'::tid)
                      ->  Tid Scan on t3 bmt3
@@ -2784,7 +2785,7 @@ error hint:
                    ->  Tid Scan on t1 b2t1
                          TID Cond: (ctid = '(1,1)'::tid)
                          Filter: ((c1 IS NOT NULL) AND (c1 = 1))
-   InitPlan 4 (returns $3)
+   InitPlan 4 (returns $4)
      ->  Aggregate
            ->  Tid Scan on t1 b3t1
                  TID Cond: (ctid = '(1,1)'::tid)
@@ -2814,7 +2815,7 @@ error hint:
                Sort Key: bmt1.c1
                ->  Tid Scan on t1 bmt1
                      TID Cond: (ctid = '(1,1)'::tid)
-                     Filter: (c1 <> $3)
+                     Filter: (c1 <> $4)
 (60 rows)
 
 ----
index fdc43f1..f64ab95 100644 (file)
@@ -3,6 +3,7 @@ SET pg_hint_plan.enable_hint TO on;
 SET pg_hint_plan.debug_print TO on;
 SET client_min_messages TO LOG;
 SET search_path TO public;
+SET max_parallel_workers_per_gather TO 0;
 EXPLAIN (COSTS false) SELECT * FROM s1.t1, s1.t2, s1.t3, s1.t4 WHERE t1.c1 = t2.c1 AND t1.c1 = t3.c1 AND t1.c1 = t4.c1;
                    QUERY PLAN                   
 ------------------------------------------------
@@ -2736,7 +2737,7 @@ SELECT max(b3t1.c1) FROM s1.t1 b3t1 WHERE b3t1.ctid = '(1,1)'
                    ->  Tid Scan on t1 b2t1
                          TID Cond: (ctid = '(1,1)'::tid)
                          Filter: ((c1 IS NOT NULL) AND (c1 = 1))
-   InitPlan 4 (returns $3)
+   InitPlan 4 (returns $4)
      ->  Aggregate
            ->  Tid Scan on t1 b3t1
                  TID Cond: (ctid = '(1,1)'::tid)
@@ -2750,7 +2751,7 @@ SELECT max(b3t1.c1) FROM s1.t1 b3t1 WHERE b3t1.ctid = '(1,1)'
                            Join Filter: (bmt1.c1 = bmt2.c1)
                            ->  Tid Scan on t1 bmt1
                                  TID Cond: (ctid = '(1,1)'::tid)
-                                 Filter: (c1 <> $3)
+                                 Filter: (c1 <> $4)
                            ->  Seq Scan on t2 bmt2
                                  Filter: (ctid = '(1,1)'::tid)
                      ->  Tid Scan on t3 bmt3
@@ -2810,7 +2811,7 @@ error hint:
                    ->  Tid Scan on t1 b2t1
                          TID Cond: (ctid = '(1,1)'::tid)
                          Filter: ((c1 IS NOT NULL) AND (c1 = 1))
-   InitPlan 4 (returns $3)
+   InitPlan 4 (returns $4)
      ->  Aggregate
            ->  Tid Scan on t1 b3t1
                  TID Cond: (ctid = '(1,1)'::tid)
@@ -2831,7 +2832,7 @@ error hint:
                      Filter: (ctid = '(1,1)'::tid)
          ->  Tid Scan on t1 bmt1
                TID Cond: (ctid = '(1,1)'::tid)
-               Filter: (c1 <> $3)
+               Filter: (c1 <> $4)
 (46 rows)
 
 ----
index deebe14..18fb63b 100644 (file)
@@ -13,6 +13,7 @@ SET pg_hint_plan.enable_hint TO on;
 SET pg_hint_plan.debug_print TO on;
 SET client_min_messages TO LOG;
 SET search_path TO public;
+SET max_parallel_workers_per_gather TO 0;
 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 >= 1;
      QUERY PLAN      
 ---------------------
@@ -2000,7 +2001,7 @@ SELECT max(b3t1.c1) FROM s1.t1 b3t1 WHERE b3t1.ctid = '(1,1)'
                    ->  Tid Scan on t1 b2t1
                          TID Cond: (ctid = '(1,1)'::tid)
                          Filter: ((c1 IS NOT NULL) AND (c1 = 1))
-   InitPlan 4 (returns $3)
+   InitPlan 4 (returns $4)
      ->  Aggregate
            ->  Tid Scan on t1 b3t1
                  TID Cond: (ctid = '(1,1)'::tid)
@@ -2014,7 +2015,7 @@ SELECT max(b3t1.c1) FROM s1.t1 b3t1 WHERE b3t1.ctid = '(1,1)'
                            Join Filter: (bmt1.c1 = bmt2.c1)
                            ->  Tid Scan on t1 bmt1
                                  TID Cond: (ctid = '(1,1)'::tid)
-                                 Filter: (c1 <> $3)
+                                 Filter: (c1 <> $4)
                            ->  Seq Scan on t2 bmt2
                                  Filter: (ctid = '(1,1)'::tid)
                      ->  Tid Scan on t3 bmt3
@@ -5245,17 +5246,21 @@ error hint:
 (7 rows)
 
 -- No. S-3-10-3
-\! psql contrib_regression -c "EXPLAIN SELECT c4 FROM s1.p1 WHERE c2 * 2 < 100 AND c1 < 10" | grep -v "Planning time:"
+\o results/ut-S.tmpout
+EXPLAIN SELECT c4 FROM s1.p1 WHERE c2 * 2 < 100 AND c1 < 10;
+\o
+\! sql/maskout.sh results/ut-S.tmpout
                         QUERY PLAN                        
 ----------------------------------------------------------
- Append  (cost=0.00..2.75 rows=4 width=10)
-   ->  Seq Scan on p1  (cost=0.00..0.00 rows=1 width=32)
+ Append  (cost=xxx rows=4 width=xxx)
+   ->  Seq Scan on p1  (cost=xxx rows=1 width=xxx)
          Filter: ((c1 < 10) AND ((c2 * 2) < 100))
-   ->  Seq Scan on p1c1  (cost=0.00..2.75 rows=3 width=2)
+   ->  Seq Scan on p1c1  (cost=xxx rows=3 width=xxx)
          Filter: ((c1 < 10) AND ((c2 * 2) < 100))
 (5 rows)
 
-\! psql contrib_regression -c "/*+IndexScan(p1 p1_parent)*/ EXPLAIN SELECT c4 FROM s1.p1 WHERE c2 * 2 < 100 AND c1 < 10" | grep -v "Planning time:"
+\o results/ut-S.tmpout
+/*+IndexScan(p1 p1_parent)*/ EXPLAIN SELECT c4 FROM s1.p1 WHERE c2 * 2 < 100 AND c1 < 10;
 LOG:  available indexes for IndexScan(p1): p1_parent
 LOG:  available indexes for IndexScan(p1c1): p1c1_c4_expr_idx
 LOG:  available indexes for IndexScan(p1c2): p1c2_c4_expr_idx
@@ -5267,17 +5272,20 @@ not used hint:
 duplication hint:
 error hint:
 
+\o
+\! sql/maskout.sh results/ut-S.tmpout
                                      QUERY PLAN                                     
 ------------------------------------------------------------------------------------
- Append  (cost=0.12..20.48 rows=4 width=10)
-   ->  Index Scan using p1_parent on p1  (cost=0.12..8.15 rows=1 width=32)
+ Append  (cost=xxx rows=4 width=xxx)
+   ->  Index Scan using p1_parent on p1  (cost=xxx rows=1 width=xxx)
          Filter: ((c2 * 2) < 100)
-   ->  Index Scan using p1c1_c4_expr_idx on p1c1  (cost=0.14..12.34 rows=3 width=2)
+   ->  Index Scan using p1c1_c4_expr_idx on p1c1  (cost=xxx rows=3 width=xxx)
          Filter: ((c2 * 2) < 100)
 (5 rows)
 
 -- No. S-3-10-4
-\! psql contrib_regression -c "/*+IndexScan(p1 p1_i2)*/ EXPLAIN SELECT c2 FROM s1.p1 WHERE c2 = 1" | grep -v "Planning time:"
+\o results/ut-S.tmpout
+/*+IndexScan(p1 p1_i2)*/ EXPLAIN SELECT c2 FROM s1.p1 WHERE c2 = 1;
 LOG:  available indexes for IndexScan(p1): p1_i2
 LOG:  available indexes for IndexScan(p1c1):
 LOG:  available indexes for IndexScan(p1c2):
@@ -5289,21 +5297,24 @@ not used hint:
 duplication hint:
 error hint:
 
+\o
+\! sql/maskout.sh results/ut-S.tmpout
                                   QUERY PLAN                                  
 ------------------------------------------------------------------------------
- Append  (cost=0.12..30000000014.89 rows=4 width=4)
-   ->  Index Scan using p1_i2 on p1  (cost=0.12..8.14 rows=1 width=4)
+ Append  (cost=xxx rows=4 width=xxx)
+   ->  Index Scan using p1_i2 on p1  (cost=xxx rows=1 width=xxx)
          Index Cond: (c2 = 1)
-   ->  Seq Scan on p1c1  (cost=10000000000.00..10000000002.25 rows=1 width=4)
+   ->  Seq Scan on p1c1  (cost=xxx rows=1 width=xxx)
          Filter: (c2 = 1)
-   ->  Seq Scan on p1c2  (cost=10000000000.00..10000000002.25 rows=1 width=4)
+   ->  Seq Scan on p1c2  (cost=xxx rows=1 width=xxx)
          Filter: (c2 = 1)
-   ->  Seq Scan on p1c3  (cost=10000000000.00..10000000002.25 rows=1 width=4)
+   ->  Seq Scan on p1c3  (cost=xxx rows=1 width=xxx)
          Filter: (c2 = 1)
 (9 rows)
 
 -- No. S-3-10-5
-\! psql contrib_regression -c "/*+IndexScan(p2 p2c1_pkey)*/ EXPLAIN (COSTS true) SELECT * FROM s1.p2 WHERE c1 = 1" | grep -v "Planning time:"
+\o results/ut-S.tmpout
+/*+IndexScan(p2 p2c1_pkey)*/ EXPLAIN (COSTS true) SELECT * FROM s1.p2 WHERE c1 = 1;
 LOG:  available indexes for IndexScan(p2):
 LOG:  available indexes for IndexScan(p2c1): p2c1_pkey
 LOG:  available indexes for IndexScan(p2c2):
@@ -5321,14 +5332,16 @@ not used hint:
 duplication hint:
 error hint:
 
+\o
+\! sql/maskout.sh results/ut-S.tmpout
                                    QUERY PLAN                                    
 ---------------------------------------------------------------------------------
- Append  (cost=10000000000.00..20000000009.77 rows=3 width=34)
-   ->  Seq Scan on p2  (cost=10000000000.00..10000000000.00 rows=1 width=44)
+ Append  (cost=xxx rows=3 width=xxx)
+   ->  Seq Scan on p2  (cost=xxx rows=1 width=xxx)
          Filter: (c1 = 1)
-   ->  Index Scan using p2c1_pkey on p2c1  (cost=0.12..8.14 rows=1 width=44)
+   ->  Index Scan using p2c1_pkey on p2c1  (cost=xxx rows=1 width=xxx)
          Index Cond: (c1 = 1)
-   ->  Seq Scan on p2c1c1  (cost=10000000000.00..10000000001.62 rows=1 width=14)
+   ->  Seq Scan on p2c1c1  (cost=xxx rows=1 width=xxx)
          Filter: (c1 = 1)
 (7 rows)
 
@@ -6203,3 +6216,4 @@ SELECT pg_reload_conf();
  t
 (1 row)
 
+\! rm results/ut-S.tmpout
index db6254c..8307996 100644 (file)
@@ -3721,21 +3721,29 @@ transform_join_hints(HintState *hstate, PlannerInfo *root, int nbaserel,
  *
  * This function was copied and edited from set_plain_rel_pathlist() in
  * src/backend/optimizer/path/allpaths.c
+ *
+ * - removed parallel stuff.
  */
 static void
 set_plain_rel_pathlist(PlannerInfo *root, RelOptInfo *rel, RangeTblEntry *rte)
 {
+       Relids          required_outer;
+
+       /*
+        * We don't support pushing join clauses into the quals of a seqscan, but
+        * it could still have required parameterization due to LATERAL refs in
+        * its tlist.
+        */
+       required_outer = rel->lateral_relids;
+
        /* Consider sequential scan */
-       add_path(rel, create_seqscan_path(root, rel, NULL));
+       add_path(rel, create_seqscan_path(root, rel, required_outer, 0));
 
        /* Consider index scans */
        create_index_paths(root, rel);
 
        /* Consider TID scans */
        create_tidscan_paths(root, rel);
-
-       /* Now find the cheapest of the paths for this rel */
-       set_cheapest(rel);
 }
 
 static void
@@ -4011,6 +4019,9 @@ set_rel_pathlist(PlannerInfo *root, RelOptInfo *rel,
                {
                        if (rte->relkind == RELKIND_RELATION)
                        {
+                               if(rte->tablesample != NULL)
+                                       elog(ERROR, "sampled relation is not supported");
+
                                /* Plain relation */
                                set_plain_rel_pathlist(root, rel, rte);
                        }
@@ -4020,6 +4031,17 @@ set_rel_pathlist(PlannerInfo *root, RelOptInfo *rel,
                else
                        elog(ERROR, "unexpected rtekind: %d", (int) rel->rtekind);
        }
+
+       /*
+        * Allow a plugin to editorialize on the set of Paths for this base
+        * relation.  It could add new paths (such as CustomPaths) by calling
+        * add_path(), or delete or modify paths added by the core code.
+        */
+       if (set_rel_pathlist_hook)
+               (*set_rel_pathlist_hook) (root, rel, rti, rte);
+
+       /* Now find the cheapest of the paths for this rel */
+       set_cheapest(rel);
 }
 
 /*
index 775d962..66fbc3b 100644 (file)
@@ -132,4 +132,4 @@ SELECT name, setting, category
  ORDER BY category, name;
 SELECT * FROM settings;
 
-ANALYZE;
\ No newline at end of file
+ANALYZE;
index 6ca894f..eead968 100644 (file)
@@ -1,5 +1,6 @@
 SET search_path TO public;
 SET client_min_messages TO log;
+\set SHOW_CONTEXT always
 
 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.id = t2.id;
 EXPLAIN (COSTS false) SELECT * FROM t1, t2 WHERE t1.val = t2.val;
index 42cf982..7fa720c 100644 (file)
@@ -16,9 +16,11 @@ CREATE EXTENSION pg_hint_plan;
 DROP EXTENSION pg_hint_plan;
 
 -- No.A-1-1-4
-CREATE EXTENSION pg_hint_plan SCHEMA other_name;
+CREATE SCHEMA other_schema;
+CREATE EXTENSION pg_hint_plan SCHEMA other_schema;
 
 CREATE EXTENSION pg_hint_plan;
+DROP SCHEMA other_schema;
 
 ----
 ---- No. A-5-1 comment pattern
index dbcdf3d..095b53b 100644 (file)
@@ -3,6 +3,7 @@ SET pg_hint_plan.enable_hint TO on;
 SET pg_hint_plan.debug_print TO on;
 SET client_min_messages TO LOG;
 SET search_path TO public;
+SET max_parallel_workers_per_gather TO 0;
 
 EXPLAIN (COSTS false) SELECT * FROM s1.t1, s1.t2 WHERE t1.c1 = t2.c1;
 
index bb452e2..575013a 100644 (file)
@@ -3,6 +3,7 @@ SET pg_hint_plan.enable_hint TO on;
 SET pg_hint_plan.debug_print TO on;
 SET client_min_messages TO LOG;
 SET search_path TO public;
+SET max_parallel_workers_per_gather TO 0;
 
 EXPLAIN (COSTS false) SELECT * FROM s1.t1, s1.t2, s1.t3, s1.t4 WHERE t1.c1 = t2.c1 AND t1.c1 = t3.c1 AND t1.c1 = t4.c1;
 
index 26be3c5..54e539b 100644 (file)
@@ -8,6 +8,7 @@ SET pg_hint_plan.enable_hint TO on;
 SET pg_hint_plan.debug_print TO on;
 SET client_min_messages TO LOG;
 SET search_path TO public;
+SET max_parallel_workers_per_gather TO 0;
 
 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 >= 1;
 EXPLAIN (COSTS false) SELECT * FROM s1.t1 WHERE t1.c1 = 1;
@@ -961,15 +962,29 @@ EXPLAIN (COSTS false) SELECT * FROM s1.p2 WHERE c1 = 1;
 EXPLAIN (COSTS false) SELECT * FROM s1.p2 WHERE c1 = 1;
 
 -- No. S-3-10-3
-\! psql contrib_regression -c "EXPLAIN SELECT c4 FROM s1.p1 WHERE c2 * 2 < 100 AND c1 < 10" | grep -v "Planning time:"
-\! psql contrib_regression -c "/*+IndexScan(p1 p1_parent)*/ EXPLAIN SELECT c4 FROM s1.p1 WHERE c2 * 2 < 100 AND c1 < 10" | grep -v "Planning time:"
+\o results/ut-S.tmpout
+EXPLAIN SELECT c4 FROM s1.p1 WHERE c2 * 2 < 100 AND c1 < 10;
+\o
+\! sql/maskout.sh results/ut-S.tmpout
+
+\o results/ut-S.tmpout
+/*+IndexScan(p1 p1_parent)*/ EXPLAIN SELECT c4 FROM s1.p1 WHERE c2 * 2 < 100 AND c1 < 10;
+\o
+\! sql/maskout.sh results/ut-S.tmpout
 
--- No. S-3-10-4
 
-\! psql contrib_regression -c "/*+IndexScan(p1 p1_i2)*/ EXPLAIN SELECT c2 FROM s1.p1 WHERE c2 = 1" | grep -v "Planning time:"
+-- No. S-3-10-4
+\o results/ut-S.tmpout
+/*+IndexScan(p1 p1_i2)*/ EXPLAIN SELECT c2 FROM s1.p1 WHERE c2 = 1;
+\o
+\! sql/maskout.sh results/ut-S.tmpout
 
 -- No. S-3-10-5
-\! psql contrib_regression -c "/*+IndexScan(p2 p2c1_pkey)*/ EXPLAIN (COSTS true) SELECT * FROM s1.p2 WHERE c1 = 1" | grep -v "Planning time:"
+\o results/ut-S.tmpout
+/*+IndexScan(p2 p2c1_pkey)*/ EXPLAIN (COSTS true) SELECT * FROM s1.p2 WHERE c1 = 1;
+\o
+\! sql/maskout.sh results/ut-S.tmpout
+
 
 ----
 ---- No. S-3-12 specified same table
@@ -1169,3 +1184,4 @@ DELETE FROM pg_db_role_setting WHERE setrole = (SELECT oid FROM pg_roles WHERE r
 
 ALTER SYSTEM SET session_preload_libraries TO DEFAULT;
 SELECT pg_reload_conf();
+\! rm results/ut-S.tmpout