diff --git a/be/src/vec/data_types/convert_field_to_type.cpp b/be/src/vec/data_types/convert_field_to_type.cpp index ecbce03ba6b10a9..b30657070706eee 100644 --- a/be/src/vec/data_types/convert_field_to_type.cpp +++ b/be/src/vec/data_types/convert_field_to_type.cpp @@ -33,6 +33,7 @@ #include "common/exception.h" #include "common/status.h" #include "util/bitmap_value.h" +#include "util/jsonb_document.h" #include "util/jsonb_writer.h" #include "vec/common/field_visitors.h" #include "vec/common/typeid_cast.h" @@ -111,6 +112,14 @@ class FieldVisitorToJsonb : public StaticVisitor { writer->writeString(x); writer->writeEndString(); } + void operator()(const JsonbField& x, JsonbWriter* writer) const { + const JsonbValue* value = JsonbDocument::createValue(x.get_value(), x.get_size()); + if (value == nullptr) { + throw doris::Exception(ErrorCode::INVALID_ARGUMENT, "Failed to create JsonbValue"); + } + writer->writeValue(value); + } + void operator()(const Array& x, JsonbWriter* writer) const; void operator()(const Tuple& x, JsonbWriter* writer) const { @@ -146,9 +155,6 @@ class FieldVisitorToJsonb : public StaticVisitor { void operator()(const Map& x, JsonbWriter* writer) const { throw doris::Exception(doris::ErrorCode::NOT_IMPLEMENTED_ERROR, "Not implemeted"); } - void operator()(const JsonbField& x, JsonbWriter* writer) const { - throw doris::Exception(doris::ErrorCode::NOT_IMPLEMENTED_ERROR, "Not implemeted"); - } }; void FieldVisitorToJsonb::operator()(const Array& x, JsonbWriter* writer) const { diff --git a/be/src/vec/data_types/serde/data_type_object_serde.cpp b/be/src/vec/data_types/serde/data_type_object_serde.cpp index f39c9a8111e05c9..0a3177bc7819b06 100644 --- a/be/src/vec/data_types/serde/data_type_object_serde.cpp +++ b/be/src/vec/data_types/serde/data_type_object_serde.cpp @@ -169,7 +169,9 @@ Status DataTypeObjectSerDe::write_one_cell_to_json( var.assume_mutable()->finalize(); } result.SetObject(); - for (const auto& entry : var.get_subcolumns()) { + // sort to make output stable, todo add a config + auto subcolumns = schema_util::get_sorted_subcolumns(var.get_subcolumns()); + for (const auto& entry : subcolumns) { const auto& subcolumn = entry->data.get_finalized_column(); const auto& subtype_serde = entry->data.get_least_common_type_serde(); const auto& subtype = entry->data.get_least_common_type(); diff --git a/regression-test/data/variant_p0/nested.out b/regression-test/data/variant_p0/nested.out index e43ded4d2fdc96f..8510505e757bc69 100644 --- a/regression-test/data/variant_p0/nested.out +++ b/regression-test/data/variant_p0/nested.out @@ -109,16 +109,16 @@ v.xx tinyint Yes false \N NONE 120 {"nested120":{"nested":[{"yyyxxxx":"11111"},{"ax1111":"1111"},{"axxxb":100,"xxxy111":111},{"aaa":"11","ddsss":1024},{"xx":10}]},"not nested":1024,"not nested2":{"llll":123}} -- !sql -- -201 {"k1":1,"k2":"some","k3":[1234],"k4":1.1,"k5":[[123]],"nested1":{"nested2":[{"c":"1111","b":1.1,"a":10}]}} -202 {"k1":1,"k2":"some","k3":[1234],"k4":1.1,"k5":[[123]],"nested1":{"nested2":[{"c":"1111","b":1.1,"a":10}]}} -203 {"k1":1,"k2":"some","k3":[1234],"k4":1.1,"k5":[[123]],"nested1":{"nested2":[{"c":"1111","b":1.1,"a":10}]}} -204 {"k1":1,"k2":"some","k3":[1234],"k4":1.1,"k5":[[123]],"nested1":{"nested2":[{"c":"1111","b":1.1,"a":10}]}} -205 {"k1":1,"k2":"some","k3":[1234],"k4":1.1,"k5":[[123]],"nested1":{"nested2":[{"c":"1111","b":1.1,"a":10}]}} -206 {"k1":1,"k2":"some","k3":[1234],"k4":1.1,"k5":[[123]],"nested1":{"nested2":[{"c":"1111","b":1.1,"a":10}]}} -207 {"k1":1,"k2":"some","k3":[1234],"k4":1.1,"k5":[[123]],"nested1":{"nested2":[{"c":"1111","b":1.1,"a":10}]}} -208 {"k1":1,"k2":"some","k3":[1234],"k4":1.1,"k5":[[123]],"nested1":{"nested2":[{"c":"1111","b":1.1,"a":10}]}} -209 {"k1":1,"k2":"some","k3":[1234],"k4":1.1,"k5":[[123]],"nested1":{"nested2":[{"c":"1111","b":1.1,"a":10}]}} -210 {"k1":1,"k2":"some","k3":[1234],"k4":1.1,"k5":[[123]],"nested1":{"nested2":[{"c":"1111","b":1.1,"a":10}]}} +201 {"k1":1,"k2":"some","k3":[1234],"k4":1.1,"k5":[[123]],"nested1":{"nested2":[{"a":10,"b":1.1,"c":"1111"}]}} +202 {"k1":1,"k2":"some","k3":[1234],"k4":1.1,"k5":[[123]],"nested1":{"nested2":[{"a":10,"b":1.1,"c":"1111"}]}} +203 {"k1":1,"k2":"some","k3":[1234],"k4":1.1,"k5":[[123]],"nested1":{"nested2":[{"a":10,"b":1.1,"c":"1111"}]}} +204 {"k1":1,"k2":"some","k3":[1234],"k4":1.1,"k5":[[123]],"nested1":{"nested2":[{"a":10,"b":1.1,"c":"1111"}]}} +205 {"k1":1,"k2":"some","k3":[1234],"k4":1.1,"k5":[[123]],"nested1":{"nested2":[{"a":10,"b":1.1,"c":"1111"}]}} +206 {"k1":1,"k2":"some","k3":[1234],"k4":1.1,"k5":[[123]],"nested1":{"nested2":[{"a":10,"b":1.1,"c":"1111"}]}} +207 {"k1":1,"k2":"some","k3":[1234],"k4":1.1,"k5":[[123]],"nested1":{"nested2":[{"a":10,"b":1.1,"c":"1111"}]}} +208 {"k1":1,"k2":"some","k3":[1234],"k4":1.1,"k5":[[123]],"nested1":{"nested2":[{"a":10,"b":1.1,"c":"1111"}]}} +209 {"k1":1,"k2":"some","k3":[1234],"k4":1.1,"k5":[[123]],"nested1":{"nested2":[{"a":10,"b":1.1,"c":"1111"}]}} +210 {"k1":1,"k2":"some","k3":[1234],"k4":1.1,"k5":[[123]],"nested1":{"nested2":[{"a":10,"b":1.1,"c":"1111"}]}} -- !sql -- 201 {"k1":1,"k2":"some","k3":[1234],"k4":1.1,"k5":[[123]],"nested1":{"nested2":[{"a":10,"b":1.1,"c":"1111"}]}} diff --git a/regression-test/suites/variant_p0/desc.groovy b/regression-test/suites/variant_p0/desc.groovy index 5efcda3a04308e2..fadf7aad65da050 100644 --- a/regression-test/suites/variant_p0/desc.groovy +++ b/regression-test/suites/variant_p0/desc.groovy @@ -94,6 +94,7 @@ suite("regression_test_variant_desc", "nonConcurrent"){ } try { + sql "set use_variant_as_complex_variant = false" // sparse columns def table_name = "sparse_columns" create_table table_name diff --git a/regression-test/suites/variant_p0/nested.groovy b/regression-test/suites/variant_p0/nested.groovy index a2a3355854f7c6c..7553cae38c878b9 100644 --- a/regression-test/suites/variant_p0/nested.groovy +++ b/regression-test/suites/variant_p0/nested.groovy @@ -21,7 +21,7 @@ suite("regression_test_variant_nested", "p0"){ getBackendIpHttpPort(backendId_to_backendIP, backendId_to_backendHttpPort); try { - + sql "set use_variant_as_complex_variant = false" def table_name = "var_nested" sql "DROP TABLE IF EXISTS ${table_name}" diff --git a/regression-test/suites/variant_p0/test_sub_path_pruning.groovy b/regression-test/suites/variant_p0/test_sub_path_pruning.groovy index f09f4713ad29e52..19beb1f82a152b9 100644 --- a/regression-test/suites/variant_p0/test_sub_path_pruning.groovy +++ b/regression-test/suites/variant_p0/test_sub_path_pruning.groovy @@ -34,6 +34,7 @@ suite("variant_sub_path_pruning", "variant_type"){ """ sql "sync" + sql "set use_variant_as_complex_variant = false" // project