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