Changeset: af46e1f8b371 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/af46e1f8b371
Modified Files:
        sql/server/sql_scan.c
Branch: literal_features
Log Message:

fix and improve error checking


diffs (75 lines):

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
@@ -970,16 +970,21 @@ static inline int check_validity_number(
        struct scanner *lc = &c->scanner;
        (void) type2;
 
-       if (pcur == '_' && !initial_underscore_allowed)  /* ERROR */  {
+       if (pcur == '_' && !initial_underscore_allowed)  /* ERROR: initial 
underscore not allowed */  {
                *token = 0;
                return '_';
        }
 
+       if ( !(pcur == '_' || is_valid_n_ary_digit(pcur)) ) /* ERROR: first 
digit is not valid */ {
+               *token = 0;
+               return pcur;
+       }
+
        int cur = scanner_getc(lc);
        *token = type;
        while (cur != EOF) {
                if (cur == '_') {
-                       if (pcur == '_') /* ERROR */ {
+                       if (pcur == '_') /* ERROR: multiple consecutive 
underscores */ {
                                *token = 0;
                                return '_';
                        }
@@ -990,9 +995,7 @@ static inline int check_validity_number(
                cur = scanner_getc(lc);
        }
 
-       if (pcur == '_') /* ERROR */ {
-               /* 0b not followed by a n-ary digit: show n-type character as 
erroneous */
-               utf8_putchar(lc, cur);
+       if (pcur == '_') /* ERROR: number ends with underscore */ {
                *token = 0;
                return '_';
        }
@@ -1039,7 +1042,7 @@ number(mvc * c, int cur)
                        cur = '0';
                }
        }
-       if (is_decimal && is_valid_decimal_digit(cur)) {
+       if (is_decimal) {
                if ((cur = check_validity_number(c, cur, false, &token, 
&is_valid_decimal_digit , sqlINT, 'd')) == EOF) return cur;
                if (cur == '@') {
                        if (token == sqlINT) {
@@ -1063,19 +1066,21 @@ number(mvc * c, int cur)
                                cur = scanner_getc(lc);
                                if ((cur = check_validity_number(c, cur, false, 
&token, &is_valid_decimal_digit , INTNUM, 'd')) == EOF) return cur;
                        }
+                       if (token != 0)
                        if (cur == 'e' || cur == 'E') {
                                cur = scanner_getc(lc);
-                               if (token != 0) {
-                                       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, 
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, cur, false, 
&token, &is_valid_decimal_digit , APPROXNUM, 'd')) == EOF) return cur;
                        }
                }
        }
        
        assert(cur != EOF);
+
+       if (iswalnum(cur)) /* ERROR: not a valid digit */
+               token = 0;
+
        utf8_putchar(lc, cur);
 
        if (token) {
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to