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