Changeset: 93d47ac2c502 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=93d47ac2c502
Modified Files:
sql/backends/monet5/sql.mx
sql/backends/monet5/sql_optimizer.c
sql/backends/monet5/sql_scenario.c
sql/backends/monet5/vaults/fits.c
sql/include/sql_catalog.h
sql/server/rel_psm.c
sql/server/rel_schema.c
sql/server/rel_updates.c
sql/server/sql_mvc.c
sql/server/sql_mvc.h
sql/storage/Makefile.ag
sql/storage/bat/bat_storage.c
sql/storage/bat/bat_storage.h
sql/storage/bat/bat_table.c
sql/storage/bat/bat_table.h
sql/storage/bat/bat_utils.c
sql/storage/bat/bat_utils.h
sql/storage/sql_catalog.c
sql/storage/sql_storage.h
sql/storage/store.c
sql/test/BugTracker/Tests/set_sql_debug_64__breaking_the_DB.SF-1906287.stable.out
sql/test/leaks/Tests/check0.stable.out
sql/test/leaks/Tests/check1.stable.out
sql/test/leaks/Tests/check2.stable.out
sql/test/leaks/Tests/check3.stable.out
sql/test/leaks/Tests/check4.stable.out
sql/test/leaks/Tests/check5.stable.out
sql/test/leaks/Tests/drop3.stable.out
sql/test/leaks/Tests/select1.stable.out
sql/test/leaks/Tests/select2.stable.out
sql/test/leaks/Tests/temp1.stable.out
sql/test/leaks/Tests/temp2.stable.out
sql/test/leaks/Tests/temp3.stable.out
Branch: default
Log Message:
Instead of keeping 'delta' structures per running transaction we
now only keep 'delta's for committed transactions. These are then
used by running transactions. The multiple versions are cleaned up
once transactions which use them end.
Advantage, less copies / copying. Still far from perfect (ie
doesn't solve the vacuum problem and still an insert requires
to much copying)
With this change the restricted storage is removed, 'readonly' is
now only supported within the bat storage (ie the tables are
then automatically marked as readonly). Single user mode will
in the future return for maintenance mode.
diffs (truncated from 2824 to 300 lines):
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
@@ -2000,7 +2000,7 @@ create_table_or_view( mvc *sql, char *sn
sql_table *nt = NULL;
node *n;
- if (STORE_READONLY(active_store_type))
+ if (STORE_READONLY)
return sql_error(sql, 06, "25006!schema statements cannot be
executed on a readonly database.");
if (!s)
@@ -2601,7 +2601,7 @@ SQLcatalog(Client cntxt, MalBlkPtr mb, M
if (msg)
return msg;
- if (STORE_READONLY(active_store_type))
+ if (STORE_READONLY)
return sql_message("25006!schema statements cannot be executed
on a readonly database.");
switch (type) {
@@ -3731,12 +3731,12 @@ SQLtid(Client cntxt, MalBlkPtr mb, MalSt
throw(SQL,"sql.tid","42S02!Table missing");
c = t->columns.set->h->data;
- nr = store_funcs.count_col(c, 1);
+ nr = store_funcs.count_col(tr, c, 1);
if (isTable(t) && !readonly &&
(t->base.flag != TR_NEW /* alter */) &&
t->persistence == SQL_PERSIST && !t->commit_action)
- inr = store_funcs.count_col(c, 0);
+ inr = store_funcs.count_col(tr, c, 0);
nr -= inr;
if ( pci->argc == 6){ /* partitioned version */
size_t cnt = nr;
@@ -3761,7 +3761,7 @@ SQLtid(Client cntxt, MalBlkPtr mb, MalSt
tids->H->revsorted = 0;
tids->T->revsorted = 0;
- if (store_funcs.count_del(t)) {
+ if (store_funcs.count_del(tr, t)) {
BAT *d = store_funcs.bind_del(tr, t, RD_INS);
BAT *diff = BATkdiff(tids, BATmirror(d));
@@ -6856,7 +6856,6 @@ 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;
@@ -6882,31 +6881,11 @@ vacuum(Client cntxt, MalBlkPtr mb, MalSt
if (!m->session->auto_commit)
throw(SQL,name, "%s only allowed in auto commit mode", name +
4);
- /* lock the store, for single user/transaction */
- store_lock();
- while (store_nr_active > 1) {
- store_unlock();
- MT_sleep_ms(100);
- store_lock();
-
- /* flush old changes to disk */
- sql_trans_end(m->session);
- store_apply_deltas();
- sql_trans_begin(m->session);
- }
-
tr = m->session->tr;
- t->base.wtime = s->base.wtime = tr->wtime = tr->wstime;
- t->base.rtime = s->base.rtime = tr->rtime = tr->stime;
/* 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.
- A two-phase action reduces the risks, but not all.
- e.g. a crash during update of the catalog. */
+
i=0;
bids[i]=0;
for (o = t->columns.set->h; o; o = o->next,i++) {
@@ -6919,7 +6898,6 @@ vacuum(Client cntxt, MalBlkPtr mb, MalSt
if (b)
BBPreleaseref(b->batCacheid);
BBPreleaseref(del->batCacheid);
- store_unlock();
if (!msg)
throw(SQL,name,"Can not access descriptor");
return msg;
@@ -6933,38 +6911,19 @@ vacuum(Client cntxt, MalBlkPtr mb, MalSt
if ( i >= 2048 ) {
for( i--; i>=0; i--)
BBPdecref(bids[i], TRUE);
- store_unlock();
throw(SQL,name,"Too many columns to handle, use copy instead");
}
+ mvc_clear_table(m, t);
for (o = t->columns.set->h, i=0; o; o = o->next, i++) {
sql_column *c = o->data;
- sql_delta *d = c->data;
-
- if (d->bid)
- BBPdecref(d->bid, TRUE);
- if (d->ibid)
- BBPdecref(d->ibid, TRUE);
- d->bid = 0;
- d->ibase = 0;
- d->cnt -= dbat->cnt;
- d->ibid = bids[i]; /* use the insert bat */
- c->base.wtime = tr->wstime;
- c->base.rtime = tr->stime;
- }
- BATclear(del, TRUE);
- BBPreleaseref(del->batCacheid);
- dbat->cnt = 0;
- /* bat was cleared */
- t->cleared = 1;
-
- sql_trans_commit(m->session->tr);
- /* write changes to disk */
- sql_trans_end(m->session);
- store_apply_deltas();
- sql_trans_begin(m->session);
- store_unlock();
-
+ BAT *ins = BATdescriptor(bids[i]); /* use the insert bat */
+
+ store_funcs.append_col(tr, c, ins, TYPE_bat);
+ BBPreleaseref(ins->batCacheid);
+ BBPdecref(bids[i], TRUE);
+ }
+ /* TODO indices */
return MAL_SUCCEED;
}
@@ -7285,7 +7244,7 @@ SQLrdfShred(Client cntxt, MalBlkPtr mb,
if (rid != oid_nil)
throw(SQL, "sql.rdfShred", "graph name already exists in
rdf.graph");
- id = (int) store_funcs.count_col(gname, 1);
+ id = (int) store_funcs.count_col(m->session->tr, gname, 1);
store_funcs.append_col(m->session->tr, gname, *name, TYPE_str);
store_funcs.append_col(m->session->tr, gid, &id, TYPE_int);
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
@@ -89,6 +89,7 @@ SQLgetStatistics(Client cntxt, mvc *m, M
InstrPtr *old = NULL;
int oldtop, i, actions = 0, size = 0;
lng clk = GDKusec();
+ sql_trans *tr = m->session->tr;
old = mb->stmt;
oldtop= mb->stop;
@@ -132,7 +133,7 @@ SQLgetStatistics(Client cntxt, mvc *m, M
/* skip alter on remote statements */
if (i && (!isRemote(i->t) &&
!isMergeTable(i->t))) {
- cnt = store_funcs.count_idx(i, 1);
+ cnt = store_funcs.count_idx(tr, i, 1);
assert(cnt <= (size_t) GDK_oid_max);
b =
store_funcs.bind_idx(m->session->tr,i,0);
if ( b ) {
@@ -152,7 +153,7 @@ SQLgetStatistics(Client cntxt, mvc *m, M
if (c && (!isRemote(c->t) &&
!isMergeTable(c->t))) {
not_null = !c->null;
- cnt = store_funcs.count_col(c, 1);
+ cnt = store_funcs.count_col(tr, c, 1);
assert(cnt <= (size_t) GDK_oid_max);
b =
store_funcs.bind_col(m->session->tr,c,0);
if ( b ){
@@ -172,7 +173,7 @@ SQLgetStatistics(Client cntxt, mvc *m, M
if (t->columns.set->h) {
c = t->columns.set->h->data;
- cnt = store_funcs.count_col(c, 1);
+ cnt = store_funcs.count_col(tr, c, 1);
rows = (wrd) cnt;
}
}
diff --git a/sql/backends/monet5/sql_scenario.c
b/sql/backends/monet5/sql_scenario.c
--- a/sql/backends/monet5/sql_scenario.c
+++ b/sql/backends/monet5/sql_scenario.c
@@ -224,10 +224,7 @@ SQLinit(void)
SQLdebug |= 64;
if (readonly)
SQLdebug |= 32;
- if (((SQLdebug&96)==96 && (SQLnewcatalog = mvc_init(FALSE, store_suro,
0)) < 0) ||
- ((SQLdebug&96)==64 && (SQLnewcatalog = mvc_init(FALSE,
store_su, 0)) < 0) ||
- ((SQLdebug&96)==32 && (SQLnewcatalog = mvc_init(FALSE,
store_ro, 0)) < 0) ||
- ((SQLdebug&112)==0 && (SQLnewcatalog = mvc_init(FALSE,
store_bat, 0)) < 0))
+ if ((SQLnewcatalog = mvc_init(FALSE, store_bat, readonly, single_user,
0)) < 0)
throw(SQL, "SQLinit", "Catalogue initialization failed");
SQLinitialized = TRUE;
MT_lock_unset(&sql_contextLock, "SQL init");
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
@@ -201,6 +201,7 @@ str FITSexportTable(Client cntxt, MalBlk
str msg = MAL_SUCCEED;
str tname = *(str*) getArgReference(stk, pci, 1);
mvc *m = NULL;
+ sql_trans *tr;
sql_schema *sch;
sql_table *tbl, *column, *tables = NULL;
sql_column *col;
@@ -230,6 +231,7 @@ str FITSexportTable(Client cntxt, MalBlk
if (msg)
return msg;
+ tr = m->session->tr;
sch = mvc_bind_schema(m, "sys");
/* First step: look if the table exists in the database. If the table
is not in the database, the export function cannot continue */
@@ -290,7 +292,7 @@ str FITSexportTable(Client cntxt, MalBlk
col = mvc_bind_column(m, tbl, colname[0]);
- nrows = store_funcs.count_col(col, 1);
+ nrows = store_funcs.count_col(tr, col, 1);
snprintf(filename,BUFSIZ,"\n%s.fit",tname);
mnstr_printf(GDKout, "Filename: %s\n", filename);
@@ -662,6 +664,7 @@ FITStest(int *res, str *fname)
str FITSattach(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
{
mvc *m = NULL;
+ sql_trans *tr;
sql_schema *sch;
sql_table *fits_tp, *fits_fl, *fits_tbl, *fits_col, *tbl = NULL;
sql_column *col;
@@ -686,6 +689,7 @@ str FITSattach(Client cntxt, MalBlkPtr m
return msg;
}
+ tr = m->session->tr;
sch = mvc_bind_schema(m, "sys");
fits_fl = mvc_bind_table(m, sch, "fits_files");
@@ -708,14 +712,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) + 1;
+ fid = store_funcs.count_col(tr, 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) + 1;
+ tid = store_funcs.count_col(tr, col, 1) + 1;
if ((s = strrchr(fname, DIR_SEP)) == NULL)
s = fname;
@@ -811,7 +815,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) + 1;
+ cid = store_funcs.count_col(tr, 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/include/sql_catalog.h b/sql/include/sql_catalog.h
--- a/sql/include/sql_catalog.h
+++ b/sql/include/sql_catalog.h
@@ -163,6 +163,7 @@ typedef int sqlid;
typedef struct sql_base {
int wtime;
int rtime;
+ int allocated;
int flag;
sqlid id;
char *name;
diff --git a/sql/server/rel_psm.c b/sql/server/rel_psm.c
--- a/sql/server/rel_psm.c
+++ b/sql/server/rel_psm.c
@@ -698,7 +698,7 @@ rel_create_func(mvc *sql, dlist *qname,
char *F = is_aggr?"AGGREGATE":(is_func?"FUNCTION":"PROCEDURE");
char *KF = type==F_FILT?"FILTER ": type==F_UNION?"UNION ": "";
- if (STORE_READONLY(active_store_type) && create)
+ if (STORE_READONLY && create)
return sql_error(sql, 06, "schema statements cannot be executed
on a readonly database.");
if (sname && !(s = mvc_bind_schema(sql, sname)))
@@ -1079,7 +1079,7 @@ rel_psm(mvc *sql, symbol *s)
dlist *l = s->data.lval;
int type = l->h->next->next->next->next->data.i_val;
_______________________________________________
checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list