diff --git a/src/backend/tcop/utility.c b/src/backend/tcop/utility.c index 39bdb19..bdbbb63 100644 --- a/src/backend/tcop/utility.c +++ b/src/backend/tcop/utility.c @@ -1842,9 +1842,10 @@ QueryReturnsTuples(Query *parsetree) * We assume it is invoked only on already-parse-analyzed statements * (else the contained parsetree isn't a Query yet). * - * In some cases (currently, only EXPLAIN of CREATE TABLE AS/SELECT INTO), - * potentially Query-containing utility statements can be nested. This - * function will drill down to a non-utility Query, or return NULL if none. + * In some cases (currently, only EXPLAIN of CREATE TABLE AS/SELECT INTO and + * CREATE TEMPORARY TABLE AS/EXECUTE), potentially Query-containing utility + * statements can be nested. This function will drill down to a non-utility + * Query, or return NULL if none. */ Query * UtilityContainsQuery(Node *parsetree) @@ -1865,8 +1866,14 @@ UtilityContainsQuery(Node *parsetree) qry = (Query *) ((CreateTableAsStmt *) parsetree)->query; if (IsA(qry, Query)) { - /* Recursion currently can't be necessary here */ - Assert(qry->commandType != CMD_UTILITY); + /* + * For CREATE TEMPORARY TABLE as EXECUTE commandtype will be + * CMD_UTILITY, so call function recursively to get the + * contained query. + */ + if (qry->commandType == CMD_UTILITY) + return UtilityContainsQuery(qry->utilityStmt); + return qry; } Assert(IsA(qry, ExecuteStmt));