diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml
index 5c08442..aa38f56 100644
--- a/doc/src/sgml/config.sgml
+++ b/doc/src/sgml/config.sgml
@@ -2020,6 +2020,19 @@ SET ENABLE_SEQSCAN TO OFF;
+
+ enable_material (boolean)
+
+ enable_material> configuration parameter
+
+
+
+ Enables or disables the query planner's use of materialization.
+ The default is on>.
+
+
+
+
enable_mergejoin (boolean)
diff --git a/src/backend/optimizer/path/costsize.c b/src/backend/optimizer/path/costsize.c
index 74ec77b..96d9293 100644
--- a/src/backend/optimizer/path/costsize.c
+++ b/src/backend/optimizer/path/costsize.c
@@ -114,6 +114,7 @@ bool enable_tidscan = true;
bool enable_sort = true;
bool enable_hashagg = true;
bool enable_nestloop = true;
+bool enable_material = true;
bool enable_mergejoin = true;
bool enable_hashjoin = true;
@@ -1853,7 +1854,7 @@ cost_mergejoin(MergePath *path, PlannerInfo *root, SpecialJoinInfo *sjinfo)
cpu_operator_cost * inner_path_rows * rescanratio;
/* Prefer materializing if it looks cheaper */
- if (mat_inner_cost < bare_inner_cost)
+ if (enable_material && mat_inner_cost < bare_inner_cost)
path->materialize_inner = true;
/*
@@ -1879,7 +1880,7 @@ cost_mergejoin(MergePath *path, PlannerInfo *root, SpecialJoinInfo *sjinfo)
* We don't try to adjust the cost estimates for this consideration,
* though.
*/
- else if (innersortkeys != NIL &&
+ else if (enable_material && innersortkeys != NIL &&
relation_byte_size(inner_path_rows, inner_path->parent->width) >
(work_mem * 1024L))
path->materialize_inner = true;
diff --git a/src/backend/optimizer/path/joinpath.c b/src/backend/optimizer/path/joinpath.c
index f7cd936..19465ad 100644
--- a/src/backend/optimizer/path/joinpath.c
+++ b/src/backend/optimizer/path/joinpath.c
@@ -440,7 +440,8 @@ match_unsorted_outer(PlannerInfo *root,
* Consider materializing the cheapest inner path, unless it is one
* that materializes its output anyway.
*/
- if (!ExecMaterializesOutput(inner_cheapest_total->pathtype))
+ if (enable_material &&
+ !ExecMaterializesOutput(inner_cheapest_total->pathtype))
matpath = (Path *)
create_material_path(innerrel, inner_cheapest_total);
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index 57af47a..de62c7e 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -580,7 +580,7 @@ build_subplan(PlannerInfo *root, Plan *plan, List *rtable, List *rowmarks,
* correlated subplans, we add Material unless the subplan's top plan
* node would materialize its output anyway.
*/
- else if (splan->parParam == NIL &&
+ else if (splan->parParam == NIL && enable_material &&
!ExecMaterializesOutput(nodeTag(plan)))
plan = materialize_finished_plan(plan);
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index 1cf899e..c9d934f 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -644,6 +644,14 @@ static struct config_bool ConfigureNamesBool[] =
true, NULL, NULL
},
{
+ {"enable_material", PGC_USERSET, QUERY_TUNING_METHOD,
+ gettext_noop("Enables the planner's use of materialization."),
+ NULL
+ },
+ &enable_material,
+ true, NULL, NULL
+ },
+ {
{"enable_nestloop", PGC_USERSET, QUERY_TUNING_METHOD,
gettext_noop("Enables the planner's use of nested-loop join plans."),
NULL
diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample
index 48c09d1..c3f985a 100644
--- a/src/backend/utils/misc/postgresql.conf.sample
+++ b/src/backend/utils/misc/postgresql.conf.sample
@@ -206,6 +206,7 @@
#enable_hashagg = on
#enable_hashjoin = on
#enable_indexscan = on
+#enable_material = on
#enable_mergejoin = on
#enable_nestloop = on
#enable_seqscan = on
diff --git a/src/include/optimizer/cost.h b/src/include/optimizer/cost.h
index a389229..376bb1b 100644
--- a/src/include/optimizer/cost.h
+++ b/src/include/optimizer/cost.h
@@ -57,6 +57,7 @@ extern bool enable_tidscan;
extern bool enable_sort;
extern bool enable_hashagg;
extern bool enable_nestloop;
+extern bool enable_material;
extern bool enable_mergejoin;
extern bool enable_hashjoin;
extern int constraint_exclusion;
diff --git a/src/test/regress/expected/rangefuncs.out b/src/test/regress/expected/rangefuncs.out
index a32cbf5..66736a3 100644
--- a/src/test/regress/expected/rangefuncs.out
+++ b/src/test/regress/expected/rangefuncs.out
@@ -5,12 +5,13 @@ SELECT name, setting FROM pg_settings WHERE name LIKE 'enable%';
enable_hashagg | on
enable_hashjoin | on
enable_indexscan | on
+ enable_material | on
enable_mergejoin | on
enable_nestloop | on
enable_seqscan | on
enable_sort | on
enable_tidscan | on
-(9 rows)
+(10 rows)
CREATE TABLE foo2(fooid int, f2 int);
INSERT INTO foo2 VALUES(1, 11);