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

Reply via email to