This patch fixes a bug I introduced in the recent CREATE TABLE AS / WITH
OIDS work. The patch should be pretty straight-forward.
The only question I have is whether analyze.c (and therefore
analyze.h) is the right place to put the new utility function
interpretOidsOption() -- can anyone suggest a better location?
Unless anyone objects, I plan to apply this within 24 hours.
-Neil
Index: src/backend/commands/tablecmds.c
===
RCS file: /Users/neilc/local/cvs/pgsql-server/src/backend/commands/tablecmds.c,v
retrieving revision 1.95
diff -c -r1.95 tablecmds.c
*** src/backend/commands/tablecmds.c 10 Jan 2004 23:28:44 - 1.95
--- src/backend/commands/tablecmds.c 22 Jan 2004 20:32:28 -
***
*** 38,43
--- 38,44
#include optimizer/clauses.h
#include optimizer/plancat.h
#include optimizer/prep.h
+ #include parser/analyze.h
#include parser/gramparse.h
#include parser/parse_coerce.h
#include parser/parse_expr.h
***
*** 47,53
#include utils/acl.h
#include utils/builtins.h
#include utils/fmgroids.h
- #include utils/guc.h
#include utils/inval.h
#include utils/lsyscache.h
#include utils/relcache.h
--- 48,53
***
*** 189,210
if (parentHasOids)
descriptor-tdhasoid = true;
else
! {
! switch (stmt-hasoids)
! {
! case MUST_HAVE_OIDS:
! descriptor-tdhasoid = true;
! break;
!
! case MUST_NOT_HAVE_OIDS:
! descriptor-tdhasoid = false;
! break;
!
! case DEFAULT_OIDS:
! descriptor-tdhasoid = default_with_oids;
! break;
! }
! }
if (old_constraints != NIL)
{
--- 189,195
if (parentHasOids)
descriptor-tdhasoid = true;
else
! descriptor-tdhasoid = interpretOidsOption(stmt-hasoids);
if (old_constraints != NIL)
{
Index: src/backend/parser/analyze.c
===
RCS file: /Users/neilc/local/cvs/pgsql-server/src/backend/parser/analyze.c,v
retrieving revision 1.296
diff -c -r1.296 analyze.c
*** src/backend/parser/analyze.c 14 Jan 2004 23:01:55 - 1.296
--- src/backend/parser/analyze.c 22 Jan 2004 20:32:28 -
***
*** 859,865
cxt.stmtType = CREATE TABLE;
cxt.relation = stmt-relation;
cxt.inhRelations = stmt-inhRelations;
- cxt.hasoids = stmt-hasoids;
cxt.relOid = InvalidOid;
cxt.columns = NIL;
cxt.ckconstraints = NIL;
--- 859,864
***
*** 868,873
--- 867,873
cxt.blist = NIL;
cxt.alist = NIL;
cxt.pkey = NULL;
+ cxt.hasoids = interpretOidsOption(stmt-hasoids);
/*
* Run through each primary element in the table creation clause.
***
*** 1979,1998
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);
--- 1979,1985
if (stmt-intoColNames)
applyColumnNames(qry-targetList, stmt-intoColNames);
! qry-intoHasOids = interpretOidsOption(stmt-intoHasOids);
/* mark column origins */
markTargetListOrigins(pstate, qry-targetList);
***
*** 3338,3341
--- 3325,3355
}
return expression_tree_walker(node, check_parameter_resolution_walker,
(void *) context);
+ }
+
+ /*
+ * Given an enum that specifies whether WITH / WITHOUT OIDS was
+ * specified by the user, return true iff the specified table/result
+ * set should be created with OIDs. This needs to be done after
+ * parsing because it can depend upon the value of the
+ * default_with_oids GUC var.
+ */
+ bool
+ interpretOidsOption(ContainsOids opt)
+ {
+ switch (opt)
+ {
+ case MUST_HAVE_OIDS:
+ return true;
+
+ case MUST_NOT_HAVE_OIDS:
+ return false;
+
+ case DEFAULT_OIDS:
+ return default_with_oids;
+ }
+
+ /* keep the compiler quiet; never reached */
+ Assert(false);
+ return false;
}
Index: src/include/parser/analyze.h
===
RCS file: /Users/neilc/local/cvs/pgsql-server/src/include/parser/analyze.h,v
retrieving revision 1.24
diff -c -r1.24 analyze.h
*** src/include/parser/analyze.h 29 Nov 2003 22:41:09 - 1.24
--- src/include/parser/analyze.h 22 Jan 2004 20:39:25 -
***
*** 24,30
extern void CheckSelectForUpdate(Query *qry);
! /* This was exported to allow ADD CONSTRAINT to make use of it */
extern char *makeObjectName(char *name1, char *name2, char *typename);
#endif /* ANALYZE_H */
--- 24,32
extern void CheckSelectForUpdate(Query *qry);
! /* This is exported to allow ADD CONSTRAINT to make use of it */
extern char *makeObjectName(char