diff --git a/src/interfaces/ecpg/ChangeLog b/src/interfaces/ecpg/ChangeLog
index a2a97d0df727d0bbe077b237b840921bf5a0c956..02fe1e9d41ff78b630bcc0a8ba326c703b2085b7 100644
--- a/src/interfaces/ecpg/ChangeLog
+++ b/src/interfaces/ecpg/ChangeLog
@@ -1445,6 +1445,10 @@ Fri May 23 11:46:15 CEST 2003
 Tue May 27 13:29:28 CEST 2003
 
 	- Fixed incorrect output for some structs.
+	
+Tue May 27 16:33:36 CEST 2003
+
+	- Accept stdin/stdout as input/output file.
 	- Set ecpg version to 2.12.0.
 	- Set ecpg library to 3.4.2.
 	- Set pgtypes library to 1.0.0
diff --git a/src/interfaces/ecpg/preproc/ecpg.c b/src/interfaces/ecpg/preproc/ecpg.c
index d40779b112020d04a5f41e013bda421aa4f24ec5..740703faf6e31a80f7241b09c2546cf8060211fd 100644
--- a/src/interfaces/ecpg/preproc/ecpg.c
+++ b/src/interfaces/ecpg/preproc/ecpg.c
@@ -1,4 +1,4 @@
-/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/ecpg.c,v 1.70 2003/05/14 14:37:35 meskes Exp $ */
+/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/ecpg.c,v 1.71 2003/05/27 14:36:00 meskes Exp $ */
 
 /* New main for ecpg, the PostgreSQL embedded SQL precompiler. */
 /* (C) Michael Meskes <meskes@postgresql.org> Feb 5th, 1998 */
@@ -137,7 +137,11 @@ main(int argc, char *const argv[])
 		switch (c)
 		{
 			case 'o':
-				yyout = fopen(optarg, PG_BINARY_W);
+				if (strcmp(optarg, "-") == 0) 
+					yyout = stdout;
+				else
+					yyout = fopen(optarg, PG_BINARY_W);
+				
 				if (yyout == NULL)
 					perror(optarg);
 				else
@@ -219,47 +223,62 @@ main(int argc, char *const argv[])
 			char	   *output_filename = NULL,
 					   *ptr2ext;
 
-			input_filename = mm_alloc(strlen(argv[fnr]) + 5);
-
-			strcpy(input_filename, argv[fnr]);
+			/* If argv[fnr] is "-" we have to read from stdin */
+			if (strcmp(argv[fnr], "-") == 0)
+			{
+				input_filename = mm_alloc(strlen("stdin")+1);
+				strcpy(input_filename, "stdin");
+				yyin = stdin;
+			}
+			else
+			{
+				input_filename = mm_alloc(strlen(argv[fnr]) + 5);
+				strcpy(input_filename, argv[fnr]);
 
-			/* take care of relative paths */
-			ptr2ext = last_path_separator(input_filename);
-			ptr2ext = (ptr2ext ? strrchr(ptr2ext, '.') : strrchr(input_filename, '.'));
+				/* take care of relative paths */
+				ptr2ext = last_path_separator(input_filename);
+				ptr2ext = (ptr2ext ? strrchr(ptr2ext, '.') : strrchr(input_filename, '.'));
 
-			/* no extension? */
-			if (ptr2ext == NULL)
-			{
-				ptr2ext = input_filename + strlen(input_filename);
-
-				/* no extension => add .pgc */
-				ptr2ext[0] = '.';
-				ptr2ext[1] = 'p';
-				ptr2ext[2] = 'g';
-				ptr2ext[3] = 'c';
-				ptr2ext[4] = '\0';
+				/* no extension? */
+				if (ptr2ext == NULL)
+				{
+					ptr2ext = input_filename + strlen(input_filename);
+
+					/* no extension => add .pgc */
+					ptr2ext[0] = '.';
+					ptr2ext[1] = 'p';
+					ptr2ext[2] = 'g';
+					ptr2ext[3] = 'c';
+					ptr2ext[4] = '\0';
+				}
+				
+				yyin = fopen(input_filename, PG_BINARY_R);
 			}
 
 			if (out_option == 0)	/* calculate the output name */
 			{
-				output_filename = strdup(input_filename);
+				if (strcmp(input_filename, "stdin") == 0)
+					yyout = stdout;
+				else
+				{
+					output_filename = strdup(input_filename);
 
-				ptr2ext = strrchr(output_filename, '.');
-				/* make extension = .c */
-				ptr2ext[1] = 'c';
-				ptr2ext[2] = '\0';
+					ptr2ext = strrchr(output_filename, '.');
+					/* make extension = .c */
+					ptr2ext[1] = 'c';
+					ptr2ext[2] = '\0';
 
-				yyout = fopen(output_filename, PG_BINARY_W);
-				if (yyout == NULL)
-				{
-					perror(output_filename);
-					free(output_filename);
-					free(input_filename);
-					continue;
+					yyout = fopen(output_filename, PG_BINARY_W);
+					if (yyout == NULL)
+					{
+						perror(output_filename);
+						free(output_filename);
+						free(input_filename);
+						continue;
+					}
 				}
 			}
 
-			yyin = fopen(input_filename, PG_BINARY_R);
 			if (yyin == NULL)
 				perror(argv[fnr]);
 			else
@@ -341,7 +360,7 @@ main(int argc, char *const argv[])
 
 				/* finally the actual connection */
 				connection = NULL;
-
+				
 				/* initialize lex */
 				lex_init();
 
@@ -355,9 +374,9 @@ main(int argc, char *const argv[])
 				/* and parse the source */
 				yyparse();
 
-				if (yyin != NULL)
+				if (yyin != NULL && yyin != stdin)
 					fclose(yyin);
-				if (out_option == 0)
+				if (out_option == 0 && yyout != stdout)
 					fclose(yyout);
 			}
 
diff --git a/src/interfaces/ecpg/preproc/pgc.l b/src/interfaces/ecpg/preproc/pgc.l
index 6b197e5655d52bd7f6d41ff95940f76ce2376c05..c489f64dcb9529db6cbe52d4714aad091d76f274 100644
--- a/src/interfaces/ecpg/preproc/pgc.l
+++ b/src/interfaces/ecpg/preproc/pgc.l
@@ -12,7 +12,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/pgc.l,v 1.110 2003/05/22 07:58:41 meskes Exp $
+ *	  $Header: /cvsroot/pgsql/src/interfaces/ecpg/preproc/pgc.l,v 1.111 2003/05/27 14:36:00 meskes Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -399,14 +399,6 @@ cppline			{space}*#(.*\\{space})+.*
 						BEGIN(state_before);
 						if (literallen == 0)
 							mmerror(PARSE_ERROR, ET_ERROR, "zero-length delimited identifier");
-						if (literallen >= NAMEDATALEN)
-						{
-							snprintf(errortext, sizeof(errortext), "identifier \"%s\" will be truncated to \"%.*s\"",
-									literalbuf, NAMEDATALEN-1, literalbuf);
-							literalbuf[NAMEDATALEN-1] = '\0';
-							mmerror(PARSE_ERROR, ET_WARNING, errortext);
-						}
-					
 						yylval.str = mm_strdup(literalbuf);
 						return CSTRING;
 					}