Changeset: 7d3d34a7686b for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/7d3d34a7686b Modified Files: sql/backends/monet5/sql.c sql/backends/monet5/sql_cat.c sql/backends/monet5/sql_upgrades.c sql/backends/monet5/sql_user.c sql/server/rel_psm.c sql/server/rel_schema.c sql/server/sql_env.c sql/server/sql_mvc.c sql/server/sql_mvc.h sql/storage/sql_storage.h sql/storage/store.c Branch: Jul2021 Log Message:
Check results from storage calls for debugging purposes. I ran the TestWeb multiple times. diffs (truncated from 2321 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 @@ -416,7 +416,7 @@ create_table_or_view(mvc *sql, char *sna } } check = sql_trans_set_partition_table(sql->session->tr, nt); - if (check == -1) { + if (check == -4) { sql->sa = osa; throw(SQL, "sql.catalog", SQLSTATE(42000) "CREATE TABLE: %s_%s: the partition's expression is too long", s->base.name, t->base.name); } else if (check) { 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 @@ -555,41 +555,46 @@ create_trigger(mvc *sql, char *sname, ch break; } } - if ((tri = mvc_create_trigger(sql, t, triggername, time, orientation, event, old_name, new_name, condition, query))) { - char *buf; - sql_rel *r = NULL; - sql_allocator *sa = sql->sa; + switch (mvc_create_trigger(&tri, sql, t, triggername, time, orientation, event, old_name, new_name, condition, query)) { + case -1: + throw(SQL,"sql.create_trigger", SQLSTATE(HY013) MAL_MALLOC_FAIL); + case -2: + case -3: + throw(SQL,"sql.create_trigger", SQLSTATE(42000) "%s: transaction conflict detected", base); + default: { + char *buf; + sql_rel *r = NULL; + sql_allocator *sa = sql->sa; - if (!(sql->sa = sa_create(sql->pa))) { - sql->sa = sa; - throw(SQL, "sql.create_trigger", SQLSTATE(HY013) MAL_MALLOC_FAIL); - } - if (!(buf = sa_strdup(sql->sa, query))) { - sa_destroy(sql->sa); - sql->sa = sa; - throw(SQL, "sql.create_trigger", SQLSTATE(HY013) MAL_MALLOC_FAIL); - } - r = rel_parse(sql, s, buf, m_deps); - if (r) - r = sql_processrelation(sql, r, 0, 0); - if (r) { - list *blist = rel_dependencies(sql, r); - if (mvc_create_dependencies(sql, blist, tri->base.id, TRIGGER_DEPENDENCY)) { + if (!(sql->sa = sa_create(sql->pa))) { + sql->sa = sa; + throw(SQL, "sql.create_trigger", SQLSTATE(HY013) MAL_MALLOC_FAIL); + } + if (!(buf = sa_strdup(sql->sa, query))) { sa_destroy(sql->sa); sql->sa = sa; throw(SQL, "sql.create_trigger", SQLSTATE(HY013) MAL_MALLOC_FAIL); } + r = rel_parse(sql, s, buf, m_deps); + if (r) + r = sql_processrelation(sql, r, 0, 0); + if (r) { + list *blist = rel_dependencies(sql, r); + if (mvc_create_dependencies(sql, blist, tri->base.id, TRIGGER_DEPENDENCY)) { + sa_destroy(sql->sa); + sql->sa = sa; + throw(SQL, "sql.create_trigger", SQLSTATE(HY013) MAL_MALLOC_FAIL); + } + } + sa_destroy(sql->sa); + sql->sa = sa; + if (!r) { + if (strlen(sql->errstr) > 6 && sql->errstr[5] == '!') + throw(SQL, "sql.create_trigger", "%s", sql->errstr); + else + throw(SQL, "sql.create_trigger", SQLSTATE(42000) "%s", sql->errstr); + } } - sa_destroy(sql->sa); - sql->sa = sa; - if (!r) { - if (strlen(sql->errstr) > 6 && sql->errstr[5] == '!') - throw(SQL, "sql.create_trigger", "%s", sql->errstr); - else - throw(SQL, "sql.create_trigger", SQLSTATE(42000) "%s", sql->errstr); - } - } else { - throw(SQL,"sql.create_trigger", SQLSTATE(42000) "%s: transaction conflict detected", base); } return MAL_SUCCEED; } @@ -955,7 +960,7 @@ create_func(mvc *sql, char *sname, char sql_func *nf; sql_subfunc *sf; sql_schema *s = NULL; - int clientid = sql->clientid, res = 0; + int clientid = sql->clientid; char *F = NULL, *fn = NULL, *base = replace ? "CREATE OR REPLACE" : "CREATE"; FUNC_TYPE_STR(f->type, F, fn) @@ -1008,7 +1013,7 @@ create_func(mvc *sql, char *sname, char if (mvc_check_dependency(sql, sff->base.id, !IS_PROC(sff) ? FUNC_DEPENDENCY : PROC_DEPENDENCY, NULL)) throw(SQL,"sql.create_func", SQLSTATE(42000) "%s %s: there are database objects dependent on %s %s;", base, F, fn, sff->base.name); - switch ((res = mvc_drop_func(sql, s, sff, 0))) { + switch (mvc_drop_func(sql, s, sff, 0)) { case -1: throw(SQL,"sql.create_func", SQLSTATE(HY013) MAL_MALLOC_FAIL); case -2: @@ -1023,8 +1028,15 @@ create_func(mvc *sql, char *sname, char } } - if (!(nf = mvc_create_func(sql, NULL, s, f->base.name, f->ops, f->res, f->type, f->lang, f->mod, f->imp, f->query, f->varres, f->vararg, f->system))) - throw(SQL,"sql.create_func", SQLSTATE(42000) "%s %s: transaction conflict detected", base, F); + switch (mvc_create_func(&nf, sql, NULL, s, f->base.name, f->ops, f->res, f->type, f->lang, f->mod, f->imp, f->query, f->varres, f->vararg, f->system)) { + case -1: + throw(SQL,"sql.create_func", SQLSTATE(HY013) MAL_MALLOC_FAIL); + case -2: + case -3: + throw(SQL,"sql.create_func", SQLSTATE(42000) "%s %s: transaction conflict detected", base, F); + default: + break; + } switch (nf->lang) { case FUNC_LANG_INT: case FUNC_LANG_MAL: /* shouldn't be reachable, but leave it here */ 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 @@ -3508,12 +3508,15 @@ SQLupgrades(Client c, mvc *m) sqlstore *store = m->session->tr->store; if (f && sql_privilege(m, ROLE_PUBLIC, f->func->base.id, PRIV_EXECUTE) != PRIV_EXECUTE) { sql_table *privs = find_sql_table(m->session->tr, s, "privileges"); - int pub = ROLE_PUBLIC, p = PRIV_EXECUTE, zero = 0; + int pub = ROLE_PUBLIC, p = PRIV_EXECUTE, zero = 0, res; - store->table_api.table_insert(m->session->tr, privs, &f->func->base.id, &pub, &p, &zero, &zero); + if ((res = store->table_api.table_insert(m->session->tr, privs, &f->func->base.id, &pub, &p, &zero, &zero)) != LOG_OK) { + TRC_CRITICAL(SQL_PARSER, "Privilege creation during upgrade failed\n"); + GDKfree(prev_schema); + return -1; + } } - if (sql_bind_func(m, s->base.name, "dependencies_schemas_on_users", NULL, NULL, F_UNION) && sql_bind_func(m, s->base.name, "dependencies_owners_on_schemas", NULL, NULL, F_UNION) && sql_bind_func(m, s->base.name, "dependencies_tables_on_views", NULL, NULL, F_UNION) diff --git a/sql/backends/monet5/sql_user.c b/sql/backends/monet5/sql_user.c --- a/sql/backends/monet5/sql_user.c +++ b/sql/backends/monet5/sql_user.c @@ -279,6 +279,7 @@ monet5_create_privileges(ptr _mvc, sql_s mvc *m = (mvc *) _mvc; sqlid schema_id = 0; list *res, *ops; + sql_func *f; /* create the authorisation related tables */ t = mvc_create_table(m, s, "db_user_info", tt_table, 1, SQL_PERSIST, 0, -1, 0); @@ -295,7 +296,7 @@ monet5_create_privileges(ptr _mvc, sql_s ops = sa_list(m->sa); /* following funcion returns a table (single column) of user names with the approriate scenario (sql) */ - mvc_create_func(m, NULL, s, "db_users", ops, res, F_UNION, FUNC_LANG_SQL, "sql", "db_users", "CREATE FUNCTION db_users () RETURNS TABLE( name varchar(2048)) EXTERNAL NAME sql.db_users;", FALSE, FALSE, TRUE); + mvc_create_func(&f, m, NULL, s, "db_users", ops, res, F_UNION, FUNC_LANG_SQL, "sql", "db_users", "CREATE FUNCTION db_users () RETURNS TABLE( name varchar(2048)) EXTERNAL NAME sql.db_users;", FALSE, FALSE, TRUE); t = mvc_init_create_view(m, s, "users", "create view sys.users as select u.\"name\" as \"name\", " diff --git a/sql/server/rel_psm.c b/sql/server/rel_psm.c --- a/sql/server/rel_psm.c +++ b/sql/server/rel_psm.c @@ -940,7 +940,15 @@ rel_create_func(sql_query *query, dlist sql->params = NULL; if (create) { - f = mvc_create_func(sql, sql->sa, s, fname, l, restype, type, lang, mod, fname, lang_body, (type == F_LOADER)?TRUE:FALSE, vararg, FALSE); + switch (mvc_create_func(&f, sql, sql->sa, s, fname, l, restype, type, lang, mod, fname, lang_body, (type == F_LOADER)?TRUE:FALSE, vararg, FALSE)) { + case -1: + return sql_error(sql, 01, SQLSTATE(HY013) MAL_MALLOC_FAIL); + case -2: + case -3: + return sql_error(sql, 01, SQLSTATE(42000) "CREATE %s: transaction conflict detected", F); + default: + break; + } } else if (!sf) { return sql_error(sql, 01, SQLSTATE(42000) "CREATE %s: %s function %s.%s not bound", F, slang, s->base.name, fname); } @@ -951,7 +959,16 @@ rel_create_func(sql_query *query, dlist if (create) { /* needed for recursive functions */ q = query_cleaned(sql->ta, q); - sql->forward = f = mvc_create_func(sql, sql->sa, s, fname, l, restype, type, lang, sql_shared_module_name, q, q, FALSE, vararg, FALSE); + switch (mvc_create_func(&f, sql, sql->sa, s, fname, l, restype, type, lang, sql_shared_module_name, q, q, FALSE, vararg, FALSE)) { + case -1: + return sql_error(sql, 01, SQLSTATE(HY013) MAL_MALLOC_FAIL); + case -2: + case -3: + return sql_error(sql, 01, SQLSTATE(42000) "CREATE %s: transaction conflict detected", F); + default: + break; + } + sql->forward = f; } else if (!sf) { return sql_error(sql, 01, SQLSTATE(42000) "CREATE %s: SQL function %s.%s not bound", F, s->base.name, fname); } @@ -981,7 +998,15 @@ rel_create_func(sql_query *query, dlist sql->params = NULL; if (create) { q = query_cleaned(sql->ta, q); - f = mvc_create_func(sql, sql->sa, s, fname, l, restype, type, lang, fmod, fnme, q, FALSE, vararg, FALSE); + switch (mvc_create_func(&f, sql, sql->sa, s, fname, l, restype, type, lang, fmod, fnme, q, FALSE, vararg, FALSE)) { + case -1: + return sql_error(sql, 01, SQLSTATE(HY013) MAL_MALLOC_FAIL); + case -2: + case -3: + return sql_error(sql, 01, SQLSTATE(42000) "CREATE %s: transaction conflict detected", F); + default: + break; + } } else if (!sf) { return sql_error(sql, 01, SQLSTATE(42000) "CREATE %s: external name %s.%s not bound (%s.%s)", F, fmod, fnme, s->base.name, fname ); } else { 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 @@ -324,15 +324,38 @@ column_constraint_type(mvc *sql, const c (void) sql_error(sql, 02, SQLSTATE(42000) "CONSTRAINT %s: key %s already exists", (kt == pkey) ? "PRIMARY KEY" : "UNIQUE", name); return res; } - if (!(k = (sql_key*)mvc_create_ukey(sql, t, name, kt))) { - (void) sql_error(sql, 02, SQLSTATE(42000) "CONSTRAINT %s: transaction conflict detected", (kt == pkey) ? "PRIMARY KEY" : "UNIQUE"); - return res; + switch (mvc_create_ukey(&k, sql, t, name, kt)) { + case -1: + (void) sql_error(sql, 02, SQLSTATE(HY013) MAL_MALLOC_FAIL); + return res; + case -2: + case -3: + (void) sql_error(sql, 02, SQLSTATE(42000) "CONSTRAINT %s: transaction conflict detected", (kt == pkey) ? "PRIMARY KEY" : "UNIQUE"); + return res; + default: + break; } - - mvc_create_kc(sql, k, cs); - if (!mvc_create_ukey_done(sql, k)) { - (void) sql_error(sql, 02, SQLSTATE(42000) "CONSTRAINT %s: transaction conflict detected", (kt == pkey) ? "PRIMARY KEY" : "UNIQUE"); - return res; + switch (mvc_create_kc(sql, k, cs)) { + case -1: + (void) sql_error(sql, 02, SQLSTATE(HY013) MAL_MALLOC_FAIL); + return res; + case -2: + case -3: + (void) sql_error(sql, 02, SQLSTATE(42000) "CONSTRAINT %s: transaction conflict detected", (kt == pkey) ? "PRIMARY KEY" : "UNIQUE"); + return res; + default: + break; + } + switch (mvc_create_ukey_done(sql, k)) { + case -1: + (void) sql_error(sql, 02, SQLSTATE(HY013) MAL_MALLOC_FAIL); + return res; + case -2: + case -3: + (void) sql_error(sql, 02, SQLSTATE(42000) "CONSTRAINT %s: transaction conflict detected", (kt == pkey) ? "PRIMARY KEY" : "UNIQUE"); + return res; + default: + break; } res = SQL_OK; } break; @@ -387,11 +410,28 @@ column_constraint_type(mvc *sql, const c cs->base.name, tp1, rk->type == pkey ? "PRIMARY" : "UNIQUE", tp2); return res; } - if (!(fk = mvc_create_fkey(sql, t, name, fkey, rk, ref_actions & 255, (ref_actions>>8) & 255))) { - (void) sql_error(sql, 02, SQLSTATE(42000) "CONSTRAINT FOREIGN KEY: transaction conflict detected"); - return res; + switch (mvc_create_fkey(&fk, sql, t, name, fkey, rk, ref_actions & 255, (ref_actions>>8) & 255)) { + case -1: + (void) sql_error(sql, 02, SQLSTATE(HY013) MAL_MALLOC_FAIL); + return res; + case -2: + case -3: + (void) sql_error(sql, 02, SQLSTATE(42000) "CONSTRAINT FOREIGN KEY: transaction conflict detected"); + return res; + default: + break; } - mvc_create_fkc(sql, fk, cs); + switch (mvc_create_fkc(sql, fk, cs)) { + case -1: + (void) sql_error(sql, 02, SQLSTATE(HY013) MAL_MALLOC_FAIL); + return res; + case -2: + case -3: + (void) sql_error(sql, 02, SQLSTATE(42000) "CONSTRAINT FOREIGN KEY: transaction conflict detected"); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list