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

Reply via email to