Changeset: 2320b9a06925 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=2320b9a06925
Modified Files:
        gdk/gdk_join.c
Branch: Dec2016
Log Message:

Fix property setting in thetajoin.
The dense property wasn't cleared when there is a nil in the left
input column.


diffs (129 lines):

diff --git a/gdk/gdk_join.c b/gdk/gdk_join.c
--- a/gdk/gdk_join.c
+++ b/gdk/gdk_join.c
@@ -3191,69 +3191,69 @@ thetajoin(BAT *r1, BAT *r2, BAT *l, BAT 
                        }
                        lo = lstart++ + l->hseqbase;
                }
-               if (cmp(vl, nil) == 0)
-                       continue;
                nr = 0;
-               p = rcand;
-               n = rstart;
-               for (;;) {
-                       if (rcand) {
-                               if (p == rcandend)
-                                       break;
-                               ro = *p++;
-                               vr = VALUE(r, ro - r->hseqbase);
-                       } else {
-                               if (n == rend)
-                                       break;
-                               if (rvals) {
-                                       vr = VALUE(r, n);
-                                       if (roff != 0) {
-                                               rval = (oid) (*(const oid *)vr 
+ roff);
+               if (cmp(vl, nil) != 0) {
+                       p = rcand;
+                       n = rstart;
+                       for (;;) {
+                               if (rcand) {
+                                       if (p == rcandend)
+                                               break;
+                                       ro = *p++;
+                                       vr = VALUE(r, ro - r->hseqbase);
+                               } else {
+                                       if (n == rend)
+                                               break;
+                                       if (rvals) {
+                                               vr = VALUE(r, n);
+                                               if (roff != 0) {
+                                                       rval = (oid) (*(const 
oid *)vr + roff);
+                                                       vr = (const char *) 
&rval;
+                                               }
+                                       } else {
+                                               rval = n + r->tseqbase;
                                                vr = (const char *) &rval;
                                        }
-                               } else {
-                                       rval = n + r->tseqbase;
-                                       vr = (const char *) &rval;
+                                       ro = n++ + r->hseqbase;
                                }
-                               ro = n++ + r->hseqbase;
-                       }
-                       if (cmp(vr, nil) == 0)
-                               continue;
-                       c = cmp(vl, vr);
-                       if (!((opcode & MASK_LT && c < 0) ||
-                             (opcode & MASK_GT && c > 0) ||
-                             (opcode & MASK_EQ && c == 0)))
-                               continue;
-                       if (BUNlast(r1) == BATcapacity(r1)) {
-                               newcap = BATgrows(r1);
-                               if (newcap > maxsize)
-                                       newcap = maxsize;
-                               BATsetcount(r1, BATcount(r1));
-                               BATsetcount(r2, BATcount(r2));
-                               if (BATextend(r1, newcap) != GDK_SUCCEED ||
-                                   BATextend(r2, newcap) != GDK_SUCCEED)
-                                       goto bailout;
-                               assert(BATcapacity(r1) == BATcapacity(r2));
-                       }
-                       if (BATcount(r2) > 0) {
-                               if (lastr + 1 != ro)
-                                       r2->tdense = 0;
-                               if (nr == 0) {
-                                       r1->trevsorted = 0;
-                                       if (lastr > ro) {
-                                               r2->tsorted = 0;
-                                               r2->tkey = 0;
-                                       } else if (lastr < ro) {
-                                               r2->trevsorted = 0;
-                                       } else {
-                                               r2->tkey = 0;
+                               if (cmp(vr, nil) == 0)
+                                       continue;
+                               c = cmp(vl, vr);
+                               if (!((opcode & MASK_LT && c < 0) ||
+                                     (opcode & MASK_GT && c > 0) ||
+                                     (opcode & MASK_EQ && c == 0)))
+                                       continue;
+                               if (BUNlast(r1) == BATcapacity(r1)) {
+                                       newcap = BATgrows(r1);
+                                       if (newcap > maxsize)
+                                               newcap = maxsize;
+                                       BATsetcount(r1, BATcount(r1));
+                                       BATsetcount(r2, BATcount(r2));
+                                       if (BATextend(r1, newcap) != 
GDK_SUCCEED ||
+                                           BATextend(r2, newcap) != 
GDK_SUCCEED)
+                                               goto bailout;
+                                       assert(BATcapacity(r1) == 
BATcapacity(r2));
+                               }
+                               if (BATcount(r2) > 0) {
+                                       if (lastr + 1 != ro)
+                                               r2->tdense = 0;
+                                       if (nr == 0) {
+                                               r1->trevsorted = 0;
+                                               if (lastr > ro) {
+                                                       r2->tsorted = 0;
+                                                       r2->tkey = 0;
+                                               } else if (lastr < ro) {
+                                                       r2->trevsorted = 0;
+                                               } else {
+                                                       r2->tkey = 0;
+                                               }
                                        }
                                }
+                               APPEND(r1, lo);
+                               APPEND(r2, ro);
+                               lastr = ro;
+                               nr++;
                        }
-                       APPEND(r1, lo);
-                       APPEND(r2, ro);
-                       lastr = ro;
-                       nr++;
                }
                if (nr > 1) {
                        r1->tkey = 0;
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to