• R/O
  • HTTP
  • SSH
  • HTTPS

提交

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

firtst release


Commit MetaInfo

修订版82f6021a18fdd835bcc74cd0f1bfc42dd285ab25 (tree)
时间2017-05-19 10:39:44
作者Kyotaro Horiguchi <horiguchi.kyotaro@lab....>
CommiterKyotaro Horiguchi

Log Message

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.

更改概述

差异

--- a/pg_hint_plan.c
+++ b/pg_hint_plan.c
@@ -1661,8 +1661,6 @@ get_query_string(ParseState *pstate, Query *query, Query **jumblequery)
16611661 if (jumblequery != NULL)
16621662 *jumblequery = query;
16631663
1664- Assert(plpgsql_recurse_level == 0);
1665-
16661664 if (query->commandType == CMD_UTILITY)
16671665 {
16681666 Query *target_query = query;
@@ -1671,15 +1669,14 @@ get_query_string(ParseState *pstate, Query *query, Query **jumblequery)
16711669 if (IsA(query->utilityStmt, ExplainStmt))
16721670 {
16731671 ExplainStmt *stmt = (ExplainStmt *)(query->utilityStmt);
1672+
16741673 Assert(IsA(stmt->query, Query));
16751674 target_query = (Query *)stmt->query;
16761675
1676+ /* strip out the top-level query for further processing */
16771677 if (target_query->commandType == CMD_UTILITY &&
16781678 target_query->utilityStmt != NULL)
16791679 target_query = (Query *)target_query->utilityStmt;
1680-
1681- if (jumblequery)
1682- *jumblequery = target_query;
16831680 }
16841681
16851682 if (IsA(target_query, CreateTableAsStmt))
@@ -1690,21 +1687,18 @@ get_query_string(ParseState *pstate, Query *query, Query **jumblequery)
16901687 */
16911688 CreateTableAsStmt *stmt = (CreateTableAsStmt *) target_query;
16921689 PreparedStatement *entry;
1693- Query *ent_query;
1690+ Query *tmp_query;
16941691
16951692 Assert(IsA(stmt->query, Query));
1696- target_query = (Query *) stmt->query;
1693+ tmp_query = (Query *) stmt->query;
16971694
1698- if (target_query->commandType == CMD_UTILITY &&
1699- IsA(target_query->utilityStmt, ExecuteStmt))
1695+ if (tmp_query->commandType == CMD_UTILITY &&
1696+ IsA(tmp_query->utilityStmt, ExecuteStmt))
17001697 {
1701- ExecuteStmt *estmt = (ExecuteStmt *) target_query->utilityStmt;
1698+ ExecuteStmt *estmt = (ExecuteStmt *) tmp_query->utilityStmt;
17021699 entry = FetchPreparedStatement(estmt->name, true);
17031700 p = entry->plansource->query_string;
1704- ent_query = (Query *) linitial (entry->plansource->query_list);
1705- Assert(IsA(ent_query, Query));
1706- if (jumblequery)
1707- *jumblequery = ent_query;
1701+ target_query = (Query *) linitial (entry->plansource->query_list);
17081702 }
17091703 }
17101704 else
@@ -1716,15 +1710,19 @@ get_query_string(ParseState *pstate, Query *query, Query **jumblequery)
17161710 */
17171711 ExecuteStmt *stmt = (ExecuteStmt *)target_query;
17181712 PreparedStatement *entry;
1719- Query *ent_query;
17201713
17211714 entry = FetchPreparedStatement(stmt->name, true);
17221715 p = entry->plansource->query_string;
1723- ent_query = (Query *) linitial (entry->plansource->query_list);
1724- Assert(IsA(ent_query, Query));
1725- if (jumblequery)
1726- *jumblequery = ent_query;
1716+ target_query = (Query *) linitial (entry->plansource->query_list);
17271717 }
1718+
1719+ /* We don't accept other than a Query other than a CMD_UTILITY */
1720+ if (!IsA(target_query, Query) ||
1721+ target_query->commandType == CMD_UTILITY)
1722+ target_query = NULL;
1723+
1724+ if (jumblequery)
1725+ *jumblequery = target_query;
17281726 }
17291727 /* Return NULL if the pstate is not identical to the top-level query */
17301728 else if (strcmp(pstate->p_sourcetext, p) != 0)