From cae5759b461c7d450f627427fed7032b3290276a Mon Sep 17 00:00:00 2001 From: Lloyd-Pottiger Date: Tue, 18 Apr 2023 18:14:08 +0800 Subject: [PATCH 1/2] refine some code in lm Signed-off-by: Lloyd-Pottiger --- dbms/src/Debug/MockStorage.cpp | 6 +-- dbms/src/Flash/Coprocessor/DAGQueryInfo.h | 16 +++--- .../Coprocessor/DAGStorageInterpreter.cpp | 3 +- dbms/src/Flash/Coprocessor/DAGUtils.cpp | 24 ++------- dbms/src/Flash/Coprocessor/DAGUtils.h | 1 - dbms/src/Storages/StorageDeltaMerge.cpp | 51 ++++--------------- dbms/src/Storages/StorageDeltaMerge.h | 2 +- .../Storages/StorageDisaggregatedRemote.cpp | 4 +- .../Storages/tests/gtest_filter_parser.cpp | 14 +++-- .../tests/gtests_parse_push_down_filter.cpp | 47 ++++++----------- 10 files changed, 49 insertions(+), 119 deletions(-) diff --git a/dbms/src/Debug/MockStorage.cpp b/dbms/src/Debug/MockStorage.cpp index 8759cc49226..ab42f0c14a5 100644 --- a/dbms/src/Debug/MockStorage.cpp +++ b/dbms/src/Debug/MockStorage.cpp @@ -145,10 +145,11 @@ std::tuple MockStorage::prepareFor { assert(tableExistsForDeltaMerge(table_id)); auto storage = storage_delta_merge_map[table_id]; - auto column_infos = table_schema_for_delta_merge[table_id]; + auto & column_infos = table_schema_for_delta_merge[table_id]; assert(storage); assert(!column_infos.empty()); Names column_names; + column_names.reserve(column_infos.size()); for (const auto & column_info : column_infos) column_names.push_back(column_info.name); @@ -171,8 +172,7 @@ BlockInputStreamPtr MockStorage::getStreamFromDeltaMerge(Context & context, Int6 query_info.dag_query = std::make_unique( filter_conditions->conditions, pushed_down_filters, // Not care now - analyzer->getPreparedSets(), - analyzer->getCurrentInputColumns(), + mockColumnInfosToTiDBColumnInfos(table_schema_for_delta_merge[table_id]), context.getTimezoneInfo()); auto [before_where, filter_column_name, project_after_where] = ::DB::buildPushDownFilter(filter_conditions->conditions, *analyzer); BlockInputStreams ins = storage->read(column_names, query_info, context, stage, 8192, 1); // TODO: Support config max_block_size and num_streams diff --git a/dbms/src/Flash/Coprocessor/DAGQueryInfo.h b/dbms/src/Flash/Coprocessor/DAGQueryInfo.h index 07fbe9f97f5..bdea67838c0 100644 --- a/dbms/src/Flash/Coprocessor/DAGQueryInfo.h +++ b/dbms/src/Flash/Coprocessor/DAGQueryInfo.h @@ -14,9 +14,10 @@ #pragma once -#include -#include -#include +#include +#include +#include +#include #include @@ -29,23 +30,18 @@ struct DAGQueryInfo DAGQueryInfo( const google::protobuf::RepeatedPtrField & filters_, const google::protobuf::RepeatedPtrField & pushed_down_filters_, - DAGPreparedSets dag_sets_, - const NamesAndTypes & source_columns_, + const ColumnInfos & source_columns_, const TimezoneInfo & timezone_info_) : source_columns(source_columns_) , filters(filters_) , pushed_down_filters(pushed_down_filters_) - , dag_sets(std::move(dag_sets_)) , timezone_info(timezone_info_){}; - const NamesAndTypes & source_columns; + const ColumnInfos & source_columns; // filters in dag request const google::protobuf::RepeatedPtrField & filters; // filters have been push down to storage engine in dag request const google::protobuf::RepeatedPtrField & pushed_down_filters; - // Prepared sets extracted from dag request, which are used for indices - // by storage engine. - DAGPreparedSets dag_sets; const TimezoneInfo & timezone_info; }; diff --git a/dbms/src/Flash/Coprocessor/DAGStorageInterpreter.cpp b/dbms/src/Flash/Coprocessor/DAGStorageInterpreter.cpp index 95199cd48dd..cac45e7ad1e 100644 --- a/dbms/src/Flash/Coprocessor/DAGStorageInterpreter.cpp +++ b/dbms/src/Flash/Coprocessor/DAGStorageInterpreter.cpp @@ -599,8 +599,7 @@ std::unordered_map DAGStorageInterpreter::generateSele query_info.dag_query = std::make_unique( filter_conditions.conditions, table_scan.getPushedDownFilters(), - analyzer->getPreparedSets(), - analyzer->getCurrentInputColumns(), + table_scan.getColumns(), context.getTimezoneInfo()); query_info.req_id = fmt::format("{} table_id={}", log->identifier(), table_id); query_info.keep_order = table_scan.keepOrder(); diff --git a/dbms/src/Flash/Coprocessor/DAGUtils.cpp b/dbms/src/Flash/Coprocessor/DAGUtils.cpp index d965a9a2b51..31c98fa6dbf 100644 --- a/dbms/src/Flash/Coprocessor/DAGUtils.cpp +++ b/dbms/src/Flash/Coprocessor/DAGUtils.cpp @@ -1094,7 +1094,7 @@ Field decodeLiteral(const tipb::Expr & expr) case tipb::ExprType::Uint64: return decodeDAGUInt64(expr.val()); case tipb::ExprType::Float32: - return Float64(decodeDAGFloat32(expr.val())); + return static_cast(decodeDAGFloat32(expr.val())); case tipb::ExprType::Float64: return decodeDAGFloat64(expr.val()); case tipb::ExprType::String: @@ -1167,24 +1167,6 @@ void getColumnIDsFromExpr(const tipb::Expr & expr, const std::vector } } -void getColumnNamesFromExpr(const tipb::Expr & expr, const std::vector & input_col, std::unordered_set & col_id_set) -{ - if (expr.children_size() == 0) - { - if (isColumnExpr(expr)) - { - col_id_set.insert(getColumnNameForColumnExpr(expr, input_col)); - } - } - else - { - for (const auto & child : expr.children()) - { - getColumnNamesFromExpr(child, input_col, col_id_set); - } - } -} - NameAndTypePair getColumnNameAndTypeForColumnExpr(const tipb::Expr & expr, const std::vector & input_col) { auto column_index = decodeDAGInt64(expr.val()); @@ -1204,8 +1186,8 @@ NameAndTypePair getColumnNameAndTypeForColumnExpr(const tipb::Expr & expr, const bool exprHasValidFieldType(const tipb::Expr & expr) { return expr.has_field_type() - && !(expr.field_type().tp() == TiDB::TP::TypeNewDecimal - && (expr.field_type().decimal() == -1 || expr.field_type().flen() == 0 || expr.field_type().flen() == -1)); + && (expr.field_type().tp() != TiDB::TP::TypeNewDecimal + || (expr.field_type().decimal() != -1 && expr.field_type().flen() != 0 && expr.field_type().flen() != -1)); } bool isUnsupportedEncodeType(const std::vector & types, tipb::EncodeType encode_type) diff --git a/dbms/src/Flash/Coprocessor/DAGUtils.h b/dbms/src/Flash/Coprocessor/DAGUtils.h index 7b7800871a6..ea7430f2ec1 100644 --- a/dbms/src/Flash/Coprocessor/DAGUtils.h +++ b/dbms/src/Flash/Coprocessor/DAGUtils.h @@ -48,7 +48,6 @@ String getJoinExecTypeName(const tipb::JoinExecType & tp); bool isColumnExpr(const tipb::Expr & expr); String getColumnNameForColumnExpr(const tipb::Expr & expr, const std::vector & input_col); void getColumnIDsFromExpr(const tipb::Expr & expr, const std::vector & input_col, std::unordered_set & col_id_set); -void getColumnNamesFromExpr(const tipb::Expr & expr, const std::vector & input_col, std::unordered_set & col_id_set); NameAndTypePair getColumnNameAndTypeForColumnExpr(const tipb::Expr & expr, const std::vector & input_col); const String & getTypeName(const tipb::Expr & expr); String exprToString(const tipb::Expr & expr, const std::vector & input_col); diff --git a/dbms/src/Storages/StorageDeltaMerge.cpp b/dbms/src/Storages/StorageDeltaMerge.cpp index 55ae1bdf4b7..bc94062f828 100644 --- a/dbms/src/Storages/StorageDeltaMerge.cpp +++ b/dbms/src/Storages/StorageDeltaMerge.cpp @@ -740,7 +740,7 @@ DM::RSOperatorPtr StorageDeltaMerge::buildRSOperator(const SelectQueryInfo & que } DM::PushDownFilterPtr StorageDeltaMerge::buildPushDownFilter(const RSOperatorPtr & rs_operator, - const ColumnInfos & table_infos, + const ColumnInfos & table_scan_column_info, const google::protobuf::RepeatedPtrField & pushed_down_filters, const ColumnDefines & columns_to_read, const Context & context, @@ -753,58 +753,28 @@ DM::PushDownFilterPtr StorageDeltaMerge::buildPushDownFilter(const RSOperatorPtr { columns_to_read_name_and_type.emplace_back(col.name, col.type); } - - std::unordered_set filter_column_names; - for (const auto & filter : pushed_down_filters) + std::unordered_set filter_col_id_set; + for (const auto & expr : pushed_down_filters) { - DB::getColumnNamesFromExpr(filter, columns_to_read_name_and_type, filter_column_names); + getColumnIDsFromExpr(expr, table_scan_column_info, filter_col_id_set); } ColumnDefines filter_columns; - filter_columns.reserve(filter_column_names.size()); - for (const auto & name : filter_column_names) + filter_columns.reserve(filter_col_id_set.size()); + for (const auto & id : filter_col_id_set) { auto iter = std::find_if( columns_to_read.begin(), columns_to_read.end(), - [&name](const ColumnDefine & d) -> bool { return d.name == name; }); + [&id](const ColumnDefine & d) -> bool { return d.id == id; }); RUNTIME_CHECK(iter != columns_to_read.end()); filter_columns.push_back(*iter); } - ColumnInfos table_scan_column_info; - table_scan_column_info.reserve(columns_to_read.size()); - for (const auto & col : columns_to_read) - { - // table_infos does not contain EXTRA_HANDLE_COLUMN and EXTRA_TABLE_ID_COLUMN - if (col.id == EXTRA_HANDLE_COLUMN_ID) - { - auto handle = ColumnInfo(); - handle.id = EXTRA_HANDLE_COLUMN_ID; - handle.name = EXTRA_HANDLE_COLUMN_NAME; - table_scan_column_info.push_back(handle); - continue; - } - else if (col.id == ExtraTableIDColumnID) - { - auto col = ColumnInfo(); - col.id = ExtraTableIDColumnID; - col.name = EXTRA_TABLE_ID_COLUMN_NAME; - table_scan_column_info.push_back(col); - continue; - } - auto iter = std::find_if( - table_infos.begin(), - table_infos.end(), - [col](const ColumnInfo & c) -> bool { return c.id == col.id; }); - RUNTIME_CHECK_MSG(iter != table_infos.end(), "column: [id: {}, name: {}] not found in table info", col.id, col.name); - table_scan_column_info.push_back(*iter); - } - std::vector need_cast_column; need_cast_column.reserve(columns_to_read.size()); for (const auto & col : table_scan_column_info) { - if (!filter_column_names.contains(col.name)) + if (!filter_col_id_set.contains(col.id)) { need_cast_column.push_back(ExtraCastAfterTSMode::None); } @@ -829,7 +799,7 @@ DM::PushDownFilterPtr StorageDeltaMerge::buildPushDownFilter(const RSOperatorPtr NamesWithAliases project_cols; for (size_t i = 0; i < columns_to_read.size(); ++i) { - if (filter_column_names.contains(columns_to_read[i].name)) + if (filter_col_id_set.contains(columns_to_read[i].id)) { project_cols.emplace_back(casted_columns[i], columns_to_read[i].name); } @@ -866,7 +836,8 @@ DM::PushDownFilterPtr StorageDeltaMerge::parsePushDownFilter(const SelectQueryIn // build push down filter const auto & pushed_down_filters = query_info.dag_query != nullptr ? query_info.dag_query->pushed_down_filters : google::protobuf::RepeatedPtrField{}; - return buildPushDownFilter(rs_operator, tidb_table_info.columns, pushed_down_filters, columns_to_read, context, tracing_logger); + const auto & columns_to_read_info = query_info.dag_query != nullptr ? query_info.dag_query->source_columns : ColumnInfos{}; + return buildPushDownFilter(rs_operator, columns_to_read_info, pushed_down_filters, columns_to_read, context, tracing_logger); } BlockInputStreams StorageDeltaMerge::read( diff --git a/dbms/src/Storages/StorageDeltaMerge.h b/dbms/src/Storages/StorageDeltaMerge.h index 9e4efee72ed..d642e622c43 100644 --- a/dbms/src/Storages/StorageDeltaMerge.h +++ b/dbms/src/Storages/StorageDeltaMerge.h @@ -190,7 +190,7 @@ class StorageDeltaMerge } static DM::PushDownFilterPtr buildPushDownFilter(const DM::RSOperatorPtr & rs_operator, - const ColumnInfos & table_infos, + const ColumnInfos & table_scan_column_info, const google::protobuf::RepeatedPtrField & pushed_down_filters, const DM::ColumnDefines & columns_to_read, const Context & context, diff --git a/dbms/src/Storages/StorageDisaggregatedRemote.cpp b/dbms/src/Storages/StorageDisaggregatedRemote.cpp index 6941b7b5686..2eb771677ef 100644 --- a/dbms/src/Storages/StorageDisaggregatedRemote.cpp +++ b/dbms/src/Storages/StorageDisaggregatedRemote.cpp @@ -45,6 +45,7 @@ #include #include #include +#include #include #include #include @@ -433,8 +434,7 @@ DM::RSOperatorPtr StorageDisaggregated::buildRSOperator( auto dag_query = std::make_unique( filter_conditions.conditions, table_scan.getPushedDownFilters(), - DAGPreparedSets{}, // Not care now - NamesAndTypes{}, // Not care now + table_scan.getColumns(), db_context.getTimezoneInfo()); auto create_attr_by_column_id = [defines = columns_to_read](ColumnID column_id) -> DM::Attr { auto iter = std::find_if( diff --git a/dbms/src/Storages/tests/gtest_filter_parser.cpp b/dbms/src/Storages/tests/gtest_filter_parser.cpp index 82646d6295a..4585bc4d2f4 100644 --- a/dbms/src/Storages/tests/gtest_filter_parser.cpp +++ b/dbms/src/Storages/tests/gtest_filter_parser.cpp @@ -94,20 +94,18 @@ DM::RSOperatorPtr FilterParserTest::generateRsOperator(const String table_info_j std::unique_ptr dag_query; DM::ColumnDefines columns_to_read; + columns_to_read.reserve(table_info.columns.size()); { - NamesAndTypes source_columns; - std::tie(source_columns, std::ignore) = parseColumnsFromTableInfo(table_info); + for (const auto & column : table_info.columns) + { + columns_to_read.push_back(DM::ColumnDefine(column.id, column.name, getDataTypeByColumnInfo(column))); + } const google::protobuf::RepeatedPtrField pushed_down_filters; dag_query = std::make_unique( conditions, google::protobuf::RepeatedPtrField{}, // don't care pushed down filters - DAGPreparedSets(), - source_columns, + table_info.columns, timezone_info); - for (const auto & column : table_info.columns) - { - columns_to_read.push_back(DM::ColumnDefine(column.id, column.name, getDataTypeByColumnInfo(column))); - } } auto create_attr_by_column_id = [&columns_to_read](ColumnID column_id) -> DM::Attr { auto iter = std::find_if( diff --git a/dbms/src/Storages/tests/gtests_parse_push_down_filter.cpp b/dbms/src/Storages/tests/gtests_parse_push_down_filter.cpp index 6ce86f4027e..6ee026ef456 100644 --- a/dbms/src/Storages/tests/gtests_parse_push_down_filter.cpp +++ b/dbms/src/Storages/tests/gtests_parse_push_down_filter.cpp @@ -82,19 +82,17 @@ DM::PushDownFilterPtr ParsePushDownFilterTest::generatePushDownFilter(const Stri std::unique_ptr dag_query; DM::ColumnDefines columns_to_read; + columns_to_read.reserve(table_info.columns.size()); { - NamesAndTypes source_columns; - std::tie(source_columns, std::ignore) = parseColumnsFromTableInfo(table_info); - dag_query = std::make_unique( - conditions, - pushed_down_filters, - DAGPreparedSets(), - source_columns, - timezone_info); for (const auto & column : table_info.columns) { columns_to_read.push_back(DM::ColumnDefine(column.id, column.name, getDataTypeByColumnInfo(column))); } + dag_query = std::make_unique( + conditions, + pushed_down_filters, + table_info.columns, + timezone_info); } auto create_attr_by_column_id = [&columns_to_read](ColumnID column_id) -> DM::Attr { @@ -119,41 +117,28 @@ DM::PushDownFilterPtr ParsePushDownFilterTest::generatePushDownFilter(const Stri columns_to_read_name_and_type.emplace_back(col.name, col.type); } - std::unordered_set filter_column_names; - for (const auto & filter : dag_query->pushed_down_filters) + std::unordered_set filter_col_id_set; + for (const auto & expr : pushed_down_filters) { - DB::getColumnNamesFromExpr(filter, columns_to_read_name_and_type, filter_column_names); + getColumnIDsFromExpr(expr, table_info.columns, filter_col_id_set); } DM::ColumnDefines filter_columns; - filter_columns.reserve(filter_column_names.size()); - for (const auto & name : filter_column_names) + filter_columns.reserve(filter_col_id_set.size()); + for (const auto & id : filter_col_id_set) { auto iter = std::find_if( columns_to_read.begin(), columns_to_read.end(), - [&name](const DM::ColumnDefine & d) -> bool { return d.name == name; }); + [&id](const DM::ColumnDefine & d) -> bool { return d.id == id; }); RUNTIME_CHECK(iter != columns_to_read.end()); filter_columns.push_back(*iter); } - ColumnInfos table_scan_column_info; - table_scan_column_info.reserve(columns_to_read.size()); - const auto & table_infos = table_info.columns; - for (const auto & col : columns_to_read) - { - auto iter = std::find_if( - table_infos.begin(), - table_infos.end(), - [col](const ColumnInfo & c) -> bool { return c.id == col.id; }); - RUNTIME_CHECK(iter != table_infos.end()); - table_scan_column_info.push_back(*iter); - } - std::vector need_cast_column; need_cast_column.reserve(columns_to_read.size()); - for (const auto & col : table_scan_column_info) + for (const auto & col : table_info.columns) { - if (!filter_column_names.contains(col.name)) + if (!filter_col_id_set.contains(col.id)) { need_cast_column.push_back(ExtraCastAfterTSMode::None); } @@ -173,12 +158,12 @@ DM::PushDownFilterPtr ParsePushDownFilterTest::generatePushDownFilter(const Stri auto & step = analyzer->initAndGetLastStep(chain); auto & actions = step.actions; ExpressionActionsPtr extra_cast = nullptr; - if (auto [has_cast, casted_columns] = analyzer->buildExtraCastsAfterTS(actions, need_cast_column, table_scan_column_info); has_cast) + if (auto [has_cast, casted_columns] = analyzer->buildExtraCastsAfterTS(actions, need_cast_column, table_info.columns); has_cast) { NamesWithAliases project_cols; for (size_t i = 0; i < columns_to_read.size(); ++i) { - if (filter_column_names.contains(columns_to_read[i].name)) + if (filter_col_id_set.contains(columns_to_read[i].id)) { project_cols.emplace_back(casted_columns[i], columns_to_read[i].name); } From cfe190ea21f36005452907ee4eb007c0da19bd42 Mon Sep 17 00:00:00 2001 From: Lloyd-Pottiger Date: Tue, 18 Apr 2023 18:31:16 +0800 Subject: [PATCH 2/2] refine more Signed-off-by: Lloyd-Pottiger --- .../Storages/tests/gtest_filter_parser.cpp | 4 +- .../tests/gtests_parse_push_down_filter.cpp | 83 +------------------ 2 files changed, 5 insertions(+), 82 deletions(-) diff --git a/dbms/src/Storages/tests/gtest_filter_parser.cpp b/dbms/src/Storages/tests/gtest_filter_parser.cpp index 4585bc4d2f4..0d77c72f744 100644 --- a/dbms/src/Storages/tests/gtest_filter_parser.cpp +++ b/dbms/src/Storages/tests/gtest_filter_parser.cpp @@ -100,10 +100,10 @@ DM::RSOperatorPtr FilterParserTest::generateRsOperator(const String table_info_j { columns_to_read.push_back(DM::ColumnDefine(column.id, column.name, getDataTypeByColumnInfo(column))); } - const google::protobuf::RepeatedPtrField pushed_down_filters; + const google::protobuf::RepeatedPtrField pushed_down_filters; // don't care pushed down filters dag_query = std::make_unique( conditions, - google::protobuf::RepeatedPtrField{}, // don't care pushed down filters + pushed_down_filters, table_info.columns, timezone_info); } diff --git a/dbms/src/Storages/tests/gtests_parse_push_down_filter.cpp b/dbms/src/Storages/tests/gtests_parse_push_down_filter.cpp index 6ee026ef456..65c4f7fd1cb 100644 --- a/dbms/src/Storages/tests/gtests_parse_push_down_filter.cpp +++ b/dbms/src/Storages/tests/gtests_parse_push_down_filter.cpp @@ -15,15 +15,14 @@ #include #include #include -#include #include #include -#include #include #include #include #include #include +#include #include #include #include @@ -107,84 +106,8 @@ DM::PushDownFilterPtr ParsePushDownFilterTest::generatePushDownFilter(const Stri }; auto rs_operator = DM::FilterParser::parseDAGQuery(*dag_query, columns_to_read, std::move(create_attr_by_column_id), log); - - // build push down filter - if (!dag_query->pushed_down_filters.empty()) - { - NamesAndTypes columns_to_read_name_and_type; - for (const auto & col : columns_to_read) - { - columns_to_read_name_and_type.emplace_back(col.name, col.type); - } - - std::unordered_set filter_col_id_set; - for (const auto & expr : pushed_down_filters) - { - getColumnIDsFromExpr(expr, table_info.columns, filter_col_id_set); - } - DM::ColumnDefines filter_columns; - filter_columns.reserve(filter_col_id_set.size()); - for (const auto & id : filter_col_id_set) - { - auto iter = std::find_if( - columns_to_read.begin(), - columns_to_read.end(), - [&id](const DM::ColumnDefine & d) -> bool { return d.id == id; }); - RUNTIME_CHECK(iter != columns_to_read.end()); - filter_columns.push_back(*iter); - } - - std::vector need_cast_column; - need_cast_column.reserve(columns_to_read.size()); - for (const auto & col : table_info.columns) - { - if (!filter_col_id_set.contains(col.id)) - { - need_cast_column.push_back(ExtraCastAfterTSMode::None); - } - else - { - if (col.id != -1 && col.tp == TiDB::TypeTimestamp) - need_cast_column.push_back(ExtraCastAfterTSMode::AppendTimeZoneCast); - else if (col.id != -1 && col.tp == TiDB::TypeTime) - need_cast_column.push_back(ExtraCastAfterTSMode::AppendDurationCast); - else - need_cast_column.push_back(ExtraCastAfterTSMode::None); - } - } - - std::unique_ptr analyzer = std::make_unique(columns_to_read_name_and_type, *ctx); - ExpressionActionsChain chain; - auto & step = analyzer->initAndGetLastStep(chain); - auto & actions = step.actions; - ExpressionActionsPtr extra_cast = nullptr; - if (auto [has_cast, casted_columns] = analyzer->buildExtraCastsAfterTS(actions, need_cast_column, table_info.columns); has_cast) - { - NamesWithAliases project_cols; - for (size_t i = 0; i < columns_to_read.size(); ++i) - { - if (filter_col_id_set.contains(columns_to_read[i].id)) - { - project_cols.emplace_back(casted_columns[i], columns_to_read[i].name); - } - } - actions->add(ExpressionAction::project(project_cols)); - - for (auto & col : filter_columns) - step.required_output.push_back(col.name); - - extra_cast = chain.getLastActions(); - assert(extra_cast); - chain.finalize(); - chain.clear(); - } - - // build filter expression actions - auto [before_where, filter_column_name, _] = ::DB::buildPushDownFilter(dag_query->pushed_down_filters, *analyzer); - - return std::make_shared(rs_operator, before_where, filter_columns, filter_column_name, extra_cast); - } - return std::make_shared(rs_operator); + auto push_down_filter = StorageDeltaMerge::buildPushDownFilter(rs_operator, table_info.columns, pushed_down_filters, columns_to_read, *ctx, log); + return push_down_filter; } // Test cases for col and literal