Changeset: aebfa751b214 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=aebfa751b214
Added Files:
        sql/test/BugTracker-2015/Tests/useless_casts.Bug-3756.sql
        sql/test/BugTracker-2015/Tests/useless_casts.Bug-3756.stable.err
        sql/test/BugTracker-2015/Tests/useless_casts.Bug-3756.stable.out
Modified Files:
        sql/include/sql_relation.h
        sql/server/rel_exp.c
        sql/server/rel_exp.h
        sql/server/rel_optimizer.c
        sql/test/BugTracker-2015/Tests/All
Branch: Jul2015
Log Message:

fixed bug 3756, ie incase of up casts and comparisons with a simple atom 
(literal or stacked)
we convert to < max (of smaller type) of > max (of smaller type)


diffs (truncated from 630 to 300 lines):

diff --git a/sql/include/sql_relation.h b/sql/include/sql_relation.h
--- a/sql/include/sql_relation.h
+++ b/sql/include/sql_relation.h
@@ -148,6 +148,9 @@ typedef enum operator_type {
 
 #define is_atom(et) \
        (et == e_atom)
+/* a simple atom is a literal or on the query stack */
+#define is_simple_atom(e) \
+       (is_atom(e->flag) && !e->r && !e->f)
 #define is_func(et) \
        (et == e_func)
 #define is_map_op(et) \
diff --git a/sql/server/rel_exp.c b/sql/server/rel_exp.c
--- a/sql/server/rel_exp.c
+++ b/sql/server/rel_exp.c
@@ -174,6 +174,26 @@ exp_atom(sql_allocator *sa, atom *a)
 }
 
 sql_exp *
+exp_atom_max(sql_allocator *sa, sql_subtype *tpe) 
+{
+
+       if (tpe->type->localtype == TYPE_bte) {
+               return exp_atom_bte(sa, GDK_bte_max);
+       } else if (tpe->type->localtype == TYPE_sht) {
+               return exp_atom_sht(sa, GDK_sht_max);
+       } else if (tpe->type->localtype == TYPE_int) {
+               return exp_atom_int(sa, GDK_int_max);
+       } else if (tpe->type->localtype == TYPE_lng) {
+               return exp_atom_lng(sa, GDK_lng_max);
+#ifdef HAVE_HGE
+       } else if (tpe->type->localtype == TYPE_lng) {
+               return exp_atom_hge(sa, GDK_hge_max);
+#endif
+       }
+       return NULL;
+}
+
+sql_exp *
 exp_atom_bool(sql_allocator *sa, int b) 
 {
        sql_subtype bt; 
@@ -186,6 +206,24 @@ exp_atom_bool(sql_allocator *sa, int b)
 }
 
 sql_exp *
+exp_atom_bte(sql_allocator *sa, bte i) 
+{
+       sql_subtype it; 
+
+       sql_find_subtype(&it, "tinyint", 3, 0);
+       return exp_atom(sa, atom_int(sa, &it, i ));
+}
+
+sql_exp *
+exp_atom_sht(sql_allocator *sa, sht i) 
+{
+       sql_subtype it; 
+
+       sql_find_subtype(&it, "smallint", 5, 0);
+       return exp_atom(sa, atom_int(sa, &it, i ));
+}
+
+sql_exp *
 exp_atom_int(sql_allocator *sa, int i) 
 {
        sql_subtype it; 
diff --git a/sql/server/rel_exp.h b/sql/server/rel_exp.h
--- a/sql/server/rel_exp.h
+++ b/sql/server/rel_exp.h
@@ -39,7 +39,10 @@ extern sql_exp *exp_aggr(sql_allocator *
 #define exp_aggr1(sa, e, a, d, n, c, hn) \
        exp_aggr(sa, append(new_exp_list(sa), e), a, d, n, c, hn)
 extern sql_exp * exp_atom(sql_allocator *sa, atom *a);
+extern sql_exp * exp_atom_max(sql_allocator *sa, sql_subtype *tpe);
 extern sql_exp * exp_atom_bool(sql_allocator *sa, int b); 
+extern sql_exp * exp_atom_bte(sql_allocator *sa, bte i);
+extern sql_exp * exp_atom_sht(sql_allocator *sa, sht i);
 extern sql_exp * exp_atom_int(sql_allocator *sa, int i);
 extern sql_exp * exp_atom_lng(sql_allocator *sa, lng l);
 #ifdef HAVE_HGE
diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c
--- a/sql/server/rel_optimizer.c
+++ b/sql/server/rel_optimizer.c
@@ -6101,18 +6101,37 @@ rel_reduce_casts(int *changes, mvc *sql,
                        sql_exp *re = e->r;
        
                        /* handle the and's in the or lists */
-                       if (e->type != e_cmp || 
-                          (e->flag != cmp_lt && e->flag != cmp_gt)) 
+                       if (e->type != e_cmp || !is_theta_exp(e->flag) || e->f)
                                continue;
-                       /* rewrite e if left or right is cast */
+                       /* rewrite e if left or right is a cast */
                        if (le->type == e_convert || re->type == e_convert) {
                                sql_rel *r = rel->r;
-
+                               sql_subtype *st = exp_subtype(re);
+
+                               /* e_convert(le) ==, <(=), >(=), !=  
e_atom(re), conversion between integers only */
+                               if (le->type == e_convert && is_simple_atom(re) 
&& st->type->eclass == EC_NUM) {
+                                       sql_subtype *tt = exp_totype(le);
+                                       sql_subtype *ft = exp_fromtype(le);
+
+                                       if (tt->type->eclass != EC_NUM || 
ft->type->eclass != EC_NUM || tt->type->localtype < ft->type->localtype)
+                                               continue;
+
+                                       /* tt->type larger then tt->type, ie 
empty result, ie change into > max */
+                                       re = exp_atom_max( sql->sa, ft);
+                                       if (!re)
+                                               continue;
+                                       /* the ==, > and >=  change to l > max, 
the !=, < and <=  change to l < max */
+                                       if (e->flag == cmp_equal || e->flag == 
cmp_gt || e->flag == cmp_gte)
+                                               e = exp_compare(sql->sa, le->l, 
re, cmp_gt);
+                                       else
+                                               e = exp_compare(sql->sa, le->l, 
re, cmp_lt);
+                                       sql->caching = 0;
+                               } else
                                /* if convert on left then find
                                 * mul or div on right which increased
                                 * scale!
                                 */
-                               if (le->type == e_convert && re->type == 
e_column && r && is_project(r->op)) {
+                               if (le->type == e_convert && re->type == 
e_column && (e->flag == cmp_lt || e->flag == cmp_gt) && r && is_project(r->op)) 
{
                                        sql_exp *nre = rel_find_exp(r, re);
                                        sql_subtype *tt = exp_totype(le);
                                        sql_subtype *ft = exp_fromtype(le);
diff --git a/sql/test/BugTracker-2015/Tests/All 
b/sql/test/BugTracker-2015/Tests/All
--- a/sql/test/BugTracker-2015/Tests/All
+++ b/sql/test/BugTracker-2015/Tests/All
@@ -50,3 +50,4 @@ cast_on_groupby_col_crash.Bug-3769
 apply_merge_distinct.Bug-3760
 cardinality.Bug-3761
 set_default_role.Bug-3364
+useless_casts.Bug-3756
diff --git a/sql/test/BugTracker-2015/Tests/useless_casts.Bug-3756.sql 
b/sql/test/BugTracker-2015/Tests/useless_casts.Bug-3756.sql
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2015/Tests/useless_casts.Bug-3756.sql
@@ -0,0 +1,22 @@
+create table test(value int);
+insert into test values (1), (2), (3);
+
+select * from test where value = 12345678900; # value > INT_MAX
+explain select * from test where value = 1; # value < INT_MAX
+
+select * from test where value > 12345678900; # value > INT_MAX
+explain select * from test where value > 1; # value < INT_MAX
+
+select * from test where value >= 12345678900; # value > INT_MAX
+explain select * from test where value >= 1; # value < INT_MAX
+
+select * from test where value < 12345678900; # value > INT_MAX
+explain select * from test where value < 1; # value < INT_MAX
+
+select * from test where value <= 12345678900; # value > INT_MAX
+explain select * from test where value <= 1; # value < INT_MAX
+
+select * from test where value <> 12345678900; # value > INT_MAX
+explain select * from test where value <> 1; # value < INT_MAX
+
+drop table test;
diff --git a/sql/test/BugTracker-2015/Tests/useless_casts.Bug-3756.stable.err 
b/sql/test/BugTracker-2015/Tests/useless_casts.Bug-3756.stable.err
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2015/Tests/useless_casts.Bug-3756.stable.err
@@ -0,0 +1,37 @@
+stderr of test 'useless_casts.Bug-3756` in directory 
'sql/test/BugTracker-2015` itself:
+
+
+# 21:57:13 >  
+# 21:57:13 >  "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" 
"mapi_open=true" "--set" "mapi_port=33119" "--set" 
"mapi_usock=/var/tmp/mtest-22263/.s.monetdb.33119" "--set" "monet_prompt=" 
"--forcemito" "--set" "mal_listing=2" 
"--dbpath=/home/niels/scratch/rc-monetdb/Linux-x86_64/var/MonetDB/mTests_sql_test_BugTracker-2015"
 "--set" "mal_listing=0" "--set" "embedded_r=yes"
+# 21:57:13 >  
+
+# builtin opt  gdk_dbpath = 
/home/niels/scratch/rc-monetdb/Linux-x86_64/var/monetdb5/dbfarm/demo
+# builtin opt  gdk_debug = 0
+# builtin opt  gdk_vmtrim = no
+# builtin opt  monet_prompt = >
+# builtin opt  monet_daemon = no
+# builtin opt  mapi_port = 50000
+# builtin opt  mapi_open = false
+# builtin opt  mapi_autosense = false
+# builtin opt  sql_optimizer = default_pipe
+# builtin opt  sql_debug = 0
+# cmdline opt  gdk_nr_threads = 0
+# cmdline opt  mapi_open = true
+# cmdline opt  mapi_port = 33119
+# cmdline opt  mapi_usock = /var/tmp/mtest-22263/.s.monetdb.33119
+# cmdline opt  monet_prompt = 
+# cmdline opt  mal_listing = 2
+# cmdline opt  gdk_dbpath = 
/home/niels/scratch/rc-monetdb/Linux-x86_64/var/MonetDB/mTests_sql_test_BugTracker-2015
+# cmdline opt  mal_listing = 0
+# cmdline opt  embedded_r = yes
+# cmdline opt  gdk_debug = 536870922
+
+# 21:57:14 >  
+# 21:57:14 >  "mclient" "-lsql" "-ftest" "-Eutf-8" "-i" "-e" 
"--host=/var/tmp/mtest-22263" "--port=33119"
+# 21:57:14 >  
+
+
+# 21:57:14 >  
+# 21:57:14 >  "Done."
+# 21:57:14 >  
+
diff --git a/sql/test/BugTracker-2015/Tests/useless_casts.Bug-3756.stable.out 
b/sql/test/BugTracker-2015/Tests/useless_casts.Bug-3756.stable.out
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2015/Tests/useless_casts.Bug-3756.stable.out
@@ -0,0 +1,420 @@
+stdout of test 'useless_casts.Bug-3756` in directory 
'sql/test/BugTracker-2015` itself:
+
+
+# 21:57:13 >  
+# 21:57:13 >  "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" 
"mapi_open=true" "--set" "mapi_port=33119" "--set" 
"mapi_usock=/var/tmp/mtest-22263/.s.monetdb.33119" "--set" "monet_prompt=" 
"--forcemito" "--set" "mal_listing=2" 
"--dbpath=/home/niels/scratch/rc-monetdb/Linux-x86_64/var/MonetDB/mTests_sql_test_BugTracker-2015"
 "--set" "mal_listing=0" "--set" "embedded_r=yes"
+# 21:57:13 >  
+
+# MonetDB 5 server v11.21.0
+# This is an unreleased version
+# Serving database 'mTests_sql_test_BugTracker-2015', using 4 threads
+# Compiled for x86_64-unknown-linux-gnu/64bit with 64bit OIDs and 128bit 
integers dynamically linked
+# Found 7.333 GiB available main-memory.
+# Copyright (c) 1993-July 2008 CWI.
+# Copyright (c) August 2008-2015 MonetDB B.V., all rights reserved
+# Visit http://www.monetdb.org/ for further information
+# Listening for connection requests on mapi:monetdb://localhost.nes.nl:33119/
+# Listening for UNIX domain connection requests on 
mapi:monetdb:///var/tmp/mtest-22263/.s.monetdb.33119
+# MonetDB/GIS module loaded
+# Start processing logs sql/sql_logs version 52200
+# Start reading the write-ahead log 'sql_logs/sql/log.34'
+# Finished reading the write-ahead log 'sql_logs/sql/log.34'
+# Finished processing logs sql/sql_logs
+# MonetDB/SQL module loaded
+# MonetDB/R   module loaded
+
+Ready.
+
+# 21:57:14 >  
+# 21:57:14 >  "mclient" "-lsql" "-ftest" "-Eutf-8" "-i" "-e" 
"--host=/var/tmp/mtest-22263" "--port=33119"
+# 21:57:14 >  
+
+#create table test(value int);
+#insert into test values (1), (2), (3);
+[ 3    ]
+#select * from test where value = 12345678900; # value > INT_MAX
+% sys.test # table_name
+% value # name
+% int # type
+% 1 # length
+#explain select * from test where value = 1; # value < INT_MAX
+% .explain # table_name
+% mal # name
+% clob # type
+% 98 # length
+function user.s3_1{autoCommit=true}(A0:int):void;
+    X_35:void := querylog.define("explain select * from test where value = 
1;","default_pipe",24);
+    X_19 := bat.new(nil:oid,nil:str);
+    X_27 := bat.append(X_19,"sys.test");
+    X_22 := bat.new(nil:oid,nil:str);
+    X_29 := bat.append(X_22,"value");
+    X_23 := bat.new(nil:oid,nil:str);
+    X_30 := bat.append(X_23,"int");
+    X_24 := bat.new(nil:oid,nil:int);
+    X_32 := bat.append(X_24,32);
+    X_26 := bat.new(nil:oid,nil:int);
+    X_34 := bat.append(X_26,0);
+    X_3 := sql.mvc();
+    X_7:bat[:oid,:int] := sql.bind(X_3,"sys","test","value",0);
+    X_4:bat[:oid,:oid] := sql.tid(X_3,"sys","test");
+    X_49 := algebra.subselect(X_7,X_4,A0,A0,true,false,false);
+    (X_10,r1_10) := sql.bind(X_3,"sys","test","value",2);
+    X_50 := algebra.subselect(r1_10,nil:bat[:oid,:oid],A0,A0,true,false,false);
+    X_13:bat[:oid,:int] := sql.bind(X_3,"sys","test","value",1);
+    X_52 := algebra.subselect(X_13,X_4,A0,A0,true,false,false);
+    X_15 := sql.subdelta(X_49,X_4,X_10,X_50,X_52);
+    X_17 := sql.projectdelta(X_15,X_7,X_10,r1_10,X_13);
+    sql.resultSet(X_27,X_29,X_30,X_32,X_34,X_17);
+end user.s3_1;
+# optimizer.mitosis()
+# optimizer.dataflow()
+#select * from test where value > 12345678900; # value > INT_MAX
+% sys.test # table_name
+% value # name
+% int # type
+% 1 # length
+#explain select * from test where value > 1; # value < INT_MAX
+% .explain # table_name
+% mal # name
+% clob # type
+% 98 # length
+function user.s4_1{autoCommit=true}(A0:int):void;
+    X_30:void := querylog.define("explain select * from test where value > 
1;","default_pipe",57);
+barrier X_91 := language.dataflow();
+    X_14 := bat.new(nil:oid,nil:str);
+    X_22 := bat.append(X_14,"sys.test");
+    X_17 := bat.new(nil:oid,nil:str);
+    X_24 := bat.append(X_17,"value");
+    X_18 := bat.new(nil:oid,nil:str);
+    X_25 := bat.append(X_18,"int");
+    X_19 := bat.new(nil:oid,nil:int);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to