Changeset: d28de3c310ec for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/d28de3c310ec Modified Files: sql/server/rel_multiset.c sql/server/rel_rel.c sql/server/rel_rel.h sql/server/rel_unnest.c sql/storage/store.c Branch: nested Log Message:
create sequence numbers for unique multiset row ids diffs (155 lines): diff --git a/sql/server/rel_multiset.c b/sql/server/rel_multiset.c --- a/sql/server/rel_multiset.c +++ b/sql/server/rel_multiset.c @@ -67,7 +67,7 @@ fm_insert(visitor *v, sql_rel *rel) static sql_rel * fm_join(visitor *v, sql_rel *rel) { - if (list_empty(rel->exps)) { + if (list_empty(rel->exps) && is_dependent(rel)) { bool needed = false; sql_rel *l = rel->l; sql_rel *r = rel->r; diff --git a/sql/server/rel_rel.c b/sql/server/rel_rel.c --- a/sql/server/rel_rel.c +++ b/sql/server/rel_rel.c @@ -1337,14 +1337,6 @@ list * r = rels->h->data; if (r) exps = _rel_projections(sql, r, tname, settname, intern, basecol); - /* for every other relation in the list */ - // TODO: do we need the assertion here? for no-assert the loop is no-op - /* - for (node *n = rels->h->next; n; n = n->next) { - rexps = _rel_projections(sql, n->data, tname, settname, intern, basecol); - assert(list_length(exps) == list_length(rexps)); - } - */ /* it's a multi-union (expressions have to be the same in all the operands) * so we are ok only with the expressions of the first operand */ @@ -1404,10 +1396,10 @@ rel_projections(mvc *sql, sql_rel *rel, (e_column), in most cases this means go down the join tree and find the base column. */ -static int +static sql_rel * rel_bind_path_(mvc *sql, sql_rel *rel, sql_exp *e, list *path ) { - int found = 0; + sql_rel *found = NULL; if (mvc_highwater(sql)) { sql_error(sql, 10, SQLSTATE(42000) "Query too complex: running out of stack space"); @@ -1426,7 +1418,7 @@ rel_bind_path_(mvc *sql, sql_rel *rel, s if (!found && !list_empty(rel->attr)) { assert(e->nid); if (exps_bind_nid(rel->attr, e->nid)) - found = 1; + found = rel; } break; case op_semi: @@ -1447,11 +1439,11 @@ rel_bind_path_(mvc *sql, sql_rel *rel, s if (is_basetable(rel->op) && !rel->exps) { assert(e->nid); if (rel_base_has_nid(rel, e->nid)) - found = 1; + found = rel; } else if (rel->exps) { assert(e->nid); if (exps_bind_nid(rel->exps, e->nid)) - found = 1; + found = rel; } break; case op_insert: @@ -1462,7 +1454,7 @@ rel_bind_path_(mvc *sql, sql_rel *rel, s case op_ddl: break; } - if (found) + if (path && found) list_prepend(path, rel); return found; } @@ -1490,6 +1482,12 @@ rel_bind_path(mvc *sql, sql_rel *rel, sq return path; } +sql_rel * +rel_bind_nid(mvc *sql, sql_rel *rel, sql_exp *e) +{ + return rel_bind_path_(sql, rel, e, NULL); +} + static sql_rel * rel_select_push_exp_down(mvc *sql, sql_rel *rel, sql_exp *e) { diff --git a/sql/server/rel_rel.h b/sql/server/rel_rel.h --- a/sql/server/rel_rel.h +++ b/sql/server/rel_rel.h @@ -77,6 +77,7 @@ extern sql_rel *rel_select_copy(allocato extern sql_exp *rel_bind_column( mvc *sql, sql_rel *rel, const char *cname, int f, int no_tname); extern sql_exp *rel_bind_column2( mvc *sql, sql_rel *rel, sql_alias *tname, const char *cname, int f ); extern sql_exp *rel_first_column(mvc *sql, sql_rel *rel); +extern sql_rel *rel_bind_nid(mvc *sql, sql_rel *rel, sql_exp *e); extern sql_rel *rel_inplace_basetable(sql_rel *rel, sql_rel *bt); extern sql_rel *rel_inplace_setop(mvc *sql, sql_rel *rel, sql_rel *l, sql_rel *r, operator_type setop, list *exps); diff --git a/sql/server/rel_unnest.c b/sql/server/rel_unnest.c --- a/sql/server/rel_unnest.c +++ b/sql/server/rel_unnest.c @@ -468,13 +468,17 @@ rel_dependent_var(mvc *sql, sql_rel *l, list *freevar = rel_freevar(sql, r); if (freevar) { node *n; - list *boundvar = rel_projections(sql, l, NULL, 1, 0); for(n = freevar->h; n; n = n->next) { sql_exp *e = n->data, *ne = NULL; /* each freevar should be an e_column */ - ne = exps_bind_nid(boundvar, e->nid); - if (ne) { + sql_rel *r = rel_bind_nid(sql, l, e); + if (r) { + ne = exps_bind_nid(r->exps, e->nid); + if (!ne && r->attr) + ne = exps_bind_nid(r->attr, e->nid); + assert(ne); + ne = exp_ref(sql, ne); if (!res) res = sa_list(sql->sa); append(res, ne); diff --git a/sql/storage/store.c b/sql/storage/store.c --- a/sql/storage/store.c +++ b/sql/storage/store.c @@ -3887,6 +3887,8 @@ sql_trans_copy_column( sql_trans *tr, sq col->storage_type = _STRDUP(buf); if ((res = sql_trans_create_table(&tt, tr, t->s, col->storage_type, NULL, tt_table, true, t->persistence, 0, 0, 0)) != LOG_OK) return res; + if (sql_trans_create_sequence(tr, t->s, col->storage_type, 1, 1, lng_nil, 1, 1, false, true) != LOG_OK) + return res; } /* All nested types, need the internal columns for the field contents */ for (node *n = col->type.type->d.fields->h; n; n = n->next) { @@ -4716,6 +4718,8 @@ sys_drop_tc(sql_trans *tr, sql_trigger * static int sys_drop_sequence(sql_trans *tr, sql_sequence * seq, int drop_action) { + if (!seq) + return -1; sqlstore *store = tr->store; sql_schema *syss = find_sql_schema(tr, "sys"); sql_table *sysseqs = find_sql_table(tr, syss, "sequences"); @@ -4848,7 +4852,9 @@ sys_drop_column(sql_trans *tr, sql_colum if ((res = sys_drop_default_object(tr, col, drop_action))) return res; - if (col->type.multiset && col->storage_type && (res = sql_trans_drop_table(tr, col->t->s, col->storage_type, drop_action))) + if (col->type.multiset && col->storage_type && + ((res = sql_trans_drop_table(tr, col->t->s, col->storage_type, drop_action)) || + (res = sql_trans_drop_sequence(tr, col->t->s, find_sql_sequence(tr, col->t->s, col->storage_type), drop_action)))) return res; col->base.deleted = 1; _______________________________________________ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org