Changeset: bc5651431a1f for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/bc5651431a1f Modified Files: sql/backends/monet5/sql.c sql/backends/monet5/sql_user.c sql/backends/monet5/vaults/fits/fits.c sql/server/rel_schema.c sql/server/rel_updates.c sql/server/sql_env.c sql/server/sql_mvc.c sql/server/sql_mvc.h sql/server/sql_privileges.c sql/storage/sql_storage.h sql/storage/store.c tools/monetdbe/monetdbe.c Branch: Jul2021 Log Message:
Finished storage calls cleanup with more testing. diffs (truncated from 950 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 @@ -340,11 +340,15 @@ create_table_or_view(mvc *sql, char *sna if (temp == SQL_DECLARED_TABLE && ol_length(t->keys)) throw(SQL, "sql.catalog", SQLSTATE(42000) "%s %s: '%s' cannot have constraints", action, obj, t->base.name); - nt = sql_trans_create_table(sql->session->tr, s, tname, t->query, t->type, t->system, temp, t->commit_action, - t->sz, t->properties); - if (!nt) - throw(SQL, "sql.catalog", SQLSTATE(42000) "%s %s: '%s' name conflicts", action, obj, t->base.name); - + switch (sql_trans_create_table(&nt, sql->session->tr, s, tname, t->query, t->type, t->system, temp, t->commit_action, t->sz, t->properties)) { + case -1: + throw(SQL, "sql.catalog", SQLSTATE(HY013) MAL_MALLOC_FAIL); + case -2: + case -3: + throw(SQL, "sql.catalog", SQLSTATE(42000) "%s %s: '%s' name conflicts", action, obj, t->base.name); + default: + break; + } osa = sql->sa; sql->sa = sql->ta; /* first check default values */ @@ -558,8 +562,8 @@ str create_table_from_emit(Client cntxt, char *sname, char *tname, sql_emit_col *columns, size_t ncols) { size_t i; - sql_table *t; - sql_schema *s; + sql_table *t = NULL; + sql_schema *s = NULL; mvc *sql = NULL; str msg = MAL_SUCCEED; @@ -574,8 +578,15 @@ create_table_from_emit(Client cntxt, cha throw(SQL, "sql.catalog", SQLSTATE(3F000) "CREATE TABLE: no such schema '%s'", sname); if (!mvc_schema_privs(sql, s)) throw(SQL, "sql.catalog", SQLSTATE(42000) "CREATE TABLE: Access denied for %s to schema '%s'", get_string_global_var(sql, "current_user"), s->base.name); - if (!(t = mvc_create_table(sql, s, tname, tt_table, 0, SQL_DECLARED_TABLE, CA_COMMIT, -1, 0))) - throw(SQL, "sql.catalog", SQLSTATE(3F000) "CREATE TABLE: could not create table '%s'", tname); + switch (mvc_create_table(&t, sql, s, tname, tt_table, 0, SQL_DECLARED_TABLE, CA_COMMIT, -1, 0)) { + case -1: + throw(SQL, "sql.catalog", SQLSTATE(HY013) MAL_MALLOC_FAIL); + case -2: + case -3: + throw(SQL, "sql.catalog", SQLSTATE(42000) "CREATE TABLE: transaction conflict detected"); + default: + break; + } for (i = 0; i < ncols; i++) { BAT *b = columns[i].b; @@ -594,8 +605,15 @@ create_table_from_emit(Client cntxt, cha if (columns[i].name && columns[i].name[0] == '%') throw(SQL, "sql.catalog", SQLSTATE(42000) "CREATE TABLE: generated labels not allowed in column names, use an alias instead"); - if (!(col = mvc_create_column(sql, t, columns[i].name, &tpe))) - throw(SQL, "sql.catalog", SQLSTATE(3F000) "CREATE TABLE: could not create column %s", columns[i].name); + switch (mvc_create_column(&col, sql, t, columns[i].name, &tpe)) { + case -1: + throw(SQL, "sql.catalog", SQLSTATE(HY013) MAL_MALLOC_FAIL); + case -2: + case -3: + throw(SQL, "sql.catalog", SQLSTATE(42000) "CREATE TABLE: transaction conflict detected"); + default: + break; + } } if ((msg = create_table_or_view(sql, sname, t->base.name, t, 0, 0)) != MAL_SUCCEED) return msg; 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 @@ -275,18 +275,19 @@ static void monet5_create_privileges(ptr _mvc, sql_schema *s) { sql_schema *sys; - sql_table *t, *uinfo; + sql_table *t = NULL, *uinfo = NULL; + sql_column *col = NULL; mvc *m = (mvc *) _mvc; sqlid schema_id = 0; list *res, *ops; - sql_func *f; + sql_func *f = NULL; /* create the authorisation related tables */ - t = mvc_create_table(m, s, "db_user_info", tt_table, 1, SQL_PERSIST, 0, -1, 0); - mvc_create_column_(m, t, "name", "varchar", 1024); - mvc_create_column_(m, t, "fullname", "varchar", 2048); - mvc_create_column_(m, t, "default_schema", "int", 9); - mvc_create_column_(m, t, "schema_path", "clob", 0); + mvc_create_table(&t, m, s, "db_user_info", tt_table, 1, SQL_PERSIST, 0, -1, 0); + mvc_create_column_(&col, m, t, "name", "varchar", 1024); + mvc_create_column_(&col, m, t, "fullname", "varchar", 2048); + mvc_create_column_(&col, m, t, "default_schema", "int", 9); + mvc_create_column_(&col, m, t, "schema_path", "clob", 0); uinfo = t; res = sa_list(m->sa); @@ -309,10 +310,10 @@ monet5_create_privileges(ptr _mvc, sql_s return ; } - mvc_create_column_(m, t, "name", "varchar", 2048); - mvc_create_column_(m, t, "fullname", "varchar", 2048); - mvc_create_column_(m, t, "default_schema", "int", 9); - mvc_create_column_(m, t, "schema_path", "clob", 0); + mvc_create_column_(&col, m, t, "name", "varchar", 2048); + mvc_create_column_(&col, m, t, "fullname", "varchar", 2048); + mvc_create_column_(&col, m, t, "default_schema", "int", 9); + mvc_create_column_(&col, m, t, "schema_path", "clob", 0); sys = find_sql_schema(m->session->tr, "sys"); schema_id = sys->base.id; diff --git a/sql/backends/monet5/vaults/fits/fits.c b/sql/backends/monet5/vaults/fits/fits.c --- a/sql/backends/monet5/vaults/fits/fits.c +++ b/sql/backends/monet5/vaults/fits/fits.c @@ -38,48 +38,49 @@ FITSinitCatalog(mvc *m) { sql_schema *sch; sql_table *fits_tp, *fits_fl, *fits_tbl, *fits_col; + sql_column *col = NULL; sch = mvc_bind_schema(m, "sys"); fits_fl = mvc_bind_table(m, sch, "fits_files"); if (fits_fl == NULL) { - fits_fl = mvc_create_table(m, sch, "fits_files", tt_table, 0, SQL_PERSIST, 0, 2, 0); - mvc_create_column_(m, fits_fl, "id", "int", 32); - mvc_create_column_(m, fits_fl, "name", "varchar", 80); + mvc_create_table(&fits_fl, m, sch, "fits_files", tt_table, 0, SQL_PERSIST, 0, 2, 0); + mvc_create_column_(&col, m, fits_fl, "id", "int", 32); + mvc_create_column_(&col, m, fits_fl, "name", "varchar", 80); } fits_tbl = mvc_bind_table(m, sch, "fits_tables"); if (fits_tbl == NULL) { - fits_tbl = mvc_create_table(m, sch, "fits_tables", tt_table, 0, SQL_PERSIST, 0, 8, 0); - mvc_create_column_(m, fits_tbl, "id", "int", 32); - mvc_create_column_(m, fits_tbl, "name", "varchar", 80); - mvc_create_column_(m, fits_tbl, "columns", "int", 32); - mvc_create_column_(m, fits_tbl, "file_id", "int", 32); - mvc_create_column_(m, fits_tbl, "hdu", "int", 32); - mvc_create_column_(m, fits_tbl, "date", "varchar", 80); - mvc_create_column_(m, fits_tbl, "origin", "varchar", 80); - mvc_create_column_(m, fits_tbl, "comment", "varchar", 80); + mvc_create_table(&fits_tbl, m, sch, "fits_tables", tt_table, 0, SQL_PERSIST, 0, 8, 0); + mvc_create_column_(&col, m, fits_tbl, "id", "int", 32); + mvc_create_column_(&col, m, fits_tbl, "name", "varchar", 80); + mvc_create_column_(&col, m, fits_tbl, "columns", "int", 32); + mvc_create_column_(&col, m, fits_tbl, "file_id", "int", 32); + mvc_create_column_(&col, m, fits_tbl, "hdu", "int", 32); + mvc_create_column_(&col, m, fits_tbl, "date", "varchar", 80); + mvc_create_column_(&col, m, fits_tbl, "origin", "varchar", 80); + mvc_create_column_(&col, m, fits_tbl, "comment", "varchar", 80); } fits_col = mvc_bind_table(m, sch, "fits_columns"); if (fits_col == NULL) { - fits_col = mvc_create_table(m, sch, "fits_columns", tt_table, 0, SQL_PERSIST, 0, 6, 0); - mvc_create_column_(m, fits_col, "id", "int", 32); - mvc_create_column_(m, fits_col, "name", "varchar", 80); - mvc_create_column_(m, fits_col, "type", "varchar", 80); - mvc_create_column_(m, fits_col, "units", "varchar", 80); - mvc_create_column_(m, fits_col, "number", "int", 32); - mvc_create_column_(m, fits_col, "table_id", "int", 32); + mvc_create_table(&fits_col, m, sch, "fits_columns", tt_table, 0, SQL_PERSIST, 0, 6, 0); + mvc_create_column_(&col, m, fits_col, "id", "int", 32); + mvc_create_column_(&col, m, fits_col, "name", "varchar", 80); + mvc_create_column_(&col, m, fits_col, "type", "varchar", 80); + mvc_create_column_(&col, m, fits_col, "units", "varchar", 80); + mvc_create_column_(&col, m, fits_col, "number", "int", 32); + mvc_create_column_(&col, m, fits_col, "table_id", "int", 32); } fits_tp = mvc_bind_table(m, sch, "fits_table_properties"); if (fits_tp == NULL) { - fits_tp = mvc_create_table(m, sch, "fits_table_properties", tt_table, 0, SQL_PERSIST, 0, 5, 0); - mvc_create_column_(m, fits_tp, "table_id", "int", 32); - mvc_create_column_(m, fits_tp, "xtension", "varchar", 80); - mvc_create_column_(m, fits_tp, "bitpix", "int", 32); - mvc_create_column_(m, fits_tp, "stilvers", "varchar", 80); - mvc_create_column_(m, fits_tp, "stilclas", "varchar", 80); + mvc_create_table(&fits_tp, m, sch, "fits_table_properties", tt_table, 0, SQL_PERSIST, 0, 5, 0); + mvc_create_column_(&col, m, fits_tp, "table_id", "int", 32); + mvc_create_column_(&col, m, fits_tp, "xtension", "varchar", 80); + mvc_create_column_(&col, m, fits_tp, "bitpix", "int", 32); + mvc_create_column_(&col, m, fits_tp, "stilvers", "varchar", 80); + mvc_create_column_(&col, m, fits_tp, "stilclas", "varchar", 80); } } @@ -980,7 +981,7 @@ str FITSloadTable(Client cntxt, MalBlkPt /* col = mvc_bind_column(m, fits_tbl, "columns"); cnum = *(int*) store->table_api.column_find_value(m->session->tr, col, rid); */ fits_get_num_cols(fptr, &cnum, &status); - tbl = mvc_create_table(m, sch, tname, tt_table, 0, SQL_PERSIST, 0, cnum, 0); + mvc_create_table(&tbl, m, sch, tname, tt_table, 0, SQL_PERSIST, 0, cnum, 0); // TODO: Check that the allocations succeeded tpcode = (int *)GDKzalloc(sizeof(int) * cnum); @@ -989,6 +990,7 @@ str FITSloadTable(Client cntxt, MalBlkPt cname = (char **)GDKzalloc(sizeof(char *) * cnum); for (j = 1; j <= cnum; j++) { + sql_column *col = NULL; /* fits_get_acolparms(fptr, j, cname, &tbcol, tunit, tform, &tscal, &tzero, tnull, tdisp, &status); */ snprintf(keywrd, 80, "TTYPE%d", j); fits_read_key(fptr, TSTRING, keywrd, nm, NULL, &status); @@ -1002,7 +1004,7 @@ str FITSloadTable(Client cntxt, MalBlkPt TRC_DEBUG(FITS, "%d %ld %ld - M: %s\n", tpcode[j-1], rep[j-1], wid[j-1], tpe.type->base.name); - mvc_create_column(m, tbl, cname[j - 1], &tpe); + mvc_create_column(&col, m, tbl, cname[j - 1], &tpe); } /* data load */ 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 @@ -144,6 +144,7 @@ as_subquery(mvc *sql, sql_table *t, tabl char *cname = n->data.sval; sql_exp *e = m->data; sql_subtype *tp = exp_subtype(e); + sql_column *col = NULL; if (tt != tt_view && cname && cname[0] == '%') { sql_error(sql, 01, SQLSTATE(42000) "%s: generated labels not allowed in column names, use an alias instead", msg); @@ -152,7 +153,17 @@ as_subquery(mvc *sql, sql_table *t, tabl sql_error(sql, 01, SQLSTATE(42S21) "%s: duplicate column name %s", msg, cname); return -1; } - mvc_create_column(sql, t, cname, tp); + switch (mvc_create_column(&col, sql, t, cname, tp)) { + case -1: + sql_error(sql, 01, SQLSTATE(HY013) MAL_MALLOC_FAIL); + return -1; + case -2: + case -3: + sql_error(sql, 01, SQLSTATE(42000) "%s: transaction conflict detected", msg); + return -1; + default: + break; + } } if (n || m) { sql_error(sql, 01, SQLSTATE(21S02) "%s: number of columns does not match", msg); @@ -165,6 +176,7 @@ as_subquery(mvc *sql, sql_table *t, tabl sql_exp *e = m->data; const char *cname = exp_name(e); sql_subtype *tp = exp_subtype(e); + sql_column *col = NULL; if (tt != tt_view && cname && cname[0] == '%') { sql_error(sql, 01, SQLSTATE(42000) "%s: generated labels not allowed in column names, use an alias instead", msg); @@ -176,7 +188,17 @@ as_subquery(mvc *sql, sql_table *t, tabl sql_error(sql, 01, SQLSTATE(42S21) "%s: duplicate column name %s", msg, cname); return -1; } - mvc_create_column(sql, t, cname, tp); + switch (mvc_create_column(&col, sql, t, cname, tp)) { + case -1: + sql_error(sql, 01, SQLSTATE(HY013) MAL_MALLOC_FAIL); + return -1; + case -2: + case -3: + sql_error(sql, 01, SQLSTATE(42000) "%s: transaction conflict detected", msg); + return -1; + default: + break; + } } } return 0; @@ -185,11 +207,24 @@ as_subquery(mvc *sql, sql_table *t, tabl sql_table * mvc_create_table_as_subquery(mvc *sql, sql_rel *sq, sql_schema *s, const char *tname, dlist *column_spec, int temp, int commit_action, const char *action) { + sql_table *t = NULL; table_types tt =(temp == SQL_REMOTE)?tt_remote: (temp == SQL_MERGE_TABLE)?tt_merge_table: (temp == SQL_REPLICA_TABLE)?tt_replica_table:tt_table; - sql_table *t = mvc_create_table(sql, s, tname, tt, 0, SQL_DECLARED_TABLE, commit_action, -1, 0); + switch (mvc_create_table(&t, sql, s, tname, tt, 0, SQL_DECLARED_TABLE, commit_action, -1, 0)) { + case -1: + return sql_error(sql, 02, SQLSTATE(HY013) MAL_MALLOC_FAIL); + case -2: + case -3: + return sql_error(sql, 02, SQLSTATE(42000) "%s TABLE: transaction conflict detected", action); + case -4: + return sql_error(sql, 02, SQLSTATE(42000) "%s TABLE: the partition's expression is too long", action); + case -5: + return NULL; + default: + break; + } _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list