Another small piece of parser acrobatics to become standard conforming.
? src/backend/parser/gram.output
Index: doc/src/sgml/ref/create_table_as.sgml
===================================================================
RCS file: /cvsroot/pgsql/doc/src/sgml/ref/create_table_as.sgml,v
retrieving revision 1.37
diff -u -3 -p -c -r1.37 create_table_as.sgml
*** doc/src/sgml/ref/create_table_as.sgml 3 Jun 2007 17:06:12 -0000
1.37
--- doc/src/sgml/ref/create_table_as.sgml 27 Oct 2008 16:54:29 -0000
*************** CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY
*** 26,31 ****
--- 26,32 ----
[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
[ TABLESPACE <replaceable class="PARAMETER">tablespace</replaceable> ]
AS <replaceable>query</replaceable>
+ [ WITH [ NO ] DATA ]
</synopsis>
</refsynopsisdiv>
*************** CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY
*** 201,206 ****
--- 202,219 ----
</para>
</listitem>
</varlistentry>
+
+ <varlistentry>
+ <term><literal>WITH [ NO ] DATA</></term>
+ <listitem>
+ <para>
+ This clause specifies whether or not the data produced by the query
+ should be copied into the new table. If not, only the table structure
+ is copied. The default is to copy the data.
+ </para>
+ </listitem>
+ </varlistentry>
+
</variablelist>
</refsect1>
*************** CREATE TEMP TABLE films_recent WITH (OID
*** 265,271 ****
<para>
<command>CREATE TABLE AS</command> conforms to the <acronym>SQL</acronym>
! standard, with the following exceptions:
<itemizedlist spacing="compact">
<listitem>
--- 278,284 ----
<para>
<command>CREATE TABLE AS</command> conforms to the <acronym>SQL</acronym>
! standard. The following are nonstandard extensions:
<itemizedlist spacing="compact">
<listitem>
*************** CREATE TEMP TABLE films_recent WITH (OID
*** 278,289 ****
<listitem>
<para>
! The standard defines a <literal>WITH [ NO ] DATA</literal> clause;
! this is not currently implemented by <productname>PostgreSQL</>.
! The behavior provided by <productname>PostgreSQL</> is equivalent
! to the standard's <literal>WITH DATA</literal> case.
! <literal>WITH NO DATA</literal> can be simulated by appending
! <literal>LIMIT 0</> to the query.
</para>
</listitem>
--- 291,298 ----
<listitem>
<para>
! In the standard, the <literal>WITH [ NO ] DATA</literal> clause
! is required; in PostgreSQL it is optional.
</para>
</listitem>
Index: src/backend/parser/gram.y
===================================================================
RCS file: /cvsroot/pgsql/src/backend/parser/gram.y,v
retrieving revision 2.628
diff -u -3 -p -c -r2.628 gram.y
*** src/backend/parser/gram.y 22 Oct 2008 11:00:34 -0000 2.628
--- src/backend/parser/gram.y 27 Oct 2008 16:54:29 -0000
*************** static TypeName *TableFuncTypeName(List
*** 216,222 ****
%type <ival> opt_lock lock_type cast_context
%type <boolean> opt_force opt_or_replace
opt_grant_grant_option opt_grant_admin_option
! opt_nowait opt_if_exists
%type <list> OptRoleList
%type <defelt> OptRoleElem
--- 216,222 ----
%type <ival> opt_lock lock_type cast_context
%type <boolean> opt_force opt_or_replace
opt_grant_grant_option opt_grant_admin_option
! opt_nowait opt_if_exists opt_with_data
%type <list> OptRoleList
%type <defelt> OptRoleElem
*************** static TypeName *TableFuncTypeName(List
*** 484,490 ****
* list and so can never be entered directly. The filter in parser.c
* creates these tokens when required.
*/
! %token NULLS_FIRST NULLS_LAST WITH_CASCADED WITH_LOCAL
WITH_CHECK
/* Special token types, not actually keywords - see the "lex" file */
%token <str> IDENT FCONST SCONST BCONST XCONST Op
--- 484,490 ----
* list and so can never be entered directly. The filter in parser.c
* creates these tokens when required.
*/
! %token NULLS_FIRST NULLS_LAST WITH_CASCADED WITH_CHECK
WITH_DATA WITH_LOCAL WITH_NO
/* Special token types, not actually keywords - see the "lex" file */
%token <str> IDENT FCONST SCONST BCONST XCONST Op
*************** OptConsTableSpace: USING INDEX TABLESP
*** 2399,2405 ****
*/
CreateAsStmt:
! CREATE OptTemp TABLE create_as_target AS SelectStmt
{
/*
* When the SelectStmt is a
set-operation tree, we must
--- 2399,2405 ----
*/
CreateAsStmt:
! CREATE OptTemp TABLE create_as_target AS SelectStmt
opt_with_data
{
/*
* When the SelectStmt is a
set-operation tree, we must
*************** CreateAsStmt:
*** 2416,2421 ****
--- 2416,2423 ----
scanner_errposition(exprLocation((Node *) n->intoClause))));
$4->rel->istemp = $2;
n->intoClause = $4;
+ if (!$7)
+ ((SelectStmt *)$6)->limitCount
= makeIntConst(0, -1);
$$ = $6;
}
;
*************** CreateAsElement:
*** 2458,2463 ****
--- 2460,2471 ----
}
;
+ opt_with_data:
+ WITH_DATA
{ $$ = TRUE; }
+ | WITH_NO DATA_P
{ $$ = FALSE; }
+ | /*EMPTY*/
{ $$ = TRUE; }
+ ;
+
/*****************************************************************************
*
Index: src/backend/parser/parser.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/parser/parser.c,v
retrieving revision 1.74
diff -u -3 -p -c -r1.74 parser.c
*** src/backend/parser/parser.c 29 Aug 2008 13:02:32 -0000 1.74
--- src/backend/parser/parser.c 27 Oct 2008 16:54:29 -0000
*************** filtered_base_yylex(void)
*** 129,142 ****
case WITH:
/*
! * WITH CASCADED, LOCAL, or CHECK must be reduced to
one token
*
* XXX an alternative way is to recognize just
WITH_TIME and put
* the ugliness into the datetime datatype productions
instead of
* WITH CHECK OPTION. However that requires promoting
WITH to a
! * fully reserved word. If we ever have to do that
anyway
! * (perhaps for SQL99 recursive queries), come back and
simplify
! * this code.
*/
cur_yylval = base_yylval;
cur_yylloc = base_yylloc;
--- 129,141 ----
case WITH:
/*
! * WITH CASCADED, DATA, LOCAL, or CHECK must be reduced
to one token
*
* XXX an alternative way is to recognize just
WITH_TIME and put
* the ugliness into the datetime datatype productions
instead of
* WITH CHECK OPTION. However that requires promoting
WITH to a
! * fully reserved word. If we ever have to do that
anyway,
! * come back and simplify this code.
*/
cur_yylval = base_yylval;
cur_yylloc = base_yylloc;
*************** filtered_base_yylex(void)
*** 146,156 ****
case CASCADED:
cur_token = WITH_CASCADED;
break;
case LOCAL:
cur_token = WITH_LOCAL;
break;
! case CHECK:
! cur_token = WITH_CHECK;
break;
default:
/* save the lookahead token for next
time */
--- 145,161 ----
case CASCADED:
cur_token = WITH_CASCADED;
break;
+ case CHECK:
+ cur_token = WITH_CHECK;
+ break;
+ case DATA_P:
+ cur_token = WITH_DATA;
+ break;
case LOCAL:
cur_token = WITH_LOCAL;
break;
! case NO:
! cur_token = WITH_NO;
break;
default:
/* save the lookahead token for next
time */
--
Sent via pgsql-hackers mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers