Changeset: 9dbc91b83efa for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=9dbc91b83efa
Modified Files:
        gdk/gdk_hash.c
        monetdb5/modules/atoms/uuid.c
        sql/backends/monet5/rel_bin.c
        sql/server/rel_exp.c
        sql/server/rel_exp.h
        sql/server/rel_optimizer.c
        sql/server/rel_select.c
        
sql/test/BugTracker-2008/Tests/decimal_cast_in_view.SF-2075223.stable.out
        sql/test/BugTracker-2014/Tests/missing_alias.Bug-3626.stable.out
        sql/test/BugTracker-2015/Tests/string-to-inet.Bug-3666.stable.out
        
sql/test/BugTracker-2016/Tests/convert-function-test-hge.Bug-3460.stable.out.int128
        sql/test/BugTracker-2016/Tests/convert-function-test.Bug-3460.stable.out
        
sql/test/BugTracker-2016/Tests/convert-function-test.Bug-3460.stable.out.int128
        sql/test/BugTracker-2018/Tests/convert-key.Bug-6648.stable.out
        sql/test/BugTracker-2019/Tests/cast-interval.Bug-6793.stable.out
        sql/test/BugTracker/Tests/convert_dec2varchar.SF-1774312.stable.out
        sql/test/BugTracker/Tests/jdbc_no_debug.SF-1739356.stable.out
        sql/test/SQLancer/Tests/sqlancer01.sql
        sql/test/SQLancer/Tests/sqlancer01.stable.err
        sql/test/SQLancer/Tests/sqlancer01.stable.out
        sql/test/bugs/Tests/cast_varchar2int-bug-sf-964165.stable.out
        sql/test/mergetables/Tests/mergeinit.stable.err
        sql/test/miscellaneous/Tests/groupings.stable.out
        sql/test/miscellaneous/Tests/simple_plans.sql
        sql/test/miscellaneous/Tests/simple_plans.stable.out
        sql/test/miscellaneous/Tests/simple_selects.stable.out
        sql/test/pg_regress/Tests/date.stable.out
        sql/test/pg_regress/Tests/int8.stable.out
        sql/test/pg_regress/Tests/int8.stable.out.int128
Branch: default
Log Message:

Merged with Jun2020


diffs (truncated from 13199 to 300 lines):

diff --git a/gdk/gdk_hash.c b/gdk/gdk_hash.c
--- a/gdk/gdk_hash.c
+++ b/gdk/gdk_hash.c
@@ -97,7 +97,11 @@ HASHclear(Hash *h)
        memset(h->Bckt, 0xFF, h->nbucket * h->width);
 }
 
-#define HASH_VERSION           3
+#define HASH_VERSION           4
+/* this is only for the change of hash function of the UUID type; if
+ * HASH_VERSION is increased again from 4, the code associated with
+ * HASH_VERSION_NOUUID must be deleted */
+#define HASH_VERSION_NOUUID    3
 #define HASH_HEADER_SIZE       7       /* nr of size_t fields in header */
 
 static void
@@ -442,11 +446,21 @@ BATcheckhash(BAT *b)
                                        struct stat st;
 
                                        if (read(fd, hdata, sizeof(hdata)) == 
sizeof(hdata) &&
-                                           hdata[0] == (
+                                           (hdata[0] == (
 #ifdef PERSISTENTHASH
                                                    ((size_t) 1 << 24) |
 #endif
-                                                   HASH_VERSION) &&
+                                                   HASH_VERSION)
+#ifdef HASH_VERSION_NOUUID
+                                            /* if not uuid, also allow 
previous version */
+                                            || (hdata[0] == (
+#ifdef PERSISTENTHASH
+                                                        ((size_t) 1 << 24) |
+#endif
+                                                        HASH_VERSION_NOUUID) &&
+                                                strcmp(ATOMname(b->ttype), 
"uuid") != 0)
+#endif
+                                                   ) &&
                                            hdata[1] > 0 &&
                                            hdata[4] == (size_t) BATcount(b) &&
                                            fstat(fd, &st) == 0 &&
diff --git a/monetdb5/modules/atoms/uuid.c b/monetdb5/modules/atoms/uuid.c
--- a/monetdb5/modules/atoms/uuid.c
+++ b/monetdb5/modules/atoms/uuid.c
@@ -330,17 +330,19 @@ BUN
 UUIDhash(const void *v)
 {
        const uuid *u = (const uuid *) v;
-       unsigned int u1, u2, u3, u4;
+       ulng u1, u2;
 
-       u1 = (unsigned int) u->u[0] << 24 | (unsigned int) u->u[1] << 16 |
-               (unsigned int) u->u[2] << 8 | (unsigned int) u->u[3];
-       u2 = (unsigned int) u->u[4] << 24 | (unsigned int) u->u[5] << 16 |
-               (unsigned int) u->u[6] << 8 | (unsigned int) u->u[7];
-       u3 = (unsigned int) u->u[8] << 24 | (unsigned int) u->u[9] << 16 |
-               (unsigned int) u->u[10] << 8 | (unsigned int) u->u[11];
-       u4 = (unsigned int) u->u[12] << 24 | (unsigned int) u->u[13] << 16 |
-               (unsigned int) u->u[14] << 8 | (unsigned int) u->u[15];
-       return (BUN) mix_int(u1 ^ u2 ^ u3 ^ u4);
+       u1 = (ulng) u->u[0] << 56 | (ulng) u->u[1] << 48 |
+               (ulng) u->u[2] << 40 | (ulng) u->u[3] << 32 |
+               (ulng) u->u[4] << 24 | (ulng) u->u[5] << 16 |
+               (ulng) u->u[6] << 8 | (ulng) u->u[7];
+       u2 = (ulng) u->u[8] << 56 | (ulng) u->u[9] << 48 |
+               (ulng) u->u[10] << 40 | (ulng) u->u[11] << 32 |
+               (ulng) u->u[12] << 24 | (ulng) u->u[13] << 16 |
+               (ulng) u->u[14] << 8 | (ulng) u->u[15];
+       /* we're not using mix_hge since this we way get the same result
+        * on systems with and without 128 bit integer support */
+       return (BUN) (mix_lng(u1) ^ mix_lng(u2));
 }
 
 const uuid *
diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -2221,59 +2221,55 @@ rel2bin_join(backend *be, sql_rel *rel, 
                if (!list_empty(rel->exps)) {
                        for( en = rel->exps->h, i=0; en; en = en->next, i++) {
                                sql_exp *e = en->data;
+                               int left_reference = 0, right_reference = 0;
 
                                /* we can handle thetajoins, rangejoins and 
filter joins (like) */
                                /* ToDo how about in/notin, mark_in/notin, 
mark_exists/not_exists and atom expressions? */
                                if (e->type == e_cmp) {
                                        int flag = e->flag & ~CMP_BETWEEN;
                                        /* check if its a select or join 
expression, ie use only expressions of one relation left and of the other right 
(than join) */
-                                       if (flag < cmp_filter && !e->f) { /* 
theta join */
+                                       if (flag < cmp_filter) { /* theta and 
range joins */
                                                /* join or select ? */
-                                               if ((rel_find_exp(rel->l, e->l) 
&& !rel_find_exp(rel->r, e->l) &&
-                                                    rel_find_exp(rel->r, e->r) 
&& !rel_find_exp(rel->l, e->r)) ||
-                                                   (rel_find_exp(rel->r, e->l) 
&& !rel_find_exp(rel->l, e->l) &&
-                                                    rel_find_exp(rel->l, e->r) 
&& !rel_find_exp(rel->r, e->r))) {
-                                                       append(jexps, e);
-                                                       continue;
+                                               sql_exp *l = e->l, *r = e->r, 
*f = e->f;
+
+                                               if (l->card != CARD_ATOM) {
+                                                       left_reference += 
rel_find_exp(rel->l, l) != NULL;
+                                                       right_reference += 
rel_find_exp(rel->r, l) != NULL;
                                                }
-                                       } else if (flag < cmp_filter && e->f) { 
/* range */
-                                               int nrcr1 = 0, nrcr2 = 0, nrcl1 
= 0, nrcl2 = 0;
-                                               if ((rel_find_exp(rel->l, e->l) 
&& !rel_find_exp(rel->r, e->l) &&
-                                                  ((rel_find_exp(rel->r, e->r) 
&& !rel_find_exp(rel->l, e->r)) || (nrcr1 = exp_is_atom(e->r))) &&
-                                                  ((rel_find_exp(rel->r, e->f) 
&& !rel_find_exp(rel->l, e->f)) || (nrcr2 = exp_is_atom(e->f))) && 
(nrcr1+nrcr2) <= 1) ||
-                                                   (rel_find_exp(rel->r, e->l) 
&& !rel_find_exp(rel->l, e->l) &&
-                                                  ((rel_find_exp(rel->l, e->r) 
&& !rel_find_exp(rel->r, e->r)) || (nrcl1 = exp_is_atom(e->r))) &&
-                                                  ((rel_find_exp(rel->l, e->f) 
&& !rel_find_exp(rel->r, e->f)) || (nrcl2 = exp_is_atom(e->f))) && 
(nrcl1+nrcl2) <= 1)) {
-                                                       append(jexps, e);
-                                                       continue;
+                                               if (r->card != CARD_ATOM) {
+                                                       left_reference += 
rel_find_exp(rel->l, r) != NULL;
+                                                       right_reference += 
rel_find_exp(rel->r, r) != NULL;
+                                               }
+                                               if (f && f->card != CARD_ATOM) {
+                                                       left_reference += 
rel_find_exp(rel->l, f) != NULL;
+                                                       right_reference += 
rel_find_exp(rel->r, f) != NULL;
                                                }
                                        } else if (flag == cmp_filter) {
-                                               int nrcl = 0, nrcr = 0;
-                                               bool fll = true, flr = true, 
frl = true, frr = true;
                                                list *l = e->l, *r = e->r;
 
                                                for (node *n = l->h ; n ; n = 
n->next) {
                                                        sql_exp *ee = n->data;
 
-                                                       fll &= 
rel_find_exp(rel->l, ee) != NULL;
-                                                       frl &= 
rel_find_exp(rel->r, ee) != NULL;
-                                                       nrcl += exp_is_atom(ee);
+                                                       if (ee->card != 
CARD_ATOM) {
+                                                               left_reference 
+= rel_find_exp(rel->l, ee) != NULL;
+                                                               right_reference 
+= rel_find_exp(rel->r, ee) != NULL;
+                                                       }
                                                }
                                                for (node *n = r->h ; n ; n = 
n->next) {
                                                        sql_exp *ee = n->data;
 
-                                                       flr &= 
rel_find_exp(rel->l, ee) != NULL;
-                                                       frr &= 
rel_find_exp(rel->r, ee) != NULL;
-                                                       nrcr += exp_is_atom(ee);
-                                               }
-                                               if (!((fll && flr) || (frl && 
frr)) && 
-                                                     nrcl < list_length(l) && 
nrcr < list_length(r)) {
-                                                       append(jexps, e);
-                                                       continue;
+                                                       if (ee->card != 
CARD_ATOM) {
+                                                               left_reference 
+= rel_find_exp(rel->l, ee) != NULL;
+                                                               right_reference 
+= rel_find_exp(rel->r, ee) != NULL;
+                                                       }
                                                }
                                        }
                                }
-                               append(sexps, e);
+                               if (left_reference && right_reference) {
+                                       append(jexps, e);
+                               } else {
+                                       append(sexps, e);
+                               }
                        }
                }
 
diff --git a/sql/server/rel_exp.c b/sql/server/rel_exp.c
--- a/sql/server/rel_exp.c
+++ b/sql/server/rel_exp.c
@@ -168,18 +168,18 @@ exp_compare(sql_allocator *sa, sql_exp *
 }
 
 sql_exp * 
-exp_compare2(sql_allocator *sa, sql_exp *l, sql_exp *r, sql_exp *h, int 
cmptype) 
+exp_compare2(sql_allocator *sa, sql_exp *l, sql_exp *r, sql_exp *f, int 
cmptype) 
 {
        sql_exp *e = exp_create(sa, e_cmp);
        if (e == NULL)
                return NULL;
-       e->card = l->card;
+       e->card = MAX(MAX(l->card,r->card),f->card);
        if (e->card == CARD_ATOM && !exp_is_atom(l))
                e->card = CARD_AGGR;
        e->l = l;
        e->r = r;
-       if (h)
-               e->f = h;
+       assert(f);
+       e->f = f;
        e->flag = cmptype;
        return e;
 }
@@ -191,7 +191,7 @@ exp_filter(sql_allocator *sa, list *l, l
 
        if (e == NULL)
                return NULL;
-       e->card = exps_card(l);
+       e->card = MAX(exps_card(l),exps_card(r));
        e->l = l;
        e->r = r;
        e->f = f;
@@ -204,17 +204,13 @@ exp_filter(sql_allocator *sa, list *l, l
 sql_exp *
 exp_or(sql_allocator *sa, list *l, list *r, int anti)
 {
-       sql_exp *f = NULL;
        sql_exp *e = exp_create(sa, e_cmp);
 
        if (e == NULL)
                return NULL;
-       f = l->h?l->h->data:r->h?r->h->data:NULL;
-       e->card = l->h?exps_card(l):exps_card(r);
+       e->card = MAX(exps_card(l),exps_card(r));
        e->l = l;
        e->r = r;
-       assert(f);
-       e->f = f;
        e->flag = cmp_or;
        if (anti)
                set_anti(e);
diff --git a/sql/server/rel_exp.h b/sql/server/rel_exp.h
--- a/sql/server/rel_exp.h
+++ b/sql/server/rel_exp.h
@@ -31,7 +31,7 @@ extern comp_type range2rcompare( int r )
 extern int compare2range( int l, int r );
 
 extern sql_exp *exp_compare(sql_allocator *sa, sql_exp *l, sql_exp *r, int 
cmptype);
-extern sql_exp *exp_compare2(sql_allocator *sa, sql_exp *l, sql_exp *r, 
sql_exp *h, int cmptype);
+extern sql_exp *exp_compare2(sql_allocator *sa, sql_exp *l, sql_exp *r, 
sql_exp *f, int cmptype);
 extern sql_exp *exp_filter(sql_allocator *sa, list *l, list *r, sql_subfunc 
*f, int anti);
 extern sql_exp *exp_or(sql_allocator *sa, list *l, list *r, int anti);
 extern sql_exp *exp_in(sql_allocator *sa, sql_exp *l, list *r, int cmptype);
diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c
--- a/sql/server/rel_optimizer.c
+++ b/sql/server/rel_optimizer.c
@@ -7749,7 +7749,17 @@ add_exp_too_project(mvc *sql, sql_exp *e
                exp_label(sql->sa, e, ++sql->label);
                append(rel->exps, e);
        } else {
-               e = n->data;
+               sql_exp *ne = n->data;
+
+               if (rel && rel->l) { 
+                       if ((exp_relname(ne) && exp_name(ne) && 
rel_bind_column2(sql, rel->l, exp_relname(ne), exp_name(ne), 0)) ||
+                          (!exp_relname(ne) && exp_name(ne) && 
rel_bind_column(sql, rel->l, exp_name(ne), 0, 1))) {
+                               exp_label(sql->sa, e, ++sql->label);
+                               append(rel->exps, e);
+                               ne = e;
+                       }
+               }
+               e = ne;
        }
        e = exp_ref(sql, e);
        return e;
diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
+++ b/sql/server/rel_select.c
@@ -4128,6 +4128,8 @@ rel_cast(sql_query *query, sql_rel **rel
        }
        if (e) 
                e = rel_check_type(sql, tpe, rel ? *rel : NULL, e, type_cast);
+       if (e && e->type == e_convert)
+               exp_label(sql->sa, e, ++sql->label);
        return e;
 }
 
diff --git 
a/sql/test/BugTracker-2008/Tests/decimal_cast_in_view.SF-2075223.stable.out 
b/sql/test/BugTracker-2008/Tests/decimal_cast_in_view.SF-2075223.stable.out
--- a/sql/test/BugTracker-2008/Tests/decimal_cast_in_view.SF-2075223.stable.out
+++ b/sql/test/BugTracker-2008/Tests/decimal_cast_in_view.SF-2075223.stable.out
@@ -29,8 +29,8 @@ stdout of test 'decimal_cast_in_view.SF-
 % 10 # length
 [ " 54."       ]
 #select CAST (a as NUMERIC (5, 2)) from A;
-% sys.a # table_name
-% a # name
+% sys.%1 # table_name
+% %1 # name
 % decimal # type
 % 7 # length
 [ 54.00        ]
diff --git a/sql/test/BugTracker-2014/Tests/missing_alias.Bug-3626.stable.out 
b/sql/test/BugTracker-2014/Tests/missing_alias.Bug-3626.stable.out
--- a/sql/test/BugTracker-2014/Tests/missing_alias.Bug-3626.stable.out
+++ b/sql/test/BugTracker-2014/Tests/missing_alias.Bug-3626.stable.out
@@ -29,8 +29,8 @@ stdout of test 'missing_alias.Bug-3626` 
 #insert into test2 values (1, true);
 [ 1    ]
 #select cast(b as smallint), (i > 0 and b) from test2;
-% sys.test2,   sys. # table_name
-% b,   %2 # name
+% sys.%1,      sys.%2 # table_name
+% %1,  %2 # name
 % smallint,    boolean # type
 % 1,   5 # length
 [ 1,   true    ]
diff --git a/sql/test/BugTracker-2015/Tests/string-to-inet.Bug-3666.stable.out 
b/sql/test/BugTracker-2015/Tests/string-to-inet.Bug-3666.stable.out
--- a/sql/test/BugTracker-2015/Tests/string-to-inet.Bug-3666.stable.out
+++ b/sql/test/BugTracker-2015/Tests/string-to-inet.Bug-3666.stable.out
@@ -63,8 +63,8 @@ stdout of test 'string-to-inet.Bug-3666`
 #insert into iptable values ('192.168.10.2');
 [ 1    ]
 #select cast(textip as inet) from iptable;
-% sys.iptable # table_name
-% textip # name
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to