Changeset: cff68e94fa4d for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/cff68e94fa4d Modified Files: sql/backends/monet5/dict.c sql/backends/monet5/for.c Branch: default Log Message:
Set property only when call succeeded. Throw storage errors diffs (148 lines): diff --git a/sql/backends/monet5/dict.c b/sql/backends/monet5/dict.c --- a/sql/backends/monet5/dict.c +++ b/sql/backends/monet5/dict.c @@ -87,9 +87,9 @@ static str DICTcompress_intern(BAT **O, BAT **U, BAT *b, bool ordered, bool persists, bool smallest_type) { /* for now use all rows */ - BAT *u = BATunique(b, NULL); + BAT *u = BATunique(b, NULL), *uu = NULL; if (!u) - throw(SQL, "dict.compress", SQLSTATE(HY013) MAL_MALLOC_FAIL); + throw(SQL, "dict.compress", GDK_EXCEPTION); assert(u->tkey); BUN cnt = BATcount(u); @@ -104,33 +104,34 @@ DICTcompress_intern(BAT **O, BAT **U, BA throw(SQL, "dict.compress", SQLSTATE(3F000) "dict compress: too many values"); } BAT *uv = BATproject(u, b); /* get values */ - uv->tkey = true; bat_destroy(u); if (!uv) - throw(SQL, "dict.compress", SQLSTATE(HY013) MAL_MALLOC_FAIL); - BAT *uu = NULL; + throw(SQL, "dict.compress", GDK_EXCEPTION); + uv->tkey = true; + if (ordered) { - if (BATsort(&uu, NULL, NULL, uv, NULL, NULL, false, false, false) != GDK_SUCCEED) { - bat_destroy(uv); - throw(SQL, "dict.compress", SQLSTATE(HY013) MAL_MALLOC_FAIL); - } + if (BATsort(&uu, NULL, NULL, uv, NULL, NULL, false, false, false) != GDK_SUCCEED) { bat_destroy(uv); - uv = uu; + throw(SQL, "dict.compress", GDK_EXCEPTION); + } + bat_destroy(uv); + uv = uu; } u = uv; if (persists) { uu = COLcopy(uv, uv->ttype, true, PERSISTENT); bat_destroy(uv); + if (!uu) + throw(SQL, "dict.compress", GDK_EXCEPTION); assert(uu->tkey); - if (!uu) - throw(SQL, "dict.compress", SQLSTATE(HY013) MAL_MALLOC_FAIL); u = uu; } BAT *o = COLnew(b->hseqbase, tt, BATcount(b), persists?PERSISTENT:TRANSIENT); if (!o || BAThash(u) != GDK_SUCCEED) { + bat_destroy(o); bat_destroy(u); - throw(SQL, "dict.compress", SQLSTATE(HY013) MAL_MALLOC_FAIL); + throw(SQL, "dict.compress", GDK_EXCEPTION); } BUN p, q; @@ -246,10 +247,31 @@ DICTcompress_col(Client cntxt, MalBlkPtr msg = DICTcompress_intern(&o, &u, b, ordered, true, true); bat_destroy(b); if (msg == MAL_SUCCEED) { - if (sql_trans_alter_storage(tr, c, "DICT") != LOG_OK || (c=get_newcolumn(tr, c)) == NULL || store->storage_api.col_compress(tr, c, ST_DICT, o, u) != LOG_OK) { - bat_destroy(u); - bat_destroy(o); - throw(SQL, "dict.compress", SQLSTATE(HY013) "alter_storage failed"); + switch (sql_trans_alter_storage(tr, c, "DICT")) { + case -1: + msg = createException(SQL, "dict.compress", SQLSTATE(HY013) MAL_MALLOC_FAIL); + break; + case -2: + case -3: + msg = createException(SQL, "dict.compress", SQLSTATE(42000) "transaction conflict detected"); + break; + default: + break; + } + if (msg == MAL_SUCCEED && !(c = get_newcolumn(tr, c))) + msg = createException(SQL, "dict.compress", SQLSTATE(HY013) "alter_storage failed"); + if (msg == MAL_SUCCEED) { + switch (store->storage_api.col_compress(tr, c, ST_DICT, o, u)) { + case -1: + msg = createException(SQL, "dict.compress", SQLSTATE(HY013) MAL_MALLOC_FAIL); + break; + case -2: + case -3: + msg = createException(SQL, "dict.compress", SQLSTATE(42000) "transaction conflict detected"); + break; + default: + break; + } } bat_destroy(u); bat_destroy(o); diff --git a/sql/backends/monet5/for.c b/sql/backends/monet5/for.c --- a/sql/backends/monet5/for.c +++ b/sql/backends/monet5/for.c @@ -131,9 +131,9 @@ FORcompress_intern(char **comp_min_val, snprintf(buf, 64, "FOR-" LLFMT, min_val); } else if (b->ttype == TYPE_int) { throw(SQL, "for.compress", SQLSTATE(3F000) "for compress: implement type int"); + } else { + throw(SQL, "for.compress", SQLSTATE(3F000) "for compress: type not yet implemented"); } - if (!o) - throw(SQL, "for.compress", SQLSTATE(HY013) MAL_MALLOC_FAIL); if (!(*comp_min_val = GDKstrdup(buf))) { bat_destroy(o); throw(SQL, "for.compress", SQLSTATE(HY013) MAL_MALLOC_FAIL); @@ -194,10 +194,31 @@ FORcompress_col(Client cntxt, MalBlkPtr msg = FORcompress_intern(&comp_min_val, &o, b); bat_destroy(b); if (msg == MAL_SUCCEED) { - if (sql_trans_alter_storage(tr, c, comp_min_val) != LOG_OK || (c=get_newcolumn(tr, c)) == NULL || store->storage_api.col_compress(tr, c, ST_FOR, o, NULL) != LOG_OK) { - GDKfree(comp_min_val); - bat_destroy(o); - throw(SQL, "for.compress", SQLSTATE(HY013) "alter_storage failed"); + switch (sql_trans_alter_storage(tr, c, comp_min_val)) { + case -1: + msg = createException(SQL, "for.compress", SQLSTATE(HY013) MAL_MALLOC_FAIL); + break; + case -2: + case -3: + msg = createException(SQL, "for.compress", SQLSTATE(42000) "transaction conflict detected"); + break; + default: + break; + } + if (msg == MAL_SUCCEED && !(c = get_newcolumn(tr, c))) + msg = createException(SQL, "for.compress", SQLSTATE(HY013) "alter_storage failed"); + if (msg == MAL_SUCCEED) { + switch (store->storage_api.col_compress(tr, c, ST_FOR, o, NULL)) { + case -1: + msg = createException(SQL, "for.compress", SQLSTATE(HY013) MAL_MALLOC_FAIL); + break; + case -2: + case -3: + msg = createException(SQL, "for.compress", SQLSTATE(42000) "transaction conflict detected"); + break; + default: + break; + } } GDKfree(comp_min_val); bat_destroy(o); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list