From 14afa7a4f5f97c47a8d0b7abe5fa23fb1c6b9247 Mon Sep 17 00:00:00 2001 From: Mytherin Date: Fri, 7 Feb 2025 09:59:16 +0100 Subject: [PATCH] Fix for dynamic filters generated through top-n --- src/postgres_filter_pushdown.cpp | 22 +++++++++++++++++----- test/sql/storage/attach_top_n.test | 20 ++++++++++++++++++++ 2 files changed, 37 insertions(+), 5 deletions(-) create mode 100644 test/sql/storage/attach_top_n.test diff --git a/src/postgres_filter_pushdown.cpp b/src/postgres_filter_pushdown.cpp index 0c54fc07..adc98953 100644 --- a/src/postgres_filter_pushdown.cpp +++ b/src/postgres_filter_pushdown.cpp @@ -11,7 +11,13 @@ string PostgresFilterPushdown::CreateExpression(string &column_name, vector filter_entries; for (auto &filter : filters) { - filter_entries.push_back(TransformFilter(column_name, *filter)); + auto filter_str = TransformFilter(column_name, *filter); + if (!filter_str.empty()) { + filter_entries.push_back(std::move(filter_str)); + } + } + if (filter_entries.empty()) { + return string(); } return "(" + StringUtil::Join(filter_entries, " " + op + " ") + ")"; } @@ -98,6 +104,8 @@ string PostgresFilterPushdown::TransformFilter(string &column_name, TableFilter } return column_name + " IN (" + in_list + ")"; } + case TableFilterType::DYNAMIC_FILTER: + return string(); default: throw InternalException("Unsupported table filter type"); } @@ -111,13 +119,17 @@ string PostgresFilterPushdown::TransformFilters(const vector &column_i } string result; for (auto &entry : filters->filters) { - if (!result.empty()) { - result += " AND "; - } auto column_name = KeywordHelper::WriteQuoted(names[column_ids[entry.first]], '"'); auto &filter = *entry.second; + auto filter_text = TransformFilter(column_name, filter); - result += TransformFilter(column_name, filter); + if (filter_text.empty()) { + continue; + } + if (!result.empty()) { + result += " AND "; + } + result += filter_text; } return result; } diff --git a/test/sql/storage/attach_top_n.test b/test/sql/storage/attach_top_n.test new file mode 100644 index 00000000..7c69eb9b --- /dev/null +++ b/test/sql/storage/attach_top_n.test @@ -0,0 +1,20 @@ +# name: test/sql/storage/attach_top_n.test +# description: Attach with Top-N queries +# group: [storage] + +require postgres_scanner + +require-env POSTGRES_TEST_DATABASE_AVAILABLE + +statement ok +ATTACH 'dbname=postgresscanner' AS s (TYPE POSTGRES); + +query IIIIIIII +select * from s.pg_numtypes order by smallint_col limit 1 +---- +false -42 -42 -42 -42.01 -42.01 -42.0 -42.01 + +query IIIIIIII +select * from s.pg_numtypes where smallint_col >= 0 order by 2 limit 1 +---- +0 0 0 0 0.0 0.0 0.0 0.0