Changeset: 99210299e6fb for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=99210299e6fb
Modified Files:
        monetdb5/modules/kernel/algebra.c
        sql/backends/monet5/sql.c
        sql/storage/bat/bat_storage.c
        sql/storage/store.c
Branch: unlock
Log Message:

handle more msk cases and small fixes


diffs (218 lines):

diff --git a/monetdb5/modules/kernel/algebra.c 
b/monetdb5/modules/kernel/algebra.c
--- a/monetdb5/modules/kernel/algebra.c
+++ b/monetdb5/modules/kernel/algebra.c
@@ -960,6 +960,9 @@ ALGcountCND_nil(lng *result, const bat *
                BBPunfix(b->batCacheid);
                throw(MAL, "aggr.count", SQLSTATE(HY002) 
RUNTIME_OBJECT_MISSING);
        }
+       if (b->ttype == TYPE_msk) {
+               BATsum(result, TYPE_lng, b, s, *ignore_nils, false, false);
+       } else
        if (*ignore_nils) {
                *result = (lng) BATcount_no_nil(b, s);
        } else {
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
@@ -2251,62 +2251,51 @@ SQLtid(Client cntxt, MalBlkPtr mb, MalSt
                BAT *d = store_funcs.bind_del(tr, t, RDONLY), *bn;
 
                bn = BATslice(d, sb, sb+nr);
-               if(bn == NULL)
-                       throw(SQL, "sql.tid", SQLSTATE(HY013) MAL_MALLOC_FAIL);
-               BAThseqbase(bn, sb);
-               *res = bn->batCacheid;
-#if 0
-               BAT *del_ids = COLnew(0, TYPE_oid, dcnt, TRANSIENT);
-
-               if (d == NULL || del_ids == NULL) {
-                       BBPunfix(tids->batCacheid);
-                       if (d)
-                               BBPunfix(d->batCacheid);
-                       if (del_ids)
-                               BBPreclaim(del_ids);
-                       throw(SQL,"sql.tid", SQLSTATE(45002) "Can not bind 
delete column");
-               }
-
-               if (store_funcs.count_del(tr, t, 2) > 0) {
-                       BAT *nd = COLcopy(d, d->ttype, true, TRANSIENT);
+               BBPunfix(d->batCacheid);
+               if (bn && store_funcs.count_del(tr, t, 2) > 0) {
                        BAT *ui = store_funcs.bind_del(tr, t, RD_UPD_ID);
                        BAT *uv = store_funcs.bind_del(tr, t, RD_UPD_VAL);
-
-                       BBPunfix(d->batCacheid);
-                       if (!nd || !ui || !uv || BATreplace(nd, ui, uv, true) 
!= GDK_SUCCEED) {
-                               if (nd) BBPunfix(nd->batCacheid);
-                               if (ui) BBPunfix(ui->batCacheid);
-                               if (uv) BBPunfix(uv->batCacheid);
-                               BBPreclaim(del_ids);
+                       oid h = sb+nr;
+
+                       h--;
+                       BAT *p = BATselect(ui, NULL, &sb, &h, true, true, 
false);
+                       BAT *nui = NULL, *nuv = NULL;
+
+                       if (p) {
+                               nui = BATproject(p, ui);
+                               nuv = BATproject(p, uv);
+                               BBPunfix(p->batCacheid);
+                       }
+                       if (ui) BBPunfix(ui->batCacheid);
+                       if (uv) BBPunfix(uv->batCacheid);
+
+               if (!nui || !nuv || BATreplace(bn, nui, nuv, true) != 
GDK_SUCCEED) {
+                               if (bn) BBPunfix(bn->batCacheid);
+                               if (nui) BBPunfix(nui->batCacheid);
+                               if (nuv) BBPunfix(nuv->batCacheid);
                                throw(MAL, "sql.tids", SQLSTATE(45003) 
"TIDdeletes failed");
                        }
-                       BBPunfix(ui->batCacheid);
-                       BBPunfix(uv->batCacheid);
-                       d = nd;
+                       BBPunfix(nui->batCacheid);
+                       BBPunfix(nuv->batCacheid);
                }
-               for(BUN p = sb; p < sb+nr; p++) {
-                       if (mskGetVal(d,p)) {
-                               oid id = p;
-                               if (BUNappend(del_ids, &id, false) != 
GDK_SUCCEED) {
-                                       BBPreclaim(del_ids);
-                                       BBPunfix(d->batCacheid);
-                                       BBPunfix(tids->batCacheid);
-                                       throw(MAL, "sql.tids", SQLSTATE(45003) 
"TIDdeletes failed");
-                               }
-                       }
-               }
-               BBPunfix(d->batCacheid);
-               gdk_return ret = BATnegcands(tids, del_ids);
-               BBPunfix(del_ids->batCacheid);
-               if (ret != GDK_SUCCEED)
-                       throw(MAL, "sql.tids", SQLSTATE(45003) "TIDdeletes 
failed");
-#endif
+               d = NULL;
+               /* true == deleted, need not deleted  */
+               if (bn && BATcount(bn))
+                       d = BATcalcnot(bn, NULL);
+               else if (bn)
+                       d = bn;
+               if(d == NULL)
+                       throw(SQL, "sql.tid", SQLSTATE(HY013) MAL_MALLOC_FAIL);
+               if (bn && bn != d)
+                       BBPunfix(bn->batCacheid);
+               BAThseqbase(d, sb);
+               *res = d->batCacheid;
        } else {
-       /* create void,void bat with length and oid's set */
-       tids = BATdense(sb, sb, (BUN) nr);
-       if (tids == NULL)
-               throw(SQL, "sql.tid", SQLSTATE(HY013) MAL_MALLOC_FAIL);
-       *res = tids->batCacheid;
+               /* create void,void bat with length and oid's set */
+               tids = BATdense(sb, sb, (BUN) nr);
+               if (tids == NULL)
+                       throw(SQL, "sql.tid", SQLSTATE(HY013) MAL_MALLOC_FAIL);
+               *res = tids->batCacheid;
        }
 
        BBPkeepref(*res);
diff --git a/sql/storage/bat/bat_storage.c b/sql/storage/bat/bat_storage.c
--- a/sql/storage/bat/bat_storage.c
+++ b/sql/storage/bat/bat_storage.c
@@ -573,7 +573,7 @@ update_idx(sql_trans *tr, sql_idx * i, v
 static int
 delta_append_bat( sql_delta *bat, size_t offset, BAT *i, sql_table *t )
 {
-       BAT *b;
+       BAT *b, *oi = i;
 
        (void)t;
        if (!BATcount(i))
@@ -582,9 +582,14 @@ delta_append_bat( sql_delta *bat, size_t
        if (b == NULL)
                return LOG_ERR;
 
-       if (BATcount(b) >= offset+BATcount(i)){
-               BAT *ui = BATdense(0, offset, BATcount(i));
-               if (BATreplace(b, ui, i, true) != GDK_SUCCEED) {
+       if (i && i->ttype == TYPE_msk) {
+               oi = msk2oid(i, -1);
+       }
+       if (BATcount(b) >= offset+BATcount(oi)){
+               BAT *ui = BATdense(0, offset, BATcount(oi));
+               if (BATreplace(b, ui, oi, true) != GDK_SUCCEED) {
+                       if (oi != i)
+                               bat_destroy(oi);
                        bat_destroy(b);
                        bat_destroy(ui);
                        return LOG_ERR;
@@ -594,29 +599,37 @@ delta_append_bat( sql_delta *bat, size_t
                //assert (isNew(t) || isTempTable(t) || bat->cs.cleared);
                if (BATcount(b) < offset) { /* add space */
                        const void *tv = ATOMnilptr(b->ttype);
-                       lng i, d = offset - BATcount(b);
-                       for(i=0;i<d;i++) {
+                       lng d = offset - BATcount(b);
+                       for(lng j=0;j<d;j++) {
                                if (BUNappend(b, tv, true) != GDK_SUCCEED) {
+                                       if (oi != i)
+                                               bat_destroy(oi);
                                        bat_destroy(b);
                                        return LOG_ERR;
                                }
                        }
                }
-               if (isVIEW(i) && b->batCacheid == VIEWtparent(i)) {
-                        BAT *ic = COLcopy(i, i->ttype, true, TRANSIENT);
+               if (isVIEW(oi) && b->batCacheid == VIEWtparent(oi)) {
+            BAT *ic = COLcopy(oi, oi->ttype, true, TRANSIENT);
 
                        if (ic == NULL || BATappend(b, ic, NULL, true) != 
GDK_SUCCEED) {
-                                if(ic)
-                                        bat_destroy(ic);
-                                bat_destroy(b);
-                                return LOG_ERR;
-                        }
-                        bat_destroy(ic);
-               } else if (BATappend(b, i, NULL, true) != GDK_SUCCEED) {
+                               if (oi != i)
+                                       bat_destroy(oi);
+                if(ic)
+                                       bat_destroy(ic);
+                bat_destroy(b);
+                return LOG_ERR;
+            }
+            bat_destroy(ic);
+               } else if (BATappend(b, oi, NULL, true) != GDK_SUCCEED) {
+                       if (oi != i)
+                               bat_destroy(oi);
                        bat_destroy(b);
                        return LOG_ERR;
                }
        }
+       if (oi != i)
+               bat_destroy(oi);
        bat_destroy(b);
        return LOG_OK;
 }
@@ -821,6 +834,7 @@ delta_delete_bat( storage *bat, BAT *i, 
        BAT *t = BATconstant(i->hseqbase, TYPE_msk, &T, BATcount(i), TRANSIENT);
        int ok = LOG_OK;
 
+       assert(i->ttype != TYPE_msk);
        if (t) {
                ok = cs_update_bat( &bat->cs, i, t, is_new);
        }
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -1191,8 +1191,7 @@ sql_trans_update_schema(sql_trans *tr, o
        TRC_DEBUG(SQL_STORE, "Update schema: %s %d\n", s->base.name, 
s->base.id);
 
        v = table_funcs.column_find_value(tr, find_sql_column(ss, "name"), rid);
-       //base_init(tr->sa, &s->base, sid, 0, v); _DELETE(v);
-       s->base.name = (v)?sa_strdup(tr->sa, v):NULL;
+       base_init(tr->sa, &s->base, sid, 0, v); _DELETE(v);
        v = table_funcs.column_find_value(tr, find_sql_column(ss, 
"authorization"), rid);
        s->auth_id = *(sqlid *)v;       _DELETE(v);
        v = table_funcs.column_find_value(tr, find_sql_column(ss, "system"), 
rid);
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to