mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-24 08:32:02 +00:00
Implement null_as_default for JSONStrings formats
This commit is contained in:
parent
a56d42de67
commit
d8fce448a2
@ -318,13 +318,20 @@ ReturnType DataTypeNullable::deserializeTextQuoted(IColumn & column, ReadBuffer
|
||||
|
||||
void DataTypeNullable::deserializeWholeText(IColumn & column, ReadBuffer & istr, const FormatSettings & settings) const
|
||||
{
|
||||
safeDeserialize(column, *nested_data_type,
|
||||
deserializeWholeText<void>(column, istr, settings, nested_data_type);
|
||||
}
|
||||
|
||||
template <typename ReturnType>
|
||||
ReturnType DataTypeNullable::deserializeWholeText(IColumn & column, ReadBuffer & istr, const FormatSettings & settings,
|
||||
const DataTypePtr & nested_data_type)
|
||||
{
|
||||
return safeDeserialize<ReturnType>(column, *nested_data_type,
|
||||
[&istr]
|
||||
{
|
||||
return checkStringByFirstCharacterAndAssertTheRestCaseInsensitive("NULL", istr)
|
||||
|| checkStringByFirstCharacterAndAssertTheRest("ᴺᵁᴸᴸ", istr);
|
||||
},
|
||||
[this, &istr, &settings] (IColumn & nested) { nested_data_type->deserializeAsWholeText(nested, istr, settings); });
|
||||
[&nested_data_type, &istr, &settings] (IColumn & nested) { nested_data_type->deserializeAsWholeText(nested, istr, settings); });
|
||||
}
|
||||
|
||||
|
||||
@ -551,6 +558,7 @@ DataTypePtr removeNullable(const DataTypePtr & type)
|
||||
}
|
||||
|
||||
|
||||
template bool DataTypeNullable::deserializeWholeText<bool>(IColumn & column, ReadBuffer & istr, const FormatSettings & settings, const DataTypePtr & nested);
|
||||
template bool DataTypeNullable::deserializeTextEscaped<bool>(IColumn & column, ReadBuffer & istr, const FormatSettings & settings, const DataTypePtr & nested);
|
||||
template bool DataTypeNullable::deserializeTextQuoted<bool>(IColumn & column, ReadBuffer & istr, const FormatSettings &, const DataTypePtr & nested);
|
||||
template bool DataTypeNullable::deserializeTextCSV<bool>(IColumn & column, ReadBuffer & istr, const FormatSettings & settings, const DataTypePtr & nested);
|
||||
|
@ -103,6 +103,8 @@ public:
|
||||
/// If ReturnType is bool, check for NULL and deserialize value into non-nullable column (and return true) or insert default value of nested type (and return false)
|
||||
/// If ReturnType is void, deserialize Nullable(T)
|
||||
template <typename ReturnType = bool>
|
||||
static ReturnType deserializeWholeText(IColumn & column, ReadBuffer & istr, const FormatSettings & settings, const DataTypePtr & nested);
|
||||
template <typename ReturnType = bool>
|
||||
static ReturnType deserializeTextEscaped(IColumn & column, ReadBuffer & istr, const FormatSettings & settings, const DataTypePtr & nested);
|
||||
template <typename ReturnType = bool>
|
||||
static ReturnType deserializeTextQuoted(IColumn & column, ReadBuffer & istr, const FormatSettings &, const DataTypePtr & nested);
|
||||
|
@ -205,14 +205,15 @@ void JSONCompactEachRowRowInputFormat::readField(size_t index, MutableColumns &
|
||||
|
||||
if (yield_strings)
|
||||
{
|
||||
// notice: null_as_default on "null" strings is not supported
|
||||
|
||||
String str;
|
||||
readJSONString(str, in);
|
||||
|
||||
ReadBufferFromString buf(str);
|
||||
|
||||
type->deserializeAsWholeText(*columns[index], buf, format_settings);
|
||||
if (format_settings.null_as_default && !type->isNullable())
|
||||
read_columns[index] = DataTypeNullable::deserializeWholeText(*columns[index], buf, format_settings, type);
|
||||
else
|
||||
type->deserializeAsWholeText(*columns[index], buf, format_settings);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -146,14 +146,15 @@ void JSONEachRowRowInputFormat::readField(size_t index, MutableColumns & columns
|
||||
|
||||
if (yield_strings)
|
||||
{
|
||||
// notice: null_as_default on "null" strings is not supported
|
||||
|
||||
String str;
|
||||
readJSONString(str, in);
|
||||
|
||||
ReadBufferFromString buf(str);
|
||||
|
||||
type->deserializeAsWholeText(*columns[index], buf, format_settings);
|
||||
if (format_settings.null_as_default && !type->isNullable())
|
||||
read_columns[index] = DataTypeNullable::deserializeWholeText(*columns[index], buf, format_settings, type);
|
||||
else
|
||||
type->deserializeAsWholeText(*columns[index], buf, format_settings);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -18,6 +18,11 @@ JSONEachRow
|
||||
1 world 3 2019-07-23 [1,2,3] ('tuple',3.14)
|
||||
2 Hello 123 2019-06-19 [] ('test',2.71828)
|
||||
3 Hello 42 2019-06-19 [1,2,3] ('default',0.75)
|
||||
JSONStringsEachRow
|
||||
0 1 42 2019-07-22 [10,20,30] ('default',0)
|
||||
1 world 3 2019-07-23 [1,2,3] ('tuple',3.14)
|
||||
2 Hello 123 2019-06-19 [] ('test',2.71828)
|
||||
3 Hello 42 2019-06-19 [1,2,3] ('default',0.75)
|
||||
Template (Quoted)
|
||||
0 1 42 2019-07-22 [10,20,30] ('default',0)
|
||||
1 world 3 2019-07-23 [1,2,3] ('tuple',3.14)
|
||||
|
@ -38,6 +38,14 @@ echo '{"i": null, "s": "1", "n": null, "d": "2019-07-22", "a": [10, 20, 30], "t"
|
||||
$CLICKHOUSE_CLIENT --query="SELECT * FROM null_as_default ORDER BY i";
|
||||
$CLICKHOUSE_CLIENT --query="TRUNCATE TABLE null_as_default";
|
||||
|
||||
echo 'JSONStringsEachRow'
|
||||
echo '{"i": "null", "s": "1", "n": "ᴺᵁᴸᴸ", "d": "2019-07-22", "a": "[10, 20, 30]", "t": "NULL"}
|
||||
{"i": "1", "s": "world", "n": "3", "d": "2019-07-23", "a": "null", "t": "('\''tuple'\'', 3.14)"}
|
||||
{"i": "2", "s": "null", "n": "123", "d": "null", "a": "[]", "t": "('\''test'\'', 2.71828)"}
|
||||
{"i": "3", "s": "null", "n": "null", "d": "null", "a": "null", "t": "null"}' | $CLICKHOUSE_CLIENT --input_format_null_as_default=1 --query="INSERT INTO null_as_default FORMAT JSONStringsEachRow";
|
||||
$CLICKHOUSE_CLIENT --query="SELECT * FROM null_as_default ORDER BY i";
|
||||
$CLICKHOUSE_CLIENT --query="TRUNCATE TABLE null_as_default";
|
||||
|
||||
echo 'Template (Quoted)'
|
||||
echo 'NULL, '\''1'\'', null, '\''2019-07-22'\'', [10, 20, 30], NuLl
|
||||
1, '\''world'\'', 3, '\''2019-07-23'\'', NULL, ('\''tuple'\'', 3.14)
|
||||
|
Loading…
Reference in New Issue
Block a user