summaryrefslogtreecommitdiff
path: root/src/backend/parser/analyze.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/parser/analyze.c')
-rw-r--r--src/backend/parser/analyze.c52
1 files changed, 45 insertions, 7 deletions
diff --git a/src/backend/parser/analyze.c b/src/backend/parser/analyze.c
index 333be34fc46..ff1342e500a 100644
--- a/src/backend/parser/analyze.c
+++ b/src/backend/parser/analyze.c
@@ -296,6 +296,11 @@ transformStmt(ParseState *pstate, Node *parseTree)
}
#endif /* RAW_EXPRESSION_COVERAGE_TEST */
+ /*
+ * Caution: when changing the set of statement types that have non-default
+ * processing here, see also stmt_requires_parse_analysis() and
+ * analyze_requires_snapshot().
+ */
switch (nodeTag(parseTree))
{
/*
@@ -378,14 +383,22 @@ transformStmt(ParseState *pstate, Node *parseTree)
}
/*
- * analyze_requires_snapshot
- * Returns true if a snapshot must be set before doing parse analysis
- * on the given raw parse tree.
+ * stmt_requires_parse_analysis
+ * Returns true if parse analysis will do anything non-trivial
+ * with the given raw parse tree.
+ *
+ * Generally, this should return true for any statement type for which
+ * transformStmt() does more than wrap a CMD_UTILITY Query around it.
+ * When it returns false, the caller can assume that there is no situation
+ * in which parse analysis of the raw statement could need to be re-done.
*
- * Classification here should match transformStmt().
+ * Currently, since the rewriter and planner do nothing for CMD_UTILITY
+ * Queries, a false result means that the entire parse analysis/rewrite/plan
+ * pipeline will never need to be re-done. If that ever changes, callers
+ * will likely need adjustment.
*/
bool
-analyze_requires_snapshot(RawStmt *parseTree)
+stmt_requires_parse_analysis(RawStmt *parseTree)
{
bool result;
@@ -398,6 +411,7 @@ analyze_requires_snapshot(RawStmt *parseTree)
case T_DeleteStmt:
case T_UpdateStmt:
case T_SelectStmt:
+ case T_ReturnStmt:
case T_PLAssignStmt:
result = true;
break;
@@ -408,12 +422,12 @@ analyze_requires_snapshot(RawStmt *parseTree)
case T_DeclareCursorStmt:
case T_ExplainStmt:
case T_CreateTableAsStmt:
- /* yes, because we must analyze the contained statement */
+ case T_CallStmt:
result = true;
break;
default:
- /* other utility statements don't have any real parse analysis */
+ /* all other statements just get wrapped in a CMD_UTILITY Query */
result = false;
break;
}
@@ -422,6 +436,30 @@ analyze_requires_snapshot(RawStmt *parseTree)
}
/*
+ * analyze_requires_snapshot
+ * Returns true if a snapshot must be set before doing parse analysis
+ * on the given raw parse tree.
+ */
+bool
+analyze_requires_snapshot(RawStmt *parseTree)
+{
+ /*
+ * Currently, this should return true in exactly the same cases that
+ * stmt_requires_parse_analysis() does, so we just invoke that function
+ * rather than duplicating it. We keep the two entry points separate for
+ * clarity of callers, since from the callers' standpoint these are
+ * different conditions.
+ *
+ * While there may someday be a statement type for which transformStmt()
+ * does something nontrivial and yet no snapshot is needed for that
+ * processing, it seems likely that making such a choice would be fragile.
+ * If you want to install an exception, document the reasoning for it in a
+ * comment.
+ */
+ return stmt_requires_parse_analysis(parseTree);
+}
+
+/*
* transformDeleteStmt -
* transforms a Delete Statement
*/