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