fix nested sql bug
This commit is contained in:
@ -65,20 +65,12 @@ namespace sql
|
|||||||
{
|
{
|
||||||
|
|
||||||
ObSqlPlan::ObSqlPlan(common::ObIAllocator &allocator)
|
ObSqlPlan::ObSqlPlan(common::ObIAllocator &allocator)
|
||||||
:allocator_(allocator),
|
:allocator_(allocator)
|
||||||
save_nested_count_(-1),
|
|
||||||
saved_session_(NULL)
|
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ObSqlPlan::~ObSqlPlan()
|
ObSqlPlan::~ObSqlPlan()
|
||||||
{
|
{
|
||||||
save_nested_count_ = -1;
|
|
||||||
if (OB_NOT_NULL(saved_session_)) {
|
|
||||||
allocator_.free(saved_session_);
|
|
||||||
saved_session_ = NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int ObSqlPlan::store_sql_plan(ObLogPlan* log_plan, ObPhysicalPlan* phy_plan)
|
int ObSqlPlan::store_sql_plan(ObLogPlan* log_plan, ObPhysicalPlan* phy_plan)
|
||||||
@ -240,6 +232,9 @@ int ObSqlPlan::inner_store_sql_plan_for_explain(ObExecContext *ctx,
|
|||||||
ObInnerSQLConnectionPool *pool = NULL;
|
ObInnerSQLConnectionPool *pool = NULL;
|
||||||
sql::ObSQLSessionInfo *session = NULL;
|
sql::ObSQLSessionInfo *session = NULL;
|
||||||
ObInnerSQLConnection *conn = NULL;
|
ObInnerSQLConnection *conn = NULL;
|
||||||
|
ObSQLSessionInfo::StmtSavedValue *saved_session = NULL;
|
||||||
|
transaction::ObTxDesc *save_tx_desc = NULL;
|
||||||
|
int64_t save_nested_count = 0;
|
||||||
int64_t affected_rows = 0;
|
int64_t affected_rows = 0;
|
||||||
ObSqlString sql;
|
ObSqlString sql;
|
||||||
if (OB_ISNULL(ctx) ||
|
if (OB_ISNULL(ctx) ||
|
||||||
@ -254,7 +249,10 @@ int ObSqlPlan::inner_store_sql_plan_for_explain(ObExecContext *ctx,
|
|||||||
} else if (OB_ISNULL(conn)) {
|
} else if (OB_ISNULL(conn)) {
|
||||||
ret = OB_ERR_UNEXPECTED;
|
ret = OB_ERR_UNEXPECTED;
|
||||||
LOG_WARN("unexpect null sql connection", K(ret));
|
LOG_WARN("unexpect null sql connection", K(ret));
|
||||||
} else if (OB_FAIL(prepare_and_store_session(session))) {
|
} else if (OB_FAIL(prepare_and_store_session(session,
|
||||||
|
saved_session,
|
||||||
|
save_tx_desc,
|
||||||
|
save_nested_count))) {
|
||||||
LOG_WARN("failed to begin nested session", K(ret));
|
LOG_WARN("failed to begin nested session", K(ret));
|
||||||
}
|
}
|
||||||
for (int64_t i = 0; OB_SUCC(ret) && i < sql_plan_infos.count(); ++i) {
|
for (int64_t i = 0; OB_SUCC(ret) && i < sql_plan_infos.count(); ++i) {
|
||||||
@ -392,7 +390,10 @@ int ObSqlPlan::inner_store_sql_plan_for_explain(ObExecContext *ctx,
|
|||||||
ctx->get_sql_proxy()->close(conn, ret);
|
ctx->get_sql_proxy()->close(conn, ret);
|
||||||
}
|
}
|
||||||
if (OB_NOT_NULL(session)) {
|
if (OB_NOT_NULL(session)) {
|
||||||
int end_ret = restore_session(session);
|
int end_ret = restore_session(session,
|
||||||
|
saved_session,
|
||||||
|
save_tx_desc,
|
||||||
|
save_nested_count);
|
||||||
if (OB_SUCCESS != end_ret) {
|
if (OB_SUCCESS != end_ret) {
|
||||||
LOG_WARN("failed to restore session", K(end_ret), K(ret));
|
LOG_WARN("failed to restore session", K(end_ret), K(ret));
|
||||||
if (OB_SUCCESS == ret) {
|
if (OB_SUCCESS == ret) {
|
||||||
@ -2346,9 +2347,16 @@ int ObSqlPlan::plan_text_to_strings(PlanText &plan_text,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ObSqlPlan::prepare_and_store_session(ObSQLSessionInfo *session) {
|
int ObSqlPlan::prepare_and_store_session(ObSQLSessionInfo *session,
|
||||||
|
ObSQLSessionInfo::StmtSavedValue *&session_value,
|
||||||
|
transaction::ObTxDesc *&tx_desc,
|
||||||
|
int64_t &nested_count)
|
||||||
|
{
|
||||||
int ret = OB_SUCCESS;
|
int ret = OB_SUCCESS;
|
||||||
void *ptr = NULL;
|
void *ptr = NULL;
|
||||||
|
session_value = NULL;
|
||||||
|
tx_desc = NULL;
|
||||||
|
nested_count = 0;
|
||||||
if (OB_ISNULL(session)) {
|
if (OB_ISNULL(session)) {
|
||||||
ret = OB_ERR_UNEXPECTED;
|
ret = OB_ERR_UNEXPECTED;
|
||||||
LOG_WARN("unexpected session value", K(ret));
|
LOG_WARN("unexpected session value", K(ret));
|
||||||
@ -2356,29 +2364,52 @@ int ObSqlPlan::prepare_and_store_session(ObSQLSessionInfo *session) {
|
|||||||
ret = OB_ALLOCATE_MEMORY_FAILED;
|
ret = OB_ALLOCATE_MEMORY_FAILED;
|
||||||
LOG_WARN("failed to alloc memory for saved session value", K(ret));
|
LOG_WARN("failed to alloc memory for saved session value", K(ret));
|
||||||
} else {
|
} else {
|
||||||
saved_session_ = new(ptr) sql::ObSQLSessionInfo::StmtSavedValue();
|
session_value = new(ptr) sql::ObSQLSessionInfo::StmtSavedValue();
|
||||||
if (OB_FAIL(session->save_session(*saved_session_))) {
|
if (OB_FAIL(session->save_session(*session_value))) {
|
||||||
LOG_WARN("failed to save session", K(ret));
|
LOG_WARN("failed to save session", K(ret));
|
||||||
} else {
|
} else {
|
||||||
save_nested_count_ = session->get_nested_count();
|
nested_count = session->get_nested_count();
|
||||||
session->set_query_start_time(ObTimeUtility::current_time());
|
session->set_query_start_time(ObTimeUtility::current_time());
|
||||||
session->set_inner_session();
|
session->set_inner_session();
|
||||||
session->set_nested_count(-1);
|
session->set_nested_count(-1);
|
||||||
|
//write plan to plan table
|
||||||
|
session->set_autocommit(true);
|
||||||
|
tx_desc = session->get_tx_desc();
|
||||||
|
session->get_tx_desc() = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ObSqlPlan::restore_session(ObSQLSessionInfo *session) {
|
int ObSqlPlan::restore_session(ObSQLSessionInfo *session,
|
||||||
|
ObSQLSessionInfo::StmtSavedValue *&session_value,
|
||||||
|
transaction::ObTxDesc *tx_desc,
|
||||||
|
int64_t nested_count)
|
||||||
|
{
|
||||||
int ret = OB_SUCCESS;
|
int ret = OB_SUCCESS;
|
||||||
if (OB_ISNULL(session) || OB_ISNULL(saved_session_)) {
|
if (OB_ISNULL(session) || OB_ISNULL(session_value)) {
|
||||||
ret = OB_ERR_UNEXPECTED;
|
ret = OB_ERR_UNEXPECTED;
|
||||||
LOG_WARN("unexpected session value or saved session value", K(ret));
|
LOG_WARN("unexpected session value or saved session value", K(ret));
|
||||||
} else if (OB_FAIL(session->restore_session(*saved_session_))) {
|
} else if (OB_FAIL(session->restore_session(*session_value))) {
|
||||||
LOG_WARN("failed to restore session", K(ret));
|
LOG_WARN("failed to restore session", K(ret));
|
||||||
} else {
|
} else {
|
||||||
session->set_nested_count(save_nested_count_);
|
transaction::ObTxDesc *new_tx_desc = session->get_tx_desc();
|
||||||
saved_session_->reset();
|
session->set_nested_count(nested_count);
|
||||||
|
session->get_tx_desc() = tx_desc;
|
||||||
|
session_value->reset();
|
||||||
|
allocator_.free(session_value);
|
||||||
|
session_value = 0;
|
||||||
|
// release curr
|
||||||
|
if (OB_NOT_NULL(new_tx_desc)) {
|
||||||
|
auto txs = MTL(transaction::ObTransService*);
|
||||||
|
if (OB_ISNULL(txs)) {
|
||||||
|
ret = OB_ERR_UNEXPECTED;
|
||||||
|
LOG_ERROR("can not acquire MTL TransService", KR(ret));
|
||||||
|
new_tx_desc->dump_and_print_trace();
|
||||||
|
} else if (OB_FAIL(txs->release_tx(*new_tx_desc))) {
|
||||||
|
LOG_WARN("failed to release tx desc", K(ret));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -263,9 +263,15 @@ private:
|
|||||||
|
|
||||||
int refine_buffer(PlanText &plan_text);
|
int refine_buffer(PlanText &plan_text);
|
||||||
|
|
||||||
int prepare_and_store_session(ObSQLSessionInfo *session);
|
int prepare_and_store_session(ObSQLSessionInfo *session,
|
||||||
|
ObSQLSessionInfo::StmtSavedValue *&session_value,
|
||||||
|
transaction::ObTxDesc *&tx_desc,
|
||||||
|
int64_t &nested_count);
|
||||||
|
|
||||||
int restore_session(ObSQLSessionInfo *session);
|
int restore_session(ObSQLSessionInfo *session,
|
||||||
|
ObSQLSessionInfo::StmtSavedValue *&session_value,
|
||||||
|
transaction::ObTxDesc *tx_desc,
|
||||||
|
int64_t nested_count);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static int format_one_output_expr(char *buf,
|
static int format_one_output_expr(char *buf,
|
||||||
@ -279,8 +285,6 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
common::ObIAllocator &allocator_;
|
common::ObIAllocator &allocator_;
|
||||||
int64_t save_nested_count_;
|
|
||||||
ObSQLSessionInfo::StmtSavedValue *saved_session_;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // end of namespace sql
|
} // end of namespace sql
|
||||||
|
|||||||
Reference in New Issue
Block a user