提交 48d85af4 编写于 作者: V Vitaliy Lyudvichenko 提交者: alexey-milovidov

Allow to skip garbage in TSKV format. [#CLICKHOUSE-3012]

上级 4fd357a3
......@@ -12,6 +12,7 @@ namespace ErrorCodes
extern const int CANNOT_PARSE_DATE;
extern const int CANNOT_PARSE_DATETIME;
extern const int CANNOT_READ_ARRAY_FROM_TEXT;
extern const int CANNOT_PARSE_NUMBER;
}
......@@ -33,7 +34,8 @@ static bool isParseError(int code)
|| code == ErrorCodes::CANNOT_PARSE_QUOTED_STRING
|| code == ErrorCodes::CANNOT_PARSE_DATE
|| code == ErrorCodes::CANNOT_PARSE_DATETIME
|| code == ErrorCodes::CANNOT_READ_ARRAY_FROM_TEXT;
|| code == ErrorCodes::CANNOT_READ_ARRAY_FROM_TEXT
|| code == ErrorCodes::CANNOT_PARSE_NUMBER;
}
......
......@@ -10,6 +10,7 @@ namespace ErrorCodes
extern const int INCORRECT_DATA;
extern const int CANNOT_PARSE_ESCAPE_SEQUENCE;
extern const int CANNOT_READ_ALL_DATA;
extern const int CANNOT_PARSE_INPUT_ASSERTION_FAILED;
}
......@@ -108,6 +109,7 @@ bool TSKVRowInputStream::read(Block & block)
{
StringRef name_ref;
bool has_value = readName(istr, name_ref, name_buf);
ssize_t index = -1;
if (has_value)
{
......@@ -126,7 +128,7 @@ bool TSKVRowInputStream::read(Block & block)
}
else
{
size_t index = it->second;
index = it->second;
if (read_columns[index])
throw Exception("Duplicate field found while parsing TSKV format: " + name_ref.toString(), ErrorCodes::INCORRECT_DATA);
......@@ -159,7 +161,16 @@ bool TSKVRowInputStream::read(Block & block)
break;
}
else
throw Exception("Found garbage after field in TSKV format: " + name_ref.toString(), ErrorCodes::INCORRECT_DATA);
{
/// Possibly a garbage was written into column, remove it
if (index >= 0)
{
block.getByPosition(index).column->popBack(1);
read_columns[index] = false;
}
throw Exception("Found garbage after field in TSKV format: " + name_ref.toString(), ErrorCodes::CANNOT_PARSE_INPUT_ASSERTION_FAILED);
}
}
}
......
......@@ -12,3 +12,5 @@
3 Goodbye
1 Hello
3 Goodbye
1 TSKV
4 TSKV Ok
......@@ -17,6 +17,8 @@ echo -ne '1\tHello\n2\n3\tGoodbye\n\n' | clickhouse-client --input_format_allow_
echo -ne '1\tHello\n2\n3\tGoodbye\n\n' | clickhouse-client --input_format_allow_errors_num=1 --input_format_allow_errors_ratio=0.6 --query="INSERT INTO test.formats_test FORMAT TSV"
echo -ne 'x=1\ts=TSKV\nx=minus2\ts=trash1\ns=trash2\tx=-3\ns=TSKV Ok\tx=4\ns=trash3\tx=-5\n' | clickhouse-client --input_format_allow_errors_num=3 -q "INSERT INTO test.formats_test FORMAT TSKV"
clickhouse-client --query="SELECT * FROM test.formats_test"
clickhouse-client --query="DROP TABLE test.formats_test"
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册