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 checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list