summaryrefslogtreecommitdiff
path: root/src/backend/parser
diff options
context:
space:
mode:
authorNeil Conway2004-01-10 23:28:45 +0000
committerNeil Conway2004-01-10 23:28:45 +0000
commit98dcf085e35e393bdd6740e6a8f8684b27ac2039 (patch)
treed09c442bd3c5125b18e47e890b99463f08b6ffe6 /src/backend/parser
parentcf4c925dd420a969351d83d584366c167ae54d25 (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.c18
-rw-r--r--src/backend/parser/gram.y36
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;