Changeset: cb8bdd949018 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=cb8bdd949018
Modified Files:
        monetdb5/modules/mal/mat.c
        sql/backends/monet5/sql.mx
        sql/backends/monet5/sql_optimizer.c
        sql/backends/monet5/sql_result.c
        sql/backends/monet5/vaults/fits.c
        sql/storage/bat/bat_storage.c
        sql/storage/restrict/restrict_storage.c
        sql/storage/sql_storage.h
Branch: Feb2013
Log Message:

use store_funcs.count_* to reduce BATdescriptor/BBPunfix calls.


diffs (truncated from 526 to 300 lines):

diff --git a/monetdb5/modules/mal/mat.c b/monetdb5/modules/mal/mat.c
--- a/monetdb5/modules/mal/mat.c
+++ b/monetdb5/modules/mal/mat.c
@@ -153,7 +153,7 @@ MATpackIncrement(Client cntxt, MalBlkPtr
        if ( getArgType(mb,p,2) == TYPE_int){
                /* first step, estimate with some slack */
                pieces = stk->stk[getArg(p,2)].val.ival;
-               bn = BATnew(TYPE_void, b->ttype, (BUN)(1.2 * BATcount(b) * 
pieces));
+               bn = BATnew(TYPE_void, b->ttype?b->ttype:TYPE_oid, (BUN)(1.2 * 
BATcount(b) * pieces));
                if (bn == NULL)
                        throw(MAL, "mat.pack", MAL_MALLOC_FAIL);
                /* allocate enough space for the strings */
diff --git a/sql/backends/monet5/sql.mx b/sql/backends/monet5/sql.mx
--- a/sql/backends/monet5/sql.mx
+++ b/sql/backends/monet5/sql.mx
@@ -3684,7 +3684,7 @@ TID(Client cntxt, MalBlkPtr mb, MalStkPt
        sql_schema *s;
        sql_table *t;
        sql_column *c;
-       BAT *b, *i, *d, *tids, *diff;
+       BAT *tids;
        size_t nr, sb = 0, inr = 0;
        int readonly = 0;
 
@@ -3700,17 +3700,13 @@ TID(Client cntxt, MalBlkPtr mb, MalStkPt
                throw(SQL,"sql.tid","42S02!Table missing");
        c = t->columns.set->h->data;
 
-       b = store_funcs.bind_col(tr, c, RDONLY);
-       nr = BATcount(b);
-       BBPunfix(b->batCacheid);
+       nr = store_funcs.count_col(c, 1);
 
        if (isTable(t) && !readonly &&
           (t->base.flag != TR_NEW /* alter */) &&
-           t->persistence == SQL_PERSIST && !t->commit_action) {
-               i = store_funcs.bind_col(tr, c, RD_INS);
-               inr = BATcount(i);
-               BBPunfix(i->batCacheid);
-       }
+           t->persistence == SQL_PERSIST && !t->commit_action) 
+               inr = store_funcs.count_col(c, 0);
+       nr -= inr;
        if ( pci->argc == 6){ /* partion version */
                size_t cnt = nr;
                int part_nr = *(int *)getArgReference(stk, pci, 4);
@@ -3725,7 +3721,6 @@ TID(Client cntxt, MalBlkPtr mb, MalStkPt
        } else {
                nr += inr;
        }
-       d = store_funcs.bind_del(tr, t, RD_INS);
 
        /* create void,void bat with length and oid's set */
        tids = BATnew(TYPE_void, TYPE_void, 0);
@@ -3735,13 +3730,15 @@ TID(Client cntxt, MalBlkPtr mb, MalStkPt
        tids->H->revsorted = 0;
        tids->T->revsorted = 0;
        
-       if (BATcount(d)) {
-               diff = BATkdiff(tids, BATmirror(d));
+       if (store_funcs.count_del(t)) {
+               BAT *d = store_funcs.bind_del(tr, t, RD_INS);
+               BAT *diff = BATkdiff(tids, BATmirror(d));
+
                BBPunfix(tids->batCacheid);
                tids = BATmirror(BATmark(diff, sb));
                BBPunfix(diff->batCacheid);
-       }
-       BBPunfix(d->batCacheid);
+               BBPunfix(d->batCacheid);
+       }
        BBPkeepref( *res = tids->batCacheid ); 
        return MAL_SUCCEED;
 }
@@ -6784,6 +6781,7 @@ vacuum(Client cntxt, MalBlkPtr mb, MalSt
        sql_schema      *s;
        sql_table       *t;
        sql_column      *c;
+       sql_dbat *dbat;
        mvc *m = NULL;
        str msg = getSQLContext(cntxt,mb, &m, NULL);
        bat bid;
@@ -6828,6 +6826,7 @@ vacuum(Client cntxt, MalBlkPtr mb, MalSt
 
        /* get the deletions BAT*/
        del = mvc_bind_dbat(m, *sch, *tbl, RD_INS);
+       dbat=t->data;
 
        /* this code is insecure, because something may
           go wrong while we compress the columns.
@@ -6860,22 +6859,20 @@ vacuum(Client cntxt, MalBlkPtr mb, MalSt
                throw(SQL,name,"Too many columns to handle, use copy instead");
        }
 
-       i=0;
-       for (o = t->columns.set->h; o; o = o->next, i++) {
-               sql_delta *d;
-               c = o->data;
-               b = store_funcs.bind_col(tr, c, 0);
-               /* based on previous loop, BAT should be accessible */
-               if (b)
-                       BBPdecref(b->batCacheid, TRUE);
-               d = c->data;
+       for (o = t->columns.set->h, i=0; o; o = o->next, i++) {
+               sql_column *c = o->data;
+               sql_delta *d = c->data;
+
+               BBPdecref(d->bid, TRUE);
                d->bid = 0;
                d->ibase = 0;
+               d->cnt -= dbat->cnt;
                d->ibid = bids[i]; /* use the insert bat */
                c->base.wtime = c->base.rtime = tr->stime;
        }
        BATclear(del, TRUE);
        BBPreleaseref(del->batCacheid);
+       dbat->cnt = 0;
        /* bat was cleared */
        t->cleared = 1;
 
@@ -6964,6 +6961,7 @@ SQLvacuum(Client cntxt, MalBlkPtr mb, Ma
        } else
                SQLreuse(cntxt,mb,stk,pci);
 
+       BBPdecref(del->batCacheid, TRUE);
        return MAL_SUCCEED;
 }
 /*
diff --git a/sql/backends/monet5/sql_optimizer.c 
b/sql/backends/monet5/sql_optimizer.c
--- a/sql/backends/monet5/sql_optimizer.c
+++ b/sql/backends/monet5/sql_optimizer.c
@@ -131,7 +131,7 @@ SQLgetStatistics(Client cntxt, mvc *m, M
                                sql_idx *i = mvc_bind_idx(m, s, cname);
 
                                if (i && !isRemote(i->t)) { /* skip alter and 
remote statements */
-                                       cnt = store_funcs.count_idx(i);
+                                       cnt = store_funcs.count_idx(i, 1);
                                        assert(cnt <= (size_t) GDK_oid_max);
                                        b = 
store_funcs.bind_idx(m->session->tr,i,0);
                                        if ( b ) {
@@ -151,7 +151,7 @@ SQLgetStatistics(Client cntxt, mvc *m, M
                                if (c && !isRemote(c->t)) {
                                        not_null = !c->null;
 
-                                       cnt = store_funcs.count_col(c);
+                                       cnt = store_funcs.count_col(c, 1);
                                        assert(cnt <= (size_t) GDK_oid_max);
                                        b = 
store_funcs.bind_col(m->session->tr,c,0);
                                        if ( b ){
@@ -171,7 +171,7 @@ SQLgetStatistics(Client cntxt, mvc *m, M
                                if (t->columns.set->h) {
                                        c = t->columns.set->h->data;
 
-                                       cnt = store_funcs.count_col(c);
+                                       cnt = store_funcs.count_col(c, 1);
                                        rows = (wrd) cnt;
                                }
                        }
diff --git a/sql/backends/monet5/sql_result.c b/sql/backends/monet5/sql_result.c
--- a/sql/backends/monet5/sql_result.c
+++ b/sql/backends/monet5/sql_result.c
@@ -694,6 +694,7 @@ mvc_import_table(Client cntxt, mvc *m, b
 
                                c->base.wtime = c->t->base.wtime = 
c->t->s->base.wtime = m->session->tr->wtime = m->session->tr->stime;
                                d->cnt = BATcount(b);
+                               d->ibase = BATcount(b);
 
                                BBPunfix(b->batCacheid);
                        }
diff --git a/sql/backends/monet5/vaults/fits.c 
b/sql/backends/monet5/vaults/fits.c
--- a/sql/backends/monet5/vaults/fits.c
+++ b/sql/backends/monet5/vaults/fits.c
@@ -290,7 +290,7 @@ str FITSexportTable(Client cntxt, MalBlk
 
        col = mvc_bind_column(m, tbl, colname[0]);
 
-       nrows = store_funcs.count_col(col);
+       nrows = store_funcs.count_col(col, 1);
 
        snprintf(filename,BUFSIZ,"\n%s.fit",tname);
        mnstr_printf(GDKout, "Filename: %s\n", filename);
@@ -708,14 +708,14 @@ str FITSattach(Client cntxt, MalBlkPtr m
 
        /* add row in the fits_files catalog table */
        col = mvc_bind_column(m, fits_fl, "id");
-       fid = store_funcs.count_col(col) + 1;
+       fid = store_funcs.count_col(col, 1) + 1;
        store_funcs.append_col(m->session->tr,
                mvc_bind_column(m, fits_fl, "id"), &fid, TYPE_int);
        store_funcs.append_col(m->session->tr,
                mvc_bind_column(m, fits_fl, "name"), fname, TYPE_str);
 
        col = mvc_bind_column(m, fits_tbl, "id");
-       tid = store_funcs.count_col(col) + 1;
+       tid = store_funcs.count_col(col, 1) + 1;
 
        if ((s = strrchr(fname, DIR_SEP)) == NULL)
                s = fname;
@@ -811,7 +811,7 @@ str FITSattach(Client cntxt, MalBlkPtr m
                /* read columns description */
                s = stmt;
                col = mvc_bind_column(m, fits_col, "id");
-               cid = store_funcs.count_col(col) + 1;
+               cid = store_funcs.count_col(col, 1) + 1;
                for (j = 1; j <= cnum; j++, cid++) {
                        fits_get_acolparms(fptr, j, cname, &tbcol, tunit, 
tform, &tscal, &tzero, tnull, tdisp, &status);
                        snprintf(stmt, BUFSIZ, FITS_INS_COL, (int)cid, cname, 
tform, tunit, j, (int)tid);
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
@@ -293,14 +293,13 @@ delta_append_bat( sql_delta *bat, BAT *i
                                BATmmap(b, STORE_MMAP, STORE_MMAP, STORE_MMAP, 
STORE_MMAP, 1);
                }
                assert(b->T->heap.storage != STORE_PRIV);
-               BATappend(b, i, TRUE);
        } else {
                temp_destroy(bat->ibid);
                bat->ibid = ebat2real(b->batCacheid, bat->ibase);
                bat_destroy(b);
                b = temp_descriptor(bat->ibid);
-               BATappend(b, i, TRUE);
        }
+       BATappend(b, i, TRUE);
        bat_destroy(b);
 }
 
@@ -355,21 +354,17 @@ delta_delete_bat( sql_dbat *bat, BAT *i 
 {
        BAT *b = temp_descriptor(bat->dbid);
 
+       if (isEbat(b)) {
+               temp_destroy(bat->dbid);
+               bat->dbid = temp_copy(b->batCacheid, FALSE);
+               bat_destroy(b);
+               b = temp_descriptor(bat->dbid);
+       }
+       assert(b->T->heap.storage != STORE_PRIV);
+       BATappend(b, i, TRUE);
+       bat_destroy(b);
+
        bat->cnt += BATcount(i);
-       if (BATcount(b) == 0 && !isVIEW(i) && i->htype == TYPE_void && i->ttype 
!= TYPE_void){
-               temp_destroy(bat->dbid);
-               bat->dbid = temp_create(i);
-       } else {
-               if (isEbat(b)) {
-                       temp_destroy(bat->dbid);
-                       bat->dbid = temp_copy(b->batCacheid, FALSE);
-                       bat_destroy(b);
-                       b = temp_descriptor(bat->dbid);
-               }
-               assert(b->T->heap.storage != STORE_PRIV);
-               BATappend(b, i, TRUE);
-       }
-       bat_destroy(b);
 }
 
 void
@@ -377,15 +372,17 @@ delta_delete_val( sql_dbat *bat, oid rid
 {
        BAT *b = temp_descriptor(bat->dbid);
 
-       bat->cnt ++;
        if (isEbat(b)) {
                temp_destroy(bat->dbid);
                bat->dbid = temp_copy(b->batCacheid, FALSE);
                bat_destroy(b);
                b = temp_descriptor(bat->dbid);
        }
+       assert(b->T->heap.storage != STORE_PRIV);
        BUNappend(b, (ptr)&rid, TRUE);
        bat_destroy(b);
+
+       bat->cnt ++;
 }
 
 static void
@@ -425,23 +422,37 @@ delete_tab(sql_trans *tr, sql_table * t,
 }
 
 static size_t
-count_col(sql_column *col)
+count_col(sql_column *col, int all)
 {
        sql_delta *b = col->data;
        if (!b)
                return 1;
-       return b->cnt;
+       if (all) 
+               return b->cnt;
+       else
+               return b->cnt - b->ibase;
 }
 
 static size_t
-count_idx(sql_idx *idx)
+count_idx(sql_idx *idx, int all)
 {
        sql_delta *b = idx->data;
        if (!b)
_______________________________________________
checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to