Changeset: 66f98cecddf3 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=66f98cecddf3
Modified Files:
        sql/server/sql_decimal.c
        sql/server/sql_parser.y
Branch: Oct2020-merged-Jun2020
Log Message:

Fix the use of decimal_from_str in bison.


diffs (60 lines):

diff --git a/sql/server/sql_decimal.c b/sql/server/sql_decimal.c
--- a/sql/server/sql_decimal.c
+++ b/sql/server/sql_decimal.c
@@ -69,8 +69,10 @@ fractional_sep_first_opp:
                }
        }
        for (; *dec && (isdigit((unsigned char) *dec)); dec++) {
-               if (res > max0 || (res == max0 && *dec - '0' > max1))
-                       break;
+               if (res > max0 || (res == max0 && *dec - '0' > max1)) {
+                       *has_errors = 1;
+                       return 0;
+               }
                res *= 10;
                res += *dec - '0';
                _digits++;
@@ -86,8 +88,10 @@ trailing_digits:
        if (!isdigit((unsigned char) *dec))
                goto trailing_whitespace;
        for (; *dec && (isdigit((unsigned char) *dec)); dec++) {
-               if (res > max0 || (res == max0 && *dec - '0' > max1))
-                       break;
+               if (res > max0 || (res == max0 && *dec - '0' > max1)) {
+                       *has_errors = 1;
+                       return 0;
+               }
                res *= 10;
                res += *dec - '0';
                _scale++;
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
@@ -4717,21 +4717,17 @@ literal:
 
                        DEC_TPE value = decimal_from_str(s, &digits, &scale, 
&has_errors);
 
-                       if (has_errors) {
-                               char *msg = sql_message(SQLSTATE(22003) "Double 
value too large or not a number (%s)", $1);
-
-                               yyerror(m, msg);
-                               _DELETE(msg);
-                               $$ = NULL;
-                               YYABORT;
-                       }
-
-                       if (digits <= MAX_DEC_DIGITS) {
+                       if (!has_errors) {
+                               // The float-like value seems to fit in decimal 
storage
                                double val = strtod($1,NULL);
                                sql_find_subtype(&t, "decimal", digits, scale );
                                $$ = _newAtomNode( atom_dec(SA, &t, value, 
val));
                        }
                        else {
+                               /*
+                                * The float-like value either doesn't fit in 
integer decimal storage
+                                * or it is not a valid float representation.
+                                */
                                char *p = $1;
                                double val;
 
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to