mirror of
https://github.com/MariaDB/server.git
synced 2025-12-06 05:42:06 +03:00
Merge 10.2 into 10.3
This commit is contained in:
@@ -2147,7 +2147,7 @@ void dict_index_remove_from_v_col_list(dict_index_t* index)
|
||||
|
||||
for (ulint i = 0; i < dict_index_get_n_fields(index); i++) {
|
||||
col = dict_index_get_nth_col(index, i);
|
||||
if (col->is_virtual()) {
|
||||
if (col && col->is_virtual()) {
|
||||
vcol = reinterpret_cast<const dict_v_col_t*>(
|
||||
col);
|
||||
/* This could be NULL, when we do add
|
||||
@@ -2319,7 +2319,9 @@ dict_index_remove_from_cache_low(
|
||||
ut_ad(index->magic_n == DICT_INDEX_MAGIC_N);
|
||||
ut_ad(mutex_own(&dict_sys->mutex));
|
||||
ut_ad(table->id);
|
||||
#ifdef BTR_CUR_HASH_ADAPT
|
||||
ut_ad(!index->freed());
|
||||
#endif /* BTR_CUR_HASH_ADAPT */
|
||||
|
||||
/* No need to acquire the dict_index_t::lock here because
|
||||
there can't be any active operations on this index (or table). */
|
||||
|
||||
@@ -322,16 +322,12 @@ struct ha_innobase_inplace_ctx : public inplace_alter_handler_ctx
|
||||
@return whether the table will be rebuilt */
|
||||
bool need_rebuild () const { return(old_table != new_table); }
|
||||
|
||||
/** Clear uncommmitted added indexes after a failed operation. */
|
||||
void clear_added_indexes()
|
||||
{
|
||||
for (ulint i = 0; i < num_to_add_index; i++) {
|
||||
if (!add_index[i]->is_committed()) {
|
||||
add_index[i]->detach_columns();
|
||||
add_index[i]->n_fields = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
/** Clear uncommmitted added indexes after a failed operation. */
|
||||
void clear_added_indexes()
|
||||
{
|
||||
for (ulint i= 0; i < num_to_add_index; i++)
|
||||
add_index[i]->detach_columns(true);
|
||||
}
|
||||
|
||||
/** Convert table-rebuilding ALTER to instant ALTER. */
|
||||
void prepare_instant()
|
||||
|
||||
@@ -574,71 +574,72 @@ struct dict_col_t{
|
||||
3072 (REC_VERSION_56_MAX_INDEX_COL_LEN)
|
||||
bytes. */
|
||||
|
||||
/** Detach the column from an index.
|
||||
@param[in] index index to be detached from */
|
||||
inline void detach(const dict_index_t& index);
|
||||
/** Detach a virtual column from an index.
|
||||
@param index being-freed index */
|
||||
inline void detach(const dict_index_t &index);
|
||||
|
||||
/** Data for instantly added columns */
|
||||
struct def_t {
|
||||
/** original default value of instantly added column */
|
||||
const void* data;
|
||||
/** len of data, or UNIV_SQL_DEFAULT if unavailable */
|
||||
ulint len;
|
||||
} def_val;
|
||||
/** Data for instantly added columns */
|
||||
struct def_t
|
||||
{
|
||||
/** original default value of instantly added column */
|
||||
const void *data;
|
||||
/** len of data, or UNIV_SQL_DEFAULT if unavailable */
|
||||
ulint len;
|
||||
} def_val;
|
||||
|
||||
/** Retrieve the column name.
|
||||
@param[in] table the table of this column */
|
||||
const char* name(const dict_table_t& table) const;
|
||||
/** Retrieve the column name.
|
||||
@param[in] table the table of this column */
|
||||
const char *name(const dict_table_t &table) const;
|
||||
|
||||
/** @return whether this is a virtual column */
|
||||
bool is_virtual() const { return prtype & DATA_VIRTUAL; }
|
||||
/** @return whether NULL is an allowed value for this column */
|
||||
bool is_nullable() const { return !(prtype & DATA_NOT_NULL); }
|
||||
/** @return whether this is a virtual column */
|
||||
bool is_virtual() const { return prtype & DATA_VIRTUAL; }
|
||||
/** @return whether NULL is an allowed value for this column */
|
||||
bool is_nullable() const { return !(prtype & DATA_NOT_NULL); }
|
||||
|
||||
/** @return whether table of this system field is TRX_ID-based */
|
||||
bool vers_native() const
|
||||
{
|
||||
ut_ad(vers_sys_start() || vers_sys_end());
|
||||
ut_ad(mtype == DATA_INT || mtype == DATA_FIXBINARY);
|
||||
return mtype == DATA_INT;
|
||||
}
|
||||
/** @return whether this is system versioned */
|
||||
bool is_versioned() const { return !(~prtype & DATA_VERSIONED); }
|
||||
/** @return whether this is the system version start */
|
||||
bool vers_sys_start() const
|
||||
{
|
||||
return (prtype & DATA_VERSIONED) == DATA_VERS_START;
|
||||
}
|
||||
/** @return whether this is the system version end */
|
||||
bool vers_sys_end() const
|
||||
{
|
||||
return (prtype & DATA_VERSIONED) == DATA_VERS_END;
|
||||
}
|
||||
/** @return whether table of this system field is TRX_ID-based */
|
||||
bool vers_native() const
|
||||
{
|
||||
ut_ad(vers_sys_start() || vers_sys_end());
|
||||
ut_ad(mtype == DATA_INT || mtype == DATA_FIXBINARY);
|
||||
return mtype == DATA_INT;
|
||||
}
|
||||
/** @return whether this is system versioned */
|
||||
bool is_versioned() const { return !(~prtype & DATA_VERSIONED); }
|
||||
/** @return whether this is the system version start */
|
||||
bool vers_sys_start() const
|
||||
{
|
||||
return (prtype & DATA_VERSIONED) == DATA_VERS_START;
|
||||
}
|
||||
/** @return whether this is the system version end */
|
||||
bool vers_sys_end() const
|
||||
{
|
||||
return (prtype & DATA_VERSIONED) == DATA_VERS_END;
|
||||
}
|
||||
|
||||
/** @return whether this is an instantly-added column */
|
||||
bool is_instant() const
|
||||
{
|
||||
DBUG_ASSERT(def_val.len != UNIV_SQL_DEFAULT || !def_val.data);
|
||||
return def_val.len != UNIV_SQL_DEFAULT;
|
||||
}
|
||||
/** Get the default value of an instantly-added column.
|
||||
@param[out] len value length (in bytes), or UNIV_SQL_NULL
|
||||
@return default value
|
||||
@retval NULL if the default value is SQL NULL (len=UNIV_SQL_NULL) */
|
||||
const byte* instant_value(ulint* len) const
|
||||
{
|
||||
DBUG_ASSERT(is_instant());
|
||||
*len = def_val.len;
|
||||
return static_cast<const byte*>(def_val.data);
|
||||
}
|
||||
/** @return whether this is an instantly-added column */
|
||||
bool is_instant() const
|
||||
{
|
||||
DBUG_ASSERT(def_val.len != UNIV_SQL_DEFAULT || !def_val.data);
|
||||
return def_val.len != UNIV_SQL_DEFAULT;
|
||||
}
|
||||
/** Get the default value of an instantly-added column.
|
||||
@param[out] len value length (in bytes), or UNIV_SQL_NULL
|
||||
@return default value
|
||||
@retval NULL if the default value is SQL NULL (len=UNIV_SQL_NULL) */
|
||||
const byte *instant_value(ulint *len) const
|
||||
{
|
||||
DBUG_ASSERT(is_instant());
|
||||
*len= def_val.len;
|
||||
return static_cast<const byte*>(def_val.data);
|
||||
}
|
||||
|
||||
/** Remove the 'instant ADD' status of the column */
|
||||
void remove_instant()
|
||||
{
|
||||
DBUG_ASSERT(is_instant());
|
||||
def_val.len = UNIV_SQL_DEFAULT;
|
||||
def_val.data = NULL;
|
||||
}
|
||||
/** Remove the 'instant ADD' status of the column */
|
||||
void remove_instant()
|
||||
{
|
||||
DBUG_ASSERT(is_instant());
|
||||
def_val.len= UNIV_SQL_DEFAULT;
|
||||
def_val.data= NULL;
|
||||
}
|
||||
};
|
||||
|
||||
/** Index information put in a list of virtual column structure. Index
|
||||
@@ -1046,15 +1047,22 @@ struct dict_index_t{
|
||||
/** @return whether the index is corrupted */
|
||||
inline bool is_corrupted() const;
|
||||
|
||||
/** Detach the columns from the index that is to be freed. */
|
||||
void detach_columns()
|
||||
{
|
||||
if (has_virtual()) {
|
||||
for (unsigned i = 0; i < n_fields; i++) {
|
||||
fields[i].col->detach(*this);
|
||||
}
|
||||
}
|
||||
}
|
||||
/** Detach the virtual columns from the index that is to be removed.
|
||||
@param whether to reset fields[].col */
|
||||
void detach_columns(bool clear= false)
|
||||
{
|
||||
if (!has_virtual())
|
||||
return;
|
||||
for (unsigned i= 0; i < n_fields; i++)
|
||||
{
|
||||
dict_col_t* col= fields[i].col;
|
||||
if (!col || !col->is_virtual())
|
||||
continue;
|
||||
col->detach(*this);
|
||||
if (clear)
|
||||
fields[i].col= NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/** Determine how many fields of a given prefix can be set NULL.
|
||||
@param[in] n_prefix number of fields in the prefix
|
||||
@@ -1194,24 +1202,24 @@ struct dict_index_t{
|
||||
inline record_size_info_t record_size_info() const;
|
||||
};
|
||||
|
||||
/** Detach a column from an index.
|
||||
@param[in] index index to be detached from */
|
||||
inline void dict_col_t::detach(const dict_index_t& index)
|
||||
/** Detach a virtual column from an index.
|
||||
@param index being-freed index */
|
||||
inline void dict_col_t::detach(const dict_index_t &index)
|
||||
{
|
||||
if (!is_virtual()) {
|
||||
return;
|
||||
}
|
||||
ut_ad(is_virtual());
|
||||
|
||||
if (dict_v_idx_list* v_indexes = reinterpret_cast<const dict_v_col_t*>
|
||||
(this)->v_indexes) {
|
||||
for (dict_v_idx_list::iterator i = v_indexes->begin();
|
||||
i != v_indexes->end(); i++) {
|
||||
if (i->index == &index) {
|
||||
v_indexes->erase(i);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (dict_v_idx_list *v_indexes= reinterpret_cast<const dict_v_col_t*>(this)
|
||||
->v_indexes)
|
||||
{
|
||||
for (dict_v_idx_list::iterator i= v_indexes->begin();
|
||||
i != v_indexes->end(); i++)
|
||||
{
|
||||
if (i->index == &index) {
|
||||
v_indexes->erase(i);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** The status of online index creation */
|
||||
|
||||
@@ -412,6 +412,14 @@ class error : public logger {
|
||||
public:
|
||||
ATTRIBUTE_COLD
|
||||
~error();
|
||||
/** Indicates that error::~error() was invoked. Can be used to
|
||||
determine if error messages were logged during innodb code execution.
|
||||
@return true if there were error messages, false otherwise. */
|
||||
static bool was_logged() { return logged; }
|
||||
|
||||
private:
|
||||
/** true if error::~error() was invoked, false otherwise */
|
||||
static bool logged;
|
||||
};
|
||||
|
||||
/** The class fatal is used to emit an error message and stop the server
|
||||
|
||||
@@ -6314,7 +6314,7 @@ static my_bool lock_table_locks_lookup(rw_trx_hash_element_t *element,
|
||||
ut_ad(lock->trx == element->trx);
|
||||
if (lock_get_type_low(lock) == LOCK_REC)
|
||||
{
|
||||
ut_ad(!dict_index_is_online_ddl(lock->index) ||
|
||||
ut_ad(lock->index->online_status != ONLINE_INDEX_CREATION ||
|
||||
lock->index->is_primary());
|
||||
ut_ad(lock->index->table != table);
|
||||
}
|
||||
|
||||
@@ -2234,14 +2234,14 @@ AIO::linux_create_io_ctx(
|
||||
}
|
||||
|
||||
/* Have tried enough. Better call it a day. */
|
||||
ib::error()
|
||||
ib::warn()
|
||||
<< "io_setup() failed with EAGAIN after "
|
||||
<< OS_AIO_IO_SETUP_RETRY_ATTEMPTS
|
||||
<< " attempts.";
|
||||
break;
|
||||
|
||||
case -ENOSYS:
|
||||
ib::error()
|
||||
ib::warn()
|
||||
<< "Linux Native AIO interface"
|
||||
" is not supported on this platform. Please"
|
||||
" check your OS documentation and install"
|
||||
@@ -2250,7 +2250,7 @@ AIO::linux_create_io_ctx(
|
||||
break;
|
||||
|
||||
default:
|
||||
ib::error()
|
||||
ib::warn()
|
||||
<< "Linux Native AIO setup"
|
||||
<< " returned following error["
|
||||
<< ret << "]";
|
||||
|
||||
@@ -578,9 +578,13 @@ warn::~warn()
|
||||
sql_print_warning("InnoDB: %s", m_oss.str().c_str());
|
||||
}
|
||||
|
||||
/** true if error::~error() was invoked, false otherwise */
|
||||
bool error::logged;
|
||||
|
||||
error::~error()
|
||||
{
|
||||
sql_print_error("InnoDB: %s", m_oss.str().c_str());
|
||||
logged = true;
|
||||
}
|
||||
|
||||
#ifdef _MSC_VER
|
||||
|
||||
@@ -1288,6 +1288,7 @@ static my_bool allocate_head(MARIA_FILE_BITMAP *bitmap, uint size,
|
||||
uint byte= 6 * (last_insert_page / 16);
|
||||
first_pattern= last_insert_page % 16;
|
||||
data= bitmap->map+byte;
|
||||
first_found= 0; /* Don't update full_head_size */
|
||||
DBUG_ASSERT(data <= end);
|
||||
}
|
||||
else
|
||||
|
||||
Reference in New Issue
Block a user