Changeset: 3d793237dbd3 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/3d793237dbd3
Modified Files:
        clients/Tests/MAL-signatures.stable.out
        clients/Tests/MAL-signatures.stable.out.int128
        clients/Tests/exports.stable.out
        sql/backends/monet5/sql.c
        sql/storage/bat/bat_storage.c
        sql/storage/bat/bat_table.c
        sql/storage/sql_storage.h
        sql/storage/store.c
Branch: iso
Log Message:

Merged with Jul2021


diffs (truncated from 1806 to 300 lines):

diff --git a/clients/Tests/MAL-signatures.stable.out 
b/clients/Tests/MAL-signatures.stable.out
--- a/clients/Tests/MAL-signatures.stable.out
+++ b/clients/Tests/MAL-signatures.stable.out
@@ -9209,7 +9209,7 @@ stdout of test 'MAL-signatures` in direc
 [ "sql",       "analyze",      "unsafe pattern sql.analyze(X_0:int, X_1:lng, 
X_2:str, X_3:str):void ", "sql_analyze;", ""      ]
 [ "sql",       "analyze",      "unsafe pattern sql.analyze(X_0:int, X_1:lng, 
X_2:str, X_3:str, X_4:str):void ",        "sql_analyze;", ""      ]
 [ "sql",       "any",  "pattern sql.any(X_0:bit, X_1:bit, X_2:bit):bit ",      
"SQLany_cmp;",  ""      ]
-[ "sql",       "append",       "pattern sql.append(X_0:int, X_1:str, X_2:str, 
X_3:str, X_4:bat[:oid], X_5:any):int ",  "mvc_append_wrap;",     ""      ]
+[ "sql",       "append",       "pattern sql.append(X_0:int, X_1:str, X_2:str, 
X_3:str, X_4:oid, X_5:bat[:oid], X_6:any):int ", "mvc_append_wrap;",     ""     
 ]
 [ "sql",       "argRecord",    "pattern sql.argRecord():str ", 
"SQLargRecord;",        ""      ]
 [ "sql",       "argRecord",    "pattern sql.argRecord(X_0:any...):str ",       
"SQLargRecord;",        ""      ]
 [ "sql",       "assert",       "pattern sql.assert(X_0:bit, X_1:str):void ",   
"SQLassert;",   ""      ]
@@ -9233,7 +9233,7 @@ stdout of test 'MAL-signatures` in direc
 [ "sql",       "bind_idxbat",  "pattern sql.bind_idxbat(X_0:int, X_1:str, 
X_2:str, X_3:str, X_4:int):bat[:any_1] ",    "mvc_bind_idxbat_wrap;",        "" 
     ]
 [ "sql",       "bind_idxbat",  "pattern sql.bind_idxbat(X_0:int, X_1:str, 
X_2:str, X_3:str, X_4:int, X_5:int, X_6:int) (X_7:bat[:oid], X_8:bat[:any_1]) 
",     "mvc_bind_idxbat_wrap;",        ""      ]
 [ "sql",       "bind_idxbat",  "pattern sql.bind_idxbat(X_0:int, X_1:str, 
X_2:str, X_3:str, X_4:int, X_5:int, X_6:int):bat[:any_1] ",  
"mvc_bind_idxbat_wrap;",        ""      ]
-[ "sql",       "claim",        "unsafe pattern sql.claim(X_0:int, X_1:str, 
X_2:str, X_3:lng):bat[:oid] ",      "mvc_claim_wrap;",      ""      ]
+[ "sql",       "claim",        "unsafe pattern sql.claim(X_0:int, X_1:str, 
X_2:str, X_3:lng) (X_4:oid, X_5:bat[:oid]) ",       "mvc_claim_wrap;",      ""  
    ]
 [ "sql",       "clear_table",  "unsafe pattern sql.clear_table(X_0:str, 
X_1:str):lng ",        "mvc_clear_table_wrap;",        ""      ]
 [ "sql",       "commit",       "unsafe pattern sql.commit():void ",    
"SQLcommit;",   ""      ]
 [ "sql",       "copy_from",    "unsafe pattern sql.copy_from(X_0:ptr, X_1:str, 
X_2:str, X_3:str, X_4:str, X_5:str, X_6:lng, X_7:lng, X_8:int, X_9:str, 
X_10:int, X_11:int):bat[:any]... ",     "mvc_import_table_wrap;",       ""      
]
@@ -9687,7 +9687,7 @@ stdout of test 'MAL-signatures` in direc
 [ "wlr",       "alter_set_table",      "pattern wlr.alter_set_table(X_0:str, 
X_1:str, X_2:int):void ", "WLRgeneric;",  ""      ]
 [ "wlr",       "alter_table",  "pattern wlr.alter_table(X_0:str, X_1:str, 
X_2:int):void ",     "WLRgeneric;",  ""      ]
 [ "wlr",       "alter_user",   "pattern wlr.alter_user(X_0:str, X_1:str, 
X_2:int, X_3:str, X_4:str):void ",    "WLRgeneric;",  ""      ]
-[ "wlr",       "append",       "pattern wlr.append(X_0:str, X_1:str, X_2:str, 
X_3:any...):int ",       "WLRappend;",   ""      ]
+[ "wlr",       "append",       "pattern wlr.append(X_0:str, X_1:str, X_2:str, 
X_3:oid, X_4:bat[:oid], X_5:any...):int ",       "WLRappend;",   ""      ]
 [ "wlr",       "catalog",      "pattern wlr.catalog(X_0:str):void ",   
"WLRcatalog;",  ""      ]
 [ "wlr",       "clear_table",  "pattern wlr.clear_table(X_0:str, X_1:str):int 
",       "WLRclear_table;",      ""      ]
 [ "wlr",       "comment_on",   "pattern wlr.comment_on(X_0:int, X_1:str):void 
",       "WLRgeneric;",  ""      ]
diff --git a/clients/Tests/MAL-signatures.stable.out.int128 
b/clients/Tests/MAL-signatures.stable.out.int128
--- a/clients/Tests/MAL-signatures.stable.out.int128
+++ b/clients/Tests/MAL-signatures.stable.out.int128
@@ -12510,7 +12510,7 @@ stdout of test 'MAL-signatures` in direc
 [ "sql",       "analyze",      "unsafe pattern sql.analyze(X_0:int, X_1:lng, 
X_2:str, X_3:str):void ", "sql_analyze;", ""      ]
 [ "sql",       "analyze",      "unsafe pattern sql.analyze(X_0:int, X_1:lng, 
X_2:str, X_3:str, X_4:str):void ",        "sql_analyze;", ""      ]
 [ "sql",       "any",  "pattern sql.any(X_0:bit, X_1:bit, X_2:bit):bit ",      
"SQLany_cmp;",  ""      ]
-[ "sql",       "append",       "pattern sql.append(X_0:int, X_1:str, X_2:str, 
X_3:str, X_4:bat[:oid], X_5:any):int ",  "mvc_append_wrap;",     ""      ]
+[ "sql",       "append",       "pattern sql.append(X_0:int, X_1:str, X_2:str, 
X_3:str, X_4:oid, X_5:bat[:oid], X_6:any):int ", "mvc_append_wrap;",     ""     
 ]
 [ "sql",       "argRecord",    "pattern sql.argRecord():str ", 
"SQLargRecord;",        ""      ]
 [ "sql",       "argRecord",    "pattern sql.argRecord(X_0:any...):str ",       
"SQLargRecord;",        ""      ]
 [ "sql",       "assert",       "pattern sql.assert(X_0:bit, X_1:str):void ",   
"SQLassert;",   ""      ]
@@ -12536,7 +12536,7 @@ stdout of test 'MAL-signatures` in direc
 [ "sql",       "bind_idxbat",  "pattern sql.bind_idxbat(X_0:int, X_1:str, 
X_2:str, X_3:str, X_4:int):bat[:any_1] ",    "mvc_bind_idxbat_wrap;",        "" 
     ]
 [ "sql",       "bind_idxbat",  "pattern sql.bind_idxbat(X_0:int, X_1:str, 
X_2:str, X_3:str, X_4:int, X_5:int, X_6:int) (X_7:bat[:oid], X_8:bat[:any_1]) 
",     "mvc_bind_idxbat_wrap;",        ""      ]
 [ "sql",       "bind_idxbat",  "pattern sql.bind_idxbat(X_0:int, X_1:str, 
X_2:str, X_3:str, X_4:int, X_5:int, X_6:int):bat[:any_1] ",  
"mvc_bind_idxbat_wrap;",        ""      ]
-[ "sql",       "claim",        "unsafe pattern sql.claim(X_0:int, X_1:str, 
X_2:str, X_3:lng):bat[:oid] ",      "mvc_claim_wrap;",      ""      ]
+[ "sql",       "claim",        "unsafe pattern sql.claim(X_0:int, X_1:str, 
X_2:str, X_3:lng) (X_4:oid, X_5:bat[:oid]) ",       "mvc_claim_wrap;",      ""  
    ]
 [ "sql",       "clear_table",  "unsafe pattern sql.clear_table(X_0:str, 
X_1:str):lng ",        "mvc_clear_table_wrap;",        ""      ]
 [ "sql",       "commit",       "unsafe pattern sql.commit():void ",    
"SQLcommit;",   ""      ]
 [ "sql",       "copy_from",    "unsafe pattern sql.copy_from(X_0:ptr, X_1:str, 
X_2:str, X_3:str, X_4:str, X_5:str, X_6:lng, X_7:lng, X_8:int, X_9:str, 
X_10:int, X_11:int):bat[:any]... ",     "mvc_import_table_wrap;",       ""      
]
@@ -13010,7 +13010,7 @@ stdout of test 'MAL-signatures` in direc
 [ "wlr",       "alter_set_table",      "pattern wlr.alter_set_table(X_0:str, 
X_1:str, X_2:int):void ", "WLRgeneric;",  ""      ]
 [ "wlr",       "alter_table",  "pattern wlr.alter_table(X_0:str, X_1:str, 
X_2:int):void ",     "WLRgeneric;",  ""      ]
 [ "wlr",       "alter_user",   "pattern wlr.alter_user(X_0:str, X_1:str, 
X_2:int, X_3:str, X_4:str):void ",    "WLRgeneric;",  ""      ]
-[ "wlr",       "append",       "pattern wlr.append(X_0:str, X_1:str, X_2:str, 
X_3:any...):int ",       "WLRappend;",   ""      ]
+[ "wlr",       "append",       "pattern wlr.append(X_0:str, X_1:str, X_2:str, 
X_3:oid, X_4:bat[:oid], X_5:any...):int ",       "WLRappend;",   ""      ]
 [ "wlr",       "catalog",      "pattern wlr.catalog(X_0:str):void ",   
"WLRcatalog;",  ""      ]
 [ "wlr",       "clear_table",  "pattern wlr.clear_table(X_0:str, X_1:str):int 
",       "WLRclear_table;",      ""      ]
 [ "wlr",       "comment_on",   "pattern wlr.comment_on(X_0:int, X_1:str):void 
",       "WLRgeneric;",  ""      ]
diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -181,6 +181,7 @@ BAT *BATproject2(BAT *restrict l, BAT *r
 BAT *BATprojectchain(BAT **bats);
 gdk_return BATrangejoin(BAT **r1p, BAT **r2p, BAT *l, BAT *rl, BAT *rh, BAT 
*sl, BAT *sr, bool li, bool hi, bool anti, bool symmetric, BUN estimate) 
__attribute__((__warn_unused_result__));
 gdk_return BATreplace(BAT *b, BAT *p, BAT *n, bool force) 
__attribute__((__warn_unused_result__));
+gdk_return BATreplacepos(BAT *b, const oid *positions, BAT *n, bool autoincr, 
bool force) __attribute__((__warn_unused_result__));
 gdk_return BATroles(BAT *b, const char *tnme);
 BAT *BATsample(BAT *b, BUN n);
 BAT *BATsample_with_seed(BAT *b, BUN n, uint64_t seed);
@@ -204,6 +205,7 @@ void BATundo(BAT *b);
 BAT *BATunique(BAT *b, BAT *s);
 BAT *BATunmask(BAT *b);
 gdk_return BATupdate(BAT *b, BAT *p, BAT *n, bool force) 
__attribute__((__warn_unused_result__));
+gdk_return BATupdatepos(BAT *b, const oid *positions, BAT *n, bool autoincr, 
bool force) __attribute__((__warn_unused_result__));
 BBPrec *BBP[N_BBPINIT];
 gdk_return BBPaddfarm(const char *dirname, uint32_t rolemask, bool logerror);
 void BBPclear(bat bid);
@@ -541,7 +543,8 @@ gdk_return log_bat_transient(logger *lg,
 gdk_return log_constant(logger *lg, int type, ptr val, log_id id, lng offset, 
lng cnt);
 gdk_return log_delta(logger *lg, BAT *uid, BAT *uval, log_id id);
 gdk_return log_sequence(logger *lg, int seq, lng id);
-gdk_return log_tend(logger *lg, ulng commit_ts);
+gdk_return log_tdone(logger *lg, ulng commit_ts);
+gdk_return log_tend(logger *lg);
 gdk_return log_tstart(logger *lg, bool flush);
 gdk_return logger_activate(logger *lg);
 lng logger_changes(logger *lg);
diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -1091,6 +1091,10 @@ gdk_export gdk_return BATreplace(BAT *b,
        __attribute__((__warn_unused_result__));
 gdk_export gdk_return BATupdate(BAT *b, BAT *p, BAT *n, bool force)
        __attribute__((__warn_unused_result__));
+gdk_export gdk_return BATreplacepos(BAT *b, const oid *positions, BAT *n, bool 
autoincr, bool force)
+       __attribute__((__warn_unused_result__));
+gdk_export gdk_return BATupdatepos(BAT *b, const oid *positions, BAT *n, bool 
autoincr, bool force)
+       __attribute__((__warn_unused_result__));
 
 /* Functions to perform a binary search on a sorted BAT.
  * See gdk_search.c for details. */
diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -556,7 +556,7 @@ BATextend(BAT *b, BUN newcap)
                          b->theap->filename, b->theap->size, theap_size);
                MT_lock_set(&b->theaplock);
                if (ATOMIC_GET(&b->theap->refs) == 1) {
-                       rc = HEAPextend(b->theap, theap_size, true);
+                       rc = HEAPextend(b->theap, theap_size, b->batRestricted 
== BAT_READ);
                } else {
                        MT_lock_unset(&b->theaplock);
                        Heap *h = HEAPgrow(b->theap, theap_size);
@@ -1159,7 +1159,8 @@ setcolprops(BAT *b, const void *x)
 
 /* Append an array of values of length count to the bat.  For
  * fixed-sized values, `values' is an array of values, for
- * variable-sized values, `values' is an array of pointers to values. */
+ * variable-sized values, `values' is an array of pointers to values.
+ * If values equals NULL, count times nil will be appended. */
 gdk_return
 BUNappendmulti(BAT *b, const void *values, BUN count, bool force)
 {
@@ -1183,18 +1184,20 @@ BUNappendmulti(BAT *b, const void *value
 
        if (b->ttype == TYPE_void && BATtdense(b)) {
                const oid *ovals = values;
-               bool dense = b->batCount == 0 || b->tseqbase + 1 == ovals[0];
-               for (BUN i = 1; dense && i < count; i++) {
-                       dense = ovals[i - 1] + 1 == ovals[i];
+               bool dense = b->batCount == 0 || (ovals != NULL && b->tseqbase 
+ 1 == ovals[0]);
+               if (ovals) {
+                       for (BUN i = 1; dense && i < count; i++) {
+                               dense = ovals[i - 1] + 1 == ovals[i];
+                       }
                }
                if (dense) {
                        if (b->batCount == 0)
-                               b->tseqbase = ovals[0];
+                               b->tseqbase = ovals ? ovals[0] : oid_nil;
                        BATsetcount(b, BATcount(b) + count);
                        return GDK_SUCCEED;
                } else {
                        /* we need to materialize b; allocate enough capacity */
-                       b->batCapacity = BATcount(b) + 1;
+                       b->batCapacity = BATcount(b) + count;
                        if (BATmaterialize(b) != GDK_SUCCEED)
                                return GDK_FAIL;
                }
@@ -1220,9 +1223,12 @@ BUNappendmulti(BAT *b, const void *value
        BATrmprop(b, GDK_UNIQUE_ESTIMATE);
        b->theap->dirty |= count > 0;
        MT_rwlock_wrlock(&b->thashlock);
+       const void *t = b->ttype == TYPE_msk ? &(msk){false} : 
ATOMnilptr(b->ttype);
        for (BUN i = 0; i < count; i++) {
-               void *t = b->ttype && b->tvarsized ? ((void **) values)[i] :
-                       (void *) ((char *) values + i * Tsize(b));
+               if (values) {
+                       t = b->ttype && b->tvarsized ? ((void **) values)[i] :
+                               (void *) ((char *) values + i * Tsize(b));
+               }
                setcolprops(b, t);
                gdk_return rc = bunfastapp_nocheck(b, p, t, Tsize(b));
                if (rc != GDK_SUCCEED) {
diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c
--- a/gdk/gdk_batop.c
+++ b/gdk/gdk_batop.c
@@ -56,7 +56,7 @@ unshare_varsized_heap(BAT *b)
  * of inserting individual strings.  See the comments in the code for
  * more information. */
 static gdk_return
-insert_string_bat(BAT *b, BAT *n, struct canditer *ci, bool mayshare)
+insert_string_bat(BAT *b, BAT *n, struct canditer *ci, bool force, bool 
mayshare)
 {
        BATiter ni;             /* iterator */
        size_t toff = ~(size_t) 0;      /* tail offset */
@@ -147,14 +147,24 @@ insert_string_bat(BAT *b, BAT *n, struct
                                (var_t) 1 << 17;
                        MT_thread_setalgorithm("copy vheap, copy heap");
                        if (b->tvheap->size < ni.vh->free) {
-                               Heap *h = HEAPgrow(b->tvheap, ni.vh->free);
-                               if (h == NULL) {
-                                       bat_iterator_end(&ni);
-                                       return GDK_FAIL;
+                               MT_lock_set(&b->theaplock);
+                               if (ATOMIC_GET(&b->tvheap->refs) == 1) {
+                                       if (HEAPextend(b->tvheap, ni.vh->free, 
force) != GDK_SUCCEED) {
+                                               MT_lock_unset(&b->theaplock);
+                                               bat_iterator_end(&ni);
+                                               return GDK_FAIL;
+                                       }
+                               } else {
+                                       MT_lock_unset(&b->theaplock);
+                                       Heap *h = HEAPgrow(b->tvheap, 
ni.vh->free);
+                                       if (h == NULL) {
+                                               bat_iterator_end(&ni);
+                                               return GDK_FAIL;
+                                       }
+                                       MT_lock_set(&b->theaplock);
+                                       HEAPdecref(b->tvheap, false);
+                                       b->tvheap = h;
                                }
-                               MT_lock_set(&b->theaplock);
-                               HEAPdecref(b->tvheap, false);
-                               b->tvheap = h;
                                MT_lock_unset(&b->theaplock);
                        }
                        memcpy(b->tvheap->base, ni.vh->base, ni.vh->free);
@@ -200,14 +210,24 @@ insert_string_bat(BAT *b, BAT *n, struct
                                toff = (toff + GDK_VARALIGN - 1) & 
~(GDK_VARALIGN - 1);
                                /* if in "force" mode, the heap may be
                                 * shared when memory mapped */
-                               Heap *h = HEAPgrow(b->tvheap, toff + 
ni.vh->size);
-                               if (h == NULL) {
-                                       bat_iterator_end(&ni);
-                                       return GDK_FAIL;
+                               MT_lock_set(&b->theaplock);
+                               if (ATOMIC_GET(&b->tvheap->refs) == 1) {
+                                       if (HEAPextend(b->tvheap, toff + 
ni.vh->size, force) != GDK_SUCCEED) {
+                                               MT_lock_unset(&b->theaplock);
+                                               bat_iterator_end(&ni);
+                                               return GDK_FAIL;
+                                       }
+                               } else {
+                                       MT_lock_unset(&b->theaplock);
+                                       Heap *h = HEAPgrow(b->tvheap, toff + 
ni.vh->size);
+                                       if (h == NULL) {
+                                               bat_iterator_end(&ni);
+                                               return GDK_FAIL;
+                                       }
+                                       MT_lock_set(&b->theaplock);
+                                       HEAPdecref(b->tvheap, false);
+                                       b->tvheap = h;
                                }
-                               MT_lock_set(&b->theaplock);
-                               HEAPdecref(b->tvheap, false);
-                               b->tvheap = h;
                                MT_lock_unset(&b->theaplock);
                                MT_thread_setalgorithm("append vheap");
                                memcpy(b->tvheap->base + toff, ni.vh->base, 
ni.vh->free);
@@ -896,7 +916,7 @@ BATappend2(BAT *b, BAT *n, BAT *s, bool 
                b->tnil |= n->tnil && cnt == ni.count;
        }
        if (b->ttype == TYPE_str) {
-               if (insert_string_bat(b, n, &ci, mayshare) != GDK_SUCCEED) {
+               if (insert_string_bat(b, n, &ci, force, mayshare) != 
GDK_SUCCEED) {
                        bat_iterator_end(&ni);
                        return GDK_FAIL;
                }
@@ -1123,24 +1143,48 @@ BATdel(BAT *b, BAT *d)
 }
 
 /*
- * The last in this series is a BATreplace, which replaces all the
- * buns mentioned.
+ * Replace all values in b with values from n whose location is given by
+ * the oid in either p or positions.
+ * If positions is used, autoincr specifies whether it is the first of a
+ * dense range of positions or whether it is a full-blown array of
+ * position.
+ * If mayappend is set, the position in p/positions may refer to
+ * locations beyond the end of b.
  */
 static gdk_return
-BATappend_or_update(BAT *b, BAT *p, BAT *n, bool mayappend, bool force)
+BATappend_or_update(BAT *b, BAT *p, const oid *positions, BAT *n,
+                   bool mayappend, bool autoincr, bool force)
 {
        lng t0 = GDKusec();
+       oid pos = oid_nil;
 
-       if (b == NULL || b->ttype == TYPE_void || p == NULL || n == NULL) {
+       if (b == NULL || b->ttype == TYPE_void || n == NULL) {
                return GDK_SUCCEED;
        }
-       if (BATcount(p) != BATcount(n)) {
-               GDKerror("update BATs not the same size\n");
-               return GDK_FAIL;
-       }
-       if (ATOMtype(p->ttype) != TYPE_oid) {
-               GDKerror("positions BAT not type OID\n");
-               return GDK_FAIL;
+       /* either p or positions */
+       assert((p == NULL) != (positions == NULL));
+       if (p != NULL) {
+               if (BATcount(p) != BATcount(n)) {
+                       GDKerror("update BATs not the same size\n");
+                       return GDK_FAIL;
+               }
+               if (ATOMtype(p->ttype) != TYPE_oid) {
+                       GDKerror("positions BAT not type OID\n");
+                       return GDK_FAIL;
+               }
+               if (BATtdense(p)) {
+                       pos = p->tseqbase;
+                       positions = &pos;
+                       autoincr = true;
+                       p = NULL;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to