Synced parser and keyword list.
authorMichael Meskes
Sun, 20 Jun 2004 10:45:47 +0000 (10:45 +0000)
committerMichael Meskes
Sun, 20 Jun 2004 10:45:47 +0000 (10:45 +0000)
src/interfaces/ecpg/ChangeLog
src/interfaces/ecpg/preproc/keywords.c
src/interfaces/ecpg/preproc/preproc.y

index 1c3372193dd6ebe4a591668256d9b5f71a8e8c2e..f369cf89dd310761bbe6f25c44ada5ffd2e72997 100644 (file)
@@ -1810,6 +1810,10 @@ Thu Jun 17 13:50:06 CEST 2004
 
    - Added patch by ISHIDA Akio to allow indicators in execute
      statements.
+     
+Sun Jun 20 12:44:01 CEST 2004
+
+   - Synced parser and keyword list.
    - Set pgtypes library version to 1.2.
    - Set ecpg version to 3.2.0.
    - Set compat library version to 1.2.
index 8011ffe4aac652f06c738154a19dbfb44e4261be..67525830c4c4ced39283ed38d91c9a3202bfa65a 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/keywords.c,v 1.62 2004/04/29 14:08:10 meskes Exp $
+ *   $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/keywords.c,v 1.63 2004/06/20 10:45:47 meskes Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -292,6 +292,7 @@ static ScanKeyword ScanKeywords[] = {
    {"substring", SUBSTRING},
    {"sysid", SYSID},
    {"table", TABLE},
+   {"tablespace", TABLESPACE},
    {"temp", TEMP},
    {"template", TEMPLATE},
    {"temporary", TEMPORARY},
index 7f03deb0580b4c9e9cacebb8ee761a43aaad5a45..d02a3d0976205b8bec45c5fc99f729bd8b415a4c 100644 (file)
@@ -1,4 +1,4 @@
-/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/preproc.y,v 1.287 2004/06/17 11:52:25 meskes Exp $ */
+/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/preproc.y,v 1.288 2004/06/20 10:45:47 meskes Exp $ */
 
 /* Copyright comment */
 %{
@@ -382,7 +382,7 @@ add_additional_variables(char *name, bool insert)
         STABLE START STATEMENT STATISTICS STDIN STDOUT STORAGE STRICT_P
         SUBSTRING SYSID
 
-        TABLE TEMP TEMPLATE TEMPORARY THEN TIME TIMESTAMP TO TOAST
+        TABLE TABLESPACE TEMP TEMPLATE TEMPORARY THEN TIME TIMESTAMP TO TOAST
         TRAILING TRANSACTION TREAT TRIGGER TRIM TRUE_P TRUNCATE TRUSTED TYPE_P
         UNCOMMITTED UNENCRYPTED UNION UNIQUE UNKNOWN UNLISTEN UNTIL UPDATE USAGE
         USER USING
@@ -451,7 +451,7 @@ add_additional_variables(char *name, bool insert)
 %type     Typename SimpleTypename Numeric opt_float opt_numeric
 %type     opt_decimal Character character opt_varying opt_charset
 %type     opt_timezone opt_interval table_ref fetch_direction
-%type     row_descriptor ConstDatetime AlterDomainStmt AlterSeqStmt
+%type     ConstDatetime AlterDomainStmt AlterSeqStmt
 %type     SelectStmt into_clause OptTemp ConstraintAttributeSpec
 %type     opt_table opt_all sort_clause sortby_list ConstraintAttr
 %type     sortby qualified_name_list name_list ColId_or_Sconst
@@ -471,13 +471,13 @@ add_additional_variables(char *name, bool insert)
 %type     def_elem def_list definition DefineStmt select_with_parens
 %type     opt_instead event RuleActionList opt_using CreateAssertStmt
 %type     RuleActionStmtOrEmpty RuleActionMulti func_as reindex_type
-%type     RuleStmt opt_column oper_argtypes NumConst
+%type     RuleStmt opt_column oper_argtypes NumConst var_name
 %type     MathOp RemoveFuncStmt aggr_argtype for_update_clause
 %type     RemoveAggrStmt opt_procedural select_no_parens CreateCastStmt
 %type     RemoveOperStmt RenameStmt all_Op opt_Trusted opt_lancompiler
 %type     VariableSetStmt var_value zone_value VariableShowStmt
 %type     VariableResetStmt AlterTableStmt from_list overlay_list
-%type     user_list OptUserList OptUserElem relation_name
+%type     user_list OptUserList OptUserElem relation_name OptTableSpace
 %type     CreateUserStmt AlterUserStmt CreateSeqStmt OptSeqList
 %type     OptSeqElem TriggerForSpec TriggerForOpt TriggerForType
 %type     DropTrigStmt TriggerOneEvent TriggerEvents RuleActionStmt
@@ -506,13 +506,13 @@ add_additional_variables(char *name, bool insert)
 %type     select_limit opt_for_update_clause CheckPointStmt
 %type     OptSchemaName OptSchemaEltList schema_stmt opt_drop_behavior
 %type     handler_name any_name_list any_name opt_as insert_column_list
-%type     columnref dotted_name function_name insert_target_el
+%type     columnref function_name insert_target_el
 %type     insert_target_list insert_column_item DropRuleStmt
 %type     createfunc_opt_item set_rest var_list_or_default
 %type     CreateFunctionStmt createfunc_opt_list func_table
 %type     DropUserStmt copy_from copy_opt_list copy_opt_item
 %type     opt_oids TableLikeClause key_action opt_definition
-%type     cast_context row r_expr qual_Op qual_all_Op opt_default
+%type     cast_context row qual_Op qual_all_Op opt_default
 %type     CreateConversionStmt any_operator opclass_item_list
 %type     iso_level type_list CharacterWithLength ConstCharacter
 %type     CharacterWithoutLength BitWithLength BitWithoutLength
@@ -542,7 +542,8 @@ add_additional_variables(char *name, bool insert)
 %type     inf_val_list inf_col_list using_descriptor into_descriptor 
 %type     ecpg_into_using prepared_name struct_union_type_with_symbol
 %type     ECPGunreserved ECPGunreserved_interval cvariable
-%type     AlterDatabaseOwnerStmt
+%type     AlterDbOwnerStmt OptTableSpaceOwner CreateTableSpaceStmt
+%type     DropTableSpaceStmt indirection indirection_el
 
 %type   s_struct_union_symbol
 
@@ -593,7 +594,7 @@ opt_at: AT connection_target
        };
 
 stmt:  AlterDatabaseSetStmt        { output_statement($1, 0, connection); }
-       | AlterDatabaseOwnerStmt    { output_statement($1, 0, connection); }
+       | AlterDbOwnerStmt  { output_statement($1, 0, connection); }
        | AlterDomainStmt   { output_statement($1, 0, connection); }
        | AlterGroupStmt    { output_statement($1, 0, connection); }
        | AlterSeqStmt      { output_statement($1, 0, connection); }
@@ -641,6 +642,7 @@ stmt:  AlterDatabaseSetStmt     { output_statement($1, 0, connection); }
        | CreateSeqStmt     { output_statement($1, 0, connection); }
        | CreateStmt        { output_statement($1, 0, connection); }
        | CreateTrigStmt    { output_statement($1, 0, connection); }
+       | CreateTableSpaceStmt  { output_statement($1, 0, connection); }
        | CreateUserStmt    { output_statement($1, 0, connection); }
        | CreatedbStmt      { output_statement($1, 0, connection); }
        /*| DeallocateStmt  { output_statement($1, 0, connection); }*/
@@ -654,6 +656,7 @@ stmt:  AlterDatabaseSetStmt     { output_statement($1, 0, connection); }
        | DropPLangStmt     { output_statement($1, 0, connection); }
        | DropRuleStmt      { output_statement($1, 0, connection); }
        | DropStmt      { output_statement($1, 0, connection); }
+       | DropTableSpaceStmt    { output_statement($1, 0, connection); }
        | DropTrigStmt      { output_statement($1, 0, connection); }
        | DropUserStmt      { output_statement($1, 0, connection); }
        | DropdbStmt        { output_statement($1, 0, connection); }
@@ -969,10 +972,10 @@ DropGroupStmt: DROP GROUP_P UserId
  *
  *****************************************************************************/
 
-CreateSchemaStmt:  CREATE SCHEMA UserId OptSchemaName AUTHORIZATION UserId OptSchemaEltList
-           { $$ = cat_str(6, make_str("create schema"), $3, $4, make_str("authorization"), $6, $7); }
-       | CREATE SCHEMA ColId OptSchemaEltList
-           { $$ = cat_str(3, make_str("create schema"), $3, $4); }
+CreateSchemaStmt:  CREATE SCHEMA OptSchemaName AUTHORIZATION UserId OptTableSpace OptSchemaEltList
+           { $$ = cat_str(6, make_str("create schema"), $3, make_str("authorization"), $5, $6, $7); }
+       | CREATE SCHEMA ColId OptTableSpace OptSchemaEltList
+           { $$ = cat_str(4, make_str("create schema"), $3, $4, $5); }
        ;
 
 OptSchemaName: ColId       { $$ = $1; }
@@ -1013,9 +1016,9 @@ VariableSetStmt:  SET set_rest
            { $$ = cat2_str(make_str("set session"), $3 ); }
        ;
 
-set_rest:  ColId TO var_list_or_default
+set_rest:  var_name TO var_list_or_default
            { $$ = cat_str(3, $1, make_str("to"), $3); }
-       | ColId "=" var_list_or_default
+       | var_name "=" var_list_or_default
                         { $$ = cat_str(3, $1, make_str("="), $3); }
        | TIME ZONE zone_value
            { $$ = cat2_str(make_str("time zone"), $3); }
@@ -1031,6 +1034,11 @@ set_rest:    ColId TO var_list_or_default
            { $$ = make_str("session authorization default"); }
        ;
 
+var_name:  ColId           { $$ = $1; }
+       | var_name '.' ColId    { $$ = cat_str(3, $1, make_str("."), $3); }
+       ;
+       
+
 var_list_or_default:  var_list
            { $$ = $1; }
        | DEFAULT
@@ -1192,6 +1200,9 @@ alter_table_cmd:
 /* ALTER TABLE  CLUSTER ON  */
        | CLUSTER ON name
            { $$ = cat_str(2, make_str("cluster on"), $3); }
+/* ALTER TABLE  SET WITHOUT CLUSTER */
+       | SET WITHOUT CLUSTER
+           { $$ = make_str("set without cluster"); }
        ;
 
 alter_column_default:
@@ -1300,11 +1311,11 @@ opt_using:  USING       { $$ = make_str("using"); }
  *****************************************************************************/
 
 CreateStmt:  CREATE OptTemp TABLE qualified_name '(' OptTableElementList ')'
-               OptInherit OptWithOids OnCommitOption
-           { $$ = cat_str(10, make_str("create"), $2, make_str("table"), $4, make_str("("), $6, make_str(")"), $8, $9, $10); }
+               OptInherit OptWithOids OnCommitOption OptTableSpace
+           { $$ = cat_str(11, make_str("create"), $2, make_str("table"), $4, make_str("("), $6, make_str(")"), $8, $9, $10, $11); }
        | CREATE OptTemp TABLE qualified_name OF qualified_name
-           '(' OptTableElementList ')' OptWithOids OnCommitOption
-           { $$ = cat_str(11, make_str("create"), $2, make_str("table"), $4, make_str("of"), $6, make_str("("), $8, make_str(")"), $10, $11); }
+           '(' OptTableElementList ')' OptWithOids OnCommitOption OptTableSpace
+           { $$ = cat_str(12, make_str("create"), $2, make_str("table"), $4, make_str("of"), $6, make_str("("), $8, make_str(")"), $10, $11, $12); }
        ;
 
 /*
@@ -1494,6 +1505,9 @@ OnCommitOption:   ON COMMIT DROP      { $$ = make_str("on commit drop"); }
        | /*EMPTY*/         { $$ = EMPTY; }
        ;
 
+OptTableSpace:  TABLESPACE name    { $$ = cat2_str(make_str("tablespace"), $2); }
+       | /*EMPTY*/ { $$ = EMPTY; }
+       ;
 
 /*
  * Note: CREATE TABLE ... AS SELECT ... is just another spelling for
@@ -1547,8 +1561,8 @@ CreateAsElement:  ColId { $$ = $1; }
  *
  *****************************************************************************/
 
-CreateSeqStmt: CREATE OptTemp SEQUENCE qualified_name OptSeqList
-           { $$ = cat_str(4, make_str("create"), $2, make_str("sequence"), $4, $5); }
+CreateSeqStmt: CREATE OptTemp SEQUENCE qualified_name OptSeqList OptTableSpace
+           { $$ = cat_str(5, make_str("create"), $2, make_str("sequence"), $4, $5, $6); }
        ;
 
 AlterSeqStmt: ALTER SEQUENCE qualified_name OptSeqList
@@ -1604,12 +1618,10 @@ opt_Trusted:    TRUSTED { $$ = make_str("trusted"); }
 
 /* This ought to be just func_name, but that causes reduce/reduce conflicts
  * (CREATE LANGUAGE is the only place where func_name isn't followed by '(').
- * Work around by using name and dotted_name separately.
+ * Work around by using simple names instead.
  */
-handler_name: name
-                               { $$ = $1; }
-   | dotted_name
-                               { $$ = $1; /* XXX changing soon */ }
+handler_name: name { $$ = $1; }
+   | name attrs    { $$ = cat2_str($1, $2); }
                ;
 
 opt_lancompiler: LANCOMPILER StringConst
@@ -1626,6 +1638,35 @@ opt_procedural: PROCEDURAL   { $$ = make_str("prcedural"); }
        | /*EMPTY*/         { $$ = EMPTY; }
        ;
 
+/*****************************************************************************
+ *
+ *             QUERY:
+ *             CREATE TABLESPACE tablespace LOCATION '/path/to/tablespace/'
+ *
+ *****************************************************************************/
+
+CreateTableSpaceStmt: CREATE TABLESPACE name OptTableSpaceOwner LOCATION Sconst
+           { $$ = cat_str(5,make_str("create tablespace"), $3, $4, make_str("location"), $6); }
+       ;
+
+OptTableSpaceOwner: OWNER name { $$ = cat2_str(make_str("owner"), $2); }
+       | /*EMPTY*/     { $$ = EMPTY; }
+       ;
+
+/*****************************************************************************
+ *
+ *             QUERY :
+ *                             DROP TABLESPACE 
+ *
+ *             No need for drop behaviour as we cannot implement dependencies for
+ *             objects in other databases; we can only support RESTRICT.
+ *
+ ****************************************************************************/
+
+
+DropTableSpaceStmt: DROP TABLESPACE name   { $$ = cat2_str(make_str("drop tablespace"), $3); };
+
+
 /*****************************************************************************
  *
  *     QUERIES :
@@ -1851,11 +1892,18 @@ any_name_list:  any_name
                        { $$ = cat_str(3, $1, make_str(","), $3); }
                ;
 
-any_name: ColId
-                       { $$ = $1; }
-               | dotted_name
-                       { $$ = $1; }
-                ;
+any_name: ColId        { $$ = $1; }
+   | ColId attrs  { $$ = cat2_str($1, $2); }
+        ;
+
+/*
+ * The slightly convoluted way of writing this production avoids reduce/reduce
+ * errors against indirection_el.
+ */
+attrs: '.' attr_name       { $$ = cat2_str(make_str("."), $2); }
+   | '.' attr_name attrs   { $$ = cat_str(3, make_str("."), $2, $3); }
+   ;
+
 /*****************************************************************************
  *
  *            QUERY:
@@ -2041,6 +2089,8 @@ privilege_target: qualified_name_list
            { $$ = cat2_str(make_str("language") , $2); }
        | SCHEMA name_list
            { $$ = cat2_str(make_str("schema") , $2); }
+       | TABLESPACE name_list
+           { $$ = cat2_str(make_str("tablespace") , $2); }
        ;
 
 grantee_list: grantee
@@ -2082,13 +2132,13 @@ function_with_argtypes: func_name func_args { $$ = cat2_str($1, $2); };
  *     QUERY:
  *             create index  on 
  *               [ using  ] "(" (  | using  ] )+ ")"
- *               [ where  ]
+ *               [ tablespace  ] [ where  ]
  *
  *****************************************************************************/
 
 IndexStmt: CREATE index_opt_unique INDEX index_name ON qualified_name
-               access_method_clause '(' index_params ')' where_clause
-           { $$ = cat_str(11, make_str("create"), $2, make_str("index"), $4, make_str("on"), $6, $7, make_str("("), $9, make_str(")"), $11); }
+               access_method_clause '(' index_params ')' OptTableSpace where_clause
+           { $$ = cat_str(12, make_str("create"), $2, make_str("index"), $4, make_str("on"), $6, $7, make_str("("), $9, make_str(")"), $11, $12); }
        ;
 
 index_opt_unique:  UNIQUE  { $$ = make_str("unique"); }
@@ -2505,7 +2555,11 @@ createdb_opt_list:   createdb_opt_item
            { $$ = cat2_str($1, $2); }
        ;
 
-createdb_opt_item: LOCATION opt_equal StringConst
+createdb_opt_item: TABLESPACE opt_equal name
+           { $$ = cat_str(3,make_str("tablespace"), $2, $3); }
+       | TABLESPACE opt_equal DEFAULT
+           { $$ = cat_str(3, make_str("tablespace"), $2, make_str("default")); }
+       | LOCATION opt_equal StringConst
            { $$ = cat_str(3,make_str("location"), $2, $3); }
        | LOCATION opt_equal DEFAULT
            { $$ = cat_str(3, make_str("location"), $2, make_str("default")); }
@@ -2535,7 +2589,7 @@ opt_equal: '='                    { $$ = make_str("="); }
  *
  *****************************************************************************/
 
-AlterDatabaseOwnerStmt: ALTER DATABASE database_name OWNER TO UserId
+AlterDbOwnerStmt: ALTER DATABASE database_name OWNER TO UserId
                { $$ = cat_str(4, make_str("alter database"), $3, make_str("owner to"), $6); }
 AlterDatabaseSetStmt: ALTER DATABASE database_name SET set_rest
            { $$ = cat_str(4, make_str("alter database"), $3, make_str("set"), $5); }
@@ -3413,80 +3467,6 @@ opt_interval:  YEAR_P            { $$ = make_str("year"); }
  * expression grammar
  *
  *****************************************************************************/
-
-/* Expressions using row descriptors
- * Define row_descriptor to allow yacc to break the reduce/reduce conflict
- * with singleton expressions.
- */
-r_expr: row IN_P select_with_parens
-           { $$ = cat_str(3, $1, make_str("in"), $3); }
-       | row NOT IN_P select_with_parens
-           { $$ = cat_str(3, $1, make_str("not in"), $4); }
-       | row subquery_Op sub_type select_with_parens %prec Op
-           { $$ = cat_str(4, $1, $2, $3, $4); }
-       | row subquery_Op select_with_parens %prec Op
-           { $$ = cat_str(3, $1, $2, $3); }
-       | row subquery_Op row %prec Op
-           { $$ = cat_str(3, $1, $2, $3); }
-       | row IS NULL_P
-           { $$ = cat2_str($1, make_str("is null")); }
-       | row IS NOT NULL_P
-               { $$ = cat2_str($1, make_str("is not null")); }
-       | row OVERLAPS row
-           { $$ = cat_str(3, $1, make_str("overlaps"), $3); }
-       | row IS DISTINCT FROM row %prec IS
-               { $$ = cat_str(3, $1, make_str("is distinct from"), $5); }
-       ;
-
-row: ROW '(' row_descriptor ')'
-       { $$ = cat_str(3, make_str("row ("), $3, make_str(")")); }
-   | ROW '(' a_expr ')'
-           { $$ = cat_str(3, make_str("row ("), $3, make_str(")")); }
-   | ROW '(' ')'
-       { $$ = make_str("row()"); }
-   | '(' row_descriptor ')'
-                { $$ = cat_str(3, make_str("("), $2, make_str(")")); }
-   ;
-
-row_descriptor:  expr_list ',' a_expr
-           { $$ = cat_str(3, $1, make_str(","), $3); }
-       ;
-
-sub_type:  ANY                 { $$ = make_str("ANY"); }
-       | SOME                  { $$ = make_str("SOME"); }
-       | ALL                   { $$ = make_str("ALL"); }
-             ;
-
-all_Op:  Op                { $$ = $1; }
-   | MathOp            { $$ = $1; }
-   ;
-
-MathOp: '+'                { $$ = make_str("+"); }
-       | '-'           { $$ = make_str("-"); }
-       | '*'           { $$ = make_str("*"); }
-       | '%'           { $$ = make_str("%"); }
-       | '^'           { $$ = make_str("^"); }
-       | '/'           { $$ = make_str("/"); }
-       | '<'           { $$ = make_str("<"); }
-       | '>'           { $$ = make_str(">"); }
-       | '='           { $$ = make_str("="); }
-       ;
-
-qual_Op:  Op               { $$ = $1; }
-       | OPERATOR '(' any_operator ')' { $$ = cat_str(3, make_str("operator ("), $3, make_str(")")); }
-       ;
-
-qual_all_Op:  all_Op               { $$ = $1; }
-       | OPERATOR '(' any_operator ')' { $$ = cat_str(3, make_str("operator ("), $3, make_str(")")); }
-       ;
-
-subquery_Op:  all_Op               { $$ = $1; }
-       | OPERATOR '(' any_operator ')' { $$ = cat_str(3, make_str("operator ("), $3, make_str(")")); }
-       | LIKE              { $$ = make_str("like"); }
-       | NOT LIKE          { $$ = make_str("not like"); }
-       | ILIKE             { $$ = make_str("ilike"); }
-       | NOT ILIKE             { $$ = make_str("not ilike"); }
-       ;
        
 /* General expressions
  * This is the heart of the expression syntax.
@@ -3634,8 +3614,6 @@ a_expr:  c_expr
            { $$ = cat_str(6, $1, $2, $3, make_str("("), $5, make_str(")")); }
        | UNIQUE select_with_parens %prec Op
            { $$ = cat2_str(make_str("unique"), $2); }
-       | r_expr
-           { $$ = $1; }
        ;
 
 /* Restricted expressions
@@ -3704,10 +3682,8 @@ c_expr: columnref
            { $$ = $1;  }
        | AexprConst
            { $$ = $1;  }
-       | PARAM attrs opt_indirection
-           { $$ = cat_str(3, make_str("param"), $2, $3); }
-       | '(' a_expr ')' attrs opt_indirection
-           { $$ = cat_str(5, make_str("("), $2, make_str(")"), $4, $5); }
+       | PARAM opt_indirection
+           { $$ = cat2_str(make_str("param"), $2); }
        | '(' a_expr ')' opt_indirection
            { $$ = cat_str(4, make_str("("), $2, make_str(")"), $4); }
        | case_expr
@@ -3771,17 +3747,52 @@ c_expr: columnref
            { $$ = cat2_str(make_str("array"), $2); }
        | ARRAY array_expr
            { $$ = cat2_str(make_str("array"), $2); }
+       | row
+           { $$ = $1; }
        ;
-/*
- * This used to use ecpg_expr, but since there is no shift/reduce conflict
- * anymore, we can remove ecpg_expr. - MM
- */
-opt_indirection:  '[' a_expr ']' opt_indirection
-           { $$ = cat_str(4, make_str("["), $2, make_str("]"), $4); }
-       | '[' a_expr ':' a_expr ']' opt_indirection
-           { $$ = cat_str(6, make_str("["), $2, make_str(":"), $4, make_str("]"), $6); }
-       | /* EMPTY */
-           { $$ = EMPTY; }
+
+row: ROW '(' expr_list ')'
+       { $$ = cat_str(3, make_str("row ("), $3, make_str(")")); }
+   | ROW '(' ')'
+       { $$ = make_str("row()"); }
+   | '(' expr_list ',' a_expr ')'
+                { $$ = cat_str(5, make_str("("), $2, make_str(","), $4, make_str(")")); }
+   ;
+
+sub_type:  ANY     { $$ = make_str("ANY"); }
+   | SOME      { $$ = make_str("SOME"); }
+   | ALL       { $$ = make_str("ALL"); }
+   ;
+
+all_Op:  Op                { $$ = $1; }
+   | MathOp            { $$ = $1; }
+   ;
+
+MathOp: '+'                { $$ = make_str("+"); }
+       | '-'           { $$ = make_str("-"); }
+       | '*'           { $$ = make_str("*"); }
+       | '%'           { $$ = make_str("%"); }
+       | '^'           { $$ = make_str("^"); }
+       | '/'           { $$ = make_str("/"); }
+       | '<'           { $$ = make_str("<"); }
+       | '>'           { $$ = make_str(">"); }
+       | '='           { $$ = make_str("="); }
+       ;
+
+qual_Op:  Op               { $$ = $1; }
+       | OPERATOR '(' any_operator ')' { $$ = cat_str(3, make_str("operator ("), $3, make_str(")")); }
+       ;
+
+qual_all_Op:  all_Op               { $$ = $1; }
+       | OPERATOR '(' any_operator ')' { $$ = cat_str(3, make_str("operator ("), $3, make_str(")")); }
+       ;
+
+subquery_Op:  all_Op               { $$ = $1; }
+       | OPERATOR '(' any_operator ')' { $$ = cat_str(3, make_str("operator ("), $3, make_str(")")); }
+       | LIKE              { $$ = make_str("like"); }
+       | NOT LIKE          { $$ = make_str("not like"); }
+       | ILIKE             { $$ = make_str("ilike"); }
+       | NOT ILIKE             { $$ = make_str("not ilike"); }
        ;
 
 expr_list: a_expr
@@ -3918,27 +3929,29 @@ case_default:  ELSE a_expr
        ;
 
 case_arg:  a_expr          { $$ = $1; }
-       | /*EMPTY*/         { $$ = EMPTY; }
+       | /*EMPTY*/     { $$ = EMPTY; }
        ;
 
-columnref: relation_name opt_indirection
-       { $$ = cat2_str($1, $2); }
-   | dotted_name opt_indirection
-       { $$ = cat2_str($1, $2); }
+columnref: relation_name       { $$ = $1; }
+   | relation_name indirection { $$ = cat2_str($1, $2); }
    ;
 
-dotted_name: relation_name attrs
-           { $$ = cat2_str($1, $2); }
-       ;
+indirection_el:
+   '.' attr_name           { $$ = cat2_str(make_str("."), $2); }
+   | '.' '*'           { $$ = make_str(".*"); }
+   | '[' a_expr ']'        { $$ = cat_str(3, make_str("["), $2, make_str("]")); }
+   | '[' a_expr ':' a_expr ']' { $$ = cat_str(5, make_str("["), $2, make_str(":"), $4, make_str("]")); }
+   ;
 
-attrs: '.' attr_name
-           { $$ = cat2_str(make_str("."), $2); }
-       | '.' '*'
-           { $$ = make_str(".*"); }
-       | '.' attr_name attrs
-           { $$ = cat_str(3, make_str("."), $2, $3); }
-       ;
+indirection:   indirection_el      { $$ = $1; }
+   | indirection indirection_el    { $$ = cat2_str($1, $2); }
+   ;
 
+opt_indirection:
+   /*EMPTY*/               { $$ = EMPTY; }
+   | opt_indirection indirection_el    { $$ = cat2_str($1, $2);} 
+   ;
+   
 opt_empty_parentheses: '(' ')' { $$ = make_str("()"); }
        | /*EMPTY*/             { $$ = EMPTY; }
        ;
@@ -3946,11 +3959,10 @@ opt_empty_parentheses: '(' ')'  { $$ = make_str("()"); }
 
 /*****************************************************************************
  *
- * target lists
+ * target lists for SELECT, UPDATE, INSERT
  *
  *****************************************************************************/
 
-/* Target lists as found in SELECT ... and INSERT VALUES ( ... ) */
 target_list:  target_list ',' target_el
            { $$ = cat_str(3, $1, make_str(","), $3);  }
        | target_el
@@ -4047,8 +4059,8 @@ insert_target_list:  insert_target_list ',' insert_target_el
                {   $$ = $1;  }
        ;
 
-insert_target_el:  target_el   {   $$ = $1;  }
-       | DEFAULT   {   $$ = make_str("default"); }
+insert_target_el:  a_expr  { $$ = $1;  }
+       | DEFAULT   { $$ = make_str("default"); }
        ;
 
 
@@ -4070,8 +4082,8 @@ qualified_name_list:  qualified_name
 
 qualified_name: relation_name
        { $$ = $1; }
-       | dotted_name
-       { $$ = $1; }
+       | relation_name attrs
+       { $$ = cat2_str($1, $2); }
        ;
 
 name_list:  name
@@ -4089,18 +4101,10 @@ index_name:             ColId           { $$ = $1; };
 
 file_name:             StringConst     { $$ = $1; };
 
-/* func_name will soon return a List ... but not yet */
-/*
-func_name: function_name
-           { $$ = list_make1(makeString($1)); }
-       | dotted_name
-           { $$ = $1; }
-       ;
-*/
 func_name: function_name
            { $$ = $1; }
-       | dotted_name
-           { $$ = $1; }
+       | relation_name indirection
+           { $$ = cat2_str($1, $2); }
        ;
 
 
@@ -4115,8 +4119,6 @@ AexprConst:  PosAllConst
            { $$ = cat_str(3, $1, $2, $3); }
        | ConstInterval  '(' PosIntConst ')' StringConst opt_interval
            { $$ = cat_str(6, $1, make_str("("), $3, make_str(")"), $5, $6); }
-       | PARAM opt_indirection
-           { $$ = cat2_str(make_str("param"), $2); }
        | TRUE_P
            { $$ = make_str("true"); }
        | FALSE_P
@@ -5898,6 +5900,7 @@ ECPGunreserved:     ABORT_P           { $$ = make_str("abort"); }
        | STORAGE           { $$ = make_str("storage"); }
        | STRICT_P          { $$ = make_str("strict"); }
        | SYSID             { $$ = make_str("sysid"); }
+       | TABLESPACE            { $$ = make_str("tablespace"); }
        | TEMP              { $$ = make_str("temp"); }
        | TEMPLATE          { $$ = make_str("template"); }
        | TEMPORARY         { $$ = make_str("temporary"); }