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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list