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

Peripheral Links

Header And Logo

PostgreSQL
| The world's most advanced open source database.

Site Navigation

Search archives
  Advanced Search

add additional options to CREATE TABLE ... AS




This patch adds most of the options available for regular CREATE TABLE syntax to the CREATE TABLE x AS SELECT ... and AS EXECUTE ... Specifically this allows specification of on commit behavior for temp tables and tablespaces for regular tables to these two statements. Additionally with/without oids is now available for the EXECUTE variant. Currently you still cannot specify inheritance attributes with these commands, but this seems like a more complicated task.

Kris Jurka
? GNUmakefile
? config.log
? config.status
? log
? contrib/spi/.deps
? src/Makefile.global
? src/backend/postgres
? src/backend/access/common/.deps
? src/backend/access/gist/.deps
? src/backend/access/hash/.deps
? src/backend/access/heap/.deps
? src/backend/access/index/.deps
? src/backend/access/nbtree/.deps
? src/backend/access/transam/.deps
? src/backend/bootstrap/.deps
? src/backend/catalog/.deps
? src/backend/catalog/postgres.bki
? src/backend/catalog/postgres.description
? src/backend/catalog/postgres.shdescription
? src/backend/commands/.deps
? src/backend/executor/.deps
? src/backend/lib/.deps
? src/backend/libpq/.deps
? src/backend/main/.deps
? src/backend/nodes/.deps
? src/backend/optimizer/geqo/.deps
? src/backend/optimizer/path/.deps
? src/backend/optimizer/plan/.deps
? src/backend/optimizer/prep/.deps
? src/backend/optimizer/util/.deps
? src/backend/parser/.deps
? src/backend/port/.deps
? src/backend/postmaster/.deps
? src/backend/regex/.deps
? src/backend/rewrite/.deps
? src/backend/storage/buffer/.deps
? src/backend/storage/file/.deps
? src/backend/storage/freespace/.deps
? src/backend/storage/ipc/.deps
? src/backend/storage/large_object/.deps
? src/backend/storage/lmgr/.deps
? src/backend/storage/page/.deps
? src/backend/storage/smgr/.deps
? src/backend/tcop/.deps
? src/backend/utils/.deps
? src/backend/utils/adt/.deps
? src/backend/utils/cache/.deps
? src/backend/utils/error/.deps
? src/backend/utils/fmgr/.deps
? src/backend/utils/hash/.deps
? src/backend/utils/init/.deps
? src/backend/utils/mb/.deps
? src/backend/utils/mb/conversion_procs/conversion_create.sql
? src/backend/utils/mb/conversion_procs/ascii_and_mic/.deps
? src/backend/utils/mb/conversion_procs/ascii_and_mic/libascii_and_mic.so.0.0
? src/backend/utils/mb/conversion_procs/cyrillic_and_mic/.deps
? src/backend/utils/mb/conversion_procs/cyrillic_and_mic/libcyrillic_and_mic.so.0.0
? src/backend/utils/mb/conversion_procs/euc_cn_and_mic/.deps
? src/backend/utils/mb/conversion_procs/euc_cn_and_mic/libeuc_cn_and_mic.so.0.0
? src/backend/utils/mb/conversion_procs/euc_jp_and_sjis/.deps
? src/backend/utils/mb/conversion_procs/euc_jp_and_sjis/libeuc_jp_and_sjis.so.0.0
? src/backend/utils/mb/conversion_procs/euc_kr_and_mic/.deps
? src/backend/utils/mb/conversion_procs/euc_kr_and_mic/libeuc_kr_and_mic.so.0.0
? src/backend/utils/mb/conversion_procs/euc_tw_and_big5/.deps
? src/backend/utils/mb/conversion_procs/euc_tw_and_big5/libeuc_tw_and_big5.so.0.0
? src/backend/utils/mb/conversion_procs/latin2_and_win1250/.deps
? src/backend/utils/mb/conversion_procs/latin2_and_win1250/liblatin2_and_win1250.so.0.0
? src/backend/utils/mb/conversion_procs/latin_and_mic/.deps
? src/backend/utils/mb/conversion_procs/latin_and_mic/liblatin_and_mic.so.0.0
? src/backend/utils/mb/conversion_procs/utf8_and_ascii/.deps
? src/backend/utils/mb/conversion_procs/utf8_and_ascii/libutf8_and_ascii.so.0.0
? src/backend/utils/mb/conversion_procs/utf8_and_big5/.deps
? src/backend/utils/mb/conversion_procs/utf8_and_big5/libutf8_and_big5.so.0.0
? src/backend/utils/mb/conversion_procs/utf8_and_cyrillic/.deps
? src/backend/utils/mb/conversion_procs/utf8_and_cyrillic/libutf8_and_cyrillic.so.0.0
? src/backend/utils/mb/conversion_procs/utf8_and_euc_cn/.deps
? src/backend/utils/mb/conversion_procs/utf8_and_euc_cn/libutf8_and_euc_cn.so.0.0
? src/backend/utils/mb/conversion_procs/utf8_and_euc_jp/.deps
? src/backend/utils/mb/conversion_procs/utf8_and_euc_jp/libutf8_and_euc_jp.so.0.0
? src/backend/utils/mb/conversion_procs/utf8_and_euc_kr/.deps
? src/backend/utils/mb/conversion_procs/utf8_and_euc_kr/libutf8_and_euc_kr.so.0.0
? src/backend/utils/mb/conversion_procs/utf8_and_euc_tw/.deps
? src/backend/utils/mb/conversion_procs/utf8_and_euc_tw/libutf8_and_euc_tw.so.0.0
? src/backend/utils/mb/conversion_procs/utf8_and_gb18030/.deps
? src/backend/utils/mb/conversion_procs/utf8_and_gb18030/libutf8_and_gb18030.so.0.0
? src/backend/utils/mb/conversion_procs/utf8_and_gbk/.deps
? src/backend/utils/mb/conversion_procs/utf8_and_gbk/libutf8_and_gbk.so.0.0
? src/backend/utils/mb/conversion_procs/utf8_and_iso8859/.deps
? src/backend/utils/mb/conversion_procs/utf8_and_iso8859/libutf8_and_iso8859.so.0.0
? src/backend/utils/mb/conversion_procs/utf8_and_iso8859_1/.deps
? src/backend/utils/mb/conversion_procs/utf8_and_iso8859_1/libutf8_and_iso8859_1.so.0.0
? src/backend/utils/mb/conversion_procs/utf8_and_johab/.deps
? src/backend/utils/mb/conversion_procs/utf8_and_johab/libutf8_and_johab.so.0.0
? src/backend/utils/mb/conversion_procs/utf8_and_sjis/.deps
? src/backend/utils/mb/conversion_procs/utf8_and_sjis/libutf8_and_sjis.so.0.0
? src/backend/utils/mb/conversion_procs/utf8_and_uhc/.deps
? src/backend/utils/mb/conversion_procs/utf8_and_uhc/libutf8_and_uhc.so.0.0
? src/backend/utils/mb/conversion_procs/utf8_and_win1250/.deps
? src/backend/utils/mb/conversion_procs/utf8_and_win1250/libutf8_and_win1250.so.0.0
? src/backend/utils/mb/conversion_procs/utf8_and_win1252/.deps
? src/backend/utils/mb/conversion_procs/utf8_and_win1252/libutf8_and_win1252.so.0.0
? src/backend/utils/mb/conversion_procs/utf8_and_win1256/.deps
? src/backend/utils/mb/conversion_procs/utf8_and_win1256/libutf8_and_win1256.so.0.0
? src/backend/utils/mb/conversion_procs/utf8_and_win1258/.deps
? src/backend/utils/mb/conversion_procs/utf8_and_win1258/libutf8_and_win1258.so.0.0
? src/backend/utils/mb/conversion_procs/utf8_and_win874/.deps
? src/backend/utils/mb/conversion_procs/utf8_and_win874/libutf8_and_win874.so.0.0
? src/backend/utils/misc/.deps
? src/backend/utils/mmgr/.deps
? src/backend/utils/resowner/.deps
? src/backend/utils/sort/.deps
? src/backend/utils/time/.deps
? src/bin/initdb/.deps
? src/bin/initdb/initdb
? src/bin/ipcclean/ipcclean
? src/bin/pg_config/.deps
? src/bin/pg_config/pg_config
? src/bin/pg_controldata/.deps
? src/bin/pg_controldata/pg_controldata
? src/bin/pg_ctl/.deps
? src/bin/pg_ctl/pg_ctl
? src/bin/pg_dump/.deps
? src/bin/pg_dump/pg_dump
? src/bin/pg_dump/pg_dumpall
? src/bin/pg_dump/pg_restore
? src/bin/pg_resetxlog/.deps
? src/bin/pg_resetxlog/pg_resetxlog
? src/bin/psql/.deps
? src/bin/psql/psql
? src/bin/scripts/.deps
? src/bin/scripts/clusterdb
? src/bin/scripts/createdb
? src/bin/scripts/createlang
? src/bin/scripts/createuser
? src/bin/scripts/dropdb
? src/bin/scripts/droplang
? src/bin/scripts/dropuser
? src/bin/scripts/reindexdb
? src/bin/scripts/vacuumdb
? src/include/pg_config.h
? src/include/stamp-h
? src/interfaces/ecpg/compatlib/.deps
? src/interfaces/ecpg/compatlib/libecpg_compat.so.2.2
? src/interfaces/ecpg/ecpglib/.deps
? src/interfaces/ecpg/ecpglib/libecpg.so.5.2
? src/interfaces/ecpg/pgtypeslib/.deps
? src/interfaces/ecpg/pgtypeslib/libpgtypes.so.2.2
? src/interfaces/ecpg/preproc/.deps
? src/interfaces/ecpg/preproc/ecpg
? src/interfaces/libpq/.deps
? src/interfaces/libpq/libpq.so.4.2
? src/pl/plpgsql/src/.deps
? src/pl/plpgsql/src/libplpgsql.so.1.0
? src/port/.deps
? src/port/pg_config_paths.h
? src/test/regress/.deps
? src/test/regress/libregress.so.0.0
? src/test/regress/log
? src/test/regress/pg_regress
? src/test/regress/results
? src/test/regress/testtablespace
? src/test/regress/tmp_check
? src/test/regress/expected/constraints.out
? src/test/regress/expected/copy.out
? src/test/regress/expected/create_function_1.out
? src/test/regress/expected/create_function_2.out
? src/test/regress/expected/misc.out
? src/test/regress/expected/tablespace.out
? src/test/regress/sql/constraints.sql
? src/test/regress/sql/copy.sql
? src/test/regress/sql/create_function_1.sql
? src/test/regress/sql/create_function_2.sql
? src/test/regress/sql/misc.sql
? src/test/regress/sql/tablespace.sql
? src/timezone/.deps
? src/timezone/zic
Index: src/backend/commands/prepare.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/commands/prepare.c,v
retrieving revision 1.47
diff -c -r1.47 prepare.c
*** src/backend/commands/prepare.c	18 Jan 2006 06:49:26 -0000	1.47
--- src/backend/commands/prepare.c	14 Feb 2006 19:18:41 -0000
***************
*** 196,201 ****
--- 196,207 ----
  					(errcode(ERRCODE_WRONG_OBJECT_TYPE),
  					 errmsg("prepared statement is not a SELECT")));
  		query->into = copyObject(stmt->into);
+ 		query->intoHasOids = stmt->intohasoids;
+ 		query->intoOnCommit = stmt->intooncommit;
+ 		if (stmt->intotablespacename)
+ 			query->intoTableSpaceName = pstrdup(stmt->intotablespacename);
+ 		else
+ 			query->intoTableSpaceName = NULL;
  
  		MemoryContextSwitchTo(oldContext);
  	}
Index: src/backend/executor/execMain.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/executor/execMain.c,v
retrieving revision 1.265
diff -c -r1.265 execMain.c
*** src/backend/executor/execMain.c	12 Jan 2006 21:48:53 -0000	1.265
--- src/backend/executor/execMain.c	14 Feb 2006 19:18:41 -0000
***************
*** 37,42 ****
--- 37,43 ----
  #include "catalog/heap.h"
  #include "catalog/namespace.h"
  #include "commands/tablecmds.h"
+ #include "commands/tablespace.h"
  #include "commands/trigger.h"
  #include "executor/execdebug.h"
  #include "executor/execdefs.h"
***************
*** 730,740 ****
--- 731,750 ----
  	{
  		char	   *intoName;
  		Oid			namespaceId;
+ 		Oid			tablespaceId;
  		AclResult	aclresult;
  		Oid			intoRelationId;
  		TupleDesc	tupdesc;
  
  		/*
+ 		 * Check consistency of arguments
+ 		 */
+ 		if (parseTree->intoOnCommit != ONCOMMIT_NOOP && !parseTree->into->istemp)
+ 			ereport(ERROR,
+ 					(errcode(ERRCODE_INVALID_TABLE_DEFINITION),
+ 					 errmsg("ON COMMIT can only be used on temporary tables")));
+ 
+ 		/*
  		 * find namespace to create in, check permissions
  		 */
  		intoName = parseTree->into->relname;
***************
*** 747,759 ****
  						   get_namespace_name(namespaceId));
  
  		/*
  		 * have to copy tupType to get rid of constraints
  		 */
  		tupdesc = CreateTupleDescCopy(tupType);
  
  		intoRelationId = heap_create_with_catalog(intoName,
  												  namespaceId,
! 												  InvalidOid,
  												  InvalidOid,
  												  GetUserId(),
  												  tupdesc,
--- 757,798 ----
  						   get_namespace_name(namespaceId));
  
  		/*
+ 		 * Select tablespace to use.  If not specified, use default_tablespace
+ 		 * (which may in turn default to database's default).
+ 		 */
+ 		if (parseTree->intoTableSpaceName)
+ 		{
+ 			tablespaceId = get_tablespace_oid(parseTree->intoTableSpaceName);
+ 			if (!OidIsValid(tablespaceId))
+ 				ereport(ERROR,
+ 						(errcode(ERRCODE_UNDEFINED_OBJECT),
+ 						 errmsg("tablespace \"%s\" does not exist",
+ 								parseTree->intoTableSpaceName)));
+ 		} else {
+ 			tablespaceId = GetDefaultTablespace();
+ 			/* note InvalidOid is OK in this case */
+ 		}
+ 
+ 		/* Check permissions except when using the database's default */
+ 		if (OidIsValid(tablespaceId)) {
+ 			AclResult	aclresult;
+ 
+ 			aclresult = pg_tablespace_aclcheck(tablespaceId, GetUserId(),
+ 											   ACL_CREATE);
+ 
+ 			if (aclresult != ACLCHECK_OK)
+ 				aclcheck_error(aclresult, ACL_KIND_TABLESPACE,
+ 							   get_tablespace_name(tablespaceId));
+ 		}
+ 
+ 		/*
  		 * have to copy tupType to get rid of constraints
  		 */
  		tupdesc = CreateTupleDescCopy(tupType);
  
  		intoRelationId = heap_create_with_catalog(intoName,
  												  namespaceId,
! 												  tablespaceId,
  												  InvalidOid,
  												  GetUserId(),
  												  tupdesc,
***************
*** 761,767 ****
  												  false,
  												  true,
  												  0,
! 												  ONCOMMIT_NOOP,
  												  allowSystemTableMods);
  
  		FreeTupleDesc(tupdesc);
--- 800,806 ----
  												  false,
  												  true,
  												  0,
! 												  parseTree->intoOnCommit,
  												  allowSystemTableMods);
  
  		FreeTupleDesc(tupdesc);
Index: src/backend/nodes/copyfuncs.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/nodes/copyfuncs.c,v
retrieving revision 1.326
diff -c -r1.326 copyfuncs.c
*** src/backend/nodes/copyfuncs.c	4 Feb 2006 19:06:46 -0000	1.326
--- src/backend/nodes/copyfuncs.c	14 Feb 2006 19:18:41 -0000
***************
*** 1662,1667 ****
--- 1662,1669 ----
  	COPY_SCALAR_FIELD(resultRelation);
  	COPY_NODE_FIELD(into);
  	COPY_SCALAR_FIELD(intoHasOids);
+ 	COPY_SCALAR_FIELD(intoOnCommit);
+ 	COPY_STRING_FIELD(intoTableSpaceName);
  	COPY_SCALAR_FIELD(hasAggs);
  	COPY_SCALAR_FIELD(hasSubLinks);
  	COPY_NODE_FIELD(rtable);
***************
*** 1729,1734 ****
--- 1731,1738 ----
  	COPY_NODE_FIELD(into);
  	COPY_NODE_FIELD(intoColNames);
  	COPY_SCALAR_FIELD(intoHasOids);
+ 	COPY_SCALAR_FIELD(intoOnCommit);
+ 	COPY_STRING_FIELD(intoTableSpaceName);
  	COPY_NODE_FIELD(targetList);
  	COPY_NODE_FIELD(fromClause);
  	COPY_NODE_FIELD(whereClause);
***************
*** 2631,2636 ****
--- 2635,2644 ----
  
  	COPY_STRING_FIELD(name);
  	COPY_NODE_FIELD(into);
+ 	COPY_SCALAR_FIELD(intohasoids);
+ 	COPY_SCALAR_FIELD(intocontainsoids);
+ 	COPY_SCALAR_FIELD(intooncommit);
+ 	COPY_STRING_FIELD(intotablespacename);
  	COPY_NODE_FIELD(params);
  
  	return newnode;
Index: src/backend/nodes/equalfuncs.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/nodes/equalfuncs.c,v
retrieving revision 1.262
diff -c -r1.262 equalfuncs.c
*** src/backend/nodes/equalfuncs.c	4 Feb 2006 19:06:46 -0000	1.262
--- src/backend/nodes/equalfuncs.c	14 Feb 2006 19:18:41 -0000
***************
*** 673,678 ****
--- 673,680 ----
  	COMPARE_SCALAR_FIELD(resultRelation);
  	COMPARE_NODE_FIELD(into);
  	COMPARE_SCALAR_FIELD(intoHasOids);
+ 	COMPARE_SCALAR_FIELD(intoOnCommit);
+ 	COMPARE_STRING_FIELD(intoTableSpaceName);
  	COMPARE_SCALAR_FIELD(hasAggs);
  	COMPARE_SCALAR_FIELD(hasSubLinks);
  	COMPARE_NODE_FIELD(rtable);
***************
*** 732,737 ****
--- 734,741 ----
  	COMPARE_NODE_FIELD(into);
  	COMPARE_NODE_FIELD(intoColNames);
  	COMPARE_SCALAR_FIELD(intoHasOids);
+ 	COMPARE_SCALAR_FIELD(intoOnCommit);
+ 	COMPARE_STRING_FIELD(intoTableSpaceName);
  	COMPARE_NODE_FIELD(targetList);
  	COMPARE_NODE_FIELD(fromClause);
  	COMPARE_NODE_FIELD(whereClause);
***************
*** 1493,1498 ****
--- 1497,1506 ----
  {
  	COMPARE_STRING_FIELD(name);
  	COMPARE_NODE_FIELD(into);
+ 	COMPARE_SCALAR_FIELD(intocontainsoids);
+ 	COMPARE_SCALAR_FIELD(intohasoids);
+ 	COMPARE_SCALAR_FIELD(intooncommit);
+ 	COMPARE_STRING_FIELD(intotablespacename);
  	COMPARE_NODE_FIELD(params);
  
  	return true;
Index: src/backend/nodes/outfuncs.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/nodes/outfuncs.c,v
retrieving revision 1.267
diff -c -r1.267 outfuncs.c
*** src/backend/nodes/outfuncs.c	31 Jan 2006 21:39:23 -0000	1.267
--- src/backend/nodes/outfuncs.c	14 Feb 2006 19:18:41 -0000
***************
*** 1374,1379 ****
--- 1374,1381 ----
  	WRITE_NODE_FIELD(into);
  	WRITE_NODE_FIELD(intoColNames);
  	WRITE_ENUM_FIELD(intoHasOids, ContainsOids);
+ 	WRITE_ENUM_FIELD(intoOnCommit, OnCommitAction);
+ 	WRITE_STRING_FIELD(intoTableSpaceName);
  	WRITE_NODE_FIELD(targetList);
  	WRITE_NODE_FIELD(fromClause);
  	WRITE_NODE_FIELD(whereClause);
***************
*** 1504,1509 ****
--- 1506,1514 ----
  
  	WRITE_INT_FIELD(resultRelation);
  	WRITE_NODE_FIELD(into);
+ 	WRITE_BOOL_FIELD(intoHasOids);
+ 	WRITE_ENUM_FIELD(intoOnCommit, OnCommitAction);
+ 	WRITE_STRING_FIELD(intoTableSpaceName);
  	WRITE_BOOL_FIELD(hasAggs);
  	WRITE_BOOL_FIELD(hasSubLinks);
  	WRITE_NODE_FIELD(rtable);
Index: src/backend/nodes/readfuncs.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/nodes/readfuncs.c,v
retrieving revision 1.183
diff -c -r1.183 readfuncs.c
*** src/backend/nodes/readfuncs.c	28 Dec 2005 01:29:59 -0000	1.183
--- src/backend/nodes/readfuncs.c	14 Feb 2006 19:18:41 -0000
***************
*** 140,145 ****
--- 140,148 ----
  	READ_NODE_FIELD(utilityStmt);
  	READ_INT_FIELD(resultRelation);
  	READ_NODE_FIELD(into);
+ 	READ_BOOL_FIELD(intoHasOids);
+ 	READ_ENUM_FIELD(intoOnCommit, OnCommitAction);
+ 	READ_STRING_FIELD(intoTableSpaceName);
  	READ_BOOL_FIELD(hasAggs);
  	READ_BOOL_FIELD(hasSubLinks);
  	READ_NODE_FIELD(rtable);
Index: src/backend/parser/analyze.c
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/parser/analyze.c,v
retrieving revision 1.328
diff -c -r1.328 analyze.c
*** src/backend/parser/analyze.c	15 Jan 2006 22:18:46 -0000	1.328
--- src/backend/parser/analyze.c	14 Feb 2006 19:18:41 -0000
***************
*** 1818,1823 ****
--- 1818,1828 ----
  		applyColumnNames(qry->targetList, stmt->intoColNames);
  
  	qry->intoHasOids = interpretOidsOption(stmt->intoHasOids);
+ 	qry->intoOnCommit = stmt->intoOnCommit;
+ 	if (stmt->intoTableSpaceName)
+ 		qry->intoTableSpaceName = pstrdup(stmt->intoTableSpaceName);
+ 	else
+ 		qry->intoTableSpaceName = NULL;
  
  	/* mark column origins */
  	markTargetListOrigins(pstate, qry->targetList);
***************
*** 2662,2667 ****
--- 2667,2674 ----
  
  	paramtypes = FetchPreparedStatementParams(stmt->name);
  
+ 	stmt->intohasoids = interpretOidsOption(stmt->intocontainsoids);
+ 
  	if (stmt->params || paramtypes)
  	{
  		int			nparams = list_length(stmt->params);
Index: src/backend/parser/gram.y
===================================================================
RCS file: /projects/cvsroot/pgsql/src/backend/parser/gram.y,v
retrieving revision 2.529
diff -c -r2.529 gram.y
*** src/backend/parser/gram.y	12 Feb 2006 19:11:01 -0000	2.529
--- src/backend/parser/gram.y	14 Feb 2006 19:18:41 -0000
***************
*** 239,245 ****
  
  %type <boolean>  TriggerForType OptTemp
  %type <oncommit> OnCommitOption
! %type <withoids> OptWithOids WithOidsAs
  
  %type <node>	for_locking_clause opt_for_locking_clause
  %type <list>	locked_rels_list
--- 239,245 ----
  
  %type <boolean>  TriggerForType OptTemp
  %type <oncommit> OnCommitOption
! %type <withoids> OptWithOids
  
  %type <node>	for_locking_clause opt_for_locking_clause
  %type <list>	locked_rels_list
***************
*** 2171,2177 ****
   */
  
  CreateAsStmt:
! 			CREATE OptTemp TABLE qualified_name OptCreateAs WithOidsAs SelectStmt
  				{
  					/*
  					 * When the SelectStmt is a set-operation tree, we must
--- 2171,2178 ----
   */
  
  CreateAsStmt:
! 		CREATE OptTemp TABLE qualified_name OptCreateAs
! 			OptWithOids OnCommitOption OptTableSpace AS SelectStmt
  				{
  					/*
  					 * When the SelectStmt is a set-operation tree, we must
***************
*** 2180,2186 ****
  					 * to find it.	Similarly, the output column names must
  					 * be attached to that Select's target list.
  					 */
! 					SelectStmt *n = findLeftmostSelect((SelectStmt *) $7);
  					if (n->into != NULL)
  						ereport(ERROR,
  								(errcode(ERRCODE_SYNTAX_ERROR),
--- 2181,2187 ----
  					 * to find it.	Similarly, the output column names must
  					 * be attached to that Select's target list.
  					 */
! 					SelectStmt *n = findLeftmostSelect((SelectStmt *) $10);
  					if (n->into != NULL)
  						ereport(ERROR,
  								(errcode(ERRCODE_SYNTAX_ERROR),
***************
*** 2189,2210 ****
  					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; }
--- 2190,2201 ----
  					n->into = $4;
  					n->intoColNames = $5;
  					n->intoHasOids = $6;
! 					n->intoOnCommit = $7;
! 					n->intoTableSpaceName = $8;
! 					$$ = $10;
  				}
  		;
  
  OptCreateAs:
  			'(' CreateAsList ')'					{ $$ = $2; }
  			| /*EMPTY*/								{ $$ = NIL; }
***************
*** 5066,5078 ****
  					n->into = NULL;
  					$$ = (Node *) n;
  				}
! 			| CREATE OptTemp TABLE qualified_name OptCreateAs AS EXECUTE name execute_param_clause
  				{
  					ExecuteStmt *n = makeNode(ExecuteStmt);
! 					n->name = $8;
! 					n->params = $9;
  					$4->istemp = $2;
  					n->into = $4;
  					if ($5)
  						ereport(ERROR,
  								(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
--- 5057,5074 ----
  					n->into = NULL;
  					$$ = (Node *) n;
  				}
! 			| CREATE OptTemp TABLE qualified_name OptCreateAs
! 				OptWithOids OnCommitOption OptTableSpace AS
! 				EXECUTE name execute_param_clause
  				{
  					ExecuteStmt *n = makeNode(ExecuteStmt);
! 					n->name = $11;
! 					n->params = $12;
  					$4->istemp = $2;
  					n->into = $4;
+ 					n->intocontainsoids = $6;
+ 					n->intooncommit = $7;
+ 					n->intotablespacename = $8;
  					if ($5)
  						ereport(ERROR,
  								(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
Index: src/include/nodes/parsenodes.h
===================================================================
RCS file: /projects/cvsroot/pgsql/src/include/nodes/parsenodes.h,v
retrieving revision 1.300
diff -c -r1.300 parsenodes.h
*** src/include/nodes/parsenodes.h	4 Feb 2006 19:06:46 -0000	1.300
--- src/include/nodes/parsenodes.h	14 Feb 2006 19:18:41 -0000
***************
*** 27,32 ****
--- 27,42 ----
  	QSRC_NON_INSTEAD_RULE		/* added by non-INSTEAD rule */
  } QuerySource;
  
+ /* What to do at commit time for temporary relations */
+ typedef enum OnCommitAction
+ {
+ 	ONCOMMIT_NOOP,				/* No ON COMMIT clause (do nothing) */
+ 	ONCOMMIT_PRESERVE_ROWS,		/* ON COMMIT PRESERVE ROWS (do nothing) */
+ 	ONCOMMIT_DELETE_ROWS,		/* ON COMMIT DELETE ROWS */
+ 	ONCOMMIT_DROP				/* ON COMMIT DROP */
+ } OnCommitAction;
+ 
+ 
  /*
   * Grantable rights are encoded so that we can OR them together in a bitmask.
   * The present representation of AclItem limits us to 16 distinct rights,
***************
*** 82,87 ****
--- 92,99 ----
  
  	RangeVar   *into;			/* target relation for SELECT INTO */
  	bool		intoHasOids;	/* should target relation contain OIDs? */
+ 	OnCommitAction	intoOnCommit;		/* what do we do at COMMIT? */
+ 	char		   *intoTableSpaceName;	/* table space to use, or NULL */
  
  	bool		hasAggs;		/* has aggregates in tlist or havingQual */
  	bool		hasSubLinks;	/* has subquery SubLink */
***************
*** 682,687 ****
--- 694,701 ----
  	RangeVar   *into;			/* target table (for select into table) */
  	List	   *intoColNames;	/* column names for into table */
  	ContainsOids intoHasOids;	/* should target table have OIDs? */
+ 	OnCommitAction	intoOnCommit;		/* what do we do at COMMIT? */
+ 	char	   *intoTableSpaceName;		/* table space to use, or NULL */
  	List	   *targetList;		/* the target list (of ResTarget) */
  	List	   *fromClause;		/* the FROM clause */
  	Node	   *whereClause;	/* WHERE qualification */
***************
*** 976,990 ****
   * ----------------------
   */
  
- /* What to do at commit time for temporary relations */
- typedef enum OnCommitAction
- {
- 	ONCOMMIT_NOOP,				/* No ON COMMIT clause (do nothing) */
- 	ONCOMMIT_PRESERVE_ROWS,		/* ON COMMIT PRESERVE ROWS (do nothing) */
- 	ONCOMMIT_DELETE_ROWS,		/* ON COMMIT DELETE ROWS */
- 	ONCOMMIT_DROP				/* ON COMMIT DROP */
- } OnCommitAction;
- 
  typedef struct CreateStmt
  {
  	NodeTag		type;
--- 990,995 ----
***************
*** 1862,1871 ****
  
  typedef struct ExecuteStmt
  {
! 	NodeTag		type;
! 	char	   *name;			/* The name of the plan to execute */
! 	RangeVar   *into;			/* Optional table to store results in */
! 	List	   *params;			/* Values to assign to parameters */
  } ExecuteStmt;
  
  
--- 1867,1880 ----
  
  typedef struct ExecuteStmt
  {
! 	NodeTag			type;
! 	char		   *name;				/* The name of the plan to execute */
! 	RangeVar	   *into;				/* Optional table to store results in */
! 	ContainsOids	intocontainsoids;	/* should it have OIDs? */
! 	bool			intohasoids;		/* merge GUC info with user input */
! 	OnCommitAction	intooncommit;		/* what do we do at COMMIT? */
! 	char		   *intotablespacename;	/* table space to use, or NULL */
! 	List		   *params;				/* Values to assign to parameters */
  } ExecuteStmt;
  
  
Index: src/test/regress/expected/temp.out
===================================================================
RCS file: /projects/cvsroot/pgsql/src/test/regress/expected/temp.out,v
retrieving revision 1.10
diff -c -r1.10 temp.out
*** src/test/regress/expected/temp.out	27 Jan 2005 03:19:08 -0000	1.10
--- src/test/regress/expected/temp.out	14 Feb 2006 19:18:42 -0000
***************
*** 64,69 ****
--- 64,84 ----
  (0 rows)
  
  DROP TABLE temptest;
+ BEGIN;
+ CREATE TEMP TABLE temptest(col) ON COMMIT DELETE ROWS AS SELECT 1;
+ SELECT * FROM temptest;
+  col 
+ -----
+    1
+ (1 row)
+ 
+ COMMIT;
+ SELECT * FROM temptest;
+  col 
+ -----
+ (0 rows)
+ 
+ DROP TABLE temptest;
  -- Test ON COMMIT DROP
  BEGIN;
  CREATE TEMP TABLE temptest(col int) ON COMMIT DROP;
***************
*** 79,87 ****
--- 94,115 ----
  COMMIT;
  SELECT * FROM temptest;
  ERROR:  relation "temptest" does not exist
+ BEGIN;
+ CREATE TEMP TABLE temptest(col) ON COMMIT DROP AS SELECT 1;
+ SELECT * FROM temptest;
+  col 
+ -----
+    1
+ (1 row)
+ 
+ COMMIT;
+ SELECT * FROM temptest;
+ ERROR:  relation "temptest" does not exist
  -- ON COMMIT is only allowed for TEMP
  CREATE TABLE temptest(col int) ON COMMIT DELETE ROWS;
  ERROR:  ON COMMIT can only be used on temporary tables
+ CREATE TABLE temptest(col) ON COMMIT DELETE ROWS AS SELECT 1;
+ ERROR:  ON COMMIT can only be used on temporary tables
  -- Test foreign keys
  BEGIN;
  CREATE TEMP TABLE temptest1(col int PRIMARY KEY);
Index: src/test/regress/expected/without_oid.out
===================================================================
RCS file: /projects/cvsroot/pgsql/src/test/regress/expected/without_oid.out,v
retrieving revision 1.5
diff -c -r1.5 without_oid.out
*** src/test/regress/expected/without_oid.out	4 Aug 2004 21:34:33 -0000	1.5
--- src/test/regress/expected/without_oid.out	14 Feb 2006 19:18:42 -0000
***************
*** 76,81 ****
--- 76,96 ----
  -- should fail
  SELECT count(oid) FROM create_table_test3;
  ERROR:  column "oid" does not exist
+ PREPARE table_source(int) AS
+     SELECT a + b AS c1, a - b AS c2, $1 AS c3 FROM create_table_test;
+ CREATE TABLE execute_with WITH OIDS AS EXECUTE table_source(1);
+ CREATE TABLE execute_without WITHOUT OIDS AS EXECUTE table_source(2);
+ SELECT count(oid) FROM execute_with;
+  count 
+ -------
+      2
+ (1 row)
+ 
+ -- should fail
+ SELECT count(oid) FROM execute_without;
+ ERROR:  column "oid" does not exist
  DROP TABLE create_table_test;
  DROP TABLE create_table_test2;
  DROP TABLE create_table_test3;
+ DROP TABLE execute_with;
+ DROP TABLE execute_without;
Index: src/test/regress/input/tablespace.source
===================================================================
RCS file: /projects/cvsroot/pgsql/src/test/regress/input/tablespace.source,v
retrieving revision 1.2
diff -c -r1.2 tablespace.source
*** src/test/regress/input/tablespace.source	5 Nov 2004 19:16:46 -0000	1.2
--- src/test/regress/input/tablespace.source	14 Feb 2006 19:18:42 -0000
***************
*** 12,17 ****
--- 12,28 ----
  INSERT INTO testschema.foo VALUES(1);
  INSERT INTO testschema.foo VALUES(2);
  
+ -- tables from dynamic sources
+ CREATE TABLE testschema.asselect TABLESPACE testspace AS SELECT 1;
+ SELECT relname, spcname FROM pg_catalog.pg_tablespace t, pg_catalog.pg_class c
+     where c.reltablespace = t.oid AND c.relname = 'asselect';
+ 
+ PREPARE selectsource(int) AS SELECT $1;
+ CREATE TABLE testschema.asexecute TABLESPACE testspace
+     AS EXECUTE selectsource(2);
+ SELECT relname, spcname FROM pg_catalog.pg_tablespace t, pg_catalog.pg_class c
+     where c.reltablespace = t.oid AND c.relname = 'asexecute';
+ 
  -- index
  CREATE INDEX foo_idx on testschema.foo(i) TABLESPACE testspace;
  SELECT relname, spcname FROM pg_catalog.pg_tablespace t, pg_catalog.pg_class c
Index: src/test/regress/output/tablespace.source
===================================================================
RCS file: /projects/cvsroot/pgsql/src/test/regress/output/tablespace.source,v
retrieving revision 1.2
diff -c -r1.2 tablespace.source
*** src/test/regress/output/tablespace.source	5 Nov 2004 19:17:13 -0000	1.2
--- src/test/regress/output/tablespace.source	14 Feb 2006 19:18:42 -0000
***************
*** 13,18 ****
--- 13,37 ----
  
  INSERT INTO testschema.foo VALUES(1);
  INSERT INTO testschema.foo VALUES(2);
+ -- tables from dynamic sources
+ CREATE TABLE testschema.asselect TABLESPACE testspace AS SELECT 1;
+ SELECT relname, spcname FROM pg_catalog.pg_tablespace t, pg_catalog.pg_class c
+     where c.reltablespace = t.oid AND c.relname = 'asselect';
+  relname  |  spcname  
+ ----------+-----------
+  asselect | testspace
+ (1 row)
+ 
+ PREPARE selectsource(int) AS SELECT $1;
+ CREATE TABLE testschema.asexecute TABLESPACE testspace
+     AS EXECUTE selectsource(2);
+ SELECT relname, spcname FROM pg_catalog.pg_tablespace t, pg_catalog.pg_class c
+     where c.reltablespace = t.oid AND c.relname = 'asexecute';
+   relname  |  spcname  
+ -----------+-----------
+  asexecute | testspace
+ (1 row)
+ 
  -- index
  CREATE INDEX foo_idx on testschema.foo(i) TABLESPACE testspace;
  SELECT relname, spcname FROM pg_catalog.pg_tablespace t, pg_catalog.pg_class c
***************
*** 32,37 ****
--- 51,58 ----
  DROP TABLESPACE testspace;
  ERROR:  tablespace "testspace" is not empty
  DROP SCHEMA testschema CASCADE;
+ NOTICE:  drop cascades to table testschema.asexecute
+ NOTICE:  drop cascades to table testschema.asselect
  NOTICE:  drop cascades to table testschema.foo
  -- Should succeed
  DROP TABLESPACE testspace;
Index: src/test/regress/sql/temp.sql
===================================================================
RCS file: /projects/cvsroot/pgsql/src/test/regress/sql/temp.sql,v
retrieving revision 1.6
diff -c -r1.6 temp.sql
*** src/test/regress/sql/temp.sql	27 Jan 2005 03:19:37 -0000	1.6
--- src/test/regress/sql/temp.sql	14 Feb 2006 19:18:42 -0000
***************
*** 66,71 ****
--- 66,81 ----
  
  DROP TABLE temptest;
  
+ BEGIN;
+ CREATE TEMP TABLE temptest(col) ON COMMIT DELETE ROWS AS SELECT 1;
+ 
+ SELECT * FROM temptest;
+ COMMIT;
+ 
+ SELECT * FROM temptest;
+ 
+ DROP TABLE temptest;
+ 
  -- Test ON COMMIT DROP
  
  BEGIN;
***************
*** 80,88 ****
--- 90,107 ----
  
  SELECT * FROM temptest;
  
+ BEGIN;
+ CREATE TEMP TABLE temptest(col) ON COMMIT DROP AS SELECT 1;
+ 
+ SELECT * FROM temptest;
+ COMMIT;
+ 
+ SELECT * FROM temptest;
+ 
  -- ON COMMIT is only allowed for TEMP
  
  CREATE TABLE temptest(col int) ON COMMIT DELETE ROWS;
+ CREATE TABLE temptest(col) ON COMMIT DELETE ROWS AS SELECT 1;
  
  -- Test foreign keys
  BEGIN;
Index: src/test/regress/sql/without_oid.sql
===================================================================
RCS file: /projects/cvsroot/pgsql/src/test/regress/sql/without_oid.sql,v
retrieving revision 1.5
diff -c -r1.5 without_oid.sql
*** src/test/regress/sql/without_oid.sql	4 Aug 2004 21:34:35 -0000	1.5
--- src/test/regress/sql/without_oid.sql	14 Feb 2006 19:18:42 -0000
***************
*** 74,79 ****
--- 74,91 ----
  -- should fail
  SELECT count(oid) FROM create_table_test3;
  
+ PREPARE table_source(int) AS
+     SELECT a + b AS c1, a - b AS c2, $1 AS c3 FROM create_table_test;
+ 
+ CREATE TABLE execute_with WITH OIDS AS EXECUTE table_source(1);
+ CREATE TABLE execute_without WITHOUT OIDS AS EXECUTE table_source(2);
+ 
+ SELECT count(oid) FROM execute_with;
+ -- should fail
+ SELECT count(oid) FROM execute_without;
+ 
  DROP TABLE create_table_test;
  DROP TABLE create_table_test2;
  DROP TABLE create_table_test3;
+ DROP TABLE execute_with;
+ DROP TABLE execute_without;


Home | Main Index | Thread Index

Privacy Policy | PostgreSQL Archives hosted by Command Prompt, Inc. | Designed by tinysofa
Copyright © 1996 – 2008 PostgreSQL Global Development Group