Changeset: 3612d4314622 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=3612d4314622 Modified Files: sql/backends/monet5/rel_bin.c sql/backends/monet5/sql.c sql/backends/monet5/sql_cat.c sql/common/sql_changeset.c sql/common/sql_types.c sql/include/sql_catalog.h sql/server/sql_partition.c sql/storage/bat/bat_storage.c sql/storage/sql_storage.h sql/storage/store.c sql/storage/store_sequence.c sql/test/rename/Tests/rename02.sql Branch: rename-sql Log Message:
Introduced TR_RENAMED flag for sql_base. This flag allows to identify if a sql object was renamed during a transaction. The "flag" field of sql_base (now "flags") is now a bit mask listening changes occurred during a transaction. diffs (truncated from 1363 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 @@ -864,7 +864,7 @@ stmt_col( backend *be, sql_column *c, st stmt *sc = stmt_bat(be, c, RDONLY, del?del->partition:0); if (isTable(c->t) && c->t->access != TABLE_READONLY && - (c->base.flag != TR_NEW || c->t->base.flag != TR_NEW /* alter */) && + (!isNew(c) || !isNew(c->t) /* alter */) && (c->t->persistence == SQL_PERSIST || c->t->persistence == SQL_DECLARED_TABLE) && !c->t->commit_action) { stmt *i = stmt_bat(be, c, RD_INS, 0); stmt *u = stmt_bat(be, c, RD_UPD_ID, del?del->partition:0); @@ -882,7 +882,7 @@ stmt_idx( backend *be, sql_idx *i, stmt stmt *sc = stmt_idxbat(be, i, RDONLY, del?del->partition:0); if (isTable(i->t) && i->t->access != TABLE_READONLY && - (i->base.flag != TR_NEW || i->t->base.flag != TR_NEW /* alter */) && + (!isNew(i) || !isNew(i->t) /* alter */) && (i->t->persistence == SQL_PERSIST || i->t->persistence == SQL_DECLARED_TABLE) && !i->t->commit_action) { stmt *ic = stmt_idxbat(be, i, RD_INS, 0); stmt *u = stmt_idxbat(be, i, RD_UPD_ID, del?del->partition:0); diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c --- a/sql/backends/monet5/sql.c +++ b/sql/backends/monet5/sql.c @@ -1922,7 +1922,7 @@ SQLtid(Client cntxt, MalBlkPtr mb, MalSt nr = store_funcs.count_col(tr, c, 1); - if (isTable(t) && t->access == TABLE_WRITABLE && (t->base.flag != TR_NEW /* alter */ ) && + if (isTable(t) && t->access == TABLE_WRITABLE && (!isNew(t) /* alter */ ) && t->persistence == SQL_PERSIST && !t->commit_action) inr = store_funcs.count_col(tr, c, 0); nr -= inr; 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 @@ -65,7 +65,7 @@ table_has_updates(sql_trans *tr, sql_tab if ( b == 0) return -1; cnt |= BATcount(b) > 0; - if (isTable(t) && t->access != TABLE_READONLY && (t->base.flag != TR_NEW /* alter */ ) && + if (isTable(t) && t->access != TABLE_READONLY && (!isNew(t) /* alter */ ) && t->persistence == SQL_PERSIST && !t->commit_action) cnt |= store_funcs.count_col(tr, c, 0) > 0; BBPunfix(b->batCacheid); @@ -1601,7 +1601,7 @@ SQLrename_table(Client cntxt, MalBlkPtr if (!(t = mvc_bind_table(sql, s, old_name))) throw(SQL, "sql.rename_table", SQLSTATE(42S02) "ALTER TABLE: no such table '%s' in schema '%s'", old_name, schema_name); if (t->system) - throw(SQL, "sql.rename_table", SQLSTATE(42000) "ALTER TABLE: cannot rename system table '%s'", old_name); + throw(SQL, "sql.rename_table", SQLSTATE(42000) "ALTER TABLE: cannot rename a system table"); if (!new_name || strcmp(new_name, str_nil) == 0) throw(SQL, "sql.rename_table", SQLSTATE(3F000) "ALTER TABLE: invalid new table name"); if (mvc_bind_table(sql, s, new_name)) @@ -1632,7 +1632,7 @@ SQLrename_column(Client cntxt, MalBlkPtr if (!(t = mvc_bind_table(sql, s, table_name))) throw(SQL, "sql.rename_column", SQLSTATE(42S02) "ALTER TABLE: no such table '%s' in schema '%s'", table_name, schema_name); if (t->system) - throw(SQL, "sql.rename_column", SQLSTATE(42000) "ALTER TABLE: cannot rename system table '%s'", t->base.name); + throw(SQL, "sql.rename_column", SQLSTATE(42000) "ALTER TABLE: cannot rename a column in a system table"); if (isView(t)) throw(SQL, "sql.rename_column", SQLSTATE(42000) "ALTER TABLE: cannot rename column '%s': '%s' is a view", old_name, t->base.name); if (!mvc_bind_column(sql, t, old_name)) diff --git a/sql/common/sql_changeset.c b/sql/common/sql_changeset.c --- a/sql/common/sql_changeset.c +++ b/sql/common/sql_changeset.c @@ -33,12 +33,12 @@ cs_destroy(changeset * cs) } void -cs_add(changeset * cs, void *elm, int flag) +cs_add(changeset * cs, void *elm, int flags) { if (!cs->set) cs->set = list_new(cs->sa, cs->destroy); list_append(cs->set, elm); - if (flag == TR_NEW && !cs->nelm) + if (newFlagSet(flags) && !cs->nelm) cs->nelm = cs->set->t; } @@ -49,14 +49,14 @@ cs_transverse_with_validate(changeset * } void* -cs_add_with_validate(changeset * cs, void *elm, int flag, fvalidate cmp) +cs_add_with_validate(changeset * cs, void *elm, int flags, fvalidate cmp) { void* res = NULL; if (!cs->set) cs->set = list_new(cs->sa, cs->destroy); if((res = list_append_with_validate(cs->set, elm, cmp)) != NULL) return res; - if (flag == TR_NEW && !cs->nelm) + if (newFlagSet(flags) && !cs->nelm) cs->nelm = cs->set->t; return res; } @@ -68,9 +68,9 @@ cs_add_before(changeset * cs, node *n, v } void -cs_del(changeset * cs, node *elm, int flag) +cs_del(changeset * cs, node *elm, int flags) { - if (flag == TR_NEW) { /* remove just added */ + if (newFlagSet(flags)) { /* remove just added */ if (cs->nelm == elm) cs->nelm = elm->next; list_remove_node(cs->set, elm); diff --git a/sql/common/sql_types.c b/sql/common/sql_types.c --- a/sql/common/sql_types.c +++ b/sql/common/sql_types.c @@ -136,14 +136,14 @@ int is_commutative(const char *fnm) } void -base_init(sql_allocator *sa, sql_base * b, sqlid id, int flag, const char *name) +base_init(sql_allocator *sa, sql_base * b, sqlid id, int flags, const char *name) { b->id = id; assert(sa); b->wtime = 0; b->rtime = 0; - b->flag = flag; + b->flags = flags; b->name = NULL; b->refcnt = 1; if (name) @@ -1108,7 +1108,7 @@ sql_create_type(sql_allocator *sa, const { sql_type *t = SA_ZNEW(sa, sql_type); - base_init(sa, &t->base, store_next_oid(), TR_OLD, name); + base_init(sa, &t->base, store_next_oid(), 0, name); t->sqlname = sa_strdup(sa, sqlname); t->digits = digits; t->scale = scale; @@ -1164,7 +1164,7 @@ sql_create_func_(sql_allocator *sa, cons if (!ops) ops = sa_list(sa); - base_init(sa, &t->base, store_next_oid(), TR_OLD, name); + base_init(sa, &t->base, store_next_oid(), 0, name); t->imp = sa_strdup(sa, imp); t->mod = sa_strdup(sa, mod); t->ops = ops; 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 @@ -85,8 +85,8 @@ #define SCALE_EQ 7 /* user defined functions need equal scales */ #define SCALE_DIGITS_FIX 8 /* the geom module requires the types and functions to have the same scale and digits */ -#define TR_OLD 0 #define TR_NEW 1 +#define TR_RENAMED 2 #define RDONLY 0 #define RD_INS 1 @@ -176,15 +176,21 @@ typedef struct sql_base { int wtime; int rtime; int allocated; - int flag; + int flags; int refcnt; sqlid id; char *name; } sql_base; -extern void base_init(sql_allocator *sa, sql_base * b, sqlid id, int flag, const char *name); -extern void base_set_name(sql_base * b, const char *name); -extern void base_destroy(sql_base * b); +#define newFlagSet(x) ((x & TR_NEW) == TR_NEW) +#define removeNewFlag(x) ((x)->base.flags &= ~TR_NEW) +#define isNew(x) (newFlagSet((x)->base.flags)) + +#define setRenamedFlag(x) ((x)->base.flags |= TR_RENAMED) +#define removeRenamedFlag(x) ((x)->base.flags &= ~TR_RENAMED) +#define isRenamed(x) (((x)->base.flags & TR_RENAMED) == TR_RENAMED) + +extern void base_init(sql_allocator *sa, sql_base * b, sqlid id, int flags, const char *name); typedef struct changeset { sql_allocator *sa; diff --git a/sql/server/sql_partition.c b/sql/server/sql_partition.c --- a/sql/server/sql_partition.c +++ b/sql/server/sql_partition.c @@ -374,7 +374,7 @@ initialize_sql_parts(mvc* sql, sql_table sql_table* pt = find_sql_table(mt->s, next->base.name); pt->p = NULL; - cs_del(&mt->members, n, next->base.flag); + cs_del(&mt->members, n, next->base.flags); sql_trans_drop_dependency(sql->session->tr, next->base.id, mt->base.id, TABLE_DEPENDENCY); } for (node *n = new->h; n; n = n->next) { diff --git a/sql/storage/bat/bat_storage.c b/sql/storage/bat/bat_storage.c --- a/sql/storage/bat/bat_storage.c +++ b/sql/storage/bat/bat_storage.c @@ -600,7 +600,7 @@ update_col(sql_trans *tr, sql_column *c, return LOG_ERR; c->data = bat; obat = timestamp_delta(oc->data, tr->stime); - if(dup_bat(tr, c->t, obat, bat, type, isNew(oc), c->base.flag == TR_NEW) == LOG_ERR) + if(dup_bat(tr, c->t, obat, bat, type, isNew(oc), isNew(c)) == LOG_ERR) return LOG_ERR; c->base.allocated = 1; } @@ -630,7 +630,7 @@ update_idx(sql_trans *tr, sql_idx * i, v return LOG_ERR; i->data = bat; obat = timestamp_delta(oi->data, tr->stime); - if(dup_bat(tr, i->t, obat, bat, type, isNew(i), i->base.flag == TR_NEW) == LOG_ERR) + if(dup_bat(tr, i->t, obat, bat, type, isNew(i), isNew(i)) == LOG_ERR) return LOG_ERR; i->base.allocated = 1; } @@ -753,7 +753,7 @@ dup_col(sql_trans *tr, sql_column *oc, s ok = LOG_ERR; else { c->data = bat; - ok = dup_bat(tr, c->t, obat, bat, type, isNew(oc), c->base.flag == TR_NEW); + ok = dup_bat(tr, c->t, obat, bat, type, isNew(oc), isNew(c)); c->base.allocated = 1; } } @@ -774,7 +774,7 @@ dup_idx(sql_trans *tr, sql_idx *i, sql_i ok = LOG_ERR; else { ni->data = bat; - ok = dup_bat(tr, ni->t, obat, bat, type, isNew(i), ni->base.flag == TR_NEW); + ok = dup_bat(tr, ni->t, obat, bat, type, isNew(i), isNew(ni)); ni->base.allocated = 1; } } @@ -836,7 +836,7 @@ append_col(sql_trans *tr, sql_column *c, else { c->data = bat; obat = timestamp_delta(oc->data, tr->stime); - ok = dup_bat(tr, c->t, obat, bat, type, isNew(oc), c->base.flag == TR_NEW); + ok = dup_bat(tr, c->t, obat, bat, type, isNew(oc), isNew(c)); if(ok == LOG_OK) c->base.allocated = 1; } @@ -893,7 +893,7 @@ append_idx(sql_trans *tr, sql_idx * i, v else { i->data = bat; obat = timestamp_delta(oi->data, tr->stime); - ok = dup_bat(tr, i->t, obat, bat, type, isNew(i), i->base.flag == TR_NEW); + ok = dup_bat(tr, i->t, obat, bat, type, isNew(i), isNew(i)); if(ok != LOG_ERR) i->base.allocated = 1; } @@ -1027,7 +1027,7 @@ delete_tab(sql_trans *tr, sql_table * t, sql_column *oc = tr_find_column(tr->parent, c); c->data = timestamp_delta(oc->data, tr->stime); } - bat = c->data; + bat = c->data; if (bat->cached) { bat_destroy(bat->cached); bat->cached = NULL; @@ -1044,7 +1044,7 @@ delete_tab(sql_trans *tr, sql_table * t, sql_idx *oi = tr_find_idx(tr->parent, i); i->data = timestamp_delta(oi->data, tr->stime); } - bat = i->data; + bat = i->data; if (bat && bat->cached) { bat_destroy(bat->cached); bat->cached = NULL; @@ -1092,7 +1092,7 @@ dcount_col(sql_trans *tr, sql_column *c) sql_column *oc = tr_find_column(tr->parent, c); c->data = timestamp_delta(oc->data, tr->stime); } - b = c->data; + b = c->data; if (!b) return 1; if (b->cnt > 1024) { @@ -1147,7 +1147,7 @@ count_del(sql_trans *tr, sql_table *t) sql_table *ot = tr_find_table(tr->parent, t); t->data = timestamp_dbat(ot->data, tr->stime); } - d = t->data; + d = t->data; if (!d) return 0; return d->cnt; @@ -1163,7 +1163,7 @@ count_col_upd(sql_trans *tr, sql_column sql_column *oc = tr_find_column(tr->parent, c); c->data = timestamp_delta(oc->data, tr->stime); } - b = c->data; + b = c->data; if (!b) return 1; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list