[FEAT MERGE]:Oracle Json Supported

This commit is contained in:
obdev
2023-01-28 15:52:29 +08:00
committed by ob-robot
parent 274e68514d
commit bbb017266b
197 changed files with 30520 additions and 2252 deletions

View File

@ -1073,11 +1073,16 @@ int ObSqlParameterization::gen_ps_not_param_var(const ObIArray<int64_t> &offsets
const int64_t offset = offsets.at(i);
PsNotParamInfo ps_not_param_var;
ps_not_param_var.idx_ = offset;
ps_not_param_var.ps_param_ = params.at(offset);
if (OB_FAIL(pc_ctx.not_param_var_.push_back(ps_not_param_var))) {
LOG_WARN("fail to push item to array", K(ret));
} else if (OB_FAIL(pc_ctx.not_param_index_.add_member(offset))) {
LOG_WARN("add member failed", K(ret), K(offset));
if (offset >= params.count()) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("offset should not oversize param size", K(ret), K(offset), K(params.count()));
} else {
ps_not_param_var.ps_param_ = params.at(offset);
if (OB_FAIL(pc_ctx.not_param_var_.push_back(ps_not_param_var))) {
LOG_WARN("fail to push item to array", K(ret));
} else if (OB_FAIL(pc_ctx.not_param_index_.add_member(offset))) {
LOG_WARN("add member failed", K(ret), K(offset));
}
}
}
return ret;
@ -1592,16 +1597,115 @@ int ObSqlParameterization::mark_tree(ParseNode *tree ,SqlInfo &sql_info)
}
} else { /*do nothing*/ }
} else if(T_FUN_SYS_JSON_VALUE == tree->type_) {
if (7 != tree->num_child_) {
if (9 != tree->num_child_) {
ret = OB_INVALID_ARGUMENT;
SQL_PC_LOG(WARN, "invalid json value expr argument", K(ret), K(tree->num_child_));
} else {
const int64_t ARGS_NUMBER_SEVEN = 7;
bool mark_arr[ARGS_NUMBER_SEVEN] = {1, 1, 1, 1, 1, 1, 1};
if (OB_FAIL(mark_args(tree, mark_arr, ARGS_NUMBER_SEVEN, sql_info))) {
const int64_t ARGS_NUMBER_NINE = 9;
bool mark_arr[ARGS_NUMBER_NINE] = {0, 1, 1, 1, 1, 1, 1, 1, 1};
if (OB_FAIL(mark_args(tree, mark_arr, ARGS_NUMBER_NINE, sql_info))) {
SQL_PC_LOG(WARN, "fail to mark substr arg", K(ret));
}
}
} else if(T_FUN_SYS_JSON_OBJECT == tree->type_) {
if (5 != tree->num_child_) {
ret = OB_INVALID_ARGUMENT;
SQL_PC_LOG(WARN, "invalid json object expr argument", K(ret), K(tree->num_child_));
} else {
const int64_t ARGS_NUMBER_FIVE = 5;
bool mark_arr[ARGS_NUMBER_FIVE] = {1, 1, 1, 1, 1};
if (OB_FAIL(mark_args(tree, mark_arr, ARGS_NUMBER_FIVE, sql_info))) {
SQL_PC_LOG(WARN, "fail to mark substr arg", K(ret));
}
}
} else if(T_FUN_SYS_IS_JSON == tree->type_) {
if (5 != tree->num_child_) {
ret = OB_INVALID_ARGUMENT;
SQL_PC_LOG(WARN, "invalid argument num for IS json", K(ret), K(tree->num_child_));
} else {
const int64_t ARGS_NUMBER_FIVE = 5;
bool mark_arr[ARGS_NUMBER_FIVE] = {0, 1, 1, 1, 1};
if (OB_FAIL(mark_args(tree, mark_arr, ARGS_NUMBER_FIVE, sql_info))) {
SQL_PC_LOG(WARN, "fail to mark substr arg", K(ret));
}
}
} else if(T_FUN_SYS_JSON_QUERY == tree->type_) {
if (10 != tree->num_child_) {
ret = OB_INVALID_ARGUMENT;
SQL_PC_LOG(WARN, "invalid json query expr argument", K(ret), K(tree->num_child_));
} else {
const int64_t ARGS_NUMBER_TEN = 10;
bool mark_arr[ARGS_NUMBER_TEN] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; // json doc type will affect returning type,
if (OB_FAIL(mark_args(tree, mark_arr, ARGS_NUMBER_TEN, sql_info))) {
SQL_PC_LOG(WARN, "fail to mark substr arg", K(ret));
}
}
} else if(T_FUN_SYS_JSON_EXISTS == tree->type_) {
if (5 != tree->num_child_) {
ret = OB_INVALID_ARGUMENT;
SQL_PC_LOG(WARN, "invalid argument num for json_exists", K(ret), K(tree->num_child_));
} else {
const int64_t ARGS_NUMBER_FIVE = 5;
bool mark_arr[ARGS_NUMBER_FIVE] = {0, 0, 1, 1, 1};
if (OB_FAIL(mark_args(tree, mark_arr, ARGS_NUMBER_FIVE, sql_info))) {
SQL_PC_LOG(WARN, "fail to mark json_exists arg", K(ret));
}
}
} else if(T_FUN_SYS_JSON_EQUAL == tree->type_) {
if (3 < tree->num_child_) {
ret = OB_INVALID_ARGUMENT;
SQL_PC_LOG(WARN, "invalid json query expr argument", K(ret), K(tree->num_child_));
} else {
const int64_t ARGS_NUMBER_THREE = 3;
bool mark_arr[ARGS_NUMBER_THREE] = {0, 0, 1};
if (OB_FAIL(mark_args(tree, mark_arr, ARGS_NUMBER_THREE, sql_info))) {
SQL_PC_LOG(WARN, "fail to mark substr arg", K(ret));
}
}
} else if(T_FUN_SYS_JSON_ARRAY == tree->type_) {
if (4 != tree->num_child_) {
ret = OB_INVALID_ARGUMENT;
SQL_PC_LOG(WARN, "invalid json array expr argument", K(ret), K(tree->num_child_));
} else {
const int64_t ARGS_NUMBER_FOUR = 4;
bool mark_arr[ARGS_NUMBER_FOUR] = {0, 1, 1, 1};
if (OB_FAIL(mark_args(tree, mark_arr, ARGS_NUMBER_FOUR, sql_info))) {
SQL_PC_LOG(WARN, "fail to mark json array arg", K(ret));
}
}
} else if(T_FUN_SYS_JSON_MERGE_PATCH == tree->type_) {
if (7 != tree->num_child_) {
ret = OB_INVALID_ARGUMENT;
SQL_PC_LOG(WARN, "invalid json mergepatch expr argument", K(ret), K(tree->num_child_));
} else {
const int64_t ARGS_NUMBER_SEVEN = 7;
bool mark_arr[ARGS_NUMBER_SEVEN] = {0, 0, 1, 1, 1, 1, 1};
if (OB_FAIL(mark_args(tree, mark_arr, ARGS_NUMBER_SEVEN, sql_info))) {
SQL_PC_LOG(WARN, "fail to mark json mergepatch arg", K(ret));
}
}
} else if (T_JSON_TABLE_EXPRESSION == tree->type_) {
if (5 != tree->num_child_) {
ret = OB_INVALID_ARGUMENT;
SQL_PC_LOG(WARN, "invalid json mergepatch expr argument", K(ret), K(tree->num_child_));
} else {
const int64_t ARGS_NUMBER_FIVE = 5;
bool mark_arr[ARGS_NUMBER_FIVE] = {0, 1, 1, 1, 1};
if (OB_FAIL(mark_args(tree, mark_arr, ARGS_NUMBER_FIVE, sql_info))) {
SQL_PC_LOG(WARN, "fail to mark json mergepatch arg", K(ret));
}
}
} else if (T_FUN_SYS_TREAT == tree->type_) {
if (2 != tree->num_child_) {
ret = OB_INVALID_ARGUMENT;
SQL_PC_LOG(WARN, "invalid treat expr argument", K(ret), K(tree->num_child_));
} else {
const int64_t ARGS_NUMBER_TWO = 2;
bool mark_arr[ARGS_NUMBER_TWO] = {1, 0};
if (OB_FAIL(mark_args(tree, mark_arr, ARGS_NUMBER_TWO, sql_info))) {
SQL_PC_LOG(WARN, "fail to mark treat arg", K(ret));
}
}
} else { /*do nothing*/ }
return ret;
}