Fix handling mixed const/non-const cases.

This commit is contained in:
Vitaly Baranov 2019-05-27 21:46:55 +03:00
parent b7d0add7a8
commit 63b319404b
3 changed files with 27 additions and 4 deletions

View File

@ -120,11 +120,22 @@ private:
/// prepare() does Impl-specific preparation before handling each row. /// prepare() does Impl-specific preparation before handling each row.
impl.prepare(Name::name, block, arguments, result_pos); impl.prepare(Name::name, block, arguments, result_pos);
bool json_parsed_ok = false;
if (col_json_const)
{
StringRef json{reinterpret_cast<const char *>(&chars[0]), offsets[0] - 1};
json_parsed_ok = parser.parse(json);
}
for (const auto i : ext::range(0, input_rows_count)) for (const auto i : ext::range(0, input_rows_count))
{ {
StringRef json{reinterpret_cast<const char *>(&chars[offsets[i - 1]]), offsets[i] - offsets[i - 1] - 1}; if (!col_json_const)
bool ok = parser.parse(json); {
StringRef json{reinterpret_cast<const char *>(&chars[offsets[i - 1]]), offsets[i] - offsets[i - 1] - 1};
json_parsed_ok = parser.parse(json);
}
bool ok = json_parsed_ok;
if (ok) if (ok)
{ {
auto it = parser.getRoot(); auto it = parser.getRoot();

View File

@ -64,3 +64,11 @@ Friday
{} {}
"\\n\\u0000" "\\n\\u0000"
"☺" "☺"
--const/non-const mixed--
a
b
c
d
e
u
v

View File

@ -72,5 +72,9 @@ SELECT JSONExtractRaw('{"a": "hello", "b": [-100, 200.0, 300], "c":{"d":[121,144
SELECT JSONExtractRaw('{"a": "hello", "b": [-100, 200.0, 300], "c":{"d":[121,144]}}', 'c', 'd', 3); SELECT JSONExtractRaw('{"a": "hello", "b": [-100, 200.0, 300], "c":{"d":[121,144]}}', 'c', 'd', 3);
SELECT JSONExtractRaw('{"passed": true}'); SELECT JSONExtractRaw('{"passed": true}');
SELECT JSONExtractRaw('{}'); SELECT JSONExtractRaw('{}');
select JSONExtractRaw('{"abc":"\\n\\u0000"}', 'abc'); SELECT JSONExtractRaw('{"abc":"\\n\\u0000"}', 'abc');
select JSONExtractRaw('{"abc":"\\u263a"}', 'abc'); SELECT JSONExtractRaw('{"abc":"\\u263a"}', 'abc');
SELECT '--const/non-const mixed--';
SELECT JSONExtractString('["a", "b", "c", "d", "e"]', idx) FROM (SELECT arrayJoin([1,2,3,4,5]) AS idx);
SELECT JSONExtractString(json, 's') FROM (SELECT arrayJoin(['{"s":"u"}', '{"s":"v"}']) AS json);