| 316 | |
| 317 | namespace { |
| 318 | std::pair< |
| 319 | std::vector<std::shared_ptr<const core::FieldAccessTypedExpr>>, |
| 320 | std::vector<core::SortOrder>> |
| 321 | parseOrderByClauses( |
| 322 | const std::vector<std::string>& keys, |
| 323 | const RowTypePtr& inputType, |
| 324 | memory::MemoryPool* pool) { |
| 325 | std::vector<std::shared_ptr<const core::FieldAccessTypedExpr>> sortingKeys; |
| 326 | std::vector<core::SortOrder> sortingOrders; |
| 327 | for (const auto& key : keys) { |
| 328 | auto [untypedExpr, sortOrder] = parse::parseOrderByExpr(key); |
| 329 | auto typedExpr = |
| 330 | core::Expressions::inferTypes(untypedExpr, inputType, pool); |
| 331 | |
| 332 | auto sortingKey = |
| 333 | std::dynamic_pointer_cast<const core::FieldAccessTypedExpr>(typedExpr); |
| 334 | BOLT_CHECK_NOT_NULL( |
| 335 | sortingKey, |
| 336 | "ORDER BY clause must use a column name, not an expression: {}", |
| 337 | key); |
| 338 | sortingKeys.emplace_back(sortingKey); |
| 339 | sortingOrders.emplace_back(sortOrder); |
| 340 | } |
| 341 | |
| 342 | return {sortingKeys, sortingOrders}; |
| 343 | } |
| 344 | } // namespace |
| 345 | |
| 346 | PlanBuilder& PlanBuilder::mergeExchange( |
no test coverage detected