Changeset: a82334ac1a76 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a82334ac1a76 Modified Files: sql/backends/monet5/sql.c sql/backends/monet5/sql_gencode.c sql/backends/monet5/sql_statistics.c sql/backends/monet5/sql_upgrades.c sql/include/sql_catalog.h sql/server/rel_updates.c sql/server/sql_mvc.c sql/server/sql_privileges.c sql/storage/bat/bat_storage.c sql/storage/sql_catalog.c sql/storage/sql_storage.h sql/storage/store.c Branch: nospare Log Message:
move catalog into its own structure diffs (truncated from 1441 to 300 lines): diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c --- a/sql/backends/monet5/sql.c +++ b/sql/backends/monet5/sql.c @@ -4400,7 +4400,7 @@ sql_storage(Client cntxt, MalBlkPtr mb, cname = *getArgReference_str(stk, pci, pci->retc + 2); /* check for limited storage tables */ - for (nsch = tr->schemas.set->h; nsch; nsch = nsch->next) { + for (nsch = tr->cat->schemas.set->h; nsch; nsch = nsch->next) { sql_base *b = nsch->data; sql_schema *s = (sql_schema *) nsch->data; if( sname && strcmp(b->name, sname) ) diff --git a/sql/backends/monet5/sql_gencode.c b/sql/backends/monet5/sql_gencode.c --- a/sql/backends/monet5/sql_gencode.c +++ b/sql/backends/monet5/sql_gencode.c @@ -1058,7 +1058,7 @@ mal_function_find_implementation_address m->user_id = m->role_id = USER_MONETDB; store_lock(); - m->session = sql_session_create(0); + m->session = sql_session_create(m->pa, 0); store_unlock(); if (!m->session) { (void) sql_error(o, 02, SQLSTATE(HY013) MAL_MALLOC_FAIL); 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 @@ -46,14 +46,14 @@ sql_drop_statistics(mvc *m, sql_table *t if (!isTable(t)) throw(SQL, "sql_drop_statistics", SQLSTATE(42S02) "DROP STATISTICS: %s '%s' is not persistent", TABLE_TYPE_DESCRIPTION(t->type, t->properties), t->base.name); if (!table_privs(m, t, PRIV_SELECT)) - throw(SQL, "sql_drop_statistics", SQLSTATE(42000) "DROP STATISTICS: access denied for %s to table '%s.%s'", + throw(SQL, "sql_drop_statistics", SQLSTATE(42000) "DROP STATISTICS: access denied for %s to table '%s.%s'", get_string_global_var(m, "current_user"), t->s->base.name, t->base.name); if (isTable(t) && t->columns.set) { for (ncol = (t)->columns.set->h; ncol; ncol = ncol->next) { sql_column *c = (sql_column *) ncol->data; if (!column_privs(m, c, PRIV_SELECT)) - throw(SQL, "sql_drop_statistics", SQLSTATE(42000) "DROP STATISTICS: access denied for %s to column '%s' on table '%s.%s'", + throw(SQL, "sql_drop_statistics", SQLSTATE(42000) "DROP STATISTICS: access denied for %s to column '%s' on table '%s.%s'", get_string_global_var(m, "current_user"), c->base.name, t->s->base.name, t->base.name); } } @@ -122,7 +122,7 @@ sql_analyze(Client cntxt, MalBlkPtr mb, TRC_DEBUG(SQL_PARSER, "analyze %s.%s.%s sample " LLFMT "%s\n", (sch ? sch : ""), (tbl ? tbl : " "), (col ? col : " "), samplesize, (minmax)?"MinMax":""); /* Do all the validations before doing any analyze */ - for (nsch = tr->schemas.set->h; nsch; nsch = nsch->next) { + for (nsch = tr->cat->schemas.set->h; nsch; nsch = nsch->next) { sql_schema *s = (sql_schema *) nsch->data; if (!isalpha((unsigned char) s->base.name[0])) continue; @@ -140,7 +140,7 @@ sql_analyze(Client cntxt, MalBlkPtr mb, if (tbl && !isTable(t)) throw(SQL, "analyze", SQLSTATE(42S02) "%s '%s' is not persistent", TABLE_TYPE_DESCRIPTION(t->type, t->properties), t->base.name); if (!table_privs(m, t, PRIV_SELECT)) - throw(SQL, "analyze", SQLSTATE(42000) "ANALYZE: access denied for %s to table '%s.%s'", + throw(SQL, "analyze", SQLSTATE(42000) "ANALYZE: access denied for %s to table '%s.%s'", get_string_global_var(m, "current_user"), t->s->base.name, t->base.name); if (isTable(t) && t->columns.set) { for (ncol = (t)->columns.set->h; ncol; ncol = ncol->next) { @@ -150,7 +150,7 @@ sql_analyze(Client cntxt, MalBlkPtr mb, continue; cfnd = 1; if (!column_privs(m, c, PRIV_SELECT)) - throw(SQL, "analyze", SQLSTATE(42000) "ANALYZE: access denied for %s to column '%s' on table '%s.%s'", + throw(SQL, "analyze", SQLSTATE(42000) "ANALYZE: access denied for %s to column '%s' on table '%s.%s'", get_string_global_var(m, "current_user"), c->base.name, t->s->base.name, t->base.name); } } @@ -163,7 +163,7 @@ sql_analyze(Client cntxt, MalBlkPtr mb, if (col && !cfnd) throw(SQL, "analyze", SQLSTATE(38000) "Column '%s' does not exist", col); - for (nsch = tr->schemas.set->h; nsch; nsch = nsch->next) { + for (nsch = tr->cat->schemas.set->h; nsch; nsch = nsch->next) { sql_base *b = nsch->data; sql_schema *s = (sql_schema *) nsch->data; if (!isalpha((unsigned char) b->name[0])) 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 @@ -1041,7 +1041,7 @@ sql_update_nov2019_missing_dependencies( pos += snprintf(buf + pos, bufsize - pos, "insert into sys.dependencies select c1, c2, c3 from (values"); ppos = pos; /* later check if found updatable database objects */ - for (node *n = sql->session->tr->schemas.set->h; n; n = n->next) { + 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) 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 @@ -239,26 +239,6 @@ extern void cs_remove_node(changeset * c typedef void *backend_code; typedef size_t backend_stack; -typedef struct sql_trans { - char *name; - int stime; /* start of transaction */ - int wstime; /* first write transaction time stamp */ - int wtime; /* timestamp of latest write performed in transaction*/ - int schema_number; /* schema timestamp */ - int schema_updates; /* set on schema changes */ - int active; /* active transaction */ - int status; /* status of the last query */ - list *dropped; /* protection against recursive cascade action*/ - list *moved_tables; - - changeset schemas; - - sql_allocator *sa; /* transaction allocator */ - - struct sql_trans *parent; /* multilevel transaction support */ - backend_stack stk; -} sql_trans; - typedef struct sql_schema { sql_base base; sqlid auth_id; @@ -276,9 +256,33 @@ typedef struct sql_schema { list *triggers; /* useful within a table */ char *internal; /* optional internal module name */ - sql_trans *tr; + //sql_trans *tr; } sql_schema; +typedef struct sql_catalog { + changeset schemas; +} sql_catalog; + +typedef struct sql_trans { + char *name; + int stime; /* start of transaction */ + int wstime; /* first write transaction time stamp */ + int wtime; /* timestamp of latest write performed in transaction*/ + int schema_number; /* schema timestamp */ + int schema_updates; /* set on schema changes */ + int active; /* active transaction */ + int status; /* status of the last query */ + list *dropped; /* protection against recursive cascade action*/ + list *moved_tables; + + sql_catalog *cat; + sql_schema *tmp; /* each session has its own tmp schema */ + sql_allocator *sa; /* transaction allocator */ + + struct sql_trans *parent; /* multilevel transaction support */ + backend_stack stk; +} sql_trans; + typedef enum sql_class { EC_ANY, EC_TABLE, @@ -702,6 +706,7 @@ typedef struct res_table { } res_table; typedef struct sql_session { + sql_allocator *sa; sql_trans *tr; /* active transaction */ char *schema_name; /* transaction's schema name */ diff --git a/sql/server/rel_updates.c b/sql/server/rel_updates.c --- a/sql/server/rel_updates.c +++ b/sql/server/rel_updates.c @@ -1500,6 +1500,9 @@ copyfrom(sql_query *query, dlist *qname, assert(!nr_offset || nr_offset->h->type == type_lng); assert(!nr_offset || nr_offset->h->next->type == type_lng); + if (locked) + locked = 0; + if (strstr(rsep, "\r\n") != NULL) return sql_error(sql, 02, SQLSTATE(42000) "COPY INTO: record separator contains '\\r\\n' but " 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 @@ -358,7 +358,7 @@ mvc_init(sql_allocator *pa, int debug, s } //as the sql_parser is not yet initialized in the storage, we determine the sql type of the sql_parts here - for (node *n = m->session->tr->schemas.set->h; n; n = n->next) { + for (node *n = m->session->tr->cat->schemas.set->h; n; n = n->next) { sql_schema *ss = (sql_schema*) n->data; if (ss->tables.set) { for (node *nn = ss->tables.set->h; nn; nn = nn->next) { @@ -762,7 +762,7 @@ mvc_create(sql_allocator *pa, int client m->cascade_action = NULL; store_lock(); - m->session = sql_session_create(1 /*autocommit on*/); + m->session = sql_session_create(m->pa, 1 /*autocommit on*/); store_unlock(); if (!m->session) { qc_destroy(m->qc); 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 @@ -723,18 +723,14 @@ mvc_set_schema(mvc *m, char *schema) { int ret = 0; sql_schema *s = find_sql_schema(m->session->tr, schema); - char* new_schema_name = _STRDUP(schema); + char* new_schema_name = sa_strdup(m->session->sa, schema); if (s && new_schema_name) { - if (m->session->schema_name) - _DELETE(m->session->schema_name); m->session->schema_name = new_schema_name; m->type = Q_SCHEMA; if (m->session->tr->active) m->session->schema = s; ret = 1; - } else if (new_schema_name) { - _DELETE(new_schema_name); } return ret; } diff --git a/sql/storage/bat/bat_storage.c b/sql/storage/bat/bat_storage.c --- a/sql/storage/bat/bat_storage.c +++ b/sql/storage/bat/bat_storage.c @@ -2272,7 +2272,7 @@ static int int ok = LOG_OK, tchanges = 0; node *sn; - for(sn = tr->schemas.set->h; sn && ok == LOG_OK; sn = sn->next) { + for(sn = tr->cat->schemas.set->h; sn && ok == LOG_OK; sn = sn->next) { int schanges = 0; sql_schema *s = sn->data; @@ -2847,6 +2847,7 @@ update_table(sql_trans *tr, sql_table *f if (ok == LOG_OK && tt->idxs.set) { if (ot) o = ot->idxs.set->h; + if (ft->idxs.set && tt->idxs.set) for (n = ft->idxs.set->h, m = tt->idxs.set->h; ok == LOG_OK && n && m; n = n->next, m = m->next, o=(o?o->next:NULL)) { sql_idx *ci = n->data; sql_idx *oi = m->data; diff --git a/sql/storage/sql_catalog.c b/sql/storage/sql_catalog.c --- a/sql/storage/sql_catalog.c +++ b/sql/storage/sql_catalog.c @@ -165,8 +165,8 @@ sql_trans_find_key(sql_trans *tr, sqlid node *n, *m; sql_key *k = NULL; - if (tr->schemas.set) { - for (n = tr->schemas.set->h; n && !k; n = n->next) { + if (tr->cat->schemas.set) { + for (n = tr->cat->schemas.set->h; n && !k; n = n->next) { m = find_sql_key_node(n->data, id); if (m) k = m->data; @@ -193,8 +193,8 @@ sql_trans_find_idx(sql_trans *tr, sqlid node *n, *m; sql_idx *i = NULL; - if (tr->schemas.set) { - for (n = tr->schemas.set->h; n && !i; n = n->next) { + if (tr->cat->schemas.set) { + for (n = tr->cat->schemas.set->h; n && !i; n = n->next) { m = find_sql_idx_node(n->data, id); if (m) i = m->data; @@ -245,8 +245,8 @@ sql_trans_find_table(sql_trans *tr, sqli node *n, *m; sql_table *t = NULL; - if (tr->schemas.set) { - for (n = tr->schemas.set->h; n && !t; n = n->next) { + if (tr->cat->schemas.set) { + for (n = tr->cat->schemas.set->h; n && !t; n = n->next) { m = find_sql_table_node(n->data, id); if (m) t = m->data; @@ -262,15 +262,15 @@ find_sql_sequence(sql_schema *s, const c } sql_schema * -find_sql_schema(sql_trans *t, const char *sname) +find_sql_schema(sql_trans *tr, const char *sname) { - return _cs_find_name(&t->schemas, sname); + return _cs_find_name(&tr->cat->schemas, sname); } sql_schema * -find_sql_schema_id(sql_trans *t, sqlid id) +find_sql_schema_id(sql_trans *tr, sqlid id) { - node *n = cs_find_id(&t->schemas, id); + node *n = cs_find_id(&tr->cat->schemas, id); if (n) return n->data; @@ -278,9 +278,9 @@ find_sql_schema_id(sql_trans *t, sqlid i } _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list