diff --git a/src/interfaces/ecpg/ChangeLog b/src/interfaces/ecpg/ChangeLog
index 1c3372193dd6ebe4a591668256d9b5f71a8e8c2e..f369cf89dd310761bbe6f25c44ada5ffd2e72997 100644
--- a/src/interfaces/ecpg/ChangeLog
+++ b/src/interfaces/ecpg/ChangeLog
@@ -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.
diff --git a/src/interfaces/ecpg/preproc/keywords.c b/src/interfaces/ecpg/preproc/keywords.c
index 8011ffe4aac652f06c738154a19dbfb44e4261be..67525830c4c4ced39283ed38d91c9a3202bfa65a 100644
--- a/src/interfaces/ecpg/preproc/keywords.c
+++ b/src/interfaces/ecpg/preproc/keywords.c
@@ -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},
diff --git a/src/interfaces/ecpg/preproc/preproc.y b/src/interfaces/ecpg/preproc/preproc.y
index 7f03deb0580b4c9e9cacebb8ee761a43aaad5a45..d02a3d0976205b8bec45c5fc99f729bd8b415a4c 100644
--- a/src/interfaces/ecpg/preproc/preproc.y
+++ b/src/interfaces/ecpg/preproc/preproc.y
@@ -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  <str>	Typename SimpleTypename Numeric opt_float opt_numeric
 %type  <str>	opt_decimal Character character opt_varying opt_charset
 %type  <str>	opt_timezone opt_interval table_ref fetch_direction
-%type  <str>	row_descriptor ConstDatetime AlterDomainStmt AlterSeqStmt
+%type  <str>	ConstDatetime AlterDomainStmt AlterSeqStmt
 %type  <str>	SelectStmt into_clause OptTemp ConstraintAttributeSpec
 %type  <str>	opt_table opt_all sort_clause sortby_list ConstraintAttr
 %type  <str>	sortby qualified_name_list name_list ColId_or_Sconst
@@ -471,13 +471,13 @@ add_additional_variables(char *name, bool insert)
 %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
+%type  <str>	RuleStmt opt_column oper_argtypes NumConst var_name
 %type  <str>	MathOp RemoveFuncStmt aggr_argtype for_update_clause
 %type  <str>	RemoveAggrStmt opt_procedural select_no_parens CreateCastStmt
 %type  <str>	RemoveOperStmt RenameStmt all_Op opt_Trusted opt_lancompiler
 %type  <str>	VariableSetStmt var_value zone_value VariableShowStmt
 %type  <str>	VariableResetStmt AlterTableStmt from_list overlay_list
-%type  <str>	user_list OptUserList OptUserElem relation_name
+%type  <str>	user_list OptUserList OptUserElem relation_name OptTableSpace
 %type  <str>	CreateUserStmt AlterUserStmt CreateSeqStmt OptSeqList
 %type  <str>	OptSeqElem TriggerForSpec TriggerForOpt TriggerForType
 %type  <str>	DropTrigStmt TriggerOneEvent TriggerEvents RuleActionStmt
@@ -506,13 +506,13 @@ add_additional_variables(char *name, bool insert)
 %type  <str>	select_limit opt_for_update_clause CheckPointStmt
 %type  <str>	OptSchemaName OptSchemaEltList schema_stmt opt_drop_behavior
 %type  <str>	handler_name any_name_list any_name opt_as insert_column_list
-%type  <str>	columnref dotted_name function_name insert_target_el
+%type  <str>	columnref function_name insert_target_el
 %type  <str>	insert_target_list insert_column_item DropRuleStmt
 %type  <str>	createfunc_opt_item set_rest var_list_or_default
 %type  <str>	CreateFunctionStmt createfunc_opt_list func_table
 %type  <str>	DropUserStmt copy_from copy_opt_list copy_opt_item
 %type  <str>	opt_oids TableLikeClause key_action opt_definition
-%type  <str>	cast_context row r_expr qual_Op qual_all_Op opt_default
+%type  <str>	cast_context row qual_Op qual_all_Op opt_default
 %type  <str>	CreateConversionStmt any_operator opclass_item_list
 %type  <str>	iso_level type_list CharacterWithLength ConstCharacter
 %type  <str>	CharacterWithoutLength BitWithLength BitWithoutLength
@@ -542,7 +542,8 @@ add_additional_variables(char *name, bool insert)
 %type  <str>	inf_val_list inf_col_list using_descriptor into_descriptor 
 %type  <str>	ecpg_into_using prepared_name struct_union_type_with_symbol
 %type  <str>	ECPGunreserved ECPGunreserved_interval cvariable
-%type  <str>	AlterDatabaseOwnerStmt
+%type  <str>	AlterDbOwnerStmt OptTableSpaceOwner CreateTableSpaceStmt
+%type  <str>	DropTableSpaceStmt indirection indirection_el
 
 %type  <struct_union> 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 <name> CLUSTER ON <indexname> */
 		| CLUSTER ON name
 			{ $$ = cat_str(2, make_str("cluster on"), $3); }
+/* ALTER TABLE <name> 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 <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 <indexname> on <relname>
  *				  [ using <access> ] "(" ( <col> | using <opclass> ] )+ ")"
- *				  [ where <predicate> ]
+ *				  [ tablespace <tablespacename> ] [ where <predicate> ]
  *
  *****************************************************************************/
 
 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"); }