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 checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list