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