Changeset: 1cad4a5b5921 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=1cad4a5b5921
Modified Files:
sql/backends/monet5/sql.c
Branch: Jul2015
Log Message:
Improve on changeset 61ccf71c082f.
Do an extra semijoin so that BATreplace only gets to update values
that actually exist.
This should fix bug 3848.
diffs (75 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
@@ -2409,30 +2409,59 @@ DELTAproject(bat *result, const bat *sub
if (BATcount(u_val)) {
BAT *o, *nu_id, *nu_val;
+ /* create subsets of u_id and u_val where the tail
+ * values of u_id are also in s, and where those tail
+ * values occur as head value in res */
if (BATsubsemijoin(&o, &nu_id, u_id, s, NULL, NULL, 0,
BUN_NONE) != GDK_SUCCEED) {
+ BBPunfix(s->batCacheid);
+ BBPunfix(res->batCacheid);
BBPunfix(u_id->batCacheid);
- BBPunfix(res->batCacheid);
- BBPunfix(s->batCacheid);
+ BBPunfix(u_val->batCacheid);
throw(MAL, "sql.delta", RUNTIME_OBJECT_MISSING);
}
BBPunfix(nu_id->batCacheid);
nu_id = BATproject(o, u_id);
nu_val = BATproject(o, u_val);
+ BBPunfix(u_id->batCacheid);
+ BBPunfix(u_val->batCacheid);
BBPunfix(o->batCacheid);
- if (nu_id == NULL || nu_val == NULL) {
- BBPunfix(u_id->batCacheid);
+ tres = VIEWcombine(res);
+ if (nu_id == NULL ||
+ nu_val == NULL ||
+ tres == NULL ||
+ BATsubsemijoin(&o, &u_id, nu_id, tres, NULL, NULL, 0,
BUN_NONE) != GDK_SUCCEED) {
+ BBPunfix(s->batCacheid);
BBPunfix(res->batCacheid);
- BBPunfix(s->batCacheid);
- if (nu_id)
- BBPunfix(nu_id->batCacheid);
- if (nu_val)
- BBPunfix(nu_val->batCacheid);
- throw(MAL, "sql.delta", RUNTIME_OBJECT_MISSING);
+ BBPreclaim(nu_id);
+ BBPreclaim(nu_val);
+ BBPreclaim(tres);
+ throw(MAL, "sql.delta", MAL_MALLOC_FAIL);
}
- res = setwritable(res);
- BATreplace(res, nu_id, nu_val, 0);
+ BBPunfix(u_id->batCacheid);
+ BBPunfix(tres->batCacheid);
+ u_id = BATproject(o, nu_id);
+ u_val = BATproject(o, nu_val);
BBPunfix(nu_id->batCacheid);
BBPunfix(nu_val->batCacheid);
+ BBPunfix(o->batCacheid);
+ if (u_id == NULL || u_val == NULL) {
+ BBPunfix(s->batCacheid);
+ BBPunfix(res->batCacheid);
+ BBPreclaim(u_id);
+ BBPreclaim(u_val);
+ throw(MAL, "sql.delta", MAL_MALLOC_FAIL);
+ }
+ /* now update res with the subset of u_id and u_val we
+ * calculated */
+ if ((res = setwritable(res)) == NULL ||
+ BATreplace(res, u_id, u_val, 0) != GDK_SUCCEED) {
+ if (res)
+ BBPunfix(res->batCacheid);
+ BBPunfix(s->batCacheid);
+ BBPunfix(u_id->batCacheid);
+ BBPunfix(u_val->batCacheid);
+ throw(MAL, "sql.delta", MAL_MALLOC_FAIL);
+ }
}
BBPunfix(s->batCacheid);
BBPunfix(u_id->batCacheid);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list