Changeset: 94f122a340b6 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=94f122a340b6 Modified Files: sql/backends/monet5/sql.c sql/server/rel_schema.c sql/storage/sql_storage.h sql/storage/store.c sql/storage/store_dependency.c sql/test/mergetables/Tests/All Branch: default Log Message:
some merge table fixes, more checks added. Dependencies added. diffs (143 lines): 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 @@ -564,7 +564,7 @@ alter_table(mvc *sql, char *sname, sql_t sql_column *c = n->data; sql_column *nc = mvc_bind_column(sql, nt, c->base.name); - if (c->null != nc->null) { + if (c->null != nc->null && isTable(nt)) { mvc_null(sql, nc, c->null); /* for non empty check for nulls */ if (c->null == 0) { 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 @@ -604,7 +604,7 @@ table_element(mvc *sql, symbol *s, sql_s { int res = SQL_OK; - if (alter && (isView(t) || ((isMergeTable(t) || isReplicaTable(t)) && s->token != SQL_TABLE && s->token != SQL_DROP_TABLE) || (isTable(t) && (s->token == SQL_TABLE || s->token == SQL_DROP_TABLE)) )){ + if (alter && (isView(t) || ((isMergeTable(t) || isReplicaTable(t)) && (s->token != SQL_TABLE && s->token != SQL_DROP_TABLE && cs_size(&t->tables)>0)) || (isTable(t) && (s->token == SQL_TABLE || s->token == SQL_DROP_TABLE)) )){ char *msg = ""; switch (s->token) { @@ -1072,6 +1072,21 @@ rel_check_tables(mvc *sql, sql_table *nt return -2; } } + if (cs_size(&nt->idxs) != cs_size(&nnt->idxs)) { + (void) sql_error(sql, 02, "3F000!ALTER MERGE TABLE: to be added table index doesn't match MERGE TABLE definition"); + return -1; + } + if (cs_size(&nt->idxs)) + for (n = nt->idxs.set->h, m = nnt->idxs.set->h; n && m; n = n->next, m = m->next) { + sql_idx *ni = n->data; + sql_idx *mi = m->data; + + /* todo check def */ + if (ni->type != mi->type) { + (void) sql_error(sql, 02, "3F000!ALTER MERGE TABLE: to be added table index type doesn't match MERGE TABLE definition"); + return -2; + } + } return 0; } @@ -1120,6 +1135,9 @@ rel_alter_table(mvc *sql, dlist *qname, if (t->s && !nt->s) nt->s = t->s; + if (nt->type == tt_merge_table) + return sql_error(sql, 02, "42S02!ALTER TABLE: read only MERGE TABLES are not supported"); + if (state == tr_readonly) { nt = mvc_readonly(sql, nt, 1); } else { @@ -1162,6 +1180,9 @@ rel_alter_table(mvc *sql, dlist *qname, } } + if (!isTable(nt)) + return res; + /* new columns need update with default values */ updates = table_update_array(sql, nt); e = exp_column(sql->sa, nt->base.name, "%TID%", sql_bind_localtype("oid"), CARD_MULTI, 0, 1); 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 @@ -364,6 +364,7 @@ extern void sql_trans_end(sql_session *s extern list* sql_trans_schema_user_dependencies(sql_trans *tr, int schema_id); extern void sql_trans_create_dependency(sql_trans *tr, int id, int depend_id, short depend_type); extern void sql_trans_drop_dependencies(sql_trans *tr, int depend_id); +extern void sql_trans_drop_dependency(sql_trans *tr, int id, int depend_id, short depend_type); extern list* sql_trans_get_dependencies(sql_trans *tr, int id, short depend_type, list *ignore_ids); extern int sql_trans_get_dependency_type(sql_trans *tr, int depend_id, short depend_type); extern int sql_trans_check_dependency(sql_trans *tr, int id, int depend_id, short depend_type); diff --git a/sql/storage/store.c b/sql/storage/store.c --- a/sql/storage/store.c +++ b/sql/storage/store.c @@ -3916,7 +3916,8 @@ sql_trans_add_table(sql_trans *tr, sql_t sql_table *sysobj = find_sql_table(syss, "objects"); int nr = list_length(mt->tables.set); - /* TODO add dependency betweem mt/pt */ + /* merge table depends on part table */ + sql_trans_create_dependency(tr, pt->base.id, mt->base.id, TABLE_DEPENDENCY); cs_add(&mt->tables, pt, TR_NEW); pt->p = mt; mt->s->base.wtime = mt->base.wtime = tr->wtime = tr->wstime; @@ -3932,7 +3933,8 @@ sql_trans_del_table(sql_trans *tr, sql_t node *n = cs_find_name(&mt->tables, pt->base.name); oid rid = table_funcs.column_find_row(tr, find_sql_column(sysobj, "name"), pt->base.name, NULL); - /* TODO drop dependency betweem mt/pt */ + /* merge table depends on part table */ + sql_trans_create_dependency(tr, pt->base.id, mt->base.id, TABLE_DEPENDENCY); cs_del(&mt->tables, n, pt->base.flag); mt->s->base.wtime = mt->base.wtime = tr->wtime = tr->wstime; table_funcs.table_delete(tr, sysobj, rid); diff --git a/sql/storage/store_dependency.c b/sql/storage/store_dependency.c --- a/sql/storage/store_dependency.c +++ b/sql/storage/store_dependency.c @@ -63,6 +63,25 @@ sql_trans_drop_dependencies(sql_trans* t table_funcs.rids_destroy(rs); } +/*Function to drop the dependency between object and target, ie obj_id/depend_id*/ +void +sql_trans_drop_dependency(sql_trans* tr, sqlid obj_id, sqlid depend_id, short depend_type) +{ + oid rid; + sql_schema * s = find_sql_schema(tr, "sys"); + sql_table* deps = find_sql_table(s, "dependencies"); + sql_column *dep_obj_id = find_sql_column(deps, "id"); + sql_column *dep_dep_id = find_sql_column(deps, "depend_id"); + sql_column *dep_dep_type = find_sql_column(deps, "depend_type"); + rids *rs; + + rs = table_funcs.rids_select(tr, dep_obj_id, &obj_id, &obj_id, dep_dep_id, &depend_id, &depend_id, dep_dep_type, &depend_type, &depend_type, NULL); + for(rid = table_funcs.rids_next(rs); rid != oid_nil; rid = table_funcs.rids_next(rs)) + table_funcs.table_delete(tr, deps, rid); + table_funcs.rids_destroy(rs); +} + + /*It returns a list with depend_id_1, depend_type_1, depend_id_2, depend_type_2, ....*/ list* sql_trans_get_dependencies(sql_trans* tr, int id, short depend_type, list * ignore_ids) diff --git a/sql/test/mergetables/Tests/All b/sql/test/mergetables/Tests/All --- a/sql/test/mergetables/Tests/All +++ b/sql/test/mergetables/Tests/All @@ -5,7 +5,6 @@ emptymergequery alter types forex -#mergedrop corrupts the database -#mergekey crashes based on select -#crash0 crashes the server - +mergedrop +mergekey +crash0 _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list