Changeset: b81ddec11ae7 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=b81ddec11ae7
Modified Files:
gdk/gdk_logger.c
gdk/gdk_logger.h
monetdb5/optimizer/opt_mergetable.c
monetdb5/optimizer/opt_pipes.c
sql/backends/monet5/rel_bin.c
sql/backends/monet5/sql.mx
sql/backends/monet5/sql_gencode.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/server/sql_mvc.c
sql/storage/bat/bat_storage.c
sql/storage/bat/bat_storage.h
sql/storage/bat/bat_table.c
sql/storage/sql_storage.h
sql/storage/store.c
Branch: newstorage
Log Message:
cleanup
) use log_delta (and new log_delta_slice) to log the inserts as updates
) store slot/inserted in the sql_timestamp, with multiple inserts keep
them in a list of inserts
) keep deleted first location in the sql_timestamp structure
) removed insert part from the delta interface, disabled push_select optimizer
and adapted mergetable for this
Open issue, on restart some of the deletes aren't handled properly, leading
to broken allready drop tables.
diffs (truncated from 4033 to 300 lines):
diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c
--- a/gdk/gdk_logger.c
+++ b/gdk/gdk_logger.c
@@ -1721,7 +1721,7 @@ log_delta(logger *lg, BAT *b, char *name
}
l.tid = lg->tid;
- nr = (BUNlast(b) - BUNfirst(b));
+ nr = BATcount(b);
assert(nr <= GDK_int_max);
l.nr = (int) nr;
lg->changes += l.nr;
@@ -1736,7 +1736,7 @@ log_delta(logger *lg, BAT *b, char *name
log_write_string(lg, name) == LOG_ERR)
return LOG_ERR;
- for (p = BUNfirst(b); p < BUNlast(b) && ok == GDK_SUCCEED; p++)
{
+ for (p = 0; p < nr && ok == GDK_SUCCEED; p++) {
const void *h = BUNhead(bi, p);
const void *t = BUNtail(bi, p);
@@ -1744,7 +1744,55 @@ log_delta(logger *lg, BAT *b, char *name
ok = (ok == GDK_FAIL) ? ok : wt(t, lg->log, 1);
}
- //if (lg->debug & 1)
+ if (lg->debug & 1)
+ fprintf(stderr, "Logged %s %d inserts\n", name, l.nr);
+ }
+ return (ok == GDK_SUCCEED) ? LOG_OK : LOG_ERR;
+}
+
+int
+log_delta_slice(logger *lg, BUN first, size_t cnt, BAT *b, char *name)
+{
+ int ok = GDK_SUCCEED;
+ logformat l;
+ BUN p;
+ BUN nr;
+
+ if (lg->debug & 128) {
+ /* logging is switched off */
+ return LOG_OK;
+ }
+
+ l.tid = lg->tid;
+ nr = cnt;
+ assert(nr <= GDK_int_max);
+ l.nr = (int) nr;
+ lg->changes += l.nr;
+
+ if (l.nr) {
+ BATiter bi = bat_iterator(b);
+ int (*wh) (const void *, stream *, size_t) = b->htype ==
TYPE_void ? BATatoms[TYPE_oid].atomWrite : BATatoms[b->htype].atomWrite;
+ int (*wt) (const void *, stream *, size_t) =
BATatoms[b->ttype].atomWrite;
+
+ l.flag = LOG_UPDATE;
+ if (log_write_format(lg, &l) == LOG_ERR ||
+ log_write_string(lg, name) == LOG_ERR)
+ return LOG_ERR;
+
+ for (p = first; p < first+cnt && ok == GDK_SUCCEED; p++) {
+ oid id = p;
+ const void *t = BUNtail(bi, p);
+
+ if (b->htype == TYPE_void) {
+ ok = wh(&id, lg->log, 1);
+ } else {
+ const void *h = BUNhead(bi, p);
+ ok = wh(h, lg->log, 1);
+ }
+ ok = (ok == GDK_FAIL) ? ok : wt(t, lg->log, 1);
+ }
+
+ if (lg->debug & 1)
fprintf(stderr, "Logged %s %d inserts\n", name, l.nr);
}
return (ok == GDK_SUCCEED) ? LOG_OK : LOG_ERR;
@@ -1793,7 +1841,7 @@ log_bat(logger *lg, BAT *b, char *name)
}
}
-// if (lg->debug & 1)
+ if (lg->debug & 1)
fprintf(stderr, "Logged %s %d inserts\n", name, l.nr);
}
l.nr = (int) (b->batFirst - b->batDeleted);
@@ -1817,7 +1865,7 @@ log_bat(logger *lg, BAT *b, char *name)
ok = (ok == GDK_FAIL) ? ok : wt(t, lg->log, 1);
}
-// if (lg->debug & 1)
+ if (lg->debug & 1)
fprintf(stderr, "Logged %s %d deletes\n", name, l.nr);
}
return (ok == GDK_SUCCEED) ? LOG_OK : LOG_ERR;
diff --git a/gdk/gdk_logger.h b/gdk/gdk_logger.h
--- a/gdk/gdk_logger.h
+++ b/gdk/gdk_logger.h
@@ -113,6 +113,7 @@ gdk_export int log_bat_clear(logger *lg,
gdk_export int log_bat_persists(logger *lg, BAT *b, char *n);
gdk_export int log_bat_transient(logger *lg, char *n);
gdk_export int log_delta(logger *lg, BAT *b, char *n);
+gdk_export int log_delta_slice(logger *lg, BUN first, size_t cnt, BAT *b, char
*n);
gdk_export int log_tstart(logger *lg); /* TODO return transaction id */
gdk_export int log_tend(logger *lg);
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
@@ -231,9 +231,6 @@ mat_delta(MalBlkPtr mb, InstrPtr p, mat_
for(k=1; k < mat[m].mi->argc; k++) {
InstrPtr q = copyInstruction(p);
- /* remove last argument */
- if (k < mat[m].mi->argc-1)
- q->argc--;
/* make sure to resolve again */
q->token = ASSIGNsymbol;
q->typechk = TYPE_UNKNOWN;
@@ -1586,8 +1583,6 @@ OPTmergetableImplementation(Client cntxt
if ((e=is_a_mat(getArg(p,fe), mat, mtop)) >= 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) &&
(m=is_a_mat(getArg(p,fm), mat, mtop)) >= 0 &&
(n=is_a_mat(getArg(p,fn), mat, mtop)) >= 0 &&
diff --git a/monetdb5/optimizer/opt_pipes.c b/monetdb5/optimizer/opt_pipes.c
--- a/monetdb5/optimizer/opt_pipes.c
+++ b/monetdb5/optimizer/opt_pipes.c
@@ -74,7 +74,7 @@ struct PIPELINES {
"optimizer.evaluate();"
"optimizer.emptySet();"
"optimizer.aliases();"
- "optimizer.pushselect();"
+ //"optimizer.pushselect();"
"optimizer.mitosis();"
"optimizer.mergetable();"
"optimizer.deadcode();"
diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -721,9 +721,8 @@ stmt_col( mvc *sql, sql_column *c, stmt
if (isTable(c->t) && !c->t->readonly &&
(c->base.flag != TR_NEW || c->t->base.flag != TR_NEW /* alter */) &&
(c->t->persistence == SQL_PERSIST || c->t->persistence ==
SQL_DECLARED_TABLE) && !c->t->commit_action) {
- stmt *i = stmt_bat(sql->sa, c, RD_INS);
stmt *u = stmt_bat(sql->sa, c, RD_UPD);
- sc = stmt_project_delta(sql->sa, sc, u, i);
+ sc = stmt_project_delta(sql->sa, sc, u);
sc = stmt_project(sql->sa, del, sc);
} else if (del) { /* always handle the deletes */
sc = stmt_project(sql->sa, del, sc);
@@ -739,9 +738,8 @@ stmt_idx( mvc *sql, sql_idx *i, stmt *de
if (isTable(i->t) && !i->t->readonly &&
(i->base.flag != TR_NEW || i->t->base.flag != TR_NEW /* alter */) &&
(i->t->persistence == SQL_PERSIST || i->t->persistence ==
SQL_DECLARED_TABLE) && !i->t->commit_action) {
- stmt *ic = stmt_idxbat(sql->sa, i, RD_INS);
stmt *u = stmt_idxbat(sql->sa, i, RD_UPD);
- sc = stmt_project_delta(sql->sa, sc, u, ic);
+ sc = stmt_project_delta(sql->sa, sc, u);
sc = stmt_project(sql->sa, del, sc);
} else if (del) { /* always handle the deletes */
sc = stmt_project(sql->sa, del, sc);
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
@@ -233,16 +233,16 @@ comment "Bind the 'schema.table.column'
1 - inserts
2 - updates";
-command delta ( col:bat[:oid,:any_3], uid:bat[:oid,:oid],
uval:bat[:oid,:any_3], ins:bat[:oid,:any_3] )
+command delta (col:bat[:oid,:any_3], uid:bat[:oid,:oid], uval:bat[:oid,:any_3])
:bat[:oid,:any_3]
address DELTAbat
comment "Return column bat with delta's applied.";
-command projectdelta( subselect:bat[:oid,:oid], col:bat[:oid,:any_3],
uid:bat[:oid,:oid], uval:bat[:oid,:any_3], ins:bat[:oid,:any_3] )
:bat[:oid,:any_3]
+command projectdelta( subselect:bat[:oid,:oid], col:bat[:oid,:any_3],
uid:bat[:oid,:oid], uval:bat[:oid,:any_3] ) :bat[:oid,:any_3]
address DELTAproject
comment "Return column bat with delta's applied.";
-command subdelta ( col:bat[:oid,:oid], cand:bat[:oid,:oid],
uid:bat[:oid,:oid], uval:bat[:oid,:oid], ins:bat[:oid,:oid] ) :bat[:oid,:oid]
+command subdelta ( col:bat[:oid,:oid], cand:bat[:oid,:oid],
uid:bat[:oid,:oid], uval:bat[:oid,:oid] ) :bat[:oid,:oid]
address DELTAsub
comment "Return a single bat of subselected delta.";
@@ -1377,9 +1377,9 @@ sql5_export str mvc_bind_idxbat_wrap(Cli
sql5_export str mvc_clear_table_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr
stk, InstrPtr pci);
sql5_export str mvc_delete_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr stk,
InstrPtr pci);
sql5_export str SQLtid(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr
pci);
-sql5_export str DELTAbat(bat *result, bat *col, bat *uid, bat *uval, bat *ins);
-sql5_export str DELTAsub(bat *result, bat *col, bat *cid, bat *uid, bat *uval,
bat *ins);
-sql5_export str DELTAproject(bat *result, bat *subselect, bat *col, bat *uid,
bat *uval, bat *ins);
+sql5_export str DELTAbat(bat *result, bat *col, bat *uid, bat *uval);
+sql5_export str DELTAsub(bat *result, bat *col, bat *cid, bat *uid, bat *uval);
+sql5_export str DELTAproject(bat *result, bat *subselect, bat *col, bat *uid,
bat *uval);
sql5_export str DELTAbat2(bat *result, bat *col, bat *uid, bat *uval);
sql5_export str DELTAsub2(bat *result, bat *col, bat *cid, bat *uid, bat
*uval);
sql5_export str DELTAproject2(bat *result, bat *subselect, bat *col, bat *uid,
bat *uval);
@@ -3514,33 +3514,31 @@ setwritable(BAT *b)
str
DELTAbat2(bat *result, bat *col, bat *uid, bat *uval)
{
- return DELTAbat(result, col, uid, uval, NULL);
+ return DELTAbat(result, col, uid, uval);
}
str
DELTAsub2(bat *result, bat *col, bat *cid, bat *uid, bat *uval)
{
- return DELTAsub(result, col, cid, uid, uval, NULL);
+ return DELTAsub(result, col, cid, uid, uval);
}
str
DELTAproject2(bat *result, bat *sub, bat *col, bat *uid, bat *uval)
{
- return DELTAproject(result, sub, col, uid, uval, NULL);
+ return DELTAproject(result, sub, col, uid, uval);
}
str
-DELTAbat(bat *result, bat *col, bat *uid, bat *uval, bat *ins)
-{
- BAT *c, *u_id, *u_val, *u, *i = NULL, *res;
+DELTAbat(bat *result, bat *col, bat *uid, bat *uval)
+{
+ BAT *c, *u_id, *u_val, *u, *res;
if ((u_id = BBPquickdesc(ABS(*uid), 0)) == NULL)
throw(MAL, "sql.delta", RUNTIME_OBJECT_MISSING);
- if (ins && (i = BBPquickdesc(ABS(*ins), 0)) == NULL)
- throw(MAL, "sql.delta", RUNTIME_OBJECT_MISSING);
-
- /* no updates, no inserts */
- if (BATcount(u_id) == 0 && (!i || BATcount(i) == 0)) {
+
+ /* no updates */
+ if (BATcount(u_id) == 0) {
BBPincref(*result = *col, TRUE);
return MAL_SUCCEED;
}
@@ -3548,12 +3546,6 @@ DELTAbat(bat *result, bat *col, bat *uid
if ((c = BBPquickdesc(ABS(*col), 0)) == NULL)
throw(MAL, "sql.delta", RUNTIME_OBJECT_MISSING);
- /* bat may change */
- /*if (i && BATcount(c) == 0 && BATcount(u_id) == 0) {
- BBPincref(*result = *ins, TRUE);
- return MAL_SUCCEED;
- }*/
-
c = BATdescriptor(*col);
if ((res = BATcopy(c, TYPE_void, c->ttype, TRUE)) == NULL)
throw(MAL, "sql.delta", OPERATION_FAILED);
@@ -3569,28 +3561,20 @@ DELTAbat(bat *result, bat *col, bat *uid
res = BATreplace(res, u, TRUE);
BBPunfix(u->batCacheid);
- /*if (i && BATcount(i)) {
- i = BATdescriptor(*ins);
- res = BATappend(res, i, TRUE);
- BBPunfix(i->batCacheid);
- }*/
-
BBPkeepref(*result = res->batCacheid);
return MAL_SUCCEED;
}
str
-DELTAsub(bat *result, bat *col, bat *cid, bat *uid, bat *uval, bat *ins)
-{
- BAT *c, *cminu, *u_id, *u_val, *u, *i = NULL, *res;
+DELTAsub(bat *result, bat *col, bat *cid, bat *uid, bat *uval)
+{
+ BAT *c, *cminu, *u_id, *u_val, *u, *res;
if ((u_id = BBPquickdesc(ABS(*uid), 0)) == NULL)
throw(MAL, "sql.delta", RUNTIME_OBJECT_MISSING);
- if (ins && (i = BBPquickdesc(ABS(*ins), 0)) == NULL)
- throw(MAL, "sql.delta", RUNTIME_OBJECT_MISSING);
-
- /* no updates, no inserts */
- if (BATcount(u_id) == 0 && (!i || BATcount(i) == 0)) {
+
+ /* no updates */
+ if (BATcount(u_id) == 0) {
BBPincref(*result = *col, TRUE);
return MAL_SUCCEED;
}
@@ -3598,12 +3582,6 @@ DELTAsub(bat *result, bat *col, bat *cid
if ((c = BBPquickdesc(ABS(*col), 0)) == NULL)
throw(MAL, "sql.delta", RUNTIME_OBJECT_MISSING);
- /* bat may change */
- if (i && BATcount(c) == 0 && BATcount(u_id) == 0) {
- BBPincref(*result = *ins, TRUE);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list