Changeset: 16e93544cc19 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=16e93544cc19
Modified Files:
        sql/storage/store.c
Branch: nospare
Log Message:

improved parts handling


diffs (141 lines):

diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -3724,18 +3724,39 @@ sys_drop_columns(sql_trans *tr, sql_tabl
 }
 
 static void
-sys_drop_part(sql_trans *tr, sql_table *t, int drop_action)
-{
-       sql_part *pt = NULL;
-       do {
-               pt = partition_find_part(tr, t, NULL);
-               if (pt)
-                       sql_trans_del_table(tr, pt->t, t, drop_action);
-       } while(pt);
+sys_drop_part(sql_trans *tr, sql_part *pt, int drop_action)
+{
+       sqlstore *store = tr->store;
+       sql_table *mt = pt->t;
+       sql_schema *syss = find_sql_schema(tr, isGlobal(mt)?"sys":"tmp");
+       sql_table *sysobj = find_sql_table(tr, syss, "objects");
+       oid obj_oid = store->table_api.column_find_row(tr, 
find_sql_column(sysobj, "nr"), &pt->base.id, NULL), rid;
+
+       (void)drop_action;
+       if (is_oid_nil(obj_oid))
+               return ;
+
+       if (isRangePartitionTable(mt)) {
+               sql_table *ranges = find_sql_table(tr, syss, 
"range_partitions");
+               rid = store->table_api.column_find_row(tr, 
find_sql_column(ranges, "table_id"), &pt->base.id, NULL);
+               store->table_api.table_delete(tr, ranges, rid);
+       } else if (isListPartitionTable(mt)) {
+               sql_table *values = find_sql_table(tr, syss, 
"value_partitions");
+               rids *rs = store->table_api.rids_select(tr, 
find_sql_column(values, "table_id"), &pt->base.id, &pt->base.id, NULL);
+               for (rid = store->table_api.rids_next(rs); !is_oid_nil(rid); 
rid = store->table_api.rids_next(rs)) {
+                       store->table_api.table_delete(tr, values, rid);
+               }
+               store->table_api.rids_destroy(rs);
+       }
+       /* merge table depends on part table */
+       sql_trans_drop_dependency(tr, pt->base.id, mt->base.id, 
TABLE_DEPENDENCY);
+
+       os_del(mt->s->parts, tr, pt->base.name, &pt->base);
+       store->table_api.table_delete(tr, sysobj, obj_oid);
 }
 
 static void
-sys_drop_parts(sql_trans *tr, sql_table *t, int drop_action)
+sys_drop_members(sql_trans *tr, sql_table *t, int drop_action)
 {
        if (!list_empty(t->members.set)) {
                for (node *n = t->members.set->h; n; ) {
@@ -3746,11 +3767,19 @@ sys_drop_parts(sql_trans *tr, sql_table 
                                tr->dropped && list_find_id(tr->dropped, 
pt->base.id))
                                continue;
 
-                       sql_trans_del_table(tr, t, find_sql_table_id(tr, t->s, 
pt->base.id), drop_action);
+                       sys_drop_part(tr, pt, drop_action);
                }
        }
 }
 
+static void
+sys_drop_parts(sql_trans *tr, sql_table *t, int drop_action)
+{
+       for(sql_part *pt = partition_find_part(tr, t, NULL); pt; pt = 
partition_find_part(tr, t, pt)) {
+               sql_trans_del_table(tr, pt->t, t, drop_action);
+       }
+}
+
 static int
 sys_drop_table(sql_trans *tr, sql_table *t, int drop_action)
 {
@@ -3767,10 +3796,10 @@ sys_drop_table(sql_trans *tr, sql_table 
        sys_drop_idxs(tr, t, drop_action);
 
        if (partition_find_part(tr, t, NULL))
-               sys_drop_part(tr, t, drop_action);
+               sys_drop_parts(tr, t, drop_action);
 
        if (isMergeTable(t) || isReplicaTable(t))
-               sys_drop_parts(tr, t, drop_action);
+               sys_drop_members(tr, t, drop_action);
 
        if (isRangePartitionTable(t) || isListPartitionTable(t)) {
                sql_table *partitions = find_sql_table(tr, syss, 
"table_partitions");
@@ -4491,42 +4520,21 @@ sql_table *
 sql_trans_del_table(sql_trans *tr, sql_table *mt, sql_table *pt, int 
drop_action)
 {
        sqlstore *store = tr->store;
-       sql_schema *syss = find_sql_schema(tr, isGlobal(mt)?"sys":"tmp");
-       sql_table *sysobj = find_sql_table(tr, syss, "objects");
-       oid obj_oid = store->table_api.column_find_row(tr, 
find_sql_column(sysobj, "nr"), &pt->base.id, NULL), rid;
-
-       if (is_oid_nil(obj_oid))
-               return NULL;
-
-       os_del(mt->s->tables, tr, mt->base.name, &mt->base);
-       mt = table_dup(tr, mt, mt->s, NULL);
-
-       node *n = cs_find_id(&mt->members, pt->base.id);
-       sql_part *p = n?(sql_part*) n->data:NULL;
-
-       if (isRangePartitionTable(mt)) {
-               sql_table *ranges = find_sql_table(tr, syss, 
"range_partitions");
-               rid = store->table_api.column_find_row(tr, 
find_sql_column(ranges, "table_id"), &pt->base.id, NULL);
-               store->table_api.table_delete(tr, ranges, rid);
-       } else if (isListPartitionTable(mt)) {
-               sql_table *values = find_sql_table(tr, syss, 
"value_partitions");
-               rids *rs = store->table_api.rids_select(tr, 
find_sql_column(values, "table_id"), &pt->base.id, &pt->base.id, NULL);
-               for (rid = store->table_api.rids_next(rs); !is_oid_nil(rid); 
rid = store->table_api.rids_next(rs)) {
-                       store->table_api.table_delete(tr, values, rid);
-               }
-               store->table_api.rids_destroy(rs);
-       }
-       /* merge table depends on part table */
-       sql_trans_drop_dependency(tr, pt->base.id, mt->base.id, 
TABLE_DEPENDENCY);
-
-       cs_del(&mt->members, store, n, p->base.flags);
-       os_del(mt->s->parts, tr, p->base.name, &p->base);
-       p->member = NULL;
-       store->table_api.table_delete(tr, sysobj, obj_oid);
+
+       mt = new_table(tr, mt);
+       sql_base *b = os_find_id(mt->s->parts, tr, pt->base.id); /* fetch 
updated part */
+       sql_part *p = (sql_part*)b;
+
+       sys_drop_part(tr, p, drop_action);
+
+       /*Clean the part from members*/
+       node *n = cs_find_id(&mt->members, p->base.id);
+       if (n)
+               cs_del(&mt->members, store, n, p->base.flags);
 
        if (drop_action == DROP_CASCADE)
                sql_trans_drop_table_id(tr, mt->s, pt->base.id, drop_action);
-       return mt;
+       return 0;
 }
 
 sql_table *
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to