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

Reply via email to