Skip site navigation (1) Skip section navigation (2)

Re: Adds the parsing of a CREATE SCHEMA statement

From: Bruce Momjian <pgman(at)candle(dot)pha(dot)pa(dot)us>
To: Fernando Nasser <fnasser(at)redhat(dot)com>
Cc: pgsql-patches(at)postgresql(dot)org
Subject: Re: Adds the parsing of a CREATE SCHEMA statement
Date: 2002-03-11 18:58:17
Message-ID: 200203111858.g2BIwHZ01523@candle.pha.pa.us (view raw or flat)
Thread:
Lists: pgsql-patches
I assume you do _not_ want this applied as is is part of Tom's schema
work, right?


---------------------------------------------------------------------------

Fernando Nasser wrote:
> ChnageLog:
> 
>         Adds the parsing of a CREATE SCHEMA statement.  It is 
>         still just syntactic sugar as we still have a single namespace.
>         We also now accept qualified names for tables and views (where
> the
>         reference is for tables, not for columns) but we do nothing with
> it.
> 
> 
> -- 
> Fernando Nasser
> Red Hat Canada Ltd.                     E-Mail:  fnasser(at)redhat(dot)com
> 2323 Yonge Street, Suite #300
> Toronto, Ontario   M4P 2C9

> Index: src/backend/nodes/copyfuncs.c
> ===================================================================
> RCS file: /projects/cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v
> retrieving revision 1.163
> diff -c -p -r1.163 copyfuncs.c
> *** src/backend/nodes/copyfuncs.c	2002/02/26 22:47:05	1.163
> --- src/backend/nodes/copyfuncs.c	2002/02/28 20:46:34
> *************** _copyReindexStmt(ReindexStmt *from)
> *** 2508,2514 ****
> --- 2508,2528 ----
>   	return newnode;
>   }
>   
> + static CreateSchemaStmt *
> + _copyCreateSchemaStmt(CreateSchemaStmt *from)
> + {
> + 	CreateSchemaStmt *newnode = makeNode(CreateSchemaStmt);
> + 
> + 	newnode->schemaname = pstrdup(from->schemaname);
> + 	if (from->authid)
> + 		newnode->authid = pstrdup(from->authid);
> + 	Node_Copy(from, newnode, schemaElts);
> + 	newnode->in_progress = from->in_progress;
>   
> + 	return newnode;
> + }
> + 
> + 
>   /* ****************************************************************
>    *					pg_list.h copy functions
>    * ****************************************************************
> *************** copyObject(void *from)
> *** 2905,2910 ****
> --- 2919,2927 ----
>   			break;
>   		case T_CheckPointStmt:
>   			retval = (void *) makeNode(CheckPointStmt);
> + 			break;
> + 		case T_CreateSchemaStmt:
> + 			retval = _copyCreateSchemaStmt(from);
>   			break;
>   
>   		case T_A_Expr:
> Index: src/backend/nodes/equalfuncs.c
> ===================================================================
> RCS file: /projects/cvsroot/pgsql/src/backend/nodes/equalfuncs.c,v
> retrieving revision 1.111
> diff -c -p -r1.111 equalfuncs.c
> *** src/backend/nodes/equalfuncs.c	2002/02/26 22:47:05	1.111
> --- src/backend/nodes/equalfuncs.c	2002/02/28 20:46:34
> *************** _equalReindexStmt(ReindexStmt *a, Reinde
> *** 1369,1374 ****
> --- 1369,1389 ----
>   }
>   
>   static bool
> + _equalCreateSchemaStmt(CreateSchemaStmt *a, CreateSchemaStmt *b)
> + {
> + 	if (!equalstr(a->schemaname, b->schemaname))
> + 		return false;
> + 	if (!equalstr(a->authid, b->authid))
> + 		return false;
> + 	if (!equal(a->schemaElts, b->schemaElts))
> + 		return false;
> + 	if (a->in_progress != b->in_progress)
> + 		return false;
> + 
> + 	return true;
> + }
> + 
> + static bool
>   _equalAExpr(A_Expr *a, A_Expr *b)
>   {
>   	if (a->oper != b->oper)
> *************** equal(void *a, void *b)
> *** 2050,2055 ****
> --- 2065,2073 ----
>   			break;
>   		case T_CheckPointStmt:
>   			retval = true;
> + 			break;
> + 		case T_CreateSchemaStmt:
> + 			retval = _equalCreateSchemaStmt(a, b);
>   			break;
>   
>   		case T_A_Expr:
> Index: src/backend/parser/analyze.c
> ===================================================================
> RCS file: /projects/cvsroot/pgsql/src/backend/parser/analyze.c,v
> retrieving revision 1.215
> diff -c -p -r1.215 analyze.c
> *** src/backend/parser/analyze.c	2002/02/26 22:47:08	1.215
> --- src/backend/parser/analyze.c	2002/02/28 20:46:34
> ***************
> *** 43,48 ****
> --- 43,66 ----
>   #endif
>   
>   
> + /* State shared by transformCreateSchemaStmt and its subroutines */
> + typedef struct
> + {
> + 	const char *stmtType;		/* "CREATE TABLE" or "ALTER TABLE" */
> + 	char	   *schemaname;		/* name of schema */
> + 	char	   *authid;			/* owner of schema */
> + 	List	   *tables;			/* CREATE TABLE items */
> + 	List	   *views;			/* CREATE VIEW items */
> + 	List	   *grants;			/* GRANT items */
> + 	List	   *fwconstraints;	/* Forward referencing FOREIGN KEY constraints */
> + 	List	   *alters;			/* Generated ALTER items (from the above) */
> + 	List	   *ixconstraints;	/* index-creating constraints */
> + 	List	   *blist;			/* "before list" of things to do before
> + 								 * creating the schema */
> + 	List	   *alist;			/* "after list" of things to do after
> + 								 * creating the schema */
> + } CreateSchemaStmtContext;
> + 
>   /* State shared by transformCreateStmt and its subroutines */
>   typedef struct
>   {
> *************** static Query *transformSelectStmt(ParseS
> *** 76,81 ****
> --- 94,101 ----
>   static Query *transformSetOperationStmt(ParseState *pstate, SelectStmt *stmt);
>   static Node *transformSetOperationTree(ParseState *pstate, SelectStmt *stmt);
>   static Query *transformUpdateStmt(ParseState *pstate, UpdateStmt *stmt);
> + static Query *transformCreateSchemaStmt(ParseState *pstate, CreateSchemaStmt *stmt,
> + 						List **extras_before, List **extras_after);
>   static Query *transformCreateStmt(ParseState *pstate, CreateStmt *stmt,
>   						List **extras_before, List **extras_after);
>   static Query *transformAlterTableStmt(ParseState *pstate, AlterTableStmt *stmt,
> *************** parse_analyze(Node *parseTree, ParseStat
> *** 130,135 ****
> --- 150,159 ----
>   
>   	query = transformStmt(pstate, parseTree, &extras_before, &extras_after);
>   	release_pstate_resources(pstate);
> + 	
> + 	/* Check if we are done processing this parseTree */
> + 	if (query == NULL)
> + 		return NIL;
>   
>   	while (extras_before != NIL)
>   	{
> *************** transformStmt(ParseState *pstate, Node *
> *** 186,191 ****
> --- 210,225 ----
>   			/*
>   			 * Non-optimizable statements
>   			 */
> + 		case T_CreateSchemaStmt:
> + 			/*
> + 			 * transformCreateSchemaStmt sets the parseTree nodeTag to
> + 			 * T_Invalid when its done; otherwise the parseTree
> + 			 * is modified to contain what still has to be done
> + 			 */
> + 			result = transformCreateSchemaStmt(pstate, (CreateSchemaStmt *) parseTree,
> + 									extras_before, extras_after);
> + 			break;
> + 
>   		case T_CreateStmt:
>   			result = transformCreateStmt(pstate, (CreateStmt *) parseTree,
>   									extras_before, extras_after);
> *************** CreateIndexName(char *table_name, char *
> *** 671,676 ****
> --- 705,797 ----
>   	}
>   
>   	return iname;
> + }
> + 
> + /*
> +  * transformCreateSchemaStmt -
> +  *	  transforms the "create schema" statement
> +  *
> +  *    Split the schema element list into individual commands and place
> +  *     them in the extras_after list in an order such that there is no
> +  *     forward references (e.g. GRANT to a table created after in the list).
> +  *	  SQL92also allows constraints to make forward references, so thumb through
> +  *	   the table columns and move forward references to a posterior alter table.
> +  */
> + static Query *
> + transformCreateSchemaStmt(ParseState *pstate, CreateSchemaStmt *stmt,
> + 					List **extras_before, List **extras_after)
> + {
> + 	CreateSchemaStmtContext cxt;
> + 	Query	   *q;
> + 	List	   *elements;
> + 
> + 	cxt.stmtType = "CREATE SCHEMA";
> + 	cxt.schemaname = stmt->schemaname;
> + 	cxt.authid = stmt->authid;
> + 	cxt.tables = NIL;
> + 	cxt.views = NIL;
> + 	cxt.grants = NIL;
> + 	cxt.fwconstraints = NIL;
> + 	cxt.alters = NIL;
> + 	cxt.blist = NIL;
> + 	cxt.alist = NIL;
> + 
> + 	/*
> + 	 * Run through each schema element in the schema element list.
> + 	 * Separate statements by type, and do preliminary analysis.
> + 	 */
> + 	foreach(elements, stmt->schemaElts)
> + 	{
> + 		Node	   *element = lfirst(elements);
> + 
> + 		switch (nodeTag(element))
> + 		{
> + 			case T_CreateStmt:
> + 				cxt.tables = lappend(cxt.tables, element);
> + 				break;
> + 
> + 			case T_ViewStmt:
> + 				cxt.views = lappend(cxt.views, element);
> + 				break;
> + 
> + 			case T_GrantStmt:
> + 				cxt.grants = lappend(cxt.grants, element);
> + 				break;
> + 
> + 			default:
> + 				elog(ERROR, "parser: unrecognized schema node (internal error)");
> + 		}
> + 	}
> + 	
> + 	if (cxt.tables != NIL)
> + 	{
> + 		cxt.alist = nconc(cxt.alist, cxt.tables);
> + 		stmt->schemaElts = cxt.views;
> + 		stmt->schemaElts = nconc(stmt->schemaElts, cxt.grants);
> + 	} else if (cxt.views != NIL)
> + 	{
> + 		/* Views have to be processed one at a time */
> + 		cxt.alist = makeList1(lfirst(cxt.views));
> + 		stmt->schemaElts = nconc(lnext(cxt.views), cxt.grants);
> + 	} else if (cxt.grants != NIL)
> + 	{
> + 		cxt.alist = nconc(cxt.alist, cxt.grants);
> + 		stmt->schemaElts = NIL;
> + 	} else if (stmt->in_progress)
> + 		/* ProcessUtility marks the T_CreateSchemaStmt as in progress so
> + 		   we do not try to create the schema again */	
> + 		return NULL;
> + 
> + 	/*
> + 	 * Output results.
> + 	 */
> + 	q = makeNode(Query);
> + 	q->commandType = CMD_UTILITY;
> + 	q->utilityStmt = (Node *) stmt;
> + 	*extras_before = nconc (*extras_before, cxt.blist);
> + 	*extras_after = nconc (cxt.alist, *extras_after);
> + 
> + 	return q;
>   }
>   
>   /*
> Index: src/backend/parser/gram.y
> ===================================================================
> RCS file: /projects/cvsroot/pgsql/src/backend/parser/gram.y,v
> retrieving revision 2.281
> diff -c -p -r2.281 gram.y
> *** src/backend/parser/gram.y	2002/02/25 03:37:14	2.281
> --- src/backend/parser/gram.y	2002/02/28 20:46:36
> *************** static void doNegateFloat(Value *v);
> *** 129,135 ****
>   	InsertStmt			*istmt;
>   }
>   
> ! %type <node>	stmt,
>   		AlterGroupStmt, AlterSchemaStmt, AlterTableStmt, AlterUserStmt,
>   		AnalyzeStmt,
>   		ClosePortalStmt, ClusterStmt, CommentStmt, ConstraintsSetStmt,
> --- 129,135 ----
>   	InsertStmt			*istmt;
>   }
>   
> ! %type <node>	stmt, schema_stmt, nonschema_stmt,
>   		AlterGroupStmt, AlterSchemaStmt, AlterTableStmt, AlterUserStmt,
>   		AnalyzeStmt,
>   		ClosePortalStmt, ClusterStmt, CommentStmt, ConstraintsSetStmt,
> *************** static void doNegateFloat(Value *v);
> *** 166,171 ****
> --- 166,174 ----
>   %type <list>	OptUserList
>   %type <defelt>	OptUserElem
>   
> + %type <str>		OptSchemaName
> + %type <list>	OptSchemaEltList
> + 
>   %type <boolean>	TriggerActionTime, TriggerForSpec, opt_trusted, opt_procedural
>   %type <str>		opt_lancompiler
>   
> *************** static void doNegateFloat(Value *v);
> *** 176,182 ****
>   
>   %type <str>		relation_name, copy_file_name, copy_delimiter, copy_null,
>   		database_name, access_method_clause, access_method, attr_name,
> ! 		class, index_name, name, func_name, file_name
>   
>   %type <str>		opt_id,
>   		all_Op, MathOp, opt_name,
> --- 179,185 ----
>   
>   %type <str>		relation_name, copy_file_name, copy_delimiter, copy_null,
>   		database_name, access_method_clause, access_method, attr_name,
> ! 		class, index_name, name, func_name, file_name, qualified_name
>   
>   %type <str>		opt_id,
>   		all_Op, MathOp, opt_name,
> *************** stmtmulti:  stmtmulti ';' stmt
> *** 435,448 ****
>   					$$ = NIL;
>   				}
>   		;
>   
> ! stmt :	AlterSchemaStmt
>   		| AlterTableStmt
>   		| AlterGroupStmt
>   		| AlterUserStmt
>   		| ClosePortalStmt
>   		| CopyStmt
> - 		| CreateStmt
>   		| CreateAsStmt
>   		| CreateSchemaStmt
>   		| CreateGroupStmt
> --- 438,462 ----
>   					$$ = NIL;
>   				}
>   		;
> + 
> + /*
> +  *	schema_stmt are the ones that can show up inside a CREATE SCHEMA
> +  *  statement (in addition to by themselves).
> +  */
> + stmt:	schema_stmt | nonschema_stmt
> + 		;
>   
> ! schema_stmt : CreateStmt
> ! 		| GrantStmt
> ! 		| ViewStmt
> ! 		;
> ! 
> ! nonschema_stmt :	AlterSchemaStmt
>   		| AlterTableStmt
>   		| AlterGroupStmt
>   		| AlterUserStmt
>   		| ClosePortalStmt
>   		| CopyStmt
>   		| CreateAsStmt
>   		| CreateSchemaStmt
>   		| CreateGroupStmt
> *************** stmt :	AlterSchemaStmt
> *** 462,468 ****
>   		| DropUserStmt
>   		| ExplainStmt
>   		| FetchStmt
> - 		| GrantStmt
>   		| IndexStmt
>   		| ListenStmt
>   		| UnlistenStmt
> --- 476,481 ----
> *************** stmt :	AlterSchemaStmt
> *** 478,484 ****
>   		| OptimizableStmt
>   		| RuleStmt
>   		| TransactionStmt
> - 		| ViewStmt
>   		| LoadStmt
>   		| CreatedbStmt
>   		| DropdbStmt
> --- 491,496 ----
> *************** DropGroupStmt: DROP GROUP UserId
> *** 729,743 ****
>    *
>    *****************************************************************************/
>   
> ! CreateSchemaStmt:  CREATE SCHEMA UserId
>   				{
> ! 					/* for now, just make this the same as CREATE DATABASE */
> ! 					CreatedbStmt *n = makeNode(CreatedbStmt);
> ! 					n->dbname = $3;
> ! 					n->dbowner = NULL;
> ! 					n->dbpath = NULL;
> ! 					n->dbtemplate = NULL;
> ! 					n->encoding = -1;
>   					$$ = (Node *)n;
>   				}
>   		;
> --- 741,767 ----
>    *
>    *****************************************************************************/
>   
> ! CreateSchemaStmt:  CREATE SCHEMA OptSchemaName AUTHORIZATION UserId OptSchemaEltList
>   				{
> ! 					CreateSchemaStmt *n = makeNode(CreateSchemaStmt);
> ! 					/* One can omit the schema name or the authorization id... */
> ! 					if ($3 != NULL) 
> ! 						n->schemaname = $3;
> ! 					else
> ! 						n->schemaname = $5;
> ! 					n->authid = $5;
> ! 					n->schemaElts = $6;
> ! 					n->in_progress = false;
> ! 					$$ = (Node *)n;
> ! 				}
> ! 		| CREATE SCHEMA ColId OptSchemaEltList
> ! 				{
> ! 					CreateSchemaStmt *n = makeNode(CreateSchemaStmt);
> ! 					/* ...but not both */
> ! 					n->schemaname = $3;
> ! 					n->authid = NULL;
> ! 					n->schemaElts = $4;
> ! 					n->in_progress = false;
>   					$$ = (Node *)n;
>   				}
>   		;
> *************** AlterSchemaStmt:  ALTER SCHEMA UserId
> *** 750,760 ****
>   
>   DropSchemaStmt:  DROP SCHEMA UserId
>   				{
> ! 					DropdbStmt *n = makeNode(DropdbStmt);
> ! 					n->dbname = $3;
> ! 					$$ = (Node *)n;
>   				}
>   
>   
>   /*****************************************************************************
>    *
> --- 774,794 ----
>   
>   DropSchemaStmt:  DROP SCHEMA UserId
>   				{
> ! 					elog(ERROR, "DROP SCHEMA not yet supported");
>   				}
>   
> + OptSchemaName: ColId								{ $$ = $1 }
> + 		| /* EMPTY */								{ $$ = NULL; }
> + 		;
> + 
> + OptSchemaEltList: OptSchemaEltList schema_stmt
> + 		{	if ($1 == NIL)
> + 				$$ = makeList1($2);
> + 			else
> + 				$$ = lappend($1, $2); 
> + 		}
> + 		| /* EMPTY */								{ $$ = NIL; }
> + 		;
>   
>   /*****************************************************************************
>    *
> *************** copy_null:      WITH NULL_P AS Sconst			
> *** 1253,1259 ****
>    *
>    *****************************************************************************/
>   
> ! CreateStmt:  CREATE OptTemp TABLE relation_name '(' OptTableElementList ')' OptInherit OptWithOids
>   				{
>   					CreateStmt *n = makeNode(CreateStmt);
>   					n->relname = $4;
> --- 1287,1293 ----
>    *
>    *****************************************************************************/
>   
> ! CreateStmt:  CREATE OptTemp TABLE qualified_name '(' OptTableElementList ')' OptInherit OptWithOids
>   				{
>   					CreateStmt *n = makeNode(CreateStmt);
>   					n->relname = $4;
> *************** OptWithOids:  WITH OIDS						{ $$ = TRUE
> *** 1616,1622 ****
>    * SELECT ... INTO.
>    */
>   
> ! CreateAsStmt:  CREATE OptTemp TABLE relation_name OptCreateAs AS SelectStmt
>   				{
>   					/*
>   					 * When the SelectStmt is a set-operation tree, we must
> --- 1650,1656 ----
>    * SELECT ... INTO.
>    */
>   
> ! CreateAsStmt:  CREATE OptTemp TABLE qualified_name OptCreateAs AS SelectStmt
>   				{
>   					/*
>   					 * When the SelectStmt is a set-operation tree, we must
> *************** opt_chain: AND NO CHAIN
> *** 3010,3016 ****
>    *
>    *****************************************************************************/
>   
> ! ViewStmt:  CREATE VIEW name opt_column_list AS SelectStmt
>   				{
>   					ViewStmt *n = makeNode(ViewStmt);
>   					n->viewname = $3;
> --- 3044,3050 ----
>    *
>    *****************************************************************************/
>   
> ! ViewStmt:  CREATE VIEW qualified_name opt_column_list AS SelectStmt
>   				{
>   					ViewStmt *n = makeNode(ViewStmt);
>   					n->viewname = $3;
> *************** join_qual:  USING '(' name_list ')'				{
> *** 4049,4055 ****
>   		;
>   
>   
> ! relation_expr:	relation_name
>   				{
>   					/* default inheritance */
>   					$$ = makeNode(RangeVar);
> --- 4083,4089 ----
>   		;
>   
>   
> ! relation_expr:	qualified_name
>   				{
>   					/* default inheritance */
>   					$$ = makeNode(RangeVar);
> *************** relation_expr:	relation_name
> *** 4057,4063 ****
>   					$$->inhOpt = INH_DEFAULT;
>   					$$->name = NULL;
>   				}
> ! 		| relation_name '*'
>   				{
>   					/* inheritance query */
>   					$$ = makeNode(RangeVar);
> --- 4091,4097 ----
>   					$$->inhOpt = INH_DEFAULT;
>   					$$->name = NULL;
>   				}
> ! 		| qualified_name '*'
>   				{
>   					/* inheritance query */
>   					$$ = makeNode(RangeVar);
> *************** relation_expr:	relation_name
> *** 4065,4071 ****
>   					$$->inhOpt = INH_YES;
>   					$$->name = NULL;
>   				}
> ! 		| ONLY relation_name
>   				{
>   					/* no inheritance */
>   					$$ = makeNode(RangeVar);
> --- 4099,4105 ----
>   					$$->inhOpt = INH_YES;
>   					$$->name = NULL;
>   				}
> ! 		| ONLY qualified_name
>   				{
>   					/* no inheritance */
>   					$$ = makeNode(RangeVar);
> *************** relation_name:	SpecialRuleRelation
> *** 5611,5616 ****
> --- 5645,5660 ----
>   				}
>   		;
>   
> + qualified_name: ColId
> + 				{
> + 					$$ = $1;
> + 				}
> + 		| ColId '.' ColId
> + 				{
> + 					$$ = $3;
> + 				}
> + 		;
> + 
>   name:					ColId			{ $$ = $1; };
>   database_name:			ColId			{ $$ = $1; };
>   access_method:			ColId			{ $$ = $1; };
> *************** unreserved_keyword:
> *** 5791,5797 ****
>   		| AGGREGATE						{ $$ = "aggregate"; }
>   		| ALTER							{ $$ = "alter"; }
>   		| AT							{ $$ = "at"; }
> - 		| AUTHORIZATION					{ $$ = "authorization"; }
>   		| BACKWARD						{ $$ = "backward"; }
>   		| BEFORE						{ $$ = "before"; }
>   		| BEGIN_TRANS					{ $$ = "begin"; }
> --- 5835,5840 ----
> *************** unreserved_keyword:
> *** 5808,5814 ****
>   		| COMMITTED						{ $$ = "committed"; }
>   		| CONSTRAINTS					{ $$ = "constraints"; }
>   		| COPY							{ $$ = "copy"; }
> - 		| CREATE						{ $$ = "create"; }
>   		| CREATEDB						{ $$ = "createdb"; }
>   		| CREATEUSER					{ $$ = "createuser"; }
>   		| CURSOR						{ $$ = "cursor"; }
> --- 5851,5856 ----
> *************** unreserved_keyword:
> *** 5833,5839 ****
>   		| FORWARD						{ $$ = "forward"; }
>   		| FUNCTION						{ $$ = "function"; }
>   		| GLOBAL						{ $$ = "global"; }
> - 		| GRANT							{ $$ = "grant"; }
>   		| HANDLER						{ $$ = "handler"; }
>   		| HOUR_P						{ $$ = "hour"; }
>   		| IMMEDIATE						{ $$ = "immediate"; }
> --- 5875,5880 ----
> *************** unreserved_keyword:
> *** 5911,5917 ****
>   		| STDIN							{ $$ = "stdin"; }
>   		| STDOUT						{ $$ = "stdout"; }
>   		| SYSID							{ $$ = "sysid"; }
> - 		| TEMP							{ $$ = "temp"; }
>   		| TEMPLATE						{ $$ = "template"; }
>   		| TEMPORARY						{ $$ = "temporary"; }
>   		| TOAST							{ $$ = "toast"; }
> --- 5952,5957 ----
> *************** col_name_keyword:
> *** 5967,5972 ****
> --- 6007,6013 ----
>   		| POSITION						{ $$ = "position"; }
>   		| SETOF							{ $$ = "setof"; }
>   		| SUBSTRING						{ $$ = "substring"; }
> + 		| TEMP							{ $$ = "temp"; }
>   		| TIME							{ $$ = "time"; }
>   		| TIMESTAMP						{ $$ = "timestamp"; }
>   		| TRIM							{ $$ = "trim"; }
> *************** col_name_keyword:
> *** 5984,5990 ****
>    *  - thomas 2000-11-28
>    */
>   func_name_keyword:
> ! 		  BETWEEN						{ $$ = "between"; }
>   		| BINARY						{ $$ = "binary"; }
>   		| CROSS							{ $$ = "cross"; }
>   		| FREEZE						{ $$ = "freeze"; }
> --- 6025,6032 ----
>    *  - thomas 2000-11-28
>    */
>   func_name_keyword:
> ! 		  AUTHORIZATION					{ $$ = "authorization"; }
> ! 		| BETWEEN						{ $$ = "between"; }
>   		| BINARY						{ $$ = "binary"; }
>   		| CROSS							{ $$ = "cross"; }
>   		| FREEZE						{ $$ = "freeze"; }
> *************** reserved_keyword:
> *** 6027,6032 ****
> --- 6069,6075 ----
>   		| COLLATE						{ $$ = "collate"; }
>   		| COLUMN						{ $$ = "column"; }
>   		| CONSTRAINT					{ $$ = "constraint"; }
> + 		| CREATE						{ $$ = "create"; }
>   		| CURRENT_DATE					{ $$ = "current_date"; }
>   		| CURRENT_TIME					{ $$ = "current_time"; }
>   		| CURRENT_TIMESTAMP				{ $$ = "current_timestamp"; }
> *************** reserved_keyword:
> *** 6043,6048 ****
> --- 6086,6092 ----
>   		| FOR							{ $$ = "for"; }
>   		| FOREIGN						{ $$ = "foreign"; }
>   		| FROM							{ $$ = "from"; }
> + 		| GRANT							{ $$ = "grant"; }
>   		| GROUP							{ $$ = "group"; }
>   		| HAVING						{ $$ = "having"; }
>   		| INITIALLY						{ $$ = "initially"; }
> Index: src/backend/tcop/utility.c
> ===================================================================
> RCS file: /projects/cvsroot/pgsql/src/backend/tcop/utility.c,v
> retrieving revision 1.127
> diff -c -p -r1.127 utility.c
> *** src/backend/tcop/utility.c	2002/02/26 22:47:09	1.127
> --- src/backend/tcop/utility.c	2002/02/28 20:46:36
> *************** ProcessUtility(Node *parsetree,
> *** 220,225 ****
> --- 220,240 ----
>   			 * manipulation ********************************
>   			 *
>   			 */
> + 		case T_CreateSchemaStmt:
> + 			{
> + 				CreateSchemaStmt  *stmt = (CreateSchemaStmt *) parsetree;
> + 				if (stmt->in_progress)
> + 					break;  /* Has created the schema already in a previous pass */
> + 				stmt->in_progress = true;
> + 				elog(NOTICE, "Schema %s owned by %s will be created",
> + 					stmt->schemaname, stmt->authid);
> + 				/*
> + 				 * Let commands in the schema-element-list know about the schema
> + 				 */
> + 				CommandCounterIncrement();
> + 			}
> + 			break;
> + 
>   		case T_CreateStmt:
>   			DefineRelation((CreateStmt *) parsetree, RELKIND_RELATION);
>   
> Index: src/include/nodes/parsenodes.h
> ===================================================================
> RCS file: /projects/cvsroot/pgsql/src/include/nodes/parsenodes.h,v
> retrieving revision 1.154
> diff -c -p -r1.154 parsenodes.h
> *** src/include/nodes/parsenodes.h	2002/02/26 22:47:10	1.154
> --- src/include/nodes/parsenodes.h	2002/02/28 20:46:38
> *************** typedef enum InhOption
> *** 110,115 ****
> --- 110,132 ----
>    *****************************************************************************/
>   
>   /* ----------------------
> +  *		Create Schema Statement
> +  *
> +  * NOTE: The schemaElts list contain several of the other nodes before
> +  * parse analysis.  These become independent nodes after that and the
> +  * list is empty.
> +  * ----------------------
> +  */
> + typedef struct CreateSchemaStmt
> + {
> + 	NodeTag		type;
> + 	char	   *schemaname;		/* the name of the schema to create */
> + 	char	   *authid;			/* the owner of the created schema */
> + 	List	   *schemaElts;		/* column definitions (list of ColumnDef) */
> + 	bool		in_progress;	/* used by analyze */
> + } CreateSchemaStmt;
> + 
> + /* ----------------------
>    *	Alter Table
>    *
>    * The fields are used in different ways by the different variants of

> 
> ---------------------------(end of broadcast)---------------------------
> TIP 1: subscribe and unsubscribe commands go to majordomo(at)postgresql(dot)org

-- 
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman(at)candle(dot)pha(dot)pa(dot)us               |  (610) 853-3000
  +  If your life is a hard drive,     |  830 Blythe Avenue
  +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026

In response to

Responses

pgsql-patches by date

Next:From: Bruce MomjianDate: 2002-03-11 20:52:51
Subject: Re: Domain Support -- another round
Previous:From: Paul VixieDate: 2002-03-11 18:50:59
Subject: Re: IPv6 Support for INET/CIDR types.

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group