Changeset: 459de6d89e6a for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/459de6d89e6a
Modified Files:
sql/backends/monet5/sql.c
sql/storage/bat/bat_storage.c
sql/storage/bat/bat_table.c
sql/storage/sql_storage.h
Branch: Jan2022
Log Message:
graft a6b49786e839 from default: Fix locked access to update BAT pair.
diffs (truncated from 588 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
@@ -1199,15 +1199,16 @@ str
mvc_bind_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
{
int upd = (pci->argc == 7 || pci->argc == 9);
- BAT *b = NULL, *bn;
+ BAT *b = NULL;
bat *bid = getArgReference_bat(stk, pci, 0);
- int coltype = getBatType(getArgType(mb, pci, 0));
mvc *m = NULL;
str msg;
- const char *sname = *getArgReference_str(stk, pci, 2 + upd);
- const char *tname = *getArgReference_str(stk, pci, 3 + upd);
- const char *cname = *getArgReference_str(stk, pci, 4 + upd);
- int access = *getArgReference_int(stk, pci, 5 + upd);
+ const char *sname = *getArgReference_str(stk, pci, 2 + upd);
+ const char *tname = *getArgReference_str(stk, pci, 3 + upd);
+ const char *cname = *getArgReference_str(stk, pci, 4 + upd);
+ const int access = *getArgReference_int(stk, pci, 5 + upd);
+
+ const bool partitioned_access = pci->argc == (8 + upd) &&
getArgType(mb, pci, 6 + upd) == TYPE_int;
/* This doesn't work with quick access for now... */
assert(access != QUICK);
@@ -1222,99 +1223,67 @@ mvc_bind_wrap(Client cntxt, MalBlkPtr mb
throw(SQL, "sql.bind", SQLSTATE(42000) "%s '%s' is not
persistent",
TABLE_TYPE_DESCRIPTION(t->type, t->properties),
t->base.name);
sql_column *c = mvc_bind_column(m, t, cname);
- b = mvc_bind(m, sname, tname, cname, access);
- if (b && b->ttype && b->ttype != coltype) {
- BBPunfix(b->batCacheid);
- throw(SQL,"sql.bind",SQLSTATE(42000) "Column type mismatch
%s.%s.%s",sname,tname,cname);
- }
- if (b) {
- if (pci->argc == (8 + upd) && getArgType(mb, pci, 6 + upd) ==
TYPE_int) {
- BUN cnt = store->storage_api.count_col(m->session->tr,
c, 0), psz;
- /* partitioned access */
- int part_nr = *getArgReference_int(stk, pci, 6 + upd);
- int nr_parts = *getArgReference_int(stk, pci, 7 + upd);
-
- if (access == 0) {
- BUN l, h;
- psz = cnt ? (cnt / nr_parts) : 0;
- l = part_nr * psz;
- if (l > cnt)
- l = cnt;
- h = (part_nr + 1 == nr_parts) ? cnt : ((part_nr
+ 1) * psz);
- if (h > cnt)
- h = cnt;
- bn = BATslice(b, l, h);
- if(bn == NULL) {
- BBPunfix(b->batCacheid);
- throw(SQL, "sql.bind", GDK_EXCEPTION);
- }
- BAThseqbase(bn, l);
- } else {
- /* BAT b holds the UPD_ID bat */
- oid l, h;
- cnt =
store->storage_api.count_col(m->session->tr, c, 0);
- psz = cnt ? (cnt / nr_parts) : 0;
- l = part_nr * psz;
- if (l > cnt)
- l = cnt;
- h = (part_nr + 1 == nr_parts) ? cnt : ((part_nr
+ 1) * psz);
- if (h > cnt)
- h = cnt;
- h--;
- bn = BATselect(b, NULL, &l, &h, true, true,
false);
- if(bn == NULL) {
- BBPunfix(b->batCacheid);
- throw(SQL, "sql.bind", GDK_EXCEPTION);
- }
+
+ if (partitioned_access) {
+ /* partitioned access */
+ int part_nr = *getArgReference_int(stk, pci, 6 + upd);
+ int nr_parts = *getArgReference_int(stk, pci, 7 + upd);
+ BUN cnt = store->storage_api.count_col(m->session->tr, c, 0),
psz;
+ oid l, h;
+ psz = cnt ? (cnt / nr_parts) : 0;
+ l = part_nr * psz;
+ if (l > cnt)
+ l = cnt;
+ h = (part_nr + 1 == nr_parts) ? cnt : ((part_nr + 1) * psz);
+ if (h > cnt)
+ h = cnt;
+
+ if (upd) {
+ BAT *ui = NULL, *uv = NULL;
+ if (store->storage_api.bind_updates(m->session->tr, c,
&ui, &uv) == LOG_ERR)
+ throw(SQL,"sql.bind",SQLSTATE(HY005) "Cannot
access the update columns");
+
+ h--;
+ BAT* bn = BATselect(ui, NULL, &l, &h, true, true,
false);
+ if(bn == NULL) {
+ BBPunfix(ui->batCacheid);
+ BBPunfix(uv->batCacheid);
+ throw(SQL, "sql.bind", GDK_EXCEPTION);
}
- BBPunfix(b->batCacheid);
- b = bn;
- } else if (upd) {
- BAT *uv = mvc_bind(m, sname, tname, cname, RD_UPD_VAL);
+
bat *uvl = getArgReference_bat(stk, pci, 1);
- if (uv == NULL) {
- BBPunfix(b->batCacheid);
- throw(SQL,"sql.bind",SQLSTATE(HY005) "Cannot
access the update column %s.%s.%s",
- sname,tname,cname);
- }
- BBPkeepref(*bid = b->batCacheid);
- BBPkeepref(*uvl = uv->batCacheid);
- return MAL_SUCCEED;
- }
- if (upd) {
- bat *uvl = getArgReference_bat(stk, pci, 1);
-
- if (BATcount(b)) {
- BAT *uv = mvc_bind(m, sname, tname, cname,
RD_UPD_VAL);
- BAT *ui = mvc_bind(m, sname, tname, cname,
RD_UPD_ID);
+ if (BATcount(bn)) {
BAT *id;
BAT *vl;
if (ui == NULL || uv == NULL) {
bat_destroy(uv);
bat_destroy(ui);
- BBPunfix(b->batCacheid);
+ BBPunfix(bn->batCacheid);
throw(SQL,"sql.bind",SQLSTATE(HY005)
"Cannot access the insert column %s.%s.%s",
sname, tname, cname);
}
- id = BATproject(b, ui);
- vl = BATproject(b, uv);
+ assert(uv->batCount == ui->batCount);
+ id = BATproject(bn, ui);
+ vl = BATproject(bn, uv);
bat_destroy(ui);
bat_destroy(uv);
if (id == NULL || vl == NULL) {
- BBPunfix(b->batCacheid);
+ BBPunfix(bn->batCacheid);
bat_destroy(id);
bat_destroy(vl);
throw(SQL, "sql.bind", GDK_EXCEPTION);
}
if ( BATcount(id) != BATcount(vl)){
- BBPunfix(b->batCacheid);
+ BBPunfix(bn->batCacheid);
bat_destroy(id);
bat_destroy(vl);
throw(SQL, "sql.bind", SQLSTATE(0000)
"Inconsistent BAT count");
}
- BBPkeepref(*bid = id->batCacheid);
- BBPkeepref(*uvl = vl->batCacheid);
+ BBPkeepref(id->batCacheid);
+ BBPkeepref(vl->batCacheid);
+ *bid = id->batCacheid;
+ *uvl = vl->batCacheid;
} else {
*bid = e_bat(TYPE_oid);
*uvl = e_bat(c->type.type->localtype);
@@ -1327,15 +1296,49 @@ mvc_bind_wrap(Client cntxt, MalBlkPtr mb
throw(SQL, "sql.bind", SQLSTATE(HY013)
MAL_MALLOC_FAIL);
}
}
+ } else {
+ int coltype = getBatType(getArgType(mb, pci, 0));
+ b = store->storage_api.bind_col(m->session->tr, c,
access);
+
+ if (b && b->ttype && b->ttype != coltype) {
+ BBPunfix(b->batCacheid);
+ throw(SQL,"sql.bind",SQLSTATE(42000) "Column
type mismatch %s.%s.%s",sname,tname,cname);
+ }
+
+ BAT* bn = BATslice(b, l, h);
+ if(bn == NULL) {
+ BBPunfix(b->batCacheid);
+ throw(SQL, "sql.bind", GDK_EXCEPTION);
+ }
+ BAThseqbase(bn, l);
BBPunfix(b->batCacheid);
- } else {
- BBPkeepref(*bid = b->batCacheid);
+ BBPkeepref(bn->batCacheid);
+ *bid = bn->batCacheid;
}
- return MAL_SUCCEED;
- }
- if (!strNil(sname))
- throw(SQL, "sql.bind", SQLSTATE(42000) "unable to find
%s.%s(%s)", sname, tname, cname);
- throw(SQL, "sql.bind", SQLSTATE(42000) "unable to find %s(%s)", tname,
cname);
+ }
+ else if (upd) { /*unpartitioned access to update bats*/
+ BAT *ui = NULL, *uv = NULL;
+ if (store->storage_api.bind_updates(m->session->tr, c, &ui,
&uv) == LOG_ERR)
+ throw(SQL,"sql.bind",SQLSTATE(HY005) "Cannot access the
update columns");
+
+ bat *uvl = getArgReference_bat(stk, pci, 1);
+ BBPkeepref(ui->batCacheid);
+ BBPkeepref(uv->batCacheid);
+ *bid = ui->batCacheid;
+ *uvl = uv->batCacheid;
+ }
+ else { /*unpartitioned access to base column*/
+ int coltype = getBatType(getArgType(mb, pci, 0));
+ b = store->storage_api.bind_col(m->session->tr, c, access);
+
+ if (b && b->ttype && b->ttype != coltype) {
+ BBPunfix(b->batCacheid);
+ throw(SQL,"sql.bind",SQLSTATE(42000) "Column type
mismatch %s.%s.%s",sname,tname,cname);
+ }
+ BBPkeepref(b->batCacheid);
+ *bid = b->batCacheid;
+ }
+ return MAL_SUCCEED;
}
/* The output of this function are 7 columns:
@@ -1539,16 +1542,19 @@ str
mvc_bind_idxbat_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
{
int upd = (pci->argc == 7 || pci->argc == 9);
- BAT *b = NULL, *bn;
+ BAT *b = NULL;
bat *bid = getArgReference_bat(stk, pci, 0);
- int coltype = getBatType(getArgType(mb, pci, 0));
mvc *m = NULL;
str msg;
- const char *sname = *getArgReference_str(stk, pci, 2 + upd);
- const char *tname = *getArgReference_str(stk, pci, 3 + upd);
- const char *iname = *getArgReference_str(stk, pci, 4 + upd);
- int access = *getArgReference_int(stk, pci, 5 + upd);
-
+ const char *sname = *getArgReference_str(stk, pci, 2 + upd);
+ const char *tname = *getArgReference_str(stk, pci, 3 + upd);
+ const char *iname = *getArgReference_str(stk, pci, 4 + upd);
+ const int access = *getArgReference_int(stk, pci, 5 + upd);
+
+ const bool partitioned_access = pci->argc == (8 + upd) &&
getArgType(mb, pci, 6 + upd) == TYPE_int;
+
+ /* This doesn't work with quick access for now... */
+ assert(access != QUICK);
if ((msg = getSQLContext(cntxt, mb, &m, NULL)) != NULL)
return msg;
if ((msg = checkSQLContext(cntxt)) != NULL)
@@ -1557,98 +1563,69 @@ mvc_bind_idxbat_wrap(Client cntxt, MalBl
sql_schema *s = mvc_bind_schema(m, sname);
sql_table *t = mvc_bind_table(m, s, tname);
if (t && !isTable(t))
- throw(SQL, "sql.tid", SQLSTATE(42000) "%s '%s' is not
persistent",
+ throw(SQL, "sql.bindidx", SQLSTATE(42000) "%s '%s' is not
persistent",
TABLE_TYPE_DESCRIPTION(t->type, t->properties),
t->base.name);
sql_idx *i = mvc_bind_idx(m, s, iname);
- b = mvc_bind_idxbat(m, sname, tname, iname, access);
- if (b && b->ttype && b->ttype != coltype) {
- BBPunfix(b->batCacheid);
- throw(SQL,"sql.bind",SQLSTATE(42000) "Index column type
mismatch %s.%s.%s",sname,tname,iname);
- }
- if (b) {
- if (pci->argc == (8 + upd) && getArgType(mb, pci, 6 + upd) ==
TYPE_int) {
- BUN cnt = store->storage_api.count_idx(m->session->tr,
i, 0), psz;
- /* partitioned access */
- int part_nr = *getArgReference_int(stk, pci, 6 + upd);
- int nr_parts = *getArgReference_int(stk, pci, 7 + upd);
-
- if (access == 0) {
- BUN l, h;
- psz = cnt ? (cnt / nr_parts) : 0;
- l = part_nr * psz;
- if (l > cnt)
- l = cnt;
- h = (part_nr + 1 == nr_parts) ? cnt : ((part_nr
+ 1) * psz);
- if (h > cnt)
- h = cnt;
- bn = BATslice(b, l, h);
- if(bn == NULL){
- BBPunfix(b->batCacheid);
- throw(SQL, "sql.bindidx",
GDK_EXCEPTION);
- }
- BAThseqbase(bn, l);
- } else {
- /* BAT b holds the UPD_ID bat */
- oid l, h;
- cnt =
store->storage_api.count_idx(m->session->tr, i, 0);
- psz = cnt ? (cnt / nr_parts) : 0;
- l = part_nr * psz;
- if (l > cnt)
- l = cnt;
- h = (part_nr + 1 == nr_parts) ? cnt : ((part_nr
+ 1) * psz);
- if (h > cnt)
- h = cnt;
- h--;
- bn = BATselect(b, NULL, &l, &h, true, true,
false);
- if(bn == NULL) {
- BBPunfix(b->batCacheid);
- throw(SQL, "sql.bindidx",
GDK_EXCEPTION);
- }
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]