Changeset: 1c21fb27d410 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/1c21fb27d410
Modified Files:
gdk/gdk_join.c
Branch: default
Log Message:
Merged with Jul2021
diffs (truncated from 973 to 300 lines):
diff --git a/ctest/tools/monetdbe/CMakeLists.txt
b/ctest/tools/monetdbe/CMakeLists.txt
--- a/ctest/tools/monetdbe/CMakeLists.txt
+++ b/ctest/tools/monetdbe/CMakeLists.txt
@@ -85,7 +85,6 @@ target_link_libraries(example_proxy
PRIVATE
monetdb_config_header
monetdbe)
-add_test(run_example_proxy example_proxy)
if(WITH_CMOCKA)
add_executable(cmocka_test cmocka_test.c test_helper.c)
diff --git a/gdk/gdk_join.c b/gdk/gdk_join.c
--- a/gdk/gdk_join.c
+++ b/gdk/gdk_join.c
@@ -4016,13 +4016,15 @@ BATjoin(BAT **r1p, BAT **r2p, BAT *l, BA
if ((parent = VIEWtparent(l)) != 0) {
BAT *b = BBPdescriptor(parent);
if (l->hseqbase == b->hseqbase &&
- BATcount(l) == BATcount(b))
+ BATcount(l) == BATcount(b) &&
+ ATOMtype(l->ttype) == ATOMtype(b->ttype))
l = b;
}
if ((parent = VIEWtparent(r)) != 0) {
BAT *b = BBPdescriptor(parent);
if (r->hseqbase == b->hseqbase &&
- BATcount(r) == BATcount(b))
+ BATcount(r) == BATcount(b) &&
+ ATOMtype(r->ttype) == ATOMtype(b->ttype))
r = b;
}
diff --git a/gdk/gdk_project.c b/gdk/gdk_project.c
--- a/gdk/gdk_project.c
+++ b/gdk/gdk_project.c
@@ -45,6 +45,7 @@ project1_##TYPE(BAT *restrict bn, BAT *r
for (lo = 0, hi = BATcount(l); lo < hi; lo++) \
bt[lo] = r1t[lo]; \
} else { \
+ assert(l->ttype);\
const oid *restrict ot = (const oid *) Tloc(l, 0); \
for (lo = 0, hi = BATcount(l); lo < hi; lo++) { \
oid o = ot[lo]; \
@@ -85,7 +86,8 @@ project_##TYPE(BAT *restrict bn, BAT *re
oid r1seq, r1end; \
oid r2seq, r2end; \
\
- if ((!ci || ci->tpe == cand_dense) && l->tnonil && !r2) \
+ if ((!ci || (ci->tpe == cand_dense && BATtdense(l))) && \
+ l->tnonil && r1->ttype && !BATtdense(r1) && !r2) \
return project1_##TYPE(bn, l, r1); \
MT_thread_setalgorithm(__func__); \
r1t = (const TYPE *) Tloc(r1, 0); \
@@ -173,7 +175,7 @@ project_oid(BAT *restrict bn, BAT *restr
const oid *restrict r2t = NULL;
struct canditer r1ci = {0}, r2ci = {0};
- if ((!lci || lci->tpe == cand_dense) && r1->ttype && !BATtdense(r1) &&
!r2) {
+ if ((!lci || (lci->tpe == cand_dense && BATtdense(l))) && r1->ttype &&
!BATtdense(r1) && !r2) {
if (sizeof(oid) == sizeof(lng))
return project1_lng(bn, l, r1);
else
diff --git a/monetdb5/optimizer/opt_mitosis.c b/monetdb5/optimizer/opt_mitosis.c
--- a/monetdb5/optimizer/opt_mitosis.c
+++ b/monetdb5/optimizer/opt_mitosis.c
@@ -94,10 +94,13 @@ OPTmitosisImplementation(Client cntxt, M
}
/* locate the largest non-partitioned table */
- if (getModuleId(p) != sqlRef || (getFunctionId(p) != bindRef &&
getFunctionId(p) != bindidxRef))
+ if (getModuleId(p) != sqlRef ||
+ (getFunctionId(p) != bindRef &&
+ getFunctionId(p) != bindidxRef &&
+ getFunctionId(p) != tidRef))
continue;
/* don't split insert BATs */
- if (getVarConstant(mb, getArg(p, 5)).val.ival == 1)
+ if (p->argc > 5 && getVarConstant(mb, getArg(p, 5)).val.ival ==
1)
continue;
if (p->argc > 6)
continue; /* already partitioned */
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
@@ -2778,11 +2778,11 @@ rel2bin_antijoin(backend *be, sql_rel *r
assert(list_length(mexps) == 1);
for( en = mexps->h; en; en = en->next ) {
sql_exp *e = en->data;
- stmt *ls = exp_bin(be, e->l, left, right, NULL, NULL,
NULL, NULL, 0, 1, 0), *rs;
+ stmt *ls = exp_bin(be, e->l, left, right, NULL, NULL,
NULL, NULL, 1, 0, 0), *rs;
if (!ls)
return NULL;
- if (!(rs = exp_bin(be, e->r, left, right, NULL, NULL,
NULL, NULL, 0, 1, 0)))
+ if (!(rs = exp_bin(be, e->r, left, right, NULL, NULL,
NULL, NULL, 1, 0, 0)))
return NULL;
if (ls->nrcols == 0)
@@ -2881,14 +2881,14 @@ rel2bin_semijoin(backend *be, sql_rel *r
if (equality_only) {
int oldvtop = be->mb->vtop, oldstop =
be->mb->stop, oldvid = be->mb->vid, swap = 0;
- stmt *r, *l = exp_bin(be, e->l, left,
NULL, NULL, NULL, NULL, NULL, 0, 1, 0);
+ stmt *r, *l = exp_bin(be, e->l, left,
NULL, NULL, NULL, NULL, NULL, 1, 0, 0);
if (!l) {
swap = 1;
clean_mal_statements(be,
oldstop, oldvtop, oldvid);
- l = exp_bin(be, e->l, right,
NULL, NULL, NULL, NULL, NULL, 0, 1, 0);
+ l = exp_bin(be, e->l, right,
NULL, NULL, NULL, NULL, NULL, 1, 0, 0);
}
- r = exp_bin(be, e->r, left, right,
NULL, NULL, NULL, NULL, 0, 1, 0);
+ r = exp_bin(be, e->r, left, right,
NULL, NULL, NULL, NULL, 1, 0, 0);
if (swap) {
stmt *t = l;
@@ -6428,7 +6428,7 @@ output_rel_bin(backend *be, sql_rel *rel
be->join_idx = 0;
be->rowcount = 0;
- be->silent = GDKembedded() || !top;
+ be->silent = !top;
s = subrel_bin(be, rel, refs);
s = subrel_project(be, s, refs, rel);
diff --git a/sql/backends/monet5/sql_optimizer.c
b/sql/backends/monet5/sql_optimizer.c
--- a/sql/backends/monet5/sql_optimizer.c
+++ b/sql/backends/monet5/sql_optimizer.c
@@ -79,7 +79,7 @@ SQLgetSpace(mvc *m, MalBlkPtr mb, int pr
if (!t || isDeclaredTable(t))
continue;
c = mvc_bind_column(m, t, cname);
- if (!s)
+ if (!c)
continue;
/* we have to sum the cost of all three components of a
BAT */
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
@@ -6124,9 +6124,6 @@ split_aggr_and_project(mvc *sql, list *a
list_split_aggr_and_project(sql, aexps, e->l);
return e;
case e_atom:
- if (e->f)
- list_split_aggr_and_project(sql, aexps, e->f);
- return e;
case e_column: /* constants and columns shouldn't be rewriten */
case e_psm:
return e;
@@ -7879,9 +7876,6 @@ split_exp(mvc *sql, sql_exp *e, sql_rel
}
return e;
case e_atom:
- if (e->f)
- split_exps(sql, e->f, rel);
- return e;
case e_psm:
return e;
}
@@ -8000,9 +7994,6 @@ select_split_exp(mvc *sql, sql_exp *e, s
}
return e;
case e_atom:
- if (e->f)
- select_split_exp(sql, e->f, rel);
- return e;
case e_psm:
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
@@ -1937,7 +1937,7 @@ rel_in_value_exp(sql_query *query, sql_r
dnode *n = dl->h->next, *dn = NULL;
sql_exp *le = NULL, *re, *e = NULL;
list *ll = sa_list(sql->sa);
- int is_tuple = 0;
+ int is_tuple = 0, add_select = 0;
/* complex case */
if (dl->h->type == type_list) { /* (a,b..) in (.. ) */
@@ -1987,12 +1987,16 @@ rel_in_value_exp(sql_query *query, sql_r
re = exp_rel_label(sql, re);
} else if (exp_is_rel(re)) {
sql_rel *r = exp_rel_get_rel(sql->sa, re);
+ add_select = 1;
if (is_project(r->op) && is_project_true(r->l)
&& list_length(r->exps) == 1)
re = r->exps->h->data;
}
append(vals, re);
}
+ if (list_empty(vals))
+ return sql_error(sql, 02, SQLSTATE(42000) "The list of
values for IN operator cannot be empty");
+
values = exp_values(sql->sa, vals);
exp_label(sql->sa, values, ++sql->label);
if (is_tuple) {
@@ -2002,13 +2006,27 @@ rel_in_value_exp(sql_query *query, sql_r
return NULL;
le->f = nvalues;
} else { /* if it's not a tuple, enforce coersion on the type
for every element on the list */
- sql_subtype super;
-
- if (!(values = exp_values_set_supertype(sql, values,
exp_subtype(le))))
- return NULL;
- if (rel_binop_check_types(sql, rel ? *rel : NULL, le,
values, 0) < 0)
- return NULL;
- supertype(&super, exp_subtype(values), exp_subtype(le));
+ sql_subtype super, *le_tpe = exp_subtype(le),
*values_tpe = NULL;
+
+ for (node *m = vals->h; m; m = m->next) { /* first get
values supertype */
+ sql_exp *e = m->data;
+ sql_subtype *tpe = exp_subtype(e);
+
+ if (values_tpe && tpe) {
+ supertype(&super, values_tpe, tpe);
+ *values_tpe = super;
+ } else if (!values_tpe && tpe) {
+ super = *tpe;
+ values_tpe = &super;
+ }
+ }
+ if (!le_tpe)
+ le_tpe = values_tpe;
+ if (!values_tpe)
+ values_tpe = le_tpe;
+ if (!le_tpe || !values_tpe)
+ return sql_error(sql, 01, SQLSTATE(42000) "For
the IN operator, both sides must have a type defined");
+ supertype(&super, values_tpe, le_tpe); /* compute
supertype */
/* on selection/join cases we can generate cmp
expressions instead of anyequal for trivial cases */
if ((is_sql_where(f) || is_sql_having(f)) &&
!is_sql_farg(f) && !exp_has_rel(le) && exps_are_atoms(vals)) {
@@ -2026,11 +2044,20 @@ rel_in_value_exp(sql_query *query, sql_r
e = exp_in(sql->sa, le, vals,
(sc->token == SQL_IN) ? cmp_in : cmp_notin);
}
}
- if (!e && (le = exp_check_type(sql, &super, rel ? *rel
: NULL, le, type_equal)) == NULL)
- return NULL;
- }
- if (!e)
+ if (!e) { /* after computing supertype, check types for
each IN value */
+ for (node *n = vals->h ; n ; n = n->next)
+ if ((n->data = exp_check_type(sql,
&super, rel ? *rel : NULL, n->data, type_equal)) == NULL)
+ return NULL;
+ values->tpe = *exp_subtype(vals->h->data);
+ if (!(le = exp_check_type(sql, &super, rel ?
*rel : NULL, le, type_equal)))
+ return NULL;
+ }
+ }
+ if (!e) {
+ if (add_select && rel && *rel &&
!is_project((*rel)->op) && !is_select((*rel)->op))
+ *rel = rel_select(sql->sa, *rel, NULL);
e = exp_in_func(sql, le, values, (sc->token == SQL_IN),
is_tuple);
+ }
}
return e;
}
@@ -2444,7 +2471,7 @@ rel_logical_value_exp(sql_query *query,
return NULL;
if (ek.card <= card_set && is_project(sq->op) &&
list_length(sq->exps) > 1)
return sql_error(sql, 02, SQLSTATE(42000) "SELECT:
subquery must return only one column");
- if (ek.card < card_set && sq->card >= CARD_MULTI &&
(is_sql_sel(f) | is_sql_having(f) | ( is_sql_where(f) && rel && (!*rel ||
is_basetable((*rel)->op) || is_simple_project((*rel)->op) ||
is_joinop((*rel)->op)))))
+ if (ek.card < card_set && sq->card >= CARD_AGGR &&
(is_sql_sel(f) | is_sql_having(f) | ( is_sql_where(f) && rel && (!*rel ||
is_basetable((*rel)->op) || is_simple_project((*rel)->op) ||
is_joinop((*rel)->op)))))
sq = rel_zero_or_one(sql, sq, ek);
return exp_rel(sql, sq);
}
@@ -6064,7 +6091,7 @@ rel_subquery(sql_query *query, sql_rel *
rel = rel_query(query, rel, sq, toplevel, ek);
stack_pop_frame(sql);
- if (rel && ek.type == type_relation && ek.card < card_set && rel->card
>= CARD_MULTI)
+ if (rel && ek.type == type_relation && ek.card < card_set && rel->card
>= CARD_AGGR)
return rel_zero_or_one(sql, rel, ek);
return rel;
}
diff --git a/sql/server/rel_unnest.c b/sql/server/rel_unnest.c
--- a/sql/server/rel_unnest.c
+++ b/sql/server/rel_unnest.c
@@ -2129,13 +2129,24 @@ rewrite_or_exp(visitor *v, sql_rel *rel)
rel = l;
}
rel = rel_add_identity(v->sql, rel,
&id); /* identity function needed */
- (void) id;
- assert(id);
+ const char *idrname = exp_relname(id),
*idname = exp_name(id);
+ list *tids = NULL, *exps =
rel_projections(v->sql, rel, NULL, 1, 1);
+
+ for( node *n = exps->h ; n ; ) {
+ node *next = n->next;
+ sql_exp *e = n->data;
+
+ if (strcmp(exp_name(e), TID) ==
0) { /* remove TID references and later restore them with identity function
references */
+ if (!tids)
+ tids =
sa_list(v->sql->sa);
+ list_append(tids,
exp_alias(v->sql->sa, exp_relname(e), TID, idrname, idname,
sql_bind_localtype("oid"), CARD_MULTI, 0, 1));
+ list_remove_node(exps,
NULL, n);
+ }
+ n = next;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list