Changeset: bcdea4b1f9a2 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=bcdea4b1f9a2
Modified Files:
        gdk/gdk.h
        gdk/gdk_logger.c
        gdk/gdk_logger.h
        gdk/gdk_private.h
        monetdb5/optimizer/opt_emptybind.c
        monetdb5/optimizer/opt_mergetable.c
        monetdb5/optimizer/opt_pushselect.c
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/sql.c
        sql/backends/monet5/sql.h
        sql/backends/monet5/sql.mal
        sql/backends/monet5/sql_optimizer.c
        sql/backends/monet5/sql_scenario.c
        sql/backends/monet5/sql_statement.c
        sql/backends/monet5/sql_statement.h
        sql/include/sql_catalog.h
        sql/scripts/20_vacuum.sql
        sql/storage/bat/bat_storage.c
        sql/storage/bat/bat_storage.h
        sql/storage/bat/bat_table.c
        sql/storage/bat/bat_utils.c
        sql/storage/bat/bat_utils.h
        sql/storage/sql_storage.h
        sql/storage/store.c
Branch: unlock
Log Message:

some more progress on the unlock code
- initial inserts work again


diffs (truncated from 4829 to 300 lines):

diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -892,6 +892,9 @@ gdk_export gdk_return BUNappend(BAT *b, 
 gdk_export gdk_return BATappend(BAT *b, BAT *n, BAT *s, bool force)
        __attribute__((__warn_unused_result__));
 
+gdk_export gdk_return BUNreplace(BAT *b, oid left, const void *right, bool 
force)
+       __attribute__((__warn_unused_result__));
+
 gdk_export gdk_return BUNdelete(BAT *b, oid o)
        __attribute__((__warn_unused_result__));
 gdk_export gdk_return BATdel(BAT *b, BAT *d)
diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c
--- a/gdk/gdk_logger.c
+++ b/gdk/gdk_logger.c
@@ -220,6 +220,7 @@ la_bat_clear(logger *lg, logaction *la)
        if (b) {
                restrict_t access = (restrict_t) b->batRestricted;
                b->batRestricted = BAT_WRITE;
+               /* during startup this is fine */
                BATclear(b, true);
                b->batRestricted = access;
                logbat_destroy(b);
@@ -1898,7 +1899,7 @@ log_bat_persists(logger *lg, BAT *b, int
                fprintf(stderr, "#persists id (%d) bat (%d)\n", id, 
b->batCacheid);
        if (lg->inmemory || LOG_DISABLED(lg))
                return GDK_SUCCEED;
-       return log_bat(lg, b, id, 0);
+       return log_bat(lg, b, id, 0, BATcount(b));
 }
 
 gdk_return
@@ -1924,6 +1925,71 @@ log_bat_transient(logger *lg, int id)
        return logger_del_bat(lg, bid);
 }
 
+static gdk_return
+_log_bat(logger *lg, BAT *b, log_id id, lng offset, lng cnt, int sliced)
+{
+       char tpe = find_type(lg, b->ttype);
+       gdk_return ok = GDK_SUCCEED;
+       logformat l;
+       BUN p;
+       lng nr;
+       int is_row = 0;
+
+       if (lg->row_insert_nrcols != 0) {
+               lg->row_insert_nrcols--;
+               is_row = 1;
+       }
+       l.flag = LOG_UPDATE_BULK;
+       l.id = id;
+       nr = cnt;
+       lg->changes += (b->batInserted)?nr:1; /* initial large inserts is 
counted as 1 change */
+
+       if (LOG_DISABLED(lg) || lg->inmemory || !nr) {
+               /* logging is switched off */
+               return GDK_SUCCEED;
+       }
+
+       BATiter bi = bat_iterator(b);
+       gdk_return (*wt) (const void *, stream *, size_t) = 
BATatoms[b->ttype].atomWrite;
+
+       if (is_row)
+               l.flag = tpe; 
+       if (log_write_format(lg, &l) != GDK_SUCCEED ||
+           (!is_row && !mnstr_writeLng(lg->output_log, nr)) ||
+           (!is_row && mnstr_write(lg->output_log, &tpe, 1, 1) != 1) ||
+           (!is_row && !mnstr_writeLng(lg->output_log, offset))) 
+               return GDK_FAIL;
+
+       /* if offset is just for the log, but BAT is already sliced, reset 
offset */
+       if (sliced)
+               offset = 0;
+       if (b->ttype < TYPE_str && !isVIEW(b)) {
+               const void *t = BUNtail(bi, offset);
+
+               ok = wt(t, lg->output_log, (size_t)nr);
+       } else {
+               BUN end = offset+nr;
+               for (p = offset; p < end && ok == GDK_SUCCEED; p++) {
+                       const void *t = BUNtail(bi, p);
+
+                       ok = wt(t, lg->output_log, 1);
+               }
+       }
+
+       if (lg->debug & 1)
+               fprintf(stderr, "#Logged %d " LLFMT " inserts\n", id, nr);
+
+       if (ok != GDK_SUCCEED)
+               fprintf(stderr, "!ERROR: log_bat: write failed\n");
+       return ok;
+}
+
+gdk_return
+log_bat(logger *lg, BAT *b, log_id id, lng offset, lng cnt)
+{
+       return _log_bat(lg, b, id, offset, cnt, 0);
+}
+
 gdk_return
 log_delta(logger *lg, BAT *uid, BAT *uval, log_id id)
 {
@@ -1934,7 +2000,7 @@ log_delta(logger *lg, BAT *uid, BAT *uva
        lng nr;
 
        if (BATtdense(uid)) 
-               return log_bat(lg, uval, id, uid->tseqbase);
+               return _log_bat(lg, uval, id, uid->tseqbase, BATcount(uval), 1);
 
        assert(uid->ttype == TYPE_oid || uid->ttype == TYPE_void);
 
@@ -1977,60 +2043,6 @@ log_delta(logger *lg, BAT *uid, BAT *uva
        return ok;
 }
 
-gdk_return
-log_bat(logger *lg, BAT *b, log_id id, lng offset)
-{
-       char tpe = find_type(lg, b->ttype);
-       gdk_return ok = GDK_SUCCEED;
-       logformat l;
-       BUN p;
-       lng nr;
-       int is_row = 0;
-
-       if (lg->row_insert_nrcols != 0) {
-               lg->row_insert_nrcols--;
-               is_row = 1;
-       }
-       l.flag = LOG_UPDATE_BULK;
-       l.id = id;
-       nr = (BUNlast(b) - b->batInserted);
-       lg->changes += (b->batInserted)?nr:1; /* initial large inserts is 
counted as 1 change */
-
-       if (LOG_DISABLED(lg) || lg->inmemory || !nr) {
-               /* logging is switched off */
-               return GDK_SUCCEED;
-       }
-
-       BATiter bi = bat_iterator(b);
-       gdk_return (*wt) (const void *, stream *, size_t) = 
BATatoms[b->ttype].atomWrite;
-
-       if (is_row)
-               l.flag = tpe; 
-       if (log_write_format(lg, &l) != GDK_SUCCEED ||
-           (!is_row && !mnstr_writeLng(lg->output_log, nr)) ||
-           (!is_row && mnstr_write(lg->output_log, &tpe, 1, 1) != 1) ||
-           (!is_row && !mnstr_writeLng(lg->output_log, offset))) 
-               return GDK_FAIL;
-
-       if (b->ttype < TYPE_str && !isVIEW(b)) {
-               const void *t = BUNtail(bi, b->batInserted);
-
-               ok = wt(t, lg->output_log, (size_t)nr);
-       } else {
-               for (p = b->batInserted; p < BUNlast(b) && ok == GDK_SUCCEED; 
p++) {
-                       const void *t = BUNtail(bi, p);
-
-                       ok = wt(t, lg->output_log, 1);
-               }
-       }
-
-       if (lg->debug & 1)
-               fprintf(stderr, "#Logged %d " LLFMT " inserts\n", id, nr);
-
-       if (ok != GDK_SUCCEED)
-               fprintf(stderr, "!ERROR: log_bat: write failed\n");
-       return ok;
-}
 
 gdk_return
 log_bat_clear(logger *lg, int id)
diff --git a/gdk/gdk_logger.h b/gdk/gdk_logger.h
--- a/gdk/gdk_logger.h
+++ b/gdk/gdk_logger.h
@@ -52,7 +52,7 @@ gdk_export lng logger_changes(logger *lg
 gdk_export int logger_sequence(logger *lg, int seq, lng *id);
 
 /* todo pass the transaction id */
-gdk_export gdk_return log_bat(logger *lg, BAT *b, log_id id, lng offset);
+gdk_export gdk_return log_bat(logger *lg, BAT *b, log_id id, lng offset, lng 
cnt); /* log slice from b */
 gdk_export gdk_return log_bat_clear(logger *lg, log_id id);
 gdk_export gdk_return log_bat_persists(logger *lg, BAT *b, log_id id);
 gdk_export gdk_return log_bat_transient(logger *lg, log_id id);
diff --git a/gdk/gdk_private.h b/gdk/gdk_private.h
--- a/gdk/gdk_private.h
+++ b/gdk/gdk_private.h
@@ -125,9 +125,6 @@ BUN binsearch_flt(const oid *restrict in
        __attribute__((__visibility__("hidden")));
 BUN binsearch_dbl(const oid *restrict indir, oid offset, const dbl *restrict 
vals, BUN lo, BUN hi, dbl v, int ordering, int last)
        __attribute__((__visibility__("hidden")));
-gdk_return BUNreplace(BAT *b, oid left, const void *right, bool force)
-       __attribute__((__warn_unused_result__))
-       __attribute__((__visibility__("hidden")));
 Heap *createOIDXheap(BAT *b, bool stable)
        __attribute__((__visibility__("hidden")));
 void gdk_bbp_reset(void)
diff --git a/monetdb5/optimizer/opt_emptybind.c 
b/monetdb5/optimizer/opt_emptybind.c
--- a/monetdb5/optimizer/opt_emptybind.c
+++ b/monetdb5/optimizer/opt_emptybind.c
@@ -184,13 +184,13 @@ OPTemptybindImplementation(Client cntxt,
                        continue;
                }
 
-               // delta operations without updates+ insert can be replaced by 
an assignment
-               if (getModuleId(p)== sqlRef && getFunctionId(p) == deltaRef  && 
p->argc ==5){
-                       if( empty[getArg(p,2)] && empty[getArg(p,3)] && 
empty[getArg(p,4)] ){
+               // delta operations without updates can be replaced by an 
assignment
+               if (getModuleId(p)== sqlRef && getFunctionId(p) == deltaRef && 
p->argc == 4){
+                       if (empty[getArg(p,2)] && empty[getArg(p,3)]){
                                actions++;
                                clrFunction(p);
                                p->argc = 2;
-                               if ( empty[getArg(p,1)] ){
+                               if (empty[getArg(p,1)]){
                                        empty[getArg(p,0)] = i;
                                }
                        }
@@ -198,7 +198,7 @@ OPTemptybindImplementation(Client cntxt,
                }
 
                if (getModuleId(p)== sqlRef && getFunctionId(p) == 
projectdeltaRef) {
-                       if( empty[getArg(p,3)] && empty[getArg(p,4)] ){
+                       if (empty[getArg(p,3)] && empty[getArg(p,4)]){
                                actions++;
                                setModuleId(p,algebraRef);
                                setFunctionId(p,projectionRef);
diff --git a/monetdb5/optimizer/opt_mergetable.c 
b/monetdb5/optimizer/opt_mergetable.c
--- a/monetdb5/optimizer/opt_mergetable.c
+++ b/monetdb5/optimizer/opt_mergetable.c
@@ -319,20 +319,11 @@ mat_delta(matlist_t *ml, MalBlkPtr mb, I
                        for(j=1; j < mat[m].mi->argc; j++) {
                                if (overlap(ml, getArg(mat[e].mi, k), 
getArg(mat[m].mi, j), k, j, 0)){
                                        InstrPtr q = copyInstruction(p);
+
                                        if(!q){
                                                freeInstruction(r);
                                                return NULL;
                                        }
-
-                                       /* remove last argument (inserts only 
on last part) */
-                                       if (k < mat[m].mi->argc-1)
-                                               q->argc--;
-                                       /* make sure to resolve again */
-                                       q->token = ASSIGNsymbol; 
-                                       q->typechk = TYPE_UNKNOWN;
-                                       q->fcn = NULL;
-                                       q->blk = NULL;
-
                                        getArg(q, 0) = newTmpVariable(mb, tpe);
                                        getArg(q, mvar) = getArg(mat[m].mi, j);
                                        getArg(q, nvar) = getArg(mat[n].mi, j);
@@ -353,18 +344,9 @@ mat_delta(matlist_t *ml, MalBlkPtr mb, I
        } else {
                for(k=1; k < mat[m].mi->argc; k++) {
                        InstrPtr q = copyInstruction(p);
+
                        if(!q)
                                return NULL;
-
-                       /* remove last argument (inserts only on last part) */
-                       if (k < mat[m].mi->argc-1)
-                               q->argc--;
-                       /* make sure to resolve again */
-                       q->token = ASSIGNsymbol; 
-                       q->typechk = TYPE_UNKNOWN;
-                       q->fcn = NULL;
-                       q->blk = NULL;
-
                        getArg(q, 0) = newTmpVariable(mb, tpe);
                        getArg(q, mvar) = getArg(mat[m].mi, k);
                        getArg(q, nvar) = getArg(mat[n].mi, k);
@@ -2250,9 +2232,8 @@ OPTmergetableImplementation(Client cntxt
                        if ((e=is_a_mat(getArg(p,fe), &ml)) >= 0)
                                break;
 
-               /* delta* operator have a ins bat as last argument, we move the 
inserts into the last delta statement, ie
-                * all but last need to remove one argument */
-               if (match == 3 && bats == 4 && isDelta(p) && 
+               /* delta* operator */
+               if (match == 3 && bats == 3 && isDelta(p) && 
                   (m=is_a_mat(getArg(p,fm), &ml)) >= 0 &&
                   (n=is_a_mat(getArg(p,fn), &ml)) >= 0 &&
                   (o=is_a_mat(getArg(p,fo), &ml)) >= 0){
@@ -2265,7 +2246,7 @@ OPTmergetableImplementation(Client cntxt
 
                        continue;
                }
-               if (match == 4 && bats == 5 && isDelta(p) && 
+               if (match == 4 && bats == 4 && isDelta(p) && 
                   (m=is_a_mat(getArg(p,fm), &ml)) >= 0 &&
                   (n=is_a_mat(getArg(p,fn), &ml)) >= 0 &&
                   (o=is_a_mat(getArg(p,fo), &ml)) >= 0 &&
diff --git a/monetdb5/optimizer/opt_pushselect.c 
b/monetdb5/optimizer/opt_pushselect.c
--- a/monetdb5/optimizer/opt_pushselect.c
+++ b/monetdb5/optimizer/opt_pushselect.c
@@ -35,16 +35,6 @@ PushNil(MalBlkPtr mb, InstrPtr p, int po
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to