// 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/exprs/vmap_literal.h" #include #include #include #include #include "runtime/types.h" #include "vec/columns/column.h" #include "vec/core/field.h" #include "vec/data_types/data_type.h" #include "vec/exprs/vexpr.h" namespace doris { class RowDescriptor; class RuntimeState; namespace vectorized { class VExprContext; } // namespace vectorized } // namespace doris //insert into table_map values ({'name':'zhangsan', 'gender':'male'}), ({'name':'lisi', 'gender':'female'}); namespace doris::vectorized { Status VMapLiteral::prepare(RuntimeState* state, const RowDescriptor& row_desc, VExprContext* context) { DCHECK_EQ(type().children.size(), 2) << "map children type not 2"; RETURN_IF_ERROR_OR_PREPARED(VExpr::prepare(state, row_desc, context)); // map-field should contain two vector field for keys and values Field map = Map(); Field keys = Array(); Field values = Array(); // each child is slot with key1, value1, key2, value2... for (int idx = 0; idx < _children.size() && idx + 1 < _children.size(); idx += 2) { Field kf, vf; auto key_literal = std::dynamic_pointer_cast(_children[idx]); key_literal->get_column_ptr()->get(0, kf); auto val_literal = std::dynamic_pointer_cast( VExpr::expr_without_cast(_children[idx + 1])); val_literal->get_column_ptr()->get(0, vf); keys.get().push_back(kf); values.get().push_back(vf); } map.get().push_back(keys); map.get().push_back(values); _column_ptr = _data_type->create_column_const(1, map); return Status::OK(); } } // namespace doris::vectorized