Changeset: 95d047224cae for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=95d047224cae Modified Files: sql/server/rel_select.c sql/test/miscellaneous/Tests/simple_selects.sql sql/test/miscellaneous/Tests/simple_selects.stable.err Branch: Oct2020 Log Message:
Prevent overflow in the number of digits diffs (44 lines): diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c --- a/sql/server/rel_select.c +++ b/sql/server/rel_select.c @@ -2891,6 +2891,8 @@ rel_binop_(mvc *sql, sql_rel *rel, sql_e } else if (f->func->fix_scale == DIGITS_ADD) { sql_subtype *res = f->res->h->data; res->digits = (t1->digits && t2->digits)?t1->digits + t2->digits:0; + if (res->digits >= (unsigned int) INT_MAX) + return sql_error(sql, 02, SQLSTATE(42000) "SELECT: output number of digits for %s is too large", fname); } if (card == card_relation && l->card > CARD_ATOM) { sql_subfunc *zero_or_one = sql_bind_func(sql->sa, sql->session->schema, "zero_or_one", exp_subtype(l), NULL, F_AGGR); @@ -2992,6 +2994,8 @@ rel_binop_(mvc *sql, sql_rel *rel, sql_e } else if (f->func->fix_scale == DIGITS_ADD) { sql_subtype *res = f->res->h->data; res->digits = (t1->digits && t2->digits)?t1->digits + t2->digits:0; + if (res->digits >= (unsigned int) INT32_MAX) + return sql_error(sql, 02, SQLSTATE(42000) "SELECT: output number of digits for %s is too large", fname); } return exp_binop(sql->sa, l, r, f); } diff --git a/sql/test/miscellaneous/Tests/simple_selects.sql b/sql/test/miscellaneous/Tests/simple_selects.sql --- a/sql/test/miscellaneous/Tests/simple_selects.sql +++ b/sql/test/miscellaneous/Tests/simple_selects.sql @@ -203,3 +203,5 @@ select * from (select 1 as c0, 2 as c0) select cast(interval '3' second as clob); -- 3.000 + +select cast(13121 as varchar(2147483647)) || cast(231231 as varchar(2147483647)); --error, too big diff --git a/sql/test/miscellaneous/Tests/simple_selects.stable.err b/sql/test/miscellaneous/Tests/simple_selects.stable.err --- a/sql/test/miscellaneous/Tests/simple_selects.stable.err +++ b/sql/test/miscellaneous/Tests/simple_selects.stable.err @@ -262,6 +262,10 @@ MAPI = (monetdb) /var/tmp/mtest-518219/ QUERY = select cast(92233720368547750 as interval second); --error, overflow in conversion for interval second ERROR = !types bigint(57,0) and sec_interval(13,0) are not equal CODE = 42000 +MAPI = (monetdb) /var/tmp/mtest-493793/.s.monetdb.35088 +QUERY = select cast(13121 as varchar(2147483647)) || cast(231231 as varchar(2147483647)); --error, too big +ERROR = !SELECT: output number of digits for concat is too large +CODE = 42000 # 17:31:38 > # 17:31:38 > "Done." _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list