Changeset: 96905a6ef18f for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/96905a6ef18f
Modified Files:
sql/server/rel_optimizer.c
sql/test/BugTracker-2017/Tests/side-effect.Bug-6397.test
sql/test/SQLancer/Tests/sqlancer19.SQL.py
sql/test/miscellaneous/Tests/simple_plans.test
Branch: default
Log Message:
Make sure rel_push_count_down returns the same output type
diffs (119 lines):
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
@@ -1594,51 +1594,49 @@ rel_push_count_down(visitor *v, sql_rel
r && !r->exps && r->op == op_join && !(rel_is_ref(r)) &&
/* currently only single count aggregation is handled, no other
projects or aggregation */
list_length(rel->exps) == 1 &&
exp_aggr_is_count(rel->exps->h->data)) {
- sql_exp *nce, *oce;
- sql_rel *gbl, *gbr; /* Group By */
- sql_rel *cp; /* Cross Product */
- sql_subfunc *mult;
- list *args, *types;
+ sql_exp *nce, *oce, *cnt1 = NULL, *cnt2 = NULL;
+ sql_rel *gbl = NULL, *gbr = NULL; /* Group By */
+ sql_rel *cp = NULL; /*
Cross Product */
sql_rel *srel;
oce = rel->exps->h->data;
if (oce->l) /* we only handle COUNT(*) */
return rel;
- args = new_exp_list(v->sql->sa);
srel = r->l;
{
sql_subfunc *cf = sql_bind_func(v->sql, "sys", "count",
sql_bind_localtype("void"), NULL, F_AGGR);
- sql_exp *cnt, *e = exp_aggr(v->sql->sa, NULL, cf,
need_distinct(oce), need_no_nil(oce), oce->card, 0);
+ sql_exp *e = exp_aggr(v->sql->sa, NULL, cf,
need_distinct(oce), need_no_nil(oce), oce->card, 0);
exp_label(v->sql->sa, e, ++v->sql->label);
- cnt = exp_ref(v->sql, e);
+ cnt1 = exp_ref(v->sql, e);
gbl = rel_groupby(v->sql, rel_dup(srel), NULL);
set_processed(gbl);
rel_groupby_add_aggr(v->sql, gbl, e);
- append(args, cnt);
}
srel = r->r;
{
sql_subfunc *cf = sql_bind_func(v->sql, "sys", "count",
sql_bind_localtype("void"), NULL, F_AGGR);
- sql_exp *cnt, *e = exp_aggr(v->sql->sa, NULL, cf,
need_distinct(oce), need_no_nil(oce), oce->card, 0);
+ sql_exp *e = exp_aggr(v->sql->sa, NULL, cf,
need_distinct(oce), need_no_nil(oce), oce->card, 0);
exp_label(v->sql->sa, e, ++v->sql->label);
- cnt = exp_ref(v->sql, e);
+ cnt2 = exp_ref(v->sql, e);
gbr = rel_groupby(v->sql, rel_dup(srel), NULL);
set_processed(gbr);
rel_groupby_add_aggr(v->sql, gbr, e);
- append(args, cnt);
}
cp = rel_crossproduct(v->sql->sa, gbl, gbr, op_join);
- types = sa_list(v->sql->sa);
- for(node *n = args->h; n; n = n->next)
- list_append(types, exp_subtype(n->data));
- mult = sql_bind_func_(v->sql, "sys", "sql_mul", types, F_FUNC);
- nce = exp_op(v->sql->sa, args, mult);
+ if (!(nce = rel_binop_(v->sql, NULL, cnt1, cnt2, "sys",
"sql_mul", card_value))) {
+ v->sql->session->status = 0;
+ v->sql->errstr[0] = '\0';
+ return rel; /* error, fallback to original expression */
+ }
+ /* because of remote plans, make sure "sql_mul" returns bigint.
The cardinality is atomic, so no major performance penalty */
+ if (subtype_cmp(exp_subtype(oce), exp_subtype(nce)) != 0)
+ nce = exp_convert(v->sql->sa, nce, exp_subtype(nce),
exp_subtype(oce));
if (exp_name(oce))
exp_prop_alias(v->sql->sa, nce, oce);
diff --git a/sql/test/BugTracker-2017/Tests/side-effect.Bug-6397.test
b/sql/test/BugTracker-2017/Tests/side-effect.Bug-6397.test
--- a/sql/test/BugTracker-2017/Tests/side-effect.Bug-6397.test
+++ b/sql/test/BugTracker-2017/Tests/side-effect.Bug-6397.test
@@ -32,6 +32,8 @@ bat.pack
5
bat.single
2
+batcalc.lng
+1
querylog.define
1
sql.my_generate_series
diff --git a/sql/test/SQLancer/Tests/sqlancer19.SQL.py
b/sql/test/SQLancer/Tests/sqlancer19.SQL.py
--- a/sql/test/SQLancer/Tests/sqlancer19.SQL.py
+++ b/sql/test/SQLancer/Tests/sqlancer19.SQL.py
@@ -257,11 +257,21 @@ with SQLTestCase() as cli:
cli.execute("SELECT 1 FROM v7 CROSS JOIN ((SELECT 1) UNION ALL (SELECT 2))
AS sub0(c0);") \
.assertSucceeded().assertDataResultMatch([(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,)])
cli.execute("""
+ SELECT 1 FROM (VALUES (2),(3)) x(x) FULL OUTER JOIN (SELECT t1.c1 <=
CAST(t1.c1 AS INT) FROM t1) AS sub0(c0) ON true WHERE sub0.c0
+ UNION ALL
+ SELECT 1 FROM (VALUES (2),(3)) x(x) FULL OUTER JOIN (SELECT t1.c1 <=
CAST(t1.c1 AS INT) FROM t1) AS sub0(c0) ON true;
+ """).assertSucceeded() \
+
.assertDataResultMatch([(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,)])
+ cli.execute("""
SELECT 1 FROM (VALUES (2),(3)) x(x) FULL OUTER JOIN (SELECT rt1.c1 <=
CAST(rt1.c1 AS INT) FROM rt1) AS sub0(c0) ON true WHERE sub0.c0
UNION ALL
SELECT 1 FROM (VALUES (2),(3)) x(x) FULL OUTER JOIN (SELECT rt1.c1 <=
CAST(rt1.c1 AS INT) FROM rt1) AS sub0(c0) ON true;
""").assertSucceeded() \
.assertDataResultMatch([(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,),(1,)])
+ cli.execute("SELECT count(0.3121149) FROM (select case when 2 > 1 then 0.3
end from (select 1 from t3) x(x)) v100(vc1), t3 WHERE 5 >= sinh(CAST(v100.vc1
AS REAL));") \
+ .assertSucceeded().assertDataResultMatch([(36,)])
+ cli.execute("SELECT count(0.3121149) FROM (select case when 2 > 1 then 0.3
end from (select 1 from rt3) x(x)) v100(vc1), rt3 WHERE 5 >= sinh(CAST(v100.vc1
AS REAL));") \
+ .assertSucceeded().assertDataResultMatch([(36,)])
cli.execute("ROLLBACK;")
cli.execute("CREATE FUNCTION mybooludf(a bool) RETURNS BOOL RETURN a;")
diff --git a/sql/test/miscellaneous/Tests/simple_plans.test
b/sql/test/miscellaneous/Tests/simple_plans.test
--- a/sql/test/miscellaneous/Tests/simple_plans.test
+++ b/sql/test/miscellaneous/Tests/simple_plans.test
@@ -477,7 +477,7 @@ project (
| | | [ "sys"."cnt"(clob "sys", clob "another_t") NOT NULL as "%2"."%2" ],
| | | [ "sys"."cnt"(clob "sys", clob "another_t") NOT NULL as "%3"."%3" ]
| | ) [ ]
-| ) [ "sys"."sql_mul"("%2"."%2" NOT NULL, "%3"."%3" NOT NULL) NOT NULL as
"%1"."%1" ]
+| ) [ bigint["sys"."sql_mul"("%2"."%2" NOT NULL, "%3"."%3" NOT NULL) NOT NULL]
NOT NULL as "%1"."%1" ]
) [ "%1"."%1" NOT NULL ]
statement ok
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list