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