@@ -197,7 +197,7 @@ make_name(void)
197197SCHEMA ,SCROLL ,SECOND_P ,SELECT ,SESSION ,SESSION_USER ,SET ,SOME ,SUBSTRING ,
198198TABLE ,TEMPORARY ,THEN ,TIME ,TIMESTAMP
199199TO ,TRAILING ,TRANSACTION ,TRIM ,TRUE_P ,
200- UNENCRYPTED ,UNION ,UNIQUE ,UNKNOWN ,UPDATE ,USER ,USING ,
200+ UNENCRYPTED ,UNION ,UNIQUE ,UNKNOWN ,UPDATE ,USAGE , USER ,USING ,
201201VALUES ,VARCHAR ,VARYING ,VIEW ,
202202WHEN ,WHERE ,WITH ,WITHOUT ,WORK ,YEAR_P ,ZONE
203203
@@ -228,7 +228,8 @@ make_name(void)
228228NONE ,NOTHING ,NOTIFY ,NOTNULL ,OFFSET ,OIDS ,
229229OPERATOR ,OWNER ,PASSWORD ,PROCEDURAL ,REINDEX ,RENAME ,RESET ,
230230RETURNS ,ROW ,RULE ,SEQUENCE ,SETOF ,SHARE ,
231- SHOW ,START ,STATEMENT ,STATISTICS ,STDIN ,STDOUT ,SYSID TEMP ,
231+ SHOW ,START ,STATEMENT ,STATISTICS ,STDIN ,STDOUT ,STORAGE ,
232+ SYSID ,TEMP ,
232233TEMPLATE ,TOAST ,TRUNCATE ,TRUSTED ,UNLISTEN ,UNTIL ,VACUUM ,
233234VALID ,VERBOSE ,VERSION
234235
@@ -327,12 +328,16 @@ make_name(void)
327328%type <str> TriggerActionTime CreateTrigStmt DropPLangStmt
328329%type <str> CreatePLangStmt TriggerFuncArgs TriggerFuncArg simple_select
329330%type <str> ViewStmt LoadStmt CreatedbStmt createdb_opt_item
330- %type <str> createdb_opt_list opt_encoding OptInherit
331+ %type <str> createdb_opt_list opt_encoding OptInherit opt_equal
332+ %type <str> AlterUserSetStmt privilege_list privilege privilege_target
333+ %type <str> opt_grant_grant_option opt_revoke_grant_option
334+ %type <str> function_with_argtypes_list function_with_argtypes
331335%type <str> DropdbStmt ClusterStmt grantee RevokeStmt Bit bit
332- %type <str> GrantStmt privileges operation_commalist operation PosAllConst
333- %type <str> opt_with_grant opt_cursor ConstraintsSetStmt AllConst
336+ %type <str> GrantStmt privileges PosAllConst
337+ %type <str> opt_cursor ConstraintsSetStmt AllConst
334338%type <str> case_expr when_clause_list case_default case_arg when_clause
335- %type <str> select_clause opt_select_limit select_limit_value ConstraintTimeSpec
339+ %type <str> select_clause opt_select_limit select_limit_value
340+ %type <str> ConstraintTimeSpec AlterDatabaseSetStmt
336341%type <str> select_offset_value ReindexStmt join_type opt_boolean
337342%type <str> join_qual update_list AlterSchemaStmt joined_table
338343%type <str> opt_level opt_lock lock_type OptGroupList OptGroupElem
@@ -406,10 +411,12 @@ opt_at:AT connection_target{
406411argsinsert =NULL ;
407412};
408413
409- stmt :AlterSchemaStmt { output_statement($1 ,0 , connection); }
410- | AlterTableStmt { output_statement($1 ,0 , connection); }
414+ stmt :AlterDatabaseSetStmt { output_statement($1 ,0 , connection); }
411415| AlterGroupStmt { output_statement($1 ,0 , connection); }
416+ | AlterSchemaStmt { output_statement($1 ,0 , connection); }
417+ | AlterTableStmt { output_statement($1 ,0 , connection); }
412418| AlterUserStmt { output_statement($1 ,0 , connection); }
419+ | AlterUserSetStmt { output_statement($1 ,0 , connection); }
413420| ClosePortalStmt { output_statement($1 ,0 , connection); }
414421| CommentStmt { output_statement($1 ,0 , connection); }
415422| CopyStmt { output_statement($1 ,0 , connection); }
@@ -634,6 +641,16 @@ AlterUserStmt: ALTER USER UserId OptUserList
634641}
635642;
636643
644+ AlterUserSetStmt :ALTER USER UserId VariableSetStmt
645+ {
646+ $$ = cat_str(3 , make_str(" alter user" ),$3 ,$4 );
647+ }
648+ | ALTER USER UserId VariableResetStmt
649+ {
650+ $$ = cat_str(3 , make_str(" alter user" ),$3 ,$4 );
651+ }
652+ ;
653+
637654/* ****************************************************************************
638655 *
639656 * Drop a postgresql DBMS user
@@ -976,6 +993,11 @@ AlterTableStmt:
976993{
977994$$ = cat_str(7 , make_str(" alter table" ),$3 , make_str(" alter" ),$5 ,$6 , make_str(" set statistics" ),$9 );
978995}
996+ /* ALTER TABLE <relation> ALTER [COLUMN] <colname> SET STORAGE <storagemode>*/
997+ | ALTER TABLE relation_expr ALTER opt_column ColId SET STORAGE ColId
998+ {
999+ $$ = cat_str(7 , make_str(" alter table" ),$3 , make_str(" alter" ),$5 ,$6 , make_str(" set storage" ),$9 );
1000+ }
9791001/* ALTER TABLE <relation> DROP [COLUMN] <colname> {RESTRICT|CASCADE}*/
9801002| ALTER TABLE relation_expr DROP opt_column ColId drop_behavior
9811003{
@@ -1714,13 +1736,19 @@ comment_text: StringConst{ $$ = $1; }
17141736/* ****************************************************************************
17151737 *
17161738 *QUERY:
1717- * GRANT[privileges] ON [TABLE] relation_name_list TO [GROUP] grantee, ...
1739+ * GRANTand REVOKE statements
17181740 *
17191741 *****************************************************************************/
17201742
1721- GrantStmt :GRANT privileges ON opt_table relation_name_list TO grantee_list opt_with_grant
1743+ GrantStmt :GRANT privileges ON privilege_target TO grantee_list opt_grant_grant_option
1744+ {
1745+ $$ = cat_str(7 , make_str(" grant" ),$2 , make_str(" on" ),$4 , make_str(" to" ),$6 ,$7 );
1746+ }
1747+ ;
1748+
1749+ RevokeStmt :REVOKE opt_revoke_grant_option privileges ON privilege_target FROM grantee_list
17221750{
1723- $$ = cat_str(8 , make_str(" grant " ),$2 , make_str(" on" ),$4 , $ 5 , make_str(" to " ),$7 , $8 );
1751+ $$ = cat_str(8 , make_str(" revoke " ),$2 ,$3 , make_str(" on" ),$5 , make_str(" from " ),$7 );
17241752}
17251753;
17261754
@@ -1732,23 +1760,23 @@ privileges: ALL PRIVILEGES
17321760{
17331761$$ = make_str(" all" );
17341762}
1735- | operation_commalist
1763+ | privilege_list
17361764{
17371765$$ =$1 ;
17381766}
17391767;
17401768
1741- operation_commalist :operation
1769+ privilege_list :privilege
17421770{
17431771$$ =$1 ;
17441772}
1745- | operation_commalist ' ,' operation
1773+ | privilege_list ' ,' privilege
17461774{
17471775$$ = cat_str(3 ,$1 , make_str(" ," ),$3 );
17481776}
17491777;
17501778
1751- operation :SELECT
1779+ privilege :SELECT
17521780{
17531781$$ = make_str(" select" );
17541782}
@@ -1776,8 +1804,38 @@ operation: SELECT
17761804{
17771805$$ = make_str(" trigger" );
17781806}
1807+ | EXECUTE
1808+ {
1809+ $$ = make_str(" execute" );
1810+ }
1811+ | USAGE
1812+ {
1813+ $$ = make_str(" usage" );
1814+ }
17791815;
17801816
1817+ privilege_target :relation_name_list
1818+ {
1819+ $$ =$1 ;
1820+ }
1821+ | TABLE relation_name_list
1822+ {
1823+ $$ = cat2_str(make_str(" table" ),$2 );
1824+ }
1825+ | FUNCTION function_with_argtypes_list
1826+ {
1827+ $$ = cat2_str(make_str(" function" ),$2 );
1828+ }
1829+ | LANGUAGE name_list
1830+ {
1831+ $$ = cat2_str(make_str(" language" ) ,$2 );
1832+ }
1833+ ;
1834+
1835+ grantee_list :grantee {$$ =$1 ; }
1836+ | grantee_list ' ,' grantee {$$ = cat_str(3 ,$1 , make_str(" ," ),$3 ); }
1837+ ;
1838+
17811839grantee :PUBLIC
17821840{
17831841$$ = make_str(" public" );
@@ -1792,33 +1850,30 @@ grantee: PUBLIC
17921850}
17931851;
17941852
1795- grantee_list :grantee {$$ =$1 ; }
1796- | grantee_list ' ,' grantee {$$ = cat_str(3 ,$1 , make_str(" ," ),$3 ); }
1797- ;
1798-
1799- opt_with_grant :WITH GRANT OPTION
1800- {
1801- mmerror (PARSE_ERROR, ET_WARNING," Currently unsupported GRANT/WITH GRANT OPTION will be passed to backend" );
1802- $$ = make_str(" with grant option" );
1803- }
1853+ opt_grant_grant_option :WITH GRANT OPTION
1854+ {
1855+ mmerror (PARSE_ERROR, ET_WARNING," Currently unsupported GRANT/WITH GRANT OPTION will be passed to backend" );
1856+ $$ = make_str(" with grant option" );
1857+ }
18041858| /* EMPTY*/ {$$ = EMPTY; }
18051859;
18061860
1861+ opt_revoke_grant_option :GRANT OPTION FOR
1862+ {
1863+ mmerror (PARSE_ERROR, ET_WARNING," Currently unsupported REVOKE/GRANT OPTION FOR will be passed to backend" );
1864+ $$ = make_str(" with grant option" );
1865+ }
1866+ | /* EMPTY*/ {$$ = EMPTY; }
1867+ ;
18071868
1808- /* ****************************************************************************
1809- *
1810- *QUERY:
1811- * REVOKE privileges ON [TABLE relation_name_list FROM [user], ...
1812- *
1813- *****************************************************************************/
1814-
1815- RevokeStmt :REVOKE privileges ON opt_table relation_name_list FROM grantee_list
1816- {
1817- $$ = cat_str(8 , make_str(" revoke" ),$2 , make_str(" on" ),$4 ,$5 , make_str(" from" ),$7 );
1818- }
1869+ function_with_argtypes_list :function_with_argtypes
1870+ {$$ =$1 ; }
1871+ | function_with_argtypes_list ' ,' function_with_argtypes
1872+ {$$ = cat_str(3 ,$1 , make_str(" ," ),$3 ); }
18191873;
18201874
1821-
1875+ function_with_argtypes :func_name func_args
1876+ {$$ = cat2_str($1 ,$2 ); };
18221877
18231878/* ****************************************************************************
18241879 *
@@ -2188,9 +2243,9 @@ TransactionStmt: ABORT_TRANS opt_trans{ $$ = make_str("rollback"); }
21882243| ROLLBACK opt_trans opt_chain {$$ = cat2_str(make_str(" rollback" ),$3 ); }
21892244;
21902245
2191- opt_trans :WORK {$$ =" " ; }
2192- | TRANSACTION {$$ =" " ; }
2193- | /* EMPTY*/ {$$ =" " ; }
2246+ opt_trans :WORK {$$ =EMPTY ; }
2247+ | TRANSACTION {$$ =EMPTY ; }
2248+ | /* EMPTY*/ {$$ =EMPTY ; }
21942249 ;
21952250
21962251opt_chain :AND NO CHAIN {$$ = make_str(" and no chain" ); }
@@ -2252,20 +2307,49 @@ createdb_opt_list: createdb_opt_item
22522307 {$$ = cat2_str($1 ,$2 ); }
22532308 ;
22542309
2255- createdb_opt_item :LOCATION ' =' StringConst {$$ = cat2_str(make_str(" location =" ),$3 ); }
2256- | LOCATION ' =' DEFAULT {$$ = make_str(" location = default" ); }
2257- | TEMPLATE ' =' name {$$ = cat2_str(make_str(" template =" ),$3 ); }
2258- | TEMPLATE ' =' DEFAULT {$$ = make_str(" template = default" ); }
2259- | ENCODING ' =' PosIntStringConst
2310+ createdb_opt_item :LOCATION opt_equal StringConst {$$ = cat_str(3 ,make_str(" location" ),$2 ,$3 ); }
2311+ | LOCATION opt_equal DEFAULT {$$ = cat_str(3 , make_str(" location" ),$2 , make_str(" default" )); }
2312+ | TEMPLATE opt_equal name {$$ = cat_str(3 , make_str(" template" ),$2 ,$3 ); }
2313+ | TEMPLATE opt_equal DEFAULT {$$ = cat_str(3 , make_str(" template" ),$2 , make_str(" default" )); }
2314+ | ENCODING opt_equal PosIntStringConst
2315+ {
2316+ $$ = cat_str(3 , make_str(" encoding" ),$2 ,$3 );
2317+ }
2318+ | ENCODING opt_equal DEFAULT
2319+ {
2320+ $$ = cat_str(3 , make_str(" encoding" ),$2 , make_str(" default" ));
2321+ }
2322+ | OWNER opt_equal name
22602323{
2261- $$ =cat2_str( make_str(" encoding = " ) ,$3 );
2324+ $$ =cat_str( 3 , make_str(" owner " ), $2 ,$3 );
22622325}
2263- | ENCODING ' = ' DEFAULT
2326+ | OWNER opt_equal DEFAULT
22642327{
2265- $$ = make_str(" encoding = default" );
2328+ $$ =cat_str( 3 , make_str(" owner " ), $2 , make_str( " default" ) );
22662329}
22672330 ;
22682331
2332+ opt_equal :' =' {$$ = make_str(" =" ); }
2333+ | /* EMPTY*/ {$$ = EMPTY; }
2334+ ;
2335+
2336+ /* ****************************************************************************
2337+ *
2338+ * ALTER DATABASE
2339+ *
2340+ *
2341+ *****************************************************************************/
2342+
2343+ AlterDatabaseSetStmt :ALTER DATABASE database_name VariableSetStmt
2344+ {
2345+ $$ = cat_str(3 , make_str(" alter database" ),$3 ,$4 );
2346+ }
2347+ | ALTER DATABASE database_name VariableResetStmt
2348+ {
2349+ $$ = cat_str(3 , make_str(" alter database" ),$3 ,$4 );
2350+ }
2351+ ;
2352+
22692353/* ****************************************************************************
22702354 *
22712355 *DROP DATABASE
@@ -2702,10 +2786,7 @@ select_limit: LIMIT select_limit_value OFFSET select_offset_value
27022786| OFFSET select_offset_value
27032787 {$$ = cat2_str(make_str(" offset" ),$2 ); }
27042788| LIMIT select_limit_value ' ,' select_offset_value
2705- {$$ = cat_str(4 , make_str(" limit" ),$2 , make_str(" ," ),$4 ); }
2706- /* enable this in 7.3, bjm 2001-10-22
27072789 { mmerror(PARSE_ERROR, ET_WARNING," No longer supported LIMIT #,# syntax passed to backend." ); }
2708- */
27092790 ;
27102791
27112792opt_select_limit :select_limit {$$ =$1 ; }
@@ -5147,6 +5228,7 @@ unreserved_keyword:
51475228| STATISTICS {$$ = make_str(" statistics" ); }
51485229| STDIN {$$ = make_str(" stdin" ); }
51495230| STDOUT {$$ = make_str(" stdout" ); }
5231+ | STORAGE {$$ = make_str(" storage" ); }
51505232| SYSID {$$ = make_str(" sysid" ); }
51515233| TEMP {$$ = make_str(" temp" ); }
51525234| TEMPLATE {$$ = make_str(" template" ); }
@@ -5162,6 +5244,7 @@ unreserved_keyword:
51625244| UNLISTEN {$$ = make_str(" unlisten" ); }
51635245| UNTIL {$$ = make_str(" until" ); }
51645246| UPDATE {$$ = make_str(" update" ); }
5247+ | USAGE {$$ = make_str(" usage" ); }
51655248| VACUUM {$$ = make_str(" vacuum" ); }
51665249| VALID {$$ = make_str(" valid" ); }
51675250| VALUES {$$ = make_str(" values" ); }