]> granicus.if.org Git - postgresql/commitdiff
Allow SQL:2008 syntax ALTER TABLE ... ALTER COLUMN ... SET DATA TYPE
authorPeter Eisentraut <peter_e@gmx.net>
Tue, 21 Oct 2008 08:38:16 +0000 (08:38 +0000)
committerPeter Eisentraut <peter_e@gmx.net>
Tue, 21 Oct 2008 08:38:16 +0000 (08:38 +0000)
alongside our traditional syntax.

doc/src/sgml/ref/alter_table.sgml
src/backend/catalog/sql_features.txt
src/backend/parser/gram.y
src/backend/parser/keywords.c
src/interfaces/ecpg/preproc/ecpg_keywords.c
src/interfaces/ecpg/preproc/preproc.y
src/interfaces/ecpg/test/expected/sql-parser.c
src/interfaces/ecpg/test/expected/sql-parser.stderr
src/interfaces/ecpg/test/sql/parser.pgc

index ab929728a7ff5c7647bc214936ecd672a640dd09..c7288413a9925efd2abbb7aaf0442251b9874580 100644 (file)
@@ -1,5 +1,5 @@
 <!--
-$PostgreSQL: pgsql/doc/src/sgml/ref/alter_table.sgml,v 1.99 2008/05/09 23:32:03 tgl Exp $
+$PostgreSQL: pgsql/doc/src/sgml/ref/alter_table.sgml,v 1.100 2008/10/21 08:38:15 petere Exp $
 PostgreSQL documentation
 -->
 
@@ -33,7 +33,7 @@ where <replaceable class="PARAMETER">action</replaceable> is one of:
 
     ADD [ COLUMN ] <replaceable class="PARAMETER">column</replaceable> <replaceable class="PARAMETER">type</replaceable> [ <replaceable class="PARAMETER">column_constraint</replaceable> [ ... ] ]
     DROP [ COLUMN ] <replaceable class="PARAMETER">column</replaceable> [ RESTRICT | CASCADE ]
-    ALTER [ COLUMN ] <replaceable class="PARAMETER">column</replaceable> TYPE <replaceable class="PARAMETER">type</replaceable> [ USING <replaceable class="PARAMETER">expression</replaceable> ]
+    ALTER [ COLUMN ] <replaceable class="PARAMETER">column</replaceable> [ SET DATA ] TYPE <replaceable class="PARAMETER">type</replaceable> [ USING <replaceable class="PARAMETER">expression</replaceable> ]
     ALTER [ COLUMN ] <replaceable class="PARAMETER">column</replaceable> SET DEFAULT <replaceable class="PARAMETER">expression</replaceable>
     ALTER [ COLUMN ] <replaceable class="PARAMETER">column</replaceable> DROP DEFAULT
     ALTER [ COLUMN ] <replaceable class="PARAMETER">column</replaceable> { SET | DROP } NOT NULL
@@ -93,7 +93,7 @@ where <replaceable class="PARAMETER">action</replaceable> is one of:
    </varlistentry>
 
    <varlistentry>
-    <term><literal>ALTER COLUMN TYPE</literal></term>
+    <term><literal>SET DATA TYPE</literal></term>
     <listitem>
      <para>
       This form changes the type of a column of a table. Indexes and
@@ -760,7 +760,7 @@ ALTER TABLE distributors
    with time zone</type> via a <literal>USING</literal> clause:
 <programlisting>
 ALTER TABLE foo
-    ALTER COLUMN foo_timestamp TYPE timestamp with time zone
+    ALTER COLUMN foo_timestamp SET DATA TYPE timestamp with time zone
     USING
         timestamp with time zone 'epoch' + foo_timestamp * interval '1 second';
 </programlisting>
@@ -868,8 +868,9 @@ ALTER TABLE myschema.distributors SET SCHEMA yourschema;
   <title>Compatibility</title>
 
   <para>
-   The <literal>ADD</literal>, <literal>DROP</>, and <literal>SET DEFAULT</>
-   forms conform with the SQL standard.  The other forms are
+   The forms <literal>ADD</literal>, <literal>DROP</>, <literal>SET DEFAULT</>,
+   and <literal>SET DATA TYPE</literal> (without <literal>USING</literal>)
+   conform with the SQL standard.  The other forms are
    <productname>PostgreSQL</productname> extensions of the SQL standard.
    Also, the ability to specify more than one manipulation in a single
    <command>ALTER TABLE</> command is an extension.
index 6e4871fbf182f1bbf64b4e28c48d07f62fe6a241..4c50a22a0afa9ba94fcc98f8a683a045e601b692 100644 (file)
@@ -236,7 +236,7 @@ F381        Extended schema manipulation                    YES
 F381   Extended schema manipulation    01      ALTER TABLE statement: ALTER COLUMN clause      YES     
 F381   Extended schema manipulation    02      ALTER TABLE statement: ADD CONSTRAINT clause    YES     
 F381   Extended schema manipulation    03      ALTER TABLE statement: DROP CONSTRAINT clause   YES     
-F382   Alter column data type                  NO      PostgreSQL syntax differs
+F382   Alter column data type                  YES     
 F391   Long identifiers                        YES     
 F392   Unicode escapes in identifiers                  NO      
 F393   Unicode escapes in literals                     NO      
index 55e5828e32186647b644ee4fc36a40e044a08a8d..aa5f33b41147f22026a5b93cbd3c62a6854432f3 100644 (file)
@@ -11,7 +11,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.626 2008/10/20 14:26:28 petere Exp $
+ *       $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.627 2008/10/21 08:38:15 petere Exp $
  *
  * HISTORY
  *       AUTHOR                        DATE                    MAJOR EVENT
@@ -304,7 +304,7 @@ static TypeName *TableFuncTypeName(List *columns);
 
 %type <boolean> copy_from
 
-%type <ival>   opt_column event cursor_options opt_hold
+%type <ival>   opt_column event cursor_options opt_hold opt_set_data
 %type <objtype>        reindex_type drop_type comment_type
 
 %type <node>   fetch_direction select_limit_value select_offset_value
@@ -407,7 +407,7 @@ static TypeName *TableFuncTypeName(List *columns);
        CREATEROLE CREATEUSER CROSS CSV CTYPE CURRENT_P CURRENT_DATE CURRENT_ROLE
        CURRENT_TIME CURRENT_TIMESTAMP CURRENT_USER CURSOR CYCLE
 
-       DATABASE DAY_P DEALLOCATE DEC DECIMAL_P DECLARE DEFAULT DEFAULTS
+       DATA_P DATABASE DAY_P DEALLOCATE DEC DECIMAL_P DECLARE DEFAULT DEFAULTS
        DEFERRABLE DEFERRED DEFINER DELETE_P DELIMITER DELIMITERS DESC
        DICTIONARY DISABLE_P DISCARD DISTINCT DO DOCUMENT_P DOMAIN_P DOUBLE_P DROP
 
@@ -1534,16 +1534,16 @@ alter_table_cmd:
                                        $$ = (Node *)n;
                                }
                        /*
-                        * ALTER TABLE <name> ALTER [COLUMN] <colname> TYPE <typename>
+                        * ALTER TABLE <name> ALTER [COLUMN] <colname> [SET DATA] TYPE <typename>
                         *              [ USING <expression> ]
                         */
-                       | ALTER opt_column ColId TYPE_P Typename alter_using
+                       | ALTER opt_column ColId opt_set_data TYPE_P Typename alter_using
                                {
                                        AlterTableCmd *n = makeNode(AlterTableCmd);
                                        n->subtype = AT_AlterColumnType;
                                        n->name = $3;
-                                       n->def = (Node *) $5;
-                                       n->transform = $6;
+                                       n->def = (Node *) $6;
+                                       n->transform = $7;
                                        $$ = (Node *)n;
                                }
                        /* ALTER TABLE <name> ADD CONSTRAINT ... */
@@ -4854,6 +4854,10 @@ opt_column: COLUMN                                                                       { $$ = COLUMN; }
                        | /*EMPTY*/                                                             { $$ = 0; }
                ;
 
+opt_set_data: SET DATA_P                                                                       { $$ = 1; }
+                       | /*EMPTY*/                                                             { $$ = 0; }
+               ;
+
 /*****************************************************************************
  *
  * ALTER THING name SET SCHEMA name
@@ -9317,6 +9321,7 @@ unreserved_keyword:
                        | CURRENT_P
                        | CURSOR
                        | CYCLE
+                       | DATA_P
                        | DATABASE
                        | DAY_P
                        | DEALLOCATE
index c55bfd8b5cde512d33c8ccf5186cb7a093df6229..7c6aa71572a99292c54b3e67ef7b5954425b3d84 100644 (file)
@@ -11,7 +11,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/parser/keywords.c,v 1.202 2008/10/04 21:56:54 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/parser/keywords.c,v 1.203 2008/10/21 08:38:15 petere Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -123,6 +123,7 @@ const ScanKeyword ScanKeywords[] = {
        {"current_user", CURRENT_USER, RESERVED_KEYWORD},
        {"cursor", CURSOR, UNRESERVED_KEYWORD},
        {"cycle", CYCLE, UNRESERVED_KEYWORD},
+       {"data", DATA_P, UNRESERVED_KEYWORD},
        {"database", DATABASE, UNRESERVED_KEYWORD},
        {"day", DAY_P, UNRESERVED_KEYWORD},
        {"deallocate", DEALLOCATE, UNRESERVED_KEYWORD},
index 3d8db4053791bc35e395ff3a789e5fabd10c254e..ae2c3aa4bd2181472ebdd679e88384a5e704c5a0 100644 (file)
@@ -4,7 +4,7 @@
  *       lexical token lookup for reserved words in postgres embedded SQL
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/ecpg_keywords.c,v 1.38 2008/05/20 23:17:32 meskes Exp $
+ *       $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/ecpg_keywords.c,v 1.39 2008/10/21 08:38:16 petere Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -34,7 +34,6 @@ static const ScanKeyword ScanECPGKeywords[] = {
        {"cardinality", SQL_CARDINALITY, 0},
        {"connect", SQL_CONNECT, 0},
        {"count", SQL_COUNT, 0},
-       {"data", SQL_DATA, 0},
        {"datetime_interval_code", SQL_DATETIME_INTERVAL_CODE, 0},
        {"datetime_interval_precision", SQL_DATETIME_INTERVAL_PRECISION, 0},
        {"describe", SQL_DESCRIBE, 0},
index c4ad9d81b2ba14fc31eca861fc36cd4523e00e2b..7220deff68a419d4ab9a88e0055c8a99cb29270f 100644 (file)
@@ -1,4 +1,4 @@
-/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/preproc.y,v 1.376 2008/10/14 09:31:04 meskes Exp $ */
+/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/preproc.y,v 1.377 2008/10/21 08:38:16 petere Exp $ */
 
 /* Copyright comment */
 %{
@@ -392,7 +392,7 @@ add_typedef(char *name, char * dimension, char * length, enum ECPGttype type_enu
 /* special embedded SQL token */
 %token SQL_ALLOCATE SQL_AUTOCOMMIT SQL_BOOL SQL_BREAK
                SQL_CALL SQL_CARDINALITY SQL_CONNECT
-               SQL_COUNT SQL_DATA
+               SQL_COUNT
                SQL_DATETIME_INTERVAL_CODE
                SQL_DATETIME_INTERVAL_PRECISION SQL_DESCRIBE
                SQL_DESCRIPTOR SQL_DISCONNECT SQL_FOUND
@@ -431,7 +431,7 @@ add_typedef(char *name, char * dimension, char * length, enum ECPGttype type_enu
        CREATEROLE CREATEUSER CROSS CSV CTYPE CURRENT_P CURRENT_DATE CURRENT_ROLE
        CURRENT_TIME CURRENT_TIMESTAMP CURRENT_USER CURSOR CYCLE
 
-       DATABASE DAY_P DEALLOCATE DEC DECIMAL_P DECLARE DEFAULT DEFAULTS
+       DATA_P DATABASE DAY_P DEALLOCATE DEC DECIMAL_P DECLARE DEFAULT DEFAULTS
        DEFERRABLE DEFERRED DEFINER DELETE_P DELIMITER DELIMITERS DESC
        DICTIONARY DISABLE_P DISCARD DISTINCT DO DOCUMENT_P DOMAIN_P DOUBLE_P DROP
 
@@ -584,7 +584,7 @@ add_typedef(char *name, char * dimension, char * length, enum ECPGttype type_enu
 %type  <str>   def_elem def_list definition DefineStmt select_with_parens
 %type  <str>   opt_instead event RuleActionList opt_using CreateAssertStmt
 %type  <str>   RuleActionStmtOrEmpty RuleActionMulti func_as reindex_type
-%type  <str>   RuleStmt opt_column oper_argtypes NumConst var_name
+%type  <str>   RuleStmt opt_column opt_set_data oper_argtypes NumConst var_name
 %type  <str>   MathOp RemoveFuncStmt ECPGunreserved_con opt_database_name
 %type  <str>   RemoveAggrStmt opt_procedural select_no_parens CreateCastStmt
 %type  <str>   RemoveOperStmt RenameStmt all_Op opt_trusted opt_lancompiler
@@ -1398,9 +1398,9 @@ alter_table_cmd:
 /* ALTER TABLE <name> DROP [COLUMN] <colname> {RESTRICT|CASCADE} */
                | DROP opt_column ColId opt_drop_behavior
                        { $$ = cat_str(4, make_str("drop"), $2, $3, $4); }
-/* ALTER TABLE <name> ALTER [COLUMN] <colname> TYPE <typename> [ USING <expression> ] */
-               | ALTER opt_column ColId TYPE_P Typename alter_using
-                       { $$ = cat_str(6, make_str("alter"), $2, $3, make_str("type"), $5, $6); }
+/* ALTER TABLE <name> ALTER [COLUMN] <colname> [SET DATA] TYPE <typename> [ USING <expression> ] */
+               | ALTER opt_column ColId opt_set_data TYPE_P Typename alter_using
+                       { $$ = cat_str(7, make_str("alter"), $2, $3, $4, make_str("type"), $6, $7); }
 /* ALTER TABLE <name> ADD CONSTRAINT ... */
                | ADD_P TableConstraint
                        { $$ = cat_str(2, make_str("add"), $2); }
@@ -2891,6 +2891,10 @@ opt_column:  COLUMN                      { $$ = make_str("column"); }
                | /*EMPTY*/                     { $$ = EMPTY; }
                ;
 
+opt_set_data:  SET DATA_P                      { $$ = make_str("set data"); }
+               | /*EMPTY*/                     { $$ = EMPTY; }
+               ;
+
 /*****************************************************************************
  *
  * ALTER THING name SET SCHEMA name
@@ -6140,7 +6144,7 @@ ECPGSetDescItem: descriptor_item '=' AllConstVar
 
 
 descriptor_item:       SQL_CARDINALITY                 { $$ = ECPGd_cardinality; }
-               | SQL_DATA                              { $$ = ECPGd_data; }
+               | DATA_P                                { $$ = ECPGd_data; }
                | SQL_DATETIME_INTERVAL_CODE            { $$ = ECPGd_di_code; }
                | SQL_DATETIME_INTERVAL_PRECISION       { $$ = ECPGd_di_precision; }
                | SQL_INDICATOR                         { $$ = ECPGd_indicator; }
@@ -6360,7 +6364,6 @@ ECPGKeywords_vanames:  SQL_BREAK          { $$ = make_str("break"); }
                | SQL_CALL                                              { $$ = make_str("call"); }
                | SQL_CARDINALITY                               { $$ = make_str("cardinality"); }
                | SQL_COUNT                                             { $$ = make_str("count"); }
-               | SQL_DATA                                              { $$ = make_str("data"); }
                | SQL_DATETIME_INTERVAL_CODE    { $$ = make_str("datetime_interval_code"); }
                | SQL_DATETIME_INTERVAL_PRECISION       { $$ = make_str("datetime_interval_precision"); }
                | SQL_FOUND                                             { $$ = make_str("found"); }
@@ -6557,6 +6560,7 @@ ECPGunreserved_con:         ABORT_P                       { $$ = make_str("abort"); }
                | CTYPE                 { $$ = make_str("ctype"); }
                | CURSOR                        { $$ = make_str("cursor"); }
                | CYCLE                         { $$ = make_str("cycle"); }
+               | DATA_P                        { $$ = make_str("data"); }
                | DATABASE                      { $$ = make_str("database"); }
 /*             | DAY_P                         { $$ = make_str("day"); }*/
                | DEALLOCATE            { $$ = make_str("deallocate"); }
index 41193a4d2f0c43e68c98dd5e03416ee82a6a6621..bdc9908d16ca909b7cbea6fdde2bb5e833280788 100644 (file)
@@ -101,7 +101,7 @@ if (sqlca.sqlcode < 0) sqlprint();}
   for (i=0; i<3; i++)
        printf("item[%d] = %d\n", i, ind[i] ? -1 : item[i]);
 
-  { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "drop table T ", ECPGt_EOIT, ECPGt_EORT);
+  { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "alter table T alter  Item1  type bigint  ", ECPGt_EOIT, ECPGt_EORT);
 #line 31 "parser.pgc"
 
 if (sqlca.sqlwarn[0] == 'W') sqlprint();
@@ -110,15 +110,34 @@ if (sqlca.sqlwarn[0] == 'W') sqlprint();
 if (sqlca.sqlcode < 0) sqlprint();}
 #line 31 "parser.pgc"
 
+  { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "alter table T alter column Item2 set data type smallint  ", ECPGt_EOIT, ECPGt_EORT);
+#line 32 "parser.pgc"
+
+if (sqlca.sqlwarn[0] == 'W') sqlprint();
+#line 32 "parser.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 32 "parser.pgc"
+
+
+  { ECPGdo(__LINE__, 0, 1, NULL, 0, ECPGst_normal, "drop table T ", ECPGt_EOIT, ECPGt_EORT);
+#line 34 "parser.pgc"
+
+if (sqlca.sqlwarn[0] == 'W') sqlprint();
+#line 34 "parser.pgc"
+
+if (sqlca.sqlcode < 0) sqlprint();}
+#line 34 "parser.pgc"
+
 
   { ECPGdisconnect(__LINE__, "ALL");
-#line 33 "parser.pgc"
+#line 36 "parser.pgc"
 
 if (sqlca.sqlwarn[0] == 'W') sqlprint();
-#line 33 "parser.pgc"
+#line 36 "parser.pgc"
 
 if (sqlca.sqlcode < 0) sqlprint();}
-#line 33 "parser.pgc"
+#line 36 "parser.pgc"
 
 
   return 0;
index e372cd6710d2bacf7c5afafa38ba1eb4b3f8a6ca..05ac75348c0c4d0a8a062c2237dfa3f85814ec70 100644 (file)
 [NO_PID]: sqlca: code: 0, state: 00000
 [NO_PID]: ecpg_get_data on line 26: RESULT:  offset: -1; array: yes
 [NO_PID]: sqlca: code: 0, state: 00000
-[NO_PID]: ecpg_execute on line 31: query: drop table T ; with 0 parameter(s) on connection regress1
+[NO_PID]: ecpg_execute on line 31: query: alter table T alter  Item1  type bigint  ; with 0 parameter(s) on connection regress1
 [NO_PID]: sqlca: code: 0, state: 00000
 [NO_PID]: ecpg_execute on line 31: using PQexec
 [NO_PID]: sqlca: code: 0, state: 00000
-[NO_PID]: ecpg_execute on line 31: OK: DROP TABLE
+[NO_PID]: ecpg_execute on line 31: OK: ALTER TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 32: query: alter table T alter column Item2 set data type smallint  ; with 0 parameter(s) on connection regress1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 32: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 32: OK: ALTER TABLE
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 34: query: drop table T ; with 0 parameter(s) on connection regress1
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 34: using PQexec
+[NO_PID]: sqlca: code: 0, state: 00000
+[NO_PID]: ecpg_execute on line 34: OK: DROP TABLE
 [NO_PID]: sqlca: code: 0, state: 00000
 [NO_PID]: ecpg_finish: connection regress1 closed
 [NO_PID]: sqlca: code: 0, state: 00000
index 97ccedda289237ad444b5b27d7f1dd86291b2ece..806aabb70f9c8c998d4e41ceea09c8d46bc142b0 100644 (file)
@@ -28,6 +28,9 @@ int main(int argc, char* argv[]) {
   for (i=0; i<3; i++)
        printf("item[%d] = %d\n", i, ind[i] ? -1 : item[i]);
 
+  EXEC SQL ALTER TABLE T ALTER Item1 TYPE bigint;
+  EXEC SQL ALTER TABLE T ALTER COLUMN Item2 SET DATA TYPE smallint;
+
   EXEC SQL DROP TABLE T;
 
   EXEC SQL DISCONNECT ALL;