fix read string from different format

This commit is contained in:
MaxWk 2021-11-22 20:21:12 +08:00
parent 8f1eeb355e
commit dac41b0d75
4 changed files with 148 additions and 138 deletions

View File

@ -76,7 +76,7 @@ void SerializationBool::serializeTextEscaped(const IColumn & column, size_t row_
}
}
void SerializationBool::deserializeTextEscaped(IColumn & column, ReadBuffer & istr, const FormatSettings & settings) const
void SerializationBool::deserializeFromString(IColumn & column, String & input, const FormatSettings & settings) const
{
ColumnUInt8 * col = typeid_cast<ColumnUInt8 *>(&column);
if (!col)
@ -84,25 +84,25 @@ void SerializationBool::deserializeTextEscaped(IColumn & column, ReadBuffer & is
throw Exception("Bool type can only deserialize columns of type UInt8." + column.getName(), ErrorCodes::ILLEGAL_COLUMN);
}
if (!istr.eof())
if (settings.bool_true_representation == input)
{
String input;
readString(input, istr);
if (settings.bool_true_representation == input)
{
col->insert(true);
}
else if (settings.bool_false_representation == input)
{
col->insert(false);
}
else
throw Exception("Invalid boolean value, should be " + settings.bool_true_representation + " or " + settings.bool_false_representation + " controlled by setting bool_true_representation and bool_false_representation.", ErrorCodes::ILLEGAL_COLUMN);
col->insert(true);
}
else if (settings.bool_false_representation == input)
{
col->insert(false);
}
else
throw Exception("Invalid boolean value, should be " + settings.bool_true_representation + " or " + settings.bool_false_representation + " controlled by setting bool_true_representation and bool_false_representation.", ErrorCodes::ILLEGAL_COLUMN);
}
void SerializationBool::deserializeTextEscaped(IColumn & column, ReadBuffer & istr, const FormatSettings & settings) const
{
if (istr.eof())
throw Exception("Expected boolean value but get EOF.", ErrorCodes::CANNOT_PARSE_DOMAIN_VALUE_FROM_STRING);
String input;
readEscapedString(input, istr);
deserializeFromString(column, input, settings);
}
void SerializationBool::serializeTextJSON(const IColumn &column, size_t row_num, WriteBuffer &ostr, const FormatSettings &settings) const
@ -122,7 +122,11 @@ void SerializationBool::serializeTextCSV(const IColumn & column, size_t row_num,
void SerializationBool::deserializeTextCSV(IColumn & column, ReadBuffer & istr, const FormatSettings & settings) const
{
deserializeTextEscaped(column, istr, settings);
if (istr.eof())
throw Exception("Expected boolean value but get EOF.", ErrorCodes::CANNOT_PARSE_DOMAIN_VALUE_FROM_STRING);
String input;
readCSVString(input, istr, settings.csv);
deserializeFromString(column, input, settings);
}
void SerializationBool::serializeTextRaw(const IColumn & column, size_t row_num, WriteBuffer & ostr, const FormatSettings & settings) const
@ -132,7 +136,11 @@ void SerializationBool::serializeTextRaw(const IColumn & column, size_t row_num,
void SerializationBool::deserializeTextRaw(IColumn & column, ReadBuffer & istr, const FormatSettings & settings) const
{
deserializeTextEscaped(column, istr, settings);
if (istr.eof())
throw Exception("Expected boolean value but get EOF.", ErrorCodes::CANNOT_PARSE_DOMAIN_VALUE_FROM_STRING);
String input;
readString(input, istr);
deserializeFromString(column, input, settings);
}
}

View File

@ -17,6 +17,8 @@ public:
void serializeText(const IColumn & column, size_t row_num, WriteBuffer & ostr, const FormatSettings &) const override;
void deserializeText(IColumn & column, ReadBuffer & istr, const FormatSettings &) const override;
void deserializeFromString(IColumn & column, String & input, const FormatSettings & settings) const;
void serializeTextEscaped(const IColumn & column, size_t row_num, WriteBuffer & ostr, const FormatSettings & settings) const override;
void deserializeTextEscaped(IColumn & column, ReadBuffer & istr, const FormatSettings & settings) const override;

View File

@ -1,101 +1,101 @@
CREATE TABLE default.bool_test\n(\n `value` Bool\n)\nENGINE = Memory
false
true
false
true
false
true
false
true
{"value":false}
{"value":true}
{"value":false}
{"value":true}
{"value":false}
{"value":true}
{"value":false}
{"value":true}
0
1
0
1
0
1
0
1
true
true
true
true
False
False
False
False
False
True
True
True
True
True
False
False
False
False
False
True
True
True
True
True
No
No
No
No
No
No
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
No
No
Yes
Yes
Yes
Yes
Yes
Yes
Off
Off
Off
Off
Off
Off
Off
On
On
On
On
On
On
On
Off
Off
Off
Off
Off
Off
Off
On
On
On
On
On
On
On
CREATE TABLE default.bool_test\n(\n `value` Bool,\n `f` String\n)\nENGINE = Memory
false test
true test
false test
true test
false test
true test
false test
true test
{"value":false,"f":"test"}
{"value":true,"f":"test"}
{"value":false,"f":"test"}
{"value":true,"f":"test"}
{"value":false,"f":"test"}
{"value":true,"f":"test"}
{"value":false,"f":"test"}
{"value":true,"f":"test"}
0 test
1 test
0 test
1 test
0 test
1 test
0 test
1 test
true test
true test
true test
true test
False,"test"
False,"test"
False,"test"
False,"test"
False,"test"
True,"test"
True,"test"
True,"test"
True,"test"
True,"test"
False test
False test
False test
False test
False test
True test
True test
True test
True test
True test
No,"test"
No,"test"
No,"test"
No,"test"
No,"test"
No,"test"
Yes,"test"
Yes,"test"
Yes,"test"
Yes,"test"
Yes,"test"
Yes,"test"
No test
No test
No test
No test
No test
No test
Yes test
Yes test
Yes test
Yes test
Yes test
Yes test
Off,"test"
Off,"test"
Off,"test"
Off,"test"
Off,"test"
Off,"test"
Off,"test"
On,"test"
On,"test"
On,"test"
On,"test"
On,"test"
On,"test"
On,"test"
Off test
Off test
Off test
Off test
Off test
Off test
Off test
On test
On test
On test
On test
On test
On test
On test

View File

@ -1,38 +1,38 @@
DROP TABLE IF EXISTS bool_test;
CREATE TABLE bool_test (value Bool) ENGINE = Memory;
CREATE TABLE bool_test (value Bool,f String) ENGINE = Memory;
-- value column shoud have type 'Bool'
SHOW CREATE TABLE bool_test;
INSERT INTO bool_test (value) VALUES ('false'), ('true'), (0), (1);
INSERT INTO bool_test (value) FORMAT JSONEachRow {"value":false}{"value":true}{"value":0}{"value":1}
INSERT INTO bool_test (value,f) VALUES ('false', 'test'), ('true' , 'test'), (0, 'test'), (1, 'test');
INSERT INTO bool_test (value,f) FORMAT JSONEachRow {"value":false,"f":"test"}{"value":true,"f":"test"}{"value":0,"f":"test"}{"value":1,"f":"test"}
SELECT value FROM bool_test;
SELECT value FROM bool_test FORMAT JSONEachRow;
SELECT toUInt64(value) FROM bool_test;
SELECT value FROM bool_test where value > 0;
SELECT value,f FROM bool_test;
SELECT value,f FROM bool_test FORMAT JSONEachRow;
SELECT toUInt64(value),f FROM bool_test;
SELECT value,f FROM bool_test where value > 0;
set bool_true_representation='True';
set bool_false_representation='False';
INSERT INTO bool_test (value) FORMAT CSV True
INSERT INTO bool_test (value) FORMAT TSV False
SELECT value FROM bool_test order by value FORMAT CSV;
SELECT value FROM bool_test order by value FORMAT TSV;
INSERT INTO bool_test (value,f) FORMAT CSV True,test
INSERT INTO bool_test (value,f) FORMAT TSV False test
SELECT value,f FROM bool_test order by value FORMAT CSV;
SELECT value,f FROM bool_test order by value FORMAT TSV;
set bool_true_representation='Yes';
set bool_false_representation='No';
INSERT INTO bool_test (value) FORMAT CSV Yes
INSERT INTO bool_test (value) FORMAT TSV No
SELECT value FROM bool_test order by value FORMAT CSV;
SELECT value FROM bool_test order by value FORMAT TSV;
INSERT INTO bool_test (value,f) FORMAT CSV Yes,test
INSERT INTO bool_test (value,f) FORMAT TSV No test
SELECT value,f FROM bool_test order by value FORMAT CSV;
SELECT value,f FROM bool_test order by value FORMAT TSV;
set bool_true_representation='On';
set bool_false_representation='Off';
INSERT INTO bool_test (value) FORMAT CSV On
INSERT INTO bool_test (value) FORMAT TSV Off
SELECT value FROM bool_test order by value FORMAT CSV;
SELECT value FROM bool_test order by value FORMAT TSV;
INSERT INTO bool_test (value,f) FORMAT CSV On,test
INSERT INTO bool_test (value,f) FORMAT TSV Off test
SELECT value,f FROM bool_test order by value FORMAT CSV;
SELECT value,f FROM bool_test order by value FORMAT TSV;
DROP TABLE IF EXISTS bool_test;