Changeset: fec4801ea0c0 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=fec4801ea0c0
Modified Files:
sql/server/rel_bin.c
sql/server/rel_exp.c
sql/server/sql_rel2bin.c
sql/test/BugTracker/Tests/cardinality_violation.SF-1240701.stable.err
Branch: Mar2011
Log Message:
some cleanup and approved output
diffs (189 lines):
diff --git a/sql/server/rel_bin.c b/sql/server/rel_bin.c
--- a/sql/server/rel_bin.c
+++ b/sql/server/rel_bin.c
@@ -841,7 +841,19 @@
idx = 1;
if (!join) {
join = s;
- } else if (s->type != st_join && s->type != st_join2 &&
s->type != st_joinN) {
+ } else if (s->type != st_join &&
+ s->type != st_join2 &&
+ s->type != st_joinN) {
+ if (s->type == st_reverse) {
+ stmt *rs = s->op1;
+
+ if (rs->type == st_join ||
+ rs->type == st_join2 ||
+ rs->type == st_joinN) {
+ list_append(jns, s);
+ continue;
+ }
+ }
/* handle select expressions */
/*assert(0);*/
if (s->h == join->h) {
@@ -1681,7 +1693,7 @@
} else if (sub && predicate) {
stmt *h = NULL;
n = sub->op4.lval->h;
- h = stmt_join(sql->sa, n->data, predicate, cmp_all);
+ h = stmt_join(sql->sa, column(sql->sa, n->data), predicate,
cmp_all);
h = stmt_reverse(sql->sa, stmt_mark_tail(sql->sa, h, 0));
for( n = sub->op4.lval->h; n; n = n->next ) {
stmt *col = n->data;
@@ -3090,6 +3102,7 @@
int *trigger_id = NEW(int);
*trigger_id = trigger->base.id;
+ stack_push_frame(sql, "OLD-NEW");
if (trigger->event == 2 && trigger->time == time) {
stmt *s = NULL;
@@ -3106,6 +3119,7 @@
return 0;
list_append(l, s);
}
+ stack_pop_frame(sql);
}
return res;
}
@@ -3259,6 +3273,7 @@
int *trigger_id = NEW(int);
*trigger_id = trigger->base.id;
+ stack_push_frame(sql, "OLD-NEW");
if (trigger->event == 1) {
stmt *s = NULL;
@@ -3277,6 +3292,7 @@
else
list_prepend(l, s);
}
+ stack_pop_frame(sql);
}
return res;
}
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
@@ -114,6 +114,10 @@
totype = dup_subtype(sa, totype);
e->r = append(append(list_new(sa), dup_subtype(sa, fromtype)),totype);
e->tpe = *totype;
+ if (exp->name)
+ e->name = sa_strdup(sa, exp->name);
+ if (exp->rname)
+ e->rname = sa_strdup(sa, exp->rname);
return e;
}
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
@@ -22,6 +22,7 @@
#include "sql_rel2bin.h"
#include "sql_env.h"
#include <stdio.h>
+#include "rel_semantic.h"
static stmt * head_column(stmt *st);
@@ -731,13 +732,23 @@
}
/* TODO also handle joinN */
for (; n; n = n->next) {
- stmt *j = n->data;
- stmt *ld = j->op1;
- stmt *o2 = j->op2;
- stmt *rd = (j->type == st_join)?stmt_reverse(sql->sa, o2):o2;
+ stmt *j = n->data, *ld, *o2, *rd, *cmp;
+ if (j->type == st_reverse) {
+ stmt *sw;
+ j = j->op1;
+ ld = j->op1;
+ o2 = j->op2;
+ rd = (j->type == st_join)?stmt_reverse(sql->sa, o2):o2;
+ sw = l;
+ l = r;
+ r = sw;
+ } else {
+ ld = j->op1;
+ o2 = j->op2;
+ rd = (j->type == st_join)?stmt_reverse(sql->sa, o2):o2;
+ }
if (j->type == st_joinN) {
- stmt *cmp;
list *ol,*nl = list_new(sql->sa);
node *m;
@@ -749,38 +760,29 @@
list_append(nl, _project(sql, r, m->data));
/* find function */
cmp = stmt_uselect(sql->sa, stmt_Nop(sql->sa,
stmt_list(sql->sa, nl), j->op4.funcval), stmt_bool(sql->sa, 1), cmp_equal);
- /* TODO semijoin may break order */
- l = stmt_semijoin(sql->sa, l, cmp);
- r = stmt_semijoin(sql->sa, r, cmp);
} else if (j->type == st_join2) {
stmt *le = stmt_project(sql->sa, l, ld );
stmt *re = stmt_project(sql->sa, r, rd );
- comp_type c1 = j->flag&2 ? cmp_gte : cmp_gt;
- comp_type c2 = j->flag&1 ? cmp_lte : cmp_lt;
+ comp_type c1 = range2lcompare(j->flag);
+ comp_type c2 = range2rcompare(j->flag);
stmt *r2 = stmt_project(sql->sa, r, j->op3);
stmt *cmp1 = stmt_uselect(sql->sa, le, re, c1);
stmt *cmp2 = stmt_uselect(sql->sa, le, r2, c2);
-
- stmt *cmp = stmt_semijoin(sql->sa, cmp1, cmp2);
- /* use a single uselect2 ? */
- /*
- stmt *cmp = stmt_uselect2(sql->sa, le, re, r2,
(comp_type)j->flag);
- */
-
- /* TODO semijoin may break order */
- l = stmt_semijoin(sql->sa, l, cmp);
- r = stmt_semijoin(sql->sa, r, cmp);
+ cmp = stmt_semijoin(sql->sa, cmp1, cmp2);
} else {
stmt *le = stmt_project(sql->sa, l, ld );
stmt *re = stmt_project(sql->sa, r, rd );
/* TODO force scan select ? */
- stmt *cmp = stmt_uselect(sql->sa, le, re,
(comp_type)j->flag);
-
- /* TODO semijoin may break order,
- ie maybe do a mirror + project */
- l = stmt_semijoin(sql->sa, l, cmp);
- r = stmt_semijoin(sql->sa, r, cmp);
+ cmp = stmt_uselect(sql->sa, le, re, (comp_type)j->flag);
+ }
+ cmp = stmt_mark(sql->sa, stmt_reverse(sql->sa, cmp), 50);
+ l = stmt_project(sql->sa, cmp, l);
+ r = stmt_project(sql->sa, cmp, r);
+ if (j != n->data) { /* reversed */
+ stmt *sw = l;
+ l = r;
+ r = sw;
}
}
res = stmt_join(sql->sa, stmt_reverse(sql->sa, l), r, cmp_equal);
diff --git
a/sql/test/BugTracker/Tests/cardinality_violation.SF-1240701.stable.err
b/sql/test/BugTracker/Tests/cardinality_violation.SF-1240701.stable.err
--- a/sql/test/BugTracker/Tests/cardinality_violation.SF-1240701.stable.err
+++ b/sql/test/BugTracker/Tests/cardinality_violation.SF-1240701.stable.err
@@ -80,12 +80,12 @@
# 21:00:43 > mclient -lsql -umonetdb -Pmonetdb --host=alf --port=38808
# 21:00:43 >
-MAPI = monetdb@alf:32031
+MAPI = monetdb@alf:38517
QUERY = select * from env() as env where name = ( select 'prefix' from env()
as env );
ERROR = !SQLException:zero_or_one:cardinality violation (53>1)
-MAPI = monetdb@alf:32031
+MAPI = monetdb@alf:38517
QUERY = select * from columns where name = (select columns.name from _tables,
columns where _tables.id = columns.table_id);
-ERROR = !SQLException:zero_or_one:cardinality violation (288>1)
+ERROR = !SQLException:zero_or_one:cardinality violation (297>1)
# 21:00:43 >
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list