Changeset: 4424f1801849 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/4424f1801849 Modified Files: sql/backends/monet5/rel_bin.c sql/backends/monet5/rel_physical.c sql/backends/monet5/sql.c sql/backends/monet5/sql_execute.c sql/backends/monet5/sql_statement.c sql/backends/monet5/sql_statement.h sql/backends/monet5/vaults/csv/csv.c sql/include/sql_relation.h sql/server/rel_basetable.c sql/server/rel_basetable.h sql/server/rel_dump.c sql/server/rel_exp.c sql/server/rel_exp.h sql/server/rel_optimize_exps.c sql/server/rel_optimize_others.c sql/server/rel_optimize_proj.c sql/server/rel_optimize_sel.c sql/server/rel_optimizer.c sql/server/rel_propagate.c sql/server/rel_psm.c sql/server/rel_rel.c sql/server/rel_rel.h sql/server/rel_schema.c sql/server/rel_select.c sql/server/rel_semantic.c sql/server/rel_statistics.c sql/server/rel_unnest.c sql/server/rel_updates.c sql/server/sql_mvc.c sql/server/sql_mvc.h sql/test/BugTracker-2023/Tests/misc-crashes-7390.test sql/test/BugTracker-2024/Tests/atom_cmp-Bug-7477.test Branch: label Log Message:
create label branch, ie better expression uniques diffs (truncated from 3922 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 @@ -246,6 +246,28 @@ bin_find_column(backend *be, stmt *sub, return list_find_column(be, sub->op4.lval, rname, name); } +static stmt * +list_find_column_nid(backend *be, list *l, int label) +{ + (void)be; + if (!l) + return NULL; + for (node *n = l->h; n; n = n->next) { + stmt *s = n->data; + + if (s->label == label) + return s; + } + return NULL; +} + +static stmt * +bin_find_column_nid(backend *be, stmt *sub, int label) +{ + list *l = sub->op4.lval; + return list_find_column_nid(be, l, label); +} + static list * bin_find_columns(backend *be, stmt *sub, const char *name) { @@ -354,11 +376,13 @@ row2cols(backend *be, stmt *sub) for (n = sub->op4.lval->h; n; n = n->next) { stmt *sc = n->data; + assert(sc->type == st_alias); const char *cname = column_name(be->mvc->sa, sc); const char *tname = table_name(be->mvc->sa, sc); + int label = sc->label; sc = column(be, sc); - list_append(l, stmt_alias(be, sc, tname, cname)); + list_append(l, stmt_alias(be, sc, label, tname, cname)); } sub = stmt_list(be, l); } @@ -428,14 +452,16 @@ subrel_project(backend *be, stmt *s, lis if (c->type != st_alias) { c = stmt_project(be, cand, c); } else if (c->op1->type == st_mirror && is_tid_chain(cand)) { /* alias with mirror (ie full row ids) */ - c = stmt_alias(be, cand, c->tname, c->cname); + //c = stmt_alias(be, cand, 0, c->tname, c->cname); + c = stmt_as(be, cand, c); } else { /* st_alias */ stmt *s = c->op1; if (s->nrcols == 0) s = stmt_const(be, cand, s); else s = stmt_project(be, cand, s); - c = stmt_alias(be, s, c->tname, c->cname); + //c = stmt_alias(be, s, c->flag, c->tname, c->cname); + c = stmt_as(be, s, c); } append(l, c); } @@ -1728,9 +1754,11 @@ exp_bin(backend *be, sql_exp *e, stmt *l } break; case e_column: { if (right) /* check relation names */ - s = bin_find_column(be, right, e->l, e->r); + //s = bin_find_column(be, right, e->l, e->r); + s = bin_find_column_nid(be, right, e->nid); if (!s && left) - s = bin_find_column(be, left, e->l, e->r); + //s = bin_find_column(be, left, e->l, e->r); + s = bin_find_column_nid(be, left, e->nid); if (s && grp) s = stmt_project(be, ext, s); if (!s && right) { @@ -2080,7 +2108,7 @@ rel2bin_sql_table(backend *be, sql_table const char *rnme = t->base.name; stmt *sc = dels?dels:stmt_tid(be, t, 0); - sc = stmt_alias(be, sc, rnme, TID); + sc = stmt_alias(be, sc, e->alias.label, rnme, TID); list_append(l, sc); } else { node *m = ol_find_name(t->idxs, name+1); @@ -2091,7 +2119,7 @@ rel2bin_sql_table(backend *be, sql_table const char *rnme = t->base.name; /* index names are prefixed, to make them independent */ - sc = stmt_alias(be, sc, rnme, sa_strconcat(sql->sa, "%", i->base.name)); + sc = stmt_alias(be, sc, e->alias.label, rnme, sa_strconcat(sql->sa, "%", i->base.name)); list_append(l, sc); } } else { @@ -2100,10 +2128,13 @@ rel2bin_sql_table(backend *be, sql_table assert(0); sql_column *c = m->data; stmt *sc = stmt_col(be, c, dels, dels->partition); + sc = stmt_alias(be, sc, e->alias.label, exp_relname(e), exp_name(e)); list_append(l, sc); } } } else { + assert(0); + sql_exp *e = NULL; for (n = ol_first_node(t->columns); n; n = n->next) { sql_column *c = n->data; stmt *sc = stmt_col(be, c, dels, dels->partition); @@ -2116,7 +2147,7 @@ rel2bin_sql_table(backend *be, sql_table const char *rnme = t->base.name; stmt *sc = dels?dels:stmt_tid(be, t, 0); - sc = stmt_alias(be, sc, rnme, TID); + sc = stmt_alias(be, sc, e->alias.label, rnme, TID); list_append(l, sc); } if (t->idxs) { @@ -2126,7 +2157,7 @@ rel2bin_sql_table(backend *be, sql_table const char *rnme = t->base.name; /* index names are prefixed, to make them independent */ - sc = stmt_alias(be, sc, rnme, sa_strconcat(sql->sa, "%", i->base.name)); + sc = stmt_alias(be, sc, e->alias.label, rnme, sa_strconcat(sql->sa, "%", i->base.name)); list_append(l, sc); } } @@ -2179,7 +2210,7 @@ rel2bin_basetable(backend *be, sql_rel * assert(!is_func(exp->type)); if (oname[0] == '%' && strcmp(oname, TID) == 0) { /* tid function sql.tid(t) */ - const char *rnme = t->base.name; + //const char *rnme = t->base.name; if (col) s = stmt_mirror(be, col); @@ -2187,7 +2218,7 @@ rel2bin_basetable(backend *be, sql_rel * s = dels?dels:stmt_tid(be, t, 0); dels = NULL; } - s = stmt_alias(be, s, rnme, TID); + //s = stmt_alias(be, s, exp->alias.label, rnme, TID); } else if (oname[0] == '%') { sql_idx *i = find_sql_idx(t, oname+1); @@ -2195,13 +2226,17 @@ rel2bin_basetable(backend *be, sql_rel * if ((hash_index(i->type) && list_length(i->columns) <= 1) || !idx_has_column(i->type)) continue; s = (i == fi) ? col : stmt_idx(be, i, NULL/*dels*/, dels->partition); + //s = stmt_alias(be, s, exp->alias.label, rname, exp_name(exp)); } else { sql_column *c = find_sql_column(t, oname); s = (c == fcol) ? col : stmt_col(be, c, NULL/*dels*/, dels->partition); - } - s->tname = rname; - s->cname = exp_name(exp); + //s = stmt_alias(be, s, exp->alias.label, rname, exp_name(exp)); + } + s = stmt_alias(be, s, exp->alias.label, rname, exp_name(exp)); + //s->tname = rname; + //s->cname = exp_name(exp); + //s->flag = exp->alias.label; list_append(l, s); } stmt *res = stmt_list(be, l); @@ -2280,7 +2315,9 @@ exp2bin_args(backend *be, sql_exp *e, li if (!list_find(args, buf, (fcmp)&alias_cmp)) { stmt *s = stmt_var(be, vname->sname, vname->name, &e->tpe, 0, e->flag); - s = stmt_alias(be, s, NULL, sa_strdup(sql->sa, buf)); + if (!e->alias.label) + exp_label(be->mvc->sa, e, ++be->mvc->label); + s = stmt_alias(be, s, e->alias.label, NULL, sa_strdup(sql->sa, buf)); list_append(args, s); } } @@ -2378,18 +2415,22 @@ rel2bin_table(backend *be, sql_rel *rel, if (l == NULL) return NULL; - for (n = ol_first_node(ti->t->columns); n; n = n->next) { + assert(list_length(rel->exps) == ((ti->type == 2)?2:1) * ol_length(ti->t->columns)); + for (n = ol_first_node(ti->t->columns), en = rel->exps->h; n && en; n = n->next, en = en->next) { sql_column *c = n->data; + sql_exp *e = en->data; if (ti->type == 2) { /* updates */ stmt *s = stmt_col(be, c, ti->tids, ti->tids->partition); - append(l, stmt_alias(be, s, ti->on, c->base.name)); + append(l, stmt_alias(be, s, e->alias.label, ti->on, c->base.name)); + en = en->next; + e = en->data; } if (ti->updates && ti->updates[c->colnr]) { - append(l, stmt_alias(be, ti->updates[c->colnr], ti->nn, c->base.name)); + append(l, stmt_alias(be, ti->updates[c->colnr], e->alias.label, ti->nn, c->base.name)); } else { stmt *s = stmt_col(be, c, ti->tids, ti->tids->partition); - append(l, stmt_alias(be, s, ti->nn, c->base.name)); + append(l, stmt_alias(be, s, e->alias.label, ti->nn, c->base.name)); assert(ti->type != 1); } } @@ -2452,7 +2493,7 @@ rel2bin_table(backend *be, sql_rel *rel, const char *rnme = exp_relname(exp)?exp_relname(exp):exp->l; stmt *s = stmt_rs_column(be, psub, i, st); - s = stmt_alias(be, s, rnme, exp_name(exp)); + s = stmt_alias(be, s, exp->alias.label, rnme, exp_name(exp)); list_append(l, s); } } else { @@ -2525,7 +2566,7 @@ rel2bin_table(backend *be, sql_rel *rel, sql_exp *exp = m->data; stmt *s = stmt_rs_column(be, psub, i, exp_subtype(exp)); - s = stmt_alias(be, s, exp->l, exp->r); + s = stmt_alias(be, s, exp->alias.label, exp->l, exp->r); list_append(l, s); } } @@ -2535,13 +2576,14 @@ rel2bin_table(backend *be, sql_rel *rel, stmt *s = stmt_rs_column(be, psub, i, &a->type); const char *rnme = exp_relname(exp)?exp_relname(exp):exp_find_rel_name(op); - s = stmt_alias(be, s, rnme, a->name); + s = stmt_alias(be, s, exp->alias.label, rnme, a->name); list_append(l, s); } } } assert(rel->flag != TABLE_PROD_FUNC || !sub || !(sub->nrcols)); sub = stmt_list(be, l); + return sub; } else if (rel->l) { /* handle sub query via function */ int i; char name[16], *nme; @@ -2562,7 +2604,7 @@ rel2bin_table(backend *be, sql_rel *rel, const char *nme = exp_name(c); const char *rnme = exp_relname(c); - s = stmt_alias(be, s, rnme, nme); + s = stmt_alias(be, s, c->alias.label, rnme, nme); list_append(l, s); } sub = stmt_list(be, l); @@ -2577,7 +2619,8 @@ rel2bin_table(backend *be, sql_rel *rel, for (en = rel->exps->h; en; en = en->next) { sql_exp *exp = en->data; const char *rnme = exp_relname(exp)?exp_relname(exp):exp->l; - stmt *s = bin_find_column(be, sub, exp->l, exp->r); + //stmt *s = bin_find_column(be, sub, exp->l, exp->r); + stmt *s = bin_find_column_nid(be, sub, exp->nid); if (!s) { assert(sql->session->status == -10); /* Stack overflow errors shouldn't terminate the server */ @@ -2585,7 +2628,7 @@ rel2bin_table(backend *be, sql_rel *rel, } if (sub && sub->nrcols >= 1 && s->nrcols == 0) s = stmt_const(be, bin_find_smallest_column(be, sub), s); - s = stmt_alias(be, s, rnme, exp_name(exp)); + s = stmt_alias(be, s, exp->alias.label, rnme, exp_name(exp)); list_append(l, s); } if (osub && osub->nrcols) @@ -2969,20 +3012,22 @@ rel2bin_groupjoin(backend *be, sql_rel * /* first project using equi-joins */ for (n = left->op4.lval->h; n; n = n->next) { stmt *c = n->data; + assert(c->type == st_alias); const char *rnme = table_name(sql->sa, c); const char *nme = column_name(sql->sa, c); stmt *s = stmt_project(be, jl, column(be, c)); - s = stmt_alias(be, s, rnme, nme); + s = stmt_alias(be, s, c->label, rnme, nme); list_append(nl, s); } for (n = right->op4.lval->h; n; n = n->next) { stmt *c = n->data; + assert(c->type == st_alias); const char *rnme = table_name(sql->sa, c); const char *nme = column_name(sql->sa, c); stmt *s = stmt_project(be, jr, column(be, c)); - s = stmt_alias(be, s, rnme, nme); + s = stmt_alias(be, s, c->label, rnme, nme); list_append(nl, s); } left = sub = stmt_list(be, nl); @@ -3034,21 +3079,23 @@ rel2bin_groupjoin(backend *be, sql_rel * l = sa_list(sql->sa); for (n = left->op4.lval->h; n; n = n->next) { stmt *c = n->data; + assert(c->type == st_alias); const char *rnme = table_name(sql->sa, c); _______________________________________________ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org