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 -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org