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

Reply via email to