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 -- [email protected]
To unsubscribe send an email to [email protected]