| 173 | } |
| 174 | |
| 175 | ASTPtr queryNodeToSelectQuery(const QueryTreeNodePtr & query_node, bool set_subquery_cte_name) |
| 176 | { |
| 177 | auto & query_node_typed = query_node->as<QueryNode &>(); |
| 178 | |
| 179 | // In case of cross-replication we don't know what database is used for the table. |
| 180 | // Each shard will use the default database (in the case of cross-replication shards may have different defaults). |
| 181 | auto result_ast = query_node_typed.toAST({ |
| 182 | .qualify_indentifiers_with_database = false, |
| 183 | .set_subquery_cte_name = set_subquery_cte_name |
| 184 | }); |
| 185 | |
| 186 | while (true) |
| 187 | { |
| 188 | if (auto * /*select_query*/ _ = result_ast->as<ASTSelectQuery>()) |
| 189 | break; |
| 190 | if (auto * select_with_union = result_ast->as<ASTSelectWithUnionQuery>()) |
| 191 | result_ast = select_with_union->list_of_selects->children.at(0); |
| 192 | else if (auto * subquery = result_ast->as<ASTSubquery>()) |
| 193 | result_ast = subquery->children.at(0); |
| 194 | else |
| 195 | throw Exception(ErrorCodes::LOGICAL_ERROR, "Query node invalid conversion to select query"); |
| 196 | } |
| 197 | |
| 198 | if (result_ast == nullptr) |
| 199 | throw Exception(ErrorCodes::LOGICAL_ERROR, "Query node invalid conversion to select query"); |
| 200 | |
| 201 | return result_ast; |
| 202 | } |
| 203 | |
| 204 | namespace |
| 205 | { |
no test coverage detected