mirror of
https://github.com/MariaDB/server.git
synced 2025-01-22 23:04:20 +01:00
7fed1c703e
1. We add a vector of locks to trx_t. This array contains the autoinc locks granted to a transaction. There is one per table. 2. We enforce releasing of these locks in the reverse order from the one in which they are acquired. The assumption is that since the AUTOINC locks are statement level locks. Nested statements introduced by triggers are stacked it should hold. There was some cleanup done to the vector code too by adding const and some new functions. Rename dict_table_t::auto_inc_lock to autoinc_lock. Fix Bug#26316 Triggers create duplicate entries on auto-increment columns rb://22
70 lines
1.6 KiB
Text
70 lines
1.6 KiB
Text
/********************************************************************
|
|
Get number of elements in vector. */
|
|
UNIV_INLINE
|
|
ulint
|
|
ib_vector_size(
|
|
/*===========*/
|
|
/* out: number of elements in vector */
|
|
const ib_vector_t* vec) /* in: vector */
|
|
{
|
|
return(vec->used);
|
|
}
|
|
|
|
/********************************************************************
|
|
Get n'th element. */
|
|
UNIV_INLINE
|
|
void*
|
|
ib_vector_get(
|
|
/*==========*/
|
|
/* out: n'th element */
|
|
ib_vector_t* vec, /* in: vector */
|
|
ulint n) /* in: element index to get */
|
|
{
|
|
ut_a(n < vec->used);
|
|
|
|
return(vec->data[n]);
|
|
}
|
|
|
|
/********************************************************************
|
|
Remove the last element from the vector. */
|
|
UNIV_INLINE
|
|
void*
|
|
ib_vector_pop(
|
|
/*==========*/
|
|
/* out: last vector element */
|
|
ib_vector_t* vec) /* in/out: vector */
|
|
{
|
|
void* elem;
|
|
|
|
ut_a(vec->used > 0);
|
|
--vec->used;
|
|
elem = vec->data[vec->used];
|
|
|
|
ut_d(vec->data[vec->used] = NULL);
|
|
UNIV_MEM_INVALID(&vec->data[vec->used], sizeof(*vec->data));
|
|
|
|
return(elem);
|
|
}
|
|
|
|
/********************************************************************
|
|
Free the underlying heap of the vector. Note that vec is invalid
|
|
after this call. */
|
|
UNIV_INLINE
|
|
void
|
|
ib_vector_free(
|
|
/*===========*/
|
|
ib_vector_t* vec) /* in, own: vector */
|
|
{
|
|
mem_heap_free(vec->heap);
|
|
}
|
|
|
|
/********************************************************************
|
|
Test whether a vector is empty or not. */
|
|
UNIV_INLINE
|
|
ibool
|
|
ib_vector_is_empty(
|
|
/*===============*/ /* out: TRUE if empty else FALSE */
|
|
const ib_vector_t* vec) /* in vector to test */
|
|
{
|
|
return(ib_vector_size(vec) == 0);
|
|
}
|