mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-21 15:12: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
|
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]
|
[&istr]
|
||||||
{
|
{
|
||||||
return checkStringByFirstCharacterAndAssertTheRestCaseInsensitive("NULL", istr)
|
return checkStringByFirstCharacterAndAssertTheRestCaseInsensitive("NULL", istr)
|
||||||
|| checkStringByFirstCharacterAndAssertTheRest("ᴺᵁᴸᴸ", 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::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::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);
|
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 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)
|
/// If ReturnType is void, deserialize Nullable(T)
|
||||||
template <typename ReturnType = bool>
|
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);
|
static ReturnType deserializeTextEscaped(IColumn & column, ReadBuffer & istr, const FormatSettings & settings, const DataTypePtr & nested);
|
||||||
template <typename ReturnType = bool>
|
template <typename ReturnType = bool>
|
||||||
static ReturnType deserializeTextQuoted(IColumn & column, ReadBuffer & istr, const FormatSettings &, const DataTypePtr & nested);
|
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)
|
if (yield_strings)
|
||||||
{
|
{
|
||||||
// notice: null_as_default on "null" strings is not supported
|
|
||||||
|
|
||||||
String str;
|
String str;
|
||||||
readJSONString(str, in);
|
readJSONString(str, in);
|
||||||
|
|
||||||
ReadBufferFromString buf(str);
|
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
|
else
|
||||||
{
|
{
|
||||||
|
@ -146,14 +146,15 @@ void JSONEachRowRowInputFormat::readField(size_t index, MutableColumns & columns
|
|||||||
|
|
||||||
if (yield_strings)
|
if (yield_strings)
|
||||||
{
|
{
|
||||||
// notice: null_as_default on "null" strings is not supported
|
|
||||||
|
|
||||||
String str;
|
String str;
|
||||||
readJSONString(str, in);
|
readJSONString(str, in);
|
||||||
|
|
||||||
ReadBufferFromString buf(str);
|
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
|
else
|
||||||
{
|
{
|
||||||
|
@ -18,6 +18,11 @@ JSONEachRow
|
|||||||
1 world 3 2019-07-23 [1,2,3] ('tuple',3.14)
|
1 world 3 2019-07-23 [1,2,3] ('tuple',3.14)
|
||||||
2 Hello 123 2019-06-19 [] ('test',2.71828)
|
2 Hello 123 2019-06-19 [] ('test',2.71828)
|
||||||
3 Hello 42 2019-06-19 [1,2,3] ('default',0.75)
|
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)
|
Template (Quoted)
|
||||||
0 1 42 2019-07-22 [10,20,30] ('default',0)
|
0 1 42 2019-07-22 [10,20,30] ('default',0)
|
||||||
1 world 3 2019-07-23 [1,2,3] ('tuple',3.14)
|
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="SELECT * FROM null_as_default ORDER BY i";
|
||||||
$CLICKHOUSE_CLIENT --query="TRUNCATE TABLE null_as_default";
|
$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 'Template (Quoted)'
|
||||||
echo 'NULL, '\''1'\'', null, '\''2019-07-22'\'', [10, 20, 30], NuLl
|
echo 'NULL, '\''1'\'', null, '\''2019-07-22'\'', [10, 20, 30], NuLl
|
||||||
1, '\''world'\'', 3, '\''2019-07-23'\'', NULL, ('\''tuple'\'', 3.14)
|
1, '\''world'\'', 3, '\''2019-07-23'\'', NULL, ('\''tuple'\'', 3.14)
|
||||||
|
Loading…
Reference in New Issue
Block a user