bugfix: json_exists passing var bugfix

This commit is contained in:
obdev 2023-02-27 11:11:23 +00:00 committed by ob-robot
parent 09f099c4e2
commit 6272a505cb
4 changed files with 34 additions and 16 deletions

View File

@ -4333,6 +4333,7 @@ int ObIJsonBase::compare_double(const ObIJsonBase &other, int &res) const
switch (j_type_b) {
case ObJsonNodeType::J_OFLOAT: {
double double_b = other.get_float();
double_a = (float) double_a;
res = ObJsonBaseUtil::compare_numbers(double_a, double_b);
break;
}
@ -4500,7 +4501,11 @@ int ObIJsonBase::path_compare_string(const ObString &str_l, const ObString &str_
int i = 0;
while (i < l_len && OB_SUCC(ret) && res == 0) {
if (i < r_len) {
if (str_l[i] < str_r[i]) {
if (str_l[i] < 0 && str_r[i] > 0) {
res = 1;
} else if (str_r[i] < 0 && str_l[i] > 0) {
res = -1;
} else if (str_l[i] < str_r[i]) {
res = -1;
} else if (str_l[i] > str_r[i]) {
res = 1;
@ -4540,7 +4545,7 @@ static constexpr int type_comparison[JSON_TYPE_NUM][JSON_TYPE_NUM] = {
/* 1 DECIMAL */ {1, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
/* 2 INT */ {1, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
/* 3 UINT */ {1, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
/* 4 DOUBLE */ {1, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
/* 4 DOUBLE */ {1, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
/* 5 STRING */ {1, 1, 1, 1, 1, 0, -1, -1, -1, -1, -1, -1, -1, -1, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2},
/* 6 OBJECT */ {1, 1, 1, 1, 1, 1, 0, -1, -1, -1, -1, -1, -1, -1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
/* 7 ARRAY */ {1, 1, 1, 1, 1, 1, 1, 0, -1, -1, -1, -1, -1, -1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
@ -4552,7 +4557,7 @@ static constexpr int type_comparison[JSON_TYPE_NUM][JSON_TYPE_NUM] = {
/* 13 OPAQUE */ {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
/* 14 empty */ {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
/* ORACLE MODE */
/* 15 OFLOAT */ {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
/* 15 OFLOAT */ {2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
/* 16 ODOUBLE */ {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
/* 17 ODECIMAL */ {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
/* 18 OINT */ {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
@ -4580,7 +4585,9 @@ int ObIJsonBase::compare(const ObIJsonBase &other, int &res, bool is_path) const
if (j_type_a == ObJsonNodeType::J_ERROR || j_type_b == ObJsonNodeType::J_ERROR) {
ret = OB_INVALID_ARGUMENT;
LOG_WARN("error json type", K(j_type_a), K(j_type_b));
} else if (is_path && (j_type_a == ObJsonNodeType::J_OBJECT || j_type_b == ObJsonNodeType::J_OBJECT)) {
} else if (is_path
&& (j_type_a == ObJsonNodeType::J_OBJECT || j_type_b == ObJsonNodeType::J_OBJECT
|| ((j_type_a == ObJsonNodeType::J_NULL || j_type_a == ObJsonNodeType::J_NULL) && j_type_a != j_type_b))) {
res = -3;
} else {
// Compare the matrix to get which json type has a higher priority, and return the result if the priority is different.

View File

@ -253,13 +253,24 @@ int ObExprJsonExists::get_var_data(const ObExpr &expr, ObEvalCtx &ctx, common::O
}
} else if (ObFloatType <= val_type && val_type <= ObUDoubleType) {
// double
ObJsonDouble* tmp_ans = static_cast<ObJsonDouble*> (allocator.alloc(sizeof(ObJsonDouble)));
if (OB_ISNULL(tmp_ans)) {
ret = OB_ALLOCATE_MEMORY_FAILED;
LOG_WARN("allocate row buffer failed at ObJsonDouble", K(ret));
if (val_type == ObUFloatType || val_type == ObFloatType) {
ObJsonOFloat* tmp_ans = static_cast<ObJsonOFloat*> (allocator.alloc(sizeof(ObJsonOFloat)));
if (OB_ISNULL(tmp_ans)) {
ret = OB_ALLOCATE_MEMORY_FAILED;
LOG_WARN("allocate row buffer failed at ObJsonDouble", K(ret));
} else {
tmp_ans = new (tmp_ans) ObJsonOFloat(json_datum->get_float());
j_base = tmp_ans;
}
} else {
tmp_ans = new (tmp_ans) ObJsonDouble(json_datum->get_double());
j_base = tmp_ans;
ObJsonDouble* tmp_ans = static_cast<ObJsonDouble*> (allocator.alloc(sizeof(ObJsonDouble)));
if (OB_ISNULL(tmp_ans)) {
ret = OB_ALLOCATE_MEMORY_FAILED;
LOG_WARN("allocate row buffer failed at ObJsonDouble", K(ret));
} else {
tmp_ans = new (tmp_ans) ObJsonDouble(json_datum->get_double());
j_base = tmp_ans;
}
}
} else if (ObNumberType <= val_type && val_type <= ObUNumberType) {
// decimal

View File

@ -2166,10 +2166,13 @@ int ObDMLResolver::resolve_columns(ObRawExpr *&expr, ObArray<ObQualifiedName> &c
LOG_WARN("push back failed", K(ret));
} else if (OB_FAIL(ObRawExprUtils::replace_ref_column(expr, q_name.ref_expr_, real_ref_expr))) {
LOG_WARN("replace column ref expr failed", K(ret));
} else if (expr->is_sys_func_expr() && OB_FAIL(check_col_param_on_expr(expr))) {
LOG_WARN("illegal param on func_expr", K(ret));
} else { /*do nothing*/ }
}
if (OB_SUCC(ret) && OB_NOT_NULL(expr) && expr->is_sys_func_expr()
&& OB_FAIL(check_col_param_on_expr(expr))) {
LOG_WARN("illegal param on func_expr", K(ret));
}
return ret;
}

View File

@ -1534,10 +1534,7 @@ int ObRawExprResolverImpl::check_name_type(ObQualifiedName &q_name,
if ((OB_SUCC(ret) && !check_success)
|| (OB_ERR_INVOKE_STATIC_BY_INSTANCE != ret && OB_FAIL(ret))) {
ret = OB_SUCCESS;
if (!(q_name.access_idents_.count() <= 3 && q_name.access_idents_.count() >= 1)) {
ret = OB_WRONG_COLUMN_NAME;
LOG_WARN("check name type failed", K(ret), K(q_name));
}
CK (q_name.access_idents_.count() <= 3 && q_name.access_idents_.count() >= 1);
if (3 == q_name.access_idents_.count()) {
OX (q_name.database_name_ = q_name.access_idents_.at(0).access_name_);
OX (q_name.tbl_name_ = q_name.access_idents_.at(1).access_name_);