diff --git a/src/interfaces/ecpg/ChangeLog b/src/interfaces/ecpg/ChangeLog
index efce42831888d4723113ba6f2fbdfe5921c6816d..97e37eaf3edff876ca36659166d165bd208d159c 100644
--- a/src/interfaces/ecpg/ChangeLog
+++ b/src/interfaces/ecpg/ChangeLog
@@ -1845,6 +1845,11 @@ Mon,  5 Jul 2004 10:41:54 +0200
 Mon Jul  5 20:50:09 CEST 2004
 
 	- Added free() calls against memory leak in interval.c.
+	
+Tue Jul 20 09:15:21 CEST 2004
+
+	- Synced parser and keyword list.
+	- Fixed handling of cyclic defines.
 	- 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/ecpg.c b/src/interfaces/ecpg/preproc/ecpg.c
index f8013e487c36d5b23c103bc512db7370ef29c5b6..5592b42a79dc187b5091e5b32355fce2d5871d6f 100644
--- a/src/interfaces/ecpg/preproc/ecpg.c
+++ b/src/interfaces/ecpg/preproc/ecpg.c
@@ -1,4 +1,4 @@
-/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/ecpg.c,v 1.88 2004/06/10 22:26:23 momjian Exp $ */
+/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/ecpg.c,v 1.89 2004/07/20 18:06:41 meskes Exp $ */
 
 /* New main for ecpg, the PostgreSQL embedded SQL precompiler. */
 /* (C) Michael Meskes <meskes@postgresql.org> Feb 5th, 1998 */
@@ -96,7 +96,7 @@ add_preprocessor_define(char *define)
 	{
 		char	   *tmp;
 
-		/* symbol gets a value */
+		/* symbol has a value */
 		for (tmp = ptr - 1; *tmp == ' '; tmp--);
 		tmp[1] = '\0';
 		defines->old = define_copy;
@@ -105,9 +105,10 @@ add_preprocessor_define(char *define)
 	else
 	{
 		defines->old = define_copy;
-		defines->new = mm_strdup("");
+		defines->new = mm_strdup("1");
 	}
 	defines->pertinent = true;
+	defines->used = NULL;
 	defines->next = pd;
 }
 
diff --git a/src/interfaces/ecpg/preproc/keywords.c b/src/interfaces/ecpg/preproc/keywords.c
index 67525830c4c4ced39283ed38d91c9a3202bfa65a..d8e8fed67abdd19b517526a02bcfe7902d373ee7 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.63 2004/06/20 10:45:47 meskes Exp $
+ *	  $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/keywords.c,v 1.64 2004/07/20 18:06:41 meskes Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -233,8 +233,6 @@ static ScanKeyword ScanKeywords[] = {
 	{"owner", OWNER},
 	{"partial", PARTIAL},
 	{"password", PASSWORD},
-	{"path", PATH_P},
-	{"pendant", PENDANT},
 	{"position", POSITION},
 	{"precision", PRECISION},
 	{"prepare", PREPARE},
@@ -327,7 +325,6 @@ static ScanKeyword ScanKeywords[] = {
 	{"varchar", VARCHAR},
 	{"varying", VARYING},
 	{"verbose", VERBOSE},
-	{"version", VERSION},
 	{"view", VIEW},
 	{"volatile", VOLATILE},
 	{"when", WHEN},
diff --git a/src/interfaces/ecpg/preproc/pgc.l b/src/interfaces/ecpg/preproc/pgc.l
index e4ab68634f4cd762f843b792017954d1cc3e5110..28578a395430a663fbfa1db4b5bab6ce03fab5e3 100644
--- a/src/interfaces/ecpg/preproc/pgc.l
+++ b/src/interfaces/ecpg/preproc/pgc.l
@@ -12,7 +12,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/pgc.l,v 1.129 2004/06/30 15:01:57 meskes Exp $
+ *	  $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/pgc.l,v 1.130 2004/07/20 18:06:41 meskes Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -598,11 +598,11 @@ cppline			{space}*#(.*\\{space})+.*
 <SQL>{identifier}	{
 						ScanKeyword    *keyword;
 						struct _defines *ptr;
-
+						
 						/* How about a DEFINE? */
 						for (ptr = defines; ptr; ptr = ptr->next)
 						{
-							if (strcmp(yytext, ptr->old) == 0)
+							if (strcmp(yytext, ptr->old) == 0 && ptr->used == NULL)
 							{
 								struct _yy_buffer *yb;
 
@@ -611,15 +611,14 @@ cppline			{space}*#(.*\\{space})+.*
 								yb->buffer =  YY_CURRENT_BUFFER;
 								yb->lineno = yylineno;
 								yb->filename = mm_strdup(input_filename);
-								yb->next = yy_buffer;
-
+								ptr->used = yb->next = yy_buffer;
+								
 								yy_buffer = yb;
 
 								yy_scan_string(ptr->new);
 								break;
 							}
 						}
-
 						if (ptr == NULL)
 						{
 							/* Is it an SQL keyword? */
@@ -640,16 +639,13 @@ cppline			{space}*#(.*\\{space})+.*
 							/*
 							 * None of the above.  Return it as an identifier.
 							 *
-							 * The backend would attempt to truncate and case-fold
+							 * The backend will attempt to truncate and case-fold
 							 * the identifier, but I see no good reason for ecpg
 							 * to do so; that's just another way that ecpg could get
 							 * out of step with the backend.
 							 */
-							if (ptr == NULL)
-							{
-								yylval.str = mm_strdup(yytext);
-								return IDENT;
-							}
+							yylval.str = mm_strdup(yytext);
+							return IDENT;
 						}
 					}
 <SQL>{other}		{ return yytext[0]; }
@@ -700,7 +696,7 @@ cppline			{space}*#(.*\\{space})+.*
 						/* is it a define? */
 						for (ptr = defines; ptr; ptr = ptr->next)
 						{
-							if (strcmp(yytext, ptr->old) == 0)
+							if (strcmp(yytext, ptr->old) == 0 && ptr->used == NULL)
 							{
 								struct _yy_buffer *yb;
 
@@ -709,7 +705,7 @@ cppline			{space}*#(.*\\{space})+.*
 								yb->buffer =  YY_CURRENT_BUFFER;
 								yb->lineno = yylineno;
 								yb->filename = mm_strdup(input_filename);
-								yb->next = yy_buffer;
+								ptr->used = yb->next = yy_buffer;
 
 								yy_buffer = yb;
 
@@ -739,7 +735,7 @@ cppline			{space}*#(.*\\{space})+.*
 <C>"-"				{ return('-'); }
 <C>"("				{ return('('); }
 <C>")"				{ return(')'); }
-<C>{space}			{ ECHO; }
+<C,xskip>{space}		{ ECHO; }
 <C>\{				{ return('{'); }
 <C>\}				{ return('}'); }
 <C>\[				{ return('['); }
@@ -975,12 +971,13 @@ cppline			{space}*#(.*\\{space})+.*
 						}
 						if (ptr == NULL)
 						{
-												this = (struct _defines *) mm_alloc(sizeof(struct _defines));
+							this = (struct _defines *) mm_alloc(sizeof(struct _defines));
 
-												/* initial definition */
-												this->old = old;
-												this->new = mm_strdup(literalbuf);
+							/* initial definition */
+							this->old = old;
+							this->new = mm_strdup(literalbuf);
 							this->next = defines;
+							this->used = NULL;
 							defines = this;
 						}
 
@@ -993,7 +990,7 @@ cppline			{space}*#(.*\\{space})+.*
 <incl>[^;\<\>\"]+";"		{ parse_include(); }
 
 <<EOF>>				{
-				  		if (yy_buffer == NULL) {
+			  		if (yy_buffer == NULL) {
 				  		if ( preproc_tos > 0 ) 
 						{
 					  		preproc_tos = 0;
@@ -1005,7 +1002,15 @@ cppline			{space}*#(.*\\{space})+.*
 				  		{
 							struct _yy_buffer *yb = yy_buffer;
 							int i;
+							struct _defines *ptr;
 
+							for (ptr = defines; ptr; ptr = ptr->next)
+								if (ptr->used == yy_buffer)
+								{
+									ptr->used = NULL;
+									break;
+								}
+									
 							if (yyin != NULL)
 								fclose(yyin);
 
@@ -1025,6 +1030,7 @@ cppline			{space}*#(.*\\{space})+.*
 
 							if (i != 0)
 								output_line_number();
+							
 				  		}
 					}
 %%
diff --git a/src/interfaces/ecpg/preproc/preproc.y b/src/interfaces/ecpg/preproc/preproc.y
index 3c10072f6860fd790b4a0b54f937927068e6c036..a2e30af3e082000c93738e7c0642abf110e6f3d7 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.292 2004/07/05 09:45:53 meskes Exp $ */
+/* $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/preproc.y,v 1.293 2004/07/20 18:06:41 meskes Exp $ */
 
 /* Copyright comment */
 %{
@@ -385,7 +385,7 @@ add_additional_variables(char *name, bool insert)
 	OBJECT_P OF OFF OFFSET OIDS OLD ON ONLY OPERATOR OPTION OR ORDER
         OUT_P OUTER_P OVERLAPS OVERLAY OWNER
 
-	PARTIAL PASSWORD PATH_P PENDANT PLACING POSITION
+	PARTIAL PASSWORD PLACING POSITION
 	PRECISION PRESERVE PREPARE PRIMARY PRIOR PRIVILEGES PROCEDURAL PROCEDURE
 
 	QUOTE
@@ -403,7 +403,7 @@ add_additional_variables(char *name, bool insert)
         UNCOMMITTED UNENCRYPTED UNION UNIQUE UNKNOWN UNLISTEN UNTIL UPDATE USAGE
         USER USING
 
-        VACUUM VALID VALUES VARCHAR VARYING VERBOSE VERSION VIEW VOLATILE
+        VACUUM VALID VALUES VARCHAR VARYING VERBOSE VIEW VOLATILE
 	WHEN WHERE WITH WITHOUT WORK WRITE
         YEAR_P
         ZONE
@@ -414,7 +414,7 @@ add_additional_variables(char *name, bool insert)
  */
 %token	UNIONJOIN
 
-/* Special keywords, not in the query language - see the "lex" file */
+/* Special token types, not actually keywords - see the "lex" file */
 %token <str>	IDENT SCONST Op CSTRING CVARIABLE CPP_LINE IP BCONST XCONST
 %token <ival>	ICONST PARAM
 %token <dval>	FCONST
@@ -1232,6 +1232,9 @@ alter_table_cmd:
 /* ALTER TABLE <name> SET WITHOUT CLUSTER */
 		| SET WITHOUT CLUSTER
 			{ $$ = make_str("set without cluster"); }
+		/* ALTER TABLE <name> SET TABLESPACE <tablespacename> */
+		| SET TABLESPACE name
+			{ $$ = cat_str(2, make_str("set tablespace"), $3); }
 		;
 
 alter_column_default:
@@ -1590,8 +1593,8 @@ CreateAsElement:  ColId { $$ = $1; }
  *
  *****************************************************************************/
 
-CreateSeqStmt:	CREATE OptTemp SEQUENCE qualified_name OptSeqList OptTableSpace
-			{ $$ = cat_str(5, make_str("create"), $2, make_str("sequence"), $4, $5, $6); }
+CreateSeqStmt:	CREATE OptTemp SEQUENCE qualified_name OptSeqList
+			{ $$ = cat_str(4, make_str("create"), $2, make_str("sequence"), $4, $5); }
 		;
 
 AlterSeqStmt: ALTER SEQUENCE qualified_name OptSeqList
@@ -5857,6 +5860,7 @@ ECPGunreserved:	  ABORT_P			{ $$ = make_str("abort"); }
 		| ADD				{ $$ = make_str("add"); }
 		| AFTER				{ $$ = make_str("after"); }
 		| AGGREGATE			{ $$ = make_str("aggregate"); }
+		| ALSO				{ $$ = make_str("also"); }
 		| ALTER				{ $$ = make_str("alter"); }
 		| ASSERTION			{ $$ = make_str("assertion"); }
 		| ASSIGNMENT			{ $$ = make_str("assignment"); }
@@ -5957,8 +5961,6 @@ ECPGunreserved:	  ABORT_P			{ $$ = make_str("abort"); }
 		| OWNER				{ $$ = make_str("owner"); }
 		| PARTIAL			{ $$ = make_str("partial"); }
 		| PASSWORD			{ $$ = make_str("password"); }
-		| PATH_P			{ $$ = make_str("path"); }
-		| PENDANT			{ $$ = make_str("pendant"); }
 		| PREPARE			{ $$ = make_str("prepare"); }
 		| PRESERVE			{ $$ = make_str("preserver"); }
 		| PRIOR				{ $$ = make_str("prior"); }
@@ -6021,7 +6023,6 @@ ECPGunreserved:	  ABORT_P			{ $$ = make_str("abort"); }
 		| VALID				{ $$ = make_str("valid"); }
 		| VALUES			{ $$ = make_str("values"); }
 		| VARYING			{ $$ = make_str("varying"); }
-		| VERSION			{ $$ = make_str("version"); }
 		| VIEW				{ $$ = make_str("view"); }
 		| WITH				{ $$ = make_str("with"); }
 		| WITHOUT			{ $$ = make_str("without"); }
diff --git a/src/interfaces/ecpg/preproc/type.h b/src/interfaces/ecpg/preproc/type.h
index 3b1f4c657b1e7ed94976c39dae021a64cf8052c7..9aab463aa1caa170032906a975169c62b160c203 100644
--- a/src/interfaces/ecpg/preproc/type.h
+++ b/src/interfaces/ecpg/preproc/type.h
@@ -135,6 +135,7 @@ struct _defines
 	char	   	*old;
 	char	   	*new;
 	int		pertinent;
+	void 		*used;
 	struct _defines *next;
 };