Changeset: b55bcf09188c for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/b55bcf09188c
Modified Files:
sql/backends/monet5/sql_cat.c
sql/backends/monet5/sql_statistics.c
sql/include/sql_catalog.h
sql/server/sql_mvc.c
sql/server/sql_privileges.c
sql/storage/sql_storage.h
sql/storage/store.c
Branch: iso
Log Message:
Add type of dependency to check at end of transaction
diffs (truncated from 701 to 300 lines):
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
@@ -1830,7 +1830,7 @@ SQLcomment_on(Client cntxt, MalBlkPtr mb
}
if (ok != LOG_OK)
throw(SQL, "sql.comment_on", SQLSTATE(42000) "Comment
on failed%s", ok == LOG_CONFLICT ? " due to conflict with another transaction"
: "");
- if ((ok = sql_trans_add_dependency(tx, objid)) != LOG_OK) /* At
the moment this adds dependencies for old objects :( */
+ if ((ok = sql_trans_add_dependency(tx, objid, ddl)) != LOG_OK)
/* At the moment this adds dependencies for old objects :( */
throw(SQL, "sql.comment_on", SQLSTATE(HY013)
MAL_MALLOC_FAIL);
} else {
if (!is_oid_nil(rid)) {
diff --git a/sql/backends/monet5/sql_statistics.c
b/sql/backends/monet5/sql_statistics.c
--- a/sql/backends/monet5/sql_statistics.c
+++ b/sql/backends/monet5/sql_statistics.c
@@ -320,7 +320,7 @@ sql_analyze(Client cntxt, MalBlkPtr mb,
GDKfree(minval);
throw(SQL, "analyze",
SQLSTATE(42000) "ANALYZE: failed%s", log_res == LOG_CONFLICT ? " due to
conflict with another transaction" : "");
}
- if (!isNew(c) && (log_res =
sql_trans_add_dependency(tr, c->base.id)) != LOG_OK) {
+ if (!isNew(c) && (log_res =
sql_trans_add_dependency(tr, c->base.id, ddl)) != LOG_OK) {
GDKfree(maxval);
GDKfree(minval);
throw(SQL, "analyze",
SQLSTATE(HY013) MAL_MALLOC_FAIL);
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
@@ -315,7 +315,7 @@ typedef struct sql_trans {
list *dropped; /* protection against recursive cascade action*/
list *predicates; /* list of read predicates logged during update
transactions */
list *dependencies; /* list of dependencies created (list of sqlids
from the objects) */
- list *removals; /* list of old objects removed or renamed (it
would be tested for conflicts at the end of the transaction) */
+ list *depchanges; /* list of dependencies changed (it would be
tested for conflicts at the end of the transaction) */
int logchanges; /* count number of changes to be applied too
the wal */
int active; /* is active transaction */
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
@@ -1318,7 +1318,7 @@ mvc_create_dependency(mvc *m, sql_base *
TRC_DEBUG(SQL_TRANS, "Create dependency: %d %d %d\n", b->id, depend_id,
(int) depend_type);
if ( (b->id != depend_id) || (depend_type == BEDROPPED_DEPENDENCY) ) {
if (!b->new)
- sql_trans_add_dependency(m->session->tr, b->id);
+ sql_trans_add_dependency(m->session->tr, b->id, ddl);
sql_trans_create_dependency(m->session->tr, b->id, depend_id,
depend_type);
}
}
@@ -1331,7 +1331,7 @@ mvc_create_dependencies(mvc *m, list *bl
for (node *n = blist->h ; n ; n = n->next) {
sql_base *b = n->data;
if (!b->new) /* only add old objects to the transaction
dependency list */
- sql_trans_add_dependency(m->session->tr, b->id);
+ sql_trans_add_dependency(m->session->tr, b->id,
ddl);
mvc_create_dependency(m, b, depend_id, dep_type);
}
}
diff --git a/sql/server/sql_privileges.c b/sql/server/sql_privileges.c
--- a/sql/server/sql_privileges.c
+++ b/sql/server/sql_privileges.c
@@ -130,9 +130,9 @@ sql_grant_global_privs( mvc *sql, char *
throw(SQL,"sql.grant_global",SQLSTATE(42000) "GRANT: failed%s",
log_res == LOG_CONFLICT ? " due to conflict with another transaction" : "");
/* Add dependencies created */
- if ((log_res = sql_trans_add_dependency(sql->session->tr, grantee_id))
!= LOG_OK)
+ if ((log_res = sql_trans_add_dependency(sql->session->tr, grantee_id,
ddl)) != LOG_OK)
throw(SQL, "sql.grant_table", SQLSTATE(HY013) MAL_MALLOC_FAIL);
- if ((log_res = sql_trans_add_dependency(sql->session->tr, grantor)) !=
LOG_OK)
+ if ((log_res = sql_trans_add_dependency(sql->session->tr, grantor,
ddl)) != LOG_OK)
throw(SQL, "sql.grant_table", SQLSTATE(HY013) MAL_MALLOC_FAIL);
return MAL_SUCCEED;
}
@@ -199,15 +199,15 @@ sql_grant_table_privs( mvc *sql, char *g
/* Add dependencies created */
if (privs == all || !c) {
- if (!isNew(t) && (log_res =
sql_trans_add_dependency(sql->session->tr, t->base.id)) != LOG_OK)
+ if (!isNew(t) && (log_res =
sql_trans_add_dependency(sql->session->tr, t->base.id, ddl)) != LOG_OK)
throw(SQL, "sql.grant_table", SQLSTATE(HY013)
MAL_MALLOC_FAIL);
} else {
- if (!isNew(c) && (log_res =
sql_trans_add_dependency(sql->session->tr, c->base.id)) != LOG_OK)
+ if (!isNew(c) && (log_res =
sql_trans_add_dependency(sql->session->tr, c->base.id, ddl)) != LOG_OK)
throw(SQL, "sql.grant_table", SQLSTATE(HY013)
MAL_MALLOC_FAIL);
}
- if ((log_res = sql_trans_add_dependency(sql->session->tr, grantee_id))
!= LOG_OK)
+ if ((log_res = sql_trans_add_dependency(sql->session->tr, grantee_id,
ddl)) != LOG_OK)
throw(SQL, "sql.grant_table", SQLSTATE(HY013) MAL_MALLOC_FAIL);
- if ((log_res = sql_trans_add_dependency(sql->session->tr, grantor)) !=
LOG_OK)
+ if ((log_res = sql_trans_add_dependency(sql->session->tr, grantor,
ddl)) != LOG_OK)
throw(SQL, "sql.grant_table", SQLSTATE(HY013) MAL_MALLOC_FAIL);
return NULL;
@@ -245,9 +245,9 @@ sql_grant_func_privs( mvc *sql, char *gr
throw(SQL,"sql.grant_func", SQLSTATE(42000) "GRANT: failed%s",
log_res == LOG_CONFLICT ? " due to conflict with another transaction" : "");
/* Add dependencies created */
- if (!isNew(f) && (log_res = sql_trans_add_dependency(sql->session->tr,
func_id)) != LOG_OK)
+ if (!isNew(f) && (log_res = sql_trans_add_dependency(sql->session->tr,
func_id, ddl)) != LOG_OK)
throw(SQL, "sql.grant_func", SQLSTATE(HY013) MAL_MALLOC_FAIL);
- if ((log_res = sql_trans_add_dependency(sql->session->tr, grantor)) !=
LOG_OK)
+ if ((log_res = sql_trans_add_dependency(sql->session->tr, grantor,
ddl)) != LOG_OK)
throw(SQL, "sql.grant_func", SQLSTATE(HY013) MAL_MALLOC_FAIL);
return NULL;
}
@@ -448,7 +448,7 @@ sql_drop_role(mvc *m, str auth)
throw(SQL, "sql.drop_role", SQLSTATE(42000) "DROP ROLE:
failed%s", log_res == LOG_CONFLICT ? " due to conflict with another
transaction" : "");
/* Flag as removed */
- if ((log_res = sql_trans_add_removal(tr, role_id)) != LOG_OK)
+ if ((log_res = sql_trans_add_dependency_change(tr, role_id, ddl)) !=
LOG_OK)
throw(SQL, "sql.drop_role", SQLSTATE(HY013) MAL_MALLOC_FAIL);
return NULL;
}
@@ -602,11 +602,11 @@ sql_grant_role(mvc *m, str grantee, str
}
/* Add dependencies created */
- if ((log_res = sql_trans_add_dependency(m->session->tr, grantee_id)) !=
LOG_OK)
+ if ((log_res = sql_trans_add_dependency(m->session->tr, grantee_id,
ddl)) != LOG_OK)
throw(SQL, "sql.grant_role", SQLSTATE(HY013) MAL_MALLOC_FAIL);
- if ((log_res = sql_trans_add_dependency(m->session->tr, role_id)) !=
LOG_OK)
+ if ((log_res = sql_trans_add_dependency(m->session->tr, role_id, ddl))
!= LOG_OK)
throw(SQL, "sql.grant_role", SQLSTATE(HY013) MAL_MALLOC_FAIL);
- if ((log_res = sql_trans_add_dependency(m->session->tr, grantor)) !=
LOG_OK)
+ if ((log_res = sql_trans_add_dependency(m->session->tr, grantor, ddl))
!= LOG_OK)
throw(SQL, "sql.grant_role", SQLSTATE(HY013) MAL_MALLOC_FAIL);
return NULL;
}
@@ -790,7 +790,7 @@ sql_create_user(mvc *sql, char *user, ch
if (!(s = find_sql_schema(sql->session->tr, schema)))
throw(SQL,"sql.create_user", SQLSTATE(3F000) "CREATE USER: no
such schema '%s'", schema);
schema_id = s->base.id;
- if (!isNew(s) && sql_trans_add_dependency(sql->session->tr, s->base.id)
!= LOG_OK)
+ if (!isNew(s) && sql_trans_add_dependency(sql->session->tr, s->base.id,
ddl) != LOG_OK)
throw(SQL, "sql.create_user", SQLSTATE(HY013) MAL_MALLOC_FAIL);
if ((err = backend_create_user(sql, user, passwd, enc, fullname,
schema_id, schema_path, sql->user_id)) != NULL)
@@ -904,7 +904,7 @@ sql_drop_user(mvc *sql, char *user)
list_destroy(deleted);
/* Flag as removed */
- if (!msg && sql_trans_add_removal(sql->session->tr, user_id) != LOG_OK)
+ if (!msg && sql_trans_add_dependency_change(sql->session->tr, user_id,
ddl) != LOG_OK)
throw(SQL, "sql.drop_user", SQLSTATE(HY013) MAL_MALLOC_FAIL);
return msg;
}
@@ -929,7 +929,7 @@ sql_alter_user(mvc *sql, char *user, cha
if (!(s = find_sql_schema(sql->session->tr, schema)))
throw(SQL,"sql.alter_user", SQLSTATE(3F000) "ALTER
USER: no such schema '%s'", schema);
schema_id = s->base.id;
- if (!isNew(s) && sql_trans_add_dependency(sql->session->tr,
s->base.id) != LOG_OK)
+ if (!isNew(s) && sql_trans_add_dependency(sql->session->tr,
s->base.id, ddl) != LOG_OK)
throw(SQL, "sql.alter_user", SQLSTATE(HY013)
MAL_MALLOC_FAIL);
}
if (backend_alter_user(sql, user, passwd, enc, schema_id, schema_path,
oldpasswd) == FALSE)
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
@@ -407,9 +407,6 @@ extern int sql_session_reset(sql_session
extern int sql_trans_begin(sql_session *s);
extern int sql_trans_end(sql_session *s, int commit /* rollback=0, or commit=1
temporaries */);
-extern int sql_trans_add_predicate(sql_trans* tr, sql_column *c, unsigned int
cmp, atom *r, atom *f, bool anti, bool semantics);
-extern int sql_trans_add_dependency(sql_trans* tr, sqlid id);
-extern int sql_trans_add_removal(sql_trans *tr, sqlid id);
extern list* sql_trans_schema_user_dependencies(sql_trans *tr, sqlid
schema_id);
extern int sql_trans_create_dependency(sql_trans *tr, sqlid id, sqlid
depend_id, sql_dependency depend_type);
extern int sql_trans_drop_dependencies(sql_trans *tr, sqlid depend_id);
@@ -468,7 +465,7 @@ typedef struct sqlstore {
store_type active_type;
list *changes; /* pending changes too cleanup */
sql_hash *dependencies; /* pending dependencies created too cleanup */
- sql_hash *removals; /* pending removals created too cleanup
*/
+ sql_hash *depchanges; /* pending dependencies changes too cleanup */
sql_allocator *sa; /* for now a store allocator, needs a
special version with free operations (with reuse) */
sqlid obj_id, prev_oid;
@@ -479,8 +476,14 @@ typedef struct sqlstore {
void *logger; /* space to keep logging structure of
storage backend */
} sqlstore;
+typedef enum sql_dependency_change_type {
+ ddl = 1,
+ dml = 2
+} sql_dependency_change_type;
+
typedef struct sql_dependency_change {
sqlid objid; /* id of the object where the dependency was created */
+ sql_dependency_change_type type; /* type of dependency */
ulng ts; /* committed timestamp */
} sql_dependency_change;
@@ -498,4 +501,8 @@ typedef struct 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 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);
+extern int sql_trans_add_dependency(sql_trans* tr, sqlid id,
sql_dependency_change_type tp);
+extern int sql_trans_add_dependency_change(sql_trans *tr, sqlid id,
sql_dependency_change_type tp);
+
#endif /*SQL_STORAGE_H */
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -66,10 +66,17 @@ instore(sqlid id)
}
static void
-id_destroy(sqlstore *store, int *id)
+id_destroy(sqlstore *store, void *p)
{
(void)store;
- GDKfree(id);
+ GDKfree(p);
+}
+
+static void
+dep_destroy(sqlstore *store, sql_dependency_change *dep)
+{
+ (void)store;
+ GDKfree(dep);
}
static void
@@ -298,34 +305,40 @@ sql_trans_add_predicate(sql_trans* tr, s
}
int
-sql_trans_add_dependency(sql_trans* tr, sqlid id)
-{
- sqlid *local_id = MNEW(sqlid);
-
- if (!local_id)
+sql_trans_add_dependency(sql_trans* tr, sqlid id, sql_dependency_change_type
tp)
+{
+ sql_dependency_change *dep = MNEW(sql_dependency_change);
+
+ if (!dep)
return LOG_ERR;
- *local_id = id;
- if (!tr->dependencies && !(tr->dependencies = list_create((fdestroy)
&id_destroy))) {
- _DELETE(local_id);
+ *dep = (sql_dependency_change) {
+ .objid = id,
+ .type = tp
+ };
+ if (!tr->dependencies && !(tr->dependencies = list_create((fdestroy)
&dep_destroy))) {
+ _DELETE(dep);
return LOG_ERR;
}
- list_append(tr->dependencies, local_id);
+ list_append(tr->dependencies, dep);
return LOG_OK;
}
int
-sql_trans_add_removal(sql_trans *tr, sqlid id)
-{
- sqlid *local_id = MNEW(sqlid);
-
- if (!local_id)
+sql_trans_add_dependency_change(sql_trans *tr, sqlid id,
sql_dependency_change_type tp)
+{
+ sql_dependency_change *dep = MNEW(sql_dependency_change);
+
+ if (!dep)
return LOG_ERR;
- *local_id = id;
- if (!tr->removals && !(tr->removals = list_create((fdestroy)
&id_destroy))) {
- _DELETE(local_id);
+ *dep = (sql_dependency_change) {
+ .objid = id,
+ .type = tp
+ };
+ if (!tr->depchanges && !(tr->depchanges = list_create((fdestroy)
&dep_destroy))) {
+ _DELETE(dep);
return LOG_ERR;
}
- list_append(tr->removals, local_id);
+ list_append(tr->depchanges, dep);
return LOG_OK;
}
@@ -1745,7 +1758,7 @@ store_load(sqlstore *store, sql_allocato
/* for now use malloc and free */
store->active = list_create(NULL);
store->dependencies = hash_new(NULL, 1024, (fkeyvalue)&id_hash);
- store->removals = hash_new(NULL, 1024, (fkeyvalue)&id_hash);
+ store->depchanges = hash_new(NULL, 1024, (fkeyvalue)&id_hash);
if (store->first) {
/* cannot initialize database in readonly mode */
@@ -2122,7 +2135,7 @@ store_exit(sqlstore *store)
list_destroy(store->active);
id_hash_destroy(store->dependencies);
- id_hash_destroy(store->removals);
+ id_hash_destroy(store->depchanges);
TRC_DEBUG(SQL_STORE, "Store unlocked\n");
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list