Changeset: edee724287fe for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=edee724287fe
Modified Files:
        sql/backends/monet5/sql_cat.c
        sql/backends/monet5/sql_scenario.c
        sql/backends/monet5/sql_upgrades.c
        sql/include/sql_catalog.h
        sql/server/rel_schema.c
        sql/server/sql_mvc.c
        sql/server/sql_privileges.c
        sql/server/sql_semantic.c
        sql/storage/objectset.c
        sql/storage/sql_catalog.c
        sql/storage/sql_storage.h
        sql/storage/store.c
Branch: nospare
Log Message:

more objectset usage


diffs (truncated from 1080 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
@@ -745,9 +745,9 @@ drop_func(mvc *sql, char *sname, char *n
        if (!mvc_schema_privs(sql, s))
                throw(SQL,"sql.drop_func", SQLSTATE(42000) "DROP %s: access 
denied for %s to schema '%s'", F, get_string_global_var(sql, "current_user"), 
s->base.name);
        if (fid >= 0) {
-               node *n = find_sql_func_node(s, fid);
-               if (n) {
-                       sql_func *func = n->data;
+               sql_base *b = os_find_id(s->funcs, sql->session->tr, fid);
+               if (b) {
+                       sql_func *func = (sql_func*)b;
 
                        if (!action && mvc_check_dependency(sql, func->base.id, 
!IS_PROC(func) ? FUNC_DEPENDENCY : PROC_DEPENDENCY, NULL))
                                throw(SQL,"sql.drop_func", SQLSTATE(42000) 
"DROP %s: there are database objects dependent on %s %s;", F, fn, 
func->base.name);
@@ -1105,8 +1105,7 @@ SQLdrop_schema(Client cntxt, MalBlkPtr m
        if (sql_schema_has_user(sql, s))
                throw(SQL,"sql.drop_schema",SQLSTATE(2BM37) "DROP SCHEMA: 
unable to drop schema '%s' (there are database objects which depend on it)", 
sname);
        if (!action /* RESTRICT */ && (
-               os_size(s->tables, tr) || !tr_empty(tr, s->types.set) ||
-               !tr_empty(tr, s->funcs.set) || os_size(s->seqs, tr)))
+               os_size(s->tables, tr) || os_size(s->types, tr) || 
os_size(s->funcs, tr) || os_size(s->seqs, tr)))
                throw(SQL,"sql.drop_schema",SQLSTATE(2BM37) "DROP SCHEMA: 
unable to drop schema '%s' (there are database objects which depend on it)", 
sname);
 
        if (mvc_drop_schema(sql, s, action))
@@ -1647,7 +1646,7 @@ SQLrename_schema(Client cntxt, MalBlkPtr
                throw(SQL, "sql.rename_schema", SQLSTATE(42000) "ALTER SCHEMA: 
access denied for %s to schema '%s'", get_string_global_var(sql, 
"current_user"), old_name);
        if (s->system)
                throw(SQL, "sql.rename_schema", SQLSTATE(3F000) "ALTER SCHEMA: 
cannot rename a system schema");
-       if (os_size(s->tables, tr) || !list_empty(s->types.set) || 
!list_empty(s->funcs.set) || os_size(s->seqs, tr))
+       if (os_size(s->tables, tr) || os_size(s->types, tr) || 
os_size(s->funcs, tr) || os_size(s->seqs, tr))
                throw(SQL, "sql.rename_schema", SQLSTATE(2BM37) "ALTER SCHEMA: 
unable to rename schema '%s' (there are database objects which depend on it)", 
old_name);
        if (strNil(new_name) || *new_name == '\0')
                throw(SQL, "sql.rename_schema", SQLSTATE(3F000) "ALTER SCHEMA: 
invalid new schema name");
diff --git a/sql/backends/monet5/sql_scenario.c 
b/sql/backends/monet5/sql_scenario.c
--- a/sql/backends/monet5/sql_scenario.c
+++ b/sql/backends/monet5/sql_scenario.c
@@ -260,8 +260,6 @@ SQLprepareClient(Client c, int login)
                backend_reset(be);
 #endif
        }
-       if (m->session->tr)
-               reset_functions(m->session->tr);
        MT_lock_unset(&sql_contextLock);
        if (login) {
                str schema = monet5_user_set_def_schema(m, c->user);
diff --git a/sql/backends/monet5/sql_upgrades.c 
b/sql/backends/monet5/sql_upgrades.c
--- a/sql/backends/monet5/sql_upgrades.c
+++ b/sql/backends/monet5/sql_upgrades.c
@@ -1046,40 +1046,40 @@ sql_update_nov2019_missing_dependencies(
        for (node *n = sql->session->tr->cat->schemas.set->h; n; n = n->next) {
                sql_schema *s = (sql_schema*) n->data;
 
-               if (s->funcs.set)
-                       for (node *m = s->funcs.set->h; m; m = m->next) {
-                               sql_func *f = (sql_func*) m->data;
+               struct os_iter *oi = os_iterator(s->funcs, sql->session->tr, 
NULL);
+               for (sql_base *b = oi_next(oi); b; oi_next(oi)) {
+                       sql_func *f = (sql_func*)b;
 
-                               if (f->query && f->lang == FUNC_LANG_SQL) {
-                                       char *relt;
-                                       sql_rel *r = NULL;
+                       if (f->query && f->lang == FUNC_LANG_SQL) {
+                               char *relt;
+                               sql_rel *r = NULL;
 
-                                       if (!(relt = sa_strdup(sql->sa, 
f->query))) {
-                                               err = createException(SQL, 
"sql.catalog", SQLSTATE(HY013) MAL_MALLOC_FAIL);
-                                               goto bailout;
-                                       }
+                               if (!(relt = sa_strdup(sql->sa, f->query))) {
+                                       err = createException(SQL, 
"sql.catalog", SQLSTATE(HY013) MAL_MALLOC_FAIL);
+                                       goto bailout;
+                               }
 
-                                       r = rel_parse(sql, s, relt, m_deps);
-                                       if (r)
-                                               r = sql_processrelation(sql, r, 
0, 0);
-                                       if (r) {
-                                               list *id_l = 
rel_dependencies(sql, r);
+                               r = rel_parse(sql, s, relt, m_deps);
+                               if (r)
+                                       r = sql_processrelation(sql, r, 0, 0);
+                               if (r) {
+                                       list *id_l = rel_dependencies(sql, r);
 
-                                               for (node *o = id_l->h ; o ; o 
= o->next) {
-                                                       sqlid next = *(sqlid*) 
o->data;
-                                                       if (next != f->base.id) 
{
-                                                               pos += 
snprintf(buf + pos, bufsize - pos, "%s(%d,%d,%d)", first ? "" : ",", next,
-                                                                               
                f->base.id, (int)(!IS_PROC(f) ? FUNC_DEPENDENCY : 
PROC_DEPENDENCY));
-                                                               first = false;
-                                                               
FLUSH_INSERTS_IF_BUFFERFILLED
-                                                       }
+                                       for (node *o = id_l->h ; o ; o = 
o->next) {
+                                               sqlid next = *(sqlid*) o->data;
+                                               if (next != f->base.id) {
+                                                       pos += snprintf(buf + 
pos, bufsize - pos, "%s(%d,%d,%d)", first ? "" : ",", next,
+                                                                               
        f->base.id, (int)(!IS_PROC(f) ? FUNC_DEPENDENCY : PROC_DEPENDENCY));
+                                                       first = false;
+                                                       
FLUSH_INSERTS_IF_BUFFERFILLED
                                                }
-                                       } else if (sql->session->status == -1) {
-                                               sql->session->status = 0;
-                                               sql->errstr[0] = 0;
                                        }
+                               } else if (sql->session->status == -1) {
+                                       sql->session->status = 0;
+                                       sql->errstr[0] = 0;
                                }
                        }
+               }
                if (s->tables) {
             struct os_iter *oi = os_iterator(s->tables, tr, NULL);
             for (sql_base *b = oi_next(oi); b; b = oi_next(oi)) {
@@ -2865,7 +2865,7 @@ SQLupgrades(Client c, mvc *m)
         * exist any more at the "sys" schema (i.e., the first part of
         * the upgrade has been completed succesfully), then move on
         * to the second part */
-       if (find_sql_type(s, "point") != NULL) {
+       if (find_sql_type(m->session->tr, s, "point") != NULL) {
                /* type sys.point exists: this is an old geom-enabled
                 * database */
                if ((err = sql_update_geom(c, m, 1, prev_schema)) != NULL) {
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
@@ -234,7 +234,7 @@ typedef int (*tc_log_fptr) (struct sql_t
 typedef int (*tc_cleanup_fptr) (sql_store store, struct sql_change *c, ulng 
commit_ts, ulng oldest); /* garbage collection, ie cleanup structures when 
possible */
 typedef void (*destroy_fptr)(sql_store store, sql_base *b);
 
-extern struct objectset *os_new(sql_allocator *sa, destroy_fptr destroy, bool 
temporary);
+extern struct objectset *os_new(sql_allocator *sa, destroy_fptr destroy, bool 
temporary, bool unique);
 extern struct objectset *os_dup(struct objectset *os);
 extern void os_destroy(struct objectset *os, sql_store store);
 extern int /*ok, error (name existed) and conflict (added before) */ 
os_add(struct objectset *os, struct sql_trans *tr, const char *name, sql_base 
*b);
@@ -275,8 +275,8 @@ typedef struct sql_schema {
        // TODO? int type;      /* persistent, session local, transaction local 
*/
 
        struct objectset *tables;
-       changeset types;
-       changeset funcs;
+       struct objectset *types;
+       struct objectset *funcs;
        struct objectset *seqs;
        struct objectset *keys;         /* Names for keys, idxs, and triggers 
and parts are */
        struct objectset *idxs;         /* global, but these objects are only */
@@ -758,11 +758,9 @@ extern node *list_find_id(list *l, sqlid
 extern node *list_find_base_id(list *l, sqlid id);
 
 extern sql_key *find_sql_key(sql_table *t, const char *kname);
-extern node *find_sql_key_node(sql_schema *s, sqlid id);
 extern sql_key *sql_trans_find_key(sql_trans *tr, sqlid id);
 
 extern sql_idx *find_sql_idx(sql_table *t, const char *kname);
-extern node *find_sql_idx_node(sql_schema *s, sqlid id);
 extern sql_idx *sql_trans_find_idx(sql_trans *tr, sqlid id);
 
 extern sql_column *find_sql_column(sql_table *t, const char *cname);
@@ -779,17 +777,14 @@ extern sql_schema *find_sql_schema(sql_t
 extern sql_schema *find_sql_schema_id(sql_trans *t, sqlid id);
 extern node *find_sql_schema_node(sql_trans *t, sqlid id);
 
-extern sql_type *find_sql_type(sql_schema * s, const char *tname);
+extern sql_type *find_sql_type(sql_trans *tr, sql_schema * s, const char 
*tname);
 extern sql_type *sql_trans_bind_type(sql_trans *tr, sql_schema *s, const char 
*name);
-extern node *find_sql_type_node(sql_schema *s, sqlid id);
-extern sql_type *sql_trans_find_type(sql_trans *tr, sqlid id);
+extern sql_type *sql_trans_find_type(sql_trans *tr, sql_schema *s /*optional 
*/, sqlid id);
 
-extern sql_func *find_sql_func(sql_schema * s, const char *tname);
+extern sql_func *find_sql_func(sql_trans *tr, sql_schema * s, const char 
*tname);
 extern sql_func *sql_trans_bind_func(sql_trans *tr, const char *name);
 extern sql_func *sql_trans_find_func(sql_trans *tr, sqlid id);
-extern node *find_sql_func_node(sql_schema *s, sqlid id);
 
-extern node *find_sql_trigger_node(sql_schema *s, sqlid id);
 extern sql_trigger *sql_trans_find_trigger(sql_trans *tr, sqlid id);
 
 extern void *sql_values_list_element_validate_and_insert(void *v1, void *v2, 
void *tpe, int* res);
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
@@ -2168,7 +2168,7 @@ rel_rename_schema(mvc *sql, char *old_na
                return sql_error(sql, 02, SQLSTATE(3F000) "ALTER SCHEMA: access 
denied for %s to schema '%s'", get_string_global_var(sql, "current_user"), 
old_name);
        if (s->system)
                return sql_error(sql, 02, SQLSTATE(3F000) "ALTER SCHEMA: cannot 
rename a system schema");
-       if (os_size(s->tables, tr) || !list_empty(s->types.set) || 
!list_empty(s->funcs.set) || os_size(s->seqs, tr))
+       if (os_size(s->tables, tr) || os_size(s->types, tr) || 
os_size(s->funcs, tr) || os_size(s->seqs, tr))
                return sql_error(sql, 02, SQLSTATE(2BM37) "ALTER SCHEMA: unable 
to rename schema '%s' (there are database objects which depend on it)", 
old_name);
        if (strNil(new_name) || *new_name == '\0')
                return sql_error(sql, 02, SQLSTATE(3F000) "ALTER SCHEMA: 
invalid new schema name");
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
@@ -882,7 +882,7 @@ mvc_bind_type(mvc *sql, const char *name
 sql_type *
 schema_bind_type(mvc *sql, sql_schema *s, const char *name)
 {
-       sql_type *t = find_sql_type(s, name);
+       sql_type *t = find_sql_type(sql->session->tr, s, name);
 
        (void) sql;
        if (!t)
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
@@ -188,16 +188,14 @@ char *
 sql_grant_func_privs( mvc *sql, char *grantee, int privs, char *sname, sqlid 
func_id, int grant, sqlid grantor)
 {
        sql_schema *s = NULL;
-       sql_func *f = NULL;
        bool allowed;
        sqlid grantee_id;
-       node *n;
 
        assert(sname);
        if (!(s = mvc_bind_schema(sql, sname)))
                throw(SQL,"sql.grant_func",SQLSTATE(3F000) "GRANT: no such 
schema '%s'", sname);
-       if ((n = find_sql_func_node(s, func_id)))
-               f = n->data;
+       sql_base *b = os_find_id(s->funcs, sql->session->tr, func_id);
+       sql_func *f = (sql_func*)b;
        assert(f);
        allowed = schema_privs(grantor, f->s);
 
@@ -317,16 +315,14 @@ char *
 sql_revoke_func_privs( mvc *sql, char *grantee, int privs, char *sname, sqlid 
func_id, int grant, sqlid grantor)
 {
        sql_schema *s = NULL;
-       sql_func *f = NULL;
        bool allowed;
        sqlid grantee_id;
-       node *n;
 
        assert(sname);
        if (!(s = mvc_bind_schema(sql, sname)))
                throw(SQL,"sql.revoke_func", SQLSTATE(3F000) "REVOKE: no such 
schema '%s'", sname);
-       if ((n = find_sql_func_node(s, func_id)))
-               f = n->data;
+       sql_base *b = os_find_id(s->funcs, sql->session->tr, func_id);
+       sql_func *f = (sql_func*)b;
        assert(f);
        allowed = schema_privs(grantor, f->s);
        if (!allowed)
diff --git a/sql/server/sql_semantic.c b/sql/server/sql_semantic.c
--- a/sql/server/sql_semantic.c
+++ b/sql/server/sql_semantic.c
@@ -308,7 +308,7 @@ sql_find_func_internal(mvc *sql, list *f
                        for (; he; he = he->chain) {
                                sql_func *f = he->value;
 
-                               if (f->base.deleted || (f->type != type && 
f->type != filt))
+                               if (f->type != type && f->type != filt)
                                        continue;
                                if ((res = func_cmp(sql->sa, f, fname, nrargs)) 
!= NULL) {
                                        MT_lock_unset(&ff->ht_lock);
@@ -327,7 +327,7 @@ sql_find_func_internal(mvc *sql, list *f
                        for (; n; n = n->next) {
                                sql_func *f = n->data;
 
-                               if (f->base.deleted || (f->type != type && 
f->type != filt))
+                               if (f->type != type && f->type != filt)
                                        continue;
                                if ((res = func_cmp(sql->sa, f, fname, nrargs)) 
!= NULL)
                                        return res;
@@ -337,6 +337,29 @@ sql_find_func_internal(mvc *sql, list *f
        return res;
 }
 
+static sql_subfunc *
+os_find_func_internal(mvc *sql, struct objectset *ff, const char *fname, int 
nrargs, sql_ftype type, sql_subfunc *prev)
+{
+       sql_subfunc *res = NULL;
+       sql_ftype filt = (type == F_FUNC)?F_FILT:type;
+
+       if (ff) {
+               struct os_iter *oi = os_iterator(ff, sql->session->tr, fname);
+               for (sql_base *b = oi_next(oi); b; b = oi_next(oi)) {
+                       sql_func *f = (sql_func*)b;
+                       if (prev && prev->func != f)
+                               continue;
+                       prev = NULL;
+
+                       if (f->type != type && f->type != filt)
+                               continue;
+                       if ((res = func_cmp(sql->sa, f, fname, nrargs)) != NULL)
+                               return res;
+               }
+       }
+       return res;
+}
+
 #define functions_without_schema(X) if (strcmp(sname, "sys") == 0) X
 
 #define find_func_extra \
@@ -357,7 +380,7 @@ sql_find_func(mvc *sql, const char *snam
 
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to