| 790 | } |
| 791 | |
| 792 | BlockInputStreamPtr InterpreterExplainQuery::explainMetaData() |
| 793 | { |
| 794 | const auto & explain = query->as<ASTExplainQuery &>(); |
| 795 | auto context = Context::createCopy(getContext()); |
| 796 | auto query_ptr = explain.getExplainedQuery(); |
| 797 | auto contxt = getContext(); |
| 798 | auto metadata_settings = checkAndGetSettings<QueryMetadataSettings>(explain.getSettings()); |
| 799 | AnalysisPtr analysis; |
| 800 | QueryPlanPtr query_plan; |
| 801 | |
| 802 | if (metadata_settings.lineage || metadata_settings.lineage_use_optimizer) |
| 803 | { |
| 804 | try |
| 805 | { |
| 806 | InterpreterSelectQueryUseOptimizer interpreter(query_ptr, contxt, SelectQueryOptions()); |
| 807 | interpreter.buildQueryPlan(query_plan, analysis, !metadata_settings.lineage_use_optimizer); |
| 808 | query_ptr = interpreter.getQuery(); |
| 809 | } |
| 810 | catch (...) |
| 811 | { |
| 812 | tryLogWarningCurrentException(&Poco::Logger::get("InterpreterExplainQuery::explainMetaData"), "build plan failed."); |
| 813 | } |
| 814 | } |
| 815 | |
| 816 | if (!analysis) |
| 817 | { |
| 818 | query_ptr = QueryRewriter().rewrite(query_ptr, contxt); |
| 819 | analysis = QueryAnalyzer::analyze(query_ptr, contxt); |
| 820 | } |
| 821 | |
| 822 | if (metadata_settings.format_json) |
| 823 | { |
| 824 | String res = PlanPrinter::jsonMetaData(query_ptr, analysis, contxt, query_plan, metadata_settings); |
| 825 | Block sample_block = getSampleBlock(); |
| 826 | MutableColumns res_columns = sample_block.cloneEmptyColumns(); |
| 827 | fillColumn(*res_columns[0], res); |
| 828 | return std::make_shared<OneBlockInputStream>(sample_block.cloneWithColumns(std::move(res_columns))); |
| 829 | } |
| 830 | |
| 831 | |
| 832 | // get used tables, databases, columns_list |
| 833 | auto column_tables = ColumnArray::create(ColumnString::create()); |
| 834 | auto column_databases = ColumnArray::create(ColumnString::create()); |
| 835 | auto column_columns_list = ColumnArray::create(ColumnString::create()); |
| 836 | |
| 837 | auto column_lists_off = ColumnUInt64::create(); |
| 838 | auto & columns_list_offset_data = column_lists_off->getData(); |
| 839 | |
| 840 | Array tables_array; |
| 841 | Array databases_array; |
| 842 | size_t array_off_size = 0; |
| 843 | |
| 844 | const auto & used_columns_map = analysis->getUsedColumns(); |
| 845 | for (const auto & [table_ast, storage_analysis] : analysis->getStorages()) |
| 846 | { |
| 847 | Array columns_array; |
| 848 | tables_array.push_back(storage_analysis.table); |
| 849 | databases_array.push_back(storage_analysis.database); |
nothing calls this directly
no test coverage detected