814 lines
30 KiB
C++
814 lines
30 KiB
C++
/**
|
|
* 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.
|
|
*/
|
|
|
|
#define USING_LOG_PREFIX PL
|
|
|
|
#include "ob_pl_adt_service.h"
|
|
#include "common/ob_field.h"
|
|
#include "ob_pl_type.h"
|
|
#include "sql/resolver/expr/ob_raw_expr.h"
|
|
#include "lib/container/ob_2d_array.h"
|
|
#include "lib/utility/ob_template_utils.h"
|
|
|
|
namespace oceanbase
|
|
{
|
|
using namespace common;
|
|
using namespace jit;
|
|
namespace pl
|
|
{
|
|
|
|
int ObPLADTService::init(const int64_t arg_count, const int64_t param_count)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
arg_count_ = arg_count;
|
|
param_count_ = param_count;
|
|
return ret;
|
|
}
|
|
|
|
int ObPLADTService::get_objmeta(ObLLVMType &type)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
if (NULL == obj_meta_.get_v()) {
|
|
ObLLVMType struct_type;
|
|
ObSEArray<ObLLVMType, 4> obj_meta;
|
|
ObLLVMType int8_type;
|
|
if (OB_FAIL(helper_.get_llvm_type(ObTinyIntType, int8_type))) {
|
|
LOG_WARN("failed to get_llvm_type", K(ret));
|
|
} else {
|
|
/*
|
|
uint8_t type_;
|
|
uint8_t cs_level_; // collation level
|
|
uint8_t cs_type_; // collation type
|
|
int8_t scale_; // scale, 当type_ 为ObBitType时,该字段存储bit的length
|
|
*/
|
|
if (OB_FAIL(obj_meta.push_back(int8_type))) {
|
|
LOG_WARN("push_back error", K(ret));
|
|
} else if (OB_FAIL(obj_meta.push_back(int8_type))) {
|
|
LOG_WARN("push_back error", K(ret));
|
|
} else if (OB_FAIL(obj_meta.push_back(int8_type))) {
|
|
LOG_WARN("push_back error", K(ret));
|
|
} else if (OB_FAIL(obj_meta.push_back(int8_type))) {
|
|
LOG_WARN("push_back error", K(ret));
|
|
} else if (OB_FAIL(helper_.create_struct_type(ObString("obj_meta"), obj_meta, struct_type))) {
|
|
LOG_WARN("failed to create struct type", K(ret));
|
|
} else {
|
|
obj_meta_.set_v(struct_type.get_v());
|
|
}
|
|
}
|
|
}
|
|
if (OB_SUCC(ret)) {
|
|
type = obj_meta_;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
int ObPLADTService::get_datum(ObLLVMType &type)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
if (NULL == datum_.get_v()) {
|
|
ObLLVMType struct_type;
|
|
ObSEArray<ObLLVMType, 2> datum;
|
|
ObLLVMType int32_type;
|
|
ObLLVMType int64_type;
|
|
if (OB_FAIL(helper_.get_llvm_type(ObInt32Type, int32_type))) {
|
|
LOG_WARN("failed to get_llvm_type", K(ret));
|
|
} else if (OB_FAIL(helper_.get_llvm_type(ObIntType, int64_type))) {
|
|
LOG_WARN("failed to get_llvm_type", K(ret));
|
|
} else {
|
|
/*
|
|
union
|
|
{
|
|
int32_t val_len_;
|
|
number::ObNumber::Desc nmb_desc_;
|
|
}; // sizeof = 4
|
|
ObObjValue v_; // sizeof = 8
|
|
*/
|
|
if (OB_FAIL(datum.push_back(int32_type))) {
|
|
LOG_WARN("push_back error", K(ret));
|
|
} else if (OB_FAIL(datum.push_back(int64_type))) {
|
|
LOG_WARN("push_back error", K(ret));
|
|
} else if (OB_FAIL(helper_.create_struct_type(ObString("datum"), datum, struct_type))) {
|
|
LOG_WARN("failed to create struct type", K(ret));
|
|
} else {
|
|
datum_.set_v(struct_type.get_v());
|
|
}
|
|
}
|
|
}
|
|
if (OB_SUCC(ret)) {
|
|
type = datum_;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
int ObPLADTService::get_obj(ObLLVMType &type)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
if (NULL == obj_.get_v()) {
|
|
ObLLVMType struct_type;
|
|
ObSEArray<ObLLVMType, 3> obj;
|
|
ObLLVMType objmeta;
|
|
ObLLVMType int32_type;
|
|
ObLLVMType int64_type;
|
|
if (OB_FAIL(helper_.get_llvm_type(ObInt32Type, int32_type))) {
|
|
LOG_WARN("failed to get_llvm_type", K(ret));
|
|
} else if (OB_FAIL(helper_.get_llvm_type(ObIntType, int64_type))) {
|
|
LOG_WARN("failed to get_llvm_type", K(ret));
|
|
} else if (OB_FAIL(get_objmeta(objmeta))) {
|
|
LOG_WARN("push_back error", K(ret));
|
|
} else {
|
|
/*
|
|
ObObjMeta meta_; // sizeof = 4
|
|
union
|
|
{
|
|
int32_t val_len_;
|
|
number::ObNumber::Desc nmb_desc_;
|
|
}; // sizeof = 4
|
|
ObObjValue v_; // sizeof = 8
|
|
*/
|
|
if (OB_FAIL(obj.push_back(objmeta))) {
|
|
LOG_WARN("push_back error", K(ret));
|
|
} else if (OB_FAIL(obj.push_back(int32_type))) {
|
|
LOG_WARN("push_back error", K(ret));
|
|
} else if (OB_FAIL(obj.push_back(int64_type))) {
|
|
LOG_WARN("push_back error", K(ret));
|
|
} else if (OB_FAIL(helper_.create_struct_type(ObString("obj"), obj, struct_type))) {
|
|
LOG_WARN("failed to create struct type", K(ret));
|
|
} else {
|
|
obj_.set_v(struct_type.get_v());
|
|
}
|
|
}
|
|
}
|
|
if (OB_SUCC(ret)) {
|
|
type = obj_;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
int ObPLADTService::get_objparam(ObLLVMType &type)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
if (NULL == obj_param_.get_v()) {
|
|
ObLLVMType struct_type;
|
|
ObSEArray<ObLLVMType, 4> obj_param;
|
|
ObLLVMType obj_type;
|
|
ObLLVMType obj_meta_type;
|
|
ObLLVMType int8_type;
|
|
ObLLVMType int32_type;
|
|
ObLLVMType int64_type;
|
|
if (OB_FAIL(helper_.get_llvm_type(ObTinyIntType, int8_type))) {
|
|
LOG_WARN("failed to get_llvm_type", K(ret));
|
|
} else if (OB_FAIL(helper_.get_llvm_type(ObInt32Type, int32_type))) {
|
|
LOG_WARN("failed to get_llvm_type", K(ret));
|
|
} else if (OB_FAIL(helper_.get_llvm_type(ObIntType, int64_type))) {
|
|
LOG_WARN("failed to get_llvm_type", K(ret));
|
|
} else if (OB_FAIL(get_obj(obj_type))) {
|
|
LOG_WARN("push_back error", K(ret));
|
|
} else if (OB_FAIL(get_objmeta(obj_meta_type))) {
|
|
LOG_WARN("failed to get_llvm_type", K(ret));
|
|
} else {
|
|
ObLLVMType param_flag_type;
|
|
ObSEArray<ObLLVMType, 2> param_flag;
|
|
/*
|
|
union
|
|
{
|
|
uint8_t flag_;
|
|
struct {
|
|
uint8_t need_to_check_type_: 1; //TRUE if the type need to be checked by plan cache, FALSE otherwise
|
|
uint8_t need_to_check_bool_value_ : 1;//TRUE if the bool value need to be checked by plan cache, FALSE otherwise
|
|
uint8_t expected_bool_value_ : 1;//bool value, effective only when need_to_check_bool_value_ is true
|
|
uint8_t reserved_ : 5;
|
|
};
|
|
};
|
|
*/
|
|
if (OB_FAIL(param_flag.push_back(int64_type))) { //VTable
|
|
LOG_WARN("push_back error", K(ret));
|
|
} else if (OB_FAIL(param_flag.push_back(int8_type))) {
|
|
LOG_WARN("push_back error", K(ret));
|
|
} else if (OB_FAIL(helper_.create_struct_type(ObString("obj"), param_flag, param_flag_type))) {
|
|
LOG_WARN("failed to create struct type", K(ret));
|
|
} else { /*do nothing*/ }
|
|
|
|
if (OB_SUCC(ret)) {
|
|
/*
|
|
ObAccuracy accuracy_;
|
|
uint32_t res_flags_; // BINARY, NUM, NOT_NULL, TIMESTAMP, etc
|
|
// reference: src/lib/regex/include/mysql_com.h
|
|
ParamFlag flag_;
|
|
*/
|
|
if (OB_FAIL(obj_param.push_back(obj_type))) {
|
|
LOG_WARN("push_back error", K(ret));
|
|
} else if (OB_FAIL(obj_param.push_back(int64_type))) { //ObAccuracy
|
|
LOG_WARN("push_back error", K(ret));
|
|
} else if (OB_FAIL(obj_param.push_back(int32_type))) {
|
|
LOG_WARN("push_back error", K(ret));
|
|
} else if (OB_FAIL(obj_param.push_back(param_flag_type))) {
|
|
LOG_WARN("push_back error", K(ret));
|
|
} else if (OB_FAIL(obj_param.push_back(int32_type))) { // raw_text_pos_
|
|
LOG_WARN("push_back error", K(ret));
|
|
} else if (OB_FAIL(obj_param.push_back(int32_type))) { // raw_text_len_
|
|
LOG_WARN("push_back error", K(ret));
|
|
} else if (OB_FAIL(obj_param.push_back(obj_meta_type))) { //param_meta_
|
|
LOG_WARN("push_back error", K(ret));
|
|
} else if (OB_FAIL(helper_.create_struct_type(ObString("objparam"), obj_param, struct_type))) {
|
|
LOG_WARN("failed to create struct type", K(ret));
|
|
} else {
|
|
obj_param_.set_v(struct_type.get_v());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (OB_SUCC(ret)) {
|
|
type = obj_param_;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
int ObPLADTService::get_param_store(ObLLVMType &type)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
if (NULL == seg_param_store_.get_v()) {
|
|
ObLLVMType struct_type;
|
|
ObLLVMType block_alloc;
|
|
ObLLVMType blocks;
|
|
ObLLVMType int8_type;
|
|
ObLLVMType int32_type;
|
|
ObLLVMType int64_type;
|
|
if (OB_FAIL(helper_.get_llvm_type(ObIntType, int64_type))) {
|
|
LOG_WARN("failed to get_llvm_type", K(ret));
|
|
} else if (OB_FAIL(helper_.get_llvm_type(ObInt32Type, int32_type))) {
|
|
LOG_WARN("failed to get_llvm_type", K(ret));
|
|
} else if (OB_FAIL(helper_.get_llvm_type(ObTinyIntType, int8_type))) {
|
|
LOG_WARN("failed to get_llvm_type", K(ret));
|
|
} else if (OB_FAIL(get_seg_pointer_array(blocks))) {
|
|
LOG_WARN("failed to get_seg_pointer_array", K(ret));
|
|
} else if (OB_FAIL(get_wrapper_allocator(block_alloc))) {
|
|
LOG_WARN("failed to get_wrapper_allocator", K(ret));
|
|
} else {
|
|
/*
|
|
int32_t magic_;
|
|
ObWrapperAllocator block_alloc_
|
|
ObSEArray<char *, 64, ObWrapperAllocator, false> blocks_;
|
|
int64_t count_;
|
|
int64_t capacity_;
|
|
*/
|
|
ObSEArray<ObLLVMType, 32> seg_param_store;
|
|
if (OB_FAIL(seg_param_store.push_back(int64_type))) { // vtable
|
|
LOG_WARN("failed to push back element", K(ret));
|
|
} else if (OB_FAIL(seg_param_store.push_back(int32_type))) {
|
|
LOG_WARN("failed to push back element", K(ret));
|
|
} else if (OB_FAIL(seg_param_store.push_back(block_alloc))) {
|
|
LOG_WARN("failed to push back element", K(ret));
|
|
} else if (OB_FAIL(seg_param_store.push_back(blocks))) {
|
|
LOG_WARN("failed to push back element", K(ret));
|
|
} else if (OB_FAIL(seg_param_store.push_back(int64_type))) {
|
|
LOG_WARN("failed to push back element", K(ret));
|
|
} else if (OB_FAIL(seg_param_store.push_back(int64_type))) {
|
|
LOG_WARN("failed to push back element", K(ret));
|
|
} else if (OB_FAIL(helper_.create_struct_type(ObString("seg_param_store"),
|
|
seg_param_store, struct_type))) {
|
|
LOG_WARN("failed to create struct type", K(ret));
|
|
} else {
|
|
seg_param_store_.set_v(struct_type.get_v());
|
|
}
|
|
}
|
|
}
|
|
if (OB_SUCC(ret)) {
|
|
type = seg_param_store_;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
int ObPLADTService::get_data_type(ObLLVMType &type)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
if (NULL == data_type_.get_v()) {
|
|
ObLLVMType struct_type;
|
|
ObSEArray<ObLLVMType, 4> data_type;
|
|
ObLLVMType obj_meta_type;
|
|
ObLLVMType int8_type;
|
|
ObLLVMType int32_type;
|
|
ObLLVMType int64_type;
|
|
if (OB_FAIL(helper_.get_llvm_type(ObTinyIntType, int8_type))) {
|
|
LOG_WARN("failed to get_llvm_type", K(ret));
|
|
} else if (OB_FAIL(helper_.get_llvm_type(ObInt32Type, int32_type))) {
|
|
LOG_WARN("failed to get_llvm_type", K(ret));
|
|
} else if (OB_FAIL(helper_.get_llvm_type(ObIntType, int64_type))) {
|
|
LOG_WARN("failed to get_llvm_type", K(ret));
|
|
} else if (OB_FAIL(get_objmeta(obj_meta_type))) {
|
|
LOG_WARN("push_back error", K(ret));
|
|
} else {
|
|
/*
|
|
ObObjMeta meta_;
|
|
ObAccuracy accuracy_;
|
|
ObCharsetType charset_;
|
|
bool is_binary_collation_
|
|
bool is_zero_fill_;
|
|
*/
|
|
if (OB_FAIL(data_type.push_back(obj_meta_type))) {
|
|
LOG_WARN("push_back error", K(ret));
|
|
} else if (OB_FAIL(data_type.push_back(int64_type))) {
|
|
LOG_WARN("push_back error", K(ret));
|
|
} else if (OB_FAIL(data_type.push_back(int32_type))) {
|
|
LOG_WARN("push_back error", K(ret));
|
|
} else if (OB_FAIL(data_type.push_back(int8_type))) {
|
|
LOG_WARN("push_back error", K(ret));
|
|
} else if (OB_FAIL(data_type.push_back(int8_type))) {
|
|
LOG_WARN("push_back error", K(ret));
|
|
} else if (OB_FAIL(helper_.create_struct_type(ObString("data_type"),
|
|
data_type,
|
|
struct_type))) {
|
|
LOG_WARN("failed to create struct type", K(ret));
|
|
} else {
|
|
data_type_.set_v(struct_type.get_v());
|
|
}
|
|
}
|
|
}
|
|
if (OB_SUCC(ret)) {
|
|
type = data_type_;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
int ObPLADTService::get_elem_desc(ObLLVMType &type)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
if (NULL == elem_desc_.get_v()) {
|
|
ObLLVMType struct_type;
|
|
ObSEArray<ObLLVMType, 4> elem_desc;
|
|
ObLLVMType obj_meta_type;
|
|
ObLLVMType int8_type;
|
|
ObLLVMType int32_type;
|
|
ObLLVMType int64_type;
|
|
if (OB_FAIL(helper_.get_llvm_type(ObTinyIntType, int8_type))) {
|
|
LOG_WARN("failed to get_llvm_type", K(ret));
|
|
} else if (OB_FAIL(helper_.get_llvm_type(ObInt32Type, int32_type))) {
|
|
LOG_WARN("failed to get_llvm_type", K(ret));
|
|
} else if (OB_FAIL(helper_.get_llvm_type(ObIntType, int64_type))) {
|
|
LOG_WARN("failed to get_llvm_type", K(ret));
|
|
} else if (OB_FAIL(get_objmeta(obj_meta_type))) {
|
|
LOG_WARN("push_back error", K(ret));
|
|
} else {
|
|
/*
|
|
ObObjMeta meta_;
|
|
ObAccuracy accuracy_;
|
|
ObCharsetType charset_;
|
|
bool is_binary_collation_
|
|
bool is_zero_fill_;
|
|
ObPLType type_;
|
|
bool not_null_;
|
|
int32_t field_cnt_;
|
|
*/
|
|
if (OB_FAIL(elem_desc.push_back(obj_meta_type))) {
|
|
LOG_WARN("push_back error", K(ret));
|
|
} else if (OB_FAIL(elem_desc.push_back(int64_type))) {
|
|
LOG_WARN("push_back error", K(ret));
|
|
} else if (OB_FAIL(elem_desc.push_back(int32_type))) {
|
|
LOG_WARN("push_back error", K(ret));
|
|
} else if (OB_FAIL(elem_desc.push_back(int8_type))) {
|
|
LOG_WARN("push_back error", K(ret));
|
|
} else if (OB_FAIL(elem_desc.push_back(int8_type))) {
|
|
LOG_WARN("push_back error", K(ret));
|
|
} else if (OB_FAIL(elem_desc.push_back(int32_type))) {
|
|
LOG_WARN("push_back error", K(ret));
|
|
} else if (OB_FAIL(elem_desc.push_back(int8_type))) {
|
|
LOG_WARN("push_back error", K(ret));
|
|
} else if (OB_FAIL(elem_desc.push_back(int32_type))) {
|
|
LOG_WARN("push_back error", K(ret));
|
|
} else if (OB_FAIL(helper_.create_struct_type(ObString("elem_desc"),
|
|
elem_desc,
|
|
struct_type))) {
|
|
LOG_WARN("failed to create struct type", K(ret));
|
|
} else {
|
|
elem_desc_.set_v(struct_type.get_v());
|
|
}
|
|
}
|
|
}
|
|
if (OB_SUCC(ret)) {
|
|
type = elem_desc_;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
int ObPLADTService::get_pl_exec_context(ObLLVMType &type)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
if (NULL == pl_exec_context_.get_v()) {
|
|
ObLLVMType struct_type;
|
|
ObSEArray<ObLLVMType, 5> pl_exec_context;
|
|
ObLLVMType seg_param_store;
|
|
ObLLVMType seg_param_store_pointer;
|
|
ObLLVMType obj;
|
|
ObLLVMType obj_pointer;
|
|
ObLLVMType int8_type;
|
|
ObLLVMType int32_type;
|
|
ObLLVMType int32_pointer_type;
|
|
ObLLVMType int64_type;
|
|
if (OB_FAIL(helper_.get_llvm_type(ObTinyIntType, int8_type))) {
|
|
LOG_WARN("failed to get_llvm_type", K(ret));
|
|
} else if (OB_FAIL(helper_.get_llvm_type(ObInt32Type, int32_type))) {
|
|
LOG_WARN("failed to get_llvm_type", K(ret));
|
|
} else if (OB_FAIL(int32_type.get_pointer_to(int32_pointer_type))) {
|
|
LOG_WARN("failed to get_pointer_to", K(ret));
|
|
} else if (OB_FAIL(helper_.get_llvm_type(ObIntType, int64_type))) {
|
|
LOG_WARN("failed to get_llvm_type", K(ret));
|
|
} else if (OB_FAIL(get_param_store(seg_param_store))) {
|
|
LOG_WARN("push_back error", K(ret));
|
|
} else if (OB_FAIL(seg_param_store.get_pointer_to(seg_param_store_pointer))) {
|
|
LOG_WARN("failed to get pointer to", K(ret));
|
|
} else if (OB_FAIL(get_obj(obj))) {
|
|
LOG_WARN("push_back error", K(ret));
|
|
} else if (OB_FAIL(obj.get_pointer_to(obj_pointer))) {
|
|
LOG_WARN("failed to get pointer to", K(ret));
|
|
} else {
|
|
/*
|
|
common::ObIAllocator *allocator_;
|
|
sql::ObExecContext *exec_ctx_;
|
|
common::Ob2DArray<common::ObObjParam, ObWrapperAllocator, false> *params_;
|
|
common::ObObj *result_;
|
|
int *status_;
|
|
ObPLException *pre_reserved_e_;
|
|
ObPLFunction *func_;
|
|
bool in_function_;
|
|
*/
|
|
if (OB_FAIL(pl_exec_context.push_back(int64_type))) { //VTable
|
|
LOG_WARN("push_back error", K(ret));
|
|
} else if (OB_FAIL(pl_exec_context.push_back(int64_type))) {
|
|
LOG_WARN("push_back error", K(ret));
|
|
} else if (OB_FAIL(pl_exec_context.push_back(int64_type))) {
|
|
LOG_WARN("push_back error", K(ret));
|
|
} else if (OB_FAIL(pl_exec_context.push_back(seg_param_store_pointer))) {
|
|
LOG_WARN("push_back error", K(ret));
|
|
} else if (OB_FAIL(pl_exec_context.push_back(obj_pointer))) {
|
|
LOG_WARN("push_back error", K(ret));
|
|
} else if (OB_FAIL(pl_exec_context.push_back(int32_pointer_type))) {
|
|
LOG_WARN("push_back error", K(ret));
|
|
} else if (OB_FAIL(pl_exec_context.push_back(int64_type))) {
|
|
LOG_WARN("push_back error", K(ret));
|
|
} else if (OB_FAIL(pl_exec_context.push_back(int8_type))) {
|
|
LOG_WARN("push_back error", K(ret));
|
|
} else if (OB_FAIL(pl_exec_context.push_back(int64_type))) { // plcontext
|
|
LOG_WARN("push_back error", K(ret));
|
|
} else if (OB_FAIL(helper_.create_struct_type(ObString("pl_exec_context"), pl_exec_context, struct_type))) {
|
|
LOG_WARN("failed to create struct type", K(ret));
|
|
} else {
|
|
pl_exec_context_.set_v(struct_type.get_v());
|
|
}
|
|
}
|
|
}
|
|
if (OB_SUCC(ret)) {
|
|
type = pl_exec_context_;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
|
|
int ObPLADTService::get_argv(ObLLVMType &type)
|
|
{
|
|
return get_argv(arg_count_, type);
|
|
}
|
|
|
|
int ObPLADTService::get_argv(int64_t argc, ObLLVMType &type)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
ObLLVMType array_type;
|
|
ObLLVMType int64_type;
|
|
if (OB_FAIL(helper_.get_llvm_type(ObIntType, int64_type))) {
|
|
LOG_WARN("failed to get_llvm_type", K(ret));
|
|
} else if (OB_FAIL(ObLLVMArrayType::get(int64_type, argc, array_type))) {
|
|
LOG_WARN("failed to get array type", K(ret));
|
|
} else {
|
|
type.set_v(array_type.get_v());
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
int ObPLADTService::get_pl_condition_value(ObLLVMType &type)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
if (NULL == pl_condition_value_.get_v()) {
|
|
ObLLVMType struct_type;
|
|
ObSEArray<ObLLVMType, 6> pl_condition_value;
|
|
ObLLVMType int8_type;
|
|
ObLLVMType int64_type;
|
|
ObLLVMType char_type;
|
|
if (OB_FAIL(helper_.get_llvm_type(ObTinyIntType, int8_type))) {
|
|
LOG_WARN("failed to get_llvm_type", K(ret));
|
|
} else if (OB_FAIL(helper_.get_llvm_type(ObIntType, int64_type))) {
|
|
LOG_WARN("failed to get_llvm_type", K(ret));
|
|
} else if (OB_FAIL(helper_.get_llvm_type(ObCharType, char_type))) {
|
|
LOG_WARN("failed to get_llvm_type", K(ret));
|
|
} else {
|
|
/*
|
|
ObPLConditionType type_;
|
|
int64_t error_code_;
|
|
const char *sql_state_;
|
|
int64_t str_len_;
|
|
int64_t stmt_id_;
|
|
bool signal_;
|
|
*/
|
|
if (OB_FAIL(pl_condition_value.push_back(int64_type))) {
|
|
LOG_WARN("push_back error", K(ret));
|
|
} else if (OB_FAIL(pl_condition_value.push_back(int64_type))) {
|
|
LOG_WARN("push_back error", K(ret));
|
|
} else if (OB_FAIL(pl_condition_value.push_back(char_type))) {
|
|
LOG_WARN("push_back error", K(ret));
|
|
} else if (OB_FAIL(pl_condition_value.push_back(int64_type))) {
|
|
LOG_WARN("push_back error", K(ret));
|
|
} else if (OB_FAIL(pl_condition_value.push_back(int64_type))) {
|
|
LOG_WARN("push_back error", K(ret));
|
|
} else if (OB_FAIL(pl_condition_value.push_back(int8_type))) {
|
|
LOG_WARN("push_back error", K(ret));
|
|
} else if (OB_FAIL(helper_.create_struct_type(ObString("pl_condition_value"), pl_condition_value, struct_type))) {
|
|
LOG_WARN("failed to create struct type", K(ret));
|
|
} else {
|
|
pl_condition_value_.set_v(struct_type.get_v());
|
|
}
|
|
}
|
|
}
|
|
if (OB_SUCC(ret)) {
|
|
type = pl_condition_value_;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
int ObPLADTService::get_unwind_exception(ObLLVMType &type)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
if (NULL == unwind_exception_.get_v()) {
|
|
ObLLVMType struct_type;
|
|
ObSEArray<ObLLVMType, 1> pl_unwind_exception;
|
|
/*
|
|
_Unwind_Exception_Class exception_class;
|
|
_Unwind_Exception_Cleanup_Fn exception_cleanup;
|
|
_Unwind_Word private_1;
|
|
_Unwind_Word private_2;
|
|
*/
|
|
//只映射第一项exception_class
|
|
ObLLVMType int64_type;
|
|
if (OB_FAIL(helper_.get_llvm_type(ObIntType, int64_type))) {
|
|
LOG_WARN("failed to get_llvm_type", K(ret));
|
|
} else if (OB_FAIL(pl_unwind_exception.push_back(int64_type))) {
|
|
LOG_WARN("push_back error", K(ret));
|
|
} else if (OB_FAIL(helper_.create_struct_type(ObString("unwind_exception"), pl_unwind_exception, struct_type))) {
|
|
LOG_WARN("failed to create struct type", K(ret));
|
|
} else {
|
|
unwind_exception_.set_v(struct_type.get_v());
|
|
}
|
|
}
|
|
if (OB_SUCC(ret)) {
|
|
type = unwind_exception_;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
int ObPLADTService::get_pl_exception(ObLLVMType &type)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
if (NULL == pl_exception_.get_v()) {
|
|
ObLLVMType struct_type;
|
|
ObSEArray<ObLLVMType, 2> pl_exception;
|
|
ObLLVMType condition_value;
|
|
ObLLVMType unwind_exception;
|
|
if (OB_FAIL(get_pl_condition_value(condition_value))) {
|
|
LOG_WARN("push_back error", K(ret));
|
|
} else if (OB_FAIL(get_unwind_exception(unwind_exception))) {
|
|
LOG_WARN("push_back error", K(ret));
|
|
} else if (OB_FAIL(pl_exception.push_back(condition_value))) {
|
|
LOG_WARN("push_back error", K(ret));
|
|
} else if (OB_FAIL(pl_exception.push_back(unwind_exception))) {
|
|
LOG_WARN("push_back error", K(ret));
|
|
} else if (OB_FAIL(helper_.create_struct_type(ObString("pl_exception"), pl_exception, struct_type))) {
|
|
LOG_WARN("failed to create struct type", K(ret));
|
|
} else {
|
|
pl_exception_.set_v(struct_type.get_v());
|
|
}
|
|
}
|
|
if (OB_SUCC(ret)) {
|
|
type = pl_exception_;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
int ObPLADTService::get_landingpad_result(ObLLVMType &type)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
if (NULL == landingpad_result_.get_v()) {
|
|
ObLLVMType struct_type;
|
|
ObSEArray<ObLLVMType, 2> landingpad_result;
|
|
ObLLVMType tinyint_pointer;
|
|
ObLLVMType int8_type;
|
|
ObLLVMType int32_type;
|
|
if (OB_FAIL(helper_.get_llvm_type(ObTinyIntType, int8_type))) {
|
|
LOG_WARN("failed to get_llvm_type", K(ret));
|
|
} else if (OB_FAIL(helper_.get_llvm_type(ObInt32Type, int32_type))) {
|
|
LOG_WARN("failed to get_llvm_type", K(ret));
|
|
} else if (OB_FAIL(int8_type.get_pointer_to(tinyint_pointer))) {
|
|
LOG_WARN("failed to get_pointer_to", K(ret));
|
|
} else if (OB_FAIL(landingpad_result.push_back(tinyint_pointer))) {
|
|
LOG_WARN("push_back error", K(ret));
|
|
} else if (OB_FAIL(landingpad_result.push_back(int32_type))) {
|
|
LOG_WARN("push_back error", K(ret));
|
|
} else if (OB_FAIL(helper_.create_struct_type(ObString("landingpad_result"), landingpad_result, struct_type))) {
|
|
LOG_WARN("failed to create struct type", K(ret));
|
|
} else {
|
|
landingpad_result_.set_v(struct_type.get_v());
|
|
}
|
|
}
|
|
if (OB_SUCC(ret)) {
|
|
type = landingpad_result_;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
int ObPLADTService::get_obstring(ObLLVMType &type)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
if (NULL == obstring_.get_v()) {
|
|
/**
|
|
obstr_size_t buffer_size_;
|
|
obstr_size_t data_length_;
|
|
char *ptr_;
|
|
*/
|
|
ObLLVMType struct_type;
|
|
ObSEArray<ObLLVMType, 3> obstring;
|
|
ObLLVMType int32_type;
|
|
ObLLVMType char_type;
|
|
if (OB_FAIL(helper_.get_llvm_type(ObIntType, int32_type))) {
|
|
LOG_WARN("failed to get_llvm_type", K(ret));
|
|
} else if (OB_FAIL(helper_.get_llvm_type(ObCharType, char_type))) {
|
|
LOG_WARN("failed to get_llvm_type", K(ret));
|
|
} else if (OB_FAIL(obstring.push_back(int32_type))) {
|
|
LOG_WARN("push_back error", K(ret));
|
|
} else if (OB_FAIL(obstring.push_back(int32_type))) {
|
|
LOG_WARN("push_back error", K(ret));
|
|
} else if (OB_FAIL(obstring.push_back(char_type))) {
|
|
LOG_WARN("push_back error", K(ret));
|
|
} else if (OB_FAIL(helper_.create_struct_type(ObString("obstring"), obstring, struct_type))) {
|
|
LOG_WARN("failed to create struct type", K(ret));
|
|
} else {
|
|
obstring_.set_v(struct_type.get_v());
|
|
}
|
|
}
|
|
if (OB_SUCC(ret)) {
|
|
type = obstring_;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
int ObPLADTService::get_seg_pointer_array(jit::ObLLVMType &type)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
if (NULL == seg_pointer_array_.get_v()) {
|
|
ObLLVMType struct_type;
|
|
ObLLVMType int32_type;
|
|
ObLLVMType int64_type;
|
|
ObLLVMType local_data_buf;
|
|
ObLLVMType pointer_carray_pointer;
|
|
ObLLVMType wrapper_allocator;
|
|
ObLLVMType memory_context;
|
|
ObLLVMType int8_type;
|
|
if (OB_FAIL(helper_.get_llvm_type(ObInt32Type, int32_type))) {
|
|
LOG_WARN("failed to get_llvm_type", K(ret));
|
|
} else if (OB_FAIL(helper_.get_llvm_type(ObTinyIntType, int8_type))) {
|
|
LOG_WARN("failed to get_llvm_type", K(ret));
|
|
} else if (OB_FAIL(helper_.get_llvm_type(ObIntType, int64_type))) {
|
|
LOG_WARN("failed to get_llvm_type", K(ret));
|
|
} else if (OB_FAIL(get_wrapper_allocator(wrapper_allocator))) {
|
|
LOG_WARN("failed to get wrapper_allocator", K(ret));
|
|
} else if (OB_FAIL(get_memory_context(memory_context))) {
|
|
LOG_WARN("failed to get memory_context", K(ret));
|
|
} else if (OB_FAIL(ObLLVMHelper::get_array_type(int64_type,
|
|
common::OB_BLOCK_POINTER_ARRAY_SIZE,
|
|
local_data_buf))) {
|
|
LOG_WARN("failed to get_llvm_type", K(ret));
|
|
} else if (OB_FAIL(local_data_buf.get_pointer_to(pointer_carray_pointer))) {
|
|
LOG_WARN("failed to get_pointer_to", K(ret));
|
|
} else {
|
|
/*
|
|
T *data_;
|
|
int64_t count_;
|
|
char local_data_buf_[LOCAL_ARRAY_SIZE * sizeof(T)];
|
|
int64_t block_size_; // 申请内存的块单位
|
|
int64_t capacity_; // 标记ObSEArray的内部可用空间
|
|
int64_t max_print_count_; //表示最大需要打印的元素数量;
|
|
int32_t error_; //
|
|
ObWrapperAllocator block_allocator_;
|
|
bool has_alloc_;
|
|
lib::MemoryContext mem_context_;
|
|
*/
|
|
ObSEArray<ObLLVMType, 16> seg_pointer_array;
|
|
if (OB_FAIL(seg_pointer_array.push_back(int64_type))) { // vtable
|
|
LOG_WARN("failed to push back element", K(ret));
|
|
} else if (OB_FAIL(seg_pointer_array.push_back(pointer_carray_pointer))) {
|
|
LOG_WARN("failed to push back element", K(ret));
|
|
} else if (OB_FAIL(seg_pointer_array.push_back(int64_type))) {
|
|
LOG_WARN("failed to push back element", K(ret));
|
|
} else if (OB_FAIL(seg_pointer_array.push_back(local_data_buf))) {
|
|
LOG_WARN("failed to push back element", K(ret));
|
|
} else if (OB_FAIL(seg_pointer_array.push_back(int64_type))) {
|
|
LOG_WARN("failed to push back element", K(ret));
|
|
} else if (OB_FAIL(seg_pointer_array.push_back(int64_type))) {
|
|
LOG_WARN("failed to push back element", K(ret));
|
|
} else if (OB_FAIL(seg_pointer_array.push_back(int64_type))) {
|
|
LOG_WARN("failed to push back element", K(ret));
|
|
} else if (OB_FAIL(seg_pointer_array.push_back(int32_type))) {
|
|
LOG_WARN("failed to push back element", K(ret));
|
|
} else if (OB_FAIL(seg_pointer_array.push_back(wrapper_allocator))) {
|
|
LOG_WARN("failed to push back element", K(ret));
|
|
} else if (OB_FAIL(seg_pointer_array.push_back(int8_type))) {
|
|
LOG_WARN("failed to push back element", K(ret));
|
|
} else if (OB_FAIL(seg_pointer_array.push_back(memory_context))) {
|
|
LOG_WARN("failed to push back element", K(ret));
|
|
} else if (OB_FAIL(helper_.create_struct_type(ObString("seg_pointer_array"),
|
|
seg_pointer_array, struct_type))) {
|
|
LOG_WARN("failed to create struct type", K(ret));
|
|
} else {
|
|
seg_pointer_array_.set_v(struct_type.get_v());
|
|
}
|
|
}
|
|
}
|
|
if (OB_SUCC(ret)) {
|
|
type = seg_pointer_array_;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
int ObPLADTService::get_wrapper_allocator(ObLLVMType &type)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
if (NULL == wrapper_allocator_.get_v()) {
|
|
ObLLVMType struct_type;
|
|
ObLLVMType int64_type;
|
|
if (OB_FAIL(helper_.get_llvm_type(ObIntType, int64_type))) {
|
|
LOG_WARN("failed to get_llvm_type", K(ret));
|
|
} else {
|
|
/*
|
|
ObIAllocator *alloc_;
|
|
*/
|
|
ObSEArray<ObLLVMType, 2> wrapper_allocator;
|
|
if (OB_FAIL(wrapper_allocator.push_back(int64_type))) { // vtable
|
|
LOG_WARN("failed to push back element", K(ret));
|
|
} else if (OB_FAIL(wrapper_allocator.push_back(int64_type))) {
|
|
LOG_WARN("failed to push back element", K(ret));
|
|
} else if (OB_FAIL(helper_.create_struct_type(ObString("wrapper_allocator"),
|
|
wrapper_allocator, struct_type))) {
|
|
LOG_WARN("failed to create struct type", K(ret));
|
|
} else {
|
|
wrapper_allocator_.set_v(struct_type.get_v());
|
|
}
|
|
}
|
|
}
|
|
if (OB_SUCC(ret)) {
|
|
type = wrapper_allocator_;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
int ObPLADTService::get_memory_context(ObLLVMType &type)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
if (NULL == memory_context_.get_v()) {
|
|
ObLLVMType struct_type;
|
|
ObLLVMType int64_type;
|
|
if (OB_FAIL(helper_.get_llvm_type(ObIntType, int64_type))) {
|
|
LOG_WARN("failed to get_llvm_type", K(ret));
|
|
} else {
|
|
/*
|
|
int64_t magic_code_;
|
|
int64_t seq_id_;
|
|
__MemoryContext__ *ref_context_;
|
|
*/
|
|
STATIC_ASSERT(sizeof(lib::MemoryContext) == sizeof(int64_t) * 3, "check MemoryContext layout failed");
|
|
ObSEArray<ObLLVMType, 3> memory_context;
|
|
if (OB_FAIL(memory_context.push_back(int64_type))) { // magic_code_
|
|
LOG_WARN("failed to push back element", K(ret));
|
|
} else if (OB_FAIL(memory_context.push_back(int64_type))) { // seq_id_
|
|
LOG_WARN("failed to push back element", K(ret));
|
|
} else if (OB_FAIL(memory_context.push_back(int64_type))) { // ref_context_
|
|
LOG_WARN("failed to push back element", K(ret));
|
|
} else if (OB_FAIL(helper_.create_struct_type(ObString("memory_context"),
|
|
memory_context, struct_type))) {
|
|
LOG_WARN("failed to create struct type", K(ret));
|
|
} else {
|
|
memory_context_.set_v(struct_type.get_v());
|
|
}
|
|
}
|
|
}
|
|
if (OB_SUCC(ret)) {
|
|
type = memory_context_;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
}
|
|
}
|