HAWQ-800. Fix less tuple is inserted due to data locality information is not 
refreshed and dispatched in prepared statement


Project: http://git-wip-us.apache.org/repos/asf/incubator-hawq/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-hawq/commit/b74baf5c
Tree: http://git-wip-us.apache.org/repos/asf/incubator-hawq/tree/b74baf5c
Diff: http://git-wip-us.apache.org/repos/asf/incubator-hawq/diff/b74baf5c

Branch: refs/heads/HAWQ-537
Commit: b74baf5cb1294f5b8ce411ab43f04afb3b9faac4
Parents: a6622b8
Author: Ruilong Huo <r...@pivotal.io>
Authored: Mon Jun 27 10:48:28 2016 +0800
Committer: Ruilong Huo <r...@pivotal.io>
Committed: Mon Jun 27 11:01:47 2016 +0800

----------------------------------------------------------------------
 src/backend/executor/spi.c | 42 ++++++++++-------------------------------
 1 file changed, 10 insertions(+), 32 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/b74baf5c/src/backend/executor/spi.c
----------------------------------------------------------------------
diff --git a/src/backend/executor/spi.c b/src/backend/executor/spi.c
index d0029fc..c7b7f92 100644
--- a/src/backend/executor/spi.c
+++ b/src/backend/executor/spi.c
@@ -47,6 +47,7 @@
 #include "executor/nodeFunctionscan.h"
 #include "nodes/stack.h"
 #include "cdb/cdbdatalocality.h"
+#include "optimizer/planner.h"
 
 extern char *savedSeqServerHost;
 extern int savedSeqServerPort;
@@ -1146,19 +1147,11 @@ SPI_cursor_open(const char *name, SPIPlanPtr plan,
        qtlist = copyObject(qtlist);
        ptlist = copyObject(ptlist);
 
-       PlannedStmt* stmt = (PlannedStmt*)linitial(ptlist);
+       Query *queryTree = (Query *) linitial(qtlist);
+       queryTree = copyObject(queryTree);
 
-       if ( (Gp_role == GP_ROLE_DISPATCH) &&
-                        (stmt->resource_parameters != NULL) )
-       {
-               /*
-                * Now, we want to allocate resource.
-                */
-               stmt->resource = 
AllocateResource(stmt->resource_parameters->life, 
stmt->resource_parameters->slice_size,
-                               stmt->resource_parameters->iobytes, 
stmt->resource_parameters->max_target_segment_num,
-                               
stmt->resource_parameters->min_target_segment_num, 
stmt->resource_parameters->vol_info,
-                               stmt->resource_parameters->vol_info_size);
-       }
+       PlannedStmt* stmt = (PlannedStmt*)linitial(ptlist);
+       stmt = refineCachedPlan(stmt, queryTree, 0 ,NULL);
 
        /* If the plan has parameters, set them up */
        if (spiplan->nargs > 0)
@@ -1854,30 +1847,15 @@ _SPI_execute_plan(_SPI_plan * plan, Datum *Values, 
const char *Nulls,
                                 * Get copy of the queryTree and the plan since 
this may be modified further down.
                                 */
                                queryTree = copyObject(queryTree);
-                               PlannedStmt *stmt = copyObject(originalStmt);
 
-                               /*
-                                * We only allocate resource for multiple 
executions of queries, NOT for utility commands.
-                                * SELECT/INSERT are supported at present.
-                                */
-                               if((queryTree->commandType == CMD_SELECT) ||
-                                               (queryTree->commandType == 
CMD_INSERT))
+                               if ((queryTree->commandType == CMD_SELECT) ||
+                                   (queryTree->commandType == CMD_INSERT))
                                {
-                                       if ((Gp_role == GP_ROLE_DISPATCH) &&
-                                                       (stmt->resource == 
NULL) &&
-                                                       
(stmt->resource_parameters != NULL))
-                                       {
-                                               stmt->resource = 
AllocateResource(stmt->resource_parameters->life,
-                                                               
stmt->resource_parameters->slice_size,
-                                                               
stmt->resource_parameters->iobytes,
-                                                               
stmt->resource_parameters->max_target_segment_num,
-                                                               
stmt->resource_parameters->min_target_segment_num,
-                                                               
stmt->resource_parameters->vol_info,
-                                                               
stmt->resource_parameters->vol_info_size);
-                                       }
-                                       originalStmt->resource = NULL;
+                                       originalStmt = 
refineCachedPlan(originalStmt, queryTree, 0 ,NULL);
                                }
 
+                               PlannedStmt *stmt = copyObject(originalStmt);
+
                                _SPI_current->processed = 0;
                                _SPI_current->lastoid = InvalidOid;
                                _SPI_current->tuptable = NULL;

Reply via email to