Repository: incubator-hawq Updated Branches: refs/heads/master cee573ad4 -> e25fe8b42
HAWQ-1240. Fix bug of plan refinement for cursor operation Project: http://git-wip-us.apache.org/repos/asf/incubator-hawq/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-hawq/commit/e25fe8b4 Tree: http://git-wip-us.apache.org/repos/asf/incubator-hawq/tree/e25fe8b4 Diff: http://git-wip-us.apache.org/repos/asf/incubator-hawq/diff/e25fe8b4 Branch: refs/heads/master Commit: e25fe8b4243594809bd673b46318968169f700e4 Parents: cee573a Author: Paul Guo <[email protected]> Authored: Wed Dec 28 10:52:39 2016 +0800 Committer: Paul Guo <[email protected]> Committed: Thu Dec 29 14:14:55 2016 +0800 ---------------------------------------------------------------------- src/backend/executor/spi.c | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/e25fe8b4/src/backend/executor/spi.c ---------------------------------------------------------------------- diff --git a/src/backend/executor/spi.c b/src/backend/executor/spi.c index c7b7f92..9b6ae9f 100644 --- a/src/backend/executor/spi.c +++ b/src/backend/executor/spi.c @@ -1145,13 +1145,13 @@ SPI_cursor_open(const char *name, SPIPlanPtr plan, /* Switch to portal's memory and copy the parsetrees and plans to there */ oldcontext = MemoryContextSwitchTo(PortalGetHeapMemory(portal)); qtlist = copyObject(qtlist); - ptlist = copyObject(ptlist); Query *queryTree = (Query *) linitial(qtlist); - queryTree = copyObject(queryTree); + PlannedStmt* stmt = (PlannedStmt *)linitial(ptlist); - PlannedStmt* stmt = (PlannedStmt*)linitial(ptlist); - stmt = refineCachedPlan(stmt, queryTree, 0 ,NULL); + PlannedStmt* new_stmt = refineCachedPlan(stmt, queryTree, 0, NULL); + if (new_stmt == stmt) + new_stmt = copyObject(new_stmt); /* If the plan has parameters, set them up */ if (spiplan->nargs > 0) @@ -1199,7 +1199,7 @@ SPI_cursor_open(const char *name, SPIPlanPtr plan, query_string, T_SelectStmt, CreateCommandTag(PortalListGetPrimaryStmt(qtlist)), - ptlist, + list_make1(new_stmt), PortalGetHeapMemory(portal)); create_filesystem_credentials(portal); @@ -1213,13 +1213,10 @@ SPI_cursor_open(const char *name, SPIPlanPtr plan, { int option = CURSOR_OPT_NO_SCROLL; - if ( list_length(ptlist) == 1 ) - { - PlannedStmt *stmt = (PlannedStmt *)linitial(ptlist); - if ( stmt && stmt->planTree && - ExecSupportsBackwardScan(stmt->planTree) ) - option = CURSOR_OPT_SCROLL; - } + if ( new_stmt && new_stmt->planTree && + ExecSupportsBackwardScan(new_stmt->planTree) ) + option = CURSOR_OPT_SCROLL; + portal->cursorOptions |= option; }
