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 (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to