diff options
Diffstat (limited to 'src/backend/tcop')
-rw-r--r-- | src/backend/tcop/pquery.c | 19 | ||||
-rw-r--r-- | src/backend/tcop/utility.c | 49 |
2 files changed, 47 insertions, 21 deletions
diff --git a/src/backend/tcop/pquery.c b/src/backend/tcop/pquery.c index b54dea45dc..58ed351c59 100644 --- a/src/backend/tcop/pquery.c +++ b/src/backend/tcop/pquery.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/tcop/pquery.c,v 1.115 2007/03/13 00:33:42 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/tcop/pquery.c,v 1.116 2007/04/27 22:05:49 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -68,7 +68,7 @@ CreateQueryDesc(PlannedStmt *plannedstmt, qd->operation = plannedstmt->commandType; /* operation */ qd->plannedstmt = plannedstmt; /* plan */ - qd->utilitystmt = NULL; + qd->utilitystmt = plannedstmt->utilityStmt; /* in case DECLARE CURSOR */ qd->snapshot = snapshot; /* snapshot */ qd->crosscheck_snapshot = crosscheck_snapshot; /* RI check snapshot */ qd->dest = dest; /* output dest */ @@ -257,7 +257,8 @@ ChoosePortalStrategy(List *stmts) if (query->canSetTag) { if (query->commandType == CMD_SELECT && - query->into == NULL) + query->utilityStmt == NULL && + query->intoClause == NULL) return PORTAL_ONE_SELECT; if (query->commandType == CMD_UTILITY && query->utilityStmt != NULL) @@ -276,7 +277,8 @@ ChoosePortalStrategy(List *stmts) if (pstmt->canSetTag) { if (pstmt->commandType == CMD_SELECT && - pstmt->into == NULL) + pstmt->utilityStmt == NULL && + pstmt->intoClause == NULL) return PORTAL_ONE_SELECT; } } @@ -380,7 +382,8 @@ FetchStatementTargetList(Node *stmt) else { if (query->commandType == CMD_SELECT && - query->into == NULL) + query->utilityStmt == NULL && + query->intoClause == NULL) return query->targetList; if (query->returningList) return query->returningList; @@ -392,7 +395,8 @@ FetchStatementTargetList(Node *stmt) PlannedStmt *pstmt = (PlannedStmt *) stmt; if (pstmt->commandType == CMD_SELECT && - pstmt->into == NULL) + pstmt->utilityStmt == NULL && + pstmt->intoClause == NULL) return pstmt->planTree->targetlist; if (pstmt->returningLists) return (List *) linitial(pstmt->returningLists); @@ -1222,7 +1226,8 @@ PortalRunMulti(Portal portal, bool isTopLevel, */ CHECK_FOR_INTERRUPTS(); - if (IsA(stmt, PlannedStmt)) + if (IsA(stmt, PlannedStmt) && + ((PlannedStmt *) stmt)->utilityStmt == NULL) { /* * process a plannable query. diff --git a/src/backend/tcop/utility.c b/src/backend/tcop/utility.c index 9dd700ffe7..028cb47c7a 100644 --- a/src/backend/tcop/utility.c +++ b/src/backend/tcop/utility.c @@ -10,7 +10,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/tcop/utility.c,v 1.278 2007/04/26 16:13:12 neilc Exp $ + * $PostgreSQL: pgsql/src/backend/tcop/utility.c,v 1.279 2007/04/27 22:05:49 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -268,7 +268,7 @@ CommandIsReadOnly(Node *parsetree) switch (stmt->commandType) { case CMD_SELECT: - if (stmt->into != NULL) + if (stmt->intoClause != NULL) return false; /* SELECT INTO */ else if (stmt->rowMarks != NIL) return false; /* SELECT FOR UPDATE/SHARE */ @@ -505,10 +505,20 @@ ProcessUtility(Node *parsetree, /* * Portal (cursor) manipulation + * + * Note: DECLARE CURSOR is processed mostly as a SELECT, and + * therefore what we will get here is a PlannedStmt not a bare + * DeclareCursorStmt. */ - case T_DeclareCursorStmt: - PerformCursorOpen((DeclareCursorStmt *) parsetree, params, - queryString, isTopLevel); + case T_PlannedStmt: + { + PlannedStmt *stmt = (PlannedStmt *) parsetree; + + if (stmt->utilityStmt == NULL || + !IsA(stmt->utilityStmt, DeclareCursorStmt)) + elog(ERROR, "non-DECLARE CURSOR PlannedStmt passed to ProcessUtility"); + PerformCursorOpen(stmt, params, queryString, isTopLevel); + } break; case T_ClosePortalStmt: @@ -1272,8 +1282,9 @@ QueryReturnsTuples(Query *parsetree) switch (parsetree->commandType) { case CMD_SELECT: - /* returns tuples ... unless it's SELECT INTO */ - if (parsetree->into == NULL) + /* returns tuples ... unless it's DECLARE CURSOR or SELECT INTO */ + if (parsetree->utilityStmt == NULL && + parsetree->intoClause == NULL) return true; break; case CMD_INSERT: @@ -1899,7 +1910,12 @@ CreateCommandTag(Node *parsetree) * will be useful for complaints about read-only * statements */ - if (stmt->into != NULL) + if (stmt->utilityStmt != NULL) + { + Assert(IsA(stmt->utilityStmt, DeclareCursorStmt)); + tag = "DECLARE CURSOR"; + } + else if (stmt->intoClause != NULL) tag = "SELECT INTO"; else if (stmt->rowMarks != NIL) { @@ -1942,7 +1958,12 @@ CreateCommandTag(Node *parsetree) * will be useful for complaints about read-only * statements */ - if (stmt->into != NULL) + if (stmt->utilityStmt != NULL) + { + Assert(IsA(stmt->utilityStmt, DeclareCursorStmt)); + tag = "DECLARE CURSOR"; + } + else if (stmt->intoClause != NULL) tag = "SELECT INTO"; else if (stmt->rowMarks != NIL) { @@ -2009,7 +2030,7 @@ GetCommandLogLevel(Node *parsetree) break; case T_SelectStmt: - if (((SelectStmt *) parsetree)->into) + if (((SelectStmt *) parsetree)->intoClause) lev = LOGSTMT_DDL; /* CREATE AS, SELECT INTO */ else lev = LOGSTMT_ALL; @@ -2330,10 +2351,10 @@ GetCommandLogLevel(Node *parsetree) switch (stmt->commandType) { case CMD_SELECT: - if (stmt->into != NULL) + if (stmt->intoClause != NULL) lev = LOGSTMT_DDL; /* CREATE AS, SELECT INTO */ else - lev = LOGSTMT_ALL; + lev = LOGSTMT_ALL; /* SELECT or DECLARE CURSOR */ break; case CMD_UPDATE: @@ -2359,10 +2380,10 @@ GetCommandLogLevel(Node *parsetree) switch (stmt->commandType) { case CMD_SELECT: - if (stmt->into != NULL) + if (stmt->intoClause != NULL) lev = LOGSTMT_DDL; /* CREATE AS, SELECT INTO */ else - lev = LOGSTMT_ALL; + lev = LOGSTMT_ALL; /* SELECT or DECLARE CURSOR */ break; case CMD_UPDATE: |