| 320 | } |
| 321 | |
| 322 | DataTypePtr getExpressionNodeResultTypeOrNull(const QueryTreeNodePtr & query_tree_node) |
| 323 | { |
| 324 | auto node_type = query_tree_node->getNodeType(); |
| 325 | |
| 326 | switch (node_type) |
| 327 | { |
| 328 | case QueryTreeNodeType::CONSTANT: |
| 329 | [[fallthrough]]; |
| 330 | case QueryTreeNodeType::COLUMN: |
| 331 | { |
| 332 | return query_tree_node->getResultType(); |
| 333 | } |
| 334 | case QueryTreeNodeType::FUNCTION: |
| 335 | { |
| 336 | auto & function_node = query_tree_node->as<FunctionNode &>(); |
| 337 | if (function_node.isResolved()) |
| 338 | return function_node.getResultType(); |
| 339 | break; |
| 340 | } |
| 341 | default: |
| 342 | { |
| 343 | break; |
| 344 | } |
| 345 | } |
| 346 | |
| 347 | return nullptr; |
| 348 | } |
| 349 | |
| 350 | QueryTreeNodePtr buildCastFunction(const QueryTreeNodePtr & expression, |
| 351 | const DataTypePtr & type, |
no test coverage detected