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

Reply via email to