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