1
0
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:
Sergei Golubchik
2023-12-04 18:49:39 +01:00
parent 73ed0a23eb
commit ea6975b1f1
10 changed files with 231 additions and 38 deletions

View File

@@ -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)