Changeset: 3ebc90fc1bb9 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=3ebc90fc1bb9
Modified Files:
sql/src/common/sql_types.mx
sql/src/server/rel_bin.mx
sql/src/server/rel_exp.mx
sql/src/server/rel_optimizer.mx
sql/src/server/sql_mvc.mx
Branch: Jun2010
Log Message:
fix initialization
fix problem with joins of single value subqueries (fixes Bug 2657)
diffs (127 lines):
diff -r 88ac4300b565 -r 3ebc90fc1bb9 sql/src/common/sql_types.mx
--- a/sql/src/common/sql_types.mx Mon Aug 16 13:15:32 2010 +0200
+++ b/sql/src/common/sql_types.mx Mon Aug 16 23:38:09 2010 +0200
@@ -376,7 +376,7 @@
sql_subtype *
sql_bind_subtype(char *name, unsigned int digits, unsigned int scale)
{
- sql_subtype *res = NEW(sql_subtype);
+ sql_subtype *res = ZNEW(sql_subtype);
if (!sql_find_subtype(res, name, digits, scale)) {
_DELETE(res);
diff -r 88ac4300b565 -r 3ebc90fc1bb9 sql/src/server/rel_bin.mx
--- a/sql/src/server/rel_bin.mx Mon Aug 16 13:15:32 2010 +0200
+++ b/sql/src/server/rel_bin.mx Mon Aug 16 23:38:09 2010 +0200
@@ -638,8 +638,13 @@
tail_type(l),
tail_type(r));
assert(f);
s = stmt_binop(l, r, f);
- } else
+ } else {
+ /* this can still be a join (as
relationa algebra and single value subquery results still means joins */
s = stmt_uselect(l, r,
(comp_type)e->flag);
+ /* so we still need the proper side */
+ if (swapped)
+ s = stmt_reverse(s);
+ }
}
}
if (is_anti(e))
diff -r 88ac4300b565 -r 3ebc90fc1bb9 sql/src/server/rel_exp.mx
--- a/sql/src/server/rel_exp.mx Mon Aug 16 13:15:32 2010 +0200
+++ b/sql/src/server/rel_exp.mx Mon Aug 16 23:38:09 2010 +0200
@@ -682,13 +682,52 @@
return -1;
}
+static int
+exp_is_complex( sql_exp *e )
+{
+ switch (e->type) {
+ case e_atom:
+ return 0;
+ case e_convert:
+ return exp_is_complex(e->l);
+ case e_func:
+ case e_aggr:
+ {
+ int r = (e->card != CARD_ATOM);
+ node *n;
+ list *l = e->l;
+
+ if (r && l)
+ for (n = l->h; n; n = n->next)
+ r |= exp_is_complex(n->data);
+ return r;
+ }
+ case e_column:
+ case e_cmp:
+ return 0;
+ }
+ return 0;
+}
+
+static int
+complex_select(sql_exp *e)
+{
+ sql_exp *l = e->l, *r = e->r;
+
+ if (l->card == CARD_ATOM || r->card == CARD_ATOM)
+ return 1;
+ if (exp_is_complex(l) || exp_is_complex(r))
+ return 1;
+ return 0;
+}
+
int
exp_is_join(sql_exp *e)
{
/* 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)
+ if (e->type == e_cmp && e->flag != cmp_or && e->l && e->r && !e->f &&
e->card >= CARD_AGGR && !complex_select(e))
return 0;
return -1;
}
diff -r 88ac4300b565 -r 3ebc90fc1bb9 sql/src/server/rel_optimizer.mx
--- a/sql/src/server/rel_optimizer.mx Mon Aug 16 13:15:32 2010 +0200
+++ b/sql/src/server/rel_optimizer.mx Mon Aug 16 23:38:09 2010 +0200
@@ -566,7 +566,7 @@
list *lexps = list_map(eje, lr, (fmap) &joinexp_col);
list *rexps = list_map(eje, rr, (fmap) &joinexp_col);
list *lcols, *rcols;
-
+
lr = find_basetable(lr);
rr = find_basetable(rr);
if (!lr || !rr) {
diff -r 88ac4300b565 -r 3ebc90fc1bb9 sql/src/server/sql_mvc.mx
--- a/sql/src/server/sql_mvc.mx Mon Aug 16 13:15:32 2010 +0200
+++ b/sql/src/server/sql_mvc.mx Mon Aug 16 23:38:09 2010 +0200
@@ -1481,6 +1481,7 @@
sql->vars[sql->topvars].name = _strdup(name);
sql->vars[sql->topvars].value.vtype = 0;
sql->vars[sql->topvars].type = *type;
+ assert(sql->vars[sql->topvars].type.comp_type == NULL);
sql->vars[sql->topvars].view = 0;
sql->topvars++;
}
@@ -1496,6 +1497,7 @@
sql->vars[sql->topvars].name = _strdup(name);
sql->vars[sql->topvars].value.vtype = 0;
sql->vars[sql->topvars].type = *type;
+ assert(sql->vars[sql->topvars].type.comp_type != NULL);
sql->vars[sql->topvars].view = 0;
sql->topvars++;
}
@@ -1552,6 +1554,8 @@
sql->vars[sql->topvars].s = NULL;
sql->vars[sql->topvars].name = NULL;
sql->vars[sql->topvars].value.vtype = 0;
+ sql->vars[sql->topvars].view = 0;
+ sql->vars[sql->topvars].type.comp_type = NULL;
if (name)
sql->vars[sql->topvars].name = _strdup(name);
sql->topvars++;
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list