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