Changeset: 96086b42a1fc for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/96086b42a1fc Modified Files: gdk/gdk.h sql/storage/bat/bat_storage.c Branch: default Log Message:
Merged with Jan2022 diffs (199 lines): diff --git a/gdk/gdk.h b/gdk/gdk.h --- a/gdk/gdk.h +++ b/gdk/gdk.h @@ -879,6 +879,10 @@ gdk_export size_t HEAPmemsize(Heap *h); gdk_export void HEAPdecref(Heap *h, bool remove); gdk_export void HEAPincref(Heap *h); +#define isVIEW(x) \ + (((x)->theap && (x)->theap->parentid != (x)->batCacheid) || \ + ((x)->tvheap && (x)->tvheap->parentid != (x)->batCacheid)) + /* BAT iterator, also protects use of BAT heaps with reference counts. * * A BAT iterator has to be used with caution, but it does have to be @@ -942,6 +946,7 @@ bat_iterator_nolock(BAT *b) { /* does not get matched by bat_iterator_end */ if (b) { + bool isview = isVIEW(b); return (BATiter) { .b = b, .h = b->theap, @@ -959,8 +964,8 @@ bat_iterator_nolock(BAT *b) (size_t) b->batCount << b->tshift : 0, .vhfree = b->tvheap ? b->tvheap->free : 0, - .minpos = b->tminpos, - .maxpos = b->tmaxpos, + .minpos = isview ? BUN_NONE : b->tminpos, + .maxpos = isview ? BUN_NONE : b->tmaxpos, .unique_est = b->tunique_est, #ifndef NDEBUG .locked = false, @@ -2153,13 +2158,6 @@ gdk_export void VIEWbounds(BAT *b, BAT * } \ } while (false) -/* the parentid in a VIEW is correct for the normal view. We must - * correct for the reversed view. - */ -#define isVIEW(x) \ - (((x)->theap && (x)->theap->parentid != (x)->batCacheid) || \ - ((x)->tvheap && (x)->tvheap->parentid != (x)->batCacheid)) - #define VIEWtparent(x) ((x)->theap == NULL || (x)->theap->parentid == (x)->batCacheid ? 0 : (x)->theap->parentid) #define VIEWvtparent(x) ((x)->tvheap == NULL || (x)->tvheap->parentid == (x)->batCacheid ? 0 : (x)->tvheap->parentid) diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c --- a/gdk/gdk_batop.c +++ b/gdk/gdk_batop.c @@ -1455,7 +1455,7 @@ BATappend_or_update(BAT *b, BAT *p, cons } } } else { - for (BUN i = 0, j = ni.count; i < j; i++) { + for (BUN i = 0; i < ni.count; i++) { oid updid; if (positions) { /* assert(!autoincr) */ @@ -1475,7 +1475,7 @@ BATappend_or_update(BAT *b, BAT *p, cons goto bailout; } - const void *new = BUNtail(ni, i); + const void *new = BUNtloc(ni, i); if (updid >= BATcount(b)) { assert(mayappend); diff --git a/sql/backends/monet5/sql_statistics.c b/sql/backends/monet5/sql_statistics.c --- a/sql/backends/monet5/sql_statistics.c +++ b/sql/backends/monet5/sql_statistics.c @@ -309,6 +309,14 @@ sql_statistics(Client cntxt, MalBlkPtr m msg = createException(SQL, "sql.statistics", SQLSTATE(HY005) "Cannot access column descriptor"); goto bailout; } + if (isVIEW(re)) { /* If it is a view get the parent BAT */ + BAT *nb = BBP_cache(VIEWtparent(re)); + BBPunfix(re->batCacheid); + if (!(re = BATdescriptor(nb->batCacheid))) { + msg = createException(SQL, "sql.statistics", SQLSTATE(HY005) "Cannot access column descriptor"); + goto bailout; + } + } issorted = BATtordered(qd) && BATtordered(re); isrevsorted = BATtrevordered(qd) && BATtrevordered(re); hnils = !re->tnonil || re->tnil; @@ -343,9 +351,19 @@ sql_statistics(Client cntxt, MalBlkPtr m if (pos->tminpos != BUN_NONE || pos->tmaxpos != BUN_NONE) { if (dict) { fb = re; - } else if (!(fb = store->storage_api.bind_col(tr, c, RDONLY))) { - msg = createException(SQL, "sql.statistics", SQLSTATE(HY005) "Cannot access column descriptor"); - goto bailout; + } else { + if (!(fb = store->storage_api.bind_col(tr, c, RDONLY))) { + msg = createException(SQL, "sql.statistics", SQLSTATE(HY005) "Cannot access column descriptor"); + goto bailout; + } + if (isVIEW(fb)) { /* If it is a view get the parent BAT */ + BAT *nb = BBP_cache(VIEWtparent(fb)); + BBPunfix(fb->batCacheid); + if (!(fb = BATdescriptor(nb->batCacheid))) { + msg = createException(SQL, "sql.statistics", SQLSTATE(HY005) "Cannot access column descriptor"); + goto bailout; + } + } } ssize_t (*tostr)(str*,size_t*,const void*,bool) = BATatoms[fb->ttype].atomToStr; 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 @@ -2168,11 +2168,17 @@ append_col_execute(sql_trans *tr, sql_de } static int -append_col(sql_trans *tr, sql_column *c, BUN offset, BAT *offsets, void *i, BUN cnt, int tpe) +append_col(sql_trans *tr, sql_column *c, BUN offset, BAT *offsets, void *data, BUN cnt, int tpe) { int res = LOG_OK; sql_delta *delta, *odelta = ATOMIC_PTR_GET(&c->data); + if (tpe == TYPE_bat) { + BAT *t = data; + if (!BATcount(t)) + return LOG_OK; + } + if ((delta = bind_col_data(tr, c, NULL)) == NULL) return LOG_ERR; @@ -2183,7 +2189,7 @@ append_col(sql_trans *tr, sql_column *c, trans_add(tr, &c->base, delta, &tc_gc_col, &commit_update_col, isTempTable(c->t)?NULL:&log_update_col); odelta = delta; - if ((res = append_col_execute(tr, &delta, c->base.id, offset, offsets, i, cnt, tpe, c->storage_type)) != LOG_OK) + if ((res = append_col_execute(tr, &delta, c->base.id, offset, offsets, data, cnt, tpe, c->storage_type)) != LOG_OK) return res; if (odelta != delta) { delta->next = odelta; @@ -2199,11 +2205,17 @@ append_col(sql_trans *tr, sql_column *c, } static int -append_idx(sql_trans *tr, sql_idx * i, BUN offset, BAT *offsets, void *data, BUN cnt, int tpe) +append_idx(sql_trans *tr, sql_idx *i, BUN offset, BAT *offsets, void *data, BUN cnt, int tpe) { int res = LOG_OK; sql_delta *delta, *odelta = ATOMIC_PTR_GET(&i->data); + if (tpe == TYPE_bat) { + BAT *t = data; + if (!BATcount(t)) + return LOG_OK; + } + if ((delta = bind_idx_data(tr, i, NULL)) == NULL) return LOG_ERR; @@ -3515,16 +3527,17 @@ clear_del(sql_trans *tr, sql_table *t, i static BUN clear_table(sql_trans *tr, sql_table *t) { - int in_transaction = segments_in_transaction(tr, t); - int clear = !in_transaction || isTempTable(t); - node *n = ol_first_node(t->columns); sql_column *c = n->data; storage *d = tab_timestamp_storage(tr, t); + int in_transaction, clear; + BUN sz, clear_ok; if (!d) return BUN_NONE; - BUN sz = count_col(tr, c, CNT_ACTIVE), clear_ok; + in_transaction = segments_in_transaction(tr, t); + clear = !in_transaction || isTempTable(t); + sz = count_col(tr, c, CNT_ACTIVE); if ((clear_ok = clear_del(tr, t, in_transaction)) >= BUN_NONE - 1) return clear_ok; diff --git a/sql/test/SQLancer/Tests/sqlancer20.SQL.py b/sql/test/SQLancer/Tests/sqlancer20.SQL.py --- a/sql/test/SQLancer/Tests/sqlancer20.SQL.py +++ b/sql/test/SQLancer/Tests/sqlancer20.SQL.py @@ -45,3 +45,14 @@ with SQLTestCase() as cli: DROP TABLE mct21; DROP TABLE mt2; COMMIT;""").assertSucceeded() + +# testing temporary tables +with SQLTestCase() as mdb1: + mdb1.connect(username="monetdb", password="monetdb") + mdb1.execute("CREATE GLOBAL TEMPORARY TABLE tt2(c0 JSON, c1 DATE) ON COMMIT PRESERVE ROWS;").assertSucceeded() + mdb1.execute("INSERT INTO tmp.tt2(c1, c0) VALUES(DATE '2010-10-10', JSON 'true');").assertSucceeded() + +with SQLTestCase() as mdb2: + mdb2.connect(username="monetdb", password="monetdb") + mdb2.execute("TRUNCATE TABLE tmp.tt2;").assertSucceeded() + mdb2.execute("DROP TABLE tmp.tt2;").assertSucceeded() _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list