Mercurial > hg > MonetDB
changeset 86139:85d2040d989d select-window-pushdown
Fix select window pushdown for string filters
| author | nuno-faria <nunofpfaria@gmail.com> |
|---|---|
| date | Thu, 21 Jul 2022 14:08:35 +0100 |
| parents | 4f6d106502de |
| children | c5e9e0a524cc b226dd5edbe8 |
| files | sql/server/rel_optimizer.c sql/test/Tests/select_window_pushdown.test |
| diffstat | 2 files changed, 43 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/sql/server/rel_optimizer.c +++ b/sql/server/rel_optimizer.c @@ -4521,6 +4521,11 @@ get_aggregation_key_columns(sql_allocato */ static int filter_column_in_aggregation_columns(sql_exp *column, list *aggColumns) { + /* check if it is a column or an e_convert, and get the actual column if it is the latter */ + if (column->type == e_convert) { + column = column->l; + } + char *tableName = column->l; char *columnName = column->r;
--- a/sql/test/Tests/select_window_pushdown.test +++ b/sql/test/Tests/select_window_pushdown.test @@ -226,3 +226,41 @@ project ( statement ok DROP TABLE Test + + +# test with string filters +# (previously e_convert were not being considered) +statement ok +CREATE TABLE Test (k varchar(100), v int); + +statement ok +INSERT INTO Test SELECT value % 10 as k, value as v FROM generate_series(1, 100); + +query T nosort +plan SELECT * +FROM ( + SELECT *, rank() OVER (PARTITION BY k ORDER BY v DESC) AS rank + FROM ( + SELECT k, v, v % 2 = 0 AS flag + FROM Test + ) t1 +) t2 +WHERE rank = 1 AND NOT flag AND k = '10'; +---- +project ( +| select ( +| | project ( +| | | project ( +| | | | project ( +| | | | | select ( +| | | | | | table("sys"."test") [ "test"."k", "test"."v" ] +| | | | | ) [ (char(100)["test"."k"]) = (char(100) "10") ] +| | | | ) [ "test"."k" as "t1"."k", "test"."v" as "t1"."v", "sys"."mod"("test"."v", int(32) "2") as "%1"."%1", "sys"."="("%1"."%1", int(32) "0") as "t1"."flag" ] +| | | ) [ "t1"."k", "t1"."v", "t1"."flag" ] [ "t1"."k" ASC, "t1"."v" NULLS LAST ] +| | ) [ "t1"."k", "t1"."v", "t1"."flag", "sys"."rank"("sys"."star"(), "sys"."diff"("t1"."k"), "sys"."diff"("t1"."v")) as "t2"."rank" ] +| ) [ ("t1"."flag") = (boolean(1) "false"), ("t2"."rank") = (int(32) "1") ] +) [ "t1"."k" as "t2"."k", "t1"."v" as "t2"."v", "t1"."flag" as "t2"."flag", "t2"."rank" ] + + +statement ok +DROP TABLE Test
