Changeset: 2aec2bfdbf51 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=2aec2bfdbf51
Modified Files:
sql/server/sql_decimal.c
sql/server/sql_parser.y
Branch: Jun2020-decimals
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
@@ -83,8 +83,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++;
@@ -100,8 +102,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
@@ -4747,21 +4747,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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list