/** * Copyright (c) 2021 OceanBase * OceanBase CE is licensed under Mulan PubL v2. * You can use this software according to the terms and conditions of the Mulan PubL v2. * You may obtain a copy of Mulan PubL v2 at: * http://license.coscl.org.cn/MulanPubL-2.0 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. * See the Mulan PubL v2 for more details. */ #include "sql/code_generator/ob_column_index_provider.h" #include "sql/resolver/expr/ob_raw_expr.h" namespace oceanbase { using namespace common; namespace sql { int RowDesc::init() { static const int64_t BUCKET_SIZE = 256; return expr_idx_map_.create(BUCKET_SIZE, ObModIds::OB_SQL_CG, ObModIds::OB_SQL_CG); } void RowDesc::reset() { expr_idx_map_.clear(); exprs_.reset(); } int RowDesc::assign(const RowDesc &other) { reset(); return append(other); } int RowDesc::append(const RowDesc &other) { int ret = OB_SUCCESS; int64_t N = other.get_column_num(); ObRawExpr *raw_expr = NULL; for (int64_t i = 0; OB_SUCC(ret) && i < N; ++i) { if (OB_FAIL(other.get_column(i, raw_expr))) { SQL_CG_LOG(WARN, "failed to get column", K(ret), K(i), K(other.get_column_num())); } else if (OB_ISNULL(raw_expr)) { ret = OB_ERR_UNEXPECTED; SQL_CG_LOG(WARN, "invalid argument", K(ret)); } else if (OB_FAIL(add_column(raw_expr))) { SQL_CG_LOG(WARN, "failed to add column", K(ret), K(*raw_expr)); } } // end for return ret; } int RowDesc::add_column(ObRawExpr *raw_expr) { int ret = OB_SUCCESS; if (OB_ISNULL(raw_expr)) { ret = OB_INVALID_ARGUMENT; SQL_CG_LOG(WARN, "invalid argument", K(ret)); } else if (OB_FAIL(exprs_.push_back(raw_expr))) { SQL_CG_LOG(WARN, "failed to add raw_expr", K(ret), K(*raw_expr)); } else { int64_t idx = OB_INVALID_INDEX; ret = expr_idx_map_.get_refactored(reinterpret_cast( static_cast(raw_expr)), idx); if (OB_HASH_EXIST == ret) { ret = OB_SUCCESS; } else if (OB_HASH_NOT_EXIST == ret) { if (OB_FAIL(expr_idx_map_.set_refactored(reinterpret_cast( static_cast(raw_expr)), exprs_.count() - 1))) { SQL_CG_LOG(WARN, "failed to set", K(ret), K(*raw_expr)); } else { ret = OB_SUCCESS; } } else if (OB_FAIL(ret)) { SQL_CG_LOG(WARN, "failed to get hashmap", K(ret)); } } if (OB_SUCC(ret) && !raw_expr->has_flag(IS_COLUMNLIZED) && OB_FAIL(raw_expr->add_flag(IS_COLUMNLIZED))) { SQL_CG_LOG(WARN, "failed to add flag", K(ret)); } return ret; } int RowDesc::replace_column(ObRawExpr *old_expr, ObRawExpr *new_expr) { int ret = OB_SUCCESS; int64_t idx = OB_INVALID_INDEX; if (OB_ISNULL(new_expr)) { ret = OB_INVALID_ARGUMENT; SQL_CG_LOG(WARN, "invalid argument", K(ret)); } else if (OB_FAIL(get_idx(old_expr, idx))) { if (OB_ENTRY_NOT_EXIST == ret) { ret = OB_HASH_NOT_EXIST; } SQL_CG_LOG(WARN, "get expr index failed", K(ret), KPC(old_expr), K_(exprs)); } else if (OB_FAIL(expr_idx_map_.erase_refactored(reinterpret_cast(static_cast(old_expr))))) { SQL_CG_LOG(WARN, "erase old expr failed", K(ret), KPC(old_expr), K(idx)); } else if (OB_FAIL(expr_idx_map_.set_refactored(reinterpret_cast(static_cast(new_expr)), idx))) { SQL_CG_LOG(WARN, "set expr idx failed", K(ret), KPC(new_expr), K(idx)); } else { exprs_.at(idx) = new_expr; } if (OB_SUCC(ret) && !new_expr->has_flag(IS_COLUMNLIZED) && OB_FAIL(new_expr->add_flag(IS_COLUMNLIZED))) { SQL_CG_LOG(WARN, "failed to add flag", K(ret)); } return ret; } int RowDesc::swap_position(const ObRawExpr *expr1, const ObRawExpr *expr2) { int ret = OB_SUCCESS; int64_t idx1 = OB_INVALID_INDEX; int64_t idx2 = OB_INVALID_INDEX; if (OB_ISNULL(expr1) || OB_ISNULL(expr2)) { ret = OB_INVALID_ARGUMENT; SQL_CG_LOG(WARN, "expr is invalid", K(expr1), K(expr2), K(ret)); } else if (OB_FAIL(get_idx(expr1, idx1))) { if (OB_ENTRY_NOT_EXIST == ret) { ret = OB_HASH_NOT_EXIST; } SQL_CG_LOG(WARN, "get expr index failed", K(ret), KPC(expr1), K_(exprs)); } else if (OB_FAIL(get_idx(expr2, idx2))) { if (OB_ENTRY_NOT_EXIST == ret) { ret = OB_HASH_NOT_EXIST; } SQL_CG_LOG(WARN, "get expr index failed", K(ret), KPC(expr2), K_(exprs)); } else if (OB_FAIL(expr_idx_map_.set_refactored(reinterpret_cast( static_cast(expr1)), idx2, 1/*overwrite value*/))) { SQL_CG_LOG(WARN, "overwrite expr1 index failed", K(ret), KPC(expr1), K(idx2)); } else if (OB_FAIL(expr_idx_map_.set_refactored(reinterpret_cast( static_cast(expr2)), idx1, 1/*overwrite value*/))) { SQL_CG_LOG(WARN, "overwrite expr2 index failed", K(ret), KPC(expr2), K(idx1)); } else { exprs_.at(idx1) = const_cast(expr2); exprs_.at(idx2) = const_cast(expr1); } return ret; } int64_t RowDesc::get_column_num() const { return exprs_.count(); } ObRawExpr* RowDesc::get_column(int64_t idx) const { ObRawExpr *ret = NULL; if (0 <= idx && idx < exprs_.count()) { ret = reinterpret_cast(exprs_.at(idx)); } return ret; } int RowDesc::get_column(int64_t idx, ObRawExpr *&raw_expr) const { int ret = OB_SUCCESS; if (0 <= idx && idx < exprs_.count()) { raw_expr = reinterpret_cast(exprs_.at(idx)); } else { ret = OB_ENTRY_NOT_EXIST; } return ret; } int RowDesc::get_idx(const jit::expr::ObIRawExpr *raw_expr, int64_t &idx) const { idx = OB_INVALID_INDEX; int ret = OB_SUCCESS; if (OB_FAIL(expr_idx_map_.get_refactored(reinterpret_cast( static_cast(raw_expr)), idx))) { if (OB_HASH_NOT_EXIST == ret) { ret = OB_ENTRY_NOT_EXIST; } } return ret; } const ObIArray &RowDesc::get_columns() const { return exprs_; } }//end of namespace sql }//end of namespace oceanbase