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 -- [email protected]
To unsubscribe send an email to [email protected]