Changeset: e51271824555 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/e51271824555
Added Files:
        sql/test/BugTracker-2023/Tests/add-drop-column-crash-7381.test
Modified Files:
        sql/storage/sql_catalog.c
        sql/storage/sql_storage.h
        sql/storage/store.c
        sql/test/BugTracker-2023/Tests/All
Branch: Sep2022
Log Message:

add test adn fix for bug #7381, when a column is created and drop in one 
transaction, we remove it from the change list.


diffs (76 lines):

diff --git a/sql/storage/sql_catalog.c b/sql/storage/sql_catalog.c
--- a/sql/storage/sql_catalog.c
+++ b/sql/storage/sql_catalog.c
@@ -70,6 +70,21 @@ trans_add(sql_trans *tr, sql_base *b, vo
        MT_lock_unset(&tr->lock);
 }
 
+void
+trans_del(sql_trans *tr, sql_base *b)
+{
+       MT_lock_set(&tr->lock);
+       for(node *n= tr->changes->h; n; n = n->next) {
+               sql_change *c = n->data;
+               if (c->obj == b) {
+                       if (c->log)
+                               tr->logchanges--;
+                       n = list_remove_node(tr->changes, NULL, n);
+               }
+       }
+       MT_lock_unset(&tr->lock);
+}
+
 int
 tr_version_of_parent(sql_trans *tr, ulng ts)
 {
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
@@ -535,6 +535,7 @@ typedef struct sql_change {
 } sql_change;
 
 extern void trans_add(sql_trans *tr, sql_base *b, void *data, tc_cleanup_fptr 
cleanup, tc_commit_fptr commit, tc_log_fptr log);
+extern void trans_del(sql_trans *tr, sql_base *b);
 extern int tr_version_of_parent(sql_trans *tr, ulng ts);
 
 extern int sql_trans_add_predicate(sql_trans* tr, sql_column *c, unsigned int 
cmp, atom *r, atom *f, bool anti, bool semantics);
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -6236,6 +6236,8 @@ sql_trans_drop_column(sql_trans *tr, sql
                if ((res = store->storage_api.drop_col(tr, 
(sql_column*)dup_base(&col->base))))
                        return res;
 
+       if (isNew(col)) /* remove create from changes */
+               trans_del(tr, &col->base);
        ol_del(t->columns, store, n);
 
        if (drop_action == DROP_CASCADE_START && tr->dropped) {
diff --git a/sql/test/BugTracker-2023/Tests/All 
b/sql/test/BugTracker-2023/Tests/All
--- a/sql/test/BugTracker-2023/Tests/All
+++ b/sql/test/BugTracker-2023/Tests/All
@@ -1,4 +1,5 @@
 ambiguous-identifiers-7372
 temp-table-foreign-key-crash-7378
+add-drop-column-crash-7381
 view-on-alias-crash-7386
 alter-inc-seq-crash-7387
diff --git a/sql/test/BugTracker-2023/Tests/add-drop-column-crash-7381.test 
b/sql/test/BugTracker-2023/Tests/add-drop-column-crash-7381.test
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2023/Tests/add-drop-column-crash-7381.test
@@ -0,0 +1,14 @@
+statement ok
+CREATE TABLE t1(unique_constraint INT PRIMARY KEY);
+
+statement ok
+START TRANSACTION;
+
+statement ok
+ALTER TABLE t1 ADD COLUMN uniq_c1_c2_c3 INT;
+
+statement ok
+ALTER TABLE t1 DROP COLUMN uniq_c1_c2_c3;
+
+statement ok
+COMMIT;
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to