Fix inner sql execution refered to destroyed SQL bug
This commit is contained in:
@ -61,8 +61,21 @@ public:
|
|||||||
virtual int execute(sql::ObSql& engine, sql::ObSqlCtx& ctx, sql::ObResultSet& res)
|
virtual int execute(sql::ObSql& engine, sql::ObSqlCtx& ctx, sql::ObResultSet& res)
|
||||||
{
|
{
|
||||||
observer::ObReqTimeGuard req_timeinfo_guard;
|
observer::ObReqTimeGuard req_timeinfo_guard;
|
||||||
res.get_session().store_query_string(sql_);
|
int ret = OB_SUCCESS;
|
||||||
return engine.stmt_query(sql_, ctx, res);
|
// Deep copy sql, because sql may be destroyed before result iteration.
|
||||||
|
const int64_t alloc_size = sizeof(ObString) + sql_.length() + 1; // 1 for C terminate char
|
||||||
|
void *mem = res.get_mem_pool().alloc(alloc_size);
|
||||||
|
if (NULL == mem) {
|
||||||
|
ret = OB_ALLOCATE_MEMORY_FAILED;
|
||||||
|
LOG_WARN("allocate memory failed", K(ret));
|
||||||
|
} else {
|
||||||
|
ObString *dup_sql = new (mem) ObString(sql_.length(), sql_.length(), static_cast<char *>(mem) + sizeof(ObString));
|
||||||
|
MEMCPY(dup_sql->ptr(), sql_.ptr(), sql_.length());
|
||||||
|
dup_sql->ptr()[sql_.length()] = '\0';
|
||||||
|
res.get_session().store_query_string(*dup_sql);
|
||||||
|
ret = engine.stmt_query(sql_, ctx, res);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
// process result after result open
|
// process result after result open
|
||||||
|
|||||||
Reference in New Issue
Block a user