From ac104eaa206f6b98631a2ef18bfdb0afb494bb9c Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Thu, 30 Dec 2021 10:26:37 +0100 Subject: [PATCH v7 7/7] WIP: Underscores in numeric literals Discussion: https://www.postgresql.org/message-id/flat/b239564c-cad0-b23e-c57e-166d883cb97d@enterprisedb.com --- src/backend/parser/Makefile | 2 +- src/backend/parser/scan.l | 26 +++++++++++++++--- src/test/regress/expected/numerology.out | 34 +++++++++++++++++++++--- src/test/regress/sql/numerology.sql | 7 ++++- 4 files changed, 59 insertions(+), 10 deletions(-) diff --git a/src/backend/parser/Makefile b/src/backend/parser/Makefile index 5ddb9a92f0..827bc4c189 100644 --- a/src/backend/parser/Makefile +++ b/src/backend/parser/Makefile @@ -56,7 +56,7 @@ gram.c: BISON_CHECK_CMD = $(PERL) $(srcdir)/check_keywords.pl $< $(top_srcdir)/s scan.c: FLEXFLAGS = -CF -p -p -scan.c: FLEX_NO_BACKUP=yes +#scan.c: FLEX_NO_BACKUP=yes scan.c: FLEX_FIX_WARNING=yes diff --git a/src/backend/parser/scan.l b/src/backend/parser/scan.l index 2e1aa62d81..5b574c4233 100644 --- a/src/backend/parser/scan.l +++ b/src/backend/parser/scan.l @@ -395,10 +395,10 @@ hexdigit [0-9A-Fa-f] octdigit [0-7] bindigit [0-1] -decinteger {decdigit}+ -hexinteger 0[xX]{hexdigit}+ -octinteger 0[oO]{octdigit}+ -bininteger 0[bB]{bindigit}+ +decinteger {decdigit}(_?{decdigit})* +hexinteger 0[xX](_?{hexdigit})+ +octinteger 0[oO](_?{octdigit})+ +bininteger 0[bB](_?{bindigit})+ hexfail 0[xX] octfail 0[oO] @@ -1372,6 +1372,24 @@ process_integer_literal(const char *token, YYSTYPE *lval, int base) int val; char *endptr; + if (strchr(token, '_')) + { + char *newtoken = palloc(strlen(token)); + const char *p1; + char *p2; + + p1 = token; + p2 = newtoken; + while (*p1) + { + if (*p1 != '_') + *p2++ = *p1; + p1++; + } + *p2 = '\0'; + token = newtoken; + } + errno = 0; val = strtoint(token, &endptr, base); if (*endptr != '\0' || errno == ERANGE) diff --git a/src/test/regress/expected/numerology.out b/src/test/regress/expected/numerology.out index d95b24c7b3..7289a325fc 100644 --- a/src/test/regress/expected/numerology.out +++ b/src/test/regress/expected/numerology.out @@ -23,6 +23,36 @@ SELECT 0x42F; 1071 (1 row) +SELECT 1_000_000; + ?column? +---------- + 1000000 +(1 row) + +SELECT 1_2_3; + ?column? +---------- + 123 +(1 row) + +SELECT 0x1EEE_FFFF; + ?column? +----------- + 518979583 +(1 row) + +SELECT 0o2_73; + ?column? +---------- + 187 +(1 row) + +SELECT 0b_10_0101; + ?column? +---------- + 37 +(1 row) + -- error cases SELECT 123abc; ERROR: trailing junk after numeric literal at or near "123a" @@ -32,10 +62,6 @@ SELECT 0x0o; ERROR: trailing junk after numeric literal at or near "0x0o" LINE 1: SELECT 0x0o; ^ -SELECT 1_2_3; -ERROR: trailing junk after numeric literal at or near "1_" -LINE 1: SELECT 1_2_3; - ^ SELECT 0.a; ERROR: trailing junk after numeric literal at or near "0.a" LINE 1: SELECT 0.a; diff --git a/src/test/regress/sql/numerology.sql b/src/test/regress/sql/numerology.sql index 0e12bcc7b7..f35ff31d9a 100644 --- a/src/test/regress/sql/numerology.sql +++ b/src/test/regress/sql/numerology.sql @@ -12,10 +12,15 @@ SELECT 0o273; SELECT 0x42F; +SELECT 1_000_000; +SELECT 1_2_3; +SELECT 0x1EEE_FFFF; +SELECT 0o2_73; +SELECT 0b_10_0101; + -- error cases SELECT 123abc; SELECT 0x0o; -SELECT 1_2_3; SELECT 0.a; SELECT 0.0a; SELECT .0a; -- 2.34.1