diff options
Diffstat (limited to 'src/backend/parser')
-rw-r--r-- | src/backend/parser/analyze.c | 77 | ||||
-rw-r--r-- | src/backend/parser/gram.y | 58 |
2 files changed, 17 insertions, 118 deletions
diff --git a/src/backend/parser/analyze.c b/src/backend/parser/analyze.c index e4a4e3a5e48..dae54783931 100644 --- a/src/backend/parser/analyze.c +++ b/src/backend/parser/analyze.c @@ -56,7 +56,6 @@ static Node *transformSetOperationTree(ParseState *pstate, SelectStmt *stmt, bool isTopLevel, List **targetlist); static void determineRecursiveColTypes(ParseState *pstate, Node *larg, List *nrtargetlist); -static void applyColumnNames(List *dst, List *src); static Query *transformUpdateStmt(ParseState *pstate, UpdateStmt *stmt); static List *transformReturningList(ParseState *pstate, List *returningList); static Query *transformDeclareCursorStmt(ParseState *pstate, @@ -964,13 +963,8 @@ transformSelectStmt(ParseState *pstate, SelectStmt *stmt) pstate->p_windowdefs, &qry->targetList); - /* handle any SELECT INTO/CREATE TABLE AS spec */ - if (stmt->intoClause) - { - qry->intoClause = stmt->intoClause; - if (stmt->intoClause->colNames) - applyColumnNames(qry->targetList, stmt->intoClause->colNames); - } + /* SELECT INTO/CREATE TABLE AS spec is just passed through */ + qry->intoClause = stmt->intoClause; qry->rtable = pstate->p_rtable; qry->jointree = makeFromExpr(pstate->p_joinlist, qual); @@ -1191,13 +1185,8 @@ transformValuesClause(ParseState *pstate, SelectStmt *stmt) (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("SELECT FOR UPDATE/SHARE cannot be applied to VALUES"))); - /* handle any CREATE TABLE AS spec */ - if (stmt->intoClause) - { - qry->intoClause = stmt->intoClause; - if (stmt->intoClause->colNames) - applyColumnNames(qry->targetList, stmt->intoClause->colNames); - } + /* CREATE TABLE AS spec is just passed through */ + qry->intoClause = stmt->intoClause; /* * There mustn't have been any table references in the expressions, else @@ -1268,7 +1257,6 @@ transformSetOperationStmt(ParseState *pstate, SelectStmt *stmt) int leftmostRTI; Query *leftmostQuery; SetOperationStmt *sostmt; - List *intoColNames = NIL; List *sortClause; Node *limitOffset; Node *limitCount; @@ -1306,11 +1294,7 @@ transformSetOperationStmt(ParseState *pstate, SelectStmt *stmt) leftmostSelect = leftmostSelect->larg; Assert(leftmostSelect && IsA(leftmostSelect, SelectStmt) && leftmostSelect->larg == NULL); - if (leftmostSelect->intoClause) - { - qry->intoClause = leftmostSelect->intoClause; - intoColNames = leftmostSelect->intoClause->colNames; - } + qry->intoClause = leftmostSelect->intoClause; /* clear this to prevent complaints in transformSetOperationTree() */ leftmostSelect->intoClause = NULL; @@ -1460,19 +1444,6 @@ transformSetOperationStmt(ParseState *pstate, SelectStmt *stmt) qry->limitCount = transformLimitClause(pstate, limitCount, "LIMIT"); - /* - * Handle SELECT INTO/CREATE TABLE AS. - * - * Any column names from CREATE TABLE AS need to be attached to both the - * top level and the leftmost subquery. We do not do this earlier because - * we do *not* want sortClause processing to be affected. - */ - if (intoColNames) - { - applyColumnNames(qry->targetList, intoColNames); - applyColumnNames(leftmostQuery->targetList, intoColNames); - } - qry->rtable = pstate->p_rtable; qry->jointree = makeFromExpr(pstate->p_joinlist, NULL); @@ -1892,44 +1863,6 @@ determineRecursiveColTypes(ParseState *pstate, Node *larg, List *nrtargetlist) analyzeCTETargetList(pstate, pstate->p_parent_cte, targetList); } -/* - * Attach column names from a ColumnDef list to a TargetEntry list - * (for CREATE TABLE AS) - */ -static void -applyColumnNames(List *dst, List *src) -{ - ListCell *dst_item; - ListCell *src_item; - - src_item = list_head(src); - - foreach(dst_item, dst) - { - TargetEntry *d = (TargetEntry *) lfirst(dst_item); - ColumnDef *s; - - /* junk targets don't count */ - if (d->resjunk) - continue; - - /* fewer ColumnDefs than target entries is OK */ - if (src_item == NULL) - break; - - s = (ColumnDef *) lfirst(src_item); - src_item = lnext(src_item); - - d->resname = pstrdup(s->colname); - } - - /* more ColumnDefs than target entries is not OK */ - if (src_item != NULL) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("CREATE TABLE AS specifies too many column names"))); -} - /* * transformUpdateStmt - diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index 7ea38e4663e..2a497d1b79d 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -387,8 +387,7 @@ static void processCASbits(int cas_bits, int location, const char *constrType, %type <node> case_expr case_arg when_clause case_default %type <list> when_clause_list %type <ival> sub_type -%type <list> OptCreateAs CreateAsList -%type <node> CreateAsElement ctext_expr +%type <node> ctext_expr %type <value> NumericOnly %type <list> NumericOnly_list %type <alias> alias_clause @@ -3015,8 +3014,7 @@ CreateAsStmt: * When the SelectStmt is a set-operation tree, we must * stuff the INTO information into the leftmost component * Select, because that's where analyze.c will expect - * to find it. Similarly, the output column names must - * be attached to that Select's target list. + * to find it. */ SelectStmt *n = findLeftmostSelect((SelectStmt *) $6); if (n->intoClause != NULL) @@ -3024,17 +3022,16 @@ CreateAsStmt: (errcode(ERRCODE_SYNTAX_ERROR), errmsg("CREATE TABLE AS cannot specify INTO"), parser_errposition(exprLocation((Node *) n->intoClause)))); - $4->rel->relpersistence = $2; n->intoClause = $4; - /* Implement WITH NO DATA by forcing top-level LIMIT 0 */ - if (!$7) - ((SelectStmt *) $6)->limitCount = makeIntConst(0, -1); + /* cram additional flags into the IntoClause */ + $4->rel->relpersistence = $2; + $4->skipData = !($7); $$ = $6; } ; create_as_target: - qualified_name OptCreateAs OptWith OnCommitOption OptTableSpace + qualified_name opt_column_list OptWith OnCommitOption OptTableSpace { $$ = makeNode(IntoClause); $$->rel = $1; @@ -3042,36 +3039,7 @@ create_as_target: $$->options = $3; $$->onCommit = $4; $$->tableSpaceName = $5; - } - ; - -OptCreateAs: - '(' CreateAsList ')' { $$ = $2; } - | /*EMPTY*/ { $$ = NIL; } - ; - -CreateAsList: - CreateAsElement { $$ = list_make1($1); } - | CreateAsList ',' CreateAsElement { $$ = lappend($1, $3); } - ; - -CreateAsElement: - ColId - { - ColumnDef *n = makeNode(ColumnDef); - n->colname = $1; - n->typeName = NULL; - n->inhcount = 0; - n->is_local = true; - n->is_not_null = false; - n->is_from_type = false; - n->storage = 0; - n->raw_default = NULL; - n->cooked_default = NULL; - n->collClause = NULL; - n->collOid = InvalidOid; - n->constraints = NIL; - $$ = (Node *)n; + $$->skipData = false; /* might get changed later */ } ; @@ -8030,18 +7998,15 @@ ExecuteStmt: EXECUTE name execute_param_clause $$ = (Node *) n; } | CREATE OptTemp TABLE create_as_target AS - EXECUTE name execute_param_clause + EXECUTE name execute_param_clause opt_with_data { ExecuteStmt *n = makeNode(ExecuteStmt); n->name = $7; n->params = $8; - $4->rel->relpersistence = $2; n->into = $4; - if ($4->colNames) - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("column name list not allowed in CREATE TABLE / AS EXECUTE"))); - /* ... because it's not implemented, but it could be */ + /* cram additional flags into the IntoClause */ + $4->rel->relpersistence = $2; + $4->skipData = !($9); $$ = (Node *) n; } ; @@ -8583,6 +8548,7 @@ into_clause: $$->options = NIL; $$->onCommit = ONCOMMIT_NOOP; $$->tableSpaceName = NULL; + $$->skipData = false; } | /*EMPTY*/ { $$ = NULL; } |