diff options
| author | vitalyisaev <[email protected]> | 2023-11-14 09:58:56 +0300 |
|---|---|---|
| committer | vitalyisaev <[email protected]> | 2023-11-14 10:20:20 +0300 |
| commit | c2b2dfd9827a400a8495e172a56343462e3ceb82 (patch) | |
| tree | cd4e4f597d01bede4c82dffeb2d780d0a9046bd0 /contrib/clickhouse/src/Databases/MySQL/FetchTablesColumnsList.cpp | |
| parent | d4ae8f119e67808cb0cf776ba6e0cf95296f2df7 (diff) | |
YQ Connector: move tests from yql to ydb (OSS)
Перенос папки с тестами на Коннектор из папки yql в папку ydb (синхронизируется с github).
Diffstat (limited to 'contrib/clickhouse/src/Databases/MySQL/FetchTablesColumnsList.cpp')
| -rw-r--r-- | contrib/clickhouse/src/Databases/MySQL/FetchTablesColumnsList.cpp | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/contrib/clickhouse/src/Databases/MySQL/FetchTablesColumnsList.cpp b/contrib/clickhouse/src/Databases/MySQL/FetchTablesColumnsList.cpp new file mode 100644 index 00000000000..2597834d8b3 --- /dev/null +++ b/contrib/clickhouse/src/Databases/MySQL/FetchTablesColumnsList.cpp @@ -0,0 +1,130 @@ +#include "clickhouse_config.h" + +#if USE_MYSQL +#include <Core/Block.h> +#include <Databases/MySQL/FetchTablesColumnsList.h> +#include <DataTypes/convertMySQLDataType.h> +#include <DataTypes/DataTypeString.h> +#include <DataTypes/DataTypesNumber.h> +#include <Processors/Executors/PullingPipelineExecutor.h> +#include <QueryPipeline/QueryPipelineBuilder.h> +#error #include <Processors/Sources/MySQLSource.h> +#include <IO/WriteBufferFromString.h> +#include <IO/WriteHelpers.h> +#include <IO/Operators.h> + +#include <memory> + +namespace +{ +using namespace DB; + +String toQueryStringWithQuote(const std::vector<String> & quote_list) +{ + WriteBufferFromOwnString quote_list_query; + quote_list_query << "("; + + for (size_t index = 0; index < quote_list.size(); ++index) + { + if (index) + quote_list_query << ","; + + quote_list_query << quote << quote_list[index]; + } + + quote_list_query << ")"; + return quote_list_query.str(); +} +} + +namespace DB +{ + +std::map<String, ColumnsDescription> fetchTablesColumnsList( + mysqlxx::PoolWithFailover & pool, + const String & database_name, + const std::vector<String> & tables_name, + const Settings & settings, + MultiEnum<MySQLDataTypesSupport> type_support) +{ + std::map<String, ColumnsDescription> tables_and_columns; + + if (tables_name.empty()) + return tables_and_columns; + + Block tables_columns_sample_block + { + { std::make_shared<DataTypeString>(), "table_name" }, + { std::make_shared<DataTypeString>(), "column_name" }, + { std::make_shared<DataTypeString>(), "column_type" }, + { std::make_shared<DataTypeUInt8>(), "is_nullable" }, + { std::make_shared<DataTypeUInt8>(), "is_unsigned" }, + { std::make_shared<DataTypeUInt64>(), "length" }, + { std::make_shared<DataTypeUInt64>(), "precision" }, + { std::make_shared<DataTypeUInt64>(), "scale" }, + { std::make_shared<DataTypeString>(), "column_comment" }, + }; + + WriteBufferFromOwnString query; + query << "SELECT " + " TABLE_NAME AS table_name," + " COLUMN_NAME AS column_name," + " COLUMN_TYPE AS column_type," + " IS_NULLABLE = 'YES' AS is_nullable," + " COLUMN_TYPE LIKE '%unsigned' AS is_unsigned," + " CHARACTER_MAXIMUM_LENGTH AS length," + " NUMERIC_PRECISION AS numeric_precision," + " IF(ISNULL(NUMERIC_SCALE), DATETIME_PRECISION, NUMERIC_SCALE) AS scale," // we know DATETIME_PRECISION as a scale in CH + " COLUMN_COMMENT AS column_comment" + " FROM INFORMATION_SCHEMA.COLUMNS" + " WHERE "; + + if (!database_name.empty()) + query << " TABLE_SCHEMA = " << quote << database_name << " AND "; + + query << " TABLE_NAME IN " << toQueryStringWithQuote(tables_name) << " ORDER BY ORDINAL_POSITION"; + + StreamSettings mysql_input_stream_settings(settings); + auto result = std::make_unique<MySQLSource>(pool.get(), query.str(), tables_columns_sample_block, mysql_input_stream_settings); + QueryPipeline pipeline(std::move(result)); + + Block block; + PullingPipelineExecutor executor(pipeline); + while (executor.pull(block)) + { + const auto & table_name_col = *block.getByPosition(0).column; + const auto & column_name_col = *block.getByPosition(1).column; + const auto & column_type_col = *block.getByPosition(2).column; + const auto & is_nullable_col = *block.getByPosition(3).column; + const auto & is_unsigned_col = *block.getByPosition(4).column; + const auto & char_max_length_col = *block.getByPosition(5).column; + const auto & precision_col = *block.getByPosition(6).column; + const auto & scale_col = *block.getByPosition(7).column; + const auto & column_comment_col = *block.getByPosition(8).column; + + size_t rows = block.rows(); + for (size_t i = 0; i < rows; ++i) + { + String table_name = table_name_col[i].safeGet<String>(); + ColumnDescription column_description( + column_name_col[i].safeGet<String>(), + convertMySQLDataType( + type_support, + column_type_col[i].safeGet<String>(), + settings.external_table_functions_use_nulls && is_nullable_col[i].safeGet<UInt64>(), + is_unsigned_col[i].safeGet<UInt64>(), + char_max_length_col[i].safeGet<UInt64>(), + precision_col[i].safeGet<UInt64>(), + scale_col[i].safeGet<UInt64>()) + ); + column_description.comment = column_comment_col[i].safeGet<String>(); + + tables_and_columns[table_name].add(column_description); + } + } + return tables_and_columns; +} + +} + +#endif |
