From: Kyotaro Horiguchi Date: Fri, 19 May 2017 01:11:55 +0000 (+0900) Subject: Fix a bug of target query retrieval X-Git-Tag: REL95_1_1_4~1 X-Git-Url: http://git.osdn.net/view?p=pghintplan%2Fpg_hint_plan.git;a=commitdiff_plain;h=82f6021a18fdd835bcc74cd0f1bfc42dd285ab25 Fix a bug of target query retrieval The previous patch leaves a bug that get_query_string returns a Query that JumbleQuery doesn't accept. This fixes that bug. --- diff --git a/pg_hint_plan.c b/pg_hint_plan.c index f74e510..1afe86b 100644 --- a/pg_hint_plan.c +++ b/pg_hint_plan.c @@ -1661,8 +1661,6 @@ get_query_string(ParseState *pstate, Query *query, Query **jumblequery) if (jumblequery != NULL) *jumblequery = query; - Assert(plpgsql_recurse_level == 0); - if (query->commandType == CMD_UTILITY) { Query *target_query = query; @@ -1671,15 +1669,14 @@ get_query_string(ParseState *pstate, Query *query, Query **jumblequery) if (IsA(query->utilityStmt, ExplainStmt)) { ExplainStmt *stmt = (ExplainStmt *)(query->utilityStmt); + Assert(IsA(stmt->query, Query)); target_query = (Query *)stmt->query; + /* strip out the top-level query for further processing */ if (target_query->commandType == CMD_UTILITY && target_query->utilityStmt != NULL) target_query = (Query *)target_query->utilityStmt; - - if (jumblequery) - *jumblequery = target_query; } if (IsA(target_query, CreateTableAsStmt)) @@ -1690,21 +1687,18 @@ get_query_string(ParseState *pstate, Query *query, Query **jumblequery) */ CreateTableAsStmt *stmt = (CreateTableAsStmt *) target_query; PreparedStatement *entry; - Query *ent_query; + Query *tmp_query; Assert(IsA(stmt->query, Query)); - target_query = (Query *) stmt->query; + tmp_query = (Query *) stmt->query; - if (target_query->commandType == CMD_UTILITY && - IsA(target_query->utilityStmt, ExecuteStmt)) + if (tmp_query->commandType == CMD_UTILITY && + IsA(tmp_query->utilityStmt, ExecuteStmt)) { - ExecuteStmt *estmt = (ExecuteStmt *) target_query->utilityStmt; + ExecuteStmt *estmt = (ExecuteStmt *) tmp_query->utilityStmt; entry = FetchPreparedStatement(estmt->name, true); p = entry->plansource->query_string; - ent_query = (Query *) linitial (entry->plansource->query_list); - Assert(IsA(ent_query, Query)); - if (jumblequery) - *jumblequery = ent_query; + target_query = (Query *) linitial (entry->plansource->query_list); } } else @@ -1716,15 +1710,19 @@ get_query_string(ParseState *pstate, Query *query, Query **jumblequery) */ ExecuteStmt *stmt = (ExecuteStmt *)target_query; PreparedStatement *entry; - Query *ent_query; entry = FetchPreparedStatement(stmt->name, true); p = entry->plansource->query_string; - ent_query = (Query *) linitial (entry->plansource->query_list); - Assert(IsA(ent_query, Query)); - if (jumblequery) - *jumblequery = ent_query; + target_query = (Query *) linitial (entry->plansource->query_list); } + + /* We don't accept other than a Query other than a CMD_UTILITY */ + if (!IsA(target_query, Query) || + target_query->commandType == CMD_UTILITY) + target_query = NULL; + + if (jumblequery) + *jumblequery = target_query; } /* Return NULL if the pstate is not identical to the top-level query */ else if (strcmp(pstate->p_sourcetext, p) != 0)