Changeset: a975cb37d42a for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/a975cb37d42a
Modified Files:
        sql/server/rel_rel.c
        sql/server/rel_schema.c
        sql/server/rel_updates.c
        sql/storage/sql_catalog.c
        sql/storage/sql_storage.h
        sql/storage/store.c
Branch: Jun2023
Log Message:

merged with Sep2022


diffs (205 lines):

diff --git a/sql/server/rel_rel.c b/sql/server/rel_rel.c
--- a/sql/server/rel_rel.c
+++ b/sql/server/rel_rel.c
@@ -1905,11 +1905,15 @@ rel_deps(mvc *sql, sql_rel *r, list *ref
                                continue;
                        } else if (oname[0] == '%') {
                                sql_idx *i = find_sql_idx(t, oname+1);
-                               cond_append(l, &i->base);
-                       } else {
-                               sql_column *c = find_sql_column(t, oname);
-                               cond_append(l, &c->base);
+                               if (i) {
+                                       cond_append(l, &i->base);
+                                       continue;
+                               }
                        }
+                       sql_column *c = find_sql_column(t, oname);
+                       if (!c)
+                               return -1;
+                       cond_append(l, &c->base);
                }
        } break;
        case op_table: {
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
@@ -735,6 +735,10 @@ table_foreign_key(mvc *sql, const char *
                        (void) sql_error(sql, 02, SQLSTATE(42000) "CONSTRAINT 
FOREIGN KEY: cannot create foreign key between temporary and non temporary 
tables");
                        return SQL_ERR;
                }
+               if (isTempTable(ft) && !isGlobal(ft) && ft != t) { /* disable 
foreign key on local temporary table */
+                       (void) sql_error(sql, 02, SQLSTATE(42000) "CONSTRAINT 
FOREIGN KEY: cannot create foreign key with local temporary tables");
+                       return SQL_ERR;
+               }
                if (isUnloggedTable(t) != isUnloggedTable(ft)) { /* disable 
foreign key between logged and unlogged */
                        (void) sql_error(sql, 02, SQLSTATE(42000) "CONSTRAINT 
FOREIGN KEY: cannot create foreign key between logged and unlogged tables");
                        return SQL_ERR;
diff --git a/sql/server/rel_sequence.c b/sql/server/rel_sequence.c
--- a/sql/server/rel_sequence.c
+++ b/sql/server/rel_sequence.c
@@ -270,11 +270,11 @@ rel_alter_seq(
        char *sname = qname_schema(qname);
        char *name = qname_schema_object(qname);
        sql_sequence *seq;
-       int start_type = start_list->h->data.i_val;
+       int start_type = start_list?start_list->h->data.i_val:0;
        sql_rel *r = NULL;
        sql_exp *val = NULL;
 
-       assert(start_list->h->type == type_int);
+       assert(!start_list || start_list->h->type == type_int);
        (void) tpe;
        if (!(seq = find_sequence_on_scope(sql, sname, name, "ALTER SEQUENCE")))
                return NULL;
diff --git a/sql/server/rel_updates.c b/sql/server/rel_updates.c
--- a/sql/server/rel_updates.c
+++ b/sql/server/rel_updates.c
@@ -97,7 +97,12 @@ rel_insert_hash_idx(mvc *sql, const char
        assert(is_project(ins->op) || ins->op == op_table);
        if (list_length(i->columns) <= 1 || non_updatable_index(i->type)) {
                /* dummy append */
-               inserts->r = ins = rel_project(sql->sa, ins, 
rel_projections(sql, ins, NULL, 1, 1));
+               list *exps = rel_projections(sql, ins, NULL, 1, 1);
+               if (!exps)
+                       return NULL;
+               inserts->r = ins = rel_project(sql->sa, ins, exps);
+               if (!ins)
+                       return NULL;
                list_append(ins->exps, exp_label(sql->sa, exp_atom_lng(sql->sa, 
0), ++sql->label));
                return inserts;
        }
@@ -254,9 +259,11 @@ rel_insert_idxs(mvc *sql, sql_table *t, 
                sql_idx *i = n->data;
 
                if (hash_index(i->type) || non_updatable_index(i->type)) {
-                       rel_insert_hash_idx(sql, alias, i, inserts);
+                       if (rel_insert_hash_idx(sql, alias, i, inserts) == NULL)
+                               return NULL;
                } else if (i->type == join_idx) {
-                       rel_insert_join_idx(sql, alias, i, inserts);
+                       if (rel_insert_join_idx(sql, alias, i, inserts) == NULL)
+                               return NULL;
                }
        }
        if (inserts->r != p) {
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
@@ -39,6 +39,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
@@ -539,6 +539,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
@@ -6204,6 +6204,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,1 +1,6 @@
 ambiguous-identifiers-7372
+temp-table-foreign-key-crash-7378
+add-drop-column-crash-7381
+recursive-trigger-crash-7383
+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;
diff --git a/sql/test/BugTracker-2023/Tests/alter-inc-seq-crash-7387.test 
b/sql/test/BugTracker-2023/Tests/alter-inc-seq-crash-7387.test
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2023/Tests/alter-inc-seq-crash-7387.test
@@ -0,0 +1,2 @@
+statement error
+ALTER SEQUENCE x INCREMENT BY 2;
diff --git a/sql/test/BugTracker-2023/Tests/recursive-trigger-crash-7383.test 
b/sql/test/BugTracker-2023/Tests/recursive-trigger-crash-7383.test
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2023/Tests/recursive-trigger-crash-7383.test
@@ -0,0 +1,8 @@
+statement ok
+create table t1(c1 int auto_increment primary key NOT NULL);
+
+statement ok
+create trigger i1 after insert on t1 for each row insert into t1 values(NULL);
+
+statement error
+insert into t1 values(NULL);
diff --git 
a/sql/test/BugTracker-2023/Tests/temp-table-foreign-key-crash-7378.test 
b/sql/test/BugTracker-2023/Tests/temp-table-foreign-key-crash-7378.test
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2023/Tests/temp-table-foreign-key-crash-7378.test
@@ -0,0 +1,8 @@
+statement ok
+START TRANSACTION;
+
+statement ok
+CREATE TEMPORARY TABLE temptest3(col int PRIMARY KEY) ON COMMIT DROP;
+
+statement error
+CREATE TEMPORARY TABLE temptest4(col int, FOREIGN KEY (col) REFERENCES 
temptest3);
diff --git a/sql/test/BugTracker-2023/Tests/view-on-alias-crash-7386.test 
b/sql/test/BugTracker-2023/Tests/view-on-alias-crash-7386.test
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2023/Tests/view-on-alias-crash-7386.test
@@ -0,0 +1,5 @@
+statement ok
+CREATE VIEW t2 AS SELECT 1 UNION ALL SELECT 1;
+
+statement ok
+CREATE VIEW v2 AS SELECT * FROM t2;
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to