Changeset: f56867ac0880 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=f56867ac0880
Modified Files:
sql/common/sql_types.c
sql/server/rel_select.c
sql/server/sql_atom.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/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/default-interval.Bug-2877.stable.out
sql/test/BugTracker-2011/Tests/non-stable-select-bug.Bug-2894.stable.out
sql/test/BugTracker-2011/Tests/sqltables.Bug-2921.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/order_disjunctive_bug.SF-1338309.sql
sql/test/bugs/Tests/view_case-bug-sf-1023058.stable.out
Branch: Aug2011
Log Message:
backported 2 fixes
1) overflow protection
2) and truncating decimals
diffs (truncated from 351 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
@@ -3060,6 +3060,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)
@@ -3082,6 +3085,17 @@ 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);
if (!f && is_commutative(fname)) {
f = sql_bind_func(sql->sa, s, fname, t2, t1);
diff --git a/sql/server/sql_atom.c b/sql/server/sql_atom.c
--- a/sql/server/sql_atom.c
+++ b/sql/server/sql_atom.c
@@ -652,6 +652,52 @@ atom_cast(atom *a, sql_subtype *tp)
}
return 1;
}
+ /* truncating decimals */
+ if (at->type->eclass == EC_DEC && tp->type->eclass == EC_DEC &&
+ at->type->localtype >= tp->type->localtype &&
+ at->digits >= tp->digits &&
+ (at->digits - tp->digits) == (at->scale - tp->scale)) {
+ lng mul = 1, div = 0, rnd = 0, val = 0;
+
+ /* fix scale */
+
+ /* only round when going to a lower scale */
+ mul = scales[at->scale-tp->scale];
+ rnd = mul>>1;
+ div = 1;
+
+ if (a->data.vtype == TYPE_lng) {
+ val = a->data.val.lval;
+ } else if (a->data.vtype == TYPE_int) {
+ val = a->data.val.ival;
+ } else if (a->data.vtype == TYPE_sht) {
+ val = a->data.val.shval;
+ } else if (a->data.vtype == TYPE_bte) {
+ val = a->data.val.btval;
+ }
+
+ val += rnd;
+ if (div)
+ val /= mul;
+ else
+ val *= mul;
+
+ a->tpe = *tp;
+ a->data.vtype = tp->type->localtype;
+ if (a->data.vtype == TYPE_lng) {
+ a->data.val.lval = (int) val;
+ } else if (a->data.vtype == TYPE_int) {
+ assert( ((lng) GDK_int_min <= val && val <=
(lng) GDK_int_max));
+ a->data.val.ival = (int) val;
+ } else if (a->data.vtype == TYPE_sht) {
+ assert( ((lng) GDK_sht_min <= val && val <=
(lng) GDK_sht_max));
+ a->data.val.shval = (int) val;
+ } else if (a->data.vtype == TYPE_bte) {
+ assert( ((lng) GDK_bte_min <= val && val <=
(lng) GDK_bte_max));
+ a->data.val.btval = (int) val;
+ }
+ return 1;
+ }
if (at->type->eclass == EC_NUM && tp->type->eclass == EC_DEC &&
at->type->localtype <= tp->type->localtype &&
(at->digits <= tp->digits || atom_num_digits(a) <=
tp->digits) &&
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/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/default-interval.Bug-2877.stable.out
b/sql/test/BugTracker-2011/Tests/default-interval.Bug-2877.stable.out
--- a/sql/test/BugTracker-2011/Tests/default-interval.Bug-2877.stable.out
+++ b/sql/test/BugTracker-2011/Tests/default-interval.Bug-2877.stable.out
@@ -57,7 +57,7 @@ Ready.
% i, c1, c2 # name
% int, sec_interval, sec_interval # type
% 1, 0, 0 # length
-[ 1, 3600.000, 3600.000 ]
+[ 1, 3600, 3600 ]
#rollback;
# 12:40:50 >
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-2011/Tests/sqltables.Bug-2921.stable.out
b/sql/test/BugTracker-2011/Tests/sqltables.Bug-2921.stable.out
--- a/sql/test/BugTracker-2011/Tests/sqltables.Bug-2921.stable.out
+++ b/sql/test/BugTracker-2011/Tests/sqltables.Bug-2921.stable.out
@@ -49,7 +49,7 @@ Ready.
% .e, .s, .t, ., . # table_name
% table_cat, table_schem, table_name, table_type, remarks # name
% varchar, varchar, varchar, varchar, varchar # type
-% 27, 3, 7, 16, 0 # length
+% 27, 3, 8, 16, 0 # length
[ "mTests_test_BugTracker-2011", "tmp", "globtemp", "GLOBAL
TEMPORARY", NULL ]
[ "mTests_test_BugTracker-2011", "tmp", "loctemp", "LOCAL
TEMPORARY", NULL ]
#select e."value" as table_cat, s."name" as table_schem, t."name" as
table_name, case when t."type" = 0 and t."system" = false and t."temporary" = 0
and s."name" <> 'tmp' then cast('TABLE' as varchar(20)) when t."type" = 0 and
t."system" = false and t."temporary" = 0 and s."name" = 'tmp' then cast('GLOBAL
TEMPORARY' as varchar(20)) when t."type" = 0 and t."system" = true and
t."temporary" = 0 then cast('SYSTEM TABLE' as varchar(20)) when t."type" = 1
then cast('VIEW' as varchar(20)) when t."type" = 0 and t."system" = false and
t."temporary" = 1 then cast('LOCAL TEMPORARY' as varchar(20)) else
cast('INTERNAL TABLE TYPE' as varchar(20)) end as table_type, cast(null as
varchar(1)) as remarks from sys."schemas" s, sys."tables" t, sys."env"() e
where s."id" = t."schema_id" and e.name = 'gdk_dbname' and ((t."type" = 0 and
t."system" = false and t."temporary" = 0 and s."name" = 'tmp')) order by
table_type, table_schem, table_name;
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:39492
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 >
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list