@@ -177,8 +177,8 @@ make_name(void)
177
177
/* Keywords (in SQL92 reserved words)*/
178
178
%token ABSOLUTE ,ACTION ,ADD ,ALL ,ALTER ,AND ,ANY ,AS ,ASC ,
179
179
AT ,AUTHORIZATION ,BEGIN_TRANS ,BETWEEN ,BOTH ,BY ,
180
- CASCADE ,CASE ,CAST ,CHAIN , CHAR ,CHARACTER ,
181
- CHARACTERISTICS , CHECK ,CLOSE ,COALESCE ,COLLATE ,
180
+ CASCADE ,CASE ,CAST ,CHAR ,CHARACTER ,
181
+ CHECK ,CLOSE ,COALESCE ,COLLATE ,
182
182
COLUMN ,COMMIT ,CONSTRAINT ,CONSTRAINTS ,CREATE ,CROSS ,
183
183
CURRENT ,CURRENT_DATE ,CURRENT_TIME ,CURRENT_TIMESTAMP ,
184
184
CURRENT_USER ,CURSOR ,DAY_P ,DEC ,DECIMAL ,DECLARE ,
@@ -193,7 +193,7 @@ make_name(void)
193
193
NULL_P ,NUMERIC ,OF ,OFF ,OLD ,ON ,ONLY ,OPTION ,OR ,
194
194
ORDER ,OUT ,OUTER_P ,OVERLAPS ,PARTIAL ,PATH_P ,
195
195
POSITION ,PRECISION ,PRIMARY ,PRIOR ,PRIVILEGES ,
196
- PROCEDURE ,PUBLIC , READ ,REFERENCES ,RELATIVE ,REVOKE ,
196
+ PROCEDURE ,READ ,REFERENCES ,RELATIVE ,REVOKE ,
197
197
RIGHT ,ROLLBACK ,SCHEMA ,SCROLL ,SECOND_P ,SELECT ,
198
198
SESSION ,SESSION_USER ,SET ,SOME ,SUBSTRING ,TABLE ,
199
199
TEMPORARY ,THEN ,TIME ,TIMESTAMP TO ,TRAILING ,
@@ -202,8 +202,9 @@ make_name(void)
202
202
VARYING ,VIEW ,WHEN ,WHERE ,WITH ,WITHOUT ,WORK ,
203
203
YEAR_P ,ZONE
204
204
205
- /* Keywords (in SQL3 reserved words)*/
206
- %token DEFERRABLE ,DEFERRED ,IMMEDIATE ,INITIALLY ,PENDANT ,
205
+ /* Keywords (in SQL99 reserved words)*/
206
+ %token ASSERTION ,CHAIN ,CHARACTERISTICS ,
207
+ DEFERRABLE ,DEFERRED ,IMMEDIATE ,INITIALLY ,PENDANT ,
207
208
REPLACE ,RESTRICT ,TRIGGER
208
209
209
210
/* Keywords (in SQL92 non-reserved words)*/
@@ -284,8 +285,8 @@ make_name(void)
284
285
%type <str> ConstraintElem key_actions ColQualList type_name DropSchemaStmt
285
286
%type <str> target_list target_el update_target_list alias_clause
286
287
%type <str> update_target_el opt_id qualified_name database_name
287
- %type <str> access_method attr_name class index_name name func_name
288
- %type <str> file_name AexprConst c_expr ConstTypename
288
+ %type <str> access_method attr_name index_name name func_name
289
+ %type <str> file_name AexprConst c_expr ConstTypename var_list
289
290
%type <str> in_expr_nodes a_expr b_expr TruncateStmt CommentStmt
290
291
%type <str> opt_indirection expr_list extract_list extract_arg
291
292
%type <str> position_list substr_list substr_from alter_column_default
@@ -311,7 +312,7 @@ make_name(void)
311
312
%type <str> index_opt_unique IndexStmt func_return ConstInterval
312
313
%type <str> func_args_list func_args opt_with ProcedureStmt def_arg
313
314
%type <str> def_elem def_list definition DefineStmt select_with_parens
314
- %type <str> opt_instead event RuleActionList opt_using
315
+ %type <str> opt_instead event RuleActionList opt_using CreateAssertStmt
315
316
%type <str> RuleActionStmtOrEmpty RuleActionMulti func_as reindex_type
316
317
%type <str> RuleStmt opt_column opt_name oper_argtypes NumConst
317
318
%type <str> MathOp RemoveFuncStmt aggr_argtype for_update_clause
@@ -335,7 +336,7 @@ make_name(void)
335
336
%type <str> opt_cursor ConstraintsSetStmt AllConst CreateDomainStmt
336
337
%type <str> case_expr when_clause_list case_default case_arg when_clause
337
338
%type <str> select_clause opt_select_limit select_limit_value
338
- %type <str> ConstraintTimeSpec AlterDatabaseSetStmt
339
+ %type <str> ConstraintTimeSpec AlterDatabaseSetStmt DropAssertStmt
339
340
%type <str> select_offset_value ReindexStmt join_type opt_boolean
340
341
%type <str> join_qual update_list AlterSchemaStmt joined_table
341
342
%type <str> opt_level opt_lock lock_type OptGroupList OptGroupElem
@@ -348,7 +349,7 @@ make_name(void)
348
349
%type <str> OptSchemaName OptSchemaEltList schema_stmt opt_drop_behavior
349
350
%type <str> handler_name any_name_list any_name opt_as insert_column_list
350
351
%type <str> columnref dotted_name function_name insert_target_el
351
- %type <str> insert_target_list insert_column_item
352
+ %type <str> insert_target_list insert_column_item DropRuleStmt
352
353
353
354
%type <str> ECPGWhenever ECPGConnect connection_target ECPGOpen
354
355
%type <str> indicator ECPGExecute ECPGPrepare ecpg_using ecpg_into
@@ -431,6 +432,7 @@ stmt: AlterDatabaseSetStmt { output_statement($1, 0, connection); }
431
432
| CreateGroupStmt { output_statement($1 ,0 , connection); }
432
433
| CreateSeqStmt { output_statement($1 ,0 , connection); }
433
434
| CreatePLangStmt { output_statement($1 ,0 , connection); }
435
+ | CreateAssertStmt { output_statement($1 ,0 , connection); }
434
436
| CreateTrigStmt { output_statement($1 ,0 , connection); }
435
437
| CreateUserStmt { output_statement($1 ,0 , connection); }
436
438
| ClusterStmt { output_statement($1 ,0 , connection); }
@@ -440,7 +442,9 @@ stmt: AlterDatabaseSetStmt { output_statement($1, 0, connection); }
440
442
| TruncateStmt { output_statement($1 ,0 , connection); }
441
443
| DropGroupStmt { output_statement($1 ,0 , connection); }
442
444
| DropPLangStmt { output_statement($1 ,0 , connection); }
445
+ | DropAssertStmt { output_statement($1 ,0 , connection); }
443
446
| DropTrigStmt { output_statement($1 ,0 , connection); }
447
+ | DropRuleStmt { output_statement($1 ,0 , connection); }
444
448
| DropUserStmt { output_statement($1 ,0 , connection); }
445
449
| ExplainStmt { output_statement($1 ,0 , connection); }
446
450
| FetchStmt { output_statement($1 ,1 , connection); }
@@ -808,9 +812,9 @@ schema_stmt: CreateStmt{ $$ = $1; }
808
812
*
809
813
*****************************************************************************/
810
814
811
- VariableSetStmt :SET ColId TO var_value
815
+ VariableSetStmt :SET ColId TO var_list
812
816
{$$ = cat_str(4 , make_str(" set" ),$2 , make_str(" to" ),$4 ); }
813
- | SET ColId ' =' var_value
817
+ | SET ColId ' =' var_list
814
818
{$$ = cat_str(4 , make_str(" set" ),$2 , make_str(" =" ),$4 ); }
815
819
| SET TIME ZONE zone_value
816
820
{$$ = cat2_str(make_str(" set time zone" ),$4 ); }
@@ -824,21 +828,22 @@ VariableSetStmt: SET ColId TO var_value
824
828
{$$ = cat2_str(make_str(" set session authorization" ),$4 ); }
825
829
;
826
830
831
+ var_list :var_value
832
+ {$$ =$1 ; }
833
+ | var_list ' ,' var_value
834
+ {$$ = cat_str(3 ,$1 , make_str(" ," ),$3 ); }
835
+ | DEFAULT
836
+ {$$ = make_str(" default" ); }
837
+ ;
838
+
827
839
opt_level :READ COMMITTED {$$ = make_str(" read committed" ); }
828
840
| SERIALIZABLE {$$ = make_str(" serializable" ); }
829
841
;
830
842
831
843
832
844
var_value :opt_boolean {$$ =$1 ; }
833
- | AllConst {$$ =$1 ; }
834
- | name_list
835
- {
836
- if (strlen($1 ) ==0 )
837
- mmerror (PARSE_ERROR, ET_ERROR," SET must have at least one argument." );
838
-
839
- $$ =$1 ;
840
- }
841
- | DEFAULT {$$ = make_str(" default" ); }
845
+ | NumConst {$$ =$1 ; }
846
+ | ColId_or_Sconst {$$ =$1 ; }
842
847
;
843
848
844
849
opt_boolean :TRUE_P {$$ = make_str(" true" ); }
@@ -848,11 +853,15 @@ opt_boolean: TRUE_P{ $$ = make_str("true"); }
848
853
;
849
854
850
855
/* Timezone values can be:
851
- * - a string such as 'pst8pdt'
852
- * - an integer or floating point number
853
- * - a time interval per SQL99
854
- */
856
+ * - a string such as 'pst8pdt'
857
+ * - a column identifier such as "pst8pdt"
858
+ * - an integer or floating point number
859
+ * - a time interval per SQL99
860
+ * ConstInterval and ColId give shift/reduce errors,
861
+ * so use IDENT and reject anything which is a reserved word.
862
+ */
855
863
zone_value :AllConst {$$ =$1 ; }
864
+ | IDENT {$$ =$1 ; }
856
865
| ConstInterval StringConst opt_interval
857
866
{$$ = cat_str(3 ,$1 ,$2 ,$3 ); }
858
867
| ConstInterval ' (' PosIntConst ' )' StringConst opt_interval
@@ -1427,6 +1436,29 @@ DropTrigStmt: DROP TRIGGER name ON qualified_name
1427
1436
{$$ = cat_str(4 , make_str(" drop trigger" ),$3 , make_str(" on" ),$5 ); }
1428
1437
;
1429
1438
1439
+ /* ****************************************************************************
1440
+ *
1441
+ * QUERIES :
1442
+ * CREATE ASSERTION ...
1443
+ * DROP ASSERTION ...
1444
+ *
1445
+ *****************************************************************************/
1446
+ CreateAssertStmt :CREATE ASSERTION name
1447
+ CHECK ' (' a_expr ' )' ConstraintAttributeSpec
1448
+ {
1449
+ mmerror (PARSE_ERROR, ET_ERROR," CREATE ASSERTION is not yet supported" );
1450
+ $$ = cat_str(6 , make_str(" create assertion" ),$3 , make_str(" check (" ),$6 , make_str(" )" ),$8 );
1451
+ }
1452
+ ;
1453
+
1454
+ DropAssertStmt :DROP ASSERTION name
1455
+ {
1456
+ mmerror (PARSE_ERROR, ET_ERROR," DROP ASSERTION is not yet supported" );
1457
+ $$ = cat2_str(make_str(" drop assertion" ),$3 );
1458
+ }
1459
+ ;
1460
+
1461
+
1430
1462
/* ****************************************************************************
1431
1463
*
1432
1464
*QUERY :
@@ -1476,7 +1508,6 @@ drop_type:TABLE{ $$ = make_str("table"); }
1476
1508
| SEQUENCE {$$ = make_str(" sequence" ); }
1477
1509
| VIEW {$$ = make_str(" view" ); }
1478
1510
| INDEX {$$ = make_str(" index" ); }
1479
- | RULE {$$ = make_str(" rule" ); }
1480
1511
| TYPE_P {$$ = make_str(" type" ); }
1481
1512
| DOMAIN_P {$$ = make_str(" domain" ); }
1482
1513
;
@@ -1563,11 +1594,11 @@ from_in: IN{ $$ = make_str("in"); }
1563
1594
*The COMMENT ON statement can take different forms based upon the type of
1564
1595
*the object associated with the comment. The form of the statement is:
1565
1596
*
1566
- *COMMENT ON [ [ DATABASE | DOMAIN | INDEX |RULE | SEQUENCE | TABLE | TYPE | VIEW ]
1597
+ *COMMENT ON [ [ DATABASE | DOMAIN | INDEX | SEQUENCE | TABLE | TYPE | VIEW ]
1567
1598
* <objname> | AGGREGATE <aggname> (<aggtype>) | FUNCTION
1568
1599
*<funcname> (arg1, arg2, ...) | OPERATOR <op>
1569
1600
*(leftoperand_typ rightoperand_typ) | TRIGGER <triggername> ON
1570
- *<relname> ] IS 'text'
1601
+ *<relname>| RULE <rulename> ON <relname> ] IS 'text'
1571
1602
*
1572
1603
*****************************************************************************/
1573
1604
CommentStmt :COMMENT ON comment_type name IS comment_text
@@ -1584,11 +1615,14 @@ CommentStmt: COMMENT ON comment_type name IS comment_text
1584
1615
{$$ = cat_str(6 , make_str(" comment on operator" ),$4 , make_str(" (" ),$6 , make_str(" ) is" ),$9 ); }
1585
1616
| COMMENT ON TRIGGER name ON qualified_name IS comment_text
1586
1617
{$$ = cat_str(6 , make_str(" comment on trigger" ),$4 , make_str(" on" ),$6 , make_str(" is" ),$8 ); }
1618
+ | COMMENT ON RULE name ON any_name IS comment_text
1619
+ {$$ = cat_str(6 , make_str(" comment on rule" ),$4 , make_str(" on" ),$6 , make_str(" is" ),$8 ); }
1620
+ | COMMENT ON RULE name IS comment_text
1621
+ {$$ = cat_str(4 , make_str(" comment on rule" ),$4 , make_str(" is" ),$6 ); }
1587
1622
;
1588
1623
1589
1624
comment_type :DATABASE {$$ = make_str(" database" ); }
1590
1625
| INDEX {$$ = make_str(" idnex" ); }
1591
- | RULE {$$ = make_str(" rule" ); }
1592
1626
| SEQUENCE {$$ = make_str(" sequence" ); }
1593
1627
| TABLE {$$ = make_str(" table" ); }
1594
1628
| DOMAIN_P {$$ = make_str(" domain" ); }
@@ -1635,6 +1669,9 @@ privilege:SELECT{ $$ = make_str("select"); }
1635
1669
| TRIGGER {$$ = make_str(" trigger" ); }
1636
1670
| EXECUTE {$$ = make_str(" execute" ); }
1637
1671
| USAGE {$$ = make_str(" usage" ); }
1672
+ | CREATE {$$ = make_str(" create" ); }
1673
+ | TEMPORARY {$$ = make_str(" temporary" ); }
1674
+ | TEMP {$$ = make_str(" temp" ); }
1638
1675
;
1639
1676
1640
1677
privilege_target :qualified_name_list
@@ -1643,8 +1680,12 @@ privilege_target: qualified_name_list
1643
1680
{$$ = cat2_str(make_str(" table" ),$2 ); }
1644
1681
| FUNCTION function_with_argtypes_list
1645
1682
{$$ = cat2_str(make_str(" function" ),$2 ); }
1683
+ | DATABASE name_list
1684
+ {$$ = cat2_str(make_str(" database" ),$2 ); }
1646
1685
| LANGUAGE name_list
1647
1686
{$$ = cat2_str(make_str(" language" ) ,$2 ); }
1687
+ | SCHEMA name_list
1688
+ {$$ = cat2_str(make_str(" schema" ) ,$2 ); }
1648
1689
;
1649
1690
1650
1691
grantee_list :grantee
@@ -1653,9 +1694,8 @@ grantee_list: grantee
1653
1694
{$$ = cat_str(3 ,$1 , make_str(" ," ),$3 ); }
1654
1695
;
1655
1696
1656
- grantee :PUBLIC {$$ =make_str( " public " ) ; }
1697
+ grantee :ColId {$$ =$1 ; }
1657
1698
| GROUP ColId {$$ = cat2_str(make_str(" group" ),$2 ); }
1658
- | ColId {$$ =$1 ; }
1659
1699
;
1660
1700
1661
1701
opt_grant_grant_option :WITH GRANT OPTION
@@ -1724,26 +1764,8 @@ index_elem: attr_name opt_class
1724
1764
{$$ = cat2_str($1 ,$2 ); }
1725
1765
;
1726
1766
1727
- opt_class :class
1728
- {
1729
- /*
1730
- * Release 7.0 removed network_ops, timespan_ops, and
1731
- * datetime_ops, so we suppress it from being passed to
1732
- * the parser so the default *_ops is used. This can be
1733
- * removed in some later release.bjm 2000/02/07
1734
- *
1735
- * Release 7.1 removes lztext_ops, so suppress that too
1736
- * for a while. tgl 2000/07/30
1737
- */
1738
- if (strcmp($1 ," network_ops" ) !=0 &&
1739
- strcmp ($1 ," timespan_ops" ) != 0 &&
1740
- strcmp($1 ," datetime_ops" ) != 0 &&
1741
- strcmp($1 ," lztext_ops" ) != 0)
1742
- $$ = $1;
1743
- else
1744
- $$ = EMPTY;
1745
- }
1746
- | USING class {$$ = cat2_str(make_str(" using" ),$2 ); }
1767
+ opt_class :any_name {$$ =$1 ; }
1768
+ | USING any_name {$$ = cat2_str(make_str(" using" ),$2 ); }
1747
1769
| /* EMPTY*/ {$$ = EMPTY; }
1748
1770
;
1749
1771
@@ -1974,6 +1996,9 @@ opt_instead: INSTEAD{ $$ = make_str("instead"); }
1974
1996
| /* EMPTY*/ {$$ = EMPTY; }
1975
1997
;
1976
1998
1999
+ DropRuleStmt :DROP RULE name ON qualified_name
2000
+ {$$ = cat_str(4 , make_str(" drop rule" ),$3 , make_str(" on" ),$5 );}
2001
+ ;
1977
2002
1978
2003
/* ****************************************************************************
1979
2004
*
@@ -3398,7 +3423,6 @@ name:ColId{ $$ = $1; };
3398
3423
database_name :ColId {$$ =$1 ; };
3399
3424
access_method :ColId {$$ =$1 ; };
3400
3425
attr_name :ColId {$$ =$1 ; };
3401
- class :ColId {$$ =$1 ; };
3402
3426
index_name :ColId {$$ =$1 ; };
3403
3427
3404
3428
file_name :StringConst {$$ =$1 ; };
@@ -4780,6 +4804,7 @@ unreserved_keyword:
4780
4804
| AFTER {$$ = make_str(" after" ); }
4781
4805
| AGGREGATE {$$ = make_str(" aggregate" ); }
4782
4806
| ALTER {$$ = make_str(" alter" ); }
4807
+ | ASSERTION {$$ = make_str(" assertion" ); }
4783
4808
| AT {$$ = make_str(" at" ); }
4784
4809
| BACKWARD {$$ = make_str(" backward" ); }
4785
4810
| BEFORE {$$ = make_str(" before" ); }
@@ -4993,7 +5018,6 @@ func_name_keyword:
4993
5018
| NOTNULL {$$ = make_str(" notnull" ); }
4994
5019
| OUTER_P {$$ = make_str(" outer" ); }
4995
5020
| OVERLAPS {$$ = make_str(" overlaps" ); }
4996
- | PUBLIC {$$ = make_str(" public" ); }
4997
5021
| RIGHT {$$ = make_str(" right" ); }
4998
5022
| VERBOSE {$$ = make_str(" verbose" ); }
4999
5023
;