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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list