Changeset: 6211e231de43 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=6211e231de43
Added Files:
sql/test/BugTracker-2012/Tests/case_evaluated_too_early.Bug-3186.sql
sql/test/BugTracker-2012/Tests/case_evaluated_too_early.Bug-3186.stable.err
sql/test/BugTracker-2012/Tests/case_evaluated_too_early.Bug-3186.stable.out
sql/test/BugTracker-2012/Tests/recursive_optimizer.Bug-3191.sql
sql/test/BugTracker-2012/Tests/recursive_optimizer.Bug-3191.stable.err
sql/test/BugTracker-2012/Tests/recursive_optimizer.Bug-3191.stable.out
Modified Files:
sql/benchmarks/viam/Tests/viam.sql
sql/benchmarks/viam/Tests/viam.stable.out
sql/server/rel_optimizer.c
sql/test/BugTracker-2012/Tests/All
Branch: default
Log Message:
Merge with Oct2012 branch.
diffs (truncated from 501 to 300 lines):
diff --git a/sql/benchmarks/viam/Tests/viam.sql
b/sql/benchmarks/viam/Tests/viam.sql
--- a/sql/benchmarks/viam/Tests/viam.sql
+++ b/sql/benchmarks/viam/Tests/viam.sql
@@ -5,4 +5,5 @@ select s1.framenumber, avg(c.zanger_c)
and s2.video_id = v.video_id
and v.media_uri = '20050407_mocky.mpg'
and s2.framenumber between s1.framenumber and (s1.framenumber + 124)
- group by s1.framenumber;
+ group by s1.framenumber
+ order by s1.framenumber;
diff --git a/sql/benchmarks/viam/Tests/viam.stable.out
b/sql/benchmarks/viam/Tests/viam.stable.out
--- a/sql/benchmarks/viam/Tests/viam.stable.out
+++ b/sql/benchmarks/viam/Tests/viam.stable.out
@@ -29,6 +29,15 @@ Ready.
% int, double # type
% 2, 24 # length
[ 0, 0.3069530136 ]
+[ 1, 0.3113380553 ]
+[ 2, 0.3158491548 ]
+[ 3, 0.3202903953 ]
+[ 4, 0.3248978475 ]
+[ 5, 0.3292224557 ]
+[ 6, 0.3330400058 ]
+[ 7, 0.3366659278 ]
+[ 8, 0.3393862282 ]
+[ 9, 0.3415804093 ]
[ 10, 0.3421598259 ]
[ 11, 0.3414150065 ]
[ 12, 0.3382639558 ]
@@ -39,29 +48,12 @@ Ready.
[ 17, 0.3240110451 ]
[ 18, 0.3202647068 ]
[ 19, 0.3168082588 ]
-[ 1, 0.3113380553 ]
[ 20, 0.3158073029 ]
[ 21, 0.3154659088 ]
[ 22, 0.3139201927 ]
[ 23, 0.3134433635 ]
[ 24, 0.3130393499 ]
-[ 2, 0.3158491548 ]
-[ 3, 0.3202903953 ]
-[ 4, 0.3248978475 ]
-[ 5, 0.3292224557 ]
-[ 6, 0.3330400058 ]
-[ 7, 0.3366659278 ]
-[ 8, 0.3393862282 ]
-[ 9, 0.3415804093 ]
[ 25, 0.3135247271 ]
-[ 35, 0.3000286778 ]
-[ 36, 0.296002269 ]
-[ 37, 0.290913483 ]
-[ 38, 0.2835143166 ]
-[ 39, 0.2787728265 ]
-[ 40, 0.2731191759 ]
-[ 41, 0.2711542817 ]
-[ 42, 0.2679928431 ]
[ 26, 0.3128866098 ]
[ 27, 0.3136826694 ]
[ 28, 0.3143216616 ]
@@ -71,6 +63,14 @@ Ready.
[ 32, 0.3090121901 ]
[ 33, 0.3060122738 ]
[ 34, 0.3028020651 ]
+[ 35, 0.3000286778 ]
+[ 36, 0.296002269 ]
+[ 37, 0.290913483 ]
+[ 38, 0.2835143166 ]
+[ 39, 0.2787728265 ]
+[ 40, 0.2731191759 ]
+[ 41, 0.2711542817 ]
+[ 42, 0.2679928431 ]
[ 43, 0.2675193019 ]
[ 44, 0.2673059053 ]
[ 45, 0.2655931324 ]
@@ -79,6 +79,11 @@ Ready.
[ 48, 0.2567394975 ]
[ 49, 0.2519025657 ]
[ 50, 0.2493345457 ]
+[ 51, 0.2496920232 ]
+[ 52, 0.2486809716 ]
+[ 53, 0.2519123037 ]
+[ 54, 0.2604823805 ]
+[ 55, 0.271042367 ]
[ 60, 0.2834349046 ]
[ 61, 0.2985857118 ]
[ 62, 0.3154686896 ]
@@ -89,16 +94,11 @@ Ready.
[ 67, 0.2983151227 ]
[ 68, 0.3048942813 ]
[ 69, 0.315040494 ]
-[ 51, 0.2496920232 ]
[ 70, 0.3288443923 ]
[ 71, 0.3404737413 ]
[ 72, 0.3572909931 ]
[ 73, 0.3603464961 ]
[ 74, 0.3620469868 ]
-[ 52, 0.2486809716 ]
-[ 53, 0.2519123037 ]
-[ 54, 0.2604823805 ]
-[ 55, 0.271042367 ]
# 19:17:39 >
# 19:17:39 > Done.
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
@@ -173,6 +173,7 @@ exp_find_column_( sql_rel *rel, sql_exp
return NULL;
}
+/* find column for the select/join expression */
static sql_column *
sjexp_col(sql_exp *e, sql_rel *r)
{
@@ -728,7 +729,7 @@ order_joins(mvc *sql, list *rels, list *
/* complex expressions may touch multiple base tables
* Should be pushed up to extra selection.
* */
- if (cje->type != e_cmp || !is_complex_exp(cje->flag) /*||
+ if (cje->type != e_cmp || !is_complex_exp(cje->flag) ||
!find_prop(cje->p, PROP_HASHCOL) /*||
(cje->type == e_cmp && cje->f == NULL)*/) {
l = find_one_rel(rels, cje->l);
r = find_one_rel(rels, cje->r);
@@ -2051,12 +2052,24 @@ exp_case_fixup( mvc *sql, sql_exp *e )
a1 = sql_div_fixup(sql, a1, cond, 0);
} else if (a1->type == e_func && a1->l) {
a1->l = exps_case_fixup(sql, a1->l, cond, 0);
+ } else if (a1->type == e_convert) {
+ sql_exp *l = a1->l;
+ sql_subfunc *f = l->f;
+
+ if (l->type == e_func && !f->func->s &&
!strcmp(f->func->base.name, "sql_div"))
+ a1->l = sql_div_fixup(sql, l, cond, 0);
}
if (a2->type == e_func && !a2f->func->s &&
!strcmp(a2f->func->base.name, "sql_div")) {
a2 = sql_div_fixup(sql, a2, cond, 1);
} else if (a2->type == e_func && a2->l) {
a2->l = exps_case_fixup(sql, a2->l, cond, 1);
+ } else if (a2->type == e_convert) {
+ sql_exp *l = a2->l;
+ sql_subfunc *f = l->f;
+
+ if (l->type == e_func && !f->func->s &&
!strcmp(f->func->base.name, "sql_div"))
+ a2->l = sql_div_fixup(sql, l, cond, 1);
}
nne = exp_op3(sql->sa, cond, a1, a2, ne->f);
exp_setname(sql->sa, nne, ne->rname, ne->name );
@@ -2688,6 +2701,10 @@ rel_push_select_down(int *changes, mvc *
if (rel_is_ref(rel))
return rel;
+ /* don't make changes for empty selects */
+ if (is_select(rel->op) && (!rel->exps || list_length(rel->exps) == 0))
+ return rel;
+
/* merge 2 selects */
r = rel->l;
if (is_select(rel->op) && r && is_select(r->op) && !(rel_is_ref(r))) {
@@ -4668,6 +4685,7 @@ find_index(sql_allocator *sa, sql_rel *r
/* Depending on the index type we should (in the rel_bin) generate
more code, ie for spatial index add post filter etc, for hash
compute hash value and use index */
+
if (sub->exps && rel->exps)
for(n = sub->exps->h; n; n = n->next) {
prop *p;
@@ -4688,6 +4706,8 @@ find_index(sql_allocator *sa, sql_rel *r
/* now we obtain the columns, move into
sql_column_kc_cmp! */
cols = list_map(exps, sub, (fmap) &sjexp_col);
+ /* TODO check that at most 2 relations are involved */
+
/* Match the index columns with the expression columns.
TODO, Allow partial matches ! */
if (list_match(cols, i->columns, cmp) == 0) {
@@ -4736,20 +4756,34 @@ rel_use_index(int *changes, mvc *sql, sq
if (i) {
prop *p;
node *n;
+ int single_table = 1;
+ sql_exp *re = NULL;
- /* add PROP_HASHCOL to all column exps */
- for( n = exps->h; n; n = n->next) {
+ for( n = exps->h; n && single_table; n = n->next) {
sql_exp *e = n->data;
-
- /* swapped ? */
+ sql_exp *nre = e->r;
+
if (is_join(rel->op) &&
- ((left && !rel_find_exp(rel->l, e->l))
||
- (!left && !rel_find_exp(rel->r,
e->l))))
- n->data = e = exp_compare(sql->sa,
e->r, e->l, cmp_equal);
- p = find_prop(e->p, PROP_HASHCOL);
- if (!p)
- e->p = p = prop_create(sql->sa,
PROP_HASHCOL, e->p);
- p->value = i;
+ ((left && !rel_find_exp(rel->l, e->l))
||
+ (!left && !rel_find_exp(rel->r,
e->l))))
+ nre = e->l;
+ single_table = (re && !exps_match_col_exps(nre,
re));
+ re = nre;
+ }
+ if (single_table) { /* add PROP_HASHCOL to all column
exps */
+ for( n = exps->h; n; n = n->next) {
+ sql_exp *e = n->data;
+
+ /* swapped ? */
+ if (is_join(rel->op) &&
+ ((left && !rel_find_exp(rel->l,
e->l)) ||
+ (!left && !rel_find_exp(rel->r,
e->l))))
+ n->data = e =
exp_compare(sql->sa, e->r, e->l, cmp_equal);
+ p = find_prop(e->p, PROP_HASHCOL);
+ if (!p)
+ e->p = p = prop_create(sql->sa,
PROP_HASHCOL, e->p);
+ p->value = i;
+ }
}
/* add the remaining exps to the new exp list */
if (list_length(rel->exps) > list_length(exps)) {
@@ -5597,8 +5631,10 @@ _rel_optimizer(mvc *sql, sql_rel *rel, i
rel = rewrite(sql, rel, &rel_merge_table_rewrite, &changes);
- if (changes && level > 10)
+ if (changes && level > 10) {
assert(0);
+ return rel;
+ }
if (changes)
return _rel_optimizer(sql, rel, ++level);
diff --git a/sql/test/BugTracker-2012/Tests/All
b/sql/test/BugTracker-2012/Tests/All
--- a/sql/test/BugTracker-2012/Tests/All
+++ b/sql/test/BugTracker-2012/Tests/All
@@ -54,3 +54,6 @@ many-columns-truncated.Bug-3161
aggregate_incorrect_precision_scale.Bug-3182
timestamp-diff.Bug-3190
string-insert-default-null-crash.Bug-3168
+case_evaluated_too_early.Bug-3186
+recursive_optimizer.Bug-3191
+join_over_multitable_using_index.Bug-3181
diff --git
a/sql/test/BugTracker-2012/Tests/case_evaluated_too_early.Bug-3186.sql
b/sql/test/BugTracker-2012/Tests/case_evaluated_too_early.Bug-3186.sql
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2012/Tests/case_evaluated_too_early.Bug-3186.sql
@@ -0,0 +1,2 @@
+SELECT CASE WHEN TRUE THEN -10 ELSE 0/0 END;
+SELECT coalesce (CASE WHEN TRUE THEN -10. end, case when false then 0/0 END);
diff --git
a/sql/test/BugTracker-2012/Tests/case_evaluated_too_early.Bug-3186.stable.err
b/sql/test/BugTracker-2012/Tests/case_evaluated_too_early.Bug-3186.stable.err
new file mode 100644
--- /dev/null
+++
b/sql/test/BugTracker-2012/Tests/case_evaluated_too_early.Bug-3186.stable.err
@@ -0,0 +1,36 @@
+stderr of test 'case_evaluated_too_early.Bug-3186` in directory
'test/BugTracker-2012` itself:
+
+
+# 17:10:19 >
+# 17:10:19 > "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=35816" "--set" "monet_prompt=" "--trace"
"--forcemito" "--set" "mal_listing=2" "--dbname=mTests_test_BugTracker-2012"
"--set" "mal_listing=0"
+# 17:10:19 >
+
+# 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_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 = 35816
+# cmdline opt monet_prompt =
+# cmdline opt mal_listing = 2
+# cmdline opt gdk_dbname = mTests_test_BugTracker-2012
+# cmdline opt mal_listing = 0
+
+# 17:10:20 >
+# 17:10:20 > "mclient" "-lsql" "-ftest" "-Eutf-8" "-i" "-e" "--host=niels"
"--port=35816"
+# 17:10:20 >
+
+
+# 17:10:20 >
+# 17:10:20 > "Done."
+# 17:10:20 >
+
diff --git
a/sql/test/BugTracker-2012/Tests/case_evaluated_too_early.Bug-3186.stable.out
b/sql/test/BugTracker-2012/Tests/case_evaluated_too_early.Bug-3186.stable.out
new file mode 100644
--- /dev/null
+++
b/sql/test/BugTracker-2012/Tests/case_evaluated_too_early.Bug-3186.stable.out
@@ -0,0 +1,43 @@
+stdout of test 'case_evaluated_too_early.Bug-3186` in directory
'test/BugTracker-2012` itself:
+
+
_______________________________________________
checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list