diff --git a/src/backend/parser/scan.l b/src/backend/parser/scan.l
index d50ee9c62d8ecb8621141bbc6547c799410f8e1e..6493ce2db4b35fc2ef8fc795a0e692fb818247eb 100644
--- a/src/backend/parser/scan.l
+++ b/src/backend/parser/scan.l
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/parser/scan.l,v 1.48 1999/05/03 19:09:42 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/parser/scan.l,v 1.49 1999/05/12 07:12:51 thomas Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -37,6 +37,11 @@
 #endif
 #define YY_READ_BUF_SIZE	MAX_PARSE_BUFFER
 
+#ifdef  YY_READ_BUF_SIZE
+#undef  YY_READ_BUF_SIZE
+#endif
+#define YY_READ_BUF_SIZE	MAX_PARSE_BUFFER
+
 extern char *parseString;
 static char *parseCh;
 
@@ -157,10 +162,11 @@ operator		{op_and_self}+
 xmstop			-
 
 integer			[\-]?{digit}+
+decimal			[\-]?(({digit}*\.{digit}+)|({digit}+\.{digit}*))
+real			[\-]?((({digit}*\.{digit}+)|({digit}+\.{digit}*)|({digit}+))([Ee][-+]?{digit}+))
 /*
-real			[\-]?{digit}+\.{digit}+([Ee][-+]?{digit}+)?
-*/
 real			[\-]?(((({digit}*\.{digit}+)|({digit}+\.{digit}*))([Ee][-+]?{digit}+)?)|({digit}+[Ee][-+]?{digit}+))
+*/
 
 param			\${integer}
 
@@ -339,15 +345,35 @@ other			.
 					if (*endptr != '\0' || errno == ERANGE)
 					{
 						errno = 0;
+#if 0
 						yylval.dval = strtod(((char *)yytext),&endptr);
 						if (*endptr != '\0' || errno == ERANGE)
 							elog(ERROR,"Bad integer input '%s'",yytext);
 						CheckFloat8Val(yylval.dval);
 						elog(NOTICE,"Integer input '%s' is out of range; promoted to float", yytext);
 						return FCONST;
+#endif
+						yylval.str = pstrdup((char*)yytext);
+						return SCONST;
 					}
 					return ICONST;
 				}
+{decimal}/{space}*-{number} {
+					char* endptr;
+
+					BEGIN(xm);
+					if (strlen((char *)yytext) <= 17)
+					{
+						errno = 0;
+						yylval.dval = strtod(((char *)yytext),&endptr);
+						if (*endptr != '\0' || errno == ERANGE)
+							elog(ERROR,"Bad float8 input '%s'",yytext);
+						CheckFloat8Val(yylval.dval);
+						return FCONST;
+					}
+					yylval.str = pstrdup((char*)yytext);
+					return SCONST;
+				}
 {real}/{space}*-{number} {
 					char* endptr;
 
@@ -367,15 +393,34 @@ other			.
 					if (*endptr != '\0' || errno == ERANGE)
 					{
 						errno = 0;
+#if 0
 						yylval.dval = strtod(((char *)yytext),&endptr);
 						if (*endptr != '\0' || errno == ERANGE)
 							elog(ERROR,"Bad integer input '%s'",yytext);
 						CheckFloat8Val(yylval.dval);
 						elog(NOTICE,"Integer input '%s' is out of range; promoted to float", yytext);
 						return FCONST;
+#endif
+						yylval.str = pstrdup((char*)yytext);
+						return SCONST;
 					}
 					return ICONST;
 				}
+{decimal}		{
+					char* endptr;
+
+					if (strlen((char *)yytext) <= 17)
+					{
+						errno = 0;
+						yylval.dval = strtod((char *)yytext,&endptr);
+						if (*endptr != '\0' || errno == ERANGE)
+							elog(ERROR,"Bad float input '%s'",yytext);
+						CheckFloat8Val(yylval.dval);
+						return FCONST;
+					}
+					yylval.str = pstrdup((char*)yytext);
+					return SCONST;
+				}
 {real}			{
 					char* endptr;