diff --git a/dbms/src/Flash/Coprocessor/DAGStorageInterpreter.cpp b/dbms/src/Flash/Coprocessor/DAGStorageInterpreter.cpp index d72ba909502..3f47a273977 100644 --- a/dbms/src/Flash/Coprocessor/DAGStorageInterpreter.cpp +++ b/dbms/src/Flash/Coprocessor/DAGStorageInterpreter.cpp @@ -1038,14 +1038,14 @@ std::tuple> DAGStorageIn required_columns_tmp.emplace_back(std::move(name)); } - std::unordered_set col_name_set; + std::unordered_set col_id_set; for (const auto & expr : table_scan.getPushedDownFilters()) { - getColumnNamesFromExpr(expr, source_columns_tmp, col_name_set); + getColumnIDsFromExpr(expr, table_scan.getColumns(), col_id_set); } for (const auto & col : table_scan.getColumns()) { - if (col_name_set.contains(col.name)) + if (col_id_set.contains(col.id)) { need_cast_column.push_back(ExtraCastAfterTSMode::None); } diff --git a/dbms/src/Flash/Coprocessor/DAGUtils.cpp b/dbms/src/Flash/Coprocessor/DAGUtils.cpp old mode 100755 new mode 100644 index 65daaa6a825..d965a9a2b51 --- a/dbms/src/Flash/Coprocessor/DAGUtils.cpp +++ b/dbms/src/Flash/Coprocessor/DAGUtils.cpp @@ -23,8 +23,6 @@ #include #include #include -#include -#include #include namespace DB @@ -1136,25 +1134,53 @@ String getColumnNameForColumnExpr(const tipb::Expr & expr, const std::vector= static_cast(input_col.size())) { - throw TiFlashException("Column index out of bound", Errors::Coprocessor::BadRequest); + throw TiFlashException(Errors::Coprocessor::BadRequest, "Column index out of bound, expr: {}, size of input columns: {}", expr.DebugString(), input_col.size()); } return input_col[column_index].name; } -void getColumnNamesFromExpr(const tipb::Expr & expr, const std::vector & input_col, std::unordered_set & col_name_set) +ColumnID getColumnIDForColumnExpr(const tipb::Expr & expr, const std::vector & input_col) +{ + auto column_index = decodeDAGInt64(expr.val()); + if (column_index < 0 || column_index >= static_cast(input_col.size())) + { + throw TiFlashException(Errors::Coprocessor::BadRequest, "Column index out of bound, expr: {}, size of input columns: {}", expr.DebugString(), input_col.size()); + } + return input_col[column_index].id; +} + +void getColumnIDsFromExpr(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(getColumnIDForColumnExpr(expr, input_col)); + } + } + else + { + for (const auto & child : expr.children()) + { + getColumnIDsFromExpr(child, input_col, col_id_set); + } + } +} + +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_name_set.insert(getColumnNameForColumnExpr(expr, input_col)); + col_id_set.insert(getColumnNameForColumnExpr(expr, input_col)); } } else { for (const auto & child : expr.children()) { - getColumnNamesFromExpr(child, input_col, col_name_set); + getColumnNamesFromExpr(child, input_col, col_id_set); } } } diff --git a/dbms/src/Flash/Coprocessor/DAGUtils.h b/dbms/src/Flash/Coprocessor/DAGUtils.h index 4241637c279..7b7800871a6 100644 --- a/dbms/src/Flash/Coprocessor/DAGUtils.h +++ b/dbms/src/Flash/Coprocessor/DAGUtils.h @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -46,7 +47,8 @@ String getFieldTypeName(Int32 tp); String getJoinExecTypeName(const tipb::JoinExecType & tp); bool isColumnExpr(const tipb::Expr & expr); String getColumnNameForColumnExpr(const tipb::Expr & expr, const std::vector & input_col); -void getColumnNamesFromExpr(const tipb::Expr & expr, const std::vector & input_col, std::unordered_set & col_name_set); +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 2ca9b9237c7..99546f1e36e 100644 --- a/dbms/src/Storages/StorageDeltaMerge.cpp +++ b/dbms/src/Storages/StorageDeltaMerge.cpp @@ -767,11 +767,28 @@ DM::PushDownFilterPtr StorageDeltaMerge::parsePushDownFilter(const SelectQueryIn const auto & table_infos = tidb_table_info.columns; 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(iter != table_infos.end()); + 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); }