Changeset: 172d7c7fd223 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/172d7c7fd223
Modified Files:
sql/server/sql_parser.y
sql/server/sql_scan.c
Branch: literal_features
Log Message:
get underscore visual grouping separator working for all integer types
diffs (192 lines):
diff --git a/sql/server/sql_parser.y b/sql/server/sql_parser.y
--- a/sql/server/sql_parser.y
+++ b/sql/server/sql_parser.y
@@ -4874,6 +4874,10 @@ literal:
if (len - i < MAX_OCT_DIGITS || (len - i == MAX_OCT_DIGITS &&
binary[i] < '2'))
while (err == 0 && i < len)
{
+ if (binary[i] == '_') {
+ i++;
+ continue;
+ }
res <<= 1;
if (binary[i] == '0' || binary[i] == '1') //
TODO: an be asserted
res = res + (binary[i] - '0');
@@ -4928,6 +4932,10 @@ literal:
if (len - i < MAX_OCT_DIGITS || (len - i == MAX_OCT_DIGITS &&
octal[i] < '8'))
while (err == 0 && i < len)
{
+ if (octal[i] == '_') {
+ i++;
+ continue;
+ }
res <<= 3;
if ('0' <= octal[i] && octal[i] < '8')
res = res + (octal[i] - '0');
@@ -4967,7 +4975,7 @@ literal:
}
}
- | HEXADECIMALNUM { int len = _strlen($1), i = 2, err = 0;
+ | HEXADECIMALNUM { int len = _strlen($1), i = 2, err = 0;
char * hexa = $1;
sql_subtype t;
#ifdef HAVE_HGE
@@ -4986,6 +4994,10 @@ literal:
if (len - i < MAX_HEX_DIGITS || (len - i == MAX_HEX_DIGITS &&
hexa[i] < '8'))
while (err == 0 && i < len)
{
+ if (hexa[i] == '_') {
+ i++;
+ continue;
+ }
res <<= 4;
if (isdigit((unsigned char) hexa[i]))
res = res + (hexa[i] - '0');
@@ -5057,7 +5069,19 @@ literal:
}
}
| sqlINT
- { int digits = _strlen($1), err = 0;
+ {
+ char filtered[50] = {0};
+ int j = 0;
+ for (int i = 0; i < 50; i++) {
+ char d = $1[i];
+ if (!d)
+ break;
+ else if (d == '_')
+ continue;
+ filtered[j] = d;
+ ++j;
+ }
+ int digits = j, err = 0;
#ifdef HAVE_HGE
hge value, *p = &value;
size_t len = sizeof(hge);
@@ -5070,10 +5094,10 @@ literal:
sql_subtype t;
#ifdef HAVE_HGE
- if (hgeFromStr($1, &len, &p, false) < 0 || is_hge_nil(value))
+ if (hgeFromStr(filtered, &len, &p, false) < 0 ||
is_hge_nil(value))
err = 2;
#else
- if (lngFromStr($1, &len, &p, false) < 0 || is_lng_nil(value))
+ if (lngFromStr(filtered, &len, &p, false) < 0 ||
is_lng_nil(value))
err = 2;
#endif
diff --git a/sql/server/sql_scan.c b/sql/server/sql_scan.c
--- a/sql/server/sql_scan.c
+++ b/sql/server/sql_scan.c
@@ -966,36 +966,37 @@ static inline bool is_valid_binary_digit
static inline bool is_valid_octal_digit(int cur) { return (iswdigit(cur) &&
cur < '8'); }
static inline bool is_valid_hexadecimal_digit(int cur) { return
iswxdigit(cur); }
-static inline int check_validity_number(mvc* c, bool
initial_underscore_allowed, int *token, bool (*is_valid_n_ary_digit)(int), int
type, char type2) {
+static inline int check_validity_number(mvc* c, int pcur, bool
initial_underscore_allowed, int *token, bool (*is_valid_n_ary_digit)(int), int
type, char type2) {
struct scanner *lc = &c->scanner;
+ (void) type2;
+
+ if (pcur == '_' && !initial_underscore_allowed) /* ERROR */ {
+ *token = 0;
+ return '_';
+ }
+
int cur = scanner_getc(lc);
- bool underscore_allowed = initial_underscore_allowed;
+ *token = type;
while (cur != EOF) {
if (cur == '_') {
- if (underscore_allowed) // so previous character was
not an underscore
- underscore_allowed = false;
- else /* ERROR */ {
+ if (pcur == '_') /* ERROR */ {
*token = 0;
- break;
- }
+ return '_';
+ }
}
- else if (is_valid_n_ary_digit(cur))
- underscore_allowed = true;
- else
+ else if (!is_valid_n_ary_digit(cur))
break;
- *token = type;
+ pcur = cur;
cur = scanner_getc(lc);
}
- if (cur == EOF)
- return cur;
-
- if (*token != type) {
+ if (pcur == '_') /* ERROR */ {
/* 0b not followed by a n-ary digit: show n-type character as
erroneous */
utf8_putchar(lc, cur);
- cur = type2;
*token = 0;
+ return '_';
}
+
return cur;
}
@@ -1019,15 +1020,18 @@ number(mvc * c, int cur)
if (cur == '0') {
switch ((cur = scanner_getc(lc))) {
case 'b':
- if ((cur = check_validity_number(c, true, &token,
&is_valid_binary_digit , BINARYNUM , 'b'))
== EOF) return cur;
+ cur = scanner_getc(lc);
+ if ((cur = check_validity_number(c, cur, true, &token,
&is_valid_binary_digit , BINARYNUM , 'b')) ==
EOF) return cur;
is_decimal = false;
break;
case 'o':
- if ((cur = check_validity_number(c, true, &token,
&is_valid_octal_digit , OCTALNUM , 'o')) == EOF)
return cur;
+ cur = scanner_getc(lc);
+ if ((cur = check_validity_number(c, cur, true, &token,
&is_valid_octal_digit , OCTALNUM , 'o')) == EOF)
return cur;
is_decimal = false;
break;
case 'x':
- if ((cur = check_validity_number(c, true, &token,
&is_valid_hexadecimal_digit , HEXADECIMALNUM, 'x')) == EOF) return cur;
+ cur = scanner_getc(lc);
+ if ((cur = check_validity_number(c, cur, true, &token,
&is_valid_hexadecimal_digit , HEXADECIMALNUM, 'x')) == EOF) return cur;
is_decimal = false;
break;
default:
@@ -1036,7 +1040,7 @@ number(mvc * c, int cur)
}
}
if (is_decimal && is_valid_decimal_digit(cur)) {
- if ((cur = check_validity_number(c, false, &token,
&is_valid_decimal_digit , sqlINT, 'd')) == EOF) return cur;
+ if ((cur = check_validity_number(c, cur, false, &token,
&is_valid_decimal_digit , sqlINT, 'd')) == EOF) return cur;
if (cur == '@') {
if (token == sqlINT) {
cur = scanner_getc(lc);
@@ -1055,15 +1059,19 @@ number(mvc * c, int cur)
}
}
} else {
- if (cur == '.')
- if ((cur = check_validity_number(c, false,
&token, &is_valid_decimal_digit , INTNUM, 'd')) == EOF) return cur;
- if (cur == 'e' || cur == 'E')
+ if (cur == '.') {
+ cur = scanner_getc(lc);
+ if ((cur = check_validity_number(c, cur, false,
&token, &is_valid_decimal_digit , INTNUM, 'd')) == EOF) return cur;
+ }
+ if (cur == 'e' || cur == 'E') {
+ cur = scanner_getc(lc);
if (token != 0) {
- if ((cur = check_validity_number(c,
false, &token, &is_valid_decimal_digit , APPROXNUM, 'd')) == EOF) return
cur;
+ if ((cur = check_validity_number(c,
cur, false, &token, &is_valid_decimal_digit , APPROXNUM, 'd')) == EOF) return
cur;
if (cur == '+' || cur == '-')
cur = scanner_getc(lc);
- if ((cur = check_validity_number(c,
false, &token, &is_valid_decimal_digit , APPROXNUM, 'd')) == EOF) return
cur;
+ if ((cur = check_validity_number(c,
cur, false, &token, &is_valid_decimal_digit , APPROXNUM, 'd')) == EOF) return
cur;
}
+ }
}
}
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]