Changeset: 60982c3d58a2 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=60982c3d58a2
Modified Files:
sql/common/sql_types.c
sql/server/rel_select.c
sql/test/ADT2006/Tests/woud.stable.out
sql/test/BugDay_2005-10-06_2.9.3/Tests/CrashMe_SQL_server_crash-2.SF-921673.stable.out
sql/test/BugDay_2005-10-06_2.9.3/Tests/custom_function_in_where.SF-937859.stable.out
sql/test/BugDay_2005-10-06_2.9.3/Tests/huge_expression_and_column_name.SF-921173.stable.out
sql/test/BugTracker-2008/Tests/auto_coersion_bug.SF-2075157.stable.out
sql/test/BugTracker-2009/Tests/Division_by_zero_error.SF-2791361.stable.out
sql/test/BugTracker-2009/Tests/Floating_point_exception.SF-2791356.stable.out
sql/test/BugTracker-2009/Tests/count_bug.SF-2604583.stable.out
sql/test/BugTracker-2009/Tests/push_select_down_crash.stable.out
sql/test/BugTracker-2011/Tests/CASE_division_exception.Bug-2822.sql
sql/test/BugTracker-2011/Tests/CASE_division_exception.Bug-2822.stable.out
sql/test/BugTracker-2011/Tests/CASE_nested_functions.Bug-2852.stable.out
sql/test/BugTracker-2011/Tests/case-overflow.Bug-2239.stable.out
sql/test/BugTracker-2011/Tests/non-stable-select-bug.Bug-2894.stable.out
sql/test/BugTracker/Tests/insert_date.SF-1838785.stable.err
sql/test/bugs/Tests/cast_bool2int-bug-sf-951800.stable.out
sql/test/bugs/Tests/create_insert_select_aggr-bug-00001.stable.out
sql/test/bugs/Tests/view_case-bug-sf-1023058.stable.out
sql/test/leaks/Tests/check0.stable.out
sql/test/xquery/Tests/q01.stable.out
Branch: Dec2011
Log Message:
overflow protection for addition and substraction (ie scale up to larger types)
diffs (truncated from 310 to 300 lines):
diff --git a/sql/common/sql_types.c b/sql/common/sql_types.c
--- a/sql/common/sql_types.c
+++ b/sql/common/sql_types.c
@@ -192,6 +192,8 @@ sql_find_numeric(sql_subtype *r, int loc
localtype = TYPE_dbl;
} else {
localtype = TYPE_lng;
+ if (digits > 64)
+ digits = 64;
}
for (n = types->h; n; n = n->next) {
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
@@ -3238,6 +3238,9 @@ rel_unop(mvc *sql, sql_rel **rel, symbol
}
+#define is_addition(fname) (strcmp(fname, "sql_add") == 0)
+#define is_substraction(fname) (strcmp(fname, "sql_sub") == 0)
+
sql_exp *
rel_binop_(mvc *sql, sql_exp *l, sql_exp *r, sql_schema *s,
char *fname, int card)
@@ -3260,7 +3263,18 @@ rel_binop_(mvc *sql, sql_exp *l, sql_exp
}
if (!t1 || !t2)
return sql_error(sql, 01, "Cannot have a parameter (?) on both
sides of an expression");
-
+
+ if ((is_addition(fname) || is_substraction(fname)) && t1->type->eclass
== EC_NUM && t2->type->eclass == EC_NUM) {
+ sql_subtype ntp;
+
+ sql_find_numeric(&ntp, t1->type->localtype, t1->digits+1);
+ l = rel_check_type(sql, &ntp, l, type_equal);
+ sql_find_numeric(&ntp, t2->type->localtype, t2->digits+1);
+ r = rel_check_type(sql, &ntp, r, type_equal);
+ t1 = exp_subtype(l);
+ t2 = exp_subtype(r);
+ }
+
f = sql_bind_func(sql->sa, s, fname, t1, t2, type);
if (!f && is_commutative(fname)) {
f = sql_bind_func(sql->sa, s, fname, t2, t1, type);
diff --git a/sql/test/ADT2006/Tests/woud.stable.out
b/sql/test/ADT2006/Tests/woud.stable.out
--- a/sql/test/ADT2006/Tests/woud.stable.out
+++ b/sql/test/ADT2006/Tests/woud.stable.out
@@ -62,7 +62,7 @@ Ready.
% 0, 0 # length
% sys. # table_name
% substring_murderdate # name
-% int # type
+% bigint # type
% 1 # length
% . # table_name
% L5 # name
diff --git
a/sql/test/BugDay_2005-10-06_2.9.3/Tests/CrashMe_SQL_server_crash-2.SF-921673.stable.out
b/sql/test/BugDay_2005-10-06_2.9.3/Tests/CrashMe_SQL_server_crash-2.SF-921673.stable.out
---
a/sql/test/BugDay_2005-10-06_2.9.3/Tests/CrashMe_SQL_server_crash-2.SF-921673.stable.out
+++
b/sql/test/BugDay_2005-10-06_2.9.3/Tests/CrashMe_SQL_server_crash-2.SF-921673.stable.out
@@ -45,7 +45,7 @@ Ready.
# null AS SCOPE_TABLE
% ., .schemas, .tables, .columns, .columns,
.columns, .columns, ., ., ., ., .columns,
., ., ., ., ., ., . # table_name
% table_cat, table_schem, table_name, column_name, type_name,
column_size, decimal_digits, buffer_length, num_prec_radix, nullable,
remarks, column_def, sql_data_type, sql_datetime_sub,
char_octet_length, ordinal_position, scope_catalog, scope_schema,
scope_table # name
-% char, varchar, varchar, varchar, varchar,
int, int, tinyint, tinyint, char, char, varchar,
tinyint, tinyint, tinyint, int, char, char, char #
type
+% char, varchar, varchar, varchar, varchar,
int, int, tinyint, tinyint, char, char, varchar,
tinyint, tinyint, tinyint, bigint, char, char, char #
type
% 0, 3, 9, 12, 7, 4, 1, 1, 2, 0,
0, 0, 1, 1, 1, 2, 0, 0, 0 # length
[ NULL, "sys", "args", "id", "int", 32, 0, 0, 10,
NULL, NULL, NULL, 0, 0, 0, 1, NULL, NULL, NULL
]
[ NULL, "sys", "args", "func_id", "int", 32, 0, 0,
10, NULL, NULL, NULL, 0, 0, 0, 2, NULL, NULL,
NULL ]
diff --git
a/sql/test/BugDay_2005-10-06_2.9.3/Tests/custom_function_in_where.SF-937859.stable.out
b/sql/test/BugDay_2005-10-06_2.9.3/Tests/custom_function_in_where.SF-937859.stable.out
---
a/sql/test/BugDay_2005-10-06_2.9.3/Tests/custom_function_in_where.SF-937859.stable.out
+++
b/sql/test/BugDay_2005-10-06_2.9.3/Tests/custom_function_in_where.SF-937859.stable.out
@@ -21,7 +21,7 @@ Ready.
[ 4 ]
% sys. # table_name
% sql_sub_char_length_s # name
-% int # type
+% bigint # type
% 1 # length
[ 0 ]
[ 0 ]
diff --git
a/sql/test/BugDay_2005-10-06_2.9.3/Tests/huge_expression_and_column_name.SF-921173.stable.out
b/sql/test/BugDay_2005-10-06_2.9.3/Tests/huge_expression_and_column_name.SF-921173.stable.out
---
a/sql/test/BugDay_2005-10-06_2.9.3/Tests/huge_expression_and_column_name.SF-921173.stable.out
+++
b/sql/test/BugDay_2005-10-06_2.9.3/Tests/huge_expression_and_column_name.SF-921173.stable.out
@@ -28,7 +28,7 @@ Ready.
#select
1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1
% . # table_name
% sql_add_single_value # name
-% int # type
+% bigint # type
% 4 # length
[ 2001 ]
diff --git
a/sql/test/BugTracker-2008/Tests/auto_coersion_bug.SF-2075157.stable.out
b/sql/test/BugTracker-2008/Tests/auto_coersion_bug.SF-2075157.stable.out
--- a/sql/test/BugTracker-2008/Tests/auto_coersion_bug.SF-2075157.stable.out
+++ b/sql/test/BugTracker-2008/Tests/auto_coersion_bug.SF-2075157.stable.out
@@ -38,7 +38,7 @@ Ready.
[ 1 ]
% sys. # table_name
% sql_add_sql_neg_col2 # name
-% int # type
+% bigint # type
% 4 # length
[ 3000 ]
diff --git
a/sql/test/BugTracker-2009/Tests/Division_by_zero_error.SF-2791361.stable.out
b/sql/test/BugTracker-2009/Tests/Division_by_zero_error.SF-2791361.stable.out
---
a/sql/test/BugTracker-2009/Tests/Division_by_zero_error.SF-2791361.stable.out
+++
b/sql/test/BugTracker-2009/Tests/Division_by_zero_error.SF-2791361.stable.out
@@ -50,7 +50,7 @@ Ready.
#select case when (2 - 2) > 0 then (3 - 2)/(2 - 2) else 0 end as "test";
% . # table_name
% test # name
-% tinyint # type
+% smallint # type
% 1 # length
[ 0 ]
diff --git
a/sql/test/BugTracker-2009/Tests/Floating_point_exception.SF-2791356.stable.out
b/sql/test/BugTracker-2009/Tests/Floating_point_exception.SF-2791356.stable.out
---
a/sql/test/BugTracker-2009/Tests/Floating_point_exception.SF-2791356.stable.out
+++
b/sql/test/BugTracker-2009/Tests/Floating_point_exception.SF-2791356.stable.out
@@ -27,7 +27,7 @@ Ready.
[ 1 ]
% sys. # table_name
% isnull_>_sql_sub_bla1 # name
-% int # type
+% bigint # type
% 1 # length
[ 0 ]
diff --git a/sql/test/BugTracker-2009/Tests/count_bug.SF-2604583.stable.out
b/sql/test/BugTracker-2009/Tests/count_bug.SF-2604583.stable.out
--- a/sql/test/BugTracker-2009/Tests/count_bug.SF-2604583.stable.out
+++ b/sql/test/BugTracker-2009/Tests/count_bug.SF-2604583.stable.out
@@ -36,7 +36,7 @@ Ready.
[ 7, 5 ]
% . # table_name
% L14 # name
-% wrd # type
+% bigint # type
% 1 # length
[ 2 ]
[ 3 ]
diff --git a/sql/test/BugTracker-2009/Tests/push_select_down_crash.stable.out
b/sql/test/BugTracker-2009/Tests/push_select_down_crash.stable.out
--- a/sql/test/BugTracker-2009/Tests/push_select_down_crash.stable.out
+++ b/sql/test/BugTracker-2009/Tests/push_select_down_crash.stable.out
@@ -46,7 +46,7 @@ Ready.
# WHEN 'blob' THEN 2
% ., .schemas, .tables, .columns, ., .columns,
.columns, .columns, ., ., ., ., .columns,
., ., ., ., ., ., ., ., . # table_name
% TABLE_CAT, TABLE_SCHEM, TABLE_NAME, COLUMN_NAME, DATA_TYPE,
TYPE_NAME, COLUMN_SIZE, DECIMAL_DIGITS, BUFFER_LENGTH, NUM_PREC_RADIX,
NULLABLE, REMARKS, COLUMN_DEF, SQL_DATA_TYPE,
SQL_DATETIME_SUB, CHAR_OCTET_LENGTH, ORDINAL_POSITION,
SCOPE_CATALOG, SCOPE_SCHEMA, SCOPE_TABLE, SOURCE_DATA_TYPE,
IS_NULLABLE # name
-% char, varchar, varchar, varchar, smallint,
varchar, int, int, tinyint, tinyint, int,
varchar, varchar, tinyint, tinyint, tinyint,
int, varchar, varchar, varchar, smallint, varchar
# type
+% char, varchar, varchar, varchar, smallint,
varchar, int, int, tinyint, tinyint, int,
varchar, varchar, tinyint, tinyint, tinyint,
bigint, varchar, varchar, varchar, smallint, varchar
# type
% 4, 0, 0, 0, 1, 0, 1, 1, 1, 1,
1, 0, 0, 1, 1, 1, 1, 0, 0, 0,
1, 0 # length
# 18:36:16 >
diff --git
a/sql/test/BugTracker-2011/Tests/CASE_division_exception.Bug-2822.sql
b/sql/test/BugTracker-2011/Tests/CASE_division_exception.Bug-2822.sql
--- a/sql/test/BugTracker-2011/Tests/CASE_division_exception.Bug-2822.sql
+++ b/sql/test/BugTracker-2011/Tests/CASE_division_exception.Bug-2822.sql
@@ -1,4 +1,4 @@
CREATE TABLE bug_2822 (c INT);
INSERT INTO bug_2822 VALUES (0);
-SELECT CASE WHEN (c = 0) THEN 0 ELSE (c / c + 1) END FROM bug_2822;
+SELECT CASE WHEN (c = 0) THEN 0 ELSE (c / (c + 1)) END FROM bug_2822;
DROP TABLE bug_2822;
diff --git
a/sql/test/BugTracker-2011/Tests/CASE_division_exception.Bug-2822.stable.out
b/sql/test/BugTracker-2011/Tests/CASE_division_exception.Bug-2822.stable.out
--- a/sql/test/BugTracker-2011/Tests/CASE_division_exception.Bug-2822.stable.out
+++ b/sql/test/BugTracker-2011/Tests/CASE_division_exception.Bug-2822.stable.out
@@ -31,7 +31,7 @@ Ready.
#SELECT CASE WHEN (c = 0) THEN 0 ELSE (c / c + 1) END FROM bug_2822;
% sys. # table_name
% ifthenelse_isnull_=_c # name
-% int # type
+% bigint # type
% 1 # length
[ 0 ]
#DROP TABLE bug_2822;
diff --git
a/sql/test/BugTracker-2011/Tests/CASE_nested_functions.Bug-2852.stable.out
b/sql/test/BugTracker-2011/Tests/CASE_nested_functions.Bug-2852.stable.out
--- a/sql/test/BugTracker-2011/Tests/CASE_nested_functions.Bug-2852.stable.out
+++ b/sql/test/BugTracker-2011/Tests/CASE_nested_functions.Bug-2852.stable.out
@@ -49,7 +49,7 @@ Ready.
# ;
% sys. # table_name
% not_isnull_sql_div_c # name
-% int # type
+% bigint # type
% 1 # length
[ 0 ]
#DROP TABLE t2852;
diff --git a/sql/test/BugTracker-2011/Tests/case-overflow.Bug-2239.stable.out
b/sql/test/BugTracker-2011/Tests/case-overflow.Bug-2239.stable.out
--- a/sql/test/BugTracker-2011/Tests/case-overflow.Bug-2239.stable.out
+++ b/sql/test/BugTracker-2011/Tests/case-overflow.Bug-2239.stable.out
@@ -64,7 +64,7 @@ Ready.
# (CASE WHEN station136 is NULL THEN 0 ELSE station136 END) +
% sys.t2239, sys. # table_name
% station136, isnull_station136 # name
-% smallint, int # type
+% smallint, bigint # type
% 4, 5 # length
[ 1214, 38848 ]
[ 1228, 39296 ]
diff --git
a/sql/test/BugTracker-2011/Tests/non-stable-select-bug.Bug-2894.stable.out
b/sql/test/BugTracker-2011/Tests/non-stable-select-bug.Bug-2894.stable.out
--- a/sql/test/BugTracker-2011/Tests/non-stable-select-bug.Bug-2894.stable.out
+++ b/sql/test/BugTracker-2011/Tests/non-stable-select-bug.Bug-2894.stable.out
@@ -51,7 +51,7 @@ Ready.
#select i,1/(i-1) from table2894 where i > 1;
% sys.table2894, . # table_name
% i, sql_div_single_value # name
-% int, int # type
+% int, bigint # type
% 1, 1 # length
[ 2, 1 ]
[ 3, 0 ]
@@ -67,7 +67,7 @@ Ready.
#select i,1/(i-1) from table2894 where i > 1;
% sys.table2894, . # table_name
% i, sql_div_single_value # name
-% int, int # type
+% int, bigint # type
% 1, 1 # length
[ 2, 1 ]
[ 3, 0 ]
diff --git a/sql/test/BugTracker/Tests/insert_date.SF-1838785.stable.err
b/sql/test/BugTracker/Tests/insert_date.SF-1838785.stable.err
--- a/sql/test/BugTracker/Tests/insert_date.SF-1838785.stable.err
+++ b/sql/test/BugTracker/Tests/insert_date.SF-1838785.stable.err
@@ -10,10 +10,10 @@ stderr of test 'insert_date.SF-1838785`
# 00:53:56 > mclient -lsql -umonetdb -Pmonetdb --host=koala --port=35202
# 00:53:56 >
-MAPI = monetdb@ottar:39647
+MAPI = monetdb@niels:35983
QUERY = insert into test1838785(id,name,date33)
values(669207071,'hlwP94fhemRqP7bpmvM5fbhlr855Q42yO5TTaafgMbm5pKiZskvclg3MkvcN2cpTOfOf1iOf0Wa98ddioVdU2xjdj47zYOpLbNagahw0v37Kjq0n5aOWKd1hc4jsQegTabzSZTfQlrUrSghmUrc7hj5znvk5glg06ht4jYbRPKcm4OxUzsVkP3iMa8SdZPgjsNPnTSP8eP2syaSWNldk0tshj4OyqwOcn5sgeNe7Qzcdeg4bv80NWneMi701eaamna2gXVhjitMQ5Zew9c4iVnSWV9P0ZgRoM8PjYaZP1M5u6qylYZL6dYa7Uj9qcgiZLqkkz8Z93udrN3ajahVughPqPTUZidP43f5RtiysbWimPXZx84TVcURZ52tWpYsc8oqnf0roQTVTjWO8viMR6o0mreQqMPcKhwr0LajKeb2PTgXufLijL3XvaaN0PVzudNzdwUs0bdU4R1ejVfjNaPa16q3pnfx3eaXVviUf8tz3M9bnf3sSnqxiPUf5XaOvuyrekssqenndbUycgh1QefhWiQgdzj5qWTb7kWe4SY7Zb0q5nTiWQoahcm6ibWaPLa7k0fUMTuf8KMk46fbpcqpwq3TzeQZh4tOyWf5sXuuKmUqeqTzeWbuTif9fi5agau4VgOLxgUqwhXSRixf69KPcrbUbbbrazTleVQrn3lXVTgxVOTbpeLpb6oiUVwfad5eeiLVf1TKiY5vbY5bghcsnN2ZV9Wx0dKus4zzVcsnxg8eSe0Teh6iczhLxmT0VKz3bOMu2R0yc5cLi9ue25eofMfs66dcoglrzogghfjfNNi15TkbMVUZw2yqhdyLy4i51el1geOVSQiXOSh0eK7PeQrb1T32YV25ThqishhxWiZnbdNf6frmaiSZ52utNrVlgsXdx8l1hb7p7NeeoqomXiflMWmmaLbr4rtOcgmv6gg5XizoNjOfuYu8PPSmfQRi
glh05iNMZim1KefLzvxi853uZv5d96ixrNVazyO42rfv7W8R1bV62y8zcc2qm',1957-08-01);
-ERROR = !types smallint(16,0) and date(0,0) are not equal
+ERROR = !types bigint(64,0) and date(0,0) are not equal
# 00:53:56 >
# 00:53:56 > Done.
diff --git a/sql/test/bugs/Tests/cast_bool2int-bug-sf-951800.stable.out
b/sql/test/bugs/Tests/cast_bool2int-bug-sf-951800.stable.out
--- a/sql/test/bugs/Tests/cast_bool2int-bug-sf-951800.stable.out
+++ b/sql/test/bugs/Tests/cast_bool2int-bug-sf-951800.stable.out
@@ -33,7 +33,7 @@ Ready.
[ false ]
% sys. # table_name
% sql_add_<_i # name
-% int # type
+% bigint # type
% 1 # length
[ 2 ]
[ 1 ]
diff --git a/sql/test/bugs/Tests/create_insert_select_aggr-bug-00001.stable.out
b/sql/test/bugs/Tests/create_insert_select_aggr-bug-00001.stable.out
--- a/sql/test/bugs/Tests/create_insert_select_aggr-bug-00001.stable.out
+++ b/sql/test/bugs/Tests/create_insert_select_aggr-bug-00001.stable.out
@@ -68,7 +68,7 @@ Ready.
[ 2, "Jochem" ]
% . # table_name
% sql_sub_single_value # name
-% smallint # type
+% int # type
% 2 # length
[ 15 ]
% sys._tables, sys._tables, sys._tables, sys._tables, sys._tables #
table_name
diff --git a/sql/test/bugs/Tests/view_case-bug-sf-1023058.stable.out
b/sql/test/bugs/Tests/view_case-bug-sf-1023058.stable.out
--- a/sql/test/bugs/Tests/view_case-bug-sf-1023058.stable.out
+++ b/sql/test/bugs/Tests/view_case-bug-sf-1023058.stable.out
@@ -20,7 +20,7 @@ Ready.
% sys.metadata, sys.metadata, sys.metadata, sys.metadata,
sys.metadata, sys.metadata # table_name
% artist, album, track, tracknum, duration, weightindex #
name
-% varchar, varchar, varchar, int, int, tinyint # type
+% varchar, varchar, varchar, int, int, bigint # type
% 0, 0, 0, 1, 1, 1 # length
# 11:55:42 >
diff --git a/sql/test/leaks/Tests/check0.stable.out
b/sql/test/leaks/Tests/check0.stable.out
--- a/sql/test/leaks/Tests/check0.stable.out
+++ b/sql/test/leaks/Tests/check0.stable.out
@@ -46,6 +46,7 @@ Ready.
[ "oid", "int", 3163 ]
[ "oid", "int", 3163 ]
[ "oid", "int", 3163 ]
+[ "oid", "lng", 0 ]
[ "oid", "lng", 19 ]
[ "oid", "str", 1 ]
[ "oid", "str", 1 ]
@@ -60,13 +61,13 @@ Ready.
% L1, L2 # name
% char, wrd # type
% 9, 3 # length
-[ "transient", 487 ]
+[ "transient", 486 ]
#select 'persistent', count(*) from bbp() as bbp where kind like 'pers%';
% .L3, .bbp # table_name
% L3, L4 # name
% char, wrd # type
% 10, 2 # length
-[ "persistent", 24 ]
+[ "persistent", 25 ]
# 22:02:15 >
# 22:02:15 > Done.
diff --git a/sql/test/xquery/Tests/q01.stable.out
b/sql/test/xquery/Tests/q01.stable.out
--- a/sql/test/xquery/Tests/q01.stable.out
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list