>From d2033f22bd45231caf2c9ea2f0af964b7b052c32 Mon Sep 17 00:00:00 2001
From: Kyotaro Horiguchi <horiguchi.kyotaro@lab.ntt.co.jp>
Date: Mon, 30 Nov 2015 17:41:03 +0900
Subject: [PATCH 4/5] temporarily introduce a guc enable_asyncexec for test
 usage.

enable_asyncexec = false inhibits asynchronous execution of
nodes. This is added for the purpose of comparing performance with and
without async execution.
---
 src/backend/executor/execMain.c        | 2 ++
 src/backend/executor/nodeAppend.c      | 3 ++-
 src/backend/executor/nodeGather.c      | 1 +
 src/backend/executor/nodeHashjoin.c    | 4 +++-
 src/backend/executor/nodeMergeAppend.c | 3 ++-
 src/backend/executor/nodeMergejoin.c   | 3 ++-
 src/backend/executor/nodeNestloop.c    | 3 ++-
 src/backend/utils/misc/guc.c           | 9 +++++++++
 src/include/optimizer/cost.h           | 1 +
 9 files changed, 24 insertions(+), 5 deletions(-)

diff --git a/src/backend/executor/execMain.c b/src/backend/executor/execMain.c
index 9f2af6d..a58cced 100644
--- a/src/backend/executor/execMain.c
+++ b/src/backend/executor/execMain.c
@@ -95,6 +95,8 @@ static char *ExecBuildSlotValueDescription(Oid reloid,
 static void EvalPlanQualStart(EPQState *epqstate, EState *parentestate,
 				  Plan *planTree);
 
+bool enable_asyncexec = false;
+
 /*
  * Note that GetUpdatedColumns() also exists in commands/trigger.c.  There does
  * not appear to be any good header to put it into, given the structures that
diff --git a/src/backend/executor/nodeAppend.c b/src/backend/executor/nodeAppend.c
index 2b918b2..4a7d781 100644
--- a/src/backend/executor/nodeAppend.c
+++ b/src/backend/executor/nodeAppend.c
@@ -62,6 +62,7 @@
 
 static bool exec_append_initialize_next(AppendState *appendstate);
 
+extern bool enable_asyncexec;
 
 /* ----------------------------------------------------------------
  *		exec_append_initialize_next
@@ -195,7 +196,7 @@ TupleTableSlot *
 ExecAppend(AppendState *node)
 {
 	/* start child nodes asynchronously if possible */
-	if (ExecNode_is_inited(node))
+	if (enable_asyncexec && ExecNode_is_inited(node))
 		StartAppend(node);
 
 	SetNodeRunState(node, Running);
diff --git a/src/backend/executor/nodeGather.c b/src/backend/executor/nodeGather.c
index 5364acb..b642d51 100644
--- a/src/backend/executor/nodeGather.c
+++ b/src/backend/executor/nodeGather.c
@@ -40,6 +40,7 @@
 #include "utils/memutils.h"
 #include "utils/rel.h"
 
+extern bool enable_asyncexec;
 
 static TupleTableSlot *gather_getnext(GatherState *gatherstate);
 static HeapTuple gather_readnext(GatherState *gatherstate);
diff --git a/src/backend/executor/nodeHashjoin.c b/src/backend/executor/nodeHashjoin.c
index ada9290..cb54aba 100644
--- a/src/backend/executor/nodeHashjoin.c
+++ b/src/backend/executor/nodeHashjoin.c
@@ -39,6 +39,8 @@
 /* Returns true if doing null-fill on inner relation */
 #define HJ_FILL_INNER(hjstate)	((hjstate)->hj_NullOuterTupleSlot != NULL)
 
+extern bool enable_asyncexec;
+
 static TupleTableSlot *ExecHashJoinOuterGetTuple(PlanState *outerNode,
 						  HashJoinState *hjstate,
 						  uint32 *hashvalue);
@@ -73,7 +75,7 @@ ExecHashJoin(HashJoinState *node)
 	int			batchno;
 
 	/* Try to start asynchronously */
-	if (ExecNode_is_inited(node))
+	if (enable_asyncexec && ExecNode_is_inited(node))
 		StartHashJoin(node);
 
 	SetNodeRunState(node, Running);
diff --git a/src/backend/executor/nodeMergeAppend.c b/src/backend/executor/nodeMergeAppend.c
index ab6c304..fd5abb8 100644
--- a/src/backend/executor/nodeMergeAppend.c
+++ b/src/backend/executor/nodeMergeAppend.c
@@ -52,6 +52,7 @@ typedef int32 SlotNumber;
 
 static int	heap_compare_slots(Datum a, Datum b, void *arg);
 
+extern bool enable_asyncexec;
 
 /* ----------------------------------------------------------------
  *		ExecInitMergeAppend
@@ -171,7 +172,7 @@ ExecMergeAppend(MergeAppendState *node)
 	SlotNumber	i;
 
 	/* start child nodes asynchronously if possible */
-	if (ExecNode_is_inited(node))
+	if (enable_asyncexec && ExecNode_is_inited(node))
 		StartMergeAppend(node);
 	
 	SetNodeRunState(node, Running);
diff --git a/src/backend/executor/nodeMergejoin.c b/src/backend/executor/nodeMergejoin.c
index 32bd8a5..d2b141b 100644
--- a/src/backend/executor/nodeMergejoin.c
+++ b/src/backend/executor/nodeMergejoin.c
@@ -151,6 +151,7 @@ typedef enum
 #define MarkInnerTuple(innerTupleSlot, mergestate) \
 	ExecCopySlot((mergestate)->mj_MarkedTupleSlot, (innerTupleSlot))
 
+extern bool enable_asyncexec;
 
 /*
  * MJExamineQuals
@@ -631,7 +632,7 @@ ExecMergeJoin(MergeJoinState *node)
 	bool		doFillInner;
 
 	/* Execute childs asynchronously if possible */
-	if (ExecNode_is_inited(node))
+	if (enable_asyncexec && ExecNode_is_inited(node))
 		StartMergeJoin(node);
 
 	SetNodeRunState(node, Running);
diff --git a/src/backend/executor/nodeNestloop.c b/src/backend/executor/nodeNestloop.c
index cb95a3d..f55cd87 100644
--- a/src/backend/executor/nodeNestloop.c
+++ b/src/backend/executor/nodeNestloop.c
@@ -25,6 +25,7 @@
 #include "executor/nodeNestloop.h"
 #include "utils/memutils.h"
 
+extern bool enable_asyncexec;
 
 /* ----------------------------------------------------------------
  *		ExecNestLoop(node)
@@ -70,7 +71,7 @@ ExecNestLoop(NestLoopState *node)
 	ListCell   *lc;
 
 	/* Execute childs asynchronously if possible */
-	if (ExecNode_is_inited(node))
+	if (enable_asyncexec && ExecNode_is_inited(node))
 		StartNestLoop(node);
 
 	SetNodeRunState(node, Running);
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index a185749..16e04d2 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -855,6 +855,15 @@ static struct config_bool ConfigureNamesBool[] =
 		NULL, NULL, NULL
 	},
 	{
+		{"enable_asyncexec", PGC_USERSET, QUERY_TUNING_METHOD,
+			gettext_noop("Enable early execution."),
+			NULL
+		},
+		&enable_asyncexec,
+		false,
+		NULL, NULL, NULL
+	},
+	{
 		{"enable_hashjoin", PGC_USERSET, QUERY_TUNING_METHOD,
 			gettext_noop("Enables the planner's use of hash join plans."),
 			NULL
diff --git a/src/include/optimizer/cost.h b/src/include/optimizer/cost.h
index ac21a3a..e9b7595 100644
--- a/src/include/optimizer/cost.h
+++ b/src/include/optimizer/cost.h
@@ -65,6 +65,7 @@ extern bool enable_hashagg;
 extern bool enable_nestloop;
 extern bool enable_material;
 extern bool enable_mergejoin;
+extern bool enable_asyncexec;
 extern bool enable_hashjoin;
 extern int	constraint_exclusion;
 
-- 
1.8.3.1

