Changeset: 8e24dc8e3911 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=8e24dc8e3911 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 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