diff options
| author | Neil Conway | 2004-01-10 23:28:45 +0000 |
|---|---|---|
| committer | Neil Conway | 2004-01-10 23:28:45 +0000 |
| commit | 98dcf085e35e393bdd6740e6a8f8684b27ac2039 (patch) | |
| tree | d09c442bd3c5125b18e47e890b99463f08b6ffe6 /src/backend/parser | |
| parent | cf4c925dd420a969351d83d584366c167ae54d25 (diff) | |
Implement "WITH / WITHOID OIDS" clause for CREATE TABLE AS. This is
intended to allow application authors to insulate themselves from
changes to the default value of 'default_with_oids' in future releases
of PostgreSQL.
This patch also fixes a bug in the earlier implementation of the
'default_with_oids' GUC variable: code in gram.y should not examine
the value of GUC variables directly due to synchronization issues.
Diffstat (limited to 'src/backend/parser')
| -rw-r--r-- | src/backend/parser/analyze.c | 18 | ||||
| -rw-r--r-- | src/backend/parser/gram.y | 36 |
2 files changed, 40 insertions, 14 deletions
diff --git a/src/backend/parser/analyze.c b/src/backend/parser/analyze.c index a97606b05d3..bc70cca429a 100644 --- a/src/backend/parser/analyze.c +++ b/src/backend/parser/analyze.c @@ -6,7 +6,7 @@ * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/backend/parser/analyze.c,v 1.293 2004/01/05 20:58:58 neilc Exp $ + * $PostgreSQL: pgsql/src/backend/parser/analyze.c,v 1.294 2004/01/10 23:28:45 neilc Exp $ * *------------------------------------------------------------------------- */ @@ -41,6 +41,7 @@ #include "utils/acl.h" #include "utils/builtins.h" #include "utils/fmgroids.h" +#include "utils/guc.h" #include "utils/lsyscache.h" #include "utils/relcache.h" #include "utils/syscache.h" @@ -1974,6 +1975,21 @@ transformSelectStmt(ParseState *pstate, SelectStmt *stmt) if (stmt->intoColNames) applyColumnNames(qry->targetList, stmt->intoColNames); + switch (stmt->intoHasOids) + { + case MUST_HAVE_OIDS: + qry->intoHasOids = true; + break; + + case MUST_NOT_HAVE_OIDS: + qry->intoHasOids = false; + break; + + case DEFAULT_OIDS: + qry->intoHasOids = default_with_oids; + break; + } + /* mark column origins */ markTargetListOrigins(pstate, qry->targetList); diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index cd8c092a45f..535da4f2b50 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -11,7 +11,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.444 2004/01/10 02:21:08 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.445 2004/01/10 23:28:45 neilc Exp $ * * HISTORY * AUTHOR DATE MAJOR EVENT @@ -63,7 +63,6 @@ #include "utils/numeric.h" #include "utils/datetime.h" #include "utils/date.h" -#include "utils/guc.h" extern List *parsetree; /* final parse result is delivered here */ @@ -109,6 +108,7 @@ static void doNegateFloat(Value *v); JoinType jtype; DropBehavior dbehavior; OnCommitAction oncommit; + ContainsOids withoids; List *list; FastList fastlist; Node *node; @@ -235,8 +235,9 @@ static void doNegateFloat(Value *v); %type <fun_param> func_arg %type <typnam> func_return func_type aggr_argtype -%type <boolean> arg_class TriggerForType OptTemp OptWithOids -%type <oncommit> OnCommitOption +%type <boolean> arg_class TriggerForType OptTemp +%type <oncommit> OnCommitOption +%type <withoids> OptWithOids WithOidsAs %type <list> for_update_clause opt_for_update_clause update_list %type <boolean> opt_all @@ -1824,14 +1825,9 @@ OptInherit: INHERITS '(' qualified_name_list ')' { $$ = $3; } ; OptWithOids: - WITH OIDS { $$ = TRUE; } - | WITHOUT OIDS { $$ = FALSE; } - /* - * If the user didn't explicitely specify WITH or WITHOUT - * OIDS, decide whether to include OIDs based on the - * "default_with_oids" GUC var - */ - | /*EMPTY*/ { $$ = default_with_oids; } + WITH OIDS { $$ = MUST_HAVE_OIDS; } + | WITHOUT OIDS { $$ = MUST_NOT_HAVE_OIDS; } + | /*EMPTY*/ { $$ = DEFAULT_OIDS; } ; OnCommitOption: ON COMMIT DROP { $$ = ONCOMMIT_DROP; } @@ -1847,7 +1843,7 @@ OnCommitOption: ON COMMIT DROP { $$ = ONCOMMIT_DROP; } */ CreateAsStmt: - CREATE OptTemp TABLE qualified_name OptCreateAs AS SelectStmt + CREATE OptTemp TABLE qualified_name OptCreateAs WithOidsAs SelectStmt { /* * When the SelectStmt is a set-operation tree, we must @@ -1864,10 +1860,23 @@ CreateAsStmt: $4->istemp = $2; n->into = $4; n->intoColNames = $5; + n->intoHasOids = $6; $$ = $7; } ; +/* + * To avoid a shift/reduce conflict in CreateAsStmt, we need to + * include the 'AS' terminal in the parsing of WITH/WITHOUT + * OIDS. Unfortunately that means this production is effectively a + * duplicate of OptWithOids. + */ +WithOidsAs: + WITH OIDS AS { $$ = MUST_HAVE_OIDS; } + | WITHOUT OIDS AS { $$ = MUST_NOT_HAVE_OIDS; } + | AS { $$ = DEFAULT_OIDS; } + ; + OptCreateAs: '(' CreateAsList ')' { $$ = $2; } | /*EMPTY*/ { $$ = NIL; } @@ -4531,6 +4540,7 @@ simple_select: n->targetList = $3; n->into = $4; n->intoColNames = NIL; + n->intoHasOids = DEFAULT_OIDS; n->fromClause = $5; n->whereClause = $6; n->groupClause = $7; |
