diff --git a/src/interfaces/ecpg/ChangeLog b/src/interfaces/ecpg/ChangeLog
index d3246ddff0cc2312978a10ad82a9787b85f4c2d6..bc591ecd74d84b59bc044de5c07d8127614e8e39 100644
--- a/src/interfaces/ecpg/ChangeLog
+++ b/src/interfaces/ecpg/ChangeLog
@@ -1237,6 +1237,11 @@ Sun Apr 14 10:53:14 CEST 2002
 	- Fixed one bug in structure handling resulting in using sizeof
 	  indicator instead of variable.
 	- Synced preproc.y with gram.y.
+
+Mon Apr 22 20:44:56 CEST 2002
+	
+	- Synced preproc.y with gram.y.
+	- Synced keywords.c.
 	- Set ecpg version to 2.10.0.
 	- Set library version to 3.4.0.
 
diff --git a/src/interfaces/ecpg/preproc/keywords.c b/src/interfaces/ecpg/preproc/keywords.c
index d3b0e90ffb5268fab8b59d7c2b3d6196e2de92d4..b7613c3f0a79edfd990c9ad1d9fda966cfd386bf 100644
--- a/src/interfaces/ecpg/preproc/keywords.c
+++ b/src/interfaces/ecpg/preproc/keywords.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/keywords.c,v 1.46 2001/10/15 00:06:04 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/keywords.c,v 1.47 2002/04/22 18:54:43 meskes Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -43,6 +43,7 @@ static ScanKeyword ScanKeywords[] = {
 	{"any", ANY},
 	{"as", AS},
 	{"asc", ASC},
+	{"assertion", ASSERTION},
 	{"at", AT},
 	{"authorization", AUTHORIZATION},
 	{"backward", BACKWARD},
@@ -97,6 +98,7 @@ static ScanKeyword ScanKeywords[] = {
 	{"desc", DESC},
 	{"distinct", DISTINCT},
 	{"do", DO},
+	{"domain", DOMAIN_P},
 	{"double", DOUBLE},
 	{"drop", DROP},
 	{"each", EACH},
@@ -210,7 +212,6 @@ static ScanKeyword ScanKeywords[] = {
 	{"privileges", PRIVILEGES},
 	{"procedural", PROCEDURAL},
 	{"procedure", PROCEDURE},
-	{"public", PUBLIC},
 	{"read", READ},
 	{"references", REFERENCES},
 	{"reindex", REINDEX},
@@ -243,6 +244,7 @@ static ScanKeyword ScanKeywords[] = {
 	{"statistics", STATISTICS},
 	{"stdin", STDIN},
 	{"stdout", STDOUT},
+	{"storage", STORAGE},
 	{"substring", SUBSTRING},
 	{"sysid", SYSID},
 	{"table", TABLE},
@@ -269,6 +271,7 @@ static ScanKeyword ScanKeywords[] = {
 	{"unlisten", UNLISTEN},
 	{"until", UNTIL},
 	{"update", UPDATE},
+	{"usage", USAGE},
 	{"user", USER},
 	{"using", USING},
 	{"vacuum", VACUUM},
diff --git a/src/interfaces/ecpg/preproc/preproc.y b/src/interfaces/ecpg/preproc/preproc.y
index fab5614e6174906fdd1757661e131dd6d9027665..54d85a8b88dc8f38142b546574a2dbe91fabdca2 100644
--- a/src/interfaces/ecpg/preproc/preproc.y
+++ b/src/interfaces/ecpg/preproc/preproc.y
@@ -177,8 +177,8 @@ make_name(void)
 /* Keywords (in SQL92 reserved words) */
 %token	ABSOLUTE, ACTION, ADD, ALL, ALTER, AND, ANY, AS, ASC,
 		AT, AUTHORIZATION, BEGIN_TRANS, BETWEEN, BOTH, BY,
-		CASCADE, CASE, CAST, CHAIN, CHAR, CHARACTER,
-		CHARACTERISTICS, CHECK, CLOSE, COALESCE, COLLATE,
+		CASCADE, CASE, CAST, CHAR, CHARACTER,
+		CHECK, CLOSE, COALESCE, COLLATE,
 		COLUMN, COMMIT, CONSTRAINT, CONSTRAINTS, CREATE, CROSS,
 		CURRENT, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP,
 		CURRENT_USER, CURSOR, DAY_P, DEC, DECIMAL, DECLARE,
@@ -193,7 +193,7 @@ make_name(void)
 		NULL_P, NUMERIC, OF, OFF, OLD, ON, ONLY, OPTION, OR,
 		ORDER, OUT, OUTER_P, OVERLAPS, PARTIAL, PATH_P,
 		POSITION, PRECISION, PRIMARY, PRIOR, PRIVILEGES,
-		PROCEDURE, PUBLIC, READ, REFERENCES, RELATIVE, REVOKE,
+		PROCEDURE, READ, REFERENCES, RELATIVE, REVOKE,
 		RIGHT, ROLLBACK, SCHEMA, SCROLL, SECOND_P, SELECT,
 		SESSION, SESSION_USER, SET, SOME, SUBSTRING, TABLE,
 		TEMPORARY, THEN, TIME, TIMESTAMP TO, TRAILING,
@@ -202,8 +202,9 @@ make_name(void)
 		VARYING, VIEW, WHEN, WHERE, WITH, WITHOUT, WORK,
 		YEAR_P, ZONE
 
-/* Keywords (in SQL3 reserved words) */
-%token	DEFERRABLE, DEFERRED, IMMEDIATE, INITIALLY, PENDANT,
+/* Keywords (in SQL99 reserved words) */
+%token	ASSERTION, CHAIN, CHARACTERISTICS,
+		DEFERRABLE, DEFERRED, IMMEDIATE, INITIALLY, PENDANT,
 		REPLACE, RESTRICT, TRIGGER
 
 /* Keywords (in SQL92 non-reserved words) */
@@ -284,8 +285,8 @@ make_name(void)
 %type  <str>	ConstraintElem key_actions ColQualList type_name DropSchemaStmt
 %type  <str>	target_list target_el update_target_list alias_clause
 %type  <str>	update_target_el opt_id qualified_name database_name
-%type  <str>	access_method attr_name class index_name name func_name
-%type  <str>	file_name AexprConst c_expr ConstTypename
+%type  <str>	access_method attr_name index_name name func_name
+%type  <str>	file_name AexprConst c_expr ConstTypename var_list
 %type  <str>	in_expr_nodes a_expr b_expr TruncateStmt CommentStmt
 %type  <str>	opt_indirection expr_list extract_list extract_arg
 %type  <str>	position_list substr_list substr_from alter_column_default
@@ -311,7 +312,7 @@ make_name(void)
 %type  <str>	index_opt_unique IndexStmt func_return ConstInterval
 %type  <str>	func_args_list func_args opt_with ProcedureStmt def_arg
 %type  <str>	def_elem def_list definition DefineStmt select_with_parens
-%type  <str>	opt_instead event RuleActionList opt_using
+%type  <str>	opt_instead event RuleActionList opt_using CreateAssertStmt
 %type  <str>	RuleActionStmtOrEmpty RuleActionMulti func_as reindex_type
 %type  <str>	RuleStmt opt_column opt_name oper_argtypes NumConst
 %type  <str>	MathOp RemoveFuncStmt aggr_argtype for_update_clause
@@ -335,7 +336,7 @@ make_name(void)
 %type  <str>	opt_cursor ConstraintsSetStmt AllConst CreateDomainStmt
 %type  <str>	case_expr when_clause_list case_default case_arg when_clause
 %type  <str>	select_clause opt_select_limit select_limit_value
-%type  <str>	ConstraintTimeSpec AlterDatabaseSetStmt
+%type  <str>	ConstraintTimeSpec AlterDatabaseSetStmt DropAssertStmt
 %type  <str>	select_offset_value ReindexStmt join_type opt_boolean
 %type  <str>	join_qual update_list AlterSchemaStmt joined_table
 %type  <str>	opt_level opt_lock lock_type OptGroupList OptGroupElem
@@ -348,7 +349,7 @@ make_name(void)
 %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>	insert_target_list insert_column_item 
+%type  <str>	insert_target_list insert_column_item DropRuleStmt
 
 %type  <str>	ECPGWhenever ECPGConnect connection_target ECPGOpen
 %type  <str>	indicator ECPGExecute ECPGPrepare ecpg_using ecpg_into
@@ -431,6 +432,7 @@ stmt:  AlterDatabaseSetStmt { output_statement($1, 0, connection); }
 		| CreateGroupStmt	{ output_statement($1, 0, connection); }
 		| CreateSeqStmt		{ output_statement($1, 0, connection); }
 		| CreatePLangStmt	{ output_statement($1, 0, connection); }
+		| CreateAssertStmt	{ output_statement($1, 0, connection); }
 		| CreateTrigStmt	{ output_statement($1, 0, connection); }
 		| CreateUserStmt	{ output_statement($1, 0, connection); }
 		| ClusterStmt		{ output_statement($1, 0, connection); }
@@ -440,7 +442,9 @@ stmt:  AlterDatabaseSetStmt { output_statement($1, 0, connection); }
 		| TruncateStmt		{ output_statement($1, 0, connection); }
 		| DropGroupStmt		{ output_statement($1, 0, connection); }
 		| DropPLangStmt		{ output_statement($1, 0, connection); }
+		| DropAssertStmt	{ output_statement($1, 0, connection); }
 		| DropTrigStmt		{ output_statement($1, 0, connection); }
+		| DropRuleStmt		{ output_statement($1, 0, connection); }
 		| DropUserStmt		{ output_statement($1, 0, connection); }
 		| ExplainStmt		{ output_statement($1, 0, connection); }
 		| FetchStmt		{ output_statement($1, 1, connection); }
@@ -808,9 +812,9 @@ schema_stmt: CreateStmt		{ $$ = $1; }
  *
  *****************************************************************************/
 
-VariableSetStmt:  SET ColId TO var_value
+VariableSetStmt:  SET ColId TO var_list
 			{ $$ = cat_str(4, make_str("set"), $2, make_str("to"), $4); }
-		| SET ColId '=' var_value
+		| SET ColId '=' var_list
 			{ $$ = cat_str(4, make_str("set"), $2, make_str("="), $4); }
 		| SET TIME ZONE zone_value
 			{ $$ = cat2_str(make_str("set time zone"), $4); }
@@ -824,21 +828,22 @@ VariableSetStmt:  SET ColId TO var_value
 			{ $$ = cat2_str(make_str("set session authorization"), $4); }
 		;
 
+var_list:  var_value
+			{ $$ = $1; }
+		| var_list ',' var_value
+			{ $$ = cat_str(3, $1, make_str(","), $3); }
+		| DEFAULT
+			{ $$ = make_str("default"); }
+		;
+		
 opt_level:	READ COMMITTED	{ $$ = make_str("read committed"); }
 		| SERIALIZABLE		{ $$ = make_str("serializable"); }
 		;
 
 
 var_value:	opt_boolean		{ $$ = $1; }
-		| AllConst			{ $$ = $1; }
-		| name_list
-		{
-			if (strlen($1) == 0)
-			mmerror(PARSE_ERROR, ET_ERROR, "SET must have at least one argument.");
-
-			$$ = $1;
-		}
-		| DEFAULT			{ $$ = make_str("default"); }
+		| NumConst			{ $$ = $1; }
+		| ColId_or_Sconst	{ $$ = $1; }	
 		;
 
 opt_boolean:  TRUE_P		{ $$ = make_str("true"); }
@@ -848,11 +853,15 @@ opt_boolean:  TRUE_P		{ $$ = make_str("true"); }
 		;
 
 /* Timezone values can be:
-* - a string such as 'pst8pdt'
-* - an integer or floating point number
-* - a time interval per SQL99
-*/
+ * - a string such as 'pst8pdt'
+ * - a column identifier such as "pst8pdt"
+ * - an integer or floating point number
+ * - a time interval per SQL99
+ * ConstInterval and ColId give shift/reduce errors,
+ * so use IDENT and reject anything which is a reserved word.
+ */
 zone_value:  AllConst		{ $$ = $1; }
+		| IDENT		{ $$ = $1; }
 		| ConstInterval StringConst opt_interval
 			{ $$ = cat_str(3, $1, $2, $3); }
 		| ConstInterval '(' PosIntConst ')' StringConst opt_interval
@@ -1427,6 +1436,29 @@ DropTrigStmt:  DROP TRIGGER name ON qualified_name
 			{ $$ = cat_str(4, make_str("drop trigger"), $3, make_str("on"), $5); }
 		;
 
+/*****************************************************************************
+ *
+ *             QUERIES :
+ *                             CREATE ASSERTION ...
+ *                             DROP ASSERTION ...
+ *
+ *****************************************************************************/
+CreateAssertStmt:  CREATE ASSERTION name
+                       CHECK '(' a_expr ')' ConstraintAttributeSpec
+		        {
+				mmerror(PARSE_ERROR, ET_ERROR, "CREATE ASSERTION is not yet supported");
+		       		$$ = cat_str(6, make_str("create assertion"), $3, make_str("check ("), $6, make_str(")"), $8);
+			}
+		;
+
+DropAssertStmt:  DROP ASSERTION name
+	{
+		mmerror(PARSE_ERROR, ET_ERROR, "DROP ASSERTION is not yet supported");
+		$$ = cat2_str(make_str("drop assertion"), $3);
+	}
+	;
+
+		       
 /*****************************************************************************
  *
  *		QUERY :
@@ -1476,7 +1508,6 @@ drop_type:	TABLE		{ $$ = make_str("table"); }
 		| SEQUENCE		{ $$ = make_str("sequence"); }
 		| VIEW			{ $$ = make_str("view"); }
 		| INDEX			{ $$ = make_str("index"); }
-		| RULE			{ $$ = make_str("rule"); }
 		| TYPE_P		{ $$ = make_str("type"); }
 		| DOMAIN_P		{ $$ = make_str("domain"); }
 		;
@@ -1563,11 +1594,11 @@ from_in: IN					{ $$ = make_str("in"); }
  *	The COMMENT ON statement can take different forms based upon the type of
  *	the object associated with the comment. The form of the statement is:
  *
- *	COMMENT ON [ [ DATABASE | DOMAIN | INDEX | RULE | SEQUENCE | TABLE | TYPE | VIEW ]
+ *	COMMENT ON [ [ DATABASE | DOMAIN | INDEX |  SEQUENCE | TABLE | TYPE | VIEW ]
  *				 <objname> | AGGREGATE <aggname> (<aggtype>) | FUNCTION
  *				<funcname> (arg1, arg2, ...) | OPERATOR <op>
  *				(leftoperand_typ rightoperand_typ) | TRIGGER <triggername> ON
- *				<relname> ] IS 'text'
+ *				<relname> | RULE <rulename> ON <relname> ] IS 'text'
  *
  *****************************************************************************/
 CommentStmt:   COMMENT ON comment_type name IS comment_text
@@ -1584,11 +1615,14 @@ CommentStmt:   COMMENT ON comment_type name IS comment_text
 			{ $$ = cat_str(6, make_str("comment on operator"), $4, make_str("("), $6, make_str(") is"), $9); }
 		| COMMENT ON TRIGGER name ON qualified_name IS comment_text
 			{ $$ = cat_str(6, make_str("comment on trigger"), $4, make_str("on"), $6, make_str("is"), $8); }
+		| COMMENT ON RULE name ON any_name IS comment_text
+			{ $$ = cat_str(6, make_str("comment on rule"), $4, make_str("on"), $6, make_str("is"), $8); }
+		| COMMENT ON RULE name IS comment_text
+			{ $$ = cat_str(4, make_str("comment on rule"), $4, make_str("is"), $6); }
 		;
 
 comment_type:  DATABASE		{ $$ = make_str("database"); }
 		| INDEX		{ $$ = make_str("idnex"); }
-		| RULE		{ $$ = make_str("rule"); }
 		| SEQUENCE	{ $$ = make_str("sequence"); }
 		| TABLE		{ $$ = make_str("table"); }
 		| DOMAIN_P	{ $$ = make_str("domain"); }
@@ -1635,6 +1669,9 @@ privilege:	SELECT			{ $$ = make_str("select"); }
 		| TRIGGER			{ $$ = make_str("trigger"); }
 		| EXECUTE			{ $$ = make_str("execute"); }
 		| USAGE				{ $$ = make_str("usage"); }
+		| CREATE			{ $$ = make_str("create"); }
+		| TEMPORARY			{ $$ = make_str("temporary"); }
+		| TEMP				{ $$ = make_str("temp"); }
 		;
 
 privilege_target: qualified_name_list	
@@ -1643,8 +1680,12 @@ privilege_target: qualified_name_list
 			{ $$ = cat2_str(make_str("table"), $2); }
 		| FUNCTION function_with_argtypes_list
 			{ $$ = cat2_str(make_str("function"), $2); }
+		| DATABASE name_list
+			{ $$ = cat2_str(make_str("database"), $2); }
 		| LANGUAGE name_list			
 			{ $$ = cat2_str(make_str("language") , $2); }
+		| SCHEMA name_list			
+			{ $$ = cat2_str(make_str("schema") , $2); }
 		;
 
 grantee_list: grantee				
@@ -1653,9 +1694,8 @@ grantee_list: grantee
 			{ $$ = cat_str(3, $1, make_str(","), $3); }
 		;
 
-grantee:  PUBLIC			{ $$ = make_str("public"); }
+grantee:  ColId			{ $$ = $1; }
 		| GROUP ColId		{ $$ = cat2_str(make_str("group"), $2); }
-		| ColId				{ $$ = $1; }
 		;
 
 opt_grant_grant_option:  WITH GRANT OPTION
@@ -1724,26 +1764,8 @@ index_elem:  attr_name opt_class
 			{ $$ = cat2_str($1, $2); }
 		;
 
-opt_class:	class
-		{
-			/*
-			 * Release 7.0 removed network_ops, timespan_ops, and
-			 * datetime_ops, so we suppress it from being passed to
-			 * the parser so the default *_ops is used.  This can be
-			 * removed in some later release.	bjm 2000/02/07
-			 *
-			 * Release 7.1 removes lztext_ops, so suppress that too
-			 * for a while.  tgl 2000/07/30
-			 */
-			if (strcmp($1, "network_ops") != 0 &&
-				 strcmp($1, "timespan_ops") != 0 &&
-				 strcmp($1, "datetime_ops") != 0 &&
-				 strcmp($1, "lztext_ops") != 0)
-				$$ = $1;
-			else
-				$$ = EMPTY;
-		}
-		| USING class	{ $$ = cat2_str(make_str("using"), $2); }
+opt_class:	any_name 	{ $$ = $1; }
+		| USING any_name	{ $$ = cat2_str(make_str("using"), $2); }
 		| /*EMPTY*/		{ $$ = EMPTY; }
 		;
 
@@ -1974,6 +1996,9 @@ opt_instead:  INSTEAD		{ $$ = make_str("instead"); }
 		| /*EMPTY*/			{ $$ = EMPTY; }
 		;
 
+DropRuleStmt:  DROP RULE name ON qualified_name
+		{ $$ = cat_str(4, make_str("drop rule"), $3, make_str("on"), $5);}
+		;
 
 /*****************************************************************************
  *
@@ -3398,7 +3423,6 @@ name:					ColId			{ $$ = $1; };
 database_name:			ColId			{ $$ = $1; };
 access_method:			ColId			{ $$ = $1; };
 attr_name:				ColId			{ $$ = $1; };
-class:					ColId			{ $$ = $1; };
 index_name:				ColId			{ $$ = $1; };
 
 file_name:				StringConst		{ $$ = $1; };
@@ -4780,6 +4804,7 @@ unreserved_keyword:
 		| AFTER							{ $$ = make_str("after"); }
 		| AGGREGATE						{ $$ = make_str("aggregate"); }
 		| ALTER							{ $$ = make_str("alter"); }
+		| ASSERTION							{ $$ = make_str("assertion"); }
 		| AT							{ $$ = make_str("at"); }
 		| BACKWARD						{ $$ = make_str("backward"); }
 		| BEFORE						{ $$ = make_str("before"); }
@@ -4993,7 +5018,6 @@ func_name_keyword:
 		| NOTNULL						{ $$ = make_str("notnull"); }
 		| OUTER_P						{ $$ = make_str("outer"); }
 		| OVERLAPS						{ $$ = make_str("overlaps"); }
-		| PUBLIC						{ $$ = make_str("public"); }
 		| RIGHT							{ $$ = make_str("right"); }
 		| VERBOSE						{ $$ = make_str("verbose"); }
 		;