Changeset: 4d8985781870 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=4d8985781870
Modified Files:
sql/backends/monet5/rel_bin.c
sql/server/rel_distribute.c
sql/server/rel_exp.c
sql/server/rel_exp.h
sql/server/rel_optimizer.c
sql/server/rel_psm.c
sql/server/rel_rel.c
sql/server/rel_schema.c
sql/server/rel_unnest.c
sql/server/rel_updates.c
Branch: sq2
Log Message:
now also handle lists of subqueries
some more cleanup.
diffs (truncated from 703 to 300 lines):
diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -732,10 +732,10 @@ exp_bin(backend *be, sql_exp *e, stmt *l
if (!s) {
fprintf(stderr, "query: '%s'\n", sql->query);
}
- //assert(s);
+ assert(s);
return NULL;
}
- } break;
+ } break;
case e_cmp: {
stmt *l = NULL, *r = NULL, *r2 = NULL;
int swapped = 0, is_select = 0;
diff --git a/sql/server/rel_distribute.c b/sql/server/rel_distribute.c
--- a/sql/server/rel_distribute.c
+++ b/sql/server/rel_distribute.c
@@ -80,7 +80,7 @@ rewrite_replica( mvc *sql, sql_rel *rel,
sql_exp *e = n->data;
sql_exp *ne = m->data;
- exp_prop_alias(ne, e);
+ exp_prop_alias(sql->sa, ne, e);
}
rel_destroy(rel);
diff --git a/sql/server/rel_exp.c b/sql/server/rel_exp.c
--- a/sql/server/rel_exp.c
+++ b/sql/server/rel_exp.c
@@ -10,6 +10,7 @@
#include "sql_relation.h"
#include "sql_semantic.h"
#include "rel_exp.h"
+#include "rel_rel.h"
#include "rel_prop.h" /* for prop_copy() */
#include "rel_unnest.h"
#include "rel_optimizer.h"
@@ -778,10 +779,12 @@ exp_setalias(sql_exp *e, const char *rna
}
void
-exp_prop_alias(sql_exp *e, sql_exp *oe )
+exp_prop_alias(sql_allocator *sa, sql_exp *e, sql_exp *oe )
{
if (oe->alias.name == NULL && exp_has_rel(oe)) {
- sql_rel *r = exp_rel_get_rel(oe);
+ sql_rel *r = exp_rel_get_rel(sa, oe);
+ if (!is_project(r->op))
+ return ;
oe = r->exps->t->data;
}
e->alias = oe->alias;
@@ -1685,23 +1688,32 @@ exps_have_rel_exp( list *exps)
return 0;
}
-/* For now only handle single relation, later combine multiple relations into
one (using crossproduct */
static sql_rel *
-exps_rel_get_rel( list *exps )
+exps_rel_get_rel(sql_allocator *sa, list *exps )
{
+ sql_rel *xp = NULL;
+
if (list_empty(exps))
return NULL;
for (node *n = exps->h; n; n=n->next){
sql_exp *e = n->data;
- if (exp_has_rel(e))
- return exp_rel_get_rel(e);
+ if (exp_has_rel(e)) {
+ sql_rel *r = exp_rel_get_rel(sa, e);
+
+ if (!r)
+ return NULL;
+ if (xp)
+ xp = rel_crossproduct(sa, xp, r, op_join);
+ else
+ xp = r;
+ }
}
- return NULL;
+ return xp;
}
sql_rel *
-exp_rel_get_rel( sql_exp *e)
+exp_rel_get_rel(sql_allocator *sa, sql_exp *e)
{
if (!e)
return NULL;
@@ -1709,36 +1721,36 @@ exp_rel_get_rel( sql_exp *e)
switch(e->type){
case e_func:
case e_aggr:
- return exps_rel_get_rel(e->l);
+ return exps_rel_get_rel(sa, e->l);
case e_cmp:
if (get_cmp(e) == cmp_or || get_cmp(e) == cmp_filter) {
if (exps_have_rel_exp(e->l))
- return exps_rel_get_rel(e->l);
+ return exps_rel_get_rel(sa, e->l);
if (exps_have_rel_exp(e->r))
- return exps_rel_get_rel(e->r);
+ return exps_rel_get_rel(sa, e->r);
} else if (e->flag == cmp_in || e->flag == cmp_notin) {
if (exp_has_rel(e->l))
- return exp_rel_get_rel(e->l);
+ return exp_rel_get_rel(sa, e->l);
if (exps_have_rel_exp(e->r))
- return exps_rel_get_rel(e->r);
+ return exps_rel_get_rel(sa, e->r);
} else {
if (exp_has_rel(e->l))
- return exp_rel_get_rel(e->l);
+ return exp_rel_get_rel(sa, e->l);
if (exp_has_rel(e->r))
- return exp_rel_get_rel(e->r);
+ return exp_rel_get_rel(sa, e->r);
if (e->f && exp_has_rel(e->f))
- return exp_rel_get_rel(e->f);
+ return exp_rel_get_rel(sa, e->f);
}
return NULL;
case e_convert:
- return exp_rel_get_rel(e->l);
+ return exp_rel_get_rel(sa, e->l);
case e_psm:
if (exp_is_rel(e))
return e->l;
return NULL;
case e_atom:
if (e->f && exps_have_rel_exp(e->f))
- return exps_rel_get_rel(e->f);
+ return exps_rel_get_rel(sa, e->f);
return NULL;
case e_column:
return NULL;
@@ -1757,6 +1769,7 @@ exp_rel_update_exps(sql_allocator *sa, l
if (exp_has_rel(e))
n->data = exp_rel_update_exp(sa, e);
}
+ list_hash_clear(exps);
return exps;
}
@@ -1796,7 +1809,7 @@ exp_rel_update_exp(sql_allocator *sa, sq
return e;
case e_psm:
if (exp_is_rel(e)) {
- sql_rel *r = exp_rel_get_rel(e);
+ sql_rel *r = exp_rel_get_rel(sa, e);
e = r->exps->t->data;
return exp_ref(sa, e);
}
@@ -2301,7 +2314,7 @@ exp_copy( mvc *sql, sql_exp * e)
if (!ne)
return ne;
if (e->alias.name)
- exp_prop_alias(ne, e);
+ exp_prop_alias(sql->sa, ne, e);
ne = exp_propagate(sql->sa, ne, e);
if (is_freevar(e))
set_freevar(ne, is_freevar(e)-1);
diff --git a/sql/server/rel_exp.h b/sql/server/rel_exp.h
--- a/sql/server/rel_exp.h
+++ b/sql/server/rel_exp.h
@@ -90,7 +90,7 @@ extern sql_exp * exp_rel(mvc *sql, sql_r
extern void exp_setname(sql_allocator *sa, sql_exp *e, const char *rname,
const char *name );
extern void exp_setrelname(sql_allocator *sa, sql_exp *e, int nr );
extern void exp_setalias(sql_exp *e, const char *rname, const char *name);
-extern void exp_prop_alias(sql_exp *e, sql_exp *oe);
+extern void exp_prop_alias(sql_allocator *sa, sql_exp *e, sql_exp *oe);
extern void noninternexp_setname(sql_allocator *sa, sql_exp *e, const char
*rname, const char *name );
extern char* make_label(sql_allocator *sa, int nr);
@@ -137,7 +137,7 @@ extern int exp_is_null(mvc *sql, sql_exp
extern int exp_is_rel(sql_exp *e);
extern int exp_has_rel(sql_exp *e);
extern int exps_have_rel_exp(list *exps);
-extern sql_rel *exp_rel_get_rel( sql_exp *e);
+extern sql_rel *exp_rel_get_rel(sql_allocator *sa, sql_exp *e);
extern sql_exp *exp_rel_update_exp(sql_allocator *sa, sql_exp *e);
extern int exps_are_atoms(list *exps);
extern int exp_has_func(sql_exp *e);
diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c
--- a/sql/server/rel_optimizer.c
+++ b/sql/server/rel_optimizer.c
@@ -2901,7 +2901,7 @@ exp_case_fixup( mvc *sql, sql_rel *rel,
list_append(l, a);
}
ne = exp_op(sql->sa, l, f);
- exp_prop_alias(ne, e);
+ exp_prop_alias(sql->sa, ne, e);
if (cc && math_unsafe(f)) {
/* only add one condition */
assert(f->func->varres || f->func->vararg ||
list_length(ne->l) == list_length(f->func->ops));
@@ -2945,7 +2945,7 @@ exp_case_fixup( mvc *sql, sql_rel *rel,
}
assert(cond && a1 && a2);
nne = exp_op3(sql->sa, cond, a1, a2, ne->f);
- exp_prop_alias(nne, ne);
+ exp_prop_alias(sql->sa, nne, ne);
ne = nne;
}
return ne;
@@ -2954,7 +2954,7 @@ exp_case_fixup( mvc *sql, sql_rel *rel,
sql_exp *e1 = exp_case_fixup(sql, rel, e->l, cc);
sql_exp *ne = exp_convert(sql->sa, e1, exp_fromtype(e),
exp_totype(e));
- exp_prop_alias(ne, e);
+ exp_prop_alias(sql->sa, ne, e);
return ne;
}
if (e->type == e_aggr) {
@@ -2972,7 +2972,7 @@ exp_case_fixup( mvc *sql, sql_rel *rel,
}
}
ne = exp_aggr(sql->sa, l, f, need_distinct(e), need_no_nil(e),
e->card, has_nil(e));
- exp_prop_alias(ne, e);
+ exp_prop_alias(sql->sa, ne, e);
return ne;
}
return e;
@@ -5603,7 +5603,7 @@ rel_reduce_groupby_exps(int *changes, mv
ne =
exps_bind_column(dgbe, e->r, NULL);
if (ne) {
ne = exp_copy(sql, ne);
- exp_prop_alias(ne, e);
+ exp_prop_alias(sql->sa,
ne, e);
e = ne;
}
}
@@ -6255,6 +6255,20 @@ rel_push_project_up(int *changes, mvc *s
return rel;
}
+static int exp_mark_used(sql_rel *subrel, sql_exp *e);
+
+static int
+exps_mark_used(sql_rel *subrel, list *l)
+{
+ int nr = 0;
+ if (list_empty(l))
+ return nr;
+
+ for (node *n = l->h; n != NULL; n = n->next)
+ nr += exp_mark_used(subrel, n->data);
+ return nr;
+}
+
static int
exp_mark_used(sql_rel *subrel, sql_exp *e)
{
@@ -6269,32 +6283,17 @@ exp_mark_used(sql_rel *subrel, sql_exp *
return exp_mark_used(subrel, e->l);
case e_aggr:
case e_func: {
- if (e->l) {
- list *l = e->l;
- node *n = l->h;
-
- for (;n != NULL; n = n->next)
- nr += exp_mark_used(subrel, n->data);
- }
+ if (e->l)
+ nr += exps_mark_used(subrel, e->l);
break;
}
case e_cmp:
if (get_cmp(e) == cmp_or || get_cmp(e) == cmp_filter) {
- list *l = e->l;
- node *n;
-
- for (n = l->h; n != NULL; n = n->next)
- nr += exp_mark_used(subrel, n->data);
- l = e->r;
- for (n = l->h; n != NULL; n = n->next)
- nr += exp_mark_used(subrel, n->data);
+ nr += exps_mark_used(subrel, e->l);
+ nr += exps_mark_used(subrel, e->r);
} else if (e->flag == cmp_in || e->flag == cmp_notin) {
- list *r = e->r;
- node *n;
-
nr += exp_mark_used(subrel, e->l);
- for (n = r->h; n != NULL; n = n->next)
- nr += exp_mark_used(subrel, n->data);
+ nr += exps_mark_used(subrel, e->r);
} else {
nr += exp_mark_used(subrel, e->l);
nr += exp_mark_used(subrel, e->r);
@@ -6306,7 +6305,9 @@ exp_mark_used(sql_rel *subrel, sql_exp *
/* atoms are used in e_cmp */
e->used = 1;
/* return 0 as constants may require a full column ! */
- return 0;
+ if (e->f)
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list