Changeset: 2bcb3417a103 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/2bcb3417a103
Modified Files:
sql/backends/monet5/sql_statement.c
sql/server/rel_select.c
Branch: default
Log Message:
cleanup push exp handling in the rel_select part
fixed issue # 7463, handle candidate with filter expressions properly
diffs (165 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_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 -- [email protected]
To unsubscribe send an email to [email protected]