Update of /cvsroot/monetdb/sql/src/server
In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv18447/src/server
Modified Files:
sql_mvc.mx sql_psm.mx sql_select.mx
Log Message:
propagated changes of Thursday Mar 06 2008 - Friday Mar 07 2008
from the SQL_2-22 branch to the development trunk
===================================================================
2008/03/06 - nielsnes: src/backends/monet4/sql_server.mx,1.189.2.6
src/backends/monet5/sql.mx,1.251.2.4
fixed bug [ 1907063 ] ms_round....
The round function for dbl, bte was missing
===================================================================
2008/03/06 - nielsnes: src/server/sql_mvc.mx,1.195.2.2
fixed bug [ 1907858 ] declaration of the second table in the function body
cased columns sometimes have no schema defined (declared tables). So we
cannot reuse the schema from it.
===================================================================
2008/03/06 - nielsnes: src/server/sql_psm.mx,1.50.2.1
src/server/sql_select.mx,1.219.2.6
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).
===================================================================
2008/03/06 - nielsnes: src/Tests/sigs.stable.out,1.75.2.1
approved output after new round function was added
===================================================================
Index: sql_psm.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/sql_psm.mx,v
retrieving revision 1.50
retrieving revision 1.51
diff -u -d -r1.50 -r1.51
--- sql_psm.mx 11 Jan 2008 10:52:11 -0000 1.50
+++ sql_psm.mx 7 Mar 2008 09:45:34 -0000 1.51
@@ -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_mvc.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/sql_mvc.mx,v
retrieving revision 1.196
retrieving revision 1.197
diff -u -d -r1.196 -r1.197
--- sql_mvc.mx 22 Feb 2008 12:45:20 -0000 1.196
+++ sql_mvc.mx 7 Mar 2008 09:45:34 -0000 1.197
@@ -745,7 +745,8 @@
if (!tr)
return NULL;
- if (m->last && strcmp(m->last->t->s->base.name, sname) == 0)
+ if (m->last && m->last->t->s &&
+ strcmp(m->last->t->s->base.name, sname) == 0)
s = m->last->t->s;
else
s = find_sql_schema(tr, sname);
Index: sql_select.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/sql_select.mx,v
retrieving revision 1.224
retrieving revision 1.225
diff -u -d -r1.224 -r1.225
--- sql_select.mx 6 Mar 2008 08:36:00 -0000 1.224
+++ sql_select.mx 7 Mar 2008 09:45:35 -0000 1.225
@@ -42,7 +42,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, sql_schema *s, char *fname, stmt *rs);
@@ -64,7 +64,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);
@@ -533,12 +533,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 {
@@ -551,14 +551,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);
@@ -568,7 +569,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);
}
@@ -600,14 +601,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);
@@ -617,7 +619,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);
}
@@ -2153,21 +2155,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;
@@ -2729,7 +2739,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;
@@ -2745,7 +2755,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) {
@@ -2812,10 +2822,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;
@@ -2829,12 +2839,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;
@@ -2845,11 +2855,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);
@@ -2873,7 +2883,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);
@@ -2932,7 +2942,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;
@@ -3170,9 +3180,11 @@
symbol *lo = sc->data.lval->h->data.sym;
symbol *ro = sc->data.lval->h->next->next->data.sym;
char *compare_op = sc->data.lval->h->next->data.sval;
+
/* currently we don't handle the (universial and existential)
quantifiers (all and any/some) */
- 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:
@@ -3208,12 +3220,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);
@@ -3370,7 +3383,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