firtst release
修订版 | 82f6021a18fdd835bcc74cd0f1bfc42dd285ab25 (tree) |
---|---|
时间 | 2017-05-19 10:39:44 |
作者 | Kyotaro Horiguchi <horiguchi.kyotaro@lab....> |
Commiter | 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.
@@ -1661,8 +1661,6 @@ get_query_string(ParseState *pstate, Query *query, Query **jumblequery) | ||
1661 | 1661 | if (jumblequery != NULL) |
1662 | 1662 | *jumblequery = query; |
1663 | 1663 | |
1664 | - Assert(plpgsql_recurse_level == 0); | |
1665 | - | |
1666 | 1664 | if (query->commandType == CMD_UTILITY) |
1667 | 1665 | { |
1668 | 1666 | Query *target_query = query; |
@@ -1671,15 +1669,14 @@ get_query_string(ParseState *pstate, Query *query, Query **jumblequery) | ||
1671 | 1669 | if (IsA(query->utilityStmt, ExplainStmt)) |
1672 | 1670 | { |
1673 | 1671 | ExplainStmt *stmt = (ExplainStmt *)(query->utilityStmt); |
1672 | + | |
1674 | 1673 | Assert(IsA(stmt->query, Query)); |
1675 | 1674 | target_query = (Query *)stmt->query; |
1676 | 1675 | |
1676 | + /* strip out the top-level query for further processing */ | |
1677 | 1677 | if (target_query->commandType == CMD_UTILITY && |
1678 | 1678 | target_query->utilityStmt != NULL) |
1679 | 1679 | target_query = (Query *)target_query->utilityStmt; |
1680 | - | |
1681 | - if (jumblequery) | |
1682 | - *jumblequery = target_query; | |
1683 | 1680 | } |
1684 | 1681 | |
1685 | 1682 | if (IsA(target_query, CreateTableAsStmt)) |
@@ -1690,21 +1687,18 @@ get_query_string(ParseState *pstate, Query *query, Query **jumblequery) | ||
1690 | 1687 | */ |
1691 | 1688 | CreateTableAsStmt *stmt = (CreateTableAsStmt *) target_query; |
1692 | 1689 | PreparedStatement *entry; |
1693 | - Query *ent_query; | |
1690 | + Query *tmp_query; | |
1694 | 1691 | |
1695 | 1692 | Assert(IsA(stmt->query, Query)); |
1696 | - target_query = (Query *) stmt->query; | |
1693 | + tmp_query = (Query *) stmt->query; | |
1697 | 1694 | |
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)) | |
1700 | 1697 | { |
1701 | - ExecuteStmt *estmt = (ExecuteStmt *) target_query->utilityStmt; | |
1698 | + ExecuteStmt *estmt = (ExecuteStmt *) tmp_query->utilityStmt; | |
1702 | 1699 | entry = FetchPreparedStatement(estmt->name, true); |
1703 | 1700 | 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); | |
1708 | 1702 | } |
1709 | 1703 | } |
1710 | 1704 | else |
@@ -1716,15 +1710,19 @@ get_query_string(ParseState *pstate, Query *query, Query **jumblequery) | ||
1716 | 1710 | */ |
1717 | 1711 | ExecuteStmt *stmt = (ExecuteStmt *)target_query; |
1718 | 1712 | PreparedStatement *entry; |
1719 | - Query *ent_query; | |
1720 | 1713 | |
1721 | 1714 | entry = FetchPreparedStatement(stmt->name, true); |
1722 | 1715 | 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); | |
1727 | 1717 | } |
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; | |
1728 | 1726 | } |
1729 | 1727 | /* Return NULL if the pstate is not identical to the top-level query */ |
1730 | 1728 | else if (strcmp(pstate->p_sourcetext, p) != 0) |