Changeset: 0da61133a6a0 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=0da61133a6a0
Modified Files:
        sql/server/rel_optimizer.c
        sql/server/sql_rel2bin.c
        sql/test/BugTracker-2011/Tests/All
        sql/test/BugTracker-2011/Tests/div_zero_problem.Bug-2893.sql
        sql/test/BugTracker-2011/Tests/div_zero_problem.Bug-2893.stable.err
        sql/test/BugTracker-2011/Tests/div_zero_problem.Bug-2893.stable.out
Branch: Aug2011
Log Message:

Make sure a simple x > 0 is handled before complex selection expressions with 
functions. This works around the problem of division by zero (but that realy 
isn't sql's fault). No a Bug 2893.


diffs (215 lines):

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
@@ -449,7 +449,7 @@ exp_count(int *cnt, int seqnr, sql_exp *
                        *cnt += c;
                        return c;
                }
-               case cmp_or: /* prefer union over like */
+               case cmp_or: /* prefer or over functions */
                        *cnt += 3;
                        return 3;
                default:
@@ -465,6 +465,10 @@ exp_count(int *cnt, int seqnr, sql_exp *
                /* functions are more expensive, depending on the number of 
columns involved. */ 
                *cnt -= 5*list_length(e->l);
                return 5*list_length(e->l);
+       case e_convert:
+               /* functions are more expensive, depending on the number of 
columns involved. */ 
+               if (e->card == CARD_ATOM)
+                       return 0;
        default:
                *cnt -= 5;
                return -5;
diff --git a/sql/server/sql_rel2bin.c b/sql/server/sql_rel2bin.c
--- a/sql/server/sql_rel2bin.c
+++ b/sql/server/sql_rel2bin.c
@@ -792,6 +792,13 @@ push_semijoin( mvc *sql, stmt *select, s
                op2 = push_semijoin(sql, op2, s);
                return stmt_union(sql->sa, op1, op2);
        }
+       if (select->type == st_mark) {
+               stmt *op1 = select->op1;
+               stmt *op2 = select->op2;
+
+               op1 = push_semijoin(sql, op1, s);
+               return stmt_mark_tail(sql->sa, op1, 
op2->op4.aval->data.val.oval);
+       }
 
        /* semijoin(reverse(semijoin(reverse(x)),s) */
        if (select->type == st_reverse &&
diff --git a/sql/test/BugTracker-2011/Tests/All 
b/sql/test/BugTracker-2011/Tests/All
--- a/sql/test/BugTracker-2011/Tests/All
+++ b/sql/test/BugTracker-2011/Tests/All
@@ -42,4 +42,5 @@ delete-large-table.Bug-2882
 HAVE_PERL?perl-table_info.Bug-2885
 div_by_zero.Bug-2887
 cast-crash.Bug-2678
+div_zero_problem.Bug-2893
 non-stable-select-bug.Bug-2894
diff --git a/sql/test/BugTracker-2011/Tests/div_zero_problem.Bug-2893.sql 
b/sql/test/BugTracker-2011/Tests/div_zero_problem.Bug-2893.sql
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2011/Tests/div_zero_problem.Bug-2893.sql
@@ -0,0 +1,17 @@
+create table catalog ( n int );
+insert into catalog values (1);
+insert into catalog values (2);
+select * from catalog;
+select * from catalog where n > 1;
+select t.n from (select * from catalog where n > 1) as t;
+select t.n from (select * from catalog where n > 1) as t where 1/(t.n-1) > 0;
+select t.n from (select * from catalog where n > 1) as t where t.n/(t.n-1) > 0;
+select t.n from (select * from catalog where n > 1) as t where 1/(t.n-1) > 0
+and t.n/(t.n-1) > 0;
+select t.n from (select * from catalog where n > 1) as t where t.n/(t.n-1) > 0
+and 1/(t.n-1) > 0;
+select t.n from (select * from catalog where n > 1) as t where t.n/(t.n-1) > 0
+or 1/(t.n-1) > 0;
+select t.n from (select * from catalog where n > 1) as t where 1/(t.n-1) > 0 or
+t.n/(t.n-1) > 0;
+drop table catalog;
diff --git 
a/sql/test/BugTracker-2011/Tests/div_zero_problem.Bug-2893.stable.err 
b/sql/test/BugTracker-2011/Tests/div_zero_problem.Bug-2893.stable.err
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2011/Tests/div_zero_problem.Bug-2893.stable.err
@@ -0,0 +1,37 @@
+stderr of test 'div_zero_problem.Bug-2893` in directory 'test/BugTracker-2011` 
itself:
+
+
+# 16:46:26 >  
+# 16:46:26 >   mserver5  --debug=10 --set gdk_nr_threads=0  --set 
"gdk_dbfarm=/home/niels/scratch/rc-clean/Linux-x86_64/var/MonetDB" --set 
mapi_open=true --set mapi_port=33988 --set monet_prompt= --trace --forcemito 
--set mal_listing=2  "--dbname=mTests_test_BugTracker-2011" --set mal_listing=0 
; echo ; echo Over..
+# 16:46:26 >  
+
+# builtin opt  gdk_dbname = demo
+# builtin opt  gdk_dbfarm = 
/home/niels/scratch/rc-clean/Linux-x86_64/var/monetdb5/dbfarm
+# builtin opt  gdk_debug = 0
+# builtin opt  gdk_alloc_map = no
+# builtin opt  gdk_vmtrim = yes
+# 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  gdk_dbfarm = 
/home/niels/scratch/rc-clean/Linux-x86_64/var/MonetDB
+# cmdline opt  mapi_open = true
+# cmdline opt  mapi_port = 33988
+# cmdline opt  monet_prompt = 
+# cmdline opt  mal_listing = 2
+# cmdline opt  gdk_dbname = mTests_test_BugTracker-2011
+# cmdline opt  mal_listing = 0
+
+# 16:46:27 >  
+# 16:46:27 >  mclient -lsql -ftest -i -e --host=niels --port=33988 
+# 16:46:27 >  
+
+
+# 16:46:27 >  
+# 16:46:27 >  Done.
+# 16:46:27 >  
+
diff --git 
a/sql/test/BugTracker-2011/Tests/div_zero_problem.Bug-2893.stable.out 
b/sql/test/BugTracker-2011/Tests/div_zero_problem.Bug-2893.stable.out
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2011/Tests/div_zero_problem.Bug-2893.stable.out
@@ -0,0 +1,97 @@
+stdout of test 'div_zero_problem.Bug-2893` in directory 'test/BugTracker-2011` 
itself:
+
+
+# 16:46:26 >  
+# 16:46:26 >   mserver5  --debug=10 --set gdk_nr_threads=0  --set 
"gdk_dbfarm=/home/niels/scratch/rc-clean/Linux-x86_64/var/MonetDB" --set 
mapi_open=true --set mapi_port=33988 --set monet_prompt= --trace --forcemito 
--set mal_listing=2  "--dbname=mTests_test_BugTracker-2011" --set mal_listing=0 
; echo ; echo Over..
+# 16:46:26 >  
+
+# MonetDB 5 server v11.5.4
+# This is an unreleased version
+# Serving database 'mTests_test_BugTracker-2011', using 4 threads
+# Compiled for x86_64-unknown-linux-gnu/64bit with 64bit OIDs dynamically 
linked
+# Found 3.780 GiB available main-memory.
+# Copyright (c) 1993-July 2008 CWI.
+# Copyright (c) August 2008-2011 MonetDB B.V., all rights reserved
+# Visit http://www.monetdb.org/ for further information
+# Listening for connection requests on 
mapi:monetdb://niels.nesco.mine.nu:33988/
+# MonetDB/GIS module loaded
+# MonetDB/SQL module loaded
+
+Ready.
+
+Over..
+
+# 16:46:27 >  
+# 16:46:27 >  mclient -lsql -ftest -i -e --host=niels --port=33988 
+# 16:46:27 >  
+
+#create table catalog ( n int );
+#insert into catalog values (1);
+[ 1    ]
+#insert into catalog values (2);
+[ 1    ]
+#select * from catalog;
+% sys.catalog # table_name
+% n # name
+% int # type
+% 1 # length
+[ 1    ]
+[ 2    ]
+#select * from catalog where n > 1;
+% sys.catalog # table_name
+% n # name
+% int # type
+% 1 # length
+[ 2    ]
+#select t.n from (select * from catalog where n > 1) as t;
+% sys.t # table_name
+% n # name
+% int # type
+% 1 # length
+[ 2    ]
+#select t.n from (select * from catalog where n > 1) as t where 1/(t.n-1) > 0;
+% sys.t # table_name
+% n # name
+% int # type
+% 1 # length
+[ 2    ]
+#select t.n from (select * from catalog where n > 1) as t where t.n/(t.n-1) > 
0;
+% sys.t # table_name
+% n # name
+% int # type
+% 1 # length
+[ 2    ]
+#select t.n from (select * from catalog where n > 1) as t where 1/(t.n-1) > 0
+#and t.n/(t.n-1) > 0;
+% sys.t # table_name
+% n # name
+% int # type
+% 1 # length
+[ 2    ]
+#select t.n from (select * from catalog where n > 1) as t where t.n/(t.n-1) > 0
+#and 1/(t.n-1) > 0;
+% sys.t # table_name
+% n # name
+% int # type
+% 1 # length
+[ 2    ]
+#select t.n from (select * from catalog where n > 1) as t where t.n/(t.n-1) > 0
+#or 1/(t.n-1) > 0;
+% sys.t # table_name
+% n # name
+% int # type
+% 1 # length
+[ 2    ]
+#select t.n from (select * from catalog where n > 1) as t where 1/(t.n-1) > 0 
or
+#t.n/(t.n-1) > 0;
+% sys.t # table_name
+% n # name
+% int # type
+% 1 # length
+[ 2    ]
+#drop table catalog;
+
+# 16:46:27 >  
+# 16:46:27 >  Done.
+# 16:46:27 >  
+
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to