Changeset: 22ec25e68cfb for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=22ec25e68cfb
Modified Files:
        
Branch: default
Log Message:

merge


diffs (truncated from 1189 to 300 lines):

diff -r 0b0fe4f918d3 -r 22ec25e68cfb sql/rel.txt
--- a/sql/rel.txt       Fri Dec 03 22:00:42 2010 +0100
+++ b/sql/rel.txt       Fri Dec 03 22:01:22 2010 +0100
@@ -69,6 +69,8 @@
        or
        -> r    parameter ( ->r = varname, ->type = subtype, ->flag = level)
        or
+       -> f    list of atom expressions
+       or
        ->      numbered variable ( ->flag = nr, ->type = subtype)
 
 e_convert
@@ -88,7 +90,12 @@
                        cmp_notlike = 6,
                        cmp_like = 7,
                        cmp_all = 8,            cross product
-                       cmp_or = 9              or handling 
+                       cmp_or = 9,             or handling 
+                       cmp_in = 10,            in list handling                
+                       cmp_notin = 11          not in list handling
+
+                                               cmp_in/cmp_notin
+                                               ->r is a list of values
                )
 
 e_func
diff -r 0b0fe4f918d3 -r 22ec25e68cfb sql/src/backends/monet5/sql_gencode.mx
--- a/sql/src/backends/monet5/sql_gencode.mx    Fri Dec 03 22:00:42 2010 +0100
+++ b/sql/src/backends/monet5/sql_gencode.mx    Fri Dec 03 22:01:22 2010 +0100
@@ -1352,7 +1352,8 @@
                            f->type->eclass &&
                            f->type->eclass != EC_INTERVAL &&
                            f->type->eclass != EC_DEC &&
-                           t->digits == 0
+                           (t->digits == 0 ||
+                            f->digits == t->digits)
                           ) {
                                s->nr = l;      
                                break;
diff -r 0b0fe4f918d3 -r 22ec25e68cfb sql/src/backends/monet5/vaults/Tests/All
--- a/sql/src/backends/monet5/vaults/Tests/All  Fri Dec 03 22:00:42 2010 +0100
+++ b/sql/src/backends/monet5/vaults/Tests/All  Fri Dec 03 22:01:22 2010 +0100
@@ -1,1 +1,1 @@
-vault00
+#vault00
diff -r 0b0fe4f918d3 -r 22ec25e68cfb sql/src/server/rel_bin.c
--- a/sql/src/server/rel_bin.c  Fri Dec 03 22:00:42 2010 +0100
+++ b/sql/src/server/rel_bin.c  Fri Dec 03 22:01:22 2010 +0100
@@ -175,6 +175,32 @@
        }
 }
 
+static stmt *
+handle_in_exps( mvc *sql, sql_exp *ce, list *nl, stmt *left, stmt *right, 
group *grp, int in, int use_r) 
+{
+       node *n;
+       stmt *s, *c;
+
+       /* create bat append values */
+       s = stmt_temp(sql->sa, exp_subtype(ce));
+       for( n = nl->h; n; n = n->next) {
+               sql_exp *e = n->data;
+               stmt *i = exp_bin(sql, use_r?e->r:e, left, right, grp, NULL);
+               
+               s = stmt_append(sql->sa, s, i);
+       }
+       c = exp_bin(sql, ce, left, right, grp, NULL);
+       /*s = stmt_mark_tail(sql->sa, stmt_reverse(sql->sa, 
stmt_semijoin(sql->sa, stmt_reverse(sql->sa, c), stmt_reverse(sql->sa, s))), 
0);*/
+       /* not really a projection join, therefore make sure left values are 
unique !! */
+       c = column(sql->sa, c);
+       if (in)
+               s = stmt_project(sql->sa, c, stmt_reverse(sql->sa, 
stmt_unique(sql->sa, s, NULL)));
+       else 
+               s = stmt_reverse(sql->sa, stmt_diff(sql->sa, 
stmt_reverse(sql->sa, c), stmt_reverse(sql->sa, stmt_unique(sql->sa, s, 
NULL))));
+       s = stmt_const(sql->sa, s, NULL);
+       return s;
+}
+
 /* For now this only works if all or's are part of the 'IN' */
 static stmt *
 handle_equality_exps( mvc *sql, list *l, list *r, stmt *left, stmt *right, 
group *grp )
@@ -182,7 +208,6 @@
        node *n;
        sql_exp *ce = NULL;
        list *nl = new_exp_list(sql->sa);
-       stmt *s = NULL, *c;
 
        get_exps(nl, l);
        get_exps(nl, r);
@@ -197,20 +222,23 @@
                if (!exp_match(ce, e->l)) 
                        return NULL;
        } 
+       return handle_in_exps( sql, ce, nl, left, right, grp, 1, 1);
+}
+
+static stmt *
+value_list( mvc *sql, list *vals) 
+{
+       node *n;
+       stmt *s;
 
        /* create bat append values */
-       s = stmt_temp(sql->sa, exp_subtype(ce));
-       for( n = nl->h; n; n = n->next) {
+       s = stmt_temp(sql->sa, exp_subtype(vals->h->data));
+       for( n = vals->h; n; n = n->next) {
                sql_exp *e = n->data;
-               stmt *i = exp_bin(sql, e->r, left, right, grp, NULL);
+               stmt *i = exp_bin(sql, e, NULL, NULL, NULL, NULL);
                
                s = stmt_append(sql->sa, s, i);
        }
-       c = exp_bin(sql, ce, left, right, grp, NULL);
-       /*s = stmt_mark_tail(sql->sa, stmt_reverse(sql->sa, 
stmt_semijoin(sql->sa, stmt_reverse(sql->sa, c), stmt_reverse(sql->sa, s))), 
0);*/
-       /* not really a projection join, therefore make sure left values are 
unique !! */
-       s = stmt_project(sql->sa, c, stmt_reverse(sql->sa, stmt_unique(sql->sa, 
s, NULL)));
-       s = stmt_const(sql->sa, s, NULL);
        return s;
 }
 
@@ -231,6 +259,8 @@
                        s = stmt_atom(sql->sa, atom_dup(sql->sa, a));
                } else if (e->r) {              /* parameters */
                        s = stmt_var(sql->sa, sa_strdup(sql->sa, e->r), 
e->tpe.type?&e->tpe:NULL, 0, e->flag);
+               } else if (e->f) {              /* values */
+                       s = value_list(sql, e->f);
                } else {                        /* arguments */
                        s = stmt_varnr(sql->sa, e->flag, 
e->tpe.type?&e->tpe:NULL);
                }
@@ -394,6 +424,9 @@
                sql_exp *re = e->r, *re2 = e->f;
                prop *p;
 
+               if (e->flag == cmp_in || e->flag == cmp_notin) {
+                       return handle_in_exps(sql, e->l, e->r, left, right, 
grp, (e->flag == cmp_in), 0);
+               }
                if (e->flag == cmp_or) {
                        list *l = e->l;
                        node *n;
@@ -1615,6 +1648,9 @@
                        sel = NULL;
                } else {
                        sel = stmt_join(sql->sa, sel, predicate, cmp_all);
+                       predicate = NULL;
+                       if (!sub)
+                               predicate = sel;
                }
        }
        /* construct relation */
diff -r 0b0fe4f918d3 -r 22ec25e68cfb sql/src/server/rel_dump.c
--- a/sql/src/server/rel_dump.c Fri Dec 03 22:00:42 2010 +0100
+++ b/sql/src/server/rel_dump.c Fri Dec 03 22:01:22 2010 +0100
@@ -62,6 +62,8 @@
        case cmp_ilike:         r = "ilike"; break;
        case cmp_all:           r = "all"; break;
        case cmp_or:            r = "or"; break;
+       case cmp_in:            r = "in"; break;
+       case cmp_notin:         r = "notin"; break;
        default:
                r = "";
        }
@@ -108,6 +110,9 @@
                        if (e->r) { /* named parameters */
                                char *name = e->r;
                                mnstr_printf(fout, "%s", name);
+                       } else if (e->f) {      /* values list */
+                               list *l = e->f;
+                               exp_print(sql, fout, l->h->data, depth, 0, 0);
                        } else { /* numbered arguments */
                                mnstr_printf(fout, "A%d", e->flag);
                        }
@@ -141,7 +146,11 @@
                        alias = 0;
                break;
        case e_cmp: 
-               if (e->flag == cmp_or) {
+               if (e->flag == cmp_in || e->flag == cmp_notin) {
+                       exp_print(sql, fout, e->l, depth, alias, 1);
+                       cmp_print(sql, fout, e->flag );
+                       exps_print(sql, fout, e->r, depth, alias, 1);
+               } else if (e->flag == cmp_or) {
                        exps_print(sql, fout, e->l, depth, alias, 1);
                        cmp_print(sql, fout, e->flag );
                        exps_print(sql, fout, e->r, depth, alias, 1);
diff -r 0b0fe4f918d3 -r 22ec25e68cfb sql/src/server/rel_exp.c
--- a/sql/src/server/rel_exp.c  Fri Dec 03 22:00:42 2010 +0100
+++ b/sql/src/server/rel_exp.c  Fri Dec 03 22:01:22 2010 +0100
@@ -82,6 +82,20 @@
        return e;
 }
 
+sql_exp *
+exp_in(sql_allocator *sa, sql_exp *l, list *r, int cmptype)
+{
+       sql_exp *e = exp_create(sa, e_cmp);
+       
+       e->card = l->card;
+       e->l = l;
+       e->r = r;
+       assert( cmptype == cmp_in || cmptype == cmp_notin);
+       e->flag = cmptype;
+       return e;
+}
+
+
 static sql_subtype*
 dup_subtype(sql_allocator *sa, sql_subtype *st)
 {
@@ -225,6 +239,15 @@
 }
 
 sql_exp * 
+exp_values(sql_allocator *sa, list *exps) 
+{
+       sql_exp *e = exp_create(sa, e_atom);
+       e->card = CARD_MULTI;
+       e->f = exps;
+       return e;
+}
+
+sql_exp * 
 exp_alias(sql_allocator *sa, char *arname, char *acname, char *org_rname, char 
*org_cname, sql_subtype *t, int card, int has_nils, int intern) 
 {
        sql_exp *e = exp_create(sa, e_column);
@@ -431,17 +454,17 @@
        if (e1->type != e_cmp || e2->type != e_cmp)
                return 0;
 
-       if (e1->flag != cmp_or && e1_r && e1_r->card == 1 &&
-           e2->flag != cmp_or && e2_r && e2_r->card == 1)
+       if (!is_complex_exp(e1->flag) && e1_r && e1_r->card == 1 &&
+           !is_complex_exp(e2->flag) && e2_r && e2_r->card == 1)
                return exp_match_exp(e1->l, e2->l);
 
-       if (e1->flag != cmp_or && e1_r && e1_r->card == 1 &&
+       if (!is_complex_exp(e1->flag) && e1_r && e1_r->card == 1 &&
            e2->flag == cmp_or)
                return exp_match_col_exps(e1->l, e2->l) &&
                       exp_match_col_exps(e1->l, e2->r); 
 
        if (e1->flag == cmp_or &&
-           e2->flag != cmp_or && e2_r && e2_r->card == 1)
+           !is_complex_exp(e2->flag) && e2_r && e2_r->card == 1)
                return exp_match_col_exps(e2->l, e1->l) &&
                       exp_match_col_exps(e2->l, e1->r); 
 
@@ -502,7 +525,7 @@
        if (e1->type == e2->type) { 
                switch(e1->type) {
                case e_cmp:
-                       if (e1->flag == e2->flag && e1->flag != cmp_or &&
+                       if (e1->flag == e2->flag && !is_complex_exp(e1->flag) &&
                            exp_match_exp(e1->l, e2->l) && 
                            exp_match_exp(e1->r, e2->r) && 
                            ((!e1->f && !e2->f) || exp_match_exp(e1->f, e2->f)))
@@ -558,7 +581,7 @@
 {
        sql_exp *l = e->l;
        sql_exp *r = e->r;
-       if (e->type == e_cmp && e->flag != cmp_or && l && r && r->card >= 
CARD_AGGR)
+       if (e->type == e_cmp && !is_complex_exp(e->flag) && l && r && r->card 
>= CARD_AGGR)
                return 0;
        if (e->type == e_cmp && e->flag == cmp_or && e->card >= CARD_AGGR)
                if (exps_are_joins(e->l) == 0 && exps_are_joins(e->r) == 0)
@@ -611,7 +634,7 @@
        /* only simple compare expressions, ie not or lists
                or range expressions (e->f)
         */ 
-       if (e->type == e_cmp && e->flag != cmp_or && e->l && e->r && !e->f && 
e->card >= CARD_AGGR && !complex_select(e))
+       if (e->type == e_cmp && !is_complex_exp(e->flag) && e->l && e->r && 
!e->f && e->card >= CARD_AGGR && !complex_select(e))
                return 0;
        return -1;
 }
@@ -704,7 +727,7 @@
 int 
 exp_is_correlation(sql_exp *e, sql_rel *r )
 {
-       if (e->type == e_cmp && e->flag != cmp_or) {
+       if (e->type == e_cmp && !is_complex_exp(e->flag)) {
                sql_exp *le = rel_find_exp(r->l, e->l);
                sql_exp *re = rel_find_exp(r->r, e->r);
 
diff -r 0b0fe4f918d3 -r 22ec25e68cfb sql/src/server/rel_exp.h
--- a/sql/src/server/rel_exp.h  Fri Dec 03 22:00:42 2010 +0100
+++ b/sql/src/server/rel_exp.h  Fri Dec 03 22:01:22 2010 +0100
@@ -25,6 +25,7 @@
 extern sql_exp *exp_compare(sql_allocator *sa, sql_exp *l, sql_exp *r, int 
cmptype);
 extern sql_exp *exp_compare2(sql_allocator *sa, sql_exp *l, sql_exp *r, 
sql_exp *h, int cmptype);
 extern sql_exp *exp_or(sql_allocator *sa, list *l, list *r);
+extern sql_exp *exp_in(sql_allocator *sa, sql_exp *l, list *r, int cmptype);
 
 #define exp_fromtype(e)        ((list*)e->r)->h->data
 #define exp_totype(e)  ((list*)e->r)->h->next->data
@@ -54,6 +55,8 @@
 extern sql_exp * exp_atom_ptr(sql_allocator *sa, void *s);
 extern sql_exp * exp_atom_ref(sql_allocator *sa, int i, sql_subtype *tpe);
 extern sql_exp * exp_param(sql_allocator *sa, char *name, sql_subtype *tpe, 
int frame);
+extern sql_exp * exp_values(sql_allocator *sa, list *exps);
+
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to