Changeset: 13bc30886798 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=13bc30886798 Added Files: sql/test/rename/Tests/rename12.stable.err sql/test/rename/Tests/rename12.stable.out Modified Files: sql/server/sql_mvc.c sql/storage/bat/bat_storage.c sql/storage/sql_storage.h sql/storage/store.c Branch: linear-hashing Log Message:
Fixed rename12 test by passing the right transaction at update_table. Also added missing functions for SQL objects propagation between transactions diffs (truncated from 565 to 300 lines): diff --git a/sql/server/sql_mvc.c b/sql/server/sql_mvc.c --- a/sql/server/sql_mvc.c +++ b/sql/server/sql_mvc.c @@ -1109,7 +1109,7 @@ mvc_bind_trigger(mvc *m, sql_schema *s, } sql_type * -mvc_create_type(mvc *sql, sql_schema * s, const char *name, int digits, int scale, int radix, const char *impl) +mvc_create_type(mvc *sql, sql_schema *s, const char *name, int digits, int scale, int radix, const char *impl) { sql_type *t = NULL; @@ -1441,7 +1441,7 @@ mvc_create_column(mvc *m, sql_table *t, fprintf(stderr, "#mvc_create_column %s %s %s\n", t->base.name, name, tpe->type->sqlname); if (t->persistence == SQL_DECLARED_TABLE && (!t->s || strcmp(t->s->base.name, dt_schema))) /* declared tables should not end up in the catalog */ - return create_sql_column(m->sa, t, name, tpe); + return create_sql_column(m->session->tr, t, name, tpe); else return sql_trans_create_column(m->session->tr, t, name, tpe); } 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 @@ -2822,7 +2822,7 @@ update_table(sql_trans *tr, sql_table *f } } - dup_sql_type(tr, ft->s, &(cc->type), &(oc->type)); + dup_sql_type(tr->parent, ft->s, &(cc->type), &(oc->type)); oc->colnr = cc->colnr; oc->null = cc->null; oc->unique = cc->unique; diff --git a/sql/storage/sql_storage.h b/sql/storage/sql_storage.h --- a/sql/storage/sql_storage.h +++ b/sql/storage/sql_storage.h @@ -470,7 +470,7 @@ extern int sql_trans_check_dependency(sq extern list* sql_trans_owner_schema_dependencies(sql_trans *tr, sqlid id); extern sql_table *create_sql_table(sql_allocator *sa, const char *name, sht type, bit system, int persistence, int commit_action, bit properties); -extern sql_column *create_sql_column(sql_allocator *sa, sql_table *t, const char *name, sql_subtype *tpe); +extern sql_column *create_sql_column(sql_trans *tr, sql_table *t, const char *name, sql_subtype *tpe); extern sql_ukey *create_sql_ukey(sql_allocator *sa, sql_table *t, const char *nme, key_type kt); extern sql_fkey *create_sql_fkey(sql_allocator *sa, sql_table *t, const char *nme, key_type kt, sql_key *rkey, int on_delete, int on_update ); extern sql_key *create_sql_kc(sql_allocator *sa, sql_key *k, sql_column *c); diff --git a/sql/storage/store.c b/sql/storage/store.c --- a/sql/storage/store.c +++ b/sql/storage/store.c @@ -1578,7 +1578,9 @@ create_sql_table(sql_allocator *sa, cons void dup_sql_type(sql_trans *tr, sql_schema *os, sql_subtype *oc, sql_subtype *nc) { - *nc = *oc; + nc->digits = oc->digits; + nc->scale = oc->scale; + nc->type = oc->type; if (nc->type->s) { /* user type */ sql_type *lt = NULL; @@ -3448,6 +3450,8 @@ type_dup(sql_trans *tr, int flags, sql_t t->bits = ot->bits; t->localtype = ot->localtype; t->s = s; + if (isNew(ot) && newFlagSet(flags) && tr->parent == gtrans) + removeNewFlag(ot); return t; } @@ -3494,11 +3498,13 @@ func_dup(sql_trans *tr, int flags, sql_f } f->s = s; f->sa = sa; + if (isNew(of) && newFlagSet(flags) && tr->parent == gtrans) + removeNewFlag(of); return f; } static sql_sequence * -seq_dup(sql_trans *tr, int flags, sql_sequence *oseq, sql_schema * s) +seq_dup(sql_trans *tr, int flags, sql_sequence *oseq, sql_schema *s) { sql_allocator *sa = (newFlagSet(flags))?tr->parent->sa:tr->sa; sql_sequence *seq = SA_ZNEW(sa, sql_sequence); @@ -3512,6 +3518,8 @@ seq_dup(sql_trans *tr, int flags, sql_se seq->cacheinc = oseq->cacheinc; seq->cycle = oseq->cycle; seq->s = s; + if (isNew(oseq) && newFlagSet(flags) && tr->parent == gtrans) + removeNewFlag(oseq); return seq; } @@ -3658,6 +3666,30 @@ trans_init(sql_trans *tr, backend_stack assert(0); } } + if (ps->seqs.set && s->seqs.set) + for (k = ps->seqs.set->h, l = s->seqs.set->h; k && l; k = k->next, l = l->next ) { + sql_sequence *pt = k->data; /* parent transactions sequence */ + sql_sequence *t = l->data; + + t->base.rtime = t->base.wtime = 0; + t->base.stime = pt->base.wtime; + } + if (ps->funcs.set && s->funcs.set) + for (k = ps->funcs.set->h, l = s->funcs.set->h; k && l; k = k->next, l = l->next ) { + sql_func *pt = k->data; /* parent transactions func */ + sql_func *t = l->data; + + t->base.rtime = t->base.wtime = 0; + t->base.stime = pt->base.wtime; + } + if (ps->types.set && s->types.set) + for (k = ps->types.set->h, l = s->types.set->h; k && l; k = k->next, l = l->next ) { + sql_type *pt = k->data; /* parent transactions type */ + sql_type *t = l->data; + + t->base.rtime = t->base.wtime = 0; + t->base.stime = pt->base.wtime; + } } else { /* for now assert */ assert(0); @@ -4082,7 +4114,7 @@ rollforward_drop_key(sql_trans *tr, sql_ } static int -rollforward_drop_trigger(sql_trans *tr, sql_trigger * i, int mode) +rollforward_drop_trigger(sql_trans *tr, sql_trigger *i, int mode) { (void)tr; if (mode == R_APPLY) @@ -4091,7 +4123,7 @@ rollforward_drop_trigger(sql_trans *tr, } static int -rollforward_drop_seq(sql_trans *tr, sql_sequence * seq, int mode) +rollforward_drop_seq(sql_trans *tr, sql_sequence *seq, int mode) { (void)tr; (void)seq; @@ -4101,6 +4133,24 @@ rollforward_drop_seq(sql_trans *tr, sql_ } static int +rollforward_drop_type(sql_trans *tr, sql_type *t, int mode) +{ + (void)tr; + (void)t; + (void)mode; + return LOG_OK; +} + +static int +rollforward_drop_func(sql_trans *tr, sql_func *f, int mode) +{ + (void)tr; + (void)f; + (void)mode; + return LOG_OK; +} + +static int rollforward_drop_table(sql_trans *tr, sql_table *t, int mode) { int ok = LOG_OK; @@ -4131,17 +4181,27 @@ rollforward_drop_schema(sql_trans *tr, s { int ok = LOG_OK; - ok = rollforward_changeset_deletes(tr, &s->seqs, (rfdfunc) &rollforward_drop_seq, mode); + ok = rollforward_changeset_deletes(tr, &s->types, (rfdfunc) &rollforward_drop_type, mode); + if (ok == LOG_OK) + ok = rollforward_changeset_deletes(tr, &s->tables, (rfdfunc) &rollforward_drop_table, mode); if (ok == LOG_OK) - return rollforward_changeset_deletes(tr, &s->tables, (rfdfunc) &rollforward_drop_table, mode); + ok = rollforward_changeset_deletes(tr, &s->funcs, (rfdfunc) &rollforward_drop_func, mode); + if (ok == LOG_OK) + ok = rollforward_changeset_deletes(tr, &s->seqs, (rfdfunc) &rollforward_drop_seq, mode); return ok; } static sql_schema * rollforward_create_schema(sql_trans *tr, sql_schema *s, int mode) { + if (rollforward_changeset_creates(tr, &s->types, (rfcfunc) &rollforward_create_type, mode) != LOG_OK) + return NULL; if (rollforward_changeset_creates(tr, &s->tables, (rfcfunc) &rollforward_create_table, mode) != LOG_OK) return NULL; + if (rollforward_changeset_creates(tr, &s->funcs, (rfcfunc) &rollforward_create_func, mode) != LOG_OK) + return NULL; + if (rollforward_changeset_creates(tr, &s->seqs, (rfcfunc) &rollforward_create_seq, mode) != LOG_OK) + return NULL; return s; } @@ -4306,13 +4366,13 @@ rollforward_update_schema(sql_trans *tr, } if (ok == LOG_OK) - ok = rollforward_changeset_updates(tr, &fs->types, &ts->types, &ts->base, (rfufunc) NULL, (rfcfunc) &rollforward_create_type, (rfdfunc) NULL, (dupfunc) &type_dup, mode); + ok = rollforward_changeset_updates(tr, &fs->types, &ts->types, &ts->base, (rfufunc) NULL, (rfcfunc) &rollforward_create_type, (rfdfunc) &rollforward_drop_type, (dupfunc) &type_dup, mode); if (ok == LOG_OK) ok = rollforward_changeset_updates(tr, &fs->tables, &ts->tables, &ts->base, (rfufunc) &rollforward_update_table, (rfcfunc) &rollforward_create_table, (rfdfunc) &rollforward_drop_table, (dupfunc) &conditional_table_dup, mode); if (ok == LOG_OK) /* last as it may require complex (table) types */ - ok = rollforward_changeset_updates(tr, &fs->funcs, &ts->funcs, &ts->base, (rfufunc) NULL, (rfcfunc) &rollforward_create_func, (rfdfunc) NULL, (dupfunc) &func_dup, mode); + ok = rollforward_changeset_updates(tr, &fs->funcs, &ts->funcs, &ts->base, (rfufunc) NULL, (rfcfunc) &rollforward_create_func, (rfdfunc) &rollforward_drop_func, (dupfunc) &func_dup, mode); if (ok == LOG_OK) /* last as it may require complex (table) types */ ok = rollforward_changeset_updates(tr, &fs->seqs, &ts->seqs, &ts->base, (rfufunc) &rollforward_update_seq, (rfcfunc) &rollforward_create_seq, (rfdfunc) &rollforward_drop_seq, (dupfunc) &seq_dup, mode); @@ -4505,6 +4565,50 @@ reset_idx(sql_trans *tr, sql_idx *fi, sq } static int +reset_type(sql_trans *tr, sql_type *ft, sql_type *pft) +{ + /* did we access the type or is the global changed after we started */ + if (ft->base.rtime || ft->base.wtime || tr->stime < pft->base.wtime) { + + ft->sqlname = pft->sqlname; + ft->radix = pft->radix; + ft->eclass = pft->eclass; + ft->bits = pft->bits; + ft->localtype = pft->localtype; + ft->digits = pft->digits; + ft->scale = pft->scale; + ft->s = find_sql_schema(tr, pft->s->base.name); + } + return LOG_OK; +} + +static int +reset_func(sql_trans *tr, sql_func *ff, sql_func *pff) +{ + /* did we access the type or is the global changed after we started */ + if (ff->base.rtime || ff->base.wtime || tr->stime < pff->base.wtime) { + + ff->imp = pff->imp; + ff->mod = pff->mod; + ff->type = pff->type; + ff->query = pff->query; + ff->lang = pff->lang; + ff->sql = pff->sql; + ff->side_effect = pff->side_effect; + ff->varres = pff->varres; + ff->vararg = pff->vararg; + ff->ops = pff->ops; + ff->res = pff->res; + ff->fix_scale = pff->fix_scale; + ff->system = pff->system; + ff->ops = pff->ops; + ff->s = find_sql_schema(tr, pff->s->base.name); + ff->sa = tr->sa; + } + return LOG_OK; +} + +static int reset_column(sql_trans *tr, sql_column *fc, sql_column *pfc) { /* did we access the column or is the global changed after we started */ @@ -4677,9 +4781,9 @@ reset_schema(sql_trans *tr, sql_schema * } if (ok == LOG_OK) - ok = reset_changeset(tr, &fs->types, &pfs->types, &fs->base, (resetf) NULL, (dupfunc) &type_dup); + ok = reset_changeset(tr, &fs->types, &pfs->types, &fs->base, (resetf) &reset_type, (dupfunc) &type_dup); if (ok == LOG_OK) - ok = reset_changeset(tr, &fs->funcs, &pfs->funcs, &fs->base, (resetf) NULL, (dupfunc) &func_dup); + ok = reset_changeset(tr, &fs->funcs, &pfs->funcs, &fs->base, (resetf) &reset_func, (dupfunc) &func_dup); if (ok == LOG_OK) ok = reset_changeset(tr, &fs->seqs, &pfs->seqs, &fs->base, (resetf) &reset_seq, (dupfunc) &seq_dup); if (ok == LOG_OK) @@ -5333,7 +5437,7 @@ sys_drop_sequences(sql_trans *tr, sql_sc } sql_type * -sql_trans_create_type(sql_trans *tr, sql_schema * s, const char *sqlname, int digits, int scale, int radix, const char *impl) +sql_trans_create_type(sql_trans *tr, sql_schema *s, const char *sqlname, int digits, int scale, int radix, const char *impl) { sql_type *t; sql_table *systype; @@ -5933,7 +6037,11 @@ sql_trans_set_table_schema(sql_trans *tr m->t = t; list_append(tr->moved_tables, m); - tr->wtime = tr->wstime; + t->base.wtime = os->base.wtime = ns->base.wtime = tr->wtime = tr->wstime; + for (node *n = t->columns.set->h ; n ; n = n->next) { + sql_column *col = (sql_column*) n->data; + col->base.wtime = tr->wstime; /* the table's columns types have to be set again */ + } tr->schema_updates ++; return t; } @@ -6155,12 +6263,12 @@ create_sql_idx(sql_allocator *sa, sql_ta } _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list