aboutsummaryrefslogtreecommitdiff
path: root/src/backend/parser
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/parser')
-rw-r--r--src/backend/parser/analyze.c77
-rw-r--r--src/backend/parser/gram.y58
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; }