Changeset: 8a38f46f50f0 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/8a38f46f50f0
Modified Files:
sql/server/rel_dump.c
sql/server/rel_optimize_sel.c
Branch: cmp-or-patterns
Log Message:
Handling multicol single list cmp_eq exp WIP
diffs (109 lines):
diff --git a/sql/server/rel_dump.c b/sql/server/rel_dump.c
--- a/sql/server/rel_dump.c
+++ b/sql/server/rel_dump.c
@@ -638,7 +638,7 @@ rel_print_rel(mvc *sql, stream *fout, s
}
if (rel->op == op_groupby) /* group by columns */
exps_print(sql, fout, rel->r, depth, refs, 1, 0,
decorate, 0);
- exps_print(sql, fout, rel->exps, depth, refs, 1, 0, decorate,
0);
+ exps_print(sql, fout, rel->exps, depth, refs, 1, 0, decorate,
(mvc_debug_on(sql, 32768) && rel->op == op_select)?1:0);
if (rel->r && rel->op == op_project) /* order by columns */
exps_print(sql, fout, rel->r, depth, refs, 1, 0,
decorate, 0);
break;
diff --git a/sql/server/rel_optimize_sel.c b/sql/server/rel_optimize_sel.c
--- a/sql/server/rel_optimize_sel.c
+++ b/sql/server/rel_optimize_sel.c
@@ -531,6 +531,7 @@ typedef struct exp_eq_atoms {
typedef struct exp_eq_multi_cols_atoms {
char *cs; /* col(rname, name) concat str */
+ list *first;
list *ces; /* list of col exps */
list *gvs; /* list of lists of atoms */
} mca;
@@ -552,6 +553,7 @@ detect_multivalue_cmp_eqs(mvc *sql, list
bool eq_only = true;
list *l = n->data;
+ // TODO: remove this we already have what we want in cmp_eq
/* check if this list has only cmp_eq with a column lhs and an
atom rhs */
for (node *m = l->h; m && eq_only; m = m->next) {
sql_exp *se = m->data;
@@ -598,12 +600,20 @@ detect_multivalue_cmp_eqs(mvc *sql, list
for (node *m = sl->h; m; m = m->next)
atms = append(atms, ((sql_exp*)m->data)->r);
mcas->gvs = append(mcas->gvs, atms);
+ /* remove this and the previous
occurrence (which means that's the first time
+ * that we found the *same* multi
cmp_eq exp)
+ */
+ if (mcas->first)
+ list_remove_data(ceq_ands,
NULL, mcas->first);
+ list_remove_data(ceq_ands, NULL, sl);
}
}
if (!found) {
mca *mcas = SA_NEW(sql->sa, mca);
mcas->cs = cs;
+ // TODO: explain!!
+ mcas->first = sl;
mcas->ces = sa_list(sql->sa);
for (node *m = sl->h; m; m = m->next)
mcas->ces = append(mcas->ces,
((sql_exp*)m->data)->l);
@@ -746,7 +756,7 @@ merge_ors_NEW(mvc *sql, list *exps, int
if (mas) {
/* from multivalue cmp_eq atoms in the hash
generate
- * "(col1, col2, ...) in [(val10, val20, ...),
(val11, val21, ...)]"
+ * "(col1, col2, ...) in [(val10, val20, ...),
(val11, val21, ...), ... ]"
* see detect_multivalue_cmp_eqs()
*/
mins = new_exp_list(sql->sa);
@@ -754,13 +764,12 @@ merge_ors_NEW(mvc *sql, list *exps, int
sql_hash_e *he = meqh->buckets[i];
while (he) {
mca *mcas = he->value;
+ /* NOTE: multivalue cmp_eq
expressions with a single entry are still in ceq_ands */
if (list_length(mcas->gvs) > 1)
{
sql_exp *mc =
exp_label(sql->sa, exp_values(sql->sa, mcas->ces), ++sql->label);
for (node *a =
mcas->gvs->h; a; a = a->next)
a->data =
exp_values(sql->sa, a->data);
mins = append(mins,
exp_in(sql->sa, mc, mcas->gvs, cmp_in));
- } else {
- /* TODO */
}
he = he->chain;
}
@@ -781,7 +790,7 @@ merge_ors_NEW(mvc *sql, list *exps, int
}
if (mins) {
- for (node *i = ((!ins) ? mins->h->next :
mins->h); i; i = i->next) {
+ for (node *i = ((ins) ? mins->h :
mins->h->next); i; i = i->next) {
list *l = new_exp_list(sql->sa);
list *r = new_exp_list(sql->sa);
l = append(l, new);
@@ -790,6 +799,14 @@ merge_ors_NEW(mvc *sql, list *exps, int
}
}
+ if (list_length(ceq_ands)) {
+ for (node *i = ceq_ands->h; i; i = i->next) {
+ list *l = new_exp_list(sql->sa);
+ l = append(l, new);
+ new = exp_or(sql->sa, l, i->data, 0);
+ }
+ }
+
for (node *a = gen_ands->h; a; a = a->next){
list *l = new_exp_list(sql->sa);
l = append(l, new);
@@ -806,6 +823,8 @@ merge_ors_NEW(mvc *sql, list *exps, int
list_remove_node(exps, NULL, n);
exps = append(exps, new);
+
+ // TODO: should that be per col/multicol group?
(*changes)++;
}
}
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]