• R/O
  • HTTP
  • SSH
  • HTTPS

pg_hint_plan: コミット

firtst release


コミットメタ情報

リビジョンd4f559dea93e8022d2915da1a53f939127dacc53 (tree)
日時2017-05-19 11:15:39
作者Kyotaro Horiguchi <horiguchi.kyotaro@lab....>
コミッターKyotaro Horiguchi

ログメッセージ

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
@@ -1798,8 +1798,6 @@ get_query_string(ParseState *pstate, Query *query, Query **jumblequery)
17981798 if (jumblequery != NULL)
17991799 *jumblequery = query;
18001800
1801- Assert(plpgsql_recurse_level == 0);
1802-
18031801 if (query->commandType == CMD_UTILITY)
18041802 {
18051803 Query *target_query = query;
@@ -1808,15 +1806,14 @@ get_query_string(ParseState *pstate, Query *query, Query **jumblequery)
18081806 if (IsA(query->utilityStmt, ExplainStmt))
18091807 {
18101808 ExplainStmt *stmt = (ExplainStmt *)(query->utilityStmt);
1809+
18111810 Assert(IsA(stmt->query, Query));
18121811 target_query = (Query *)stmt->query;
18131812
1813+ /* strip out the top-level query for further processing */
18141814 if (target_query->commandType == CMD_UTILITY &&
18151815 target_query->utilityStmt != NULL)
18161816 target_query = (Query *)target_query->utilityStmt;
1817-
1818- if (jumblequery)
1819- *jumblequery = target_query;
18201817 }
18211818
18221819 if (IsA(target_query, CreateTableAsStmt))
@@ -1827,21 +1824,18 @@ get_query_string(ParseState *pstate, Query *query, Query **jumblequery)
18271824 */
18281825 CreateTableAsStmt *stmt = (CreateTableAsStmt *) target_query;
18291826 PreparedStatement *entry;
1830- Query *ent_query;
1827+ Query *tmp_query;
18311828
18321829 Assert(IsA(stmt->query, Query));
1833- target_query = (Query *) stmt->query;
1830+ tmp_query = (Query *) stmt->query;
18341831
1835- if (target_query->commandType == CMD_UTILITY &&
1836- IsA(target_query->utilityStmt, ExecuteStmt))
1832+ if (tmp_query->commandType == CMD_UTILITY &&
1833+ IsA(tmp_query->utilityStmt, ExecuteStmt))
18371834 {
1838- ExecuteStmt *estmt = (ExecuteStmt *) target_query->utilityStmt;
1835+ ExecuteStmt *estmt = (ExecuteStmt *) tmp_query->utilityStmt;
18391836 entry = FetchPreparedStatement(estmt->name, true);
18401837 p = entry->plansource->query_string;
1841- ent_query = (Query *) linitial (entry->plansource->query_list);
1842- Assert(IsA(ent_query, Query));
1843- if (jumblequery)
1844- *jumblequery = ent_query;
1838+ target_query = (Query *) linitial (entry->plansource->query_list);
18451839 }
18461840 }
18471841 else
@@ -1853,15 +1847,19 @@ get_query_string(ParseState *pstate, Query *query, Query **jumblequery)
18531847 */
18541848 ExecuteStmt *stmt = (ExecuteStmt *)target_query;
18551849 PreparedStatement *entry;
1856- Query *ent_query;
18571850
18581851 entry = FetchPreparedStatement(stmt->name, true);
18591852 p = entry->plansource->query_string;
1860- ent_query = (Query *) linitial (entry->plansource->query_list);
1861- Assert(IsA(ent_query, Query));
1862- if (jumblequery)
1863- *jumblequery = ent_query;
1853+ target_query = (Query *) linitial (entry->plansource->query_list);
18641854 }
1855+
1856+ /* We don't accept other than a Query other than a CMD_UTILITY */
1857+ if (!IsA(target_query, Query) ||
1858+ target_query->commandType == CMD_UTILITY)
1859+ target_query = NULL;
1860+
1861+ if (jumblequery)
1862+ *jumblequery = target_query;
18651863 }
18661864 /* Return NULL if the pstate is not identical to the top-level query */
18671865 else if (strcmp(pstate->p_sourcetext, p) != 0)
旧リポジトリブラウザで表示