Update of /cvsroot/monetdb/sql/src/server
In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv6988

Modified Files:
      Tag: SQL_2-22
        sql_psm.mx sql_select.mx 
Log Message:
fixes for the bugs
[ 1907905 ] coalesce = coalesce...
(added some more checks for semantic problems) 
and
[ 1907006 ] range select....
Properly interpret 0<id>10 as a boolean (0<id) followed by the selection 
criteria (bool > 10).



Index: sql_psm.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/sql_psm.mx,v
retrieving revision 1.50
retrieving revision 1.50.2.1
diff -u -d -r1.50 -r1.50.2.1
--- sql_psm.mx  11 Jan 2008 10:52:11 -0000      1.50
+++ sql_psm.mx  6 Mar 2008 21:35:00 -0000       1.50.2.1
@@ -295,7 +295,7 @@
                        stmt *case_stmt = NULL;
 
                        if (!when_value || 
-                          (cond = sql_compare(sql, scp, stmt_dup(v), 
when_value, "=", sql_sel)) == NULL || 
+                          (cond = sql_compare(sql, scp, stmt_dup(v), 
when_value, "=", sql_sel, ek)) == NULL || 
                           (if_stmts = sequential_block( sql, scp, res, 
m->next->data.lval, NULL, is_func)) == NULL ) {
                                stmt_destroy(v);
                                cond_stmt_destroy(else_stmt);

Index: sql_select.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/sql_select.mx,v
retrieving revision 1.219.2.5
retrieving revision 1.219.2.6
diff -u -d -r1.219.2.5 -r1.219.2.6
--- sql_select.mx       26 Feb 2008 21:50:53 -0000      1.219.2.5
+++ sql_select.mx       6 Mar 2008 21:35:03 -0000       1.219.2.6
@@ -63,7 +63,7 @@
 extern stmt *sql_logical_exp(mvc *sql, scope *scp, symbol *sc, group *grp, 
stmt *subset, int f);
 extern stmt *stmt2pivot(scope *scp, stmt *s);
 
-extern stmt *sql_compare(mvc *sql, scope *scp, stmt *ls, stmt *rs, char 
*compare_op, int f);
+extern stmt *sql_compare(mvc *sql, scope *scp, stmt *ls, stmt *rs, char 
*compare_op, int f, exp_kind ek);
 extern stmt *complex_find_subset(stmt *subset, stmt *t);
 extern stmt *sql_and(mvc *sql, scope *scp, stmt *ls, stmt *rs, int f);
 extern stmt *sql_unop_(mvc *sql, scope *scp, sql_schema *s, char *fname, stmt 
*rs);
@@ -85,7 +85,7 @@
 #include "sql_xml.h"
 
 static stmt *sql_select(mvc *sql, scope *scp, SelectNode *sn, exp_kind ek);
-static stmt *sql_compare_exp(mvc *sql, scope *scp, group *grp, stmt *subset, 
symbol *lo, symbol *ro, char *compare_op, int f);
+static stmt *sql_compare_exp(mvc *sql, scope *scp, group *grp, stmt *subset, 
symbol *lo, symbol *ro, char *compare_op, int f, exp_kind ek);
 
 static stmt *sql_simple_select(mvc *sql, scope *scp, SelectNode *sn);
 static tvar *query_exp_optname(mvc *sql, scope *scp, symbol *q);
@@ -554,12 +554,12 @@
 
                        e1 = sql_value_exp(sql, scp, dn->data.sym, grp, subset, 
f, ek);
                        e2 = sql_value_exp(sql, scp, dn->next->data.sym, grp, 
subset, f, ek);
-                       aggr |= e1->aggr;
-                       aggr |= e2->aggr;
-                       if (e1 && subset && subset->nrcols && e1->nrcols == 0)
-                               e1 = stmt_const(first_subset(subset), e1);
                        if (e1 && e2) {
-                               cond = sql_compare(sql, scp, stmt_dup(e1), e2, 
"=", sql_sel);
+                               aggr |= e1->aggr;
+                               aggr |= e2->aggr;
+                               if (e1 && subset && subset->nrcols && 
e1->nrcols == 0)
+                                       e1 = stmt_const(first_subset(subset), 
e1);
+                               cond = sql_compare(sql, scp, stmt_dup(e1), e2, 
"=", sql_sel, ek);
                                result = stmt_atom(atom_general(tail_type(e1), 
NULL, 0));
                                else_stmt = e1; /* ELSE case */
                        } else {
@@ -572,14 +572,15 @@
                           IS NOT NULL THEN e1 ELSE e2 END */
                } else if (token == SQL_COALESCE) {
                        cond = sql_value_exp(sql, scp, dn->data.sym, grp, 
subset, f, ek);
-                       aggr |= cond->aggr;
-
-                       if (cond && subset && subset->nrcols && cond->nrcols == 
0 && !cond->aggr)
-                               cond = stmt_const(first_subset(subset), cond);
                        if (cond) {
                                sql_subtype *bt = sql_bind_localtype("bit");
                                sql_subtype *tp = tail_type(cond);
                                sql_subfunc *isnul, *not;
+
+                               aggr |= cond->aggr;
+
+                               if (cond && subset && subset->nrcols && 
cond->nrcols == 0 && !cond->aggr)
+                                       cond = stmt_const(first_subset(subset), 
cond);
                                isnul = 
sql_bind_func_result(sql->session->schema, "isnull", tp, NULL, bt);
                                not = 
sql_bind_func_result(sql->session->schema, "not", bt, NULL, bt);
                                result = stmt_dup(cond);
@@ -589,7 +590,7 @@
                        dlist *when = dn->data.sym->data.lval;
 
                        if (opt_cond) {
-                               cond = sql_compare_exp(sql, scp, grp, subset, 
opt_cond, when->h->data.sym, "=", sql_sel);
+                               cond = sql_compare_exp(sql, scp, grp, subset, 
opt_cond, when->h->data.sym, "=", sql_sel, ek);
                        } else {
                                cond = sql_logical_exp(sql, scp, 
when->h->data.sym, grp, subset, sql_sel);
                        }
@@ -621,14 +622,15 @@
 
                if (token == SQL_COALESCE) {
                        cond = sql_value_exp(sql, scp, dn->data.sym, grp, 
subset, f, ek);
-                       aggr |= cond->aggr;
-
-                       if (cond && subset && subset->nrcols && cond->nrcols == 
0 && !cond->aggr)
-                               cond = stmt_const(first_subset(subset), cond);
                        if (cond) {
                                sql_subtype *bt = sql_bind_localtype("bit");
                                sql_subtype *tp = tail_type(cond);
                                sql_subfunc *isnul, *not;
+
+                               aggr |= cond->aggr;
+
+                               if (cond && subset && subset->nrcols && 
cond->nrcols == 0 && !cond->aggr)
+                                       cond = stmt_const(first_subset(subset), 
cond);
                                isnul = 
sql_bind_func_result(sql->session->schema, "isnull", tp, NULL, bt);
                                not = 
sql_bind_func_result(sql->session->schema, "not", bt, NULL, bt);
                                result = stmt_dup(cond);
@@ -638,7 +640,7 @@
                        dlist *when = dn->data.sym->data.lval;
 
                        if (opt_cond) {
-                               cond = sql_compare_exp(sql, scp, grp, subset, 
opt_cond, when->h->data.sym, "=", sql_sel);
+                               cond = sql_compare_exp(sql, scp, grp, subset, 
opt_cond, when->h->data.sym, "=", sql_sel, ek);
                        } else {
                                cond = sql_logical_exp(sql, scp, 
when->h->data.sym, grp, subset, sql_sel);
                        }
@@ -2183,21 +2185,29 @@
        node *n;
        group *grp = NULL;
        list *rl = create_stmt_list();
+       stmt *ext = NULL;
 
-       for (n = s->op1.lval->h; n; n = n->next) {
-               stmt *t = n->data;
-
-               grp = grp_create(stmt_dup(t), grp, NULL);
+       if (list_length(s->op1.lval) > 1) {
+               for (n = s->op1.lval->h; n; n = n->next) {
+                       stmt *t = n->data;
+       
+                       grp = grp_create(stmt_dup(t), grp, NULL);
+               }
+               ext = stmt_dup(grp->ext);
+               if (grp)
+                       grp_destroy(grp);
+       } else {
+               stmt *t = s->op1.lval->h->data; 
+               ext = stmt_mirror(stmt_unique(stmt_dup(t), NULL));
        }
 
        for (n = s->op1.lval->h; n; n = n->next) {
                stmt *t = n->data;
 
-               list_append(rl, stmt_join(stmt_dup(grp->ext), stmt_dup(t), 
cmp_equal));
+               list_append(rl, stmt_join(stmt_dup(ext), stmt_dup(t), 
cmp_equal));
        }
 
-       if (grp)
-               grp_destroy(grp);
+       stmt_destroy(ext);
        stmt_destroy(s);
        s = stmt_list(rl);
        return s;
@@ -2758,7 +2768,7 @@
 }
 
 stmt *
-sql_compare(mvc *sql, scope *scp, stmt *ls, stmt *rs, char *compare_op, int f)
+sql_compare(mvc *sql, scope *scp, stmt *ls, stmt *rs, char *compare_op, int f, 
exp_kind ek)
 {
        int join = 0;
        comp_type type = cmp_equal;
@@ -2774,7 +2784,7 @@
                return NULL;
        }
        /* predicate case ? */
-       if (f == sql_sel || (ls->nrcols <= 0 && rs->nrcols <= 0)) {
+       if (f == sql_sel || (ls->nrcols <= 0 && rs->nrcols <= 0) || !ek.reduce) 
{
                return sql_binop_(sql, NULL, NULL, compare_op, ls, rs);
        }
        if (ls->nrcols > 0 && rs->nrcols > 0) {
@@ -2841,10 +2851,10 @@
 }
 
 static stmt *
-sql_compare_exp(mvc *sql, scope *scp, group *grp, stmt *subset, symbol *lo, 
symbol *ro, char *compare_op, int f)
+sql_compare_exp(mvc *sql, scope *scp, group *grp, stmt *subset, symbol *lo, 
symbol *ro, char *compare_op, int f, exp_kind ek)
 {
        stmt *rs, *ls;
-       exp_kind ek = {type_value, card_column, FALSE};
+       exp_kind iek = {type_value, card_column, FALSE};
 
        if (lo->token == SQL_SELECT) { /* swap subquery to the right handside */
                symbol *tmp = lo;
@@ -2858,12 +2868,12 @@
                        compare_op[0] = '>';
        }
 
-       ls = sql_value_exp(sql, scp, lo, grp, subset, f, ek);
+       ls = sql_value_exp(sql, scp, lo, grp, subset, f, iek);
        if (!ls)
                return NULL;
        
        if (ro->token != SQL_SELECT) {
-               rs = sql_value_exp(sql, scp, ro, grp, subset, f, ek);
+               rs = sql_value_exp(sql, scp, ro, grp, subset, f, iek);
                if (!rs) {
                        stmt_destroy(ls);
                        return NULL;
@@ -2874,11 +2884,11 @@
                        stmt_destroy(ls);
                        return sql_error(sql, 02, "SELECT: cannot compare sets 
with values (did you forget an aggregate function?)");
                }
-               return sql_compare(sql, scp, ls, rs, compare_op, f);
+               return sql_compare(sql, scp, ls, rs, compare_op, f, ek);
        } else {
                node *o;
 
-               rs = scope_subquery(sql, scp, ro, ek);
+               rs = scope_subquery(sql, scp, ro, iek);
 
                if (!rs) {
                        stmt_destroy(ls);
@@ -2902,7 +2912,7 @@
                                /* we aggregated in the subquery not in the 
outer */
                                sqa->aggr = 0;
                        }
-                       return sql_compare(sql, scp, ls, sqa, compare_op, f);
+                       return sql_compare(sql, scp, ls, sqa, compare_op, f, 
ek);
                } else {
                        /* for now assume single outer ref ! */
                        stmt *oref = stmt_dup(o->next->data);
@@ -2961,7 +2971,7 @@
                         */
                        ls = stmt_semijoin(ls, stmt_dup(cmp));
 
-                       cmp = sql_compare(sql, scp, ls, cmp, compare_op, f);
+                       cmp = sql_compare(sql, scp, ls, cmp, compare_op, f, ek);
                        /* incase of sub queries no need too filter */
                        if (f == sql_having)
                                return cmp;
@@ -3200,7 +3210,8 @@
                symbol *ro = sc->data.lval->h->next->next->data.sym;
                char *compare_op = sc->data.lval->h->next->data.sval;
 
-               return sql_compare_exp(sql, scp, grp, subset, lo, ro, 
compare_op, f);
+               ek.reduce = TRUE;
+               return sql_compare_exp(sql, scp, grp, subset, lo, ro, 
compare_op, f, ek);
        }
                break;
        case SQL_BETWEEN:
@@ -3236,12 +3247,13 @@
                if (rs1->nrcols > 0 || rs2->nrcols > 0 || f == sql_sel) {
                        stmt *j1, *j2;
 
+                       ek.reduce = TRUE;
                        if (sc->token == SQL_NOT_BETWEEN) {
-                               j1 = sql_compare(sql, scp, stmt_dup(ls), rs1, 
"<", f);
-                               j2 = sql_compare(sql, scp, stmt_dup(ls), rs2, 
">", f);
+                               j1 = sql_compare(sql, scp, stmt_dup(ls), rs1, 
"<", f, ek);
+                               j2 = sql_compare(sql, scp, stmt_dup(ls), rs2, 
">", f, ek);
                        } else {
-                               j1 = sql_compare(sql, scp, stmt_dup(ls), rs1, 
">=", f);
-                               j2 = sql_compare(sql, scp, stmt_dup(ls), rs2, 
"<=", f);
+                               j1 = sql_compare(sql, scp, stmt_dup(ls), rs1, 
">=", f, ek);
+                               j2 = sql_compare(sql, scp, stmt_dup(ls), rs2, 
"<=", f, ek);
                        }
                        stmt_destroy(ls);
                        return sql_and(sql, scp, j1, j2, f);
@@ -3398,7 +3410,8 @@
                                        cmp = stmt_join(find_pivot(subset, 
cmp->h), cmp, cmp_equal);
                                else
                                        cmp = stmt_join(scope_find_pivot(scp, 
cmp->h), cmp, cmp_equal);
-                               cmp = sql_compare(sql, scp, ls, cmp, comp, f);
+                               ek.reduce = TRUE;
+                               cmp = sql_compare(sql, scp, ls, cmp, comp, f, 
ek);
                                return cmp;
                        }
                        if (sc->token == SQL_IN) {


-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Monetdb-sql-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/monetdb-sql-checkins

Reply via email to