Changeset: c5115e90d569 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=c5115e90d569
Modified Files:
        gdk/gdk_group.c
        gdk/gdk_join.c
Branch: default
Log Message:

Merge with Oct2020 branch.


diffs (284 lines):

diff --git a/gdk/gdk_aggr.c b/gdk/gdk_aggr.c
--- a/gdk/gdk_aggr.c
+++ b/gdk/gdk_aggr.c
@@ -3487,6 +3487,7 @@ BATmin_skipnil(BAT *b, void *aggr, bit s
                        const oid *ords = (const oid *) (pb ? 
pb->torderidx->base : b->torderidx->base) + ORDERIDXOFF;
                        BUN r;
                        if (!b->tnonil) {
+                               MT_thread_setalgorithm(pb ? "binsearch on 
parent oidx" : "binsearch on oids");
                                r = binsearch(ords, 0, b->ttype, Tloc(b, 0),
                                              b->tvheap ? b->tvheap->base : 
NULL,
                                              b->twidth, 0, BATcount(b),
@@ -3502,6 +3503,7 @@ BATmin_skipnil(BAT *b, void *aggr, bit s
                                /* no non-nil values */
                                pos = oid_nil;
                        } else {
+                               MT_thread_setalgorithm(pb ? "using parent oidx" 
: "using oids");
                                pos = ords[r];
                        }
                } else if ((VIEWtparent(b) == 0 ||
@@ -3510,6 +3512,8 @@ BATmin_skipnil(BAT *b, void *aggr, bit s
                        Imprints *imprints = VIEWtparent(b) ? 
BBPdescriptor(VIEWtparent(b))->timprints : b->timprints;
                        int i;
 
+
+                       MT_thread_setalgorithm(VIEWtparent(b) ? "using parent 
imprints" : "using imprints");
                        pos = oid_nil;
                        /* find first non-empty bin */
                        for (i = 0; i < imprints->bits; i++) {
@@ -3591,6 +3595,7 @@ BATmax_skipnil(BAT *b, void *aggr, bit s
                     BATcheckorderidx(pb))) {
                        const oid *ords = (const oid *) (pb ? 
pb->torderidx->base : b->torderidx->base) + ORDERIDXOFF;
 
+                       MT_thread_setalgorithm(pb ? "using parent oidx" : 
"using oids");
                        pos = ords[BATcount(b) - 1];
                        /* nils are first, ie !skipnil, check for nils */
                        if (!skipnil) {
@@ -3608,6 +3613,7 @@ BATmax_skipnil(BAT *b, void *aggr, bit s
                        Imprints *imprints = VIEWtparent(b) ? 
BBPdescriptor(VIEWtparent(b))->timprints : b->timprints;
                        int i;
 
+                       MT_thread_setalgorithm(VIEWtparent(b) ? "using parent 
imprints" : "using imprints");
                        pos = oid_nil;
                        /* find last non-empty bin */
                        for (i = imprints->bits - 1; i >= 0; i--) {
@@ -3889,6 +3895,7 @@ doBATgroupquantile(BAT *b, BAT *g, BAT *
                     BATcount(pb) == BATcount(b) &&
                     pb->hseqbase == b->hseqbase &&
                     BATcheckorderidx(pb))) {
+                       MT_thread_setalgorithm(pb ? "using parent oidx" : 
"using oids");
                        ords = (const oid *) (pb ? pb->torderidx->base : 
b->torderidx->base) + ORDERIDXOFF;
                } else {
                        if (BATsort(NULL, &t1, NULL, b, NULL, g, false, false, 
false) != GDK_SUCCEED)
diff --git a/gdk/gdk_group.c b/gdk/gdk_group.c
--- a/gdk/gdk_group.c
+++ b/gdk/gdk_group.c
@@ -322,7 +322,7 @@
                INIT_0;                                                 \
                assert(grps == NULL);                                   \
                if (ci.tpe == cand_dense) {                             \
-                       MT_thread_setalgorithm("GRP_use_existing_hash_table, 
dense"); \
+                       MT_thread_setalgorithm(phash ? 
"GRP_use_existing_hash_table, dense, parent hash" : 
"GRP_use_existing_hash_table, dense"); \
                        for (r = 0; r < cnt; r++) {                     \
                                oid o = canditer_next_dense(&ci);       \
                                p = o - hseqb + lo;                     \
@@ -356,7 +356,7 @@
                                }                                       \
                        }                                               \
                } else {                                                \
-                       MT_thread_setalgorithm("GRP_use_existing_hash_table, 
!dense"); \
+                       MT_thread_setalgorithm(phash ? 
"GRP_use_existing_hash_table, !dense, parent hash" : 
"GRP_use_existing_hash_table, !dense"); \
                        for (r = 0; r < cnt; r++) {                     \
                                oid o = canditer_next(&ci);             \
                                p = o - hseqb + lo;                     \
@@ -992,6 +992,7 @@ BATgroup_internal(BAT **groups, BAT **ex
                 * since we may have to go through long lists of
                 * duplicates in the hash table to find an old
                 * group */
+               bool phash = false;
                algomsg = "existing hash -- ";
                if (b->thash == NULL && (parent = VIEWtparent(b)) != 0) {
                        /* b is a view on another bat (b2 for now).
@@ -1001,6 +1002,8 @@ BATgroup_internal(BAT **groups, BAT **ex
                        lo = (BUN) ((b->theap.base - b2->theap.base) >> 
b->tshift);
                        b = b2;
                        bi = bat_iterator(b);
+                       algomsg = "existing parent hash -- ";
+                       phash = true;
                }
                hs = b->thash;
                gn->tsorted = true; /* be optimistic */
diff --git a/gdk/gdk_join.c b/gdk/gdk_join.c
--- a/gdk/gdk_join.c
+++ b/gdk/gdk_join.c
@@ -2524,7 +2524,6 @@ hashjoin(BAT **r1p, BAT **r2p, BAT *l, B
        assert(!BATtvoid(r));
        assert(ATOMtype(l->ttype) == ATOMtype(r->ttype));
 
-       MT_thread_setalgorithm(__func__);
        int t = ATOMbasetype(r->ttype);
        if (r->ttype == TYPE_void || l->ttype == TYPE_void)
                t = TYPE_void;
@@ -2558,6 +2557,7 @@ hashjoin(BAT **r1p, BAT **r2p, BAT *l, B
        rh = canditer_last(rci) + 1 - r->hseqbase;
        if (phash) {
                /* there is a hash on the parent which we should use */
+               MT_thread_setalgorithm(swapped ? "hashjoin using parent hash 
(swapped)" : "hashjoin using parent hash");
                BAT *b = BBPdescriptor(VIEWtparent(r));
                TRC_DEBUG(ALGO, "%s(%s): using "
                          "parent(" ALGOBATFMT ") for hash%s\n",
@@ -2571,6 +2571,7 @@ hashjoin(BAT **r1p, BAT **r2p, BAT *l, B
                r = b;
        } else if (hash) {
                /* there is a hash on r which we should use */
+               MT_thread_setalgorithm(swapped ? "hashjoin using existing hash 
(swapped)" : "hashjoin using existing hash");
                hsh = r->thash;
                TRC_DEBUG(ALGO, ALGOBATFMT ": using "
                          "existing hash%s\n",
@@ -2581,6 +2582,7 @@ hashjoin(BAT **r1p, BAT **r2p, BAT *l, B
                 * candidate list */
                char ext[32];
                assert(rci->s);
+               MT_thread_setalgorithm(swapped ? "hashjoin using candidate hash 
(swapped)" : "hashjoin using candidate hash");
                TRC_DEBUG(ALGO, ALGOBATFMT ": creating "
                          "hash for candidate list " ALGOBATFMT "%s%s\n",
                          ALGOBATPAR(r), ALGOBATPAR(rci->s),
@@ -2595,6 +2597,7 @@ hashjoin(BAT **r1p, BAT **r2p, BAT *l, B
                hash_cand = true;
        } else {
                /* we need to create a hash on r */
+               MT_thread_setalgorithm(swapped ? "hashjoin using new hash 
(swapped)" : "hashjoin using new hash");
                TRC_DEBUG(ALGO, ALGOBATFMT ": creating hash%s\n",
                          ALGOBATPAR(r),
                          swapped ? " (swapped)" : "");
diff --git a/gdk/gdk_select.c b/gdk/gdk_select.c
--- a/gdk/gdk_select.c
+++ b/gdk/gdk_select.c
@@ -337,7 +337,7 @@ hashselect(BAT *b, struct canditer *rest
 #define bitswitch(ISDENSE, TEST, TYPE)                                 \
        do {                                                            \
                assert(imprints);                                       \
-               *algo = "imprints select " #TEST " (canditer_next" #ISDENSE 
")"; \
+               *algo = parent ? "parent imprints select " #TEST " 
(canditer_next" #ISDENSE ")" : "imprints select " #TEST " (canditer_next" 
#ISDENSE ")"; \
                switch (imprints->bits) {                               \
                case 8:  checkMINMAX(8, TYPE); impsmask(ISDENSE,TEST,8); break; 
\
                case 16: checkMINMAX(16, TYPE); impsmask(ISDENSE,TEST,16); 
break; \
@@ -457,6 +457,7 @@ NAME##_##TYPE(BAT *b, struct canditer *r
        BUN p;                                                          \
        BUN pr_off = 0;                                                 \
        Imprints *imprints;                                             \
+       bat parent = 0;                                                 \
        (void) li;                                                      \
        (void) hi;                                                      \
        (void) lval;                                                    \
@@ -465,11 +466,11 @@ NAME##_##TYPE(BAT *b, struct canditer *r
        assert(hi == !anti);                                            \
        assert(lval);                                                   \
        assert(hval);                                                   \
-       if (use_imprints && VIEWtparent(b)) {                           \
-               BAT *parent = BBPdescriptor(VIEWtparent(b));            \
-               assert(parent);                                         \
-               basesrc = (const TYPE *) Tloc(parent, 0);               \
-               imprints = parent->timprints;                           \
+       if (use_imprints && (parent = VIEWtparent(b))) {                \
+               BAT *pbat = BBPdescriptor(parent);                      \
+               assert(pbat);                                           \
+               basesrc = (const TYPE *) Tloc(pbat, 0);                 \
+               imprints = pbat->timprints;                             \
                pr_off = (BUN) (src - basesrc);                         \
        } else {                                                        \
                imprints = b->timprints;                                \
@@ -1347,6 +1348,7 @@ BATselect(BAT *b, BAT *s, const void *tl
         * trevstorted then use the order index.  And there is no cand
         * list or if there is one, it is dense.
         * TODO: we do not support anti-select with order index */
+       bool poidx = false;
        if (!anti &&
            !(hash && (phash || b->thash)) &&
            !(b->tsorted || b->trevsorted) &&
@@ -1365,6 +1367,7 @@ BATselect(BAT *b, BAT *s, const void *tl
                if ((ORDERfnd(b, th) - ORDERfnd(b, tl)) < b->batCount/3) {
                        use_orderidx = true;
                        if (view) {
+                               poidx = true; /* using parent oidx */
                                vwo = (lng) ((view->theap.base - b->theap.base) 
>> b->tshift);
                                vwl = b->hseqbase + (oid) vwo + ci.seq - 
view->hseqbase;
                                vwh = vwl + canditer_last(&ci) - ci.seq;
@@ -1448,7 +1451,7 @@ BATselect(BAT *b, BAT *s, const void *tl
                        }
                } else {
                        assert(use_orderidx);
-                       algo = "select: orderidx";
+                       algo = poidx ? "select: parent orderidx" : "select: 
orderidx";
                        if (lval) {
                                if (li)
                                        low = ORDERfndfirst(b, tl);
diff --git a/gdk/gdk_unique.c b/gdk/gdk_unique.c
--- a/gdk/gdk_unique.c
+++ b/gdk/gdk_unique.c
@@ -38,7 +38,7 @@ BATunique(BAT *b, BAT *s)
        BUN hb;
        BATiter bi;
        int (*cmp)(const void *, const void *);
-       bat parent;
+       bat parent = 0;
        struct canditer ci;
        PROPrec *prop;
        const char *algomsg = "";
@@ -170,6 +170,7 @@ BATunique(BAT *b, BAT *s)
                        lo = (BUN) ((b->theap.base - b2->theap.base) >> 
b->tshift);
                        b = b2;
                        bi = bat_iterator(b);
+                       algomsg = "unique: existing parent hash";
                } else {
                        lo = 0;
                }
diff --git a/sql/test/BugTracker-2020/Tests/All 
b/sql/test/BugTracker-2020/Tests/All
--- a/sql/test/BugTracker-2020/Tests/All
+++ b/sql/test/BugTracker-2020/Tests/All
@@ -26,5 +26,6 @@ table-udf-column-descriptor.Bug-6964
 table-udf-distinct.Bug-6965
 HAVE_PYMONETDB?table-udf-on-remote.Bug-6971
 integers-intervals.Bug-6979
+KNOWNFAIL?wrong-key-error.Bug-6983
 semijoin.Bug-7001
 drop-stream-table.Bug-7005
diff --git a/sql/test/BugTracker-2020/Tests/wrong-key-error.Bug-6983.sql 
b/sql/test/BugTracker-2020/Tests/wrong-key-error.Bug-6983.sql
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2020/Tests/wrong-key-error.Bug-6983.sql
@@ -0,0 +1,9 @@
+start transaction;
+create table a (id int primary key);
+insert into a values (1);
+
+create table b (id int primary key);
+
+create table c (a int references a(id), b int references b(id));
+insert into c (a, b) values (1, 2); -- 40002!INSERT INTO: FOREIGN KEY 
constraint 'c.c_b_fkey' violated
+rollback;
diff --git a/sql/test/BugTracker-2020/Tests/wrong-key-error.Bug-6983.stable.err 
b/sql/test/BugTracker-2020/Tests/wrong-key-error.Bug-6983.stable.err
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2020/Tests/wrong-key-error.Bug-6983.stable.err
@@ -0,0 +1,16 @@
+stderr of test 'wrong-key-error.Bug-6983` in directory 
'sql/test/BugTracker-2020` itself:
+
+
+# 15:23:21 >  
+# 15:23:21 >  "mclient" "-lsql" "-ftest" "-tnone" "-Eutf-8" "-i" "-e" 
"--host=/var/tmp/mtest-3778" "--port=36467"
+# 15:23:21 >  
+
+MAPI  = (monetdb) /var/tmp/mtest-3778/.s.monetdb.36467
+QUERY = insert into c (a, b) values (1, 2); -- 40002!INSERT INTO: FOREIGN KEY 
constraint 'c.c_b_fkey' violated
+ERROR = !INSERT INTO: FOREIGN KEY constraint 'c.c_b_fkey' violated
+CODE  = 40002
+
+# 15:23:21 >  
+# 15:23:21 >  "Done."
+# 15:23:21 >  
+
diff --git a/sql/test/BugTracker-2020/Tests/wrong-key-error.Bug-6983.stable.out 
b/sql/test/BugTracker-2020/Tests/wrong-key-error.Bug-6983.stable.out
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2020/Tests/wrong-key-error.Bug-6983.stable.out
@@ -0,0 +1,19 @@
+stdout of test 'wrong-key-error.Bug-6983` in directory 
'sql/test/BugTracker-2020` itself:
+
+
+# 15:23:21 >  
+# 15:23:21 >  "mclient" "-lsql" "-ftest" "-tnone" "-Eutf-8" "-i" "-e" 
"--host=/var/tmp/mtest-3778" "--port=36467"
+# 15:23:21 >  
+
+#start transaction;
+#create table a (id int primary key);
+#insert into a values (1);
+[ 1    ]
+#create table b (id int primary key);
+#create table c (a int references a(id), b int references b(id));
+#rollback;
+
+# 15:23:21 >  
+# 15:23:21 >  "Done."
+# 15:23:21 >  
+
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to