Changeset: c903ca929669 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=c903ca929669
Modified Files:
sql/backends/monet5/rel_bin.c
sql/backends/monet5/sql.c
sql/backends/monet5/sql_cat.c
sql/include/sql_catalog.h
sql/server/rel_schema.c
sql/server/sql_mvc.c
sql/storage/sql_catalog.c
sql/storage/store.c
Branch: default
Log Message:
keys -> objlist
diffs (truncated from 413 to 300 lines):
diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -5364,10 +5364,10 @@ sql_delete_keys(backend *be, sql_table *
int res = 1;
node *n;
- if (!t->keys.set)
+ if (!ol_length(t->keys))
return res;
- for (n = t->keys.set->h; n; n = n->next) {
+ for (n = ol_first_node(t->keys); n; n = n->next) {
sql_key *k = n->data;
if (k->type == pkey || k->type == ukey) {
@@ -5506,8 +5506,8 @@ check_for_foreign_key_references(mvc *sq
return;
sqlstore *store = sql->session->tr->store;
- if (t->keys.set) { /* Check for foreign key references */
- for (n = t->keys.set->h; n; n = n->next) {
+ if (t->keys) { /* Check for foreign key references */
+ for (n = ol_first_node(t->keys); n; n = n->next) {
sql_key *k = n->data;
if (k->type == ukey || k->type == pkey) {
diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -319,7 +319,7 @@ create_table_or_view(mvc *sql, char* sna
return sql_message(SQLSTATE(42S01) "%s TABLE: name '%s' already
in use", action, t->base.name);
} else if (temp != SQL_DECLARED_TABLE && (!mvc_schema_privs(sql, s) &&
!(isTempSchema(s) && temp == SQL_LOCAL_TEMP))) {
return sql_message(SQLSTATE(42000) "%s TABLE: insufficient
privileges for user '%s' in schema '%s'", action, get_string_global_var(sql,
"current_user"), s->base.name);
- } else if (temp == SQL_DECLARED_TABLE && !list_empty(t->keys.set)) {
+ } else if (temp == SQL_DECLARED_TABLE && ol_length(t->keys)) {
return sql_message(SQLSTATE(42000) "%s TABLE: '%s' cannot have
constraints", action, t->base.name);
}
@@ -405,8 +405,8 @@ create_table_or_view(mvc *sql, char* sna
}
}
}
- if (t->keys.set) {
- for (n = t->keys.set->h; n; n = n->next) {
+ if (t->keys) {
+ for (n = ol_first_node(t->keys); n; n = n->next) {
sql_key *k = n->data;
char *err = NULL;
diff --git a/sql/backends/monet5/sql_cat.c b/sql/backends/monet5/sql_cat.c
--- a/sql/backends/monet5/sql_cat.c
+++ b/sql/backends/monet5/sql_cat.c
@@ -103,10 +103,10 @@ rel_check_tables(mvc *sql, sql_table *nt
throw(SQL,"sql.rel_check_tables",SQLSTATE(3F000) "ALTER %s: to be added table
index type doesn't match %s definition", errtable, errtable);
}
} else { //for partitioned tables we allow indexes but the key set must
be exactly the same
- if (cs_size(&nt->keys) != cs_size(&nnt->keys))
+ if (ol_length(nt->keys) != ol_length(nnt->keys))
throw(SQL,"sql.rel_check_tables",SQLSTATE(3F000) "ALTER
%s: to be added table key doesn't match %s definition", errtable, errtable);
- if (cs_size(&nt->keys))
- for (n = nt->keys.set->h, m = nnt->keys.set->h; n && m;
n = n->next, m = m->next) {
+ if (ol_length(nt->keys))
+ for (n = ol_first_node(nt->keys), m =
ol_first_node(nnt->keys); n && m; n = n->next, m = m->next) {
sql_key *ni = n->data;
sql_key *mi = m->data;
@@ -550,8 +550,8 @@ drop_table(mvc *sql, char *sname, char *
if (!mvc_schema_privs(sql, s) && !(isTempSchema(s) && t->persistence ==
SQL_LOCAL_TEMP))
throw(SQL,"sql.drop_table", SQLSTATE(42000) "DROP TABLE: access
denied for %s to schema '%s'", get_string_global_var(sql, "current_user"),
s->base.name);
- if (!drop_action && t->keys.set) {
- for (node *n = t->keys.set->h; n; n = n->next) {
+ if (!drop_action && t->keys) {
+ for (node *n = ol_first_node(t->keys); n; n = n->next) {
sql_key *k = n->data;
if (k->type == ukey || k->type == pkey) {
@@ -619,7 +619,7 @@ drop_key(mvc *sql, char *sname, char *tn
throw(SQL,"sql.drop_key", SQLSTATE(42000) "ALTER TABLE: access
denied for %s to schema '%s'", get_string_global_var(sql, "current_user"),
s->base.name);
if (!(t = mvc_bind_table(sql, s, tname)))
throw(SQL,"sql.drop_key", SQLSTATE(42S02) "ALTER TABLE: no such
table '%s'", tname);
- if (!(n = list_find_name(t->keys.set, kname)))
+ if (!(n = ol_find_name(t->keys, kname)))
throw(SQL,"sql.drop_key", SQLSTATE(42000) "ALTER TABLE: no such
constraint '%s'", kname);
key = n->data;
if (!drop_action && mvc_check_dependency(sql, key->base.id,
KEY_DEPENDENCY, NULL))
@@ -990,24 +990,25 @@ alter_table(Client cntxt, mvc *sql, char
throw(SQL,"sql.alter_table", SQLSTATE(40002)
"ALTER TABLE: Failed to create index %s.%s", i->t->base.name, i->base.name);
}
}
- if (t->keys.set) {
+ if (t->keys) {
/* alter drop key */
- if (t->keys.dset)
- for (n = t->keys.dset->h; n; n = n->next) {
- sql_key *k = n->data;
+ for (n = ol_first_node(t->keys); n; n = n->next) {
+ sql_key *k = n->data;
+
+ if ((!k->base.new && !k->base.deleted) || (k->base.new
&& k->base.deleted))
+ continue;
+ if (k->base.deleted) {
sql_key *nk = mvc_bind_key(sql, s,
k->base.name);
if (nk) {
if (mvc_drop_key(sql, s, nk,
k->drop_action))
throw(SQL,"sql.alter_table",
SQLSTATE(HY013) MAL_MALLOC_FAIL);
}
+ } else { /* new */
+ str err;
+ if ((err = sql_partition_validate_key(sql, t,
k, "ALTER")))
+ return err;
+ mvc_copy_key(sql, nt, k);
}
- /* alter add key */
- for (n = t->keys.nelm; n; n = n->next) {
- sql_key *k = n->data;
- str err;
- if ((err = sql_partition_validate_key(sql, t, k,
"ALTER")))
- return err;
- mvc_copy_key(sql, nt, k);
}
}
return MAL_SUCCEED;
diff --git a/sql/include/sql_catalog.h b/sql/include/sql_catalog.h
--- a/sql/include/sql_catalog.h
+++ b/sql/include/sql_catalog.h
@@ -710,7 +710,7 @@ typedef struct sql_table {
sql_ukey *pkey;
objlist *columns;
objlist *idxs;
- changeset keys;
+ objlist *keys;
changeset triggers;
changeset members; /* member tables of merge/replica tables */
int drop_action; /* only needed for alter drop 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
@@ -309,11 +309,12 @@ column_constraint_type(mvc *sql, const c
(void) sql_error(sql, 02, SQLSTATE(42000) "CONSTRAINT
PRIMARY KEY: a table can have only one PRIMARY KEY\n");
return res;
}
- if (name && (list_find_name(t->keys.set, name) ||
mvc_bind_key(sql, ss, name))) {
+ if (name && (ol_find_name(t->keys, name) || mvc_bind_key(sql,
ss, name))) {
(void) sql_error(sql, 02, SQLSTATE(42000) "CONSTRAINT
%s: key %s already exists", (kt == pkey) ? "PRIMARY KEY" : "UNIQUE", name);
return res;
}
k = (sql_key*)mvc_create_ukey(sql, t, name, kt);
+ k->base.new = 1;
mvc_create_kc(sql, k, cs);
mvc_create_ukey_done(sql, k);
@@ -340,7 +341,7 @@ column_constraint_type(mvc *sql, const c
}
if (!rt) {
return SQL_ERR;
- } else if (name && (list_find_name(t->keys.set, name) ||
mvc_bind_key(sql, ss, name))) {
+ } else if (name && (ol_find_name(t->keys, name) ||
mvc_bind_key(sql, ss, name))) {
(void) sql_error(sql, 02, SQLSTATE(42000) "CONSTRAINT
FOREIGN KEY: key '%s' already exists", name);
return res;
}
@@ -371,6 +372,7 @@ column_constraint_type(mvc *sql, const c
return res;
}
fk = mvc_create_fkey(sql, t, name, fkey, rk, ref_actions & 255,
(ref_actions>>8) & 255);
+ fk->k.base.new = 1;
mvc_create_fkc(sql, fk, cs);
res = SQL_OK;
} break;
@@ -504,7 +506,7 @@ table_foreign_key(mvc *sql, char *name,
int ref_actions = n->next->next->next->next->data.i_val;
assert(n->next->next->next->next->type == type_int);
- if (name && (list_find_name(t->keys.set, name) ||
mvc_bind_key(sql, ss, name))) {
+ if (name && (ol_find_name(t->keys, name) || mvc_bind_key(sql,
ss, name))) {
sql_error(sql, 02, SQLSTATE(42000) "CONSTRAINT FOREIGN
KEY: key '%s' already exists", name);
return SQL_ERR;
}
@@ -526,6 +528,7 @@ table_foreign_key(mvc *sql, char *name,
return SQL_ERR;
}
fk = mvc_create_fkey(sql, t, name, fkey, rk, ref_actions & 255,
(ref_actions>>8) & 255);
+ fk->k.base.new = 1;
for (fnms = rk->columns->h; nms && fnms; nms = nms->next, fnms
= fnms->next) {
char *nm = nms->data.sval;
@@ -568,13 +571,14 @@ table_constraint_type(mvc *sql, char *na
sql_error(sql, 02, SQLSTATE(42000) "CONSTRAINT PRIMARY
KEY: a table can have only one PRIMARY KEY\n");
return SQL_ERR;
}
- if (name && (list_find_name(t->keys.set, name) ||
mvc_bind_key(sql, ss, name))) {
+ if (name && (ol_find_name(t->keys, name) || mvc_bind_key(sql,
ss, name))) {
sql_error(sql, 02, SQLSTATE(42000) "CONSTRAINT %s: key
'%s' already exists",
kt == pkey ? "PRIMARY KEY" : "UNIQUE",
name);
return SQL_ERR;
}
k = (sql_key*)mvc_create_ukey(sql, t, name, kt);
+ k->base.new = 1;
for (; nms; nms = nms->next) {
char *nm = nms->data.sval;
sql_column *c = mvc_bind_column(sql, t, nm);
@@ -859,10 +863,10 @@ table_element(sql_query *query, symbol *
sql_error(sql, 02, SQLSTATE(2BM37) "%s: cannot drop
column '%s': there are database objects which depend on it\n", action, cname);
return SQL_ERR;
}
- if (!drop_action && t->keys.set) {
+ if (!drop_action && t->keys) {
node *n, *m;
- for (n = t->keys.set->h; n; n = n->next) {
+ for (n = ol_first_node(t->keys); n; n = n->next) {
sql_key *k = n->data;
for (m = k->columns->h; m; m = m->next) {
sql_kc *kc = m->data;
diff --git a/sql/server/sql_mvc.c b/sql/server/sql_mvc.c
--- a/sql/server/sql_mvc.c
+++ b/sql/server/sql_mvc.c
@@ -1000,8 +1000,8 @@ mvc_bind_ukey(sql_table *t, list *colnam
sql_key *res = NULL;
int len = list_length(colnames);
- if (cs_size(&t->keys))
- for (cur = t->keys.set->h; cur; cur = cur->next) {
+ if (ol_length(t->keys))
+ for (cur = ol_first_node(t->keys); cur; cur = cur->next) {
node *cc;
sql_key *k = cur->data;
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
@@ -93,12 +93,6 @@ tr_version_of_parent(sql_trans *tr, ulng
return 0;
}
-static void *
-_cs_find_name(changeset * cs, const char *name)
-{
- return _list_find_name(cs->set, name);
-}
-
node *
cs_find_name(changeset * cs, const char *name)
{
@@ -174,7 +168,10 @@ list_find_base_id(list *l, sqlid id)
sql_key *
find_sql_key(sql_table *t, const char *kname)
{
- return _cs_find_name(&t->keys, kname);
+ node *n = ol_find_name(t->keys, kname);
+ if (n)
+ return n->data;
+ return NULL;
}
sql_key *
@@ -228,7 +225,7 @@ find_sql_table(sql_trans *tr, sql_schema
{
sql_table *t = (sql_table*)os_find_name(s->tables, tr, tname);
if (!t && tr->tmp == s)
- t = (sql_table*)_cs_find_name(&tr->localtmps, tname);
+ t = (sql_table*)_list_find_name(tr->localtmps.set, tname);
return t;
}
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -214,7 +214,7 @@ table_destroy(sqlstore *store, sql_table
/* cleanup its parts */
cs_destroy(&t->members, store);
ol_destroy(t->idxs, store);
- cs_destroy(&t->keys, store);
+ ol_destroy(t->keys, store);
cs_destroy(&t->triggers, store);
ol_destroy(t->columns, store);
if (isPartitionedByExpressionTable(t)) {
@@ -676,7 +676,7 @@ load_table(sql_trans *tr, sql_schema *s,
t->columns = ol_new(tr->sa, (destroy_fptr) &column_destroy);
t->idxs = ol_new(tr->sa, (destroy_fptr) &idx_destroy);
- cs_new(&t->keys, tr->sa, (fdestroy) &key_destroy);
+ t->keys = ol_new(tr->sa, (destroy_fptr) &key_destroy);
cs_new(&t->triggers, tr->sa, (fdestroy) &trigger_destroy);
if (isMergeTable(t) || isReplicaTable(t))
cs_new(&t->members, tr->sa, (fdestroy) &part_destroy);
@@ -746,7 +746,7 @@ load_table(sql_trans *tr, sql_schema *s,
for (rid = store->table_api.rids_next(rs); !is_oid_nil(rid); rid =
store->table_api.rids_next(rs)) {
sql_key *k = load_key(tr, t, rid);
- cs_add(&t->keys, k, 0);
+ ol_add(t->keys, &k->base);
if (os_add(s->keys, tr, k->base.name, dup_base(&k->base)) ||
os_add(tr->cat->objects, tr, k->base.name,
dup_base(&k->base))) {
key_destroy(store, k);
@@ -1366,7 +1366,7 @@ create_sql_table_with_id(sql_allocator *
t->access = 0;
t->columns = ol_new(sa, (destroy_fptr) &column_destroy);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list