Changed-lines coverage: PR changed C/C++ lines covered by tests: 89.68% (139/155) Uncovered changed code (with context): ================================================================================ src/Storages/MergeTree/KeyCondition.cpp ================================================================================ --- uncovered block 1045-1045 --- 1043 | { 1044 | if (node.type != ActionsDAG::ActionType::FUNCTION) >> 1045 | return false; 1046 | 1047 | const auto & name = node.function_base->getName(); --- uncovered block 1052-1064 --- 1050 | 1051 | if (node.children.size() != 2) >> 1052 | return false; 1053 | 1054 | const ActionsDAG::Node * fallback = node.children[1]; 1055 | if (fallback->type != ActionsDAG::ActionType::COLUMN || !fallback->column || !isColumnConst(*fallback->column)) >> 1056 | return false; 1057 | 1058 | const Field fallback_value = (*fallback->column)[0]; 1059 | switch (fallback_value.getType()) 1060 | { 1061 | case Field::Types::UInt64: return fallback_value.safeGet() == 0; >> 1062 | case Field::Types::Int64: return fallback_value.safeGet() == 0; >> 1063 | case Field::Types::Float64: return fallback_value.safeGet() == 0.0; >> 1064 | default: return false; 1065 | } 1066 | } --- uncovered block 1136-1136 --- 1134 | { 1135 | if (unwrapped->children.empty()) >> 1136 | return false; 1137 | unwrapped = unwrapped->children.front(); 1138 | } --- uncovered block 1181-1181 --- 1179 | 1180 | if (node.children.size() != 2) >> 1181 | return nullptr; 1182 | 1183 | auto is_const = [](const ActionsDAG::Node & n) --- uncovered block 1235-1235 --- 1233 | 1234 | if (node.children.size() != 2) >> 1235 | return nullptr; 1236 | 1237 | const ActionsDAG::Node * predicate = node.children[0]; --- uncovered block 1242-1250 --- 1240 | /// The right argument must be a constant column wrapping a prepared set. 1241 | if (set_node->type != ActionsDAG::ActionType::COLUMN || !set_node->column) >> 1242 | return nullptr; 1243 | 1244 | const auto * column_set = checkAndGetColumn(&set_node->column->getDataColumn()); 1245 | if (!column_set) >> 1246 | return nullptr; 1247 | 1248 | auto future_set = column_set->getData(); 1249 | if (!future_set) >> 1250 | return nullptr; 1251 | 1252 | /// Only single-column sets: `X` is a scalar predicate, so a tuple/multi-column set is not this shape. --- uncovered block 1282-1288 --- 1280 | const Columns set_elements = prepared_set->getSetElements(); 1281 | if (set_elements.size() != 1) >> 1282 | return nullptr; 1283 | 1284 | const IColumn & elements = *set_elements.front(); 1285 | const size_t num_elements = elements.size(); 1286 | /// Empty set: `X IN ()` is always false, not equivalent to `X`. Decline. 1287 | if (num_elements == 0) >> 1288 | return nullptr; 1289 | 1290 | /// Every element must be exactly `true` (non-NULL numeric 1). --- uncovered block 3925-3926 --- 3923 | } 3924 | >> 3925 | out.function = RPNElement::ALWAYS_FALSE; >> 3926 | return true; 3927 | } 3928 | WARNING: Failed to get start time for [Print Uncovered Code] - start time and duration won't be set --- Coverage counts --- Lines : baseline 883,899/1,029,828 -> current 883,990/1,029,955 (delta +91 / +127) Functions : baseline 949,950/1,025,191 -> current 949,950/1,025,196 (delta +0 / +5) Branches : baseline 285,643/366,102 -> current 285,644/366,214 (delta +1 / +112)