Changeset: 0f338bf8861b for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=0f338bf8861b Modified Files: sql/backends/monet5/sql_cat.c sql/include/sql_catalog.h sql/server/rel_distribute.c sql/server/rel_optimizer.c sql/server/rel_propagate.c sql/server/rel_schema.c sql/server/rel_select.c sql/server/rel_updates.c sql/server/sql_partition.c sql/storage/sql_catalog.c sql/storage/store.c Branch: nospare Log Message:
we use a shallow copy, with ref counts. handle renames of schemas again. diffs (truncated from 792 to 300 lines): diff --git a/sql/backends/monet5/sql_cat.c b/sql/backends/monet5/sql_cat.c --- a/sql/backends/monet5/sql_cat.c +++ b/sql/backends/monet5/sql_cat.c @@ -158,7 +158,7 @@ validate_alter_table_add_table(mvc *sql, const char *errtable = TABLE_TYPE_DESCRIPTION(rmt->type, rmt->properties); if (!update && (!isMergeTable(rmt) && !isReplicaTable(rmt))) throw(SQL,call,SQLSTATE(42S02) "ALTER TABLE: cannot add table '%s.%s' to %s '%s.%s'", psname, ptname, errtable, msname, mtname); - node *n = list_find_base_id(rmt->members, rpt->base.id); + node *n = cs_find_id(&rmt->members, rpt->base.id); if (isView(rpt)) throw(SQL,call,SQLSTATE(42000) "ALTER TABLE: can't add a view into a %s", errtable); if (isDeclaredTable(rpt)) @@ -416,7 +416,7 @@ alter_table_del_table(mvc *sql, char *ms const char *errtable = TABLE_TYPE_DESCRIPTION(mt->type, mt->properties); if (!isMergeTable(mt) && !isReplicaTable(mt)) throw(SQL,"sql.alter_table_del_table",SQLSTATE(42S02) "ALTER TABLE: cannot drop table '%s.%s' to %s '%s.%s'", psname, ptname, errtable, msname, mtname); - if (!(n = list_find_base_id(mt->members, pt->base.id))) + if (!(n = cs_find_id(&mt->members, pt->base.id))) throw(SQL,"sql.alter_table_del_table",SQLSTATE(42S02) "ALTER TABLE: table '%s.%s' isn't part of %s '%s.%s'", ps->base.name, ptname, errtable, ms->base.name, mtname); sql_trans_del_table(sql->session->tr, mt, pt, drop_action); @@ -1711,7 +1711,7 @@ SQLrename_table(Client cntxt, MalBlkPtr throw(SQL, "sql.rename_table", SQLSTATE(42000) "ALTER TABLE: not possible to change schema of a view"); if (isDeclaredTable(t)) throw(SQL, "sql.rename_table", SQLSTATE(42000) "ALTER TABLE: not possible to change schema of a declared table"); - if (mvc_check_dependency(sql, t->base.id, TABLE_DEPENDENCY, NULL) || !list_empty(t->members) || !list_empty(t->triggers.set)) + if (mvc_check_dependency(sql, t->base.id, TABLE_DEPENDENCY, NULL) || cs_size(&t->members) || !list_empty(t->triggers.set)) throw(SQL, "sql.rename_table", SQLSTATE(2BM37) "ALTER TABLE: unable to set schema of table '%s' (there are database objects which depend on it)", otable_name); if (!(s = mvc_bind_schema(sql, nschema_name))) throw(SQL, "sql.rename_table", SQLSTATE(42S02) "ALTER TABLE: no such schema '%s'", nschema_name); diff --git a/sql/include/sql_catalog.h b/sql/include/sql_catalog.h --- a/sql/include/sql_catalog.h +++ b/sql/include/sql_catalog.h @@ -255,6 +255,7 @@ typedef struct objectlist { #endif extern void cs_new(changeset * cs, sql_allocator *sa, fdestroy destroy); +extern changeset* cs_dup(changeset * cs); extern void cs_destroy(changeset * cs); extern void cs_add(changeset * cs, void *elm, int flag); extern void *cs_add_with_validate(changeset * cs, void *elm, int flag, fvalidate cmp); @@ -283,7 +284,6 @@ typedef struct sql_schema { changeset types; changeset funcs; changeset seqs; - changeset parts;/* merge/replica tables can only contain parts from the same schema */ list *keys; /* Names for keys, idxs and triggers are */ list *idxs; /* global, but these objects are only */ list *triggers; /* useful within a table */ @@ -694,7 +694,7 @@ typedef struct sql_table { changeset idxs; changeset keys; changeset triggers; - list *members; + changeset members; /* member tables of merge/replica tables */ int drop_action; /* only needed for alter drop table */ void *data; @@ -779,7 +779,7 @@ extern sql_idx *sql_trans_find_idx(sql_t extern sql_column *find_sql_column(sql_table *t, const char *cname); -extern sql_part *find_sql_part_id(sql_table *t, sqlid id); +extern sql_part *find_sql_part_id(sql_trans *tr, sql_table *t, sqlid id); extern sql_table *find_sql_table(sql_trans *tr, sql_schema *s, const char *tname); extern sql_table *find_sql_table_id(sql_trans *tr, sql_schema *s, sqlid id); 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 @@ -195,7 +195,7 @@ replica(mvc *sql, sql_rel *rel, char *ur if (uri) { /* replace by the replica which matches the uri */ - for (n = t->members->h; n; n = n->next) { + for (n = t->members.set->h; n; n = n->next) { sql_part *p = n->data; sql_table *pt = find_sql_table_id(sql->session->tr, t->s, p->base.id); @@ -205,10 +205,10 @@ replica(mvc *sql, sql_rel *rel, char *ur } } } else { /* no match, find one without remote or use first */ - if (t->members) { + if (t->members.set) { int fnd = 0; sql_part *p; - for (n = t->members->h; n; n = n->next) { + for (n = t->members.set->h; n; n = n->next) { sql_part *p = n->data; sql_table *pt = find_sql_table_id(sql->session->tr, t->s, p->base.id); @@ -219,7 +219,7 @@ replica(mvc *sql, sql_rel *rel, char *ur } } if (!fnd) { - p = t->members->h->data; + p = t->members.set->h->data; rel = rewrite_replica(sql, rel, t, p, 1); } } else { 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 @@ -67,7 +67,7 @@ name_find_column( sql_rel *rel, const ch if (strcmp(c->base.name, name) == 0) { *bt = rel; if (pnr < 0 || (mt && - list_position(mt->members, c->t) == pnr)) + list_position(mt->members.set, c->t) == pnr)) return c; } } @@ -77,7 +77,7 @@ name_find_column( sql_rel *rel, const ch if (strcmp(i->base.name, name+1 /* skip % */) == 0) { *bt = rel; if (pnr < 0 || (mt && - list_position(mt->members, i->t) == pnr)) { + list_position(mt->members.set, i->t) == pnr)) { sql_kc *c = i->columns->h->data; return c->c; } @@ -4882,7 +4882,7 @@ rel_part_nr( sql_rel *rel, sql_exp *e ) return -1; sql_table *pp = c->t; sql_table *mt = bt->r; - return list_position(mt->members, pp); + return list_position(mt->members.set, pp); } static int @@ -4905,7 +4905,7 @@ rel_uses_part_nr( sql_rel *rel, sql_exp if (c && bt && bt->r) { sql_table *pp = c->t; sql_table *mt = bt->r; - if (list_position(mt->members, pp) == pnr) + if (list_position(mt->members.set, pp) == pnr) return 1; } /* for projects we may need to do a rename! */ @@ -8828,7 +8828,7 @@ rel_merge_table_rewrite(visitor *v, sql_ char *tname = t->base.name; list *cols = NULL, *ranges = NULL; - if (list_empty(t->members)) + if (cs_size(&t->members)==0) return rel; if (sel) { cols = sa_list(v->sql->sa); @@ -8883,10 +8883,10 @@ rel_merge_table_rewrite(visitor *v, sql_ } } v->changes++; - if (t->members) { + if (t->members.set) { list *tables = sa_list(v->sql->sa); - for (node *nt = t->members->h; nt; nt = nt->next) { + for (node *nt = t->members.set->h; nt; nt = nt->next) { sql_part *pd = nt->data; sql_table *pt = find_sql_table_id(v->sql->session->tr, t->s, pd->base.id); sql_rel *prel = rel_basetable(v->sql, pt, tname), *bt = NULL; @@ -9184,7 +9184,7 @@ rel_merge_table_rewrite(visitor *v, sql_ tables = ntables; } } - if (nrel && list_length(t->members) == 1) { + if (nrel && cs_size(&t->members) == 1) { nrel = rel_project(v->sql->sa, nrel, rel->exps); } else if (nrel) { rel_set_exps(nrel, rel->exps); diff --git a/sql/server/rel_propagate.c b/sql/server/rel_propagate.c --- a/sql/server/rel_propagate.c +++ b/sql/server/rel_propagate.c @@ -592,7 +592,7 @@ rel_generate_subdeletes(mvc *sql, sql_re int just_one = 1; sql_rel *sel = NULL; - for (node *n = t->members->h; n; n = n->next) { + for (node *n = t->members.set->h; n; n = n->next) { sql_part *pt = (sql_part *) n->data; sql_table *sub = find_sql_table_id(sql->session->tr, t->s, pt->base.id); sql_rel *s1, *dup = NULL; @@ -626,7 +626,7 @@ rel_generate_subupdates(mvc *sql, sql_re int just_one = 1; sql_rel *sel = NULL; - for (node *n = t->members->h; n; n = n->next) { + for (node *n = t->members.set->h; n; n = n->next) { sql_part *pt = (sql_part *) n->data; sql_table *sub = find_sql_table_id(sql->session->tr, t->s, pt->base.id); sql_rel *s1, *dup = NULL; @@ -694,7 +694,7 @@ rel_generate_subinserts(sql_query *query } anti_le = rel_generate_anti_insert_expression(sql, &anti_rel, t); - for (node *n = t->members->h; n; n = n->next) { + for (node *n = t->members.set->h; n; n = n->next) { sql_part *pt = (sql_part *) n->data; sql_table *sub = find_sql_table_id(sql->session->tr, t->s, pt->base.id); sql_rel *s1 = NULL, *dup = NULL; @@ -1067,7 +1067,7 @@ rel_propagate(sql_query *query, sql_rel } } if (isMergeTable(t)) { - assert(!list_empty(t->members)); + assert(cs_size(&t->members)); if (is_delete(propagate->op) || is_truncate(propagate->op)) { /* propagate deletions to the partitions */ rel = rel_propagate_delete(sql, rel, t, changes); } else if (isRangePartitionTable(t) || isListPartitionTable(t)) { diff --git a/sql/server/rel_schema.c b/sql/server/rel_schema.c --- a/sql/server/rel_schema.c +++ b/sql/server/rel_schema.c @@ -644,12 +644,12 @@ create_column(sql_query *query, symbol * int res = SQL_OK; (void) ss; - if (alter && !(isTable(t) || (isMergeTable(t) && list_empty(t->members)))) { + if (alter && !(isTable(t) || (isMergeTable(t) && cs_size(&t->members)==0))) { sql_error(sql, 02, SQLSTATE(42000) "ALTER TABLE: cannot add column to %s '%s'%s\n", isMergeTable(t)?"MERGE TABLE": isRemote(t)?"REMOTE TABLE": isReplicaTable(t)?"REPLICA TABLE":"VIEW", - t->base.name, (isMergeTable(t) && !list_empty(t->members)) ? " while it has partitions" : ""); + t->base.name, (isMergeTable(t) && cs_size(&t->members)) ? " while it has partitions" : ""); return SQL_ERR; } if (l->h->next->next) @@ -680,7 +680,7 @@ table_element(sql_query *query, symbol * if (alter && (isView(t) || - ((isMergeTable(t) || isReplicaTable(t)) && (s->token != SQL_TABLE && s->token != SQL_DROP_TABLE && !list_empty(t->members))) || + ((isMergeTable(t) || isReplicaTable(t)) && (s->token != SQL_TABLE && s->token != SQL_DROP_TABLE && cs_size(&t->members))) || (isTable(t) && (s->token == SQL_TABLE || s->token == SQL_DROP_TABLE)) || (isPartition(t) && (s->token == SQL_DROP_COLUMN || s->token == SQL_COLUMN || s->token == SQL_CONSTRAINT)) || (isPartition(t) && @@ -730,7 +730,7 @@ table_element(sql_query *query, symbol * isMergeTable(t)?"MERGE TABLE": isRemote(t)?"REMOTE TABLE": isReplicaTable(t)?"REPLICA TABLE":"VIEW", - t->base.name, (isMergeTable(t) && !list_empty(t->members)) ? " while it has partitions" : ""); + t->base.name, (isMergeTable(t) && cs_size(&t->members)) ? " while it has partitions" : ""); return SQL_ERR; } @@ -1439,7 +1439,7 @@ sql_alter_table(sql_query *query, dlist } return rel_alter_table(sql->sa, ddl_alter_table_add_table, sname, tname, nsname, ntname, 0); } - if ((isMergeTable(pt) || isReplicaTable(pt)) && list_empty(pt->members)) + if ((isMergeTable(pt) || isReplicaTable(pt)) && cs_size(&pt->members)==0) return sql_error(sql, 02, SQLSTATE(42000) "The %s %s.%s should have at least one table associated", TABLE_TYPE_DESCRIPTION(pt->type, pt->properties), pt->s->base.name, pt->base.name); @@ -2304,7 +2304,7 @@ rel_set_table_schema(sql_query *query, c return sql_error(sql, 02, SQLSTATE(42000) "ALTER TABLE: not possible to change a temporary table schema"); if (isView(ot)) return sql_error(sql, 02, SQLSTATE(42000) "ALTER TABLE: not possible to change schema of a view"); - if (mvc_check_dependency(sql, ot->base.id, TABLE_DEPENDENCY, NULL) || !list_empty(ot->members) || !list_empty(ot->triggers.set)) + if (mvc_check_dependency(sql, ot->base.id, TABLE_DEPENDENCY, NULL) || cs_size(&ot->members) || !list_empty(ot->triggers.set)) return sql_error(sql, 02, SQLSTATE(2BM37) "ALTER TABLE: unable to set schema of table '%s' (there are database objects which depend on it)", tname); if (!(ns = mvc_bind_schema(sql, new_schema))) return sql_error(sql, ERR_NOTFOUND, SQLSTATE(42S02) "ALTER TABLE: no such schema '%s'", new_schema); diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c --- a/sql/server/rel_select.c +++ b/sql/server/rel_select.c @@ -975,7 +975,7 @@ table_ref(sql_query *query, sql_rel *rel return sql_error(sql, 02, SQLSTATE(42000) "SELECT: access denied for %s to view '%s.%s'", get_string_global_var(sql, "current_user"), t->s->base.name, tname); return rel; } - if ((isMergeTable(t) || isReplicaTable(t)) && list_empty(t->members)) + if ((isMergeTable(t) || isReplicaTable(t)) && cs_size(&t->members)==0) return sql_error(sql, 02, SQLSTATE(42000) "MERGE or REPLICA TABLE should have at least one table associated"); res = rel_basetable(sql, t, tname); if (!allowed) { @@ -3097,7 +3097,7 @@ rel_binop_(mvc *sql, sql_rel *rel, sql_e l = ol; r = or; } - res = sql_error(sql, ERR_NOTFOUND, SQLSTATE(42000) "SELECT: no such binary operator %s%s%s'%s'(%s,%s)", + res = sql_error(sql, ERR_NOTFOUND, SQLSTATE(42000) "SELECT: no such binary operator %s%s%s'%s'(%s,%s)", sname ? "'":"", sname ? sname : "", sname ? "'.":"", fname, exp_subtype(l)->type->sqlname, exp_subtype(r)->type->sqlname); return res; } @@ -3711,7 +3711,7 @@ static sql_exp * type = exp_subtype(e)->type->sqlname; } - return sql_error(sql, ERR_NOTFOUND, SQLSTATE(42000) "%s: no such aggregate %s%s%s'%s'(%s)", toUpperCopy(uaname, aname), + return sql_error(sql, ERR_NOTFOUND, SQLSTATE(42000) "%s: no such aggregate %s%s%s'%s'(%s)", toUpperCopy(uaname, aname), sname ? "'":"", sname ? sname : "", sname ? "'.":"", aname, type); } } diff --git a/sql/server/rel_updates.c b/sql/server/rel_updates.c --- a/sql/server/rel_updates.c +++ b/sql/server/rel_updates.c @@ -395,7 +395,7 @@ insert_allowed(mvc *sql, sql_table *t, c return sql_error(sql, 02, SQLSTATE(42000) "%s: cannot %s view '%s'", op, opname, tname); } else if (isNonPartitionedTable(t)) { _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list