char * sql_grant_role(mvc *m, str grantee, str auth /*, grantor?, admin? */ ) { oid rid; sql_schema *sys = find_sql_schema(m->session->tr, "sys"); sql_table *auths = find_sql_table(sys, "auths"); sql_table *roles = find_sql_table(sys, "user_role"); sql_column *auths_name = find_sql_column(auths, "name"); sql_column *auths_id = find_sql_column(auths, "id"); void *auth_id, *grantee_id; rid = table_funcs.column_find_row(m->session->tr, auths_name, grantee, NULL); if (rid == oid_nil) return sql_message("M1M05!GRANT: cannot grant ROLE '%s' to ROLE '%s'", grantee, auth ); grantee_id = table_funcs.column_find_value(m->session->tr, auths_id, rid); rid = table_funcs.column_find_row(m->session->tr, auths_name, auth, NULL); if (rid == oid_nil) { _DELETE(grantee_id); return sql_message("M1M05!GRANT: cannot grant ROLE '%s' to ROLE '%s'", grantee, auth ); } auth_id = table_funcs.column_find_value(m->session->tr, auths_id, rid); table_funcs.table_insert(m->session->tr, roles, grantee_id, auth_id); _DELETE(grantee_id); _DELETE(auth_id); return NULL; }
int mvc_set_role(mvc *m, char *role) { oid rid; sql_schema *sys = find_sql_schema(m->session->tr, "sys"); sql_table *auths = find_sql_table(sys, "auths"); sql_column *auths_name = find_sql_column(auths, "name"); int res = 0; if (m->debug&1) fprintf(stderr, "mvc_set_role %s\n", role); rid = table_funcs.column_find_row(m->session->tr, auths_name, role, NULL); if (rid != oid_nil) { sql_table *roles = find_sql_table(sys, "user_role"); sql_column *role_id = find_sql_column(roles, "role_id"); sql_column *login_id = find_sql_column(roles, "login_id"); sql_column *auths_id = find_sql_column(auths, "id"); void *p = table_funcs.column_find_value(m->session->tr, auths_id, rid); int id = *(int *)p; _DELETE(p); rid = table_funcs.column_find_row(m->session->tr, login_id, &m->user_id, role_id, &id, NULL); if (rid != oid_nil) { m->role_id = id; res = 1; } } return res; }
char * sql_revoke_role(mvc *m, str grantee, str auth) /* grantee no longer belongs the role (auth) */ { oid rid; sql_schema *sys = find_sql_schema(m->session->tr, "sys"); sql_table *auths = find_sql_table(sys, "auths"); sql_table *roles = find_sql_table(sys, "user_role"); sql_column *auths_name = find_sql_column(auths, "name"); sql_column *auths_id = find_sql_column(auths, "id"); sql_column *role_id = find_sql_column(roles, "role_id"); sql_column *login_id = find_sql_column(roles, "login_id"); void *auth_id, *grantee_id; rid = table_funcs.column_find_row(m->session->tr, auths_name, grantee, NULL); if (rid == oid_nil) return sql_message("42M32!REVOKE: no such role '%s' or grantee '%s'", auth, grantee); grantee_id = table_funcs.column_find_value(m->session->tr, auths_id, rid); rid = table_funcs.column_find_row(m->session->tr, auths_name, auth, NULL); if (rid == oid_nil) { _DELETE(grantee_id); return sql_message("42M32!REVOKE: no such role '%s' or grantee '%s'", auth, grantee); } auth_id = table_funcs.column_find_value(m->session->tr, auths_id, rid); rid = table_funcs.column_find_row(m->session->tr, login_id, grantee_id, role_id, auth_id, NULL); table_funcs.table_delete(m->session->tr, roles, rid); _DELETE(grantee_id); _DELETE(auth_id); return NULL; }
str monet5_user_get_def_schema(mvc *m, int user) { oid rid; sqlid schema_id; sql_schema *sys = NULL; sql_table *user_info = NULL; sql_column *users_name = NULL; sql_column *users_schema = NULL; sql_table *schemas = NULL; sql_column *schemas_name = NULL; sql_column *schemas_id = NULL; sql_table *auths = NULL; sql_column *auths_id = NULL; sql_column *auths_name = NULL; void *p = 0; str username = NULL; str schema = NULL; sys = find_sql_schema(m->session->tr, "sys"); auths = find_sql_table(sys, "auths"); auths_id = find_sql_column(auths, "id"); auths_name = find_sql_column(auths, "name"); rid = table_funcs.column_find_row(m->session->tr, auths_id, &user, NULL); if (!is_oid_nil(rid)) username = table_funcs.column_find_value(m->session->tr, auths_name, rid); user_info = find_sql_table(sys, "db_user_info"); users_name = find_sql_column(user_info, "name"); users_schema = find_sql_column(user_info, "default_schema"); rid = table_funcs.column_find_row(m->session->tr, users_name, username, NULL); if (!is_oid_nil(rid)) p = table_funcs.column_find_value(m->session->tr, users_schema, rid); _DELETE(username); assert(p); schema_id = *(sqlid *) p; _DELETE(p); schemas = find_sql_table(sys, "schemas"); schemas_name = find_sql_column(schemas, "name"); schemas_id = find_sql_column(schemas, "id"); rid = table_funcs.column_find_row(m->session->tr, schemas_id, &schema_id, NULL); if (!is_oid_nil(rid)) schema = table_funcs.column_find_value(m->session->tr, schemas_name, rid); if(!stack_set_string(m, "current_schema", schema)) return NULL; return schema; }
static int sql_grantable_(mvc *m, int grantorid, int obj_id, int privs, int sub) { oid rid; sql_schema *sys = find_sql_schema(m->session->tr, "sys"); sql_table *prvs = find_sql_table(sys, "privileges"); sql_column *priv_obj = find_sql_column(prvs, "obj_id"); sql_column *priv_auth = find_sql_column(prvs, "auth_id"); sql_column *priv_priv = find_sql_column(prvs, "privileges"); sql_column *priv_allowed = find_sql_column(prvs, "grantable"); int priv; (void) sub; for (priv = 1; priv < privs; priv <<= 1) { if (!(priv & privs)) continue; rid = table_funcs.column_find_row(m->session->tr, priv_obj, &obj_id, priv_auth, &grantorid, priv_priv, &priv, NULL); if (rid != oid_nil) { void *p = table_funcs.column_find_value(m->session->tr, priv_allowed, rid); int allowed = *(int *)p; _DELETE(p); /* switch of priv bit */ if (allowed) privs = (privs & ~priv); } } if (privs != 0) return 0; return 1; }
static int monet5_drop_user(ptr _mvc, str user) { mvc *m = (mvc *) _mvc; oid rid; sql_schema *sys; sql_table *users; sql_column *users_name; str err; Client c = MCgetClient(m->clientid); err = AUTHremoveUser(c, user); if (err !=MAL_SUCCEED) { (void) sql_error(m, 02, "DROP USER: %s", getExceptionMessage(err)); _DELETE(err); return FALSE; } sys = find_sql_schema(m->session->tr, "sys"); users = find_sql_table(sys, "db_user_info"); users_name = find_sql_column(users, "name"); rid = table_funcs.column_find_row(m->session->tr, users_name, user, NULL); if (!is_oid_nil(rid)) table_funcs.table_delete(m->session->tr, users, rid); /* FIXME: We have to ignore this inconsistency here, because the * user was already removed from the system authorisation. Once * we have warnings, we could issue a warning about this * (seemingly) inconsistency between system and sql shadow * administration. */ return TRUE; }
int sql_trans_disconnect_catalog_ALL(sql_trans *tr) { sql_schema *s = find_sql_schema(tr, "sys"); sql_table *t = find_sql_table(s, "connections"); sql_trans_clear_table(tr, t); return 1; }
static int sql_create_role_id(mvc *m, unsigned int id, str auth, int grantor) { sql_schema *sys = find_sql_schema(m->session->tr, "sys"); sql_table *auths = find_sql_table(sys, "auths"); sql_column *auth_name = find_sql_column(auths, "name"); if (table_funcs.column_find_row(m->session->tr, auth_name, auth, NULL) != oid_nil) return FALSE; table_funcs.table_insert(m->session->tr, auths, &id, auth, &grantor); return TRUE; }
static void * monet5_schema_user_dependencies(ptr _trans, int schema_id) { rids *A, *U; sql_trans *tr = (sql_trans *) _trans; sql_schema *s = find_sql_schema(tr, "sys"); sql_table *auths = find_sql_table(s, "auths"); sql_column *auth_name = find_sql_column(auths, "name"); sql_table *users = find_sql_table(s, "db_user_info"); sql_column *users_name = find_sql_column(users, "name"); sql_column *users_sch = find_sql_column(users, "default_schema"); /* select users with given schema */ U = table_funcs.rids_select(tr, users_sch, &schema_id, &schema_id, NULL); /* select all authorization ids */ A = table_funcs.rids_select(tr, auth_name, NULL, NULL); /* join all authorization with the selected users */ A = table_funcs.rids_join(tr, A, auth_name, U, users_name); table_funcs.rids_destroy(U); return A; }
str sql_drop_role(mvc *m, str auth) { oid rid; sql_schema *sys = find_sql_schema(m->session->tr, "sys"); sql_table *auths = find_sql_table(sys, "auths"); sql_column *auth_name = find_sql_column(auths, "name"); rid = table_funcs.column_find_row(m->session->tr, auth_name, auth, NULL); if (rid == oid_nil) return sql_message("0P000!DROP ROLE: no such role '%s'", auth); table_funcs.table_delete(m->session->tr, auths, rid); return NULL; }
str sql_create_role(mvc *m, str auth, int grantor) { oid id; sql_schema *sys = find_sql_schema(m->session->tr, "sys"); sql_table *auths = find_sql_table(sys, "auths"); sql_column *auth_name = find_sql_column(auths, "name"); if (table_funcs.column_find_row(m->session->tr, auth_name, auth, NULL) != oid_nil) return sql_message("0P000!CREATE ROLE: role '%s' already exists", auth); id = store_next_oid(); table_funcs.table_insert(m->session->tr, auths, &id, auth, &grantor); return NULL; }
static str monet5_create_user(ptr _mvc, str user, str passwd, char enc, str fullname, sqlid schema_id, sqlid grantorid) { mvc *m = (mvc *) _mvc; oid uid = 0; bat bid = 0; str ret; sqlid user_id; str pwd; sql_schema *s = find_sql_schema(m->session->tr, "sys"); sql_table *db_user_info, *auths; Client c = MCgetClient(m->clientid); if (!enc) { pwd = mcrypt_BackendSum(passwd, strlen(passwd)); if (pwd == NULL) { BBPunfix(bid); throw(MAL, "sql.create_user", SQLSTATE(42000) "Crypt backend hash not found"); } } else { pwd = passwd; } /* add the user to the M5 authorisation administration */ ret = AUTHaddUser(&uid, c, user, pwd); if (!enc) free(pwd); if (ret != MAL_SUCCEED) return ret; user_id = store_next_oid(); db_user_info = find_sql_table(s, "db_user_info"); auths = find_sql_table(s, "auths"); table_funcs.table_insert(m->session->tr, db_user_info, user, fullname, &schema_id); table_funcs.table_insert(m->session->tr, auths, &user_id, user, &grantorid); return NULL; }
/*Function to create a connection*/ int sql_trans_connect_catalog(sql_trans *tr, const char *server, int port, const char *db, const char *db_alias, const char *user, const char *passwd, const char *lang) { int id = store_next_oid(), port_l = port; sql_schema *s = find_sql_schema(tr, "sys"); sql_table *t = find_sql_table(s, "connections"); sql_column *c_server = find_sql_column(t, "server"); sql_column *c_db = find_sql_column(t, "db"); sql_column *c_db_alias = find_sql_column(t, "db_alias"); if ((table_funcs.column_find_row(tr, c_server, server, c_db, db, NULL) == oid_nil) && (table_funcs.column_find_row(tr, c_db_alias, db_alias, NULL) == oid_nil)) { table_funcs.table_insert(tr, t, &id, server, &port_l, db, db_alias, user, passwd, lang); return id; } return 0; }
sql_table * tr_find_table( sql_trans *tr, sql_table *t) { sql_table *nt = NULL; while ((!nt || !nt->data) && tr) { sql_schema *s = tr_find_schema( tr, t->s); if (list_length(s->tables.set) < HASH_MIN_SIZE) nt = find_sql_table_id(s, t->base.id); else nt = find_sql_table(s, t->base.name); assert(nt->base.id == t->base.id); tr = tr->parent; } return nt; }
int sql_privilege(mvc *m, int auth_id, int obj_id, int priv, int sub) { oid rid; sql_schema *sys = find_sql_schema(m->session->tr, "sys"); sql_table *privs = find_sql_table(sys, "privileges"); sql_column *priv_obj = find_sql_column(privs, "obj_id"); sql_column *priv_auth = find_sql_column(privs, "auth_id"); sql_column *priv_priv = find_sql_column(privs, "privileges"); int res = 0; (void) sub; rid = table_funcs.column_find_row(m->session->tr, priv_obj, &obj_id, priv_auth, &auth_id, priv_priv, &priv, NULL); if (rid != oid_nil) { /* found priv */ res = priv; } return res; }
/*Function to drop the connection*/ int sql_trans_disconnect_catalog(sql_trans *tr, const char *db_alias) { oid rid = oid_nil; int id = 0; sql_schema *s = find_sql_schema(tr, "sys"); sql_table *t = find_sql_table(s, "connections"); sql_column *col_db_alias = find_sql_column(t, "db_alias"); sql_column *col_id = find_sql_column(t, "id"); rid = table_funcs.column_find_row(tr, col_db_alias, db_alias, NULL); if (rid != oid_nil) { id = *(int *) table_funcs.column_find_value(tr, col_id, rid); table_funcs.table_delete(tr, t, rid); } else { id = 0; } return id; }
int sql_find_auth_schema(mvc *m, str auth) { int res = -1; oid rid; sql_schema *sys = find_sql_schema(m->session->tr, "sys"); sql_table *users = find_sql_table(sys, "db_user_info"); sql_column *users_name = find_sql_column(users, "name"); rid = table_funcs.column_find_row(m->session->tr, users_name, auth, NULL); if (!is_oid_nil(rid)) { sql_column *users_schema = find_sql_column(users, "default_schema"); int *p = (int *) table_funcs.column_find_value(m->session->tr, users_schema, rid); if (p) { res = *p; _DELETE(p); } } return res; }
int sql_find_schema(mvc *m, str schema) { int schema_id = -1; oid rid; sql_schema *sys = find_sql_schema(m->session->tr, "sys"); sql_table *schemas = find_sql_table(sys, "schemas"); sql_column *schemas_name = find_sql_column(schemas, "name"); rid = table_funcs.column_find_row(m->session->tr, schemas_name, schema, NULL); if (rid != oid_nil) { sql_column *schemas_id = find_sql_column(schemas, "id"); int *p = (int *) table_funcs.column_find_value(m->session->tr, schemas_id, rid); if (p) { schema_id = *p; _DELETE(p); } } return schema_id; }
int sql_find_auth(mvc *m, str auth) { int res = -1; oid rid; sql_schema *sys = find_sql_schema(m->session->tr, "sys"); sql_table *auths = find_sql_table(sys, "auths"); sql_column *auths_name = find_sql_column(auths, "name"); rid = table_funcs.column_find_row(m->session->tr, auths_name, auth, NULL); if (rid != oid_nil) { sql_column *auths_id = find_sql_column(auths, "id"); int *p = (int *) table_funcs.column_find_value(m->session->tr, auths_id, rid); if (p) { res = *p; _DELETE(p); } } return res; }
sql_table * mvc_bind_table(mvc *m, sql_schema *s, const char *tname) { sql_table *t = NULL; if (!s) { /* Declared tables during query compilation have no schema */ sql_table *tpe = stack_find_table(m, tname); if (tpe) { t = tpe; } else { /* during exection they are in the declared table schema */ s = mvc_bind_schema(m, dt_schema); return mvc_bind_table(m, s, tname); } } else { t = find_sql_table(s, tname); } if (!t) return NULL; if (mvc_debug) fprintf(stderr, "#mvc_bind_table %s.%s\n", s ? s->base.name : "<noschema>", tname); return t; }
int sql_create_privileges(mvc *m, sql_schema *s) { int pub, p, zero = 0; sql_table *t, *privs; backend_create_privileges(m, s); t = mvc_create_table(m, s, "user_role", tt_table, 1, SQL_PERSIST, 0, -1); mvc_create_column_(m, t, "login_id", "int", 32); mvc_create_column_(m, t, "role_id", "int", 32); /* mvc_create_column_(m, t, "grantor", "int", 32); mvc_create_column_(m, t, "admin", "int", 32); */ /* all roles and users are in the auths table */ t = mvc_create_table(m, s, "auths", tt_table, 1, SQL_PERSIST, 0, -1); mvc_create_column_(m, t, "id", "int", 32); mvc_create_column_(m, t, "name", "varchar", 1024); mvc_create_column_(m, t, "grantor", "int", 32); t = mvc_create_table(m, s, "privileges", tt_table, 1, SQL_PERSIST, 0, -1); mvc_create_column_(m, t, "obj_id", "int", 32); mvc_create_column_(m, t, "auth_id", "int", 32); mvc_create_column_(m, t, "privileges", "int", 32); mvc_create_column_(m, t, "grantor", "int", 32); mvc_create_column_(m, t, "grantable", "int", 32); /* add sysadmin roles */ sql_create_role_id(m, ROLE_PUBLIC, "public", 0); sql_create_role_id(m, ROLE_SYSADMIN, "sysadmin", 0); sql_create_role_id(m, USER_MONETDB, "monetdb", 0); pub = ROLE_PUBLIC; p = PRIV_SELECT; privs = find_sql_table(s, "privileges"); t = find_sql_table(s, "schemas"); table_funcs.table_insert(m->session->tr, privs, &t->base.id, &pub, &p, &zero, &zero); t = find_sql_table(s, "types"); table_funcs.table_insert(m->session->tr, privs, &t->base.id, &pub, &p, &zero, &zero); t = find_sql_table(s, "functions"); table_funcs.table_insert(m->session->tr, privs, &t->base.id, &pub, &p, &zero, &zero); t = find_sql_table(s, "args"); table_funcs.table_insert(m->session->tr, privs, &t->base.id, &pub, &p, &zero, &zero); t = find_sql_table(s, "sequences"); table_funcs.table_insert(m->session->tr, privs, &t->base.id, &pub, &p, &zero, &zero); t = find_sql_table(s, "dependencies"); table_funcs.table_insert(m->session->tr, privs, &t->base.id, &pub, &p, &zero, &zero); t = find_sql_table(s, "connections"); table_funcs.table_insert(m->session->tr, privs, &t->base.id, &pub, &p, &zero, &zero); t = find_sql_table(s, "_tables"); table_funcs.table_insert(m->session->tr, privs, &t->base.id, &pub, &p, &zero, &zero); t = find_sql_table(s, "_columns"); table_funcs.table_insert(m->session->tr, privs, &t->base.id, &pub, &p, &zero, &zero); t = find_sql_table(s, "keys"); table_funcs.table_insert(m->session->tr, privs, &t->base.id, &pub, &p, &zero, &zero); t = find_sql_table(s, "idxs"); table_funcs.table_insert(m->session->tr, privs, &t->base.id, &pub, &p, &zero, &zero); t = find_sql_table(s, "triggers"); table_funcs.table_insert(m->session->tr, privs, &t->base.id, &pub, &p, &zero, &zero); t = find_sql_table(s, "objects"); table_funcs.table_insert(m->session->tr, privs, &t->base.id, &pub, &p, &zero, &zero); t = find_sql_table(s, "tables"); table_funcs.table_insert(m->session->tr, privs, &t->base.id, &pub, &p, &zero, &zero); t = find_sql_table(s, "columns"); table_funcs.table_insert(m->session->tr, privs, &t->base.id, &pub, &p, &zero, &zero); t = find_sql_table(s, "user_role"); table_funcs.table_insert(m->session->tr, privs, &t->base.id, &pub, &p, &zero, &zero); t = find_sql_table(s, "auths"); table_funcs.table_insert(m->session->tr, privs, &t->base.id, &pub, &p, &zero, &zero); t = find_sql_table(s, "privileges"); table_funcs.table_insert(m->session->tr, privs, &t->base.id, &pub, &p, &zero, &zero); /* owned by the users anyway s = mvc_bind_schema(m, "tmp"); t = find_sql_table(s, "profile"); table_funcs.table_insert(m->session->tr, privs, &t->base.id, &pub, &p, &zero, &zero); t = find_sql_table(s, "_tables"); table_funcs.table_insert(m->session->tr, privs, &t->base.id, &pub, &p, &zero, &zero); t = find_sql_table(s, "_columns"); table_funcs.table_insert(m->session->tr, privs, &t->base.id, &pub, &p, &zero, &zero); t = find_sql_table(s, "keys"); table_funcs.table_insert(m->session->tr, privs, &t->base.id, &pub, &p, &zero, &zero); t = find_sql_table(s, "idxs"); table_funcs.table_insert(m->session->tr, privs, &t->base.id, &pub, &p, &zero, &zero); t = find_sql_table(s, "triggers"); table_funcs.table_insert(m->session->tr, privs, &t->base.id, &pub, &p, &zero, &zero); t = find_sql_table(s, "objects"); table_funcs.table_insert(m->session->tr, privs, &t->base.id, &pub, &p, &zero, &zero); */ return 0; }
str monet5_user_set_def_schema(mvc *m, oid user) { oid rid; sqlid schema_id; sql_schema *sys = NULL; sql_table *user_info = NULL; sql_column *users_name = NULL; sql_column *users_schema = NULL; sql_table *schemas = NULL; sql_column *schemas_name = NULL; sql_column *schemas_id = NULL; sql_table *auths = NULL; sql_column *auths_name = NULL; void *p = 0; str schema = NULL; str username = NULL; if (m->debug &1) fprintf(stderr, "monet5_user_set_def_schema " OIDFMT "\n", user); mvc_trans(m); sys = find_sql_schema(m->session->tr, "sys"); user_info = find_sql_table(sys, "db_user_info"); users_name = find_sql_column(user_info, "name"); users_schema = find_sql_column(user_info, "default_schema"); rid = table_funcs.column_find_row(m->session->tr, users_name, username, NULL); if (!is_oid_nil(rid)) p = table_funcs.column_find_value(m->session->tr, users_schema, rid); assert(p); schema_id = *(sqlid *) p; _DELETE(p); schemas = find_sql_table(sys, "schemas"); schemas_name = find_sql_column(schemas, "name"); schemas_id = find_sql_column(schemas, "id"); auths = find_sql_table(sys, "auths"); auths_name = find_sql_column(auths, "name"); rid = table_funcs.column_find_row(m->session->tr, schemas_id, &schema_id, NULL); if (!is_oid_nil(rid)) schema = table_funcs.column_find_value(m->session->tr, schemas_name, rid); /* only set schema if user is found */ rid = table_funcs.column_find_row(m->session->tr, auths_name, username, NULL); if (!is_oid_nil(rid)) { sql_column *auths_id = find_sql_column(auths, "id"); int id; p = table_funcs.column_find_value(m->session->tr, auths_id, rid); id = *(int *) p; _DELETE(p); m->user_id = m->role_id = id; } else { schema = NULL; } if (!schema || !mvc_set_schema(m, schema)) { if (m->session->active) mvc_rollback(m, 0, NULL); return NULL; } /* reset the user and schema names */ if(!stack_set_string(m, "current_schema", schema) || !stack_set_string(m, "current_user", username) || !stack_set_string(m, "current_role", username)) { schema = NULL; } GDKfree(username); mvc_rollback(m, 0, NULL); return schema; }
int mvc_init(int debug, store_type store, backend_stack stk) { int first = 0; char *logdir = "sql_logs"; mvc_debug = debug; if (mvc_debug) fprintf(stderr, "#mvc_init logdir %s\n", logdir); keyword_init(); scanner_init_keywords(); if ((first = store_init(debug, store, logdir, stk)) < 0) { fprintf(stderr, "!mvc_init: unable to create system tables\n"); return -1; } if (first || catalog_version) { sql_schema *s; sql_table *t; mvc *m = mvc_create(0, stk, 0, NULL, NULL); /* disable caching */ m->caching = 0; /* disable history */ m->history = 0; /* disable size header */ m->sizeheader = 0; mvc_trans(m); s = m->session->schema = mvc_bind_schema(m, "sys"); assert(m->session->schema != NULL); if (catalog_version) { t = mvc_bind_table(m, s, "tables"); mvc_drop_table(m, s, t, 0); t = mvc_bind_table(m, s, "columns"); mvc_drop_table(m, s, t, 0); } t = mvc_create_view(m, s, "tables", SQL_PERSIST, "SELECT * FROM (SELECT p.*, 0 AS \"temporary\" FROM \"sys\".\"_tables\" AS p UNION ALL SELECT t.*, 1 AS \"temporary\" FROM \"tmp\".\"_tables\" AS t) AS tables where tables.type <> 2;", 1); mvc_create_column_(m, t, "id", "int", 32); mvc_create_column_(m, t, "name", "varchar", 1024); mvc_create_column_(m, t, "schema_id", "int", 32); mvc_create_column_(m, t, "query", "varchar", 2048); mvc_create_column_(m, t, "type", "smallint", 16); mvc_create_column_(m, t, "system", "boolean", 1); mvc_create_column_(m, t, "commit_action", "smallint", 16); mvc_create_column_(m, t, "readonly", "boolean", 1); mvc_create_column_(m, t, "temporary", "smallint", 16); if (catalog_version) { int pub = ROLE_PUBLIC; int p = PRIV_SELECT; int zero = 0; sql_table *privs = find_sql_table(s, "privileges"); table_funcs.table_insert(m->session->tr, privs, &t->base.id, &pub, &p, &zero, &zero); } t = mvc_create_view(m, s, "columns", SQL_PERSIST, "SELECT * FROM (SELECT p.* FROM \"sys\".\"_columns\" AS p UNION ALL SELECT t.* FROM \"tmp\".\"_columns\" AS t) AS columns;", 1); mvc_create_column_(m, t, "id", "int", 32); mvc_create_column_(m, t, "name", "varchar", 1024); mvc_create_column_(m, t, "type", "varchar", 1024); mvc_create_column_(m, t, "type_digits", "int", 32); mvc_create_column_(m, t, "type_scale", "int", 32); mvc_create_column_(m, t, "table_id", "int", 32); mvc_create_column_(m, t, "default", "varchar", 2048); mvc_create_column_(m, t, "null", "boolean", 1); mvc_create_column_(m, t, "number", "int", 32); /* TODO: the code below is out-of-date. Should be changed into the * following with the next major catalogue change: * mvc_create_column(m, t, "storage", "varchar", 2048); */ mvc_create_column_(m, t, "storage_type", "int", 32); if (catalog_version) { int pub = ROLE_PUBLIC; int p = PRIV_SELECT; int zero = 0; sql_table *privs = find_sql_table(s, "privileges"); table_funcs.table_insert(m->session->tr, privs, &t->base.id, &pub, &p, &zero, &zero); } if (!catalog_version) { sql_create_env(m, s); sql_create_privileges(m, s); } s = m->session->schema = mvc_bind_schema(m, "tmp"); assert(m->session->schema != NULL); if (mvc_commit(m, 0, NULL) < 0) { fprintf(stderr, "!mvc_init: unable to commit system tables\n"); return -1; } mvc_destroy(m); } return first; }
int mvc_init(int debug, store_type store, int ro, int su, backend_stack stk) { int first = 0; logger_settings *log_settings = (struct logger_settings *) GDKmalloc(sizeof(struct logger_settings)); /* Set the default WAL directory. "sql_logs" by default */ log_settings->logdir = "sql_logs"; /* Get and pass on the WAL directory location, if set */ if (GDKgetenv("gdk_logdir") != NULL) { log_settings->logdir = GDKgetenv("gdk_logdir"); } /* Get and pass on the shared WAL directory location, if set */ log_settings->shared_logdir = GDKgetenv("gdk_shared_logdir"); /* Get and pass on the shared WAL drift threshold, if set. * -1 by default, meaning it should be ignored, since it is not set */ log_settings->shared_drift_threshold = GDKgetenv_int("gdk_shared_drift_threshold", -1); /* Get and pass on the flag how many WAL files should be preserved. * 0 by default - keeps only the current WAL file. */ log_settings->keep_persisted_log_files = GDKgetenv_int("gdk_keep_persisted_log_files", 0); mvc_debug = debug&4; if (mvc_debug) { fprintf(stderr, "#mvc_init logdir %s\n", log_settings->logdir); fprintf(stderr, "#mvc_init keep_persisted_log_files %d\n", log_settings->keep_persisted_log_files); if (log_settings->shared_logdir != NULL) { fprintf(stderr, "#mvc_init shared_logdir %s\n", log_settings->shared_logdir); } fprintf(stderr, "#mvc_init shared_drift_threshold %d\n", log_settings->shared_drift_threshold); } keyword_init(); scanner_init_keywords(); if ((first = store_init(debug, store, ro, su, log_settings, stk)) < 0) { fprintf(stderr, "!mvc_init: unable to create system tables\n"); return -1; } if (first || catalog_version) { sql_schema *s; sql_table *t; mvc *m = mvc_create(0, stk, 0, NULL, NULL); m->sa = sa_create(); /* disable caching */ m->caching = 0; /* disable history */ m->history = 0; /* disable size header */ m->sizeheader = 0; mvc_trans(m); s = m->session->schema = mvc_bind_schema(m, "sys"); assert(m->session->schema != NULL); if (!first) { t = mvc_bind_table(m, s, "tables"); mvc_drop_table(m, s, t, 0); t = mvc_bind_table(m, s, "columns"); mvc_drop_table(m, s, t, 0); } t = mvc_create_view(m, s, "tables", SQL_PERSIST, "SELECT \"id\", \"name\", \"schema_id\", \"query\", CAST(CASE WHEN \"system\" THEN \"type\" + 10 /* system table/view */ ELSE (CASE WHEN \"commit_action\" = 0 THEN \"type\" /* table/view */ ELSE \"type\" + 20 /* global temp table */ END) END AS SMALLINT) AS \"type\", \"system\", \"commit_action\", \"access\", CASE WHEN (NOT \"system\" AND \"commit_action\" > 0) THEN 1 ELSE 0 END AS \"temporary\" FROM \"sys\".\"_tables\" WHERE \"type\" <> 2 UNION ALL SELECT \"id\", \"name\", \"schema_id\", \"query\", CAST(\"type\" + 30 /* local temp table */ AS SMALLINT) AS \"type\", \"system\", \"commit_action\", \"access\", 1 AS \"temporary\" FROM \"tmp\".\"_tables\";", 1); mvc_create_column_(m, t, "id", "int", 32); mvc_create_column_(m, t, "name", "varchar", 1024); mvc_create_column_(m, t, "schema_id", "int", 32); mvc_create_column_(m, t, "query", "varchar", 2048); mvc_create_column_(m, t, "type", "smallint", 16); mvc_create_column_(m, t, "system", "boolean", 1); mvc_create_column_(m, t, "commit_action", "smallint", 16); mvc_create_column_(m, t, "access", "smallint", 16); mvc_create_column_(m, t, "temporary", "smallint", 16); if (!first) { int pub = ROLE_PUBLIC; int p = PRIV_SELECT; int zero = 0; sql_table *privs = find_sql_table(s, "privileges"); table_funcs.table_insert(m->session->tr, privs, &t->base.id, &pub, &p, &zero, &zero); } t = mvc_create_view(m, s, "columns", SQL_PERSIST, "SELECT * FROM (SELECT p.* FROM \"sys\".\"_columns\" AS p UNION ALL SELECT t.* FROM \"tmp\".\"_columns\" AS t) AS columns;", 1); mvc_create_column_(m, t, "id", "int", 32); mvc_create_column_(m, t, "name", "varchar", 1024); mvc_create_column_(m, t, "type", "varchar", 1024); mvc_create_column_(m, t, "type_digits", "int", 32); mvc_create_column_(m, t, "type_scale", "int", 32); mvc_create_column_(m, t, "table_id", "int", 32); mvc_create_column_(m, t, "default", "varchar", 2048); mvc_create_column_(m, t, "null", "boolean", 1); mvc_create_column_(m, t, "number", "int", 32); mvc_create_column_(m, t, "storage", "varchar", 2048); if (!first) { int pub = ROLE_PUBLIC; int p = PRIV_SELECT; int zero = 0; sql_table *privs = find_sql_table(s, "privileges"); table_funcs.table_insert(m->session->tr, privs, &t->base.id, &pub, &p, &zero, &zero); } else { sql_create_env(m, s); sql_create_privileges(m, s); } s = m->session->schema = mvc_bind_schema(m, "tmp"); assert(m->session->schema != NULL); if (mvc_commit(m, 0, NULL) < 0) { fprintf(stderr, "!mvc_init: unable to commit system tables\n"); return -1; } mvc_destroy(m); } return first; }