Changeset: 528ae3116446 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/528ae3116446
Modified Files:
        gdk/gdk_unique.c
Branch: string-dedup
Log Message:

Merge with default branch.


diffs (truncated from 6923 to 300 lines):

diff --git a/gdk/gdk_unique.c b/gdk/gdk_unique.c
--- a/gdk/gdk_unique.c
+++ b/gdk/gdk_unique.c
@@ -32,7 +32,6 @@ BATunique(BAT *b, BAT *s)
        const char *vars;
        int width;
        oid i, o;
-       uint16_t *seen = NULL;
        const char *nme;
        Hash *hs = NULL;
        BUN hb;
@@ -42,7 +41,6 @@ BATunique(BAT *b, BAT *s)
        const char *algomsg = "";
        lng t0 = 0;
 
-       size_t counter = 0;
        lng timeoffset = 0;
        QryCtx *qry_ctx = MT_thread_get_qry_ctx();
        if (qry_ctx != NULL) {
@@ -108,35 +106,19 @@ BATunique(BAT *b, BAT *s)
        width = bi.width;
        cmp = ATOMcompare(b->ttype);
 
-       if (BATordered(b) || BATordered_rev(b)) {
-               const void *prev = NULL;
-               algomsg = "unique: sorted";
-               for (i = 0; i < cnt; i++) {
-                       GDK_CHECK_TIMEOUT(timeoffset, counter,
-                                       
GOTO_LABEL_TIMEOUT_HANDLER(bunins_failed));
-                       o = canditer_next(&ci);
-                       v = VALUE(o - b->hseqbase);
-                       if (prev == NULL || (*cmp)(v, prev) != 0) {
-                               if (bunfastappTYPE(oid, bn, &o) != GDK_SUCCEED)
-                                       goto bunins_failed;
-                       }
-                       prev = v;
-               }
-       } else if (ATOMbasetype(b->ttype) == TYPE_bte) {
-               unsigned char val;
+       if (ATOMbasetype(b->ttype) == TYPE_bte ||
+           (b->twidth == 1 && ATOMstorage(b->ttype) == TYPE_str)) {
+               uint8_t val;
 
                algomsg = "unique: byte-sized atoms";
-               assert(vars == NULL);
-               seen = GDKzalloc((256 / 16) * sizeof(seen[0]));
-               if (seen == NULL)
-                       goto bunins_failed;
-               for (i = 0; i < cnt; i++) {
-                       GDK_CHECK_TIMEOUT(timeoffset, counter,
-                                       
GOTO_LABEL_TIMEOUT_HANDLER(bunins_failed));
+               uint32_t seen[256 >> 5];
+               memset(seen, 0, sizeof(seen));
+               TIMEOUT_LOOP_IDX(i, cnt, timeoffset) {
                        o = canditer_next(&ci);
-                       val = ((const unsigned char *) vals)[o - b->hseqbase];
-                       if (!(seen[val >> 4] & (1U << (val & 0xF)))) {
-                               seen[val >> 4] |= 1U << (val & 0xF);
+                       val = ((const uint8_t *) vals)[o - b->hseqbase];
+                       uint32_t m = UINT32_C(1) << (val & 0x1F);
+                       if (!(seen[val >> 5] & m)) {
+                               seen[val >> 5] |= m;
                                if (bunfastappTYPE(oid, bn, &o) != GDK_SUCCEED)
                                        goto bunins_failed;
                                if (bn->batCount == 256) {
@@ -146,23 +128,21 @@ BATunique(BAT *b, BAT *s)
                                }
                        }
                }
-               GDKfree(seen);
-               seen = NULL;
-       } else if (ATOMbasetype(b->ttype) == TYPE_sht) {
-               unsigned short val;
+               TIMEOUT_CHECK(timeoffset,
+                             GOTO_LABEL_TIMEOUT_HANDLER(bunins_failed));
+       } else if (ATOMbasetype(b->ttype) == TYPE_sht ||
+           (b->twidth == 2 && ATOMstorage(b->ttype) == TYPE_str)) {
+               uint16_t val;
 
                algomsg = "unique: short-sized atoms";
-               assert(vars == NULL);
-               seen = GDKzalloc((65536 / 16) * sizeof(seen[0]));
-               if (seen == NULL)
-                       goto bunins_failed;
-               for (i = 0; i < cnt; i++) {
-                       GDK_CHECK_TIMEOUT(timeoffset, counter,
-                                       
GOTO_LABEL_TIMEOUT_HANDLER(bunins_failed));
+               uint32_t seen[65536 >> 5];
+               memset(seen, 0, sizeof(seen));
+               TIMEOUT_LOOP_IDX(i, cnt, timeoffset) {
                        o = canditer_next(&ci);
-                       val = ((const unsigned short *) vals)[o - b->hseqbase];
-                       if (!(seen[val >> 4] & (1U << (val & 0xF)))) {
-                               seen[val >> 4] |= 1U << (val & 0xF);
+                       val = ((const uint16_t *) vals)[o - b->hseqbase];
+                       uint32_t m = UINT32_C(1) << (val & 0x1F);
+                       if (!(seen[val >> 5] & m)) {
+                               seen[val >> 5] |= m;
                                if (bunfastappTYPE(oid, bn, &o) != GDK_SUCCEED)
                                        goto bunins_failed;
                                if (bn->batCount == 65536) {
@@ -172,8 +152,22 @@ BATunique(BAT *b, BAT *s)
                                }
                        }
                }
-               GDKfree(seen);
-               seen = NULL;
+               TIMEOUT_CHECK(timeoffset,
+                             GOTO_LABEL_TIMEOUT_HANDLER(bunins_failed));
+       } else if (BATordered(b) || BATordered_rev(b)) {
+               const void *prev = NULL;
+               algomsg = "unique: sorted";
+               TIMEOUT_LOOP_IDX(i, cnt, timeoffset) {
+                       o = canditer_next(&ci);
+                       v = VALUE(o - b->hseqbase);
+                       if (prev == NULL || (*cmp)(v, prev) != 0) {
+                               if (bunfastappTYPE(oid, bn, &o) != GDK_SUCCEED)
+                                       goto bunins_failed;
+                       }
+                       prev = v;
+               }
+               TIMEOUT_CHECK(timeoffset,
+                             GOTO_LABEL_TIMEOUT_HANDLER(bunins_failed));
        } else if (BATcheckhash(b) ||
                   (!b->batTransient &&
                    cnt == BATcount(b) &&
@@ -192,9 +186,7 @@ BATunique(BAT *b, BAT *s)
                        MT_rwlock_rdunlock(&b->thashlock);
                        goto lost_hash;
                }
-               for (i = 0; i < cnt; i++) {
-                       GDK_CHECK_TIMEOUT(timeoffset, counter,
-                                       
GOTO_LABEL_TIMEOUT_HANDLER(bunins_failed));
+               TIMEOUT_LOOP_IDX(i, cnt, timeoffset) {
                        BUN p;
 
                        o = canditer_next(&ci);
@@ -220,6 +212,8 @@ BATunique(BAT *b, BAT *s)
                        }
                }
                MT_rwlock_rdunlock(&b->thashlock);
+               TIMEOUT_CHECK(timeoffset,
+                             GOTO_LABEL_TIMEOUT_HANDLER(bunins_failed));
        } else {
                BUN prb;
                BUN p;
@@ -254,9 +248,7 @@ BATunique(BAT *b, BAT *s)
                        GDKerror("cannot allocate hash table\n");
                        goto bunins_failed;
                }
-               for (i = 0; i < cnt; i++) {
-                       GDK_CHECK_TIMEOUT(timeoffset, counter,
-                                       
GOTO_LABEL_TIMEOUT_HANDLER(bunins_failed));
+               TIMEOUT_LOOP_IDX(i, cnt, timeoffset) {
                        o = canditer_next(&ci);
                        v = VALUE(o - b->hseqbase);
                        prb = HASHprobe(hs, v);
@@ -278,6 +270,8 @@ BATunique(BAT *b, BAT *s)
                HEAPfree(&hs->heaplink, true);
                HEAPfree(&hs->heapbckt, true);
                GDKfree(hs);
+               TIMEOUT_CHECK(timeoffset,
+                             GOTO_LABEL_TIMEOUT_HANDLER(bunins_failed));
        }
        bat_iterator_end(&bi);
 
@@ -305,8 +299,6 @@ BATunique(BAT *b, BAT *s)
 
   bunins_failed:
        bat_iterator_end(&bi);
-       if (seen)
-               GDKfree(seen);
        if (hs != NULL) {
                HEAPfree(&hs->heaplink, true);
                HEAPfree(&hs->heapbckt, true);
diff --git a/monetdb5/mal/mal_profiler.c b/monetdb5/mal/mal_profiler.c
--- a/monetdb5/mal/mal_profiler.c
+++ b/monetdb5/mal/mal_profiler.c
@@ -65,14 +65,12 @@ static void logjsonInternal(char *logbuf
        size_t len;
        len = strlen(logbuffer);
 
-       MT_lock_set(&mal_profileLock);
        if (maleventstream) {
        // upon request the log record is sent over the profile stream
                (void) mnstr_write(maleventstream, logbuffer, 1, len);
                if (flush)
                        (void) mnstr_flush(maleventstream, MNSTR_FLUSH_DATA);
        }
-       MT_lock_unset(&mal_profileLock);
 }
 
 /*
@@ -475,11 +473,13 @@ static void
 renderProfilerEvent(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci, 
int start)
 {
        str ev;
+       MT_lock_set(&mal_profileLock);
        ev = prepareProfilerEvent(cntxt, mb, stk, pci, start);
        if( ev ){
                logjsonInternal(ev, true);
                free(ev);
        }
+       MT_lock_unset(&mal_profileLock);
 }
 
 /* the OS details on cpu load are read from /proc/stat
@@ -648,16 +648,19 @@ openProfilerStream(Client cntxt)
        getrusage(RUSAGE_SELF, &infoUsage);
        prevUsage = infoUsage;
 #endif
+       MT_lock_set(&mal_profileLock);
        if (myname == 0){
                myname = putName("profiler");
                logjsonInternal(monet_characteristics, true);
        }
        if(maleventstream){
                /* The DBA can always grab the stream, others have to wait */
-               if (cntxt->user == MAL_ADMIN)
+               if (cntxt->user == MAL_ADMIN) {
                        closeProfilerStream(cntxt);
-               else
+               } else {
+                       MT_lock_unset(&mal_profileLock);
                        throw(MAL,"profiler.start","Profiler already running, 
stream not available");
+               }
        }
        malProfileMode = -1;
        maleventstream = cntxt->fdout;
@@ -671,7 +674,6 @@ openProfilerStream(Client cntxt)
 
        MT_sleep_ms(200);
 
-       MT_lock_set(&mal_profileLock);
        for(j = 0; j <THREADS; j++){
                Client c = 0; MalBlkPtr m=0; MalStkPtr s = 0; InstrPtr p = 0;
                c = workingset[j].cntxt;
@@ -719,8 +721,8 @@ startProfiler(Client cntxt)
                myname = putName("profiler");
        }
        malProfileMode = 1;
+       logjsonInternal(monet_characteristics, true);
        MT_lock_unset(&mal_profileLock);
-       logjsonInternal(monet_characteristics, true);
        // reset the trace table
        clearTrace(cntxt);
 
diff --git a/sql/ChangeLog b/sql/ChangeLog
--- a/sql/ChangeLog
+++ b/sql/ChangeLog
@@ -6,13 +6,6 @@
   view sys.fkeys to provide user friendly querying of existing foreign
   keys and their ON UPDATE and ON DELETE referential action specifications.
 
-* Mon Oct 18 2021 Pedro Ferreira <[email protected]>
-- The COPY INTO command would use the double quote as the default string
-  delimiter to produce output, while COPY FROM would use the empty string.
-  As a consequence, this created incompatibility between the two commands
-  when using default values from the parser. As a solution, the COPY INTO
-  command changed to use the empty string as the default string delimiter.
-
 * Tue Oct 12 2021 Pedro Ferreira <[email protected]>
 - Many improvements were done for REMOTE table plans. As a consequence,
   master or slave servers from this feature release are not compatible
diff --git a/sql/backends/monet5/sql_statement.c 
b/sql/backends/monet5/sql_statement.c
--- a/sql/backends/monet5/sql_statement.c
+++ b/sql/backends/monet5/sql_statement.c
@@ -3962,7 +3962,8 @@ stmt_cond(backend *be, stmt *cond, stmt 
                        freeInstruction(q);
                        return NULL;
                }
-               s->flag = loop;
+               s->flag = be->mvc_var; /* keep the mvc_var of the outer context 
*/
+               s->loop = loop;
                s->op1 = cond;
                s->nr = getArg(q, 0);
                return s;
@@ -3979,7 +3980,7 @@ stmt_control_end(backend *be, stmt *cond
        if (cond->nr < 0)
                return NULL;
 
-       if (cond->flag) {       /* while */
+       if (cond->loop) {       /* while */
                /* redo barrier */
                q = newAssignment(mb);
                if (q == NULL)
@@ -3998,10 +3999,7 @@ stmt_control_end(backend *be, stmt *cond
                q->argc = q->retc = 1;
                q->barrier = EXITsymbol;
        }
-       q = newStmt(mb, sqlRef, mvcRef);
-       if (q == NULL)
-               return NULL;
-       be->mvc_var = getDestVar(q);
+       be->mvc_var = cond->flag; /* restore old mvc_var from before the 
barrier */
        stmt *s = stmt_create(be->mvc->sa, st_control_end);
        if(!s) {
                freeInstruction(q);
diff --git a/sql/backends/monet5/sql_statement.h 
b/sql/backends/monet5/sql_statement.h
--- a/sql/backends/monet5/sql_statement.h
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to