aboutsummaryrefslogtreecommitdiff
path: root/src/backend/parser
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/parser')
-rw-r--r--src/backend/parser/scan.l54
-rw-r--r--src/backend/parser/scansup.c3
2 files changed, 36 insertions, 21 deletions
diff --git a/src/backend/parser/scan.l b/src/backend/parser/scan.l
index 8a53221930c..6bc9f2db53a 100644
--- a/src/backend/parser/scan.l
+++ b/src/backend/parser/scan.l
@@ -24,7 +24,7 @@
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/parser/scan.l,v 1.163 2009/11/09 18:38:48 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/parser/scan.l,v 1.164 2009/11/12 00:13:00 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -85,6 +85,7 @@ static void addlitchar(unsigned char ychar, core_yyscan_t yyscanner);
static char *litbufdup(core_yyscan_t yyscanner);
static char *litbuf_udeescape(unsigned char escape, core_yyscan_t yyscanner);
static unsigned char unescape_single_char(unsigned char c, core_yyscan_t yyscanner);
+static int process_integer_literal(const char *token, YYSTYPE *lval);
static bool is_utf16_surrogate_first(pg_wchar c);
static bool is_utf16_surrogate_second(pg_wchar c);
static pg_wchar surrogate_pair_to_codepoint(pg_wchar first, pg_wchar second);
@@ -339,12 +340,15 @@ operator {op_chars}+
* instead we pass it separately to parser. there it gets
* coerced via doNegate() -- Leon aug 20 1999
*
+* {decimalfail} is used because we would like "1..10" to lex as 1, dot_dot, 10.
+*
* {realfail1} and {realfail2} are added to prevent the need for scanner
* backup when the {real} rule fails to match completely.
*/
integer {digit}+
decimal (({digit}*\.{digit}+)|({digit}+\.{digit}*))
+decimalfail {digit}+\.\.
real ({integer}|{decimal})[Ee][-+]?{digit}+
realfail1 ({integer}|{decimal})[Ee]
realfail2 ({integer}|{decimal})[Ee][-+]
@@ -846,31 +850,20 @@ other .
}
{integer} {
- long val;
- char* endptr;
-
SET_YYLLOC();
- errno = 0;
- val = strtol(yytext, &endptr, 10);
- if (*endptr != '\0' || errno == ERANGE
-#ifdef HAVE_LONG_INT_64
- /* if long > 32 bits, check for overflow of int4 */
- || val != (long) ((int32) val)
-#endif
- )
- {
- /* integer too large, treat it as a float */
- yylval->str = pstrdup(yytext);
- return FCONST;
- }
- yylval->ival = val;
- return ICONST;
+ return process_integer_literal(yytext, yylval);
}
{decimal} {
SET_YYLLOC();
yylval->str = pstrdup(yytext);
return FCONST;
}
+{decimalfail} {
+ /* throw back the .., and treat as integer */
+ yyless(yyleng-2);
+ SET_YYLLOC();
+ return process_integer_literal(yytext, yylval);
+ }
{real} {
SET_YYLLOC();
yylval->str = pstrdup(yytext);
@@ -1122,6 +1115,29 @@ litbufdup(core_yyscan_t yyscanner)
}
static int
+process_integer_literal(const char *token, YYSTYPE *lval)
+{
+ long val;
+ char *endptr;
+
+ errno = 0;
+ val = strtol(token, &endptr, 10);
+ if (*endptr != '\0' || errno == ERANGE
+#ifdef HAVE_LONG_INT_64
+ /* if long > 32 bits, check for overflow of int4 */
+ || val != (long) ((int32) val)
+#endif
+ )
+ {
+ /* integer too large, treat it as a float */
+ lval->str = pstrdup(token);
+ return FCONST;
+ }
+ lval->ival = val;
+ return ICONST;
+}
+
+static int
hexval(unsigned char c)
{
if (c >= '0' && c <= '9')
diff --git a/src/backend/parser/scansup.c b/src/backend/parser/scansup.c
index b4d8612d6c9..b3b5daa2213 100644
--- a/src/backend/parser/scansup.c
+++ b/src/backend/parser/scansup.c
@@ -9,7 +9,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/parser/scansup.c,v 1.37 2009/01/01 17:23:46 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/parser/scansup.c,v 1.38 2009/11/12 00:13:00 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -197,7 +197,6 @@ bool
scanner_isspace(char ch)
{
/* This must match scan.l's list of {space} characters */
- /* and plpgsql's scan.l as well */
if (ch == ' ' ||
ch == '\t' ||
ch == '\n' ||