Changeset: fb9b6b17cd9a for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/fb9b6b17cd9a
Modified Files:
        sql/storage/store.c
        sql/test/mergetables/Tests/mergetabledependencies.test
Branch: sqlfuncfix
Log Message:

Added missing case and respective test


diffs (222 lines):

diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -3324,7 +3324,7 @@ sql_trans_copy_key( sql_trans *tr, sql_t
                        return res;
                if (!isNew(rkey) && isGlobal(rkey->t) && !isGlobalTemp(rkey->t) 
&& (res = sql_trans_add_dependency(tr, rkey->t->base.id, dml))) /* disallow 
concurrent updates on other key */
                        return res;
-               if ((res = store_reset_sql_functions(tr, rkey->t->base.id))) /* 
reset sql that depend on table */
+               if ((res = store_reset_sql_functions(tr, rkey->t->base.id))) /* 
reset sql functions depending on the table */
                        return res;
        }
 
@@ -3351,7 +3351,7 @@ sql_trans_copy_key( sql_trans *tr, sql_t
                if (!isNew(kc->c) && (res = sql_trans_add_dependency(tr, 
kc->c->base.id, ddl)))
                        return res;
        }
-       if ((res = store_reset_sql_functions(tr, t->base.id))) /* reset sql 
that depend on table */
+       if ((res = store_reset_sql_functions(tr, t->base.id))) /* reset sql 
functions depending on the table */
                return res;
 
        /* TODO this has to be cleaned out too */
@@ -3406,7 +3406,7 @@ sql_trans_copy_idx( sql_trans *tr, sql_t
 
        if ((res = os_add(t->s->idxs, tr, ni->base.name, dup_base(&ni->base))))
                return res;
-       if ((res = store_reset_sql_functions(tr, t->base.id))) /* reset sql 
that depend on table */
+       if ((res = store_reset_sql_functions(tr, t->base.id))) /* reset sql 
functions depending on the table */
                return res;
 
        if (isDeclaredTable(i->t))
@@ -3471,7 +3471,7 @@ sql_trans_copy_trigger( sql_trans *tr, s
 
        if ((res = os_add(t->s->triggers, tr, nt->base.name, 
dup_base(&nt->base))))
                return res;
-       if ((res = store_reset_sql_functions(tr, t->base.id))) /* reset sql 
that depend on table */
+       if ((res = store_reset_sql_functions(tr, t->base.id))) /* reset sql 
functions depending on the table */
                return res;
 
        if (!isDeclaredTable(t))
@@ -5122,7 +5122,7 @@ sql_trans_propagate_dependencies_parents
        sql_part *pt = NULL;
 
        for (; mt; mt = pt?pt->t:NULL) {
-               if ((res = store_reset_sql_functions(tr, mt->base.id))) /* 
reset sql that depend on table */
+               if ((res = store_reset_sql_functions(tr, mt->base.id))) /* 
reset sql functions depending on the table */
                        return res;
                if (!isNew(mt) && (res = sql_trans_add_dependency(tr, 
mt->base.id, ddl))) /* protect from another transaction changing the table's 
schema */
                        return res;
@@ -5138,7 +5138,10 @@ sql_trans_propagate_dependencies_childre
 {
        int res = LOG_OK;
 
-       if ((res = store_reset_sql_functions(tr, pt->base.id))) /* reset sql 
that depend on table */
+       if (THRhighwater()) /* for now throw malloc failure error */
+               return -1;
+
+       if ((res = store_reset_sql_functions(tr, pt->base.id))) /* reset sql 
functions depending on the table */
                return res;
        if (!isNew(pt)) {
                if ((res = sql_trans_add_dependency(tr, pt->base.id, ddl))) /* 
protect from another transaction changing the table's schema */
@@ -5524,7 +5527,8 @@ sql_trans_del_table(sql_trans *tr, sql_t
 {
        int res = LOG_OK;
        sqlstore *store = tr->store;
-       sql_table *dup = NULL;
+       sql_table *dup = NULL, *mt_it;
+       sql_part *mti_part = NULL;
 
        if ((res = new_table(tr, mt, &dup)))
                return res;
@@ -5541,9 +5545,13 @@ sql_trans_del_table(sql_trans *tr, sql_t
 
        if (drop_action == DROP_CASCADE && (res = sql_trans_drop_table_id(tr, 
mt->s, pt->base.id, drop_action)))
                return res;
-       if ((res = store_reset_sql_functions(tr, mt->base.id))) /* reset sql 
that depend on table */
-               return res;
-       if ((res = store_reset_sql_functions(tr, pt->base.id))) /* reset sql 
that depend on table */
+       for (mt_it = mt; mt_it; mt_it = mti_part?mti_part->t:NULL) {
+               /* functions depending on parent tables need to be recompiled, 
ugh */
+               if ((res = store_reset_sql_functions(tr, mt_it->base.id))) /* 
reset sql functions depending on the table */
+                       return res;
+               mti_part = partition_find_part(tr, mt_it, NULL);
+       }
+       if ((res = store_reset_sql_functions(tr, pt->base.id))) /* reset sql 
functions depending on the table */
                return res;
        return res;
 }
@@ -6048,7 +6056,7 @@ sql_trans_alter_null(sql_trans *tr, sql_
                /* disallow concurrent updates on the column if not null is set 
*/
                if (!isnull && !isNew(col) && isGlobal(col->t) && 
!isGlobalTemp(col->t) && (res = sql_trans_add_dependency(tr, col->t->base.id, 
dml)))
                        return res;
-               if ((res = store_reset_sql_functions(tr, col->t->base.id))) /* 
reset sql that depend on table */
+               if ((res = store_reset_sql_functions(tr, col->t->base.id))) /* 
reset sql functions depending on the table */
                        return res;
        }
        return res;
@@ -6075,7 +6083,7 @@ sql_trans_alter_access(sql_trans *tr, sq
                        return res;
                t = dup;
                t->access = access;
-               if ((res = store_reset_sql_functions(tr, t->base.id))) /* reset 
sql that depend on table */
+               if ((res = store_reset_sql_functions(tr, t->base.id))) /* reset 
sql functions depending on the table */
                        return res;
        }
        return res;
@@ -6112,7 +6120,7 @@ sql_trans_alter_default(sql_trans *tr, s
                dup->def = NULL;
                if (val)
                        dup->def = SA_STRDUP(tr->sa, val);
-               if ((res = store_reset_sql_functions(tr, col->t->base.id))) /* 
reset sql that depend on table */
+               if ((res = store_reset_sql_functions(tr, col->t->base.id))) /* 
reset sql functions depending on the table */
                        return res;
        }
        return res;
@@ -6146,7 +6154,7 @@ sql_trans_alter_storage(sql_trans *tr, s
                dup->storage_type = NULL;
                if (storage)
                        dup->storage_type = SA_STRDUP(tr->sa, storage);
-               if ((res = store_reset_sql_functions(tr, col->t->base.id))) /* 
reset sql that depend on table */
+               if ((res = store_reset_sql_functions(tr, col->t->base.id))) /* 
reset sql functions depending on the table */
                        return res;
        }
        return res;
@@ -6530,7 +6538,7 @@ sql_trans_drop_key(sql_trans *tr, sql_sc
 
        if (k->idx && (res = sql_trans_drop_idx(tr, s, k->idx->base.id, 
drop_action)))
                return res;
-       if ((res = store_reset_sql_functions(tr, t->base.id))) /* reset sql 
that depend on table */
+       if ((res = store_reset_sql_functions(tr, t->base.id))) /* reset sql 
functions depending on the table */
                return res;
 
        if (!isTempTable(k->t) && (res = sys_drop_key(tr, k, drop_action)))
@@ -6638,7 +6646,7 @@ sql_trans_drop_idx(sql_trans *tr, sql_sc
 
        if (!isTempTable(i->t) && (res = sys_drop_idx(tr, i, drop_action)))
                return res;
-       if ((res = store_reset_sql_functions(tr, i->t->base.id))) /* reset sql 
that depend on table */
+       if ((res = store_reset_sql_functions(tr, i->t->base.id))) /* reset sql 
functions depending on the table */
                return res;
 
        i->base.deleted = 1;
@@ -6729,7 +6737,7 @@ sql_trans_drop_trigger(sql_trans *tr, sq
                list_append(tr->dropped, local_id);
        }
 
-       if ((res = store_reset_sql_functions(tr, i->t->base.id))) /* reset sql 
that depend on table */
+       if ((res = store_reset_sql_functions(tr, i->t->base.id))) /* reset sql 
functions depending on the table */
                return res;
        if ((res = sys_drop_trigger(tr, i)))
                return res;
diff --git a/sql/test/mergetables/Tests/mergetabledependencies.test 
b/sql/test/mergetables/Tests/mergetabledependencies.test
--- a/sql/test/mergetables/Tests/mergetabledependencies.test
+++ b/sql/test/mergetables/Tests/mergetabledependencies.test
@@ -196,3 +196,68 @@ 1
 statement ok
 rollback
 
+statement ok
+start transaction
+
+statement ok
+CREATE MERGE TABLE parent1(a int)
+
+statement ok
+CREATE MERGE TABLE parent2(a int)
+
+statement ok
+CREATE TABLE child1(a int)
+
+statement ok rowcount 2
+INSERT INTO child1 VALUES (1),(2)
+
+statement ok
+CREATE TABLE child2(a int)
+
+statement ok rowcount 2
+INSERT INTO child2 VALUES (3),(4)
+
+statement ok
+CREATE TABLE child3(a int)
+
+statement ok rowcount 2
+INSERT INTO child3 VALUES (5),(6)
+
+statement ok
+ALTER TABLE parent1 ADD table child1
+
+statement ok
+ALTER TABLE parent1 ADD table parent2
+
+statement ok
+ALTER TABLE parent2 ADD table child2
+
+statement ok
+ALTER TABLE parent2 ADD table child3
+
+statement ok
+create function myfunc() returns table(a int) begin return select a from 
parent1; end
+
+query I rowsort
+SELECT a from myfunc()
+----
+1
+2
+3
+4
+5
+6
+
+statement ok
+ALTER TABLE parent2 DROP table child2
+
+query I rowsort
+SELECT a from myfunc()
+----
+1
+2
+5
+6
+
+statement ok
+rollback
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to