Changeset: f4eaa8850588 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=f4eaa8850588
Modified Files:
        sql/server/rel_bin.c
Branch: Aug2011
Log Message:

fixed problem with in lists with constants on the left hand side.
Fixes Bug 2921


diffs (63 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
@@ -196,25 +196,41 @@ 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);
+       stmt *s = NULL, *c = exp_bin(sql, ce, left, right, grp, NULL);
+
+       if (c->nrcols == 0) {
+               sql_subtype *bt = sql_bind_localtype("bit");
+               sql_subfunc *cmp = sql_bind_func(sql->sa, sql->session->schema, 
"=", tail_type(c), tail_type(c));
+               sql_subfunc *a = (in)?sql_bind_func(sql->sa, 
sql->session->schema, "or", bt, bt)
+                                    :sql_bind_func(sql->sa, 
sql->session->schema, "and", bt, bt);
+
+               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);
+                       
+                       i = stmt_binop(sql->sa, c, i, cmp); 
+                       if (s)
+                               s = stmt_binop(sql->sa, s, i, a);
+                       else
+                               s = i;
+               }
+       } else {
+               /* 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);
+               }
+               /*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 !! */
+               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);
        }
-       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;
 }
 
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to