mirror of
https://github.com/MariaDB/server.git
synced 2025-08-07 00:04:31 +03:00
MDEV-30366 Permit bulk implementation to return ALL individual results
COM_STMT_BULK_STMT new flag to server to returns all unitary results
This commit is contained in:
112
sql/sql_class.cc
112
sql/sql_class.cc
@@ -1375,6 +1375,7 @@ void THD::init()
|
||||
|
||||
apc_target.init(&LOCK_thd_kill);
|
||||
gap_tracker_data.init();
|
||||
unit_results= NULL;
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
@@ -8325,6 +8326,117 @@ bool Discrete_intervals_list::append(Discrete_interval *new_interval)
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
/*
|
||||
indicate that unit result has to be reported
|
||||
*/
|
||||
bool THD::need_report_unit_results()
|
||||
{
|
||||
return unit_results;
|
||||
}
|
||||
|
||||
/*
|
||||
Initialize unit result array
|
||||
*/
|
||||
bool THD::init_collecting_unit_results()
|
||||
{
|
||||
if (!unit_results)
|
||||
{
|
||||
void *buff;
|
||||
|
||||
if (!(my_multi_malloc(PSI_NOT_INSTRUMENTED, MYF(MY_WME), &unit_results, sizeof(DYNAMIC_ARRAY),
|
||||
&buff, sizeof(unit_results_desc) * 10,
|
||||
NullS)) ||
|
||||
my_init_dynamic_array2(PSI_INSTRUMENT_ME, unit_results, sizeof(unit_results_desc),
|
||||
buff, 10, 100, MYF(MY_WME)))
|
||||
{
|
||||
if (unit_results)
|
||||
my_free(unit_results);
|
||||
unit_results= NULL;
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/*
|
||||
remove unit result array
|
||||
*/
|
||||
void THD::stop_collecting_unit_results()
|
||||
{
|
||||
if (unit_results)
|
||||
{
|
||||
delete_dynamic(unit_results);
|
||||
my_free(unit_results);
|
||||
unit_results= NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Add a unitary result to collection
|
||||
*/
|
||||
bool THD::collect_unit_results(ulonglong id, ulonglong affected_rows)
|
||||
{
|
||||
if (unit_results)
|
||||
{
|
||||
unit_results_desc el;
|
||||
el.generated_id= id;
|
||||
el.affected_rows= affected_rows;
|
||||
if (insert_dynamic(unit_results, &el))
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/*
|
||||
Write unitary result result-set WITHOUT ending EOF/OK_Packet to socket.
|
||||
*/
|
||||
bool THD::report_collected_unit_results()
|
||||
{
|
||||
if (unit_results)
|
||||
{
|
||||
List<Item> field_list;
|
||||
MEM_ROOT tmp_mem_root;
|
||||
Query_arena arena(&tmp_mem_root, Query_arena::STMT_INITIALIZED), backup;
|
||||
|
||||
init_alloc_root(PSI_NOT_INSTRUMENTED, arena.mem_root, 2048, 4096, MYF(0));
|
||||
set_n_backup_active_arena(&arena, &backup);
|
||||
DBUG_ASSERT(mem_root == &tmp_mem_root);
|
||||
|
||||
field_list.push_back(new (mem_root)
|
||||
Item_int(this, "Id", 0, MY_INT64_NUM_DECIMAL_DIGITS),
|
||||
mem_root);
|
||||
field_list.push_back(new (mem_root)
|
||||
Item_int(this, "Affected_rows", 0, MY_INT64_NUM_DECIMAL_DIGITS),
|
||||
mem_root);
|
||||
|
||||
if (protocol_binary.send_result_set_metadata(&field_list,
|
||||
Protocol::SEND_NUM_ROWS | Protocol::SEND_EOF))
|
||||
goto error;
|
||||
|
||||
for (ulonglong i= 0; i < unit_results->elements; i++)
|
||||
{
|
||||
unit_results_desc *last=
|
||||
(unit_results_desc *)dynamic_array_ptr(unit_results, i);
|
||||
protocol_binary.prepare_for_resend();
|
||||
protocol_binary.store_longlong(last->generated_id, TRUE);
|
||||
protocol_binary.store_longlong(last->affected_rows, TRUE);
|
||||
if (protocol_binary.write())
|
||||
goto error;
|
||||
}
|
||||
error:
|
||||
restore_active_arena(&arena, &backup);
|
||||
DBUG_ASSERT(arena.mem_root == &tmp_mem_root);
|
||||
// no need free Items because they was only constants
|
||||
free_root(arena.mem_root, MYF(0));
|
||||
stop_collecting_unit_results();
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
|
||||
}
|
||||
|
||||
void AUTHID::copy(MEM_ROOT *mem_root, const LEX_CSTRING *user_name,
|
||||
const LEX_CSTRING *host_name)
|
||||
|
Reference in New Issue
Block a user