|
42 | 42 | #include "common/compiler_util.h" // IWYU pragma: keep
|
43 | 43 | #include "common/status.h"
|
44 | 44 | #include "exprs/json_functions.h"
|
| 45 | +#include "util/simd/bits.h" |
45 | 46 | #include "vec/io/io_helper.h"
|
46 | 47 | #ifdef __AVX2__
|
47 | 48 | #include "util/jsonb_parser_simd.h"
|
@@ -619,6 +620,7 @@ struct ExecuteReducer {
|
619 | 620 | struct FunctionJsonArrayImpl {
|
620 | 621 | static constexpr auto name = "json_array";
|
621 | 622 |
|
| 623 | + static constexpr auto must_not_null = false; |
622 | 624 | template <int flag>
|
623 | 625 | using Reducer = ExecuteReducer<flag, FunctionJsonArrayImpl>;
|
624 | 626 |
|
@@ -654,7 +656,7 @@ struct FunctionJsonArrayImpl {
|
654 | 656 |
|
655 | 657 | struct FunctionJsonObjectImpl {
|
656 | 658 | static constexpr auto name = "json_object";
|
657 |
| - |
| 659 | + static constexpr auto must_not_null = true; |
658 | 660 | template <int flag>
|
659 | 661 | using Reducer = ExecuteReducer<flag, FunctionJsonObjectImpl>;
|
660 | 662 |
|
@@ -743,6 +745,9 @@ class FunctionJsonAlwaysNotNullable : public IFunction {
|
743 | 745 | data_columns.push_back(assert_cast<const ColumnString*>(column_ptrs.back().get()));
|
744 | 746 | }
|
745 | 747 | }
|
| 748 | + if (SpecificImpl::must_not_null) { |
| 749 | + RETURN_IF_ERROR(check_keys_all_not_null(nullmaps, input_rows_count, arguments.size())); |
| 750 | + } |
746 | 751 | execute(data_columns, *assert_cast<ColumnString*>(result_column.get()), input_rows_count,
|
747 | 752 | nullmaps);
|
748 | 753 | block.get_by_position(result).column = std::move(result_column);
|
@@ -774,6 +779,24 @@ class FunctionJsonAlwaysNotNullable : public IFunction {
|
774 | 779 | result_column.insert_data(buf.GetString(), buf.GetSize());
|
775 | 780 | }
|
776 | 781 | }
|
| 782 | + |
| 783 | + static Status check_keys_all_not_null(const std::vector<const ColumnUInt8*>& nullmaps, int size, |
| 784 | + size_t args) { |
| 785 | + for (int i = 0; i < args; i += 2) { |
| 786 | + const auto* null_map = nullmaps[i]; |
| 787 | + if (null_map) { |
| 788 | + const bool not_null_num = |
| 789 | + simd::count_zero_num((int8_t*)null_map->get_data().data(), size); |
| 790 | + if (not_null_num < size) { |
| 791 | + return Status::InternalError( |
| 792 | + "function {} can not input null value , JSON documents may not contain " |
| 793 | + "NULL member names.", |
| 794 | + name); |
| 795 | + } |
| 796 | + } |
| 797 | + } |
| 798 | + return Status::OK(); |
| 799 | + } |
777 | 800 | };
|
778 | 801 |
|
779 | 802 | struct FunctionJsonQuoteImpl {
|
|
0 commit comments