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

Reply via email to