@@ -727,6 +727,10 @@ void ColumnVariant::try_insert(const Field& field) {
727727 size_t old_size = size ();
728728 const auto & object = field.get <const VariantMap&>();
729729 for (const auto & [key, value] : object) {
730+ if (key.get_path () == " __DORIS_VARIANT_DOC_SNAPSHOT__" ) {
731+ insert_to_doc_snapshot_column (value.field );
732+ continue ;
733+ }
730734 if (!has_subcolumn (key)) {
731735 bool succ = add_sub_column (key, old_size);
732736 if (!succ) {
@@ -757,7 +761,9 @@ void ColumnVariant::try_insert(const Field& field) {
757761 }
758762 }
759763 serialized_sparse_column->insert_default ();
760- serialized_doc_snapshot_column->insert_default ();
764+ if (serialized_doc_snapshot_column->size () == old_size) {
765+ serialized_doc_snapshot_column->insert_default ();
766+ }
761767 ++num_rows;
762768 ENABLE_CHECK_CONSISTENCY (this );
763769}
@@ -930,28 +936,33 @@ void ColumnVariant::get(size_t n, Field& res) const {
930936 .precision = data.second .precision ,
931937 .scale = data.second .scale });
932938 }
933-
934- const auto & [doc_snapshot_path, doc_snapshot_value] = get_doc_snapshot_data_paths_and_values ();
935- const auto & doc_snapshot_column_offsets = serialized_doc_snapshot_column_offsets ();
936- size_t doc_snapshot_offset = doc_snapshot_column_offsets[n - 1 ];
937- size_t doc_snapshot_end = doc_snapshot_column_offsets[n];
938- for (size_t i = doc_snapshot_offset; i != doc_snapshot_end; ++i) {
939- const StringRef path_data = doc_snapshot_path->get_data_at (i);
940- auto data = ColumnVariant::deserialize_from_binary_column (doc_snapshot_value, i);
941- object.try_emplace (PathInData (path_data),
942- FieldWithDataType {.field = std::move (data.first ),
943- .base_scalar_type_id = data.second .scalar_type_id ,
944- .num_dimensions = static_cast <uint8_t >(
945- data.second .num_dimensions ),
946- .precision = data.second .precision ,
947- .scale = data.second .scale });
948- }
949-
939+ try_get_from_doc_snapshot_column (n, res);
950940 if (object.empty ()) {
951941 res = Field ();
952942 }
953943}
954944
945+ bool ColumnVariant::has_doc_snapshot_column (size_t n) const {
946+ const auto & offsets = serialized_doc_snapshot_column_offsets ();
947+ return offsets[n - 1 ] < offsets[n];
948+ }
949+
950+ void ColumnVariant::try_get_from_doc_snapshot_column (size_t n, Field& res) const {
951+ if (!has_doc_snapshot_column (n)) {
952+ return ;
953+ }
954+ FieldWithDataType field_with_data_type;
955+ serialized_doc_snapshot_column->get (n, field_with_data_type.field );
956+ auto & object = res.get <VariantMap&>();
957+ object.try_emplace (PathInData (" __DORIS_VARIANT_DOC_SNAPSHOT__" ),
958+ std::move (field_with_data_type));
959+ }
960+
961+ void ColumnVariant::insert_to_doc_snapshot_column (const Field& field) {
962+ serialized_doc_snapshot_column->insert (field);
963+ CHECK (subcolumns.size () == 1 ) << " subcolumns size should be 1" ;
964+ }
965+
955966void ColumnVariant::add_nested_subcolumn (const PathInData& key, const FieldInfo& field_info,
956967 size_t new_size) {
957968 if (!key.has_nested_part ()) {
0 commit comments