fix csv format not support tuple

This commit is contained in:
shuai-xu 2024-03-07 15:38:46 +08:00
parent 216dcbef2c
commit 9d5cabb26d
4 changed files with 20 additions and 28 deletions

View File

@ -7,6 +7,7 @@
#include <Common/assert_cast.h> #include <Common/assert_cast.h>
#include <IO/WriteHelpers.h> #include <IO/WriteHelpers.h>
#include <IO/ReadHelpers.h> #include <IO/ReadHelpers.h>
#include <IO/ReadBufferFromString.h>
#include <IO/WriteBufferFromString.h> #include <IO/WriteBufferFromString.h>
@ -526,36 +527,17 @@ void SerializationTuple::serializeTextXML(const IColumn & column, size_t row_num
void SerializationTuple::serializeTextCSV(const IColumn & column, size_t row_num, WriteBuffer & ostr, const FormatSettings & settings) const void SerializationTuple::serializeTextCSV(const IColumn & column, size_t row_num, WriteBuffer & ostr, const FormatSettings & settings) const
{ {
for (size_t i = 0; i < elems.size(); ++i) WriteBufferFromOwnString wb;
{ serializeText(column, row_num, wb, settings);
if (i != 0) writeCSV(wb.str(), ostr);
writeChar(settings.csv.tuple_delimiter, ostr);
elems[i]->serializeTextCSV(extractElementColumn(column, i), row_num, ostr, settings);
}
} }
void SerializationTuple::deserializeTextCSV(IColumn & column, ReadBuffer & istr, const FormatSettings & settings) const void SerializationTuple::deserializeTextCSV(IColumn & column, ReadBuffer & istr, const FormatSettings & settings) const
{ {
addElementSafe<void>(elems.size(), column, [&] String s;
{ readCSV(s, istr, settings.csv);
const size_t size = elems.size(); ReadBufferFromString rb(s);
for (size_t i = 0; i < size; ++i) deserializeText(column, rb, settings, true);
{
if (i != 0)
{
skipWhitespaceIfAny(istr);
assertChar(settings.csv.tuple_delimiter, istr);
skipWhitespaceIfAny(istr);
}
auto & element_column = extractElementColumn(column, i);
if (settings.null_as_default && !isColumnNullableOrLowCardinalityNullable(element_column))
SerializationNullable::deserializeNullAsDefaultOrNestedTextCSV(element_column, istr, settings, elems[i]);
else
elems[i]->deserializeTextCSV(element_column, istr, settings);
}
return true;
});
} }
bool SerializationTuple::tryDeserializeTextCSV(IColumn & column, ReadBuffer & istr, const FormatSettings & settings) const bool SerializationTuple::tryDeserializeTextCSV(IColumn & column, ReadBuffer & istr, const FormatSettings & settings) const

View File

@ -303,8 +303,8 @@ DataTypePtr tryInferDataTypeByEscapingRule(const String & field, const FormatSet
/// Try to determine the type of value inside quotes /// Try to determine the type of value inside quotes
auto type = tryInferDataTypeForSingleField(data, format_settings); auto type = tryInferDataTypeForSingleField(data, format_settings);
/// If we couldn't infer any type or it's tuple in quotes or it's a number and csv.try_infer_numbers_from_strings = 0, we determine it as a string. /// If we couldn't infer any type or it's a number and csv.try_infer_numbers_from_strings = 0, we determine it as a string.
if (!type || isTuple(type) || (isNumber(type) && !format_settings.csv.try_infer_numbers_from_strings)) if (!type || (isNumber(type) && !format_settings.csv.try_infer_numbers_from_strings))
return std::make_shared<DataTypeString>(); return std::make_shared<DataTypeString>();
return type; return type;

View File

@ -0,0 +1,6 @@
Nullable(String)
Nullable(Int64)
Array(Nullable(String))
Map(String, Nullable(Int64))
Tuple(Nullable(String), Nullable(Int64), Map(String, Nullable(Int64)))
20240305 1 ['s','d'] {'a':2} ('222',33,{'abc':5})

View File

@ -0,0 +1,4 @@
-- Tags: no-fasttest
insert into function file('02977_1.csv') select '20240305', 1, ['s', 'd'], map('a', 2), tuple('222', 33, map('abc', 5));
desc file('02977_1.csv');
select * from file('02977_1.csv') settings max_threads=1;