Fix printer bugs
This commit is contained in:
@ -95,70 +95,30 @@ int ObCreateTableExecutor::prepare_stmt(ObCreateTableStmt &stmt,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
//准备查询插入的脚本
|
int ObCreateTableExecutor::ObInsSQLPrinter::inner_print(char *buf, int64_t buf_len, int64_t &res_len)
|
||||||
int ObCreateTableExecutor::prepare_ins_arg(ObCreateTableStmt &stmt,
|
|
||||||
const ObSQLSessionInfo *my_session,
|
|
||||||
ObSchemaGetterGuard *schema_guard,
|
|
||||||
const ParamStore *param_store,
|
|
||||||
ObSqlString &ins_sql) //out, 最终的查询插入语句
|
|
||||||
{
|
{
|
||||||
int ret = OB_SUCCESS;
|
int ret = OB_SUCCESS;
|
||||||
ObArenaAllocator allocator("CreateTableExec");
|
const char sep_char = lib::is_oracle_mode()? '"': '`';
|
||||||
char *buf = static_cast<char*>(allocator.alloc(OB_MAX_SQL_LENGTH));
|
const ObSelectStmt *select_stmt = NULL;
|
||||||
int64_t buf_len = OB_MAX_SQL_LENGTH;
|
|
||||||
int64_t pos1 = 0;
|
int64_t pos1 = 0;
|
||||||
bool is_set_subquery = false;
|
if (OB_ISNULL(stmt_) || OB_ISNULL(select_stmt= stmt_->get_sub_select())) {
|
||||||
bool is_oracle_mode = lib::is_oracle_mode();
|
|
||||||
bool no_osg_hint = false;
|
|
||||||
bool online_sys_var = false;
|
|
||||||
const ObString &db_name = stmt.get_database_name();
|
|
||||||
const ObString &tab_name = stmt.get_table_name();
|
|
||||||
const char sep_char = is_oracle_mode? '"': '`';
|
|
||||||
ObSelectStmt *select_stmt = stmt.get_sub_select();
|
|
||||||
ObObjPrintParams obj_print_params(select_stmt->get_query_ctx()->get_timezone_info());
|
|
||||||
obj_print_params.print_origin_stmt_ = true;
|
|
||||||
ObSelectStmtPrinter select_stmt_printer(buf, buf_len, &pos1, select_stmt,
|
|
||||||
schema_guard,
|
|
||||||
obj_print_params,
|
|
||||||
param_store,
|
|
||||||
true);
|
|
||||||
select_stmt_printer.set_is_first_stmt_for_hint(true); // need print global hint
|
|
||||||
if (OB_ISNULL(buf)) {
|
|
||||||
ret = OB_ALLOCATE_MEMORY_FAILED;
|
|
||||||
LOG_ERROR("allocate memory failed");
|
|
||||||
} else if (OB_ISNULL(select_stmt) || OB_ISNULL(select_stmt->get_query_ctx()) || OB_ISNULL(my_session)) {
|
|
||||||
ret = OB_ERR_UNEXPECTED;
|
ret = OB_ERR_UNEXPECTED;
|
||||||
LOG_WARN("select stmt should not be null", K(ret));
|
LOG_WARN("null stmt", K(ret));
|
||||||
} else {
|
|
||||||
//get hint
|
|
||||||
no_osg_hint = select_stmt->get_query_ctx()->get_global_hint().has_no_gather_opt_stat_hint();
|
|
||||||
|
|
||||||
//get system variable
|
|
||||||
ObObj online_sys_var_obj;
|
|
||||||
if (OB_FAIL(OB_FAIL(my_session->get_sys_variable(SYS_VAR__OPTIMIZER_GATHER_STATS_ON_LOAD, online_sys_var_obj)))) {
|
|
||||||
LOG_WARN("fail to get sys var", K(ret));
|
|
||||||
} else {
|
|
||||||
online_sys_var = online_sys_var_obj.get_bool();
|
|
||||||
LOG_DEBUG("online opt stat gather", K(online_sys_var), K(no_osg_hint));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (OB_FAIL(ret)) {
|
|
||||||
} else if (OB_FAIL(databuff_printf(buf, buf_len, pos1,
|
} else if (OB_FAIL(databuff_printf(buf, buf_len, pos1,
|
||||||
(!no_osg_hint && online_sys_var)
|
do_osg_
|
||||||
? "insert /*+GATHER_OPTIMIZER_STATISTICS*/ into %c%.*s%c.%c%.*s%c"
|
? "insert /*+GATHER_OPTIMIZER_STATISTICS*/ into %c%.*s%c.%c%.*s%c"
|
||||||
: "insert /*+NO_GATHER_OPTIMIZER_STATISTICS*/ into %c%.*s%c.%c%.*s%c",
|
: "insert /*+NO_GATHER_OPTIMIZER_STATISTICS*/ into %c%.*s%c.%c%.*s%c",
|
||||||
sep_char,
|
sep_char,
|
||||||
db_name.length(),
|
stmt_->get_database_name().length(),
|
||||||
db_name.ptr(),
|
stmt_->get_database_name().ptr(),
|
||||||
sep_char,
|
sep_char,
|
||||||
sep_char,
|
sep_char,
|
||||||
tab_name.length(),
|
stmt_->get_table_name().length(),
|
||||||
tab_name.ptr(),
|
stmt_->get_table_name().ptr(),
|
||||||
sep_char))) {
|
sep_char))) {
|
||||||
LOG_WARN("fail to print insert into string", K(ret), K(db_name), K(tab_name));
|
LOG_WARN("fail to print insert into string", K(ret));
|
||||||
} else if (lib::is_oracle_mode()) {
|
} else if (lib::is_oracle_mode()) {
|
||||||
ObTableSchema &table_schema = stmt.get_create_table_arg().schema_;
|
const ObTableSchema &table_schema = stmt_->get_create_table_arg().schema_;
|
||||||
int64_t used_column_count = 0;
|
int64_t used_column_count = 0;
|
||||||
for (int64_t i = 0; OB_SUCC(ret) && i < table_schema.get_column_count(); ++i) {
|
for (int64_t i = 0; OB_SUCC(ret) && i < table_schema.get_column_count(); ++i) {
|
||||||
const ObColumnSchemaV2 *column_schema = table_schema.get_column_schema_by_idx(i);
|
const ObColumnSchemaV2 *column_schema = table_schema.get_column_schema_by_idx(i);
|
||||||
@ -197,11 +157,67 @@ int ObCreateTableExecutor::prepare_ins_arg(ObCreateTableStmt &stmt,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (OB_SUCC(ret)) {
|
if (OB_SUCC(ret)) {
|
||||||
|
ObSelectStmtPrinter select_stmt_printer(buf, buf_len, &pos1, select_stmt,
|
||||||
|
schema_guard_,
|
||||||
|
print_params_,
|
||||||
|
param_store_,
|
||||||
|
true);
|
||||||
|
select_stmt_printer.set_is_first_stmt_for_hint(true); // need print global hint
|
||||||
if (OB_FAIL(databuff_printf(buf, buf_len, pos1, ") "))) {
|
if (OB_FAIL(databuff_printf(buf, buf_len, pos1, ") "))) {
|
||||||
LOG_WARN("fail to append ')'", K(ret));
|
LOG_WARN("fail to append ')'", K(ret));
|
||||||
} else if (OB_FAIL(select_stmt_printer.do_print())) {
|
} else if (OB_FAIL(select_stmt_printer.do_print())) {
|
||||||
LOG_WARN("fail to print select stmt", K(ret));
|
LOG_WARN("fail to print select stmt", K(ret));
|
||||||
} else if (OB_FAIL(ins_sql.append(buf, pos1))){
|
} else {
|
||||||
|
res_len = pos1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
//准备查询插入的脚本
|
||||||
|
int ObCreateTableExecutor::prepare_ins_arg(ObCreateTableStmt &stmt,
|
||||||
|
const ObSQLSessionInfo *my_session,
|
||||||
|
ObSchemaGetterGuard *schema_guard,
|
||||||
|
const ParamStore *param_store,
|
||||||
|
ObSqlString &ins_sql) //out, 最终的查询插入语句
|
||||||
|
{
|
||||||
|
int ret = OB_SUCCESS;
|
||||||
|
ObArenaAllocator allocator("CreateTableExec");
|
||||||
|
char *buf = static_cast<char*>(allocator.alloc(OB_MAX_SQL_LENGTH));
|
||||||
|
int64_t buf_len = OB_MAX_SQL_LENGTH;
|
||||||
|
int64_t pos1 = 0;
|
||||||
|
bool is_oracle_mode = lib::is_oracle_mode();
|
||||||
|
bool no_osg_hint = false;
|
||||||
|
bool online_sys_var = false;
|
||||||
|
ObSelectStmt *select_stmt = stmt.get_sub_select();
|
||||||
|
ObObjPrintParams obj_print_params(select_stmt->get_query_ctx()->get_timezone_info());
|
||||||
|
obj_print_params.print_origin_stmt_ = true;
|
||||||
|
if (OB_ISNULL(buf)) {
|
||||||
|
ret = OB_ALLOCATE_MEMORY_FAILED;
|
||||||
|
LOG_ERROR("allocate memory failed");
|
||||||
|
} else if (OB_ISNULL(select_stmt) || OB_ISNULL(select_stmt->get_query_ctx()) || OB_ISNULL(my_session)) {
|
||||||
|
ret = OB_ERR_UNEXPECTED;
|
||||||
|
LOG_WARN("select stmt should not be null", K(ret));
|
||||||
|
} else {
|
||||||
|
//get hint
|
||||||
|
no_osg_hint = select_stmt->get_query_ctx()->get_global_hint().has_no_gather_opt_stat_hint();
|
||||||
|
|
||||||
|
//get system variable
|
||||||
|
ObObj online_sys_var_obj;
|
||||||
|
if (OB_FAIL(OB_FAIL(my_session->get_sys_variable(SYS_VAR__OPTIMIZER_GATHER_STATS_ON_LOAD, online_sys_var_obj)))) {
|
||||||
|
LOG_WARN("fail to get sys var", K(ret));
|
||||||
|
} else {
|
||||||
|
online_sys_var = online_sys_var_obj.get_bool();
|
||||||
|
LOG_DEBUG("online opt stat gather", K(online_sys_var), K(no_osg_hint));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (OB_SUCC(ret)) {
|
||||||
|
ObInsSQLPrinter sql_printer(&stmt, schema_guard, obj_print_params, param_store, !no_osg_hint && online_sys_var);
|
||||||
|
ObString sql;
|
||||||
|
if (OB_FAIL(sql_printer.do_print(allocator, sql))) {
|
||||||
|
LOG_WARN("failed to print", K(ret));
|
||||||
|
} else if (OB_FAIL(ins_sql.append(sql))){
|
||||||
LOG_WARN("fail to append insert into string", K(ret));
|
LOG_WARN("fail to append insert into string", K(ret));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -53,6 +53,28 @@ class ObTableStmt;
|
|||||||
|
|
||||||
class ObCreateTableExecutor
|
class ObCreateTableExecutor
|
||||||
{
|
{
|
||||||
|
class ObInsSQLPrinter : public ObISqlPrinter
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ObInsSQLPrinter(ObCreateTableStmt *stmt,
|
||||||
|
ObSchemaGetterGuard *schema_guard,
|
||||||
|
ObObjPrintParams print_params,
|
||||||
|
const ParamStore *param_store,
|
||||||
|
bool do_osg) :
|
||||||
|
stmt_(stmt),
|
||||||
|
schema_guard_(schema_guard),
|
||||||
|
print_params_(print_params),
|
||||||
|
param_store_(param_store),
|
||||||
|
do_osg_(do_osg)
|
||||||
|
{}
|
||||||
|
virtual int inner_print(char *buf, int64_t buf_len, int64_t &res_len) override;
|
||||||
|
private:
|
||||||
|
ObCreateTableStmt *stmt_;
|
||||||
|
ObSchemaGetterGuard *schema_guard_;
|
||||||
|
ObObjPrintParams print_params_;
|
||||||
|
const ParamStore *param_store_;
|
||||||
|
bool do_osg_;
|
||||||
|
};
|
||||||
public:
|
public:
|
||||||
ObCreateTableExecutor();
|
ObCreateTableExecutor();
|
||||||
virtual ~ObCreateTableExecutor();
|
virtual ~ObCreateTableExecutor();
|
||||||
|
|||||||
@ -2026,6 +2026,7 @@ int ObSQLUtils::reconstruct_sql(ObIAllocator &allocator, const ObStmt *stmt, ObS
|
|||||||
const ParamStore *param_store)
|
const ParamStore *param_store)
|
||||||
{
|
{
|
||||||
int ret = OB_SUCCESS;
|
int ret = OB_SUCCESS;
|
||||||
|
ObSqlPrinter sql_printer(stmt, schema_guard, print_params, param_store);
|
||||||
if (OB_ISNULL(stmt)) {
|
if (OB_ISNULL(stmt)) {
|
||||||
ret = OB_INVALID_ARGUMENT;
|
ret = OB_INVALID_ARGUMENT;
|
||||||
LOG_WARN("stmt is NULL", K(stmt), K(ret));
|
LOG_WARN("stmt is NULL", K(stmt), K(ret));
|
||||||
@ -2035,33 +2036,35 @@ int ObSQLUtils::reconstruct_sql(ObIAllocator &allocator, const ObStmt *stmt, ObS
|
|||||||
} else if (!stmt->is_dml_stmt()) {
|
} else if (!stmt->is_dml_stmt()) {
|
||||||
ret = OB_ERR_UNEXPECTED;
|
ret = OB_ERR_UNEXPECTED;
|
||||||
LOG_WARN("Unexpected stmt type", K(stmt->get_stmt_type()), K(stmt->get_query_ctx()->get_sql_stmt()), K(ret));
|
LOG_WARN("Unexpected stmt type", K(stmt->get_stmt_type()), K(stmt->get_query_ctx()->get_sql_stmt()), K(ret));
|
||||||
} else {
|
} else if (OB_FAIL(sql_printer.do_print(allocator, sql))) {
|
||||||
|
LOG_WARN("failed to print sql", K(ret));
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ObISqlPrinter::do_print(ObIAllocator &allocator, ObString &result)
|
||||||
|
{
|
||||||
|
int ret = OB_SUCCESS;
|
||||||
//First try 64K buf on the stack, if it fails, then try 128K.
|
//First try 64K buf on the stack, if it fails, then try 128K.
|
||||||
//If it still fails, allocate 256K from the heap. If it continues to fail, expand twice each time.
|
//If it still fails, allocate 256K from the heap. If it continues to fail, expand twice each time.
|
||||||
|
int64_t res_len = 0;
|
||||||
|
char *final_buf = NULL;
|
||||||
SMART_VAR(char[OB_MAX_SQL_LENGTH], buf) {
|
SMART_VAR(char[OB_MAX_SQL_LENGTH], buf) {
|
||||||
if (OB_FAIL(print_sql(allocator,
|
MEMSET(buf, 0, sizeof(buf));
|
||||||
buf,
|
if (OB_FAIL(inner_print(buf, sizeof(buf), res_len))) {
|
||||||
sizeof(buf),
|
LOG_WARN("failed to print", K(sizeof(buf)), K(ret));
|
||||||
stmt,
|
} else {
|
||||||
sql,
|
final_buf = buf;
|
||||||
schema_guard,
|
|
||||||
print_params,
|
|
||||||
param_store))) {
|
|
||||||
LOG_WARN("failed to print sql", K(sizeof(buf)), K(ret));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (OB_SIZE_OVERFLOW == ret) {
|
if (OB_SIZE_OVERFLOW == ret) {
|
||||||
ret = OB_SUCCESS;
|
ret = OB_SUCCESS;
|
||||||
SMART_VAR(char[OB_MAX_SQL_LENGTH * 2], buf) {
|
SMART_VAR(char[OB_MAX_SQL_LENGTH * 2], buf) {
|
||||||
if (OB_FAIL(print_sql(allocator,
|
MEMSET(buf, 0, sizeof(buf));
|
||||||
buf,
|
if (OB_FAIL(inner_print(buf, sizeof(buf), res_len))) {
|
||||||
sizeof(buf),
|
LOG_WARN("failed to print", K(sizeof(buf)), K(ret));
|
||||||
stmt,
|
} else {
|
||||||
sql,
|
final_buf = buf;
|
||||||
schema_guard,
|
|
||||||
print_params,
|
|
||||||
param_store))) {
|
|
||||||
LOG_WARN("failed to print sql", K(sizeof(buf)), K(ret));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2074,39 +2077,45 @@ int ObSQLUtils::reconstruct_sql(ObIAllocator &allocator, const ObStmt *stmt, ObS
|
|||||||
char *buf = NULL;
|
char *buf = NULL;
|
||||||
if (OB_ISNULL(buf = static_cast<char*>(alloc.alloc(length)))) {
|
if (OB_ISNULL(buf = static_cast<char*>(alloc.alloc(length)))) {
|
||||||
ret = OB_ALLOCATE_MEMORY_FAILED;
|
ret = OB_ALLOCATE_MEMORY_FAILED;
|
||||||
LOG_WARN("failed to alloc memory for set sql", K(ret), K(length));
|
LOG_WARN("failed to alloc memory for sql", K(ret), K(length));
|
||||||
} else if (OB_FAIL(print_sql(allocator,
|
} else if (FALSE_IT(MEMSET(buf, 0, length))) {
|
||||||
buf,
|
} else if (OB_FAIL(inner_print(buf, length, res_len))) {
|
||||||
length,
|
LOG_WARN("failed to print", K(sizeof(buf)), K(ret));
|
||||||
stmt,
|
|
||||||
sql,
|
|
||||||
schema_guard,
|
|
||||||
print_params,
|
|
||||||
param_store))) {
|
|
||||||
LOG_WARN("failed to print sql", K(length), K(i), K(ret));
|
|
||||||
}
|
}
|
||||||
if (OB_SUCC(ret)) {
|
if (OB_SUCC(ret)) {
|
||||||
is_succ = true;
|
is_succ = true;
|
||||||
|
final_buf = buf;
|
||||||
} else if (OB_SIZE_OVERFLOW == ret) {
|
} else if (OB_SIZE_OVERFLOW == ret) {
|
||||||
ret = OB_SUCCESS;
|
ret = OB_SUCCESS;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (OB_SUCC(ret) && OB_FAIL(ob_write_string(allocator, ObString(res_len, final_buf), result))) {
|
||||||
|
LOG_WARN("fail to deep copy delete stmt string", K(ret));
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ObSQLUtils::print_sql(ObIAllocator &allocator,
|
int ObSqlPrinter::inner_print(char *buf, int64_t buf_len, int64_t &res_len)
|
||||||
char *buf,
|
{
|
||||||
|
return ObSQLUtils::print_sql(buf,
|
||||||
|
buf_len,
|
||||||
|
res_len,
|
||||||
|
stmt_,
|
||||||
|
schema_guard_,
|
||||||
|
print_params_,
|
||||||
|
param_store_);
|
||||||
|
}
|
||||||
|
|
||||||
|
int ObSQLUtils::print_sql(char *buf,
|
||||||
int64_t buf_len,
|
int64_t buf_len,
|
||||||
|
int64_t &res_len,
|
||||||
const ObStmt *stmt,
|
const ObStmt *stmt,
|
||||||
ObString &sql,
|
|
||||||
ObSchemaGetterGuard *schema_guard,
|
ObSchemaGetterGuard *schema_guard,
|
||||||
ObObjPrintParams print_params,
|
ObObjPrintParams print_params,
|
||||||
const ParamStore *param_store)
|
const ParamStore *param_store)
|
||||||
{
|
{
|
||||||
int ret = OB_SUCCESS;
|
int ret = OB_SUCCESS;
|
||||||
MEMSET(buf, 0, buf_len);
|
|
||||||
int64_t pos = 0;
|
int64_t pos = 0;
|
||||||
const ObDMLStmt *reconstruct_stmt = NULL;
|
const ObDMLStmt *reconstruct_stmt = NULL;
|
||||||
if (OB_ISNULL(stmt)) {
|
if (OB_ISNULL(stmt)) {
|
||||||
@ -2141,8 +2150,6 @@ int ObSQLUtils::print_sql(ObIAllocator &allocator,
|
|||||||
printer.enable_print_temp_table_as_cte();
|
printer.enable_print_temp_table_as_cte();
|
||||||
if (OB_FAIL(printer.do_print())) {
|
if (OB_FAIL(printer.do_print())) {
|
||||||
LOG_WARN("fail to print select stmt", K(ret));
|
LOG_WARN("fail to print select stmt", K(ret));
|
||||||
} else if (OB_FAIL(ob_write_string(allocator, ObString(pos, buf), sql))) {
|
|
||||||
LOG_WARN("fail to deep copy select stmt string", K(ret));
|
|
||||||
} else { /*do nothing*/ }
|
} else { /*do nothing*/ }
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -2158,8 +2165,6 @@ int ObSQLUtils::print_sql(ObIAllocator &allocator,
|
|||||||
printer.set_is_first_stmt_for_hint(true);
|
printer.set_is_first_stmt_for_hint(true);
|
||||||
if (OB_FAIL(printer.do_print())) {
|
if (OB_FAIL(printer.do_print())) {
|
||||||
LOG_WARN("fail to print insert stmt", K(ret));
|
LOG_WARN("fail to print insert stmt", K(ret));
|
||||||
} else if (OB_FAIL(ob_write_string(allocator, ObString(pos, buf), sql))) {
|
|
||||||
LOG_WARN("fail to deep copy insert stmt string", K(ret));
|
|
||||||
} else { /*do nothing*/ }
|
} else { /*do nothing*/ }
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -2176,8 +2181,6 @@ int ObSQLUtils::print_sql(ObIAllocator &allocator,
|
|||||||
printer.set_is_first_stmt_for_hint(true);
|
printer.set_is_first_stmt_for_hint(true);
|
||||||
if (OB_FAIL(printer.do_print())) {
|
if (OB_FAIL(printer.do_print())) {
|
||||||
LOG_WARN("fail to print insert stmt", K(ret));
|
LOG_WARN("fail to print insert stmt", K(ret));
|
||||||
} else if (OB_FAIL(ob_write_string(allocator, ObString(pos, buf), sql))) {
|
|
||||||
LOG_WARN("fail to deep copy insert stmt string", K(ret));
|
|
||||||
} else { /*do nothing*/ }
|
} else { /*do nothing*/ }
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -2193,8 +2196,6 @@ int ObSQLUtils::print_sql(ObIAllocator &allocator,
|
|||||||
printer.set_is_first_stmt_for_hint(true);
|
printer.set_is_first_stmt_for_hint(true);
|
||||||
if (OB_FAIL(printer.do_print())) {
|
if (OB_FAIL(printer.do_print())) {
|
||||||
LOG_WARN("fail to print delete stmt", K(ret));
|
LOG_WARN("fail to print delete stmt", K(ret));
|
||||||
} else if (OB_FAIL(ob_write_string(allocator, ObString(pos, buf), sql))) {
|
|
||||||
LOG_WARN("fail to deep copy delete stmt string", K(ret));
|
|
||||||
} else { /*do nothing*/ }
|
} else { /*do nothing*/ }
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -2210,8 +2211,6 @@ int ObSQLUtils::print_sql(ObIAllocator &allocator,
|
|||||||
printer.set_is_first_stmt_for_hint(true);
|
printer.set_is_first_stmt_for_hint(true);
|
||||||
if (OB_FAIL(printer.do_print())) {
|
if (OB_FAIL(printer.do_print())) {
|
||||||
LOG_WARN("fail to print update stmt", K(ret));
|
LOG_WARN("fail to print update stmt", K(ret));
|
||||||
} else if (OB_FAIL(ob_write_string(allocator, ObString(pos, buf), sql))) {
|
|
||||||
LOG_WARN("fail to deep copy update stmt string", K(ret));
|
|
||||||
} else { /*do nothing*/ }
|
} else { /*do nothing*/ }
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -2227,8 +2226,6 @@ int ObSQLUtils::print_sql(ObIAllocator &allocator,
|
|||||||
printer.set_is_first_stmt_for_hint(true);
|
printer.set_is_first_stmt_for_hint(true);
|
||||||
if (OB_FAIL(printer.do_print())) {
|
if (OB_FAIL(printer.do_print())) {
|
||||||
LOG_WARN("failed to print merge stmt", K(ret));
|
LOG_WARN("failed to print merge stmt", K(ret));
|
||||||
} else if (OB_FAIL(ob_write_string(allocator, ObString(pos, buf), sql))) {
|
|
||||||
LOG_WARN("failed to deep copy merge stmt string", K(ret));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -2238,6 +2235,7 @@ int ObSQLUtils::print_sql(ObIAllocator &allocator,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
res_len = pos;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -113,6 +113,36 @@ private:
|
|||||||
int ret_;
|
int ret_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class ObISqlPrinter
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
virtual int inner_print(char *buf, int64_t buf_len, int64_t &pos) = 0;
|
||||||
|
public:
|
||||||
|
virtual int do_print(ObIAllocator &allocator, ObString &result);
|
||||||
|
virtual ~ObISqlPrinter() = default;
|
||||||
|
};
|
||||||
|
|
||||||
|
class ObSqlPrinter : public ObISqlPrinter
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ObSqlPrinter(const ObStmt *stmt,
|
||||||
|
ObSchemaGetterGuard *schema_guard,
|
||||||
|
ObObjPrintParams print_params,
|
||||||
|
const ParamStore *param_store) :
|
||||||
|
stmt_(stmt),
|
||||||
|
schema_guard_(schema_guard),
|
||||||
|
print_params_(print_params),
|
||||||
|
param_store_(param_store)
|
||||||
|
{}
|
||||||
|
virtual int inner_print(char *buf, int64_t buf_len, int64_t &res_len) override;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
const ObStmt *stmt_;
|
||||||
|
ObSchemaGetterGuard *schema_guard_;
|
||||||
|
ObObjPrintParams print_params_;
|
||||||
|
const ParamStore *param_store_;
|
||||||
|
};
|
||||||
|
|
||||||
class ObSQLUtils
|
class ObSQLUtils
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -368,11 +398,10 @@ public:
|
|||||||
ObSchemaGetterGuard *schema_guard,
|
ObSchemaGetterGuard *schema_guard,
|
||||||
ObObjPrintParams print_params = ObObjPrintParams(),
|
ObObjPrintParams print_params = ObObjPrintParams(),
|
||||||
const ParamStore *param_store = NULL);
|
const ParamStore *param_store = NULL);
|
||||||
static int print_sql(ObIAllocator &allocator,
|
static int print_sql(char *buf,
|
||||||
char *buf,
|
|
||||||
int64_t buf_len,
|
int64_t buf_len,
|
||||||
|
int64_t &pos,
|
||||||
const ObStmt *stmt,
|
const ObStmt *stmt,
|
||||||
ObString &sql,
|
|
||||||
ObSchemaGetterGuard *schema_guard,
|
ObSchemaGetterGuard *schema_guard,
|
||||||
ObObjPrintParams print_params,
|
ObObjPrintParams print_params,
|
||||||
const ParamStore *param_store = NULL);
|
const ParamStore *param_store = NULL);
|
||||||
|
|||||||
@ -4033,7 +4033,7 @@ int ObRawExprPrinter::print_cast_type(ObRawExpr *expr)
|
|||||||
if (lib::is_oracle_mode()) {
|
if (lib::is_oracle_mode()) {
|
||||||
DATA_PRINTF("char(%d %s)", len, get_length_semantics_str(length_semantics));
|
DATA_PRINTF("char(%d %s)", len, get_length_semantics_str(length_semantics));
|
||||||
} else {
|
} else {
|
||||||
if (len > 0) {
|
if (len >= 0) {
|
||||||
DATA_PRINTF("char(%d) charset %s", len, ObCharset::charset_name(
|
DATA_PRINTF("char(%d) charset %s", len, ObCharset::charset_name(
|
||||||
static_cast<ObCollationType>(collation)));
|
static_cast<ObCollationType>(collation)));
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
Reference in New Issue
Block a user