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

Reply via email to