[PATCHES] fix recent WITH OIDS bug

2004-01-22 Thread Neil Conway
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 

Re: [PATCHES] fix recent WITH OIDS bug

2004-01-22 Thread Neil Conway
Tom Lane [EMAIL PROTECTED] writes:
 You could possibly put it next to the existing function
 interpretInhOption(), which does essentially the same kind of thing
 and for the same reason.  However, I can't argue that that
 function's placement in parse_clause.c has any real strong
 motivation either...

Yeah, I had considered that, but hesitated for the same reason you
cite. Is it worth creating a parse_util.c, perhaps? makeObjectName()
and CheckSelectForUpdate() from analyze.c might be worth moving there
as well...

-Neil


---(end of broadcast)---
TIP 3: if posting/reading through Usenet, please send an appropriate
  subscribe-nomail command to [EMAIL PROTECTED] so that your
  message can get through to the mailing list cleanly


Re: [PATCHES] fix recent WITH OIDS bug

2004-01-22 Thread Tom Lane
Neil Conway [EMAIL PROTECTED] writes:
 Yeah, I had considered that, but hesitated for the same reason you
 cite. Is it worth creating a parse_util.c, perhaps?

Okay with me, if you feel like taking the trouble.

regards, tom lane

---(end of broadcast)---
TIP 7: don't forget to increase your free space map settings