リビジョン | 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.
@@ -1798,8 +1798,6 @@ get_query_string(ParseState *pstate, Query *query, Query **jumblequery) | ||
1798 | 1798 | if (jumblequery != NULL) |
1799 | 1799 | *jumblequery = query; |
1800 | 1800 | |
1801 | - Assert(plpgsql_recurse_level == 0); | |
1802 | - | |
1803 | 1801 | if (query->commandType == CMD_UTILITY) |
1804 | 1802 | { |
1805 | 1803 | Query *target_query = query; |
@@ -1808,15 +1806,14 @@ get_query_string(ParseState *pstate, Query *query, Query **jumblequery) | ||
1808 | 1806 | if (IsA(query->utilityStmt, ExplainStmt)) |
1809 | 1807 | { |
1810 | 1808 | ExplainStmt *stmt = (ExplainStmt *)(query->utilityStmt); |
1809 | + | |
1811 | 1810 | Assert(IsA(stmt->query, Query)); |
1812 | 1811 | target_query = (Query *)stmt->query; |
1813 | 1812 | |
1813 | + /* strip out the top-level query for further processing */ | |
1814 | 1814 | if (target_query->commandType == CMD_UTILITY && |
1815 | 1815 | target_query->utilityStmt != NULL) |
1816 | 1816 | target_query = (Query *)target_query->utilityStmt; |
1817 | - | |
1818 | - if (jumblequery) | |
1819 | - *jumblequery = target_query; | |
1820 | 1817 | } |
1821 | 1818 | |
1822 | 1819 | if (IsA(target_query, CreateTableAsStmt)) |
@@ -1827,21 +1824,18 @@ get_query_string(ParseState *pstate, Query *query, Query **jumblequery) | ||
1827 | 1824 | */ |
1828 | 1825 | CreateTableAsStmt *stmt = (CreateTableAsStmt *) target_query; |
1829 | 1826 | PreparedStatement *entry; |
1830 | - Query *ent_query; | |
1827 | + Query *tmp_query; | |
1831 | 1828 | |
1832 | 1829 | Assert(IsA(stmt->query, Query)); |
1833 | - target_query = (Query *) stmt->query; | |
1830 | + tmp_query = (Query *) stmt->query; | |
1834 | 1831 | |
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)) | |
1837 | 1834 | { |
1838 | - ExecuteStmt *estmt = (ExecuteStmt *) target_query->utilityStmt; | |
1835 | + ExecuteStmt *estmt = (ExecuteStmt *) tmp_query->utilityStmt; | |
1839 | 1836 | entry = FetchPreparedStatement(estmt->name, true); |
1840 | 1837 | 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); | |
1845 | 1839 | } |
1846 | 1840 | } |
1847 | 1841 | else |
@@ -1853,15 +1847,19 @@ get_query_string(ParseState *pstate, Query *query, Query **jumblequery) | ||
1853 | 1847 | */ |
1854 | 1848 | ExecuteStmt *stmt = (ExecuteStmt *)target_query; |
1855 | 1849 | PreparedStatement *entry; |
1856 | - Query *ent_query; | |
1857 | 1850 | |
1858 | 1851 | entry = FetchPreparedStatement(stmt->name, true); |
1859 | 1852 | 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); | |
1864 | 1854 | } |
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; | |
1865 | 1863 | } |
1866 | 1864 | /* Return NULL if the pstate is not identical to the top-level query */ |
1867 | 1865 | else if (strcmp(pstate->p_sourcetext, p) != 0) |