Fix print function bin/oct bug

This commit is contained in:
xianyu-w
2023-05-05 05:38:39 +00:00
committed by ob-robot
parent e6cf47df8f
commit 8a215cb58f
3 changed files with 49 additions and 72 deletions

View File

@ -1106,8 +1106,7 @@ struct ObObjPrintParams
uint32_t beginning_space_:1; uint32_t beginning_space_:1;
uint32_t for_dblink_:1; uint32_t for_dblink_:1;
uint32_t binary_string_print_hex_:1; uint32_t binary_string_print_hex_:1;
uint32_t need_print_converter_:1; uint32_t reserved_:25;
uint32_t reserved_:24;
}; };
}; };
}; };

View File

@ -367,7 +367,6 @@ int ObVariableSetExecutor::calc_subquery_expr_value(ObExecContext &ctx,
ObSqlString tmp_expr_subquery; ObSqlString tmp_expr_subquery;
ObSqlString expr_subquery; ObSqlString expr_subquery;
ObObjPrintParams print_params(session_info->get_timezone_info()); ObObjPrintParams print_params(session_info->get_timezone_info());
print_params.need_print_converter_ = false;
ObRawExprPrinter expr_printer(expr_str_buf, OB_MAX_DEFAULT_VALUE_LENGTH, ObRawExprPrinter expr_printer(expr_str_buf, OB_MAX_DEFAULT_VALUE_LENGTH,
&pos, ctx.get_sql_ctx()->schema_guard_, print_params); &pos, ctx.get_sql_ctx()->schema_guard_, print_params);
if (OB_FAIL(expr_printer.do_print(expr, T_NONE_SCOPE, true, true))) { if (OB_FAIL(expr_printer.do_print(expr, T_NONE_SCOPE, true, true))) {

View File

@ -3030,36 +3030,15 @@ int ObRawExprPrinter::print(ObSysFunRawExpr *expr)
case T_FUN_SYS_JSON_MERGE_PATCH: case T_FUN_SYS_JSON_MERGE_PATCH:
case T_FUN_SYS_JSON_EXISTS: { case T_FUN_SYS_JSON_EXISTS: {
if (lib::is_mysql_mode() && (expr_type == T_FUN_SYS_JSON_ARRAY || expr_type == T_FUN_SYS_JSON_MERGE_PATCH)) { if (lib::is_mysql_mode() && (expr_type == T_FUN_SYS_JSON_ARRAY || expr_type == T_FUN_SYS_JSON_MERGE_PATCH)) {
DATA_PRINTF("%.*s(", LEN_AND_PTR(func_name)); DATA_PRINTF("%.*s", LEN_AND_PTR(func_name));
int64_t i = 0; OZ(inner_print_fun_params(*expr));
for (; OB_SUCC(ret) && i < expr->get_param_count(); ++i) {
PRINT_EXPR(expr->get_param_expr(i));
DATA_PRINTF(",");
}
if (OB_SUCC(ret)) {
if (i > 0) {
--*pos_;
}
DATA_PRINTF(")");
}
} else if(lib::is_oracle_mode() || T_FUN_SYS_JSON_VALUE == expr_type) { } else if(lib::is_oracle_mode() || T_FUN_SYS_JSON_VALUE == expr_type) {
if (OB_FAIL(print_json_expr(expr))) { if (OB_FAIL(print_json_expr(expr))) {
LOG_WARN("fail to print json expr", K(ret), K(*expr)); LOG_WARN("fail to print json expr", K(ret), K(*expr));
} }
} else { // mysql default } else { // mysql default
DATA_PRINTF("%.*s(", LEN_AND_PTR(func_name)); DATA_PRINTF("%.*s", LEN_AND_PTR(func_name));
int64_t param_count = expr->get_param_count(); OZ(inner_print_fun_params(*expr));
int64_t i = 0;
for (; OB_SUCC(ret) && i < param_count; ++i) {
PRINT_EXPR(expr->get_param_expr(i));
DATA_PRINTF(",");
}
if (OB_SUCC(ret)) {
if (i > 0) {
--*pos_;
}
DATA_PRINTF(")");
}
} }
break; break;
} }
@ -3123,6 +3102,11 @@ int ObRawExprPrinter::print(ObSysFunRawExpr *expr)
} }
break; break;
} }
case T_FUN_SYS_XML_EXTRACT: {
DATA_PRINTF("extract");
OZ(inner_print_fun_params(*expr));
break;
}
case T_FUN_ENUM_TO_STR: case T_FUN_ENUM_TO_STR:
case T_FUN_SET_TO_STR: case T_FUN_SET_TO_STR:
case T_FUN_ENUM_TO_INNER_TYPE: case T_FUN_ENUM_TO_INNER_TYPE:
@ -3135,58 +3119,53 @@ int ObRawExprPrinter::print(ObSysFunRawExpr *expr)
} }
break; break;
} }
default: { case T_OP_CONV: {
// substr DATA_PRINTF("%.*s(", LEN_AND_PTR(func_name));
// date, month int64_t param_count = expr->get_param_count();
// cur_date, current_date, cur_time, current_time int64_t i = 0;
// func_name for (; OB_SUCC(ret) && i < param_count; ++i) {
if (T_FUN_SYS_ORA_DECODE == expr->get_expr_type()) { if (i == 0) {
//同一个函数 在Oracle下名为decode, 在MySQL下名为ora_decode PRINT_EXPR(expr->get_param_expr(i));
// for DATA_PRINTF(",");
// 保证SQL反拼不会出错 } else if (func_name.case_compare("BIN") == 0 || func_name.case_compare("OCT") == 0) {
if (lib::is_oracle_mode()) { // do nothing
func_name = "decode";
} else { } else {
func_name = "ora_decode"; PRINT_EXPR(expr->get_param_expr(i));
DATA_PRINTF(",");
} }
} }
if (T_FUN_SYS_XML_EXTRACT == expr->get_expr_type()) {
func_name = "extract";
}
if (T_FUN_UDF == expr->get_expr_type()) {
PRINT_QUOT;
DATA_PRINTF("%.*s", LEN_AND_PTR(func_name));
PRINT_QUOT;
DATA_PRINTF("(");
} else {
DATA_PRINTF("%.*s(", LEN_AND_PTR(func_name));
}
if (OB_SUCC(ret)) { if (OB_SUCC(ret)) {
int64_t param_count = expr->get_param_count(); if (i > 0) {
int64_t i = 0; --*pos_;
for (; OB_SUCC(ret) && i < param_count; ++i) {
if (i == 0) {
PRINT_EXPR(expr->get_param_expr(i));
DATA_PRINTF(",");
} else if (func_name.compare("BIN") == 0 || func_name.compare("OCT") == 0) {
if (print_params_.need_print_converter_) {
PRINT_EXPR(expr->get_param_expr(i));
DATA_PRINTF(",");
}
} else {
PRINT_EXPR(expr->get_param_expr(i));
DATA_PRINTF(",");
}
}
if (OB_SUCC(ret)) {
if (i > 0) {
--*pos_;
}
DATA_PRINTF(")");
} }
DATA_PRINTF(")");
} }
break; break;
} }
case T_FUN_SYS_ORA_DECODE: {
//同一个函数 在Oracle下名为decode, 在MySQL下名为ora_decode
// for
// 保证SQL反拼不会出错
if (lib::is_oracle_mode()) {
DATA_PRINTF("decode");
} else {
DATA_PRINTF("ora_decode");
}
OZ(inner_print_fun_params(*expr));
break;
}
case T_FUN_UDF: {
PRINT_QUOT;
DATA_PRINTF("%.*s", LEN_AND_PTR(func_name));
PRINT_QUOT;
OZ(inner_print_fun_params(*expr));
break;
}
default: {
DATA_PRINTF("%.*s", LEN_AND_PTR(func_name));
OZ(inner_print_fun_params(*expr));
break;
}
} }
} }