mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-24 16:42:05 +00:00
Merge pull request #23319 from ClickHouse/mysql-insert-without-database
Allow to INSERT into remote MySQL storage with empty database #19281
This commit is contained in:
commit
cbbff1bc4b
@ -181,7 +181,7 @@ std::vector<std::pair<String, uint16_t>> parseRemoteDescriptionForExternalDataba
|
|||||||
size_t colon = address.find(':');
|
size_t colon = address.find(':');
|
||||||
if (colon == String::npos)
|
if (colon == String::npos)
|
||||||
{
|
{
|
||||||
LOG_WARNING(&Poco::Logger::get("ParseRemoteDescription"), "Port is not found for host: {}. Using default port {}", default_port);
|
LOG_WARNING(&Poco::Logger::get("ParseRemoteDescription"), "Port is not found for host: {}. Using default port {}", address, default_port);
|
||||||
result.emplace_back(std::make_pair(address, default_port));
|
result.emplace_back(std::make_pair(address, default_port));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -72,11 +72,15 @@ std::map<String, NamesAndTypesList> fetchTablesColumnsList(
|
|||||||
" IS_NULLABLE = 'YES' AS is_nullable,"
|
" IS_NULLABLE = 'YES' AS is_nullable,"
|
||||||
" COLUMN_TYPE LIKE '%unsigned' AS is_unsigned,"
|
" COLUMN_TYPE LIKE '%unsigned' AS is_unsigned,"
|
||||||
" CHARACTER_MAXIMUM_LENGTH AS length,"
|
" CHARACTER_MAXIMUM_LENGTH AS length,"
|
||||||
" NUMERIC_PRECISION as '',"
|
" NUMERIC_PRECISION as numeric_precision,"
|
||||||
" IF(ISNULL(NUMERIC_SCALE), DATETIME_PRECISION, NUMERIC_SCALE) AS scale" // we know DATETIME_PRECISION as a scale in CH
|
" IF(ISNULL(NUMERIC_SCALE), DATETIME_PRECISION, NUMERIC_SCALE) AS scale" // we know DATETIME_PRECISION as a scale in CH
|
||||||
" FROM INFORMATION_SCHEMA.COLUMNS"
|
" FROM INFORMATION_SCHEMA.COLUMNS"
|
||||||
" WHERE TABLE_SCHEMA = " << quote << database_name
|
" WHERE ";
|
||||||
<< " AND TABLE_NAME IN " << toQueryStringWithQuote(tables_name) << " ORDER BY ORDINAL_POSITION";
|
|
||||||
|
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);
|
StreamSettings mysql_input_stream_settings(settings);
|
||||||
MySQLBlockInputStream result(pool.get(), query.str(), tables_columns_sample_block, mysql_input_stream_settings);
|
MySQLBlockInputStream result(pool.get(), query.str(), tables_columns_sample_block, mysql_input_stream_settings);
|
||||||
|
@ -146,7 +146,9 @@ public:
|
|||||||
{
|
{
|
||||||
WriteBufferFromOwnString sqlbuf;
|
WriteBufferFromOwnString sqlbuf;
|
||||||
sqlbuf << (storage.replace_query ? "REPLACE" : "INSERT") << " INTO ";
|
sqlbuf << (storage.replace_query ? "REPLACE" : "INSERT") << " INTO ";
|
||||||
sqlbuf << backQuoteMySQL(remote_database_name) << "." << backQuoteMySQL(remote_table_name);
|
if (!remote_database_name.empty())
|
||||||
|
sqlbuf << backQuoteMySQL(remote_database_name) << ".";
|
||||||
|
sqlbuf << backQuoteMySQL(remote_table_name);
|
||||||
sqlbuf << " (" << dumpNamesWithBackQuote(block) << ") VALUES ";
|
sqlbuf << " (" << dumpNamesWithBackQuote(block) << ") VALUES ";
|
||||||
|
|
||||||
auto writer = FormatFactory::instance().getOutputStream("Values", sqlbuf, metadata_snapshot->getSampleBlock(), storage.getContext());
|
auto writer = FormatFactory::instance().getOutputStream("Values", sqlbuf, metadata_snapshot->getSampleBlock(), storage.getContext());
|
||||||
|
@ -83,12 +83,17 @@ ColumnsDescription TableFunctionMySQL::getActualTableStructure(ContextPtr contex
|
|||||||
|
|
||||||
const auto columns = tables_and_columns.find(remote_table_name);
|
const auto columns = tables_and_columns.find(remote_table_name);
|
||||||
if (columns == tables_and_columns.end())
|
if (columns == tables_and_columns.end())
|
||||||
throw Exception("MySQL table " + backQuoteIfNeed(remote_database_name) + "." + backQuoteIfNeed(remote_table_name) + " doesn't exist.", ErrorCodes::UNKNOWN_TABLE);
|
throw Exception("MySQL table " + (remote_database_name.empty() ? "" : (backQuote(remote_database_name) + "."))
|
||||||
|
+ backQuote(remote_table_name) + " doesn't exist.", ErrorCodes::UNKNOWN_TABLE);
|
||||||
|
|
||||||
return ColumnsDescription{columns->second};
|
return ColumnsDescription{columns->second};
|
||||||
}
|
}
|
||||||
|
|
||||||
StoragePtr TableFunctionMySQL::executeImpl(const ASTPtr & /*ast_function*/, ContextPtr context, const std::string & table_name, ColumnsDescription /*cached_columns*/) const
|
StoragePtr TableFunctionMySQL::executeImpl(
|
||||||
|
const ASTPtr & /*ast_function*/,
|
||||||
|
ContextPtr context,
|
||||||
|
const std::string & table_name,
|
||||||
|
ColumnsDescription /*cached_columns*/) const
|
||||||
{
|
{
|
||||||
auto columns = getActualTableStructure(context);
|
auto columns = getActualTableStructure(context);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user