Changeset: f813c624a736 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/f813c624a736 Branch: ascii-flag Log Message:
Merge with default branch. diffs (183 lines): diff --git a/sql/backends/monet5/sql_statement.c b/sql/backends/monet5/sql_statement.c --- a/sql/backends/monet5/sql_statement.c +++ b/sql/backends/monet5/sql_statement.c @@ -4057,14 +4057,14 @@ stmt_Nop(backend *be, stmt *ops, stmt *s q = pushArgument(mb, q, e1->nr); pushInstruction(mb, q); } - push_cands = can_push_cands(sel, mod, fimp); + push_cands = f->func->type == F_FUNC && can_push_cands(sel, mod, fimp); } if (q == NULL) { if (backend_create_subfunc(be, f, ops->op4.lval) < 0) goto bailout; mod = sql_func_mod(f->func); fimp = convertMultiplexFcn(backend_function_imp(be, f->func)); - push_cands = can_push_cands(sel, mod, fimp); + push_cands = f->func->type == F_FUNC && can_push_cands(sel, mod, fimp); default_nargs = (f->res && list_length(f->res) ? list_length(f->res) : 1) + list_length(ops->op4.lval) + (o && o->nrcols > 0 ? 6 : 4); if (rows) { card = stmt_aggr(be, rows, NULL, NULL, sql_bind_func(be->mvc, "sys", "count", sql_bind_localtype("void"), NULL, F_AGGR, true, true), 1, 0, 1); @@ -4124,7 +4124,7 @@ stmt_Nop(backend *be, stmt *ops, stmt *s q = pushArgument(mb, q, op->nr); } /* push candidate lists if that's the case */ - if (f->func->type == F_FUNC && push_cands) { + if (push_cands) { for (node *n = ops->op4.lval->h; n; n = n->next) { stmt *op = n->data; diff --git a/sql/server/rel_optimize_sel.c b/sql/server/rel_optimize_sel.c --- a/sql/server/rel_optimize_sel.c +++ b/sql/server/rel_optimize_sel.c @@ -875,12 +875,12 @@ exps_merge_select_rse( mvc *sql, list *l le->flag == re->flag && le->flag <= cmp_lt) { sql_exp *mine = NULL, *maxe = NULL; - if (!(mine = rel_binop_(sql, NULL, le->r, re->r, "sys", "sql_min", card_value, true))) { + if (!(mine = rel_binop_(sql, NULL, exp_copy(sql, le->r), exp_copy(sql, re->r), "sys", "sql_min", card_value, true))) { sql->session->status = 0; sql->errstr[0] = '\0'; continue; } - if (!(maxe = rel_binop_(sql, NULL, le->f, re->f, "sys", "sql_max", card_value, true))) { + if (!(maxe = rel_binop_(sql, NULL, exp_copy(sql, le->f), exp_copy(sql, re->f), "sys", "sql_max", card_value, true))) { sql->session->status = 0; sql->errstr[0] = '\0'; continue; 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 @@ -1530,10 +1530,27 @@ push_join_exp(mvc *sql, sql_rel *rel, sq } static sql_rel * +rel_select_push_filter_exp_down(mvc *sql, sql_rel *rel, sql_exp *e, list *l, list *r, int ff) +{ + sql_exp *ll, *rr; + if (exps_card(r) <= CARD_ATOM && (exps_are_atoms(r) || exps_have_freevar(sql, r) || exps_have_freevar(sql, l))) { + if (exps_card(l) == exps_card(r) || rel->processed) /* bin compare op */ + return rel_select(sql->sa, rel, e); + if ((ll = exps_find_one_multi_exp(l))) + return push_select_exp(sql, rel, e, ll, ff); + } else if ((ll = exps_find_one_multi_exp(l)) && (rr = exps_find_one_multi_exp(r))) { /* join */ + return push_join_exp(sql, rel, e, ll, rr, NULL, ff); + } + if (is_outerjoin(rel->op)) + return rel_select(sql->sa, rel, e); + return rel_select_add_exp(sql->sa, rel, e); +} + +static sql_rel * rel_filter(mvc *sql, sql_rel *rel, list *l, list *r, char *sname, char *filter_op, int anti, int ff) { node *n; - sql_exp *e = NULL, *ll, *rr; + sql_exp *e = NULL; sql_subfunc *f = NULL; list *tl = sa_list(sql->sa); bool found = false; @@ -1602,20 +1619,7 @@ rel_filter(mvc *sql, sql_rel *rel, list return sql_error(sql, ERR_GROUPBY, SQLSTATE(42000) "SELECT: cannot use non GROUP BY column in query results without an aggregate function"); } } - if (!is_join(rel->op) && !is_select(rel->op)) - return rel_select(sql->sa, rel, e); - if (exps_card(r) <= CARD_ATOM && (exps_are_atoms(r) || exps_have_freevar(sql, r) || exps_have_freevar(sql, l))) { - if (exps_card(l) == exps_card(r) || rel->processed) /* bin compare op */ - return rel_select(sql->sa, rel, e); - - if ((ll = exps_find_one_multi_exp(l))) - return push_select_exp(sql, rel, e, ll, ff); - } else if ((ll = exps_find_one_multi_exp(l)) && (rr = exps_find_one_multi_exp(r))) { /* join */ - return push_join_exp(sql, rel, e, ll, rr, NULL, ff); - } - if (is_outerjoin(rel->op)) - return rel_select(sql->sa, rel, e); - return rel_select_add_exp(sql->sa, rel, e); + return rel_select_push_filter_exp_down(sql, rel, e, l, r, ff); } static sql_rel * @@ -1634,7 +1638,7 @@ rel_filter_exp_(mvc *sql, sql_rel *rel, } static sql_rel * -rel_select_push_exp_down(mvc *sql, sql_rel *rel, sql_exp *e, sql_exp *ls, sql_exp *rs, sql_exp *rs2, int f) +rel_select_push_compare_exp_down(mvc *sql, sql_rel *rel, sql_exp *e, sql_exp *ls, sql_exp *rs, sql_exp *rs2, int f) { if (!is_join(rel->op) && !is_select(rel->op)) return rel_select(sql->sa, rel, e); @@ -1701,7 +1705,7 @@ rel_compare_exp_(sql_query *query, sql_r return sql_error(sql, ERR_GROUPBY, SQLSTATE(42000) "SELECT: cannot use non GROUP BY column '%s' in query results without an aggregate function", exp_name(e)); return sql_error(sql, ERR_GROUPBY, SQLSTATE(42000) "SELECT: cannot use non GROUP BY column in query results without an aggregate function"); } - return rel_select_push_exp_down(sql, rel, e, ls, rs, rs2, f); + return rel_select_push_compare_exp_down(sql, rel, e, ls, rs, rs2, f); } static sql_rel * @@ -2696,7 +2700,7 @@ rel_logical_exp(sql_query *query, sql_re set_anti(le); set_has_no_nil(le); set_semantics(le); - return rel_select_push_exp_down(sql, rel, le, le->l, le->r, NULL, f); + return rel_select_push_compare_exp_down(sql, rel, le, le->l, le->r, NULL, f); } case SQL_NOT: { if (not_symbol_can_be_propagated(sql, sc->data.sym)) { @@ -2710,7 +2714,7 @@ rel_logical_exp(sql_query *query, sql_re if (!le || !(le = exp_check_type(sql, &bt, rel, le, type_equal))) return NULL; le = exp_compare(sql->sa, le, exp_atom_bool(sql->sa, 0), cmp_equal); - return rel_select_push_exp_down(sql, rel, le, le->l, le->r, NULL, f); + return rel_select_push_compare_exp_down(sql, rel, le, le->l, le->r, NULL, f); } case SQL_ATOM: { /* TRUE or FALSE */ @@ -2727,7 +2731,7 @@ rel_logical_exp(sql_query *query, sql_re if (!e || or != rel) return NULL; e = exp_compare(sql->sa, e, exp_atom_bool(sql->sa, 1), cmp_equal); - return rel_select_push_exp_down(sql, rel, e, e->l, e->r, NULL, f); + return rel_select_push_compare_exp_down(sql, rel, e, e->l, e->r, NULL, f); } case SQL_IDENT: case SQL_COLUMN: { @@ -2743,7 +2747,7 @@ rel_logical_exp(sql_query *query, sql_re if (!e || or != rel) return NULL; e = exp_compare(sql->sa, e, exp_atom_bool(sql->sa, 1), cmp_equal); - return rel_select_push_exp_down(sql, rel, e, e->l, e->r, NULL, f); + return rel_select_push_compare_exp_down(sql, rel, e, e->l, e->r, NULL, f); } case SQL_UNION: case SQL_EXCEPT: @@ -2784,7 +2788,7 @@ rel_logical_exp(sql_query *query, sql_re if (!le) return NULL; le = exp_compare(sql->sa, le, exp_atom_bool(sql->sa, 1), cmp_equal); - return rel_select_push_exp_down(sql, rel, le, le->l, le->r, NULL, f); + return rel_select_push_compare_exp_down(sql, rel, le, le->l, le->r, NULL, f); } else { sq = rel_crossproduct(sql->sa, rel, sq, (f==sql_sel || is_single(sq))?op_left:op_join); set_processed(sq); @@ -2799,13 +2803,16 @@ rel_logical_exp(sql_query *query, sql_re if (!le) return NULL; - if (le && !is_compare(le->type)) { + if (le && (!is_compare(le->type) || le->flag > cmp_filter)) { sql_find_subtype(&bt, "boolean", 0, 0); if (!(le = exp_check_type(sql, &bt, rel, le, type_equal))) return NULL; le = exp_compare(sql->sa, le, exp_atom_bool(sql->sa, 1), cmp_equal); } - return rel_select_push_exp_down(sql, rel, le, le->l, le->r, (le->flag < cmp_filter)?le->f:NULL, f); + if (le->flag == cmp_filter) + return rel_select_push_filter_exp_down(sql, rel, le, le->l, le->r, f); + else + return rel_select_push_compare_exp_down(sql, rel, le, le->l, le->r, le->f, f); } } /* never reached, as all switch cases have a `return` */ _______________________________________________ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org