| 3101 | |
| 3102 | |
| 3103 | StoragePtr Context::buildParameterizedViewStorage(const String & database_name, const String & table_name, const NameToNameMap & param_values) const |
| 3104 | { |
| 3105 | if (table_name.empty()) |
| 3106 | return nullptr; |
| 3107 | |
| 3108 | StoragePtr original_view = DatabaseCatalog::instance().tryGetTable({database_name, table_name}, getQueryContext()); |
| 3109 | if (!original_view || !original_view->isView()) |
| 3110 | return nullptr; |
| 3111 | auto * storage_view = original_view->as<StorageView>(); |
| 3112 | if (!storage_view || !storage_view->isParameterizedView()) |
| 3113 | return nullptr; |
| 3114 | |
| 3115 | auto original_view_metadata = original_view->getInMemoryMetadataPtr(getQueryContext(), false); |
| 3116 | auto query = original_view_metadata->getSelectQuery().inner_query->clone(); |
| 3117 | StorageView::replaceQueryParametersIfParameterizedView(query, param_values); |
| 3118 | |
| 3119 | ASTCreateQuery create; |
| 3120 | create.set(create.select, query); |
| 3121 | |
| 3122 | auto sql_security = make_intrusive<ASTSQLSecurity>(); |
| 3123 | sql_security->type = original_view_metadata->sql_security_type; |
| 3124 | if (original_view_metadata->definer) |
| 3125 | sql_security->definer = make_intrusive<ASTUserNameWithHost>(*original_view_metadata->definer); |
| 3126 | create.set(create.sql_security, sql_security); |
| 3127 | |
| 3128 | auto view_context = original_view_metadata->getSQLSecurityOverriddenContext(shared_from_this()); |
| 3129 | auto sample_block = InterpreterSelectQueryAnalyzer::getSampleBlock(query, view_context); |
| 3130 | auto res = std::make_shared<StorageView>(StorageID(database_name, table_name), |
| 3131 | create, |
| 3132 | ColumnsDescription(sample_block->getNamesAndTypesList()), |
| 3133 | /* comment */ "", |
| 3134 | /* is_parameterized_view */ true); |
| 3135 | res->startup(); |
| 3136 | return res; |
| 3137 | } |
| 3138 | |
| 3139 | |
| 3140 | void Context::addViewSource(const StoragePtr & storage) |
no test coverage detected