From 52c6ba051e13ec83b9b80b4687ccc5610b8fea8d Mon Sep 17 00:00:00 2001 From: Kang Date: Sat, 26 Nov 2022 10:06:15 +0800 Subject: [PATCH] [feature](jsonb type)refactor JSONB type using column and add testcase (#13778) 1. Refactor JSONB type using ColumnString instead making a copy. 2. Add regression testcase for JSONB load and functions. --- be/src/olap/row_block2.cpp | 4 +- be/src/runtime/primitive_type.h | 3 +- be/src/vec/CMakeLists.txt | 1 - be/src/vec/columns/column_jsonb.cpp | 424 -- be/src/vec/columns/column_jsonb.h | 352 -- be/src/vec/data_types/data_type_jsonb.cpp | 138 +- be/src/vec/data_types/data_type_jsonb.h | 9 +- be/src/vec/exprs/vliteral.cpp | 2 +- be/src/vec/functions/function_cast.h | 19 +- be/src/vec/functions/function_jsonb.cpp | 25 +- be/src/vec/olap/olap_data_convertor.cpp | 73 +- be/src/vec/olap/olap_data_convertor.h | 16 - be/src/vec/sink/vmysql_result_writer.cpp | 15 +- be/src/vec/sink/vtablet_sink.cpp | 10 +- be/test/vec/core/column_jsonb_test.cpp | 57 - fe/fe-core/src/main/cup/sql_parser.cup | 6 +- .../apache/doris/catalog/PrimitiveType.java | 2 +- .../org/apache/doris/catalog/ScalarType.java | 4 +- .../org/apache/doris/mysql/MysqlColType.java | 4 +- fe/fe-core/src/main/jflex/sql_scanner.flex | 2 +- regression-test/data/jsonb_p0/test_jsonb.csv | 25 + .../jsonb_p0/test_jsonb_load_and_function.out | 3444 +++++++++++++++++ .../test_jsonb_load_and_function.groovy | 311 ++ 23 files changed, 3849 insertions(+), 1097 deletions(-) delete mode 100644 be/src/vec/columns/column_jsonb.cpp delete mode 100644 be/src/vec/columns/column_jsonb.h delete mode 100644 be/test/vec/core/column_jsonb_test.cpp create mode 100644 regression-test/data/jsonb_p0/test_jsonb.csv create mode 100644 regression-test/data/jsonb_p0/test_jsonb_load_and_function.out create mode 100644 regression-test/suites/jsonb_p0/test_jsonb_load_and_function.groovy diff --git a/be/src/olap/row_block2.cpp b/be/src/olap/row_block2.cpp index 6d68090a40..b27a67f65d 100644 --- a/be/src/olap/row_block2.cpp +++ b/be/src/olap/row_block2.cpp @@ -26,7 +26,6 @@ #include "util/bitmap.h" #include "vec/columns/column_array.h" #include "vec/columns/column_complex.h" -#include "vec/columns/column_jsonb.h" #include "vec/columns/column_vector.h" #include "vec/core/block.h" #include "vec/core/types.h" @@ -328,7 +327,7 @@ Status RowBlockV2::_copy_data_to_column(int cid, break; } case OLAP_FIELD_TYPE_JSONB: { - auto json_string = assert_cast(column); + auto json_string = assert_cast(column); size_t limit = config::jsonb_type_length_soft_limit_bytes; for (uint16_t j = 0; j < _selected_size; ++j) { if (!nullable_mark_array[j]) { @@ -341,6 +340,7 @@ Status RowBlockV2::_copy_data_to_column(int cid, fmt::format("Not support json len over than {} in vec engine.", limit)); } } else { + // TODO json_string->insert_default(); } } diff --git a/be/src/runtime/primitive_type.h b/be/src/runtime/primitive_type.h index f785514696..4547333389 100644 --- a/be/src/runtime/primitive_type.h +++ b/be/src/runtime/primitive_type.h @@ -28,7 +28,6 @@ namespace doris { namespace vectorized { class ColumnString; -class ColumnJsonb; } // namespace vectorized class DateTimeValue; @@ -232,7 +231,7 @@ struct PrimitiveTypeTraits { template <> struct PrimitiveTypeTraits { using CppType = JsonBinaryValue; - using ColumnType = vectorized::ColumnJsonb; + using ColumnType = vectorized::ColumnString; }; // only for adapt get_predicate_column_ptr diff --git a/be/src/vec/CMakeLists.txt b/be/src/vec/CMakeLists.txt index 4155a974c9..0e83f98167 100644 --- a/be/src/vec/CMakeLists.txt +++ b/be/src/vec/CMakeLists.txt @@ -52,7 +52,6 @@ set(VEC_FILES columns/column_decimal.cpp columns/column_nullable.cpp columns/column_string.cpp - columns/column_jsonb.cpp columns/column_vector.cpp columns/columns_common.cpp common/demangle.cpp diff --git a/be/src/vec/columns/column_jsonb.cpp b/be/src/vec/columns/column_jsonb.cpp deleted file mode 100644 index bc904dcb80..0000000000 --- a/be/src/vec/columns/column_jsonb.cpp +++ /dev/null @@ -1,424 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one -// or more contributor license agreements. See the NOTICE file -// distributed with this work for additional information -// regarding copyright ownership. The ASF licenses this file -// to you under the Apache License, Version 2.0 (the -// "License"); you may not use this file except in compliance -// with the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. - -#include "vec/columns/column_jsonb.h" - -#include "util/jsonb_parser.h" -#include "vec/columns/column_string.h" -#include "vec/columns/columns_common.h" -#include "vec/common/arena.h" -#include "vec/common/assert_cast.h" -#include "vec/common/memcmp_small.h" -#include "vec/common/string_buffer.hpp" -#include "vec/common/unaligned.h" - -namespace doris::vectorized { - -MutableColumnPtr ColumnJsonb::clone_resized(size_t to_size) const { - auto res = ColumnJsonb::create(); - if (to_size == 0) return res; - - size_t from_size = size(); - - if (to_size <= from_size) { - /// Just cut column. - - res->offsets.assign(offsets.begin(), offsets.begin() + to_size); - res->chars.assign(chars.begin(), chars.begin() + offsets[to_size - 1]); - } else { - Offset offset = 0; - if (from_size > 0) { - res->offsets.assign(offsets.begin(), offsets.end()); - res->chars.assign(chars.begin(), chars.end()); - offset = offsets.back(); - } - - /// Empty strings are just zero terminating bytes. - - res->chars.resize_fill(res->chars.size() + to_size - from_size); - - res->offsets.resize(to_size); - for (size_t i = from_size; i < to_size; ++i) { - ++offset; - res->offsets[i] = offset; - } - res->offsets.resize_fill(to_size, chars.size()); - } - - return res; -} - -void ColumnJsonb::insert_range_from(const IColumn& src, size_t start, size_t length) { - if (length == 0) return; - - const ColumnJsonb& src_concrete = reinterpret_cast(src); - - if (start + length > src_concrete.offsets.size()) { - LOG(FATAL) << "Parameter out of bound in IColumnJsonb::insert_range_from method."; - } - - size_t nested_offset = src_concrete.offset_at(start); - size_t nested_length = src_concrete.offsets[start + length - 1] - nested_offset; - - size_t old_chars_size = chars.size(); - chars.resize(old_chars_size + nested_length); - memcpy(&chars[old_chars_size], &src_concrete.chars[nested_offset], nested_length); - - if (start == 0 && offsets.empty()) { - offsets.assign(src_concrete.offsets.begin(), src_concrete.offsets.begin() + length); - } else { - size_t old_size = offsets.size(); - size_t prev_max_offset = offsets.back(); /// -1th index is Ok, see PaddedPODArray - offsets.resize(old_size + length); - - for (size_t i = 0; i < length; ++i) - offsets[old_size + i] = - src_concrete.offsets[start + i] - nested_offset + prev_max_offset; - } -} - -void ColumnJsonb::insert_indices_from(const IColumn& src, const int* indices_begin, - const int* indices_end) { - for (auto x = indices_begin; x != indices_end; ++x) { - if (*x == -1) { - ColumnJsonb::insert_default(); - } else { - ColumnJsonb::insert_from(src, *x); - } - } -} - -ColumnPtr ColumnJsonb::filter(const Filter& filt, ssize_t result_size_hint) const { - if (offsets.size() == 0) return ColumnJsonb::create(); - - auto res = ColumnJsonb::create(); - - Chars& res_chars = res->chars; - Offsets& res_offsets = res->offsets; - - filter_arrays_impl(chars, offsets, res_chars, res_offsets, filt, result_size_hint); - return res; -} - -ColumnPtr ColumnJsonb::permute(const Permutation& perm, size_t limit) const { - size_t size = offsets.size(); - - if (limit == 0) - limit = size; - else - limit = std::min(size, limit); - - if (perm.size() < limit) { - LOG(FATAL) << "Size of permutation is less than required."; - } - - if (limit == 0) return ColumnJsonb::create(); - - auto res = ColumnJsonb::create(); - - Chars& res_chars = res->chars; - Offsets& res_offsets = res->offsets; - - if (limit == size) - res_chars.resize(chars.size()); - else { - size_t new_chars_size = 0; - for (size_t i = 0; i < limit; ++i) new_chars_size += size_at(perm[i]); - res_chars.resize(new_chars_size); - } - - res_offsets.resize(limit); - - Offset current_new_offset = 0; - - for (size_t i = 0; i < limit; ++i) { - size_t j = perm[i]; - size_t json_offset = offsets[j - 1]; - size_t json_size = offsets[j] - json_offset; - - memcpy_small_allow_read_write_overflow15(&res_chars[current_new_offset], - &chars[json_offset], json_size); - - current_new_offset += json_size; - res_offsets[i] = current_new_offset; - } - - return res; -} - -StringRef ColumnJsonb::serialize_value_into_arena(size_t n, Arena& arena, - char const*& begin) const { - IColumn::Offset json_size = size_at(n); - size_t offset = offset_at(n); - - StringRef res; - res.size = sizeof(json_size) + json_size; - char* pos = arena.alloc_continue(res.size, begin); - memcpy(pos, &json_size, sizeof(json_size)); - memcpy(pos + sizeof(json_size), &chars[offset], json_size); - res.data = pos; - - return res; -} - -const char* ColumnJsonb::deserialize_and_insert_from_arena(const char* pos) { - const IColumn::Offset json_size = unaligned_load(pos); - pos += sizeof(json_size); - - const size_t old_size = chars.size(); - const size_t new_size = old_size + json_size; - chars.resize(new_size); - memcpy(chars.data() + old_size, pos, json_size); - - offsets.push_back(new_size); - return pos + json_size; -} - -size_t ColumnJsonb::get_max_row_byte_size() const { - size_t max_size = 0; - size_t num_rows = offsets.size(); - for (size_t i = 0; i < num_rows; ++i) { - max_size = std::max(max_size, size_at(i)); - } - - return max_size + sizeof(uint32_t); -} - -void ColumnJsonb::serialize_vec(std::vector& keys, size_t num_rows, - size_t max_row_byte_size) const { - for (size_t i = 0; i < num_rows; ++i) { - uint32_t offset(offset_at(i)); - uint32_t string_size(size_at(i)); - - auto* ptr = const_cast(keys[i].data + keys[i].size); - memcpy(ptr, &string_size, sizeof(string_size)); - memcpy(ptr + sizeof(string_size), &chars[offset], string_size); - keys[i].size += sizeof(string_size) + string_size; - } -} - -void ColumnJsonb::serialize_vec_with_null_map(std::vector& keys, size_t num_rows, - const uint8_t* null_map, - size_t max_row_byte_size) const { - for (size_t i = 0; i < num_rows; ++i) { - if (null_map[i] == 0) { - uint32_t offset(offset_at(i)); - uint32_t string_size(size_at(i)); - - auto* ptr = const_cast(keys[i].data + keys[i].size); - memcpy(ptr, &string_size, sizeof(string_size)); - memcpy(ptr + sizeof(string_size), &chars[offset], string_size); - keys[i].size += sizeof(string_size) + string_size; - } - } -} - -template -ColumnPtr ColumnJsonb::index_impl(const PaddedPODArray& indexes, size_t limit) const { - if (limit == 0) return ColumnJsonb::create(); - - auto res = ColumnJsonb::create(); - - Chars& res_chars = res->chars; - Offsets& res_offsets = res->offsets; - - size_t new_chars_size = 0; - for (size_t i = 0; i < limit; ++i) new_chars_size += size_at(indexes[i]); - res_chars.resize(new_chars_size); - - res_offsets.resize(limit); - - Offset current_new_offset = 0; - - for (size_t i = 0; i < limit; ++i) { - size_t j = indexes[i]; - size_t json_offset = offsets[j - 1]; - size_t json_size = offsets[j] - json_offset; - - memcpy_small_allow_read_write_overflow15(&res_chars[current_new_offset], - &chars[json_offset], json_size); - - current_new_offset += json_size; - res_offsets[i] = current_new_offset; - } - - return res; -} - -template -struct ColumnJsonb::less { - const ColumnJsonb& parent; - explicit less(const ColumnJsonb& parent_) : parent(parent_) {} - bool operator()(size_t lhs, size_t rhs) const { - int res = memcmp_small_allow_overflow15( - parent.chars.data() + parent.offset_at(lhs), parent.size_at(lhs) - 1, - parent.chars.data() + parent.offset_at(rhs), parent.size_at(rhs) - 1); - - return positive ? (res < 0) : (res > 0); - } -}; - -void ColumnJsonb::get_permutation(bool reverse, size_t limit, int /*nan_direction_hint*/, - Permutation& res) const { - size_t s = offsets.size(); - res.resize(s); - for (size_t i = 0; i < s; ++i) res[i] = i; - - if (limit >= s) limit = 0; - - if (limit) { - if (reverse) - std::partial_sort(res.begin(), res.begin() + limit, res.end(), less(*this)); - else - std::partial_sort(res.begin(), res.begin() + limit, res.end(), less(*this)); - } else { - if (reverse) - std::sort(res.begin(), res.end(), less(*this)); - else - std::sort(res.begin(), res.end(), less(*this)); - } -} - -ColumnPtr ColumnJsonb::replicate(const Offsets& replicate_offsets) const { - size_t col_size = size(); - if (col_size != replicate_offsets.size()) { - LOG(FATAL) << "Size of offsets doesn't match size of column."; - } - - auto res = ColumnJsonb::create(); - - if (0 == col_size) return res; - - Chars& res_chars = res->chars; - Offsets& res_offsets = res->offsets; - res_chars.reserve(chars.size() / col_size * replicate_offsets.back()); - res_offsets.reserve(replicate_offsets.back()); - - Offset prev_replicate_offset = 0; - Offset prev_json_offset = 0; - Offset current_new_offset = 0; - - for (size_t i = 0; i < col_size; ++i) { - size_t size_to_replicate = replicate_offsets[i] - prev_replicate_offset; - size_t json_size = offsets[i] - prev_json_offset; - - for (size_t j = 0; j < size_to_replicate; ++j) { - current_new_offset += json_size; - res_offsets.push_back(current_new_offset); - - res_chars.resize(res_chars.size() + json_size); - memcpy_small_allow_read_write_overflow15(&res_chars[res_chars.size() - json_size], - &chars[prev_json_offset], json_size); - } - - prev_replicate_offset = replicate_offsets[i]; - prev_json_offset = offsets[i]; - } - - return res; -} - -void ColumnJsonb::replicate(const uint32_t* counts, size_t target_size, IColumn& column, - size_t begin, int count_sz) const { - size_t col_size = count_sz < 0 ? size() : count_sz; - if (0 == col_size) return; - - auto& res = reinterpret_cast(column); - - Chars& res_chars = res.chars; - Offsets& res_offsets = res.offsets; - res_chars.reserve(chars.size() / col_size * target_size); - res_offsets.reserve(target_size); - - size_t base = begin > 0 ? offset_at(begin - 1) : 0; - Offset prev_json_offset = 0 + base; - Offset current_new_offset = 0; - - size_t end = begin + col_size; - for (size_t i = begin; i < end; ++i) { - size_t size_to_replicate = counts[i]; - size_t json_size = offsets[i] - prev_json_offset; - - for (size_t j = 0; j < size_to_replicate; ++j) { - current_new_offset += json_size; - res_offsets.push_back(current_new_offset); - - res_chars.resize(res_chars.size() + json_size); - memcpy_small_allow_read_write_overflow15(&res_chars[res_chars.size() - json_size], - &chars[prev_json_offset], json_size); - } - - prev_json_offset = offsets[i]; - } -} - -void ColumnJsonb::reserve(size_t n) { - offsets.reserve(n); - chars.reserve(n); -} - -MutableColumnPtr ColumnJsonb::get_shrinked_column() { - auto shrinked_column = ColumnJsonb::create(); - shrinked_column->get_offsets().reserve(offsets.size()); - shrinked_column->get_chars().reserve(chars.size()); - for (int i = 0; i < size(); i++) { - StringRef str = get_data_at(i); - reinterpret_cast(shrinked_column.get()) - ->insert_data(str.data, strnlen(str.data, str.size)); - } - return shrinked_column; -} - -void ColumnJsonb::resize(size_t n) { - auto origin_size = size(); - if (origin_size > n) { - offsets.resize(n); - } else if (origin_size < n) { - insert_many_defaults(n - origin_size); - } -} - -void ColumnJsonb::get_extremes(Field& min, Field& max) const { - min = String(); - max = String(); - - size_t col_size = size(); - - if (col_size == 0) return; - - size_t min_idx = 0; - size_t max_idx = 0; - - less less_op(*this); - - for (size_t i = 1; i < col_size; ++i) { - if (less_op(i, min_idx)) - min_idx = i; - else if (less_op(max_idx, i)) - max_idx = i; - } - - get(min_idx, min); - get(max_idx, max); -} - -void ColumnJsonb::protect() { - get_chars().protect(); - get_offsets().protect(); -} - -} // namespace doris::vectorized diff --git a/be/src/vec/columns/column_jsonb.h b/be/src/vec/columns/column_jsonb.h deleted file mode 100644 index 66e17d0e68..0000000000 --- a/be/src/vec/columns/column_jsonb.h +++ /dev/null @@ -1,352 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one -// or more contributor license agreements. See the NOTICE file -// distributed with this work for additional information -// regarding copyright ownership. The ASF licenses this file -// to you under the Apache License, Version 2.0 (the -// "License"); you may not use this file except in compliance -// with the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. - -#pragma once - -#include -#include - -#include "runtime/jsonb_value.h" -#include "vec/columns/column.h" -#include "vec/columns/column_impl.h" -#include "vec/columns/column_string.h" -#include "vec/common/assert_cast.h" -#include "vec/common/memcmp_small.h" -#include "vec/common/memcpy_small.h" -#include "vec/common/pod_array.h" -#include "vec/common/sip_hash.h" -#include "vec/core/field.h" - -namespace doris::vectorized { -class ColumnJsonb final : public COWHelper { -public: - using Char = UInt8; - using Chars = PaddedPODArray; - -private: - friend class COWHelper; - - Offsets offsets; - - Chars chars; - - size_t ALWAYS_INLINE offset_at(ssize_t i) const { return offsets[i - 1]; } - - size_t ALWAYS_INLINE size_at(ssize_t i) const { return offsets[i] - offsets[i - 1]; } - - template - struct less; - - template - struct lessWithCollation; - - ColumnJsonb() = default; - - ColumnJsonb(const ColumnJsonb& src) - : offsets(src.offsets.begin(), src.offsets.end()), - chars(src.chars.begin(), src.chars.end()) {} - -public: - const char* get_family_name() const override { return "JSONB"; } - - size_t size() const override { return offsets.size(); } - - size_t byte_size() const override { return chars.size() + offsets.size() * sizeof(offsets[0]); } - - size_t allocated_bytes() const override { - return chars.allocated_bytes() + offsets.allocated_bytes(); - } - - void protect() override; - - MutableColumnPtr clone_resized(size_t to_size) const override; - - Field operator[](size_t n) const override { - assert(n < size()); - return Field(&chars[offset_at(n)], size_at(n) - 1); - } - - void get(size_t n, Field& res) const override { - assert(n < size()); - res.assign_jsonb(&chars[offset_at(n)], size_at(n) - 1); - } - - StringRef get_data_at(size_t n) const override { - assert(n < size()); - return StringRef(&chars[offset_at(n)], size_at(n) - 1); - } - -/// Suppress gcc 7.3.1 warning: '*((void*)& +8)' may be used uninitialized in this function -#if !__clang__ -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" -#endif - - void insert(const Field& x) override { - const JsonbField& s = doris::vectorized::get(x); - - const size_t old_size = chars.size(); - const size_t size_to_append = s.get_size() + 1; - const size_t new_size = old_size + size_to_append; - - chars.resize(new_size); - - memcpy(chars.data() + old_size, s.get_value(), size_to_append - 1); - chars.data()[new_size - 1] = 0; - offsets.push_back(new_size); - } - -#if !__clang__ -#pragma GCC diagnostic pop -#endif - - void insert_from(const IColumn& src_, size_t n) override { - const ColumnJsonb& src = assert_cast(src_); - const size_t size_to_append = - src.offsets[n] - src.offsets[n - 1]; /// -1th index is Ok, see PaddedPODArray. - - if (size_to_append == 1) { - /// shortcut for empty jsonb - chars.push_back(0); - offsets.push_back(chars.size()); - } else { - const size_t old_size = chars.size(); - const size_t offset = src.offsets[n - 1]; - const size_t new_size = old_size + size_to_append; - - chars.resize(new_size); - memcpy_small_allow_read_write_overflow15(chars.data() + old_size, &src.chars[offset], - size_to_append); - offsets.push_back(new_size); - } - } - - void insert_data(const char* pos, size_t length) override { - const size_t old_size = chars.size(); - const size_t new_size = old_size + length + 1; - - chars.resize(new_size); - if (length) memcpy(chars.data() + old_size, pos, length); - chars[old_size + length] = 0; - offsets.push_back(new_size); - } - - void insert_many_continuous_binary_data(const char* data, const uint32_t* offsets_, - const size_t num) override { - if (UNLIKELY(num == 0)) { - return; - } - - size_t new_size = offsets_[num] - offsets_[0] + num * sizeof(char); - const size_t old_size = chars.size(); - chars.resize(new_size + old_size); - - auto* data_ptr = chars.data(); - size_t offset = old_size; - - for (size_t i = 0; i != num; ++i) { - uint32_t len = offsets_[i + 1] - offsets_[i]; - if (LIKELY(len)) { - memcpy(data_ptr + offset, data + offsets_[i], len); - offset += len; - } - data_ptr[offset] = 0; - offset += 1; - offsets.push_back(offset); - } - DCHECK(offset == chars.size()); - } - - void insert_many_binary_data(char* data_array, uint32_t* len_array, - uint32_t* start_offset_array, size_t num) override { - size_t new_size = 0; - for (size_t i = 0; i < num; i++) { - new_size += len_array[i] + 1; - } - - const size_t old_size = chars.size(); - chars.resize(old_size + new_size); - - Char* data = chars.data(); - size_t offset = old_size; - for (size_t i = 0; i < num; i++) { - uint32_t len = len_array[i]; - uint32_t start_offset = start_offset_array[i]; - if (len) memcpy(data + offset, data_array + start_offset, len); - data[offset + len] = 0; - offset += len + 1; - offsets.push_back(offset); - } - } - - void insert_many_dict_data(const int32_t* data_array, size_t start_index, const StringRef* dict, - size_t num, uint32_t /*dict_num*/) override { - for (size_t end_index = start_index + num; start_index < end_index; ++start_index) { - int32_t codeword = data_array[start_index]; - insert_data(dict[codeword].data, dict[codeword].size); - } - } - - void pop_back(size_t n) override { - size_t nested_n = offsets.back() - offset_at(offsets.size() - n); - chars.resize(chars.size() - nested_n); - offsets.resize_assume_reserved(offsets.size() - n); - } - - StringRef serialize_value_into_arena(size_t n, Arena& arena, char const*& begin) const override; - - const char* deserialize_and_insert_from_arena(const char* pos) override; - - size_t get_max_row_byte_size() const override; - - void serialize_vec(std::vector& keys, size_t num_rows, - size_t max_row_byte_size) const override; - - void serialize_vec_with_null_map(std::vector& keys, size_t num_rows, - const uint8_t* null_map, - size_t max_row_byte_size) const override; - - void update_hash_with_value(size_t n, SipHash& hash) const override { - size_t string_size = size_at(n); - size_t offset = offset_at(n); - - hash.update(reinterpret_cast(&string_size), sizeof(string_size)); - hash.update(reinterpret_cast(&chars[offset]), string_size); - } - - void insert_range_from(const IColumn& src, size_t start, size_t length) override; - - void insert_indices_from(const IColumn& src, const int* indices_begin, - const int* indices_end) override; - - ColumnPtr filter(const Filter& filt, ssize_t result_size_hint) const override; - - ColumnPtr permute(const Permutation& perm, size_t limit) const override; - - // ColumnPtr index(const IColumn & indexes, size_t limit) const override; - - template - ColumnPtr index_impl(const PaddedPODArray& indexes, size_t limit) const; - - void insert_default() override { - JsonBinaryValue empty_jsonb("{}"); - insert_data(empty_jsonb.value(), empty_jsonb.size()); - } - - void insert_many_defaults(size_t length) override { - JsonBinaryValue empty_jsonb("{}"); - size_t new_size = 0; - for (size_t i = 0; i < length; i++) { - new_size += empty_jsonb.size() + 1; - } - - const size_t old_size = chars.size(); - chars.resize(old_size + new_size); - - Char* data = chars.data(); - size_t offset = old_size; - for (size_t i = 0; i < length; i++) { - uint32_t len = empty_jsonb.size(); - if (len) memcpy(data + offset, empty_jsonb.value(), len); - data[offset + len] = 0; - offset += len + empty_jsonb.size(); - offsets.push_back(offset); - } - } - - int compare_at(size_t n, size_t m, const IColumn& rhs_, - int /*nan_direction_hint*/) const override { - LOG(FATAL) << "Not support compraing between JSONB value"; - } - - void get_permutation(bool reverse, size_t limit, int nan_direction_hint, - Permutation& res) const override; - - ColumnPtr replicate(const Offsets& replicate_offsets) const override; - - void replicate(const uint32_t* counts, size_t target_size, IColumn& column, size_t begin = 0, - int count_sz = -1) const override; - - MutableColumns scatter(ColumnIndex num_columns, const Selector& selector) const override { - return scatter_impl(num_columns, selector); - } - - void append_data_by_selector(MutableColumnPtr& res, - const IColumn::Selector& selector) const override { - append_data_by_selector_impl(res, selector); - } - // void gather(ColumnGathererStream & gatherer_stream) override; - - void reserve(size_t n) override; - - void resize(size_t n) override; - - void get_extremes(Field& min, Field& max) const override; - - bool can_be_inside_nullable() const override { return true; } - - bool is_column_string() const override { return true; } - - bool structure_equals(const IColumn& rhs) const override { - return typeid(rhs) == typeid(ColumnJsonb); - } - - Chars& get_chars() { return chars; } - - const Chars& get_chars() const { return chars; } - - Offsets& get_offsets() { return offsets; } - - const Offsets& get_offsets() const { return offsets; } - - void clear() override { - chars.clear(); - offsets.clear(); - } - - void replace_column_data(const IColumn& rhs, size_t row, size_t self_row = 0) override { - DCHECK(size() > self_row); - const auto& r = assert_cast(rhs); - auto data = r.get_data_at(row); - - if (!self_row) { - chars.clear(); - offsets[self_row] = data.size + 1; - } else { - offsets[self_row] = offsets[self_row - 1] + data.size + 1; - } - - chars.insert(data.data, data.data + data.size + 1); - } - - // should replace according to 0,1,2... ,size,0,1,2... - void replace_column_data_default(size_t self_row = 0) override { - DCHECK(size() > self_row); - - if (!self_row) { - chars.clear(); - offsets[self_row] = 1; - } else { - offsets[self_row] = offsets[self_row - 1] + 1; - } - - chars.emplace_back(0); - } - - MutableColumnPtr get_shrinked_column() override; -}; -}; // namespace doris::vectorized \ No newline at end of file diff --git a/be/src/vec/data_types/data_type_jsonb.cpp b/be/src/vec/data_types/data_type_jsonb.cpp index c607ced9b3..40988550ad 100644 --- a/be/src/vec/data_types/data_type_jsonb.cpp +++ b/be/src/vec/data_types/data_type_jsonb.cpp @@ -19,7 +19,6 @@ #include "gen_cpp/data.pb.h" #include "vec/columns/column_const.h" -#include "vec/columns/column_jsonb.h" #include "vec/common/assert_cast.h" #include "vec/core/field.h" #include "vec/io/io_helper.h" @@ -30,51 +29,37 @@ namespace doris::vectorized { -template -static inline void read(IColumn& column, Reader&& reader) { - ColumnJsonb& column_json = assert_cast(column); - ColumnJsonb::Chars& data = column_json.get_chars(); - ColumnJsonb::Offsets& offsets = column_json.get_offsets(); - size_t old_chars_size = data.size(); - size_t old_offsets_size = offsets.size(); - try { - reader(data); - data.push_back(0); - offsets.push_back(data.size()); - } catch (...) { - offsets.resize_assume_reserved(old_offsets_size); - data.resize_assume_reserved(old_chars_size); - throw; - } -} - std::string DataTypeJsonb::to_string(const IColumn& column, size_t row_num) const { const StringRef& s = - reinterpret_cast(*column.convert_to_full_column_if_const().get()) + reinterpret_cast(*column.convert_to_full_column_if_const().get()) .get_data_at(row_num); - return JsonbToJson::jsonb_to_json_string(s.data, s.size); + // size == 0 is for NULL + return s.size > 0 ? JsonbToJson::jsonb_to_json_string(s.data, s.size) : ""; } void DataTypeJsonb::to_string(const class doris::vectorized::IColumn& column, size_t row_num, class doris::vectorized::BufferWritable& ostr) const { - std::string json_string = to_string(column, row_num); - ostr.write(json_string.c_str(), json_string.size()); + const StringRef& s = + reinterpret_cast(*column.convert_to_full_column_if_const().get()) + .get_data_at(row_num); + if (s.size > 0) { + std::string str = JsonbToJson::jsonb_to_json_string(s.data, s.size); + ostr.write(str.c_str(), str.size()); + } } Status DataTypeJsonb::from_string(ReadBuffer& rb, IColumn* column) const { JsonBinaryValue value; RETURN_IF_ERROR(value.from_json_string(rb.position(), rb.count())); - Field field = JsonbField(value.value(), value.size()); - - auto* column_jsonb = static_cast(column); - column_jsonb->insert(field); + auto* column_string = static_cast(column); + column_string->insert_data(value.value(), value.size()); return Status::OK(); } MutableColumnPtr DataTypeJsonb::create_column() const { - return ColumnJsonb::create(); + return ColumnString::create(); } bool DataTypeJsonb::equals(const IDataType& rhs) const { @@ -83,106 +68,15 @@ bool DataTypeJsonb::equals(const IDataType& rhs) const { int64_t DataTypeJsonb::get_uncompressed_serialized_bytes(const IColumn& column, int data_version) const { - auto ptr = column.convert_to_full_column_if_const(); - const auto& data_column = assert_cast(*ptr.get()); - - if (data_version == -1) { - return sizeof(IColumn::Offset) * (column.size() + 1) + sizeof(uint64_t) + - data_column.get_chars().size() + column.size(); - } - - return sizeof(IColumn::Offset) * (column.size() + 1) + sizeof(uint64_t) + - data_column.get_chars().size(); + return data_type_string.get_uncompressed_serialized_bytes(column, data_version); } char* DataTypeJsonb::serialize(const IColumn& column, char* buf, int data_version) const { - auto ptr = column.convert_to_full_column_if_const(); - const auto& data_column = assert_cast(*ptr.get()); - - if (data_version == -1) { - // row num - *reinterpret_cast(buf) = column.size(); - buf += sizeof(IColumn::Offset); - // offsets - for (int i = 0; i < column.size(); i++) { - *reinterpret_cast(buf) = data_column.get_offsets()[i] + i + 1; - buf += sizeof(IColumn::Offset); - } - // total length - *reinterpret_cast(buf) = data_column.get_chars().size() + column.size(); - buf += sizeof(uint64_t); - // values - for (int i = 0; i < column.size(); i++) { - auto data = data_column.get_data_at(i); - memcpy(buf, data.data, data.size); - buf += data.size; - *buf = '\0'; - buf++; - } - return buf; - } - - // row num - *reinterpret_cast(buf) = column.size(); - buf += sizeof(IColumn::Offset); - // offsets - memcpy(buf, data_column.get_offsets().data(), column.size() * sizeof(IColumn::Offset)); - buf += column.size() * sizeof(IColumn::Offset); - // total length - uint64_t value_len = data_column.get_chars().size(); - *reinterpret_cast(buf) = value_len; - buf += sizeof(uint64_t); - // values - memcpy(buf, data_column.get_chars().data(), value_len); - buf += value_len; - - return buf; + return data_type_string.serialize(column, buf, data_version); } const char* DataTypeJsonb::deserialize(const char* buf, IColumn* column, int data_version) const { - ColumnJsonb* column_string = assert_cast(column); - ColumnJsonb::Chars& data = column_string->get_chars(); - ColumnJsonb::Offsets& offsets = column_string->get_offsets(); - - if (data_version == -1) { - // row num - IColumn::Offset row_num = *reinterpret_cast(buf); - buf += sizeof(IColumn::Offset); - // offsets - offsets.resize(row_num); - for (int i = 0; i < row_num; i++) { - offsets[i] = *reinterpret_cast(buf) - i - 1; - buf += sizeof(IColumn::Offset); - } - // total length - uint64_t value_len = *reinterpret_cast(buf); - buf += sizeof(uint64_t); - // values - data.resize(value_len - row_num); - for (int i = 0; i < row_num; i++) { - memcpy(data.data() + offsets[i - 1], buf, offsets[i] - offsets[i - 1]); - buf += offsets[i] - offsets[i - 1] + 1; - } - - return buf; - } - - // row num - IColumn::Offset row_num = *reinterpret_cast(buf); - buf += sizeof(IColumn::Offset); - // offsets - offsets.resize(row_num); - memcpy(offsets.data(), buf, sizeof(IColumn::Offset) * row_num); - buf += sizeof(IColumn::Offset) * row_num; - // total length - uint64_t value_len = *reinterpret_cast(buf); - buf += sizeof(uint64_t); - // values - data.resize(value_len); - memcpy(data.data(), buf, value_len); - buf += value_len; - - return buf; + return data_type_string.deserialize(buf, column, data_version); } } // namespace doris::vectorized diff --git a/be/src/vec/data_types/data_type_jsonb.h b/be/src/vec/data_types/data_type_jsonb.h index f437f40c3a..68274d6bff 100644 --- a/be/src/vec/data_types/data_type_jsonb.h +++ b/be/src/vec/data_types/data_type_jsonb.h @@ -19,13 +19,15 @@ #include -#include "vec/columns/column_jsonb.h" +#include "runtime/jsonb_value.h" +#include "vec/columns/column_string.h" #include "vec/data_types/data_type.h" +#include "vec/data_types/data_type_string.h" namespace doris::vectorized { class DataTypeJsonb final : public IDataType { public: - using ColumnType = ColumnJsonb; + using ColumnType = ColumnString; using FieldType = JsonbField; static constexpr bool is_parametric = false; @@ -60,5 +62,8 @@ public: std::string to_string(const IColumn& column, size_t row_num) const override; void to_string(const IColumn& column, size_t row_num, BufferWritable& ostr) const override; Status from_string(ReadBuffer& rb, IColumn* column) const override; + +private: + DataTypeString data_type_string; }; } // namespace doris::vectorized \ No newline at end of file diff --git a/be/src/vec/exprs/vliteral.cpp b/be/src/vec/exprs/vliteral.cpp index c6f3aa4224..0b9ca3a5d0 100644 --- a/be/src/vec/exprs/vliteral.cpp +++ b/be/src/vec/exprs/vliteral.cpp @@ -129,7 +129,7 @@ void VLiteral::init(const TExprNode& node) { DCHECK_EQ(node.node_type, TExprNodeType::JSON_LITERAL); DCHECK(node.__isset.json_literal); JsonBinaryValue value(node.json_literal.value); - field = JsonbField(value.value(), value.size()); + field = String(value.value(), value.size()); break; } case TYPE_DECIMALV2: { diff --git a/be/src/vec/functions/function_cast.h b/be/src/vec/functions/function_cast.h index 0880a723f1..e15ef01e9f 100644 --- a/be/src/vec/functions/function_cast.h +++ b/be/src/vec/functions/function_cast.h @@ -24,7 +24,6 @@ #include "vec/columns/column_array.h" #include "vec/columns/column_const.h" -#include "vec/columns/column_jsonb.h" #include "vec/columns/column_nullable.h" #include "vec/columns/column_string.h" #include "vec/columns/columns_common.h" @@ -366,7 +365,7 @@ struct ConvertImplNumberToJsonb { const size_t result, size_t input_rows_count) { const auto& col_with_type_and_name = block.get_by_position(arguments[0]); - auto col_jsonb = ColumnJsonb::create(); + auto column_string = ColumnString::create(); JsonbWriter writer; const auto* col = @@ -390,10 +389,11 @@ struct ConvertImplNumberToJsonb { } else { LOG(FATAL) << "unsupported type "; } - col_jsonb->insert_data(writer.getOutput()->getBuffer(), writer.getOutput()->getSize()); + column_string->insert_data(writer.getOutput()->getBuffer(), + writer.getOutput()->getSize()); } - block.replace_by_position(result, std::move(col_jsonb)); + block.replace_by_position(result, std::move(column_string)); return Status::OK(); } }; @@ -406,7 +406,7 @@ struct ConvertImplGenericToJsonb { const IDataType& type = *col_with_type_and_name.type; const IColumn& col_from = *col_with_type_and_name.column; - auto col_jsonb = ColumnJsonb::create(); + auto column_string = ColumnString::create(); JsonbWriter writer; auto tmp_col = ColumnString::create(); @@ -422,10 +422,11 @@ struct ConvertImplGenericToJsonb { auto str_ref = tmp_col->get_data_at(0); writer.writeString(str_ref.data, str_ref.size); writer.writeEndString(); - col_jsonb->insert_data(writer.getOutput()->getBuffer(), writer.getOutput()->getSize()); + column_string->insert_data(writer.getOutput()->getBuffer(), + writer.getOutput()->getSize()); } - block.replace_by_position(result, std::move(col_jsonb)); + block.replace_by_position(result, std::move(column_string)); return Status::OK(); } }; @@ -439,7 +440,7 @@ struct ConvertImplFromJsonb { // result column must set type DCHECK(block.get_by_position(result).type != nullptr); auto data_type_to = block.get_by_position(result).type; - if (const ColumnJsonb* col_jsonb = check_and_get_column(&col_from)) { + if (const ColumnString* column_string = check_and_get_column(&col_from)) { auto null_map_col = ColumnUInt8::create(input_rows_count, 0); auto& null_map = null_map_col->get_data(); auto col_to = ColumnType::create(); @@ -451,7 +452,7 @@ struct ConvertImplFromJsonb { res.resize(input_rows_count); for (size_t i = 0; i < input_rows_count; ++i) { - const auto& val = col_jsonb->get_data_at(i); + const auto& val = column_string->get_data_at(i); // ReadBuffer read_buffer((char*)(val.data), val.size); // RETURN_IF_ERROR(data_type_to->from_string(read_buffer, col_to)); diff --git a/be/src/vec/functions/function_jsonb.cpp b/be/src/vec/functions/function_jsonb.cpp index a480735ca4..dd00e04166 100644 --- a/be/src/vec/functions/function_jsonb.cpp +++ b/be/src/vec/functions/function_jsonb.cpp @@ -21,7 +21,6 @@ #include "util/string_parser.hpp" #include "util/string_util.h" #include "vec/columns/column.h" -#include "vec/columns/column_jsonb.h" #include "vec/columns/column_nullable.h" #include "vec/columns/column_string.h" #include "vec/columns/column_vector.h" @@ -188,7 +187,7 @@ public: col_from.get_name()); } - auto col_to = ColumnJsonb::create(); + auto col_to = ColumnString::create(); //IColumn & col_to = *res; size_t size = col_from.size(); @@ -323,7 +322,7 @@ public: auto res = Impl::ColumnType::create(); - auto jsonb_data_column = assert_cast(argument_columns[0].get()); + auto jsonb_data_column = assert_cast(argument_columns[0].get()); auto jsonb_path_column = assert_cast(argument_columns[1].get()); auto& ldata = jsonb_data_column->get_chars(); @@ -370,7 +369,7 @@ struct JsonbExtractStringImpl { } for (size_t i = 0; i < input_rows_count; ++i) { - int l_size = loffsets[i] - loffsets[i - 1] - 1; + int l_size = loffsets[i] - loffsets[i - 1]; const auto l_raw = reinterpret_cast(&ldata[loffsets[i - 1]]); int r_size = roffsets[i] - roffsets[i - 1]; @@ -405,13 +404,9 @@ struct JsonbExtractStringImpl { if constexpr (std::is_same_v) { writer->reset(); writer->writeValue(value); - // StringOP::push_value_string( - // std::string_view(writer->getOutput()->getBuffer(), writer->getOutput()->getSize()), - // i, res_data, res_offsets); - res_data.insert(writer->getOutput()->getBuffer(), - writer->getOutput()->getBuffer() + writer->getOutput()->getSize()); - res_data.push_back('\0'); - res_offsets[i] = res_data.size(); + StringOP::push_value_string(std::string_view(writer->getOutput()->getBuffer(), + writer->getOutput()->getSize()), + i, res_data, res_offsets); } else { if (LIKELY(value->isString())) { auto str_value = (JsonbStringVal*)value; @@ -449,7 +444,7 @@ struct JsonbExtractImpl { } const char* l_raw_str = reinterpret_cast(&ldata[loffsets[i - 1]]); - int l_str_size = loffsets[i] - loffsets[i - 1] - 1; + int l_str_size = loffsets[i] - loffsets[i - 1]; const char* r_raw_str = reinterpret_cast(&rdata[roffsets[i - 1]]); int r_str_size = roffsets[i] - roffsets[i - 1]; @@ -470,7 +465,9 @@ struct JsonbExtractImpl { // value is NOT necessary to be deleted since JsonbValue will not allocate memory JsonbValue* value = doc->getValue()->findPath(r_raw_str, r_str_size, ".", nullptr); if (UNLIKELY(!value)) { - null_map[i] = 1; + if constexpr (!only_check_exists) { + null_map[i] = 1; + } res[i] = 0; continue; } @@ -580,7 +577,7 @@ struct JsonbTypeString { struct JsonbTypeJson { using T = std::string; using ReturnType = DataTypeJsonb; - using ColumnType = ColumnJsonb; + using ColumnType = ColumnString; static const bool only_check_exists = false; static const bool only_get_type = false; }; diff --git a/be/src/vec/olap/olap_data_convertor.cpp b/be/src/vec/olap/olap_data_convertor.cpp index 48fa0c6313..977fc3d1c7 100644 --- a/be/src/vec/olap/olap_data_convertor.cpp +++ b/be/src/vec/olap/olap_data_convertor.cpp @@ -79,7 +79,7 @@ OlapBlockDataConvertor::create_olap_column_data_convertor(const TabletColumn& co return std::make_unique>(); } case FieldType::OLAP_FIELD_TYPE_JSONB: { - return std::make_unique(); + return std::make_unique(true); } case FieldType::OLAP_FIELD_TYPE_BOOL: { return std::make_unique>(); @@ -536,77 +536,6 @@ Status OlapBlockDataConvertor::OlapColumnDataConvertorDate::convert_to_olap() { return Status::OK(); } -// class OlapBlockDataConvertor::OlapColumnDataConvertorJsonb -void OlapBlockDataConvertor::OlapColumnDataConvertorJsonb::set_source_column( - const ColumnWithTypeAndName& typed_column, size_t row_pos, size_t num_rows) { - OlapBlockDataConvertor::OlapColumnDataConvertorBase::set_source_column(typed_column, row_pos, - num_rows); - _slice.resize(num_rows); -} - -const void* OlapBlockDataConvertor::OlapColumnDataConvertorJsonb::get_data() const { - return _slice.data(); -} - -const void* OlapBlockDataConvertor::OlapColumnDataConvertorJsonb::get_data_at(size_t offset) const { - assert(offset < _num_rows && _num_rows == _slice.size()); - UInt8 null_flag = 0; - if (_nullmap) { - null_flag = _nullmap[offset]; - } - return null_flag ? nullptr : _slice.data() + offset; -} - -Status OlapBlockDataConvertor::OlapColumnDataConvertorJsonb::convert_to_olap() { - assert(_typed_column.column); - const vectorized::ColumnJsonb* column_json = nullptr; - if (_nullmap) { - auto nullable_column = - assert_cast(_typed_column.column.get()); - column_json = assert_cast( - nullable_column->get_nested_column_ptr().get()); - } else { - column_json = assert_cast(_typed_column.column.get()); - } - - assert(column_json); - - const char* char_data = (const char*)(column_json->get_chars().data()); - const ColumnJsonb::Offset* offset_cur = column_json->get_offsets().data() + _row_pos; - const ColumnJsonb::Offset* offset_end = offset_cur + _num_rows; - - Slice* slice = _slice.data(); - size_t string_offset = *(offset_cur - 1); - if (_nullmap) { - const UInt8* nullmap_cur = _nullmap + _row_pos; - while (offset_cur != offset_end) { - if (!*nullmap_cur) { - slice->data = const_cast(char_data + string_offset); - slice->size = *offset_cur - string_offset - 1; - } else { - // TODO: this may not be necessary, check and remove later - slice->data = nullptr; - slice->size = 0; - } - string_offset = *offset_cur; - ++nullmap_cur; - ++slice; - ++offset_cur; - } - assert(nullmap_cur == _nullmap + _row_pos + _num_rows && slice == _slice.get_end_ptr()); - } else { - while (offset_cur != offset_end) { - slice->data = const_cast(char_data + string_offset); - slice->size = *offset_cur - string_offset - 1; - string_offset = *offset_cur; - ++slice; - ++offset_cur; - } - assert(slice == _slice.get_end_ptr()); - } - return Status::OK(); -} - void OlapBlockDataConvertor::OlapColumnDataConvertorDateTime::set_source_column( const ColumnWithTypeAndName& typed_column, size_t row_pos, size_t num_rows) { OlapBlockDataConvertor::OlapColumnDataConvertorPaddedPODArray::set_source_column( diff --git a/be/src/vec/olap/olap_data_convertor.h b/be/src/vec/olap/olap_data_convertor.h index 9eb63c9154..577a60bc42 100644 --- a/be/src/vec/olap/olap_data_convertor.h +++ b/be/src/vec/olap/olap_data_convertor.h @@ -19,7 +19,6 @@ #include "olap/types.h" #include "runtime/mem_pool.h" -#include "vec/columns/column_jsonb.h" #include "vec/columns/column_nullable.h" #include "vec/core/column_with_type_and_name.h" #include "vec/core/types.h" @@ -168,21 +167,6 @@ private: PaddedPODArray _slice; }; - class OlapColumnDataConvertorJsonb : public OlapColumnDataConvertorBase { - public: - OlapColumnDataConvertorJsonb() = default; - ~OlapColumnDataConvertorJsonb() override = default; - - void set_source_column(const ColumnWithTypeAndName& typed_column, size_t row_pos, - size_t num_rows) override; - const void* get_data() const override; - const void* get_data_at(size_t offset) const override; - Status convert_to_olap() override; - - private: - PaddedPODArray _slice; - }; - template class OlapColumnDataConvertorPaddedPODArray : public OlapColumnDataConvertorBase { public: diff --git a/be/src/vec/sink/vmysql_result_writer.cpp b/be/src/vec/sink/vmysql_result_writer.cpp index b592206752..155e4c3f2e 100644 --- a/be/src/vec/sink/vmysql_result_writer.cpp +++ b/be/src/vec/sink/vmysql_result_writer.cpp @@ -109,18 +109,13 @@ Status VMysqlResultWriter::_add_one_column(const ColumnPtr& column_ptr, } } if constexpr (type == TYPE_JSONB) { - const auto json_val = column->get_data_at(i); - if (json_val.data == nullptr) { - if (json_val.size == 0) { - // 0x01 is a magic num, not useful actually, just for present "" - char* tmp_val = reinterpret_cast(0x01); - buf_ret = _buffer.push_string(tmp_val, json_val.size); - } else { - buf_ret = _buffer.push_null(); - } + const auto jsonb_val = column->get_data_at(i); + // jsonb size == 0 is NULL + if (jsonb_val.data == nullptr || jsonb_val.size == 0) { + buf_ret = _buffer.push_null(); } else { std::string json_str = - JsonbToJson::jsonb_to_json_string(json_val.data, json_val.size); + JsonbToJson::jsonb_to_json_string(jsonb_val.data, jsonb_val.size); buf_ret = _buffer.push_string(json_str.c_str(), json_str.size()); } } diff --git a/be/src/vec/sink/vtablet_sink.cpp b/be/src/vec/sink/vtablet_sink.cpp index 3599abcbb3..7b5460a850 100644 --- a/be/src/vec/sink/vtablet_sink.cpp +++ b/be/src/vec/sink/vtablet_sink.cpp @@ -24,7 +24,6 @@ #include "util/proto_util.h" #include "util/time.h" #include "vec/columns/column_array.h" -#include "vec/columns/column_jsonb.h" #include "vec/core/block.h" #include "vec/exprs/vexpr.h" #include "vec/exprs/vexpr_context.h" @@ -711,11 +710,14 @@ Status VOlapTableSink::_validate_column(RuntimeState* state, const TypeDescripto break; } case TYPE_JSONB: { - const auto column_jsonb = - assert_cast(real_column_ptr.get()); + const auto column_string = + assert_cast(real_column_ptr.get()); for (size_t j = 0; j < column->size(); ++j) { if (!filter_bitmap->Get(j)) { - auto str_val = column_jsonb->get_data_at(j); + if (is_nullable && column_ptr && column_ptr->is_null_at(j)) { + continue; + } + auto str_val = column_string->get_data_at(j); bool invalid = str_val.size == 0; if (invalid) { error_msg.clear(); diff --git a/be/test/vec/core/column_jsonb_test.cpp b/be/test/vec/core/column_jsonb_test.cpp deleted file mode 100644 index ca9aeac809..0000000000 --- a/be/test/vec/core/column_jsonb_test.cpp +++ /dev/null @@ -1,57 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one -// or more contributor license agreements. See the NOTICE file -// distributed with this work for additional information -// regarding copyright ownership. The ASF licenses this file -// to you under the Apache License, Version 2.0 (the -// "License"); you may not use this file except in compliance -// with the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. - -#include "vec/columns/column_jsonb.h" - -#include - -#include -#include - -#include "vec/columns/column.h" -#include "vec/columns/column_string.h" -#include "vec/columns/column_vector.h" - -namespace doris::vectorized { - -JsonBinaryValue FromStdString(const std::string& str) { - char* ptr = const_cast(str.c_str()); - int len = str.size(); - return JsonBinaryValue(ptr, len); -} - -TEST(ColumnJsonbTest, SingleValueTest) { - auto data_column = ColumnJsonb::create(); - - std::vector offs = {0}; - std::vector vals = {"[\"val1\", \"val2\"]", "[false]", - "{\"key1\": \"js6\", \"key2\": [\"val1\", \"val2\"]}"}; - for (size_t i = 0; i < vals.size(); i++) { - JsonBinaryValue v = FromStdString(vals[i]); - if (i) { - offs.push_back(offs[i - 1] + v.size()); - } - data_column->insert_data(v.value(), v.size()); - } - - for (size_t i = 0; i < offs.size(); i++) { - auto v = data_column->get_data_at(offs[i]); - std::string json_str = JsonbToJson::jsonb_to_json_string(v.data, v.size); - EXPECT_EQ(vals[i], json_str); - } -} -} // namespace doris::vectorized diff --git a/fe/fe-core/src/main/cup/sql_parser.cup b/fe/fe-core/src/main/cup/sql_parser.cup index 62fab2aaaa..f2720f59ad 100644 --- a/fe/fe-core/src/main/cup/sql_parser.cup +++ b/fe/fe-core/src/main/cup/sql_parser.cup @@ -412,7 +412,7 @@ terminal String KW_INVERTED, KW_JOB, KW_JOIN, - KW_JSON, + KW_JSONB, KW_KEY, KW_KEYS, KW_KILL, @@ -5524,7 +5524,7 @@ type ::= {: RESULT = Type.QUANTILE_STATE; :} | KW_STRING {: RESULT = ScalarType.createStringType(); :} - | KW_JSON + | KW_JSONB {: RESULT = ScalarType.createJsonbType(); :} | KW_TEXT {: RESULT = ScalarType.createStringType(); :} @@ -6595,7 +6595,7 @@ keyword ::= {: RESULT = id; :} | KW_JOB:id {: RESULT = id; :} - | KW_JSON:id + | KW_JSONB:id {: RESULT = id; :} | KW_ENCRYPTKEY:id {: RESULT = id; :} diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/PrimitiveType.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/PrimitiveType.java index 8f03e8d8bc..273e658316 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/PrimitiveType.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/PrimitiveType.java @@ -49,7 +49,7 @@ public enum PrimitiveType { // 8-byte pointer and 4-byte length indicator (12 bytes total). // Aligning to 8 bytes so 16 total. VARCHAR("VARCHAR", 16, TPrimitiveType.VARCHAR), - JSONB("JSON", 16, TPrimitiveType.JSONB), + JSONB("JSONB", 16, TPrimitiveType.JSONB), DECIMALV2("DECIMALV2", 16, TPrimitiveType.DECIMALV2), DECIMAL32("DECIMAL32", 4, TPrimitiveType.DECIMAL32), diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/ScalarType.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/ScalarType.java index d0dee96ca4..5243ba315a 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/ScalarType.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/ScalarType.java @@ -529,7 +529,7 @@ public class ScalarType extends Type { } else if (type == PrimitiveType.STRING) { return "TEXT"; } else if (type == PrimitiveType.JSONB) { - return "JSON"; + return "JSONB"; } return type.toString(); } @@ -601,7 +601,7 @@ public class ScalarType extends Type { stringBuilder.append("text"); break; case JSONB: - stringBuilder.append("json"); + stringBuilder.append("jsonb"); break; case ARRAY: stringBuilder.append(type.toString().toLowerCase()); diff --git a/fe/fe-core/src/main/java/org/apache/doris/mysql/MysqlColType.java b/fe/fe-core/src/main/java/org/apache/doris/mysql/MysqlColType.java index 580fcc9205..d451b5ee38 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/mysql/MysqlColType.java +++ b/fe/fe-core/src/main/java/org/apache/doris/mysql/MysqlColType.java @@ -42,6 +42,7 @@ public enum MysqlColType { MYSQL_TYPE_TIMESTAMP2(17, "TIMESTAMP2"), MYSQL_TYPE_DATETIME2(18, "DATETIME2"), MYSQL_TYPE_TIME2(19, "TIME2"), + MYSQL_TYPE_JSON(245, "JSON"), MYSQL_TYPE_NEWDECIMAL(246, "NEW DECIMAL"), MYSQL_TYPE_ENUM(247, "ENUM"), MYSQL_TYPE_SET(248, "SET"), @@ -51,8 +52,7 @@ public enum MysqlColType { MYSQL_TYPE_BLOB(252, "BLOB"), MYSQL_TYPE_VARSTRING(253, "VAR STRING"), MYSQL_TYPE_STRING(254, "STRING"), - MYSQL_TYPE_GEOMETRY(255, "GEOMETRY"), - MYSQL_TYPE_JSON(256, "JSON"); + MYSQL_TYPE_GEOMETRY(255, "GEOMETRY"); private MysqlColType(int code, String desc) { this.code = code; diff --git a/fe/fe-core/src/main/jflex/sql_scanner.flex b/fe/fe-core/src/main/jflex/sql_scanner.flex index e57a011ace..1f50df0105 100644 --- a/fe/fe-core/src/main/jflex/sql_scanner.flex +++ b/fe/fe-core/src/main/jflex/sql_scanner.flex @@ -271,7 +271,7 @@ import org.apache.doris.qe.SqlModeHelper; keywordMap.put("isolation", new Integer(SqlParserSymbols.KW_ISOLATION)); keywordMap.put("job", new Integer(SqlParserSymbols.KW_JOB)); keywordMap.put("join", new Integer(SqlParserSymbols.KW_JOIN)); - keywordMap.put("json", new Integer(SqlParserSymbols.KW_JSON)); + keywordMap.put("jsonb", new Integer(SqlParserSymbols.KW_JSONB)); keywordMap.put("key", new Integer(SqlParserSymbols.KW_KEY)); keywordMap.put("keys", new Integer(SqlParserSymbols.KW_KEYS)); keywordMap.put("kill", new Integer(SqlParserSymbols.KW_KILL)); diff --git a/regression-test/data/jsonb_p0/test_jsonb.csv b/regression-test/data/jsonb_p0/test_jsonb.csv new file mode 100644 index 0000000000..3a33f80e5b --- /dev/null +++ b/regression-test/data/jsonb_p0/test_jsonb.csv @@ -0,0 +1,25 @@ +1 \N +2 null +3 true +4 false +5 100 +6 10000 +7 1000000000 +8 1152921504606846976 +9 6.18 +10 "abcd" +11 {} +12 {"k1":"v31", "k2": 300} +13 [] +14 [123, 456] +15 ["abc", "def"] +16 [null, true, false, 100, 6.18, "abc"] +17 [{"k1":"v41", "k2": 400}, 1, "a", 3.14] +18 {"k1":"v31", "k2": 300, "a1": [{"k1":"v41", "k2": 400}, 1, "a", 3.14]} +19 '' +20 'abc' +21 abc +22 100x +23 6.a8 +24 {x +25 [123, abc] diff --git a/regression-test/data/jsonb_p0/test_jsonb_load_and_function.out b/regression-test/data/jsonb_p0/test_jsonb_load_and_function.out new file mode 100644 index 0000000000..e50035ec83 --- /dev/null +++ b/regression-test/data/jsonb_p0/test_jsonb_load_and_function.out @@ -0,0 +1,3444 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !select -- +1 \N +2 null +3 true +4 false +5 100 +6 10000 +7 1000000000 +8 1152921504606846976 +9 6.18 +10 "abcd" +11 {} +12 {"k1":"v31","k2":300} +13 [] +14 [123,456] +15 ["abc","def"] +16 [null,true,false,100,6.18,"abc"] +17 [{"k1":"v41","k2":400},1,"a",3.14] +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} + +-- !select -- +1 \N +2 null +3 true +4 false +5 100 +6 10000 +7 1000000000 +8 1152921504606846976 +9 6.18 +10 "abcd" +11 {} +12 {"k1":"v31","k2":300} +13 [] +14 [123,456] +15 ["abc","def"] +16 [null,true,false,100,6.18,"abc"] +17 [{"k1":"v41","k2":400},1,"a",3.14] +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} +26 {"k1":"v1","k2":200} + +-- !select -- +1 \N \N +2 null null +3 true true +4 false false +5 100 100 +6 10000 10000 +7 1000000000 1000000000 +8 1152921504606846976 1152921504606846976 +9 6.18 6.18 +10 "abcd" "abcd" +11 {} {} +12 {"k1":"v31","k2":300} {"k1":"v31","k2":300} +13 [] [] +14 [123,456] [123,456] +15 ["abc","def"] ["abc","def"] +16 [null,true,false,100,6.18,"abc"] [null,true,false,100,6.18,"abc"] +17 [{"k1":"v41","k2":400},1,"a",3.14] [{"k1":"v41","k2":400},1,"a",3.14] +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} +26 {"k1":"v1","k2":200} {"k1":"v1","k2":200} + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} "v31" +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} "v31" +26 {"k1":"v1","k2":200} "v1" + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} 300 +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} 300 +26 {"k1":"v1","k2":200} 200 + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] 123 +15 ["abc","def"] "abc" +16 [null,true,false,100,6.18,"abc"] null +17 [{"k1":"v41","k2":400},1,"a",3.14] {"k1":"v41","k2":400} +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] 456 +15 ["abc","def"] "def" +16 [null,true,false,100,6.18,"abc"] true +17 [{"k1":"v41","k2":400},1,"a",3.14] 1 +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] false +17 [{"k1":"v41","k2":400},1,"a",3.14] "a" +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] 100 +17 [{"k1":"v41","k2":400},1,"a",3.14] 3.14 +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] 6.18 +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] "abc" +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} [{"k1":"v41","k2":400},1,"a",3.14] +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} {"k1":"v41","k2":400} +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} 1 +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} "a" +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} 3.14 +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" abcd +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} v31 +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} v31 +26 {"k1":"v1","k2":200} v1 + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] abc +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] def +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] a +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] abc +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} a +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 100 +6 10000 10000 +7 1000000000 1000000000 +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} 300 +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} 300 +26 {"k1":"v1","k2":200} 200 + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] 123 +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] 456 +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] 1 +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] 100 +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} 1 +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 100 +6 10000 10000 +7 1000000000 1000000000 +8 1152921504606846976 1152921504606846976 +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} 300 +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} 300 +26 {"k1":"v1","k2":200} 200 + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] 123 +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] 456 +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] 1 +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] 100 +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} 1 +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 100.0 +6 10000 10000.0 +7 1000000000 1.0E9 +8 1152921504606846976 1.15292150460684698E18 +9 6.18 6.18 +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} 300.0 +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} 300.0 +26 {"k1":"v1","k2":200} 200.0 + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] 123.0 +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] 456.0 +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] 1.0 +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] 100.0 +17 [{"k1":"v41","k2":400},1,"a",3.14] 3.14 +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] 6.18 +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} 1.0 +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} 3.14 +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true true +4 false false +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] true +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] false +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null true +3 true false +4 false false +5 100 false +6 10000 false +7 1000000000 false +8 1152921504606846976 false +9 6.18 false +10 "abcd" false +11 {} false +12 {"k1":"v31","k2":300} false +13 [] false +14 [123,456] false +15 ["abc","def"] false +16 [null,true,false,100,6.18,"abc"] false +17 [{"k1":"v41","k2":400},1,"a",3.14] false +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} false +26 {"k1":"v1","k2":200} false + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} false +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} false +26 {"k1":"v1","k2":200} false + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} false +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} false +26 {"k1":"v1","k2":200} false + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] false +15 ["abc","def"] false +16 [null,true,false,100,6.18,"abc"] true +17 [{"k1":"v41","k2":400},1,"a",3.14] false +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] false +15 ["abc","def"] false +16 [null,true,false,100,6.18,"abc"] false +17 [{"k1":"v41","k2":400},1,"a",3.14] false +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] false +17 [{"k1":"v41","k2":400},1,"a",3.14] false +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] false +17 [{"k1":"v41","k2":400},1,"a",3.14] false +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] false +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] false +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} false +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} false +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} false +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} false +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} false +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null true +3 true true +4 false true +5 100 true +6 10000 true +7 1000000000 true +8 1152921504606846976 true +9 6.18 true +10 "abcd" true +11 {} true +12 {"k1":"v31","k2":300} true +13 [] true +14 [123,456] true +15 ["abc","def"] true +16 [null,true,false,100,6.18,"abc"] true +17 [{"k1":"v41","k2":400},1,"a",3.14] true +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} true +26 {"k1":"v1","k2":200} true + +-- !select -- +1 \N \N +2 null false +3 true false +4 false false +5 100 false +6 10000 false +7 1000000000 false +8 1152921504606846976 false +9 6.18 false +10 "abcd" false +11 {} false +12 {"k1":"v31","k2":300} true +13 [] false +14 [123,456] false +15 ["abc","def"] false +16 [null,true,false,100,6.18,"abc"] false +17 [{"k1":"v41","k2":400},1,"a",3.14] false +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} true +26 {"k1":"v1","k2":200} true + +-- !select -- +1 \N \N +2 null false +3 true false +4 false false +5 100 false +6 10000 false +7 1000000000 false +8 1152921504606846976 false +9 6.18 false +10 "abcd" false +11 {} false +12 {"k1":"v31","k2":300} true +13 [] false +14 [123,456] false +15 ["abc","def"] false +16 [null,true,false,100,6.18,"abc"] false +17 [{"k1":"v41","k2":400},1,"a",3.14] false +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} true +26 {"k1":"v1","k2":200} true + +-- !select -- +1 \N \N +2 null false +3 true false +4 false false +5 100 false +6 10000 false +7 1000000000 false +8 1152921504606846976 false +9 6.18 false +10 "abcd" false +11 {} false +12 {"k1":"v31","k2":300} false +13 [] false +14 [123,456] true +15 ["abc","def"] true +16 [null,true,false,100,6.18,"abc"] true +17 [{"k1":"v41","k2":400},1,"a",3.14] true +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} false +26 {"k1":"v1","k2":200} false + +-- !select -- +1 \N \N +2 null false +3 true false +4 false false +5 100 false +6 10000 false +7 1000000000 false +8 1152921504606846976 false +9 6.18 false +10 "abcd" false +11 {} false +12 {"k1":"v31","k2":300} false +13 [] false +14 [123,456] true +15 ["abc","def"] true +16 [null,true,false,100,6.18,"abc"] true +17 [{"k1":"v41","k2":400},1,"a",3.14] true +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} false +26 {"k1":"v1","k2":200} false + +-- !select -- +1 \N \N +2 null false +3 true false +4 false false +5 100 false +6 10000 false +7 1000000000 false +8 1152921504606846976 false +9 6.18 false +10 "abcd" false +11 {} false +12 {"k1":"v31","k2":300} false +13 [] false +14 [123,456] false +15 ["abc","def"] false +16 [null,true,false,100,6.18,"abc"] true +17 [{"k1":"v41","k2":400},1,"a",3.14] true +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} false +26 {"k1":"v1","k2":200} false + +-- !select -- +1 \N \N +2 null false +3 true false +4 false false +5 100 false +6 10000 false +7 1000000000 false +8 1152921504606846976 false +9 6.18 false +10 "abcd" false +11 {} false +12 {"k1":"v31","k2":300} false +13 [] false +14 [123,456] false +15 ["abc","def"] false +16 [null,true,false,100,6.18,"abc"] true +17 [{"k1":"v41","k2":400},1,"a",3.14] true +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} false +26 {"k1":"v1","k2":200} false + +-- !select -- +1 \N \N +2 null false +3 true false +4 false false +5 100 false +6 10000 false +7 1000000000 false +8 1152921504606846976 false +9 6.18 false +10 "abcd" false +11 {} false +12 {"k1":"v31","k2":300} false +13 [] false +14 [123,456] false +15 ["abc","def"] false +16 [null,true,false,100,6.18,"abc"] true +17 [{"k1":"v41","k2":400},1,"a",3.14] false +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} false +26 {"k1":"v1","k2":200} false + +-- !select -- +1 \N \N +2 null false +3 true false +4 false false +5 100 false +6 10000 false +7 1000000000 false +8 1152921504606846976 false +9 6.18 false +10 "abcd" false +11 {} false +12 {"k1":"v31","k2":300} false +13 [] false +14 [123,456] false +15 ["abc","def"] false +16 [null,true,false,100,6.18,"abc"] true +17 [{"k1":"v41","k2":400},1,"a",3.14] false +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} false +26 {"k1":"v1","k2":200} false + +-- !select -- +1 \N \N +2 null false +3 true false +4 false false +5 100 false +6 10000 false +7 1000000000 false +8 1152921504606846976 false +9 6.18 false +10 "abcd" false +11 {} false +12 {"k1":"v31","k2":300} false +13 [] false +14 [123,456] false +15 ["abc","def"] false +16 [null,true,false,100,6.18,"abc"] false +17 [{"k1":"v41","k2":400},1,"a",3.14] false +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} false +26 {"k1":"v1","k2":200} false + +-- !select -- +1 \N \N +2 null false +3 true false +4 false false +5 100 false +6 10000 false +7 1000000000 false +8 1152921504606846976 false +9 6.18 false +10 "abcd" false +11 {} false +12 {"k1":"v31","k2":300} false +13 [] false +14 [123,456] false +15 ["abc","def"] false +16 [null,true,false,100,6.18,"abc"] false +17 [{"k1":"v41","k2":400},1,"a",3.14] false +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} false +26 {"k1":"v1","k2":200} false + +-- !select -- +1 \N \N +2 null false +3 true false +4 false false +5 100 false +6 10000 false +7 1000000000 false +8 1152921504606846976 false +9 6.18 false +10 "abcd" false +11 {} false +12 {"k1":"v31","k2":300} false +13 [] false +14 [123,456] false +15 ["abc","def"] false +16 [null,true,false,100,6.18,"abc"] false +17 [{"k1":"v41","k2":400},1,"a",3.14] false +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} true +26 {"k1":"v1","k2":200} false + +-- !select -- +1 \N \N +2 null false +3 true false +4 false false +5 100 false +6 10000 false +7 1000000000 false +8 1152921504606846976 false +9 6.18 false +10 "abcd" false +11 {} false +12 {"k1":"v31","k2":300} false +13 [] false +14 [123,456] false +15 ["abc","def"] false +16 [null,true,false,100,6.18,"abc"] false +17 [{"k1":"v41","k2":400},1,"a",3.14] false +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} true +26 {"k1":"v1","k2":200} false + +-- !select -- +1 \N \N +2 null false +3 true false +4 false false +5 100 false +6 10000 false +7 1000000000 false +8 1152921504606846976 false +9 6.18 false +10 "abcd" false +11 {} false +12 {"k1":"v31","k2":300} false +13 [] false +14 [123,456] false +15 ["abc","def"] false +16 [null,true,false,100,6.18,"abc"] false +17 [{"k1":"v41","k2":400},1,"a",3.14] false +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} true +26 {"k1":"v1","k2":200} false + +-- !select -- +1 \N \N +2 null false +3 true false +4 false false +5 100 false +6 10000 false +7 1000000000 false +8 1152921504606846976 false +9 6.18 false +10 "abcd" false +11 {} false +12 {"k1":"v31","k2":300} false +13 [] false +14 [123,456] false +15 ["abc","def"] false +16 [null,true,false,100,6.18,"abc"] false +17 [{"k1":"v41","k2":400},1,"a",3.14] false +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} true +26 {"k1":"v1","k2":200} false + +-- !select -- +1 \N \N +2 null false +3 true false +4 false false +5 100 false +6 10000 false +7 1000000000 false +8 1152921504606846976 false +9 6.18 false +10 "abcd" false +11 {} false +12 {"k1":"v31","k2":300} false +13 [] false +14 [123,456] false +15 ["abc","def"] false +16 [null,true,false,100,6.18,"abc"] false +17 [{"k1":"v41","k2":400},1,"a",3.14] false +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} true +26 {"k1":"v1","k2":200} false + +-- !select -- +1 \N \N +2 null false +3 true false +4 false false +5 100 false +6 10000 false +7 1000000000 false +8 1152921504606846976 false +9 6.18 false +10 "abcd" false +11 {} false +12 {"k1":"v31","k2":300} false +13 [] false +14 [123,456] false +15 ["abc","def"] false +16 [null,true,false,100,6.18,"abc"] false +17 [{"k1":"v41","k2":400},1,"a",3.14] false +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} false +26 {"k1":"v1","k2":200} false + +-- !select -- +1 \N \N +2 null false +3 true false +4 false false +5 100 false +6 10000 false +7 1000000000 false +8 1152921504606846976 false +9 6.18 false +10 "abcd" false +11 {} false +12 {"k1":"v31","k2":300} false +13 [] false +14 [123,456] false +15 ["abc","def"] false +16 [null,true,false,100,6.18,"abc"] false +17 [{"k1":"v41","k2":400},1,"a",3.14] false +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} false +26 {"k1":"v1","k2":200} false + +-- !select -- +1 \N \N +2 null null +3 true bool +4 false bool +5 100 int +6 10000 int +7 1000000000 int +8 1152921504606846976 bigint +9 6.18 double +10 "abcd" string +11 {} object +12 {"k1":"v31","k2":300} object +13 [] array +14 [123,456] array +15 ["abc","def"] array +16 [null,true,false,100,6.18,"abc"] array +17 [{"k1":"v41","k2":400},1,"a",3.14] array +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} object +26 {"k1":"v1","k2":200} object + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} string +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} string +26 {"k1":"v1","k2":200} string + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} int +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} int +26 {"k1":"v1","k2":200} int + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] int +15 ["abc","def"] string +16 [null,true,false,100,6.18,"abc"] null +17 [{"k1":"v41","k2":400},1,"a",3.14] object +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] int +15 ["abc","def"] string +16 [null,true,false,100,6.18,"abc"] bool +17 [{"k1":"v41","k2":400},1,"a",3.14] int +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] bool +17 [{"k1":"v41","k2":400},1,"a",3.14] string +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] int +17 [{"k1":"v41","k2":400},1,"a",3.14] double +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] double +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] string +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} array +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} object +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} int +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} string +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} double +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + +-- !select -- +1 \N \N +2 null \N +3 true \N +4 false \N +5 100 \N +6 10000 \N +7 1000000000 \N +8 1152921504606846976 \N +9 6.18 \N +10 "abcd" \N +11 {} \N +12 {"k1":"v31","k2":300} \N +13 [] \N +14 [123,456] \N +15 ["abc","def"] \N +16 [null,true,false,100,6.18,"abc"] \N +17 [{"k1":"v41","k2":400},1,"a",3.14] \N +18 {"k1":"v31","k2":300,"a1":[{"k1":"v41","k2":400},1,"a",3.14]} \N +26 {"k1":"v1","k2":200} \N + diff --git a/regression-test/suites/jsonb_p0/test_jsonb_load_and_function.groovy b/regression-test/suites/jsonb_p0/test_jsonb_load_and_function.groovy new file mode 100644 index 0000000000..871d1542dd --- /dev/null +++ b/regression-test/suites/jsonb_p0/test_jsonb_load_and_function.groovy @@ -0,0 +1,311 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +suite("test_jsonb_load_and_function", "p0") { + // define a sql table + def testTable = "tbl_test_jsonb" + def dataFile = "test_jsonb.csv" + + sql """ set enable_vectorized_engine = true """ + + sql "DROP TABLE IF EXISTS ${testTable}" + + sql """ + CREATE TABLE IF NOT EXISTS ${testTable} ( + id INT, + j JSONB + ) + DUPLICATE KEY(id) + DISTRIBUTED BY HASH(id) BUCKETS 10 + PROPERTIES("replication_num" = "1"); + """ + + // load the jsonb data from csv file + // fail by default for invalid data rows + streamLoad { + table testTable + + file dataFile // import csv file + time 10000 // limit inflight 10s + + // if declared a check callback, the default check condition will ignore. + // So you must check all condition + check { result, exception, startTime, endTime -> + if (exception != null) { + throw exception + } + log.info("Stream load result: ${result}".toString()) + def json = parseJson(result) + assertEquals("fail", json.Status.toLowerCase()) + assertEquals("too many filtered rows", json.Message) + assertEquals(25, json.NumberTotalRows) + assertEquals(18, json.NumberLoadedRows) + assertEquals(7, json.NumberFilteredRows) + assertTrue(json.LoadBytes > 0) + } + } + + // load the jsonb data from csv file + // success with header 'max_filter_ratio: 0.3' + streamLoad { + table testTable + + // set http request header params + set 'max_filter_ratio', '0.3' + file dataFile // import csv file + time 10000 // limit inflight 10s + + // if declared a check callback, the default check condition will ignore. + // So you must check all condition + check { result, exception, startTime, endTime -> + if (exception != null) { + throw exception + } + log.info("Stream load result: ${result}".toString()) + def json = parseJson(result) + assertEquals("success", json.Status.toLowerCase()) + assertEquals(25, json.NumberTotalRows) + assertEquals(18, json.NumberLoadedRows) + assertEquals(7, json.NumberFilteredRows) + assertTrue(json.LoadBytes > 0) + } + } + + // check result + qt_select "SELECT * FROM ${testTable} ORDER BY id" + + // insert into 1 row and then check result + sql """INSERT INTO ${testTable} VALUES(26, '{"k1":"v1", "k2": 200}')""" + qt_select "SELECT * FROM ${testTable} ORDER BY id" + + // jsonb_extract + qt_select "SELECT id, j, jsonb_extract(j, '\$') FROM ${testTable} ORDER BY id" + + qt_select "SELECT id, j, jsonb_extract(j, '\$.k1') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract(j, '\$.k2') FROM ${testTable} ORDER BY id" + + qt_select "SELECT id, j, jsonb_extract(j, '\$[0]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract(j, '\$[1]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract(j, '\$[2]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract(j, '\$[3]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract(j, '\$[4]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract(j, '\$[5]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract(j, '\$[6]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract(j, '\$[10]') FROM ${testTable} ORDER BY id" + + qt_select "SELECT id, j, jsonb_extract(j, '\$.a1') FROM ${testTable} ORDER BY id" + + qt_select "SELECT id, j, jsonb_extract(j, '\$.a1[0]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract(j, '\$.a1[1]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract(j, '\$.a1[2]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract(j, '\$.a1[3]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract(j, '\$.a1[4]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract(j, '\$.a1[10]') FROM ${testTable} ORDER BY id" + + // jsonb_extract_string + qt_select "SELECT id, j, jsonb_extract_string(j, '\$') FROM ${testTable} ORDER BY id" + + qt_select "SELECT id, j, jsonb_extract_string(j, '\$.k1') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_string(j, '\$.k2') FROM ${testTable} ORDER BY id" + + qt_select "SELECT id, j, jsonb_extract_string(j, '\$[0]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_string(j, '\$[1]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_string(j, '\$[2]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_string(j, '\$[3]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_string(j, '\$[4]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_string(j, '\$[5]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_string(j, '\$[6]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_string(j, '\$[10]') FROM ${testTable} ORDER BY id" + + qt_select "SELECT id, j, jsonb_extract_string(j, '\$.a1') FROM ${testTable} ORDER BY id" + + qt_select "SELECT id, j, jsonb_extract_string(j, '\$.a1[0]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_string(j, '\$.a1[1]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_string(j, '\$.a1[2]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_string(j, '\$.a1[3]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_string(j, '\$.a1[4]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_string(j, '\$.a1[10]') FROM ${testTable} ORDER BY id" + + // jsonb_extract_int + qt_select "SELECT id, j, jsonb_extract_int(j, '\$') FROM ${testTable} ORDER BY id" + + qt_select "SELECT id, j, jsonb_extract_int(j, '\$.k1') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_int(j, '\$.k2') FROM ${testTable} ORDER BY id" + + qt_select "SELECT id, j, jsonb_extract_int(j, '\$[0]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_int(j, '\$[1]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_int(j, '\$[2]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_int(j, '\$[3]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_int(j, '\$[4]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_int(j, '\$[5]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_int(j, '\$[6]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_int(j, '\$[10]') FROM ${testTable} ORDER BY id" + + qt_select "SELECT id, j, jsonb_extract_int(j, '\$.a1') FROM ${testTable} ORDER BY id" + + qt_select "SELECT id, j, jsonb_extract_int(j, '\$.a1[0]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_int(j, '\$.a1[1]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_int(j, '\$.a1[2]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_int(j, '\$.a1[3]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_int(j, '\$.a1[4]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_int(j, '\$.a1[10]') FROM ${testTable} ORDER BY id" + + // jsonb_extract_bigint + qt_select "SELECT id, j, jsonb_extract_bigint(j, '\$') FROM ${testTable} ORDER BY id" + + qt_select "SELECT id, j, jsonb_extract_bigint(j, '\$.k1') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_bigint(j, '\$.k2') FROM ${testTable} ORDER BY id" + + qt_select "SELECT id, j, jsonb_extract_bigint(j, '\$[0]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_bigint(j, '\$[1]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_bigint(j, '\$[2]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_bigint(j, '\$[3]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_bigint(j, '\$[4]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_bigint(j, '\$[5]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_bigint(j, '\$[6]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_bigint(j, '\$[10]') FROM ${testTable} ORDER BY id" + + qt_select "SELECT id, j, jsonb_extract_bigint(j, '\$.a1') FROM ${testTable} ORDER BY id" + + qt_select "SELECT id, j, jsonb_extract_bigint(j, '\$.a1[0]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_bigint(j, '\$.a1[1]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_bigint(j, '\$.a1[2]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_bigint(j, '\$.a1[3]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_bigint(j, '\$.a1[4]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_bigint(j, '\$.a1[10]') FROM ${testTable} ORDER BY id" + + + // jsonb_extract_double + qt_select "SELECT id, j, jsonb_extract_double(j, '\$') FROM ${testTable} ORDER BY id" + + qt_select "SELECT id, j, jsonb_extract_double(j, '\$.k1') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_double(j, '\$.k2') FROM ${testTable} ORDER BY id" + + qt_select "SELECT id, j, jsonb_extract_double(j, '\$[0]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_double(j, '\$[1]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_double(j, '\$[2]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_double(j, '\$[3]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_double(j, '\$[4]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_double(j, '\$[5]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_double(j, '\$[6]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_double(j, '\$[10]') FROM ${testTable} ORDER BY id" + + qt_select "SELECT id, j, jsonb_extract_double(j, '\$.a1') FROM ${testTable} ORDER BY id" + + qt_select "SELECT id, j, jsonb_extract_double(j, '\$.a1[0]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_double(j, '\$.a1[1]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_double(j, '\$.a1[2]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_double(j, '\$.a1[3]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_double(j, '\$.a1[4]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_double(j, '\$.a1[10]') FROM ${testTable} ORDER BY id" + + // jsonb_extract_bool + qt_select "SELECT id, j, jsonb_extract_bool(j, '\$') FROM ${testTable} ORDER BY id" + + qt_select "SELECT id, j, jsonb_extract_bool(j, '\$.k1') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_bool(j, '\$.k2') FROM ${testTable} ORDER BY id" + + qt_select "SELECT id, j, jsonb_extract_bool(j, '\$[0]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_bool(j, '\$[1]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_bool(j, '\$[2]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_bool(j, '\$[3]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_bool(j, '\$[4]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_bool(j, '\$[5]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_bool(j, '\$[6]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_bool(j, '\$[10]') FROM ${testTable} ORDER BY id" + + qt_select "SELECT id, j, jsonb_extract_bool(j, '\$.a1') FROM ${testTable} ORDER BY id" + + qt_select "SELECT id, j, jsonb_extract_bool(j, '\$.a1[0]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_bool(j, '\$.a1[1]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_bool(j, '\$.a1[2]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_bool(j, '\$.a1[3]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_bool(j, '\$.a1[4]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_bool(j, '\$.a1[10]') FROM ${testTable} ORDER BY id" + + // jsonb_extract_isnull + qt_select "SELECT id, j, jsonb_extract_isnull(j, '\$') FROM ${testTable} ORDER BY id" + + qt_select "SELECT id, j, jsonb_extract_isnull(j, '\$.k1') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_isnull(j, '\$.k2') FROM ${testTable} ORDER BY id" + + qt_select "SELECT id, j, jsonb_extract_isnull(j, '\$[0]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_isnull(j, '\$[1]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_isnull(j, '\$[2]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_isnull(j, '\$[3]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_isnull(j, '\$[4]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_isnull(j, '\$[5]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_isnull(j, '\$[6]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_isnull(j, '\$[10]') FROM ${testTable} ORDER BY id" + + qt_select "SELECT id, j, jsonb_extract_isnull(j, '\$.a1') FROM ${testTable} ORDER BY id" + + qt_select "SELECT id, j, jsonb_extract_isnull(j, '\$.a1[0]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_isnull(j, '\$.a1[1]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_isnull(j, '\$.a1[2]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_isnull(j, '\$.a1[3]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_isnull(j, '\$.a1[4]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_extract_isnull(j, '\$.a1[10]') FROM ${testTable} ORDER BY id" + + // jsonb_exists_path + qt_select "SELECT id, j, jsonb_exists_path(j, '\$') FROM ${testTable} ORDER BY id" + + qt_select "SELECT id, j, jsonb_exists_path(j, '\$.k1') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_exists_path(j, '\$.k2') FROM ${testTable} ORDER BY id" + + qt_select "SELECT id, j, jsonb_exists_path(j, '\$[0]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_exists_path(j, '\$[1]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_exists_path(j, '\$[2]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_exists_path(j, '\$[3]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_exists_path(j, '\$[4]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_exists_path(j, '\$[5]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_exists_path(j, '\$[6]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_exists_path(j, '\$[10]') FROM ${testTable} ORDER BY id" + + qt_select "SELECT id, j, jsonb_exists_path(j, '\$.a1') FROM ${testTable} ORDER BY id" + + qt_select "SELECT id, j, jsonb_exists_path(j, '\$.a1[0]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_exists_path(j, '\$.a1[1]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_exists_path(j, '\$.a1[2]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_exists_path(j, '\$.a1[3]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_exists_path(j, '\$.a1[4]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_exists_path(j, '\$.a1[10]') FROM ${testTable} ORDER BY id" + + // jsonb_type + qt_select "SELECT id, j, jsonb_type(j, '\$') FROM ${testTable} ORDER BY id" + + qt_select "SELECT id, j, jsonb_type(j, '\$.k1') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_type(j, '\$.k2') FROM ${testTable} ORDER BY id" + + qt_select "SELECT id, j, jsonb_type(j, '\$[0]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_type(j, '\$[1]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_type(j, '\$[2]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_type(j, '\$[3]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_type(j, '\$[4]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_type(j, '\$[5]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_type(j, '\$[6]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_type(j, '\$[10]') FROM ${testTable} ORDER BY id" + + qt_select "SELECT id, j, jsonb_type(j, '\$.a1') FROM ${testTable} ORDER BY id" + + qt_select "SELECT id, j, jsonb_type(j, '\$.a1[0]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_type(j, '\$.a1[1]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_type(j, '\$.a1[2]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_type(j, '\$.a1[3]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_type(j, '\$.a1[4]') FROM ${testTable} ORDER BY id" + qt_select "SELECT id, j, jsonb_type(j, '\$.a1[10]') FROM ${testTable} ORDER BY id" +}