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

Reply via email to