| 42 | } |
| 43 | |
| 44 | std::unique_ptr<BoundRegularQuery> Binder::bindQuery(const Statement& statement) { |
| 45 | auto& regularQuery = statement.constCast<RegularQuery>(); |
| 46 | std::vector<NormalizedSingleQuery> normalizedSingleQueries; |
| 47 | for (auto i = 0u; i < regularQuery.getNumSingleQueries(); i++) { |
| 48 | // Don't clear scope within bindSingleQuery() yet because it is also used for subquery |
| 49 | // binding. |
| 50 | scope.clear(); |
| 51 | normalizedSingleQueries.push_back(bindSingleQuery(*regularQuery.getSingleQuery(i))); |
| 52 | } |
| 53 | validateUnionColumnsOfTheSameType(normalizedSingleQueries); |
| 54 | DASSERT(!normalizedSingleQueries.empty()); |
| 55 | auto boundRegularQuery = std::make_unique<BoundRegularQuery>(regularQuery.getIsUnionAll(), |
| 56 | normalizedSingleQueries[0].getStatementResult()->copy()); |
| 57 | for (auto& normalizedSingleQuery : normalizedSingleQueries) { |
| 58 | boundRegularQuery->addSingleQuery(std::move(normalizedSingleQuery)); |
| 59 | } |
| 60 | validateIsAllUnionOrUnionAll(*boundRegularQuery); |
| 61 | return boundRegularQuery; |
| 62 | } |
| 63 | |
| 64 | NormalizedSingleQuery Binder::bindSingleQuery(const SingleQuery& singleQuery) { |
| 65 | auto normalizedSingleQuery = NormalizedSingleQuery(); |
no test coverage detected