2009-05-27 15:15:59 +05:30
|
|
|
/*****************************************************************************
|
|
|
|
|
2012-02-28 14:04:21 +02:00
|
|
|
Copyright (c) 1996, 2012, Oracle and/or its affiliates. All Rights Reserved.
|
2009-05-27 15:15:59 +05:30
|
|
|
|
|
|
|
This program is free software; you can redistribute it and/or modify it under
|
|
|
|
the terms of the GNU General Public License as published by the Free Software
|
|
|
|
Foundation; version 2 of the License.
|
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful, but WITHOUT
|
|
|
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
|
|
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License along with
|
2012-02-28 14:04:21 +02:00
|
|
|
this program; if not, write to the Free Software Foundation, Inc.,
|
|
|
|
51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA
|
2009-05-27 15:15:59 +05:30
|
|
|
|
|
|
|
*****************************************************************************/
|
|
|
|
|
|
|
|
/******************************************************************//**
|
|
|
|
@file include/dict0dict.ic
|
|
|
|
Data dictionary system
|
|
|
|
|
|
|
|
Created 1/8/1996 Heikki Tuuri
|
|
|
|
***********************************************************************/
|
|
|
|
|
|
|
|
#include "data0type.h"
|
|
|
|
#ifndef UNIV_HOTBACKUP
|
|
|
|
#include "dict0load.h"
|
|
|
|
#include "rem0types.h"
|
2011-08-16 18:07:59 -07:00
|
|
|
#include "srv0srv.h"
|
2009-05-27 15:15:59 +05:30
|
|
|
|
Bug#52199 utf32: mbminlen=4, mbmaxlen=4, type->mbminlen=0, type->mbmaxlen=4
Merge and adjust a forgotten change to fix this bug.
rb://393 approved by Jimmy Yang
------------------------------------------------------------------------
r3794 | marko | 2009-01-07 14:14:53 +0000 (Wed, 07 Jan 2009) | 18 lines
branches/6.0: Allow the minimum length of a multi-byte character to be
up to 4 bytes. (Bug #35391)
dtype_t, dict_col_t: Replace mbminlen:2, mbmaxlen:3 with mbminmaxlen:5.
In this way, the 5 bits can hold two values of 0..4, and the storage size
of the fields will not cross the 64-bit boundary. Encode the values as
DATA_MBMAX * mbmaxlen + mbminlen. Define the auxiliary macros
DB_MBMINLEN(mbminmaxlen), DB_MBMAXLEN(mbminmaxlen), and
DB_MINMAXLEN(mbminlen, mbmaxlen).
Try to trim and pad UTF-16 and UTF-32 with spaces as appropriate.
Alexander Barkov suggested the use of cs->cset->fill(cs, buff, len, 0x20).
ha_innobase::store_key_val_for_row() now does that, but the added function
row_mysql_pad_col() does not, because it doesn't have the MySQL TABLE object.
rb://49 approved by Heikki Tuuri
------------------------------------------------------------------------
2010-06-29 14:32:48 +03:00
|
|
|
/*********************************************************************//**
|
|
|
|
Gets the minimum number of bytes per character.
|
|
|
|
@return minimum multi-byte char size, in bytes */
|
|
|
|
UNIV_INLINE
|
|
|
|
ulint
|
|
|
|
dict_col_get_mbminlen(
|
|
|
|
/*==================*/
|
|
|
|
const dict_col_t* col) /*!< in: column */
|
|
|
|
{
|
|
|
|
return(DATA_MBMINLEN(col->mbminmaxlen));
|
|
|
|
}
|
|
|
|
/*********************************************************************//**
|
|
|
|
Gets the maximum number of bytes per character.
|
|
|
|
@return maximum multi-byte char size, in bytes */
|
|
|
|
UNIV_INLINE
|
|
|
|
ulint
|
|
|
|
dict_col_get_mbmaxlen(
|
|
|
|
/*==================*/
|
|
|
|
const dict_col_t* col) /*!< in: column */
|
|
|
|
{
|
|
|
|
return(DATA_MBMAXLEN(col->mbminmaxlen));
|
|
|
|
}
|
|
|
|
/*********************************************************************//**
|
|
|
|
Sets the minimum and maximum number of bytes per character. */
|
|
|
|
UNIV_INLINE
|
|
|
|
void
|
|
|
|
dict_col_set_mbminmaxlen(
|
|
|
|
/*=====================*/
|
|
|
|
dict_col_t* col, /*!< in/out: column */
|
|
|
|
ulint mbminlen, /*!< in: minimum multi-byte
|
|
|
|
character size, in bytes */
|
|
|
|
ulint mbmaxlen) /*!< in: minimum multi-byte
|
|
|
|
character size, in bytes */
|
|
|
|
{
|
|
|
|
ut_ad(mbminlen < DATA_MBMAX);
|
|
|
|
ut_ad(mbmaxlen < DATA_MBMAX);
|
|
|
|
ut_ad(mbminlen <= mbmaxlen);
|
|
|
|
|
|
|
|
col->mbminmaxlen = DATA_MBMINMAXLEN(mbminlen, mbmaxlen);
|
|
|
|
}
|
2009-05-27 15:15:59 +05:30
|
|
|
/*********************************************************************//**
|
|
|
|
Gets the column data type. */
|
|
|
|
UNIV_INLINE
|
|
|
|
void
|
|
|
|
dict_col_copy_type(
|
|
|
|
/*===============*/
|
|
|
|
const dict_col_t* col, /*!< in: column */
|
|
|
|
dtype_t* type) /*!< out: data type */
|
|
|
|
{
|
|
|
|
ut_ad(col && type);
|
|
|
|
|
|
|
|
type->mtype = col->mtype;
|
|
|
|
type->prtype = col->prtype;
|
|
|
|
type->len = col->len;
|
Bug#52199 utf32: mbminlen=4, mbmaxlen=4, type->mbminlen=0, type->mbmaxlen=4
Merge and adjust a forgotten change to fix this bug.
rb://393 approved by Jimmy Yang
------------------------------------------------------------------------
r3794 | marko | 2009-01-07 14:14:53 +0000 (Wed, 07 Jan 2009) | 18 lines
branches/6.0: Allow the minimum length of a multi-byte character to be
up to 4 bytes. (Bug #35391)
dtype_t, dict_col_t: Replace mbminlen:2, mbmaxlen:3 with mbminmaxlen:5.
In this way, the 5 bits can hold two values of 0..4, and the storage size
of the fields will not cross the 64-bit boundary. Encode the values as
DATA_MBMAX * mbmaxlen + mbminlen. Define the auxiliary macros
DB_MBMINLEN(mbminmaxlen), DB_MBMAXLEN(mbminmaxlen), and
DB_MINMAXLEN(mbminlen, mbmaxlen).
Try to trim and pad UTF-16 and UTF-32 with spaces as appropriate.
Alexander Barkov suggested the use of cs->cset->fill(cs, buff, len, 0x20).
ha_innobase::store_key_val_for_row() now does that, but the added function
row_mysql_pad_col() does not, because it doesn't have the MySQL TABLE object.
rb://49 approved by Heikki Tuuri
------------------------------------------------------------------------
2010-06-29 14:32:48 +03:00
|
|
|
type->mbminmaxlen = col->mbminmaxlen;
|
2009-05-27 15:15:59 +05:30
|
|
|
}
|
|
|
|
#endif /* !UNIV_HOTBACKUP */
|
|
|
|
|
|
|
|
#ifdef UNIV_DEBUG
|
|
|
|
/*********************************************************************//**
|
|
|
|
Assert that a column and a data type match.
|
|
|
|
@return TRUE */
|
|
|
|
UNIV_INLINE
|
|
|
|
ibool
|
|
|
|
dict_col_type_assert_equal(
|
|
|
|
/*=======================*/
|
|
|
|
const dict_col_t* col, /*!< in: column */
|
|
|
|
const dtype_t* type) /*!< in: data type */
|
|
|
|
{
|
|
|
|
ut_ad(col);
|
|
|
|
ut_ad(type);
|
|
|
|
|
|
|
|
ut_ad(col->mtype == type->mtype);
|
|
|
|
ut_ad(col->prtype == type->prtype);
|
|
|
|
ut_ad(col->len == type->len);
|
|
|
|
# ifndef UNIV_HOTBACKUP
|
Bug#52199 utf32: mbminlen=4, mbmaxlen=4, type->mbminlen=0, type->mbmaxlen=4
Merge and adjust a forgotten change to fix this bug.
rb://393 approved by Jimmy Yang
------------------------------------------------------------------------
r3794 | marko | 2009-01-07 14:14:53 +0000 (Wed, 07 Jan 2009) | 18 lines
branches/6.0: Allow the minimum length of a multi-byte character to be
up to 4 bytes. (Bug #35391)
dtype_t, dict_col_t: Replace mbminlen:2, mbmaxlen:3 with mbminmaxlen:5.
In this way, the 5 bits can hold two values of 0..4, and the storage size
of the fields will not cross the 64-bit boundary. Encode the values as
DATA_MBMAX * mbmaxlen + mbminlen. Define the auxiliary macros
DB_MBMINLEN(mbminmaxlen), DB_MBMAXLEN(mbminmaxlen), and
DB_MINMAXLEN(mbminlen, mbmaxlen).
Try to trim and pad UTF-16 and UTF-32 with spaces as appropriate.
Alexander Barkov suggested the use of cs->cset->fill(cs, buff, len, 0x20).
ha_innobase::store_key_val_for_row() now does that, but the added function
row_mysql_pad_col() does not, because it doesn't have the MySQL TABLE object.
rb://49 approved by Heikki Tuuri
------------------------------------------------------------------------
2010-06-29 14:32:48 +03:00
|
|
|
ut_ad(col->mbminmaxlen == type->mbminmaxlen);
|
2009-05-27 15:15:59 +05:30
|
|
|
# endif /* !UNIV_HOTBACKUP */
|
|
|
|
|
|
|
|
return(TRUE);
|
|
|
|
}
|
|
|
|
#endif /* UNIV_DEBUG */
|
|
|
|
|
|
|
|
#ifndef UNIV_HOTBACKUP
|
|
|
|
/***********************************************************************//**
|
|
|
|
Returns the minimum size of the column.
|
|
|
|
@return minimum size */
|
|
|
|
UNIV_INLINE
|
|
|
|
ulint
|
|
|
|
dict_col_get_min_size(
|
|
|
|
/*==================*/
|
|
|
|
const dict_col_t* col) /*!< in: column */
|
|
|
|
{
|
|
|
|
return(dtype_get_min_size_low(col->mtype, col->prtype, col->len,
|
Bug#52199 utf32: mbminlen=4, mbmaxlen=4, type->mbminlen=0, type->mbmaxlen=4
Merge and adjust a forgotten change to fix this bug.
rb://393 approved by Jimmy Yang
------------------------------------------------------------------------
r3794 | marko | 2009-01-07 14:14:53 +0000 (Wed, 07 Jan 2009) | 18 lines
branches/6.0: Allow the minimum length of a multi-byte character to be
up to 4 bytes. (Bug #35391)
dtype_t, dict_col_t: Replace mbminlen:2, mbmaxlen:3 with mbminmaxlen:5.
In this way, the 5 bits can hold two values of 0..4, and the storage size
of the fields will not cross the 64-bit boundary. Encode the values as
DATA_MBMAX * mbmaxlen + mbminlen. Define the auxiliary macros
DB_MBMINLEN(mbminmaxlen), DB_MBMAXLEN(mbminmaxlen), and
DB_MINMAXLEN(mbminlen, mbmaxlen).
Try to trim and pad UTF-16 and UTF-32 with spaces as appropriate.
Alexander Barkov suggested the use of cs->cset->fill(cs, buff, len, 0x20).
ha_innobase::store_key_val_for_row() now does that, but the added function
row_mysql_pad_col() does not, because it doesn't have the MySQL TABLE object.
rb://49 approved by Heikki Tuuri
------------------------------------------------------------------------
2010-06-29 14:32:48 +03:00
|
|
|
col->mbminmaxlen));
|
2009-05-27 15:15:59 +05:30
|
|
|
}
|
|
|
|
/***********************************************************************//**
|
|
|
|
Returns the maximum size of the column.
|
|
|
|
@return maximum size */
|
|
|
|
UNIV_INLINE
|
|
|
|
ulint
|
|
|
|
dict_col_get_max_size(
|
|
|
|
/*==================*/
|
|
|
|
const dict_col_t* col) /*!< in: column */
|
|
|
|
{
|
|
|
|
return(dtype_get_max_size_low(col->mtype, col->len));
|
|
|
|
}
|
|
|
|
#endif /* !UNIV_HOTBACKUP */
|
|
|
|
/***********************************************************************//**
|
|
|
|
Returns the size of a fixed size column, 0 if not a fixed size column.
|
|
|
|
@return fixed size, or 0 */
|
|
|
|
UNIV_INLINE
|
|
|
|
ulint
|
|
|
|
dict_col_get_fixed_size(
|
|
|
|
/*====================*/
|
|
|
|
const dict_col_t* col, /*!< in: column */
|
|
|
|
ulint comp) /*!< in: nonzero=ROW_FORMAT=COMPACT */
|
|
|
|
{
|
|
|
|
return(dtype_get_fixed_size_low(col->mtype, col->prtype, col->len,
|
Bug#52199 utf32: mbminlen=4, mbmaxlen=4, type->mbminlen=0, type->mbmaxlen=4
Merge and adjust a forgotten change to fix this bug.
rb://393 approved by Jimmy Yang
------------------------------------------------------------------------
r3794 | marko | 2009-01-07 14:14:53 +0000 (Wed, 07 Jan 2009) | 18 lines
branches/6.0: Allow the minimum length of a multi-byte character to be
up to 4 bytes. (Bug #35391)
dtype_t, dict_col_t: Replace mbminlen:2, mbmaxlen:3 with mbminmaxlen:5.
In this way, the 5 bits can hold two values of 0..4, and the storage size
of the fields will not cross the 64-bit boundary. Encode the values as
DATA_MBMAX * mbmaxlen + mbminlen. Define the auxiliary macros
DB_MBMINLEN(mbminmaxlen), DB_MBMAXLEN(mbminmaxlen), and
DB_MINMAXLEN(mbminlen, mbmaxlen).
Try to trim and pad UTF-16 and UTF-32 with spaces as appropriate.
Alexander Barkov suggested the use of cs->cset->fill(cs, buff, len, 0x20).
ha_innobase::store_key_val_for_row() now does that, but the added function
row_mysql_pad_col() does not, because it doesn't have the MySQL TABLE object.
rb://49 approved by Heikki Tuuri
------------------------------------------------------------------------
2010-06-29 14:32:48 +03:00
|
|
|
col->mbminmaxlen, comp));
|
2009-05-27 15:15:59 +05:30
|
|
|
}
|
|
|
|
/***********************************************************************//**
|
|
|
|
Returns the ROW_FORMAT=REDUNDANT stored SQL NULL size of a column.
|
|
|
|
For fixed length types it is the fixed length of the type, otherwise 0.
|
|
|
|
@return SQL null storage size in ROW_FORMAT=REDUNDANT */
|
|
|
|
UNIV_INLINE
|
|
|
|
ulint
|
|
|
|
dict_col_get_sql_null_size(
|
|
|
|
/*=======================*/
|
|
|
|
const dict_col_t* col, /*!< in: column */
|
|
|
|
ulint comp) /*!< in: nonzero=ROW_FORMAT=COMPACT */
|
|
|
|
{
|
|
|
|
return(dict_col_get_fixed_size(col, comp));
|
|
|
|
}
|
|
|
|
|
|
|
|
/*********************************************************************//**
|
|
|
|
Gets the column number.
|
|
|
|
@return col->ind, table column position (starting from 0) */
|
|
|
|
UNIV_INLINE
|
|
|
|
ulint
|
|
|
|
dict_col_get_no(
|
|
|
|
/*============*/
|
|
|
|
const dict_col_t* col) /*!< in: column */
|
|
|
|
{
|
|
|
|
ut_ad(col);
|
|
|
|
|
|
|
|
return(col->ind);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*********************************************************************//**
|
|
|
|
Gets the column position in the clustered index. */
|
|
|
|
UNIV_INLINE
|
|
|
|
ulint
|
|
|
|
dict_col_get_clust_pos(
|
|
|
|
/*===================*/
|
|
|
|
const dict_col_t* col, /*!< in: table column */
|
|
|
|
const dict_index_t* clust_index) /*!< in: clustered index */
|
|
|
|
{
|
|
|
|
ulint i;
|
|
|
|
|
|
|
|
ut_ad(col);
|
|
|
|
ut_ad(clust_index);
|
|
|
|
ut_ad(dict_index_is_clust(clust_index));
|
|
|
|
|
|
|
|
for (i = 0; i < clust_index->n_def; i++) {
|
|
|
|
const dict_field_t* field = &clust_index->fields[i];
|
|
|
|
|
|
|
|
if (!field->prefix_len && field->col == col) {
|
|
|
|
return(i);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return(ULINT_UNDEFINED);
|
|
|
|
}
|
|
|
|
|
|
|
|
#ifndef UNIV_HOTBACKUP
|
|
|
|
#ifdef UNIV_DEBUG
|
|
|
|
/********************************************************************//**
|
|
|
|
Gets the first index on the table (the clustered index).
|
|
|
|
@return index, NULL if none exists */
|
|
|
|
UNIV_INLINE
|
|
|
|
dict_index_t*
|
|
|
|
dict_table_get_first_index(
|
|
|
|
/*=======================*/
|
|
|
|
const dict_table_t* table) /*!< in: table */
|
|
|
|
{
|
|
|
|
ut_ad(table);
|
|
|
|
ut_ad(table->magic_n == DICT_TABLE_MAGIC_N);
|
|
|
|
|
|
|
|
return(UT_LIST_GET_FIRST(((dict_table_t*) table)->indexes));
|
|
|
|
}
|
|
|
|
|
|
|
|
/********************************************************************//**
|
|
|
|
Gets the next index on the table.
|
|
|
|
@return index, NULL if none left */
|
|
|
|
UNIV_INLINE
|
|
|
|
dict_index_t*
|
|
|
|
dict_table_get_next_index(
|
|
|
|
/*======================*/
|
|
|
|
const dict_index_t* index) /*!< in: index */
|
|
|
|
{
|
|
|
|
ut_ad(index);
|
|
|
|
ut_ad(index->magic_n == DICT_INDEX_MAGIC_N);
|
|
|
|
|
|
|
|
return(UT_LIST_GET_NEXT(indexes, (dict_index_t*) index));
|
|
|
|
}
|
|
|
|
#endif /* UNIV_DEBUG */
|
|
|
|
#endif /* !UNIV_HOTBACKUP */
|
|
|
|
|
|
|
|
/********************************************************************//**
|
|
|
|
Check whether the index is the clustered index.
|
|
|
|
@return nonzero for clustered index, zero for other indexes */
|
|
|
|
UNIV_INLINE
|
|
|
|
ulint
|
|
|
|
dict_index_is_clust(
|
|
|
|
/*================*/
|
|
|
|
const dict_index_t* index) /*!< in: index */
|
|
|
|
{
|
|
|
|
ut_ad(index);
|
|
|
|
ut_ad(index->magic_n == DICT_INDEX_MAGIC_N);
|
|
|
|
|
|
|
|
return(UNIV_UNLIKELY(index->type & DICT_CLUSTERED));
|
|
|
|
}
|
|
|
|
/********************************************************************//**
|
|
|
|
Check whether the index is unique.
|
|
|
|
@return nonzero for unique index, zero for other indexes */
|
|
|
|
UNIV_INLINE
|
|
|
|
ulint
|
|
|
|
dict_index_is_unique(
|
|
|
|
/*=================*/
|
|
|
|
const dict_index_t* index) /*!< in: index */
|
|
|
|
{
|
|
|
|
ut_ad(index);
|
|
|
|
ut_ad(index->magic_n == DICT_INDEX_MAGIC_N);
|
|
|
|
|
|
|
|
return(UNIV_UNLIKELY(index->type & DICT_UNIQUE));
|
|
|
|
}
|
|
|
|
|
|
|
|
/********************************************************************//**
|
|
|
|
Check whether the index is the insert buffer tree.
|
|
|
|
@return nonzero for insert buffer, zero for other indexes */
|
|
|
|
UNIV_INLINE
|
|
|
|
ulint
|
|
|
|
dict_index_is_ibuf(
|
|
|
|
/*===============*/
|
|
|
|
const dict_index_t* index) /*!< in: index */
|
|
|
|
{
|
|
|
|
ut_ad(index);
|
|
|
|
ut_ad(index->magic_n == DICT_INDEX_MAGIC_N);
|
|
|
|
|
|
|
|
return(UNIV_UNLIKELY(index->type & DICT_IBUF));
|
|
|
|
}
|
|
|
|
|
|
|
|
/********************************************************************//**
|
|
|
|
Check whether the index is a secondary index or the insert buffer tree.
|
|
|
|
@return nonzero for insert buffer, zero for other indexes */
|
|
|
|
UNIV_INLINE
|
|
|
|
ulint
|
|
|
|
dict_index_is_sec_or_ibuf(
|
|
|
|
/*======================*/
|
|
|
|
const dict_index_t* index) /*!< in: index */
|
|
|
|
{
|
|
|
|
ulint type;
|
|
|
|
|
|
|
|
ut_ad(index);
|
|
|
|
ut_ad(index->magic_n == DICT_INDEX_MAGIC_N);
|
|
|
|
|
|
|
|
type = index->type;
|
|
|
|
|
|
|
|
return(UNIV_LIKELY(!(type & DICT_CLUSTERED) || (type & DICT_IBUF)));
|
|
|
|
}
|
|
|
|
|
|
|
|
/********************************************************************//**
|
|
|
|
Gets the number of user-defined columns in a table in the dictionary
|
|
|
|
cache.
|
|
|
|
@return number of user-defined (e.g., not ROW_ID) columns of a table */
|
|
|
|
UNIV_INLINE
|
|
|
|
ulint
|
|
|
|
dict_table_get_n_user_cols(
|
|
|
|
/*=======================*/
|
|
|
|
const dict_table_t* table) /*!< in: table */
|
|
|
|
{
|
|
|
|
ut_ad(table);
|
|
|
|
ut_ad(table->magic_n == DICT_TABLE_MAGIC_N);
|
|
|
|
|
|
|
|
return(table->n_cols - DATA_N_SYS_COLS);
|
|
|
|
}
|
|
|
|
|
|
|
|
/********************************************************************//**
|
|
|
|
Gets the number of system columns in a table in the dictionary cache.
|
|
|
|
@return number of system (e.g., ROW_ID) columns of a table */
|
|
|
|
UNIV_INLINE
|
|
|
|
ulint
|
|
|
|
dict_table_get_n_sys_cols(
|
|
|
|
/*======================*/
|
|
|
|
const dict_table_t* table __attribute__((unused))) /*!< in: table */
|
|
|
|
{
|
|
|
|
ut_ad(table);
|
|
|
|
ut_ad(table->magic_n == DICT_TABLE_MAGIC_N);
|
|
|
|
ut_ad(table->cached);
|
|
|
|
|
|
|
|
return(DATA_N_SYS_COLS);
|
|
|
|
}
|
|
|
|
|
|
|
|
/********************************************************************//**
|
|
|
|
Gets the number of all columns (also system) in a table in the dictionary
|
|
|
|
cache.
|
|
|
|
@return number of columns of a table */
|
|
|
|
UNIV_INLINE
|
|
|
|
ulint
|
|
|
|
dict_table_get_n_cols(
|
|
|
|
/*==================*/
|
|
|
|
const dict_table_t* table) /*!< in: table */
|
|
|
|
{
|
|
|
|
ut_ad(table);
|
|
|
|
ut_ad(table->magic_n == DICT_TABLE_MAGIC_N);
|
|
|
|
|
|
|
|
return(table->n_cols);
|
|
|
|
}
|
|
|
|
|
|
|
|
#ifdef UNIV_DEBUG
|
|
|
|
/********************************************************************//**
|
|
|
|
Gets the nth column of a table.
|
|
|
|
@return pointer to column object */
|
|
|
|
UNIV_INLINE
|
|
|
|
dict_col_t*
|
|
|
|
dict_table_get_nth_col(
|
|
|
|
/*===================*/
|
|
|
|
const dict_table_t* table, /*!< in: table */
|
|
|
|
ulint pos) /*!< in: position of column */
|
|
|
|
{
|
|
|
|
ut_ad(table);
|
|
|
|
ut_ad(pos < table->n_def);
|
|
|
|
ut_ad(table->magic_n == DICT_TABLE_MAGIC_N);
|
|
|
|
|
|
|
|
return((dict_col_t*) (table->cols) + pos);
|
|
|
|
}
|
|
|
|
|
|
|
|
/********************************************************************//**
|
|
|
|
Gets the given system column of a table.
|
|
|
|
@return pointer to column object */
|
|
|
|
UNIV_INLINE
|
|
|
|
dict_col_t*
|
|
|
|
dict_table_get_sys_col(
|
|
|
|
/*===================*/
|
|
|
|
const dict_table_t* table, /*!< in: table */
|
|
|
|
ulint sys) /*!< in: DATA_ROW_ID, ... */
|
|
|
|
{
|
|
|
|
dict_col_t* col;
|
|
|
|
|
|
|
|
ut_ad(table);
|
|
|
|
ut_ad(sys < DATA_N_SYS_COLS);
|
|
|
|
ut_ad(table->magic_n == DICT_TABLE_MAGIC_N);
|
|
|
|
|
|
|
|
col = dict_table_get_nth_col(table, table->n_cols
|
|
|
|
- DATA_N_SYS_COLS + sys);
|
|
|
|
ut_ad(col->mtype == DATA_SYS);
|
|
|
|
ut_ad(col->prtype == (sys | DATA_NOT_NULL));
|
|
|
|
|
|
|
|
return(col);
|
|
|
|
}
|
|
|
|
#endif /* UNIV_DEBUG */
|
|
|
|
|
|
|
|
/********************************************************************//**
|
|
|
|
Gets the given system column number of a table.
|
|
|
|
@return column number */
|
|
|
|
UNIV_INLINE
|
|
|
|
ulint
|
|
|
|
dict_table_get_sys_col_no(
|
|
|
|
/*======================*/
|
|
|
|
const dict_table_t* table, /*!< in: table */
|
|
|
|
ulint sys) /*!< in: DATA_ROW_ID, ... */
|
|
|
|
{
|
|
|
|
ut_ad(table);
|
|
|
|
ut_ad(sys < DATA_N_SYS_COLS);
|
|
|
|
ut_ad(table->magic_n == DICT_TABLE_MAGIC_N);
|
|
|
|
|
|
|
|
return(table->n_cols - DATA_N_SYS_COLS + sys);
|
|
|
|
}
|
|
|
|
|
|
|
|
/********************************************************************//**
|
|
|
|
Check whether the table uses the compact page format.
|
|
|
|
@return TRUE if table uses the compact page format */
|
|
|
|
UNIV_INLINE
|
|
|
|
ibool
|
|
|
|
dict_table_is_comp(
|
|
|
|
/*===============*/
|
|
|
|
const dict_table_t* table) /*!< in: table */
|
|
|
|
{
|
|
|
|
ut_ad(table);
|
|
|
|
|
|
|
|
#if DICT_TF_COMPACT != TRUE
|
|
|
|
#error
|
|
|
|
#endif
|
|
|
|
|
|
|
|
return(UNIV_LIKELY(table->flags & DICT_TF_COMPACT));
|
|
|
|
}
|
|
|
|
|
|
|
|
/********************************************************************//**
|
|
|
|
Determine the file format of a table.
|
|
|
|
@return file format version */
|
|
|
|
UNIV_INLINE
|
|
|
|
ulint
|
|
|
|
dict_table_get_format(
|
|
|
|
/*==================*/
|
|
|
|
const dict_table_t* table) /*!< in: table */
|
|
|
|
{
|
|
|
|
ut_ad(table);
|
|
|
|
|
|
|
|
return((table->flags & DICT_TF_FORMAT_MASK) >> DICT_TF_FORMAT_SHIFT);
|
|
|
|
}
|
|
|
|
|
|
|
|
/********************************************************************//**
|
|
|
|
Determine the file format of a table. */
|
|
|
|
UNIV_INLINE
|
|
|
|
void
|
|
|
|
dict_table_set_format(
|
|
|
|
/*==================*/
|
|
|
|
dict_table_t* table, /*!< in/out: table */
|
|
|
|
ulint format) /*!< in: file format version */
|
|
|
|
{
|
|
|
|
ut_ad(table);
|
|
|
|
|
|
|
|
table->flags = (table->flags & ~DICT_TF_FORMAT_MASK)
|
|
|
|
| (format << DICT_TF_FORMAT_SHIFT);
|
|
|
|
}
|
|
|
|
|
|
|
|
/********************************************************************//**
|
|
|
|
Extract the compressed page size from table flags.
|
|
|
|
@return compressed page size, or 0 if not compressed */
|
|
|
|
UNIV_INLINE
|
|
|
|
ulint
|
|
|
|
dict_table_flags_to_zip_size(
|
|
|
|
/*=========================*/
|
|
|
|
ulint flags) /*!< in: flags */
|
|
|
|
{
|
|
|
|
ulint zip_size = flags & DICT_TF_ZSSIZE_MASK;
|
|
|
|
|
|
|
|
if (UNIV_UNLIKELY(zip_size)) {
|
|
|
|
zip_size = ((PAGE_ZIP_MIN_SIZE >> 1)
|
|
|
|
<< (zip_size >> DICT_TF_ZSSIZE_SHIFT));
|
|
|
|
|
|
|
|
ut_ad(zip_size <= UNIV_PAGE_SIZE);
|
|
|
|
}
|
|
|
|
|
|
|
|
return(zip_size);
|
|
|
|
}
|
|
|
|
|
|
|
|
/********************************************************************//**
|
|
|
|
Check whether the table uses the compressed compact page format.
|
|
|
|
@return compressed page size, or 0 if not compressed */
|
|
|
|
UNIV_INLINE
|
|
|
|
ulint
|
|
|
|
dict_table_zip_size(
|
|
|
|
/*================*/
|
|
|
|
const dict_table_t* table) /*!< in: table */
|
|
|
|
{
|
|
|
|
ut_ad(table);
|
|
|
|
|
|
|
|
return(dict_table_flags_to_zip_size(table->flags));
|
|
|
|
}
|
|
|
|
|
WL#6161 Integrating with InnoDB codebase in MySQL 5.5
Changes in the InnoDB codebase required to compile and
integrate the MEB codebase with MySQL 5.5.
@ storage/innobase/btr/btr0btr.c
Excluded buffer pool usage from MEB build.
buf_pool_from_bpage calls are in buf0buf.ic, and
the buffer pool functions from that file are
disabled in MEB.
@ storage/innobase/buf/buf0buf.c
Disabling more buffer pool functions unused in MEB.
@ storage/innobase/dict/dict0dict.c
Disabling dict_ind_free that is unused in MEB.
@ storage/innobase/dict/dict0mem.c
The include
#include "ha_prototypes.h"
Was causing conflicts with definitions in my_global.h
Linking C executable mysqlbackup
libinnodb.a(dict0mem.c.o): In function `dict_mem_foreign_table_name_lookup_set':
dict0mem.c:(.text+0x91c): undefined reference to `innobase_get_lower_case_table_names'
libinnodb.a(dict0mem.c.o): In function `dict_mem_referenced_table_name_lookup_set':
dict0mem.c:(.text+0x9fc): undefined reference to `innobase_get_lower_case_table_names'
libinnodb.a(dict0mem.c.o): In function `dict_mem_foreign_table_name_lookup_set':
dict0mem.c:(.text+0x96e): undefined reference to `innobase_casedn_str'
libinnodb.a(dict0mem.c.o): In function `dict_mem_referenced_table_name_lookup_set':
dict0mem.c:(.text+0xa4e): undefined reference to `innobase_casedn_str'
collect2: ld returned 1 exit status
make[2]: *** [mysqlbackup] Error 1
innobase_get_lower_case_table_names
innobase_casedn_str
are functions that are part of ha_innodb.cc that is not part of the build
dict_mem_foreign_table_name_lookup_set
function is not there in the current codebase, meaning we do not use it in MEB.
@ storage/innobase/fil/fil0fil.c
The srv_fast_shutdown variable is declared in
srv0srv.c that is not compiled in the
mysqlbackup codebase.
This throws an undeclared error.
From the Manual
---------------
innodb_fast_shutdown
--------------------
The InnoDB shutdown mode. The default value is 1
as of MySQL 3.23.50, which causes a “fast� shutdown
(the normal type of shutdown). If the value is 0,
InnoDB does a full purge and an insert buffer merge
before a shutdown. These operations can take minutes,
or even hours in extreme cases. If the value is 1,
InnoDB skips these operations at shutdown.
This ideally does not matter from mysqlbackup
@ storage/innobase/ha/ha0ha.c
In file included from /home/narayanan/mysql-server/mysql-5.5-meb-rel3.8-innodb-integration-1/storage/innobase/ha/ha0ha.c:34:0:
/home/narayanan/mysql-server/mysql-5.5-meb-rel3.8-innodb-integration-1/storage/innobase/include/btr0sea.h:286:17: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘*’ token
make[2]: *** [CMakeFiles/innodb.dir/home/narayanan/mysql-server/mysql-5.5-meb-rel3.8-innodb-integration-1/storage/innobase/ha/ha0ha.c.o] Error 1
make[1]: *** [CMakeFiles/innodb.dir/all] Error 2
make: *** [all] Error 2
# include "sync0rw.h" is excluded from hotbackup compilation in dict0dict.h
This causes extern rw_lock_t* btr_search_latch_temp; to throw a failure because
the definition of rw_lock_t is not found.
@ storage/innobase/include/buf0buf.h
Excluding buffer pool functions that are unused from the
MEB codebase.
@ storage/innobase/include/buf0buf.ic
replicated the exclusion of
#include "buf0flu.h"
#include "buf0lru.h"
#include "buf0rea.h"
by looking at the current codebase in <meb-trunk>/src/innodb
@ storage/innobase/include/dict0dict.h
dict_table_x_lock_indexes, dict_table_x_unlock_indexes, dict_table_is_corrupted,
dict_index_is_corrupted, buf_block_buf_fix_inc_func are unused in MEB and was
leading to compilation errors and hence excluded.
@ storage/innobase/include/dict0dict.ic
dict_table_x_lock_indexes, dict_table_x_unlock_indexes, dict_table_is_corrupted,
dict_index_is_corrupted, buf_block_buf_fix_inc_func are unused in MEB and was
leading to compilation errors and hence excluded.
@ storage/innobase/include/log0log.h
/home/narayanan/mysql-server/mysql-5.5-meb-rel3.8-innodb-integration-1/storage/innobase/include/log0log.h: At top level:
/home/narayanan/mysql-server/mysql-5.5-meb-rel3.8-innodb-integration-1/storage/innobase/include/log0log.h:767:2: error: expected specifier-qualifier-list before â⠂¬Ëœmutex_t’
mutex_t definitions were excluded as seen from ambient code
hence excluding definition for log_flush_order_mutex also.
@ storage/innobase/include/os0file.h
Bug in InnoDB code, create_mode should have been create.
@ storage/innobase/include/srv0srv.h
In file included from /home/narayanan/mysql-server/mysql-5.5-meb-rel3.8-innodb-integration-1/storage/innobase/buf/buf0buf.c:50:0:
/home/narayanan/mysql-server/mysql-5.5-meb-rel3.8-innodb-integration-1/storage/innobase/include/srv0srv.h: At top level:
/home/narayanan/mysql-server/mysql-5.5-meb-rel3.8-innodb-integration-1/storage/innobase/include/srv0srv.h:120:16: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘srv_use_native_aio’
srv_use_native_aio - we do not use native aio of the OS anyway from MEB. MEB does not compile
InnoDB with this option. Hence disabling it.
@ storage/innobase/include/trx0sys.h
[ 56%] Building C object CMakeFiles/innodb.dir/home/narayanan/mysql-server/mysql-5.5-meb-rel3.8-innodb-integration-1/storage/innobase/trx/trx0sys.c.o
/home/narayanan/mysql-server/mysql-5.5-meb-rel3.8-innodb-integration-1/storage/innobase/trx/trx0sys.c: In function ‘trx_sys_read_file_format_id’:
/home/narayanan/mysql-server/mysql-5.5-meb-rel3.8-innodb-integration-1/storage/innobase/trx/trx0sys.c:1499:20: error: ‘TRX_SYS_FILE_FORMAT_TAG_MAGIC_N’ undeclared (first use in this function)
/home/narayanan/mysql-server/mysql-5.5-meb-rel3.8-innodb-integration-1/storage/innobase/trx/trx0sys.c:1499:20: note: each undeclared identifier is reported only once for each function it appears in
/home/narayanan/mysql-server/mysql-5.5-meb-rel3.8-innodb-integration-1/storage/innobase/trx/trx0sys.c: At top level:
/home/narayanan/mysql-server/mysql-5.5-meb-rel3.8-innodb-integration-1/storage/innobase/include/buf0buf.h:607:1: warning: ‘buf_block_buf_fix_inc_func’ declared ‘static’ but never defined
make[2]: *** [CMakeFiles/innodb.dir/home/narayanan/mysql-server/mysql-5.5-meb-rel3.8-innodb-integration-1/storage/innobase/trx/trx0sys.c.o] Error 1
unused calls excluded to enable compilation
@ storage/innobase/mem/mem0dbg.c
excluding #include "ha_prototypes.h" that lead to definitions in ha_innodb.cc
@ storage/innobase/os/os0file.c
InnoDB not compiled with aio support from MEB anyway. Hence excluding this from
the compilation.
@ storage/innobase/page/page0zip.c
page0zip.c:(.text+0x4e9e): undefined reference to `buf_pool_from_block'
collect2: ld returned 1 exit status
buf_pool_from_block defined in buf0buf.ic, most of the file is excluded for compilation of MEB
@ storage/innobase/ut/ut0dbg.c
excluding #include "ha_prototypes.h" since it leads to definitions in ha_innodb.cc
innobase_basename(file) is defined in ha_innodb.cc. Hence excluding that also.
@ storage/innobase/ut/ut0ut.c
cal_tm unused from MEB, was leading to earnings, hence disabling for MEB.
2012-06-07 19:14:26 +05:30
|
|
|
#ifndef UNIV_HOTBACKUP
|
2010-08-13 15:52:11 +03:00
|
|
|
/*********************************************************************//**
|
|
|
|
Obtain exclusive locks on all index trees of the table. This is to prevent
|
|
|
|
accessing index trees while InnoDB is updating internal metadata for
|
|
|
|
operations such as truncate tables. */
|
|
|
|
UNIV_INLINE
|
|
|
|
void
|
|
|
|
dict_table_x_lock_indexes(
|
|
|
|
/*======================*/
|
|
|
|
dict_table_t* table) /*!< in: table */
|
|
|
|
{
|
|
|
|
dict_index_t* index;
|
|
|
|
|
|
|
|
ut_a(table);
|
|
|
|
ut_ad(mutex_own(&(dict_sys->mutex)));
|
|
|
|
|
|
|
|
/* Loop through each index of the table and lock them */
|
|
|
|
for (index = dict_table_get_first_index(table);
|
|
|
|
index != NULL;
|
|
|
|
index = dict_table_get_next_index(index)) {
|
|
|
|
rw_lock_x_lock(dict_index_get_lock(index));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*********************************************************************//**
|
|
|
|
Release the exclusive locks on all index tree. */
|
|
|
|
UNIV_INLINE
|
|
|
|
void
|
|
|
|
dict_table_x_unlock_indexes(
|
|
|
|
/*========================*/
|
|
|
|
dict_table_t* table) /*!< in: table */
|
|
|
|
{
|
|
|
|
dict_index_t* index;
|
|
|
|
|
|
|
|
ut_a(table);
|
|
|
|
ut_ad(mutex_own(&(dict_sys->mutex)));
|
|
|
|
|
|
|
|
for (index = dict_table_get_first_index(table);
|
|
|
|
index != NULL;
|
|
|
|
index = dict_table_get_next_index(index)) {
|
|
|
|
rw_lock_x_unlock(dict_index_get_lock(index));
|
|
|
|
}
|
|
|
|
}
|
WL#6161 Integrating with InnoDB codebase in MySQL 5.5
Changes in the InnoDB codebase required to compile and
integrate the MEB codebase with MySQL 5.5.
@ storage/innobase/btr/btr0btr.c
Excluded buffer pool usage from MEB build.
buf_pool_from_bpage calls are in buf0buf.ic, and
the buffer pool functions from that file are
disabled in MEB.
@ storage/innobase/buf/buf0buf.c
Disabling more buffer pool functions unused in MEB.
@ storage/innobase/dict/dict0dict.c
Disabling dict_ind_free that is unused in MEB.
@ storage/innobase/dict/dict0mem.c
The include
#include "ha_prototypes.h"
Was causing conflicts with definitions in my_global.h
Linking C executable mysqlbackup
libinnodb.a(dict0mem.c.o): In function `dict_mem_foreign_table_name_lookup_set':
dict0mem.c:(.text+0x91c): undefined reference to `innobase_get_lower_case_table_names'
libinnodb.a(dict0mem.c.o): In function `dict_mem_referenced_table_name_lookup_set':
dict0mem.c:(.text+0x9fc): undefined reference to `innobase_get_lower_case_table_names'
libinnodb.a(dict0mem.c.o): In function `dict_mem_foreign_table_name_lookup_set':
dict0mem.c:(.text+0x96e): undefined reference to `innobase_casedn_str'
libinnodb.a(dict0mem.c.o): In function `dict_mem_referenced_table_name_lookup_set':
dict0mem.c:(.text+0xa4e): undefined reference to `innobase_casedn_str'
collect2: ld returned 1 exit status
make[2]: *** [mysqlbackup] Error 1
innobase_get_lower_case_table_names
innobase_casedn_str
are functions that are part of ha_innodb.cc that is not part of the build
dict_mem_foreign_table_name_lookup_set
function is not there in the current codebase, meaning we do not use it in MEB.
@ storage/innobase/fil/fil0fil.c
The srv_fast_shutdown variable is declared in
srv0srv.c that is not compiled in the
mysqlbackup codebase.
This throws an undeclared error.
From the Manual
---------------
innodb_fast_shutdown
--------------------
The InnoDB shutdown mode. The default value is 1
as of MySQL 3.23.50, which causes a “fast� shutdown
(the normal type of shutdown). If the value is 0,
InnoDB does a full purge and an insert buffer merge
before a shutdown. These operations can take minutes,
or even hours in extreme cases. If the value is 1,
InnoDB skips these operations at shutdown.
This ideally does not matter from mysqlbackup
@ storage/innobase/ha/ha0ha.c
In file included from /home/narayanan/mysql-server/mysql-5.5-meb-rel3.8-innodb-integration-1/storage/innobase/ha/ha0ha.c:34:0:
/home/narayanan/mysql-server/mysql-5.5-meb-rel3.8-innodb-integration-1/storage/innobase/include/btr0sea.h:286:17: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘*’ token
make[2]: *** [CMakeFiles/innodb.dir/home/narayanan/mysql-server/mysql-5.5-meb-rel3.8-innodb-integration-1/storage/innobase/ha/ha0ha.c.o] Error 1
make[1]: *** [CMakeFiles/innodb.dir/all] Error 2
make: *** [all] Error 2
# include "sync0rw.h" is excluded from hotbackup compilation in dict0dict.h
This causes extern rw_lock_t* btr_search_latch_temp; to throw a failure because
the definition of rw_lock_t is not found.
@ storage/innobase/include/buf0buf.h
Excluding buffer pool functions that are unused from the
MEB codebase.
@ storage/innobase/include/buf0buf.ic
replicated the exclusion of
#include "buf0flu.h"
#include "buf0lru.h"
#include "buf0rea.h"
by looking at the current codebase in <meb-trunk>/src/innodb
@ storage/innobase/include/dict0dict.h
dict_table_x_lock_indexes, dict_table_x_unlock_indexes, dict_table_is_corrupted,
dict_index_is_corrupted, buf_block_buf_fix_inc_func are unused in MEB and was
leading to compilation errors and hence excluded.
@ storage/innobase/include/dict0dict.ic
dict_table_x_lock_indexes, dict_table_x_unlock_indexes, dict_table_is_corrupted,
dict_index_is_corrupted, buf_block_buf_fix_inc_func are unused in MEB and was
leading to compilation errors and hence excluded.
@ storage/innobase/include/log0log.h
/home/narayanan/mysql-server/mysql-5.5-meb-rel3.8-innodb-integration-1/storage/innobase/include/log0log.h: At top level:
/home/narayanan/mysql-server/mysql-5.5-meb-rel3.8-innodb-integration-1/storage/innobase/include/log0log.h:767:2: error: expected specifier-qualifier-list before â⠂¬Ëœmutex_t’
mutex_t definitions were excluded as seen from ambient code
hence excluding definition for log_flush_order_mutex also.
@ storage/innobase/include/os0file.h
Bug in InnoDB code, create_mode should have been create.
@ storage/innobase/include/srv0srv.h
In file included from /home/narayanan/mysql-server/mysql-5.5-meb-rel3.8-innodb-integration-1/storage/innobase/buf/buf0buf.c:50:0:
/home/narayanan/mysql-server/mysql-5.5-meb-rel3.8-innodb-integration-1/storage/innobase/include/srv0srv.h: At top level:
/home/narayanan/mysql-server/mysql-5.5-meb-rel3.8-innodb-integration-1/storage/innobase/include/srv0srv.h:120:16: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘srv_use_native_aio’
srv_use_native_aio - we do not use native aio of the OS anyway from MEB. MEB does not compile
InnoDB with this option. Hence disabling it.
@ storage/innobase/include/trx0sys.h
[ 56%] Building C object CMakeFiles/innodb.dir/home/narayanan/mysql-server/mysql-5.5-meb-rel3.8-innodb-integration-1/storage/innobase/trx/trx0sys.c.o
/home/narayanan/mysql-server/mysql-5.5-meb-rel3.8-innodb-integration-1/storage/innobase/trx/trx0sys.c: In function ‘trx_sys_read_file_format_id’:
/home/narayanan/mysql-server/mysql-5.5-meb-rel3.8-innodb-integration-1/storage/innobase/trx/trx0sys.c:1499:20: error: ‘TRX_SYS_FILE_FORMAT_TAG_MAGIC_N’ undeclared (first use in this function)
/home/narayanan/mysql-server/mysql-5.5-meb-rel3.8-innodb-integration-1/storage/innobase/trx/trx0sys.c:1499:20: note: each undeclared identifier is reported only once for each function it appears in
/home/narayanan/mysql-server/mysql-5.5-meb-rel3.8-innodb-integration-1/storage/innobase/trx/trx0sys.c: At top level:
/home/narayanan/mysql-server/mysql-5.5-meb-rel3.8-innodb-integration-1/storage/innobase/include/buf0buf.h:607:1: warning: ‘buf_block_buf_fix_inc_func’ declared ‘static’ but never defined
make[2]: *** [CMakeFiles/innodb.dir/home/narayanan/mysql-server/mysql-5.5-meb-rel3.8-innodb-integration-1/storage/innobase/trx/trx0sys.c.o] Error 1
unused calls excluded to enable compilation
@ storage/innobase/mem/mem0dbg.c
excluding #include "ha_prototypes.h" that lead to definitions in ha_innodb.cc
@ storage/innobase/os/os0file.c
InnoDB not compiled with aio support from MEB anyway. Hence excluding this from
the compilation.
@ storage/innobase/page/page0zip.c
page0zip.c:(.text+0x4e9e): undefined reference to `buf_pool_from_block'
collect2: ld returned 1 exit status
buf_pool_from_block defined in buf0buf.ic, most of the file is excluded for compilation of MEB
@ storage/innobase/ut/ut0dbg.c
excluding #include "ha_prototypes.h" since it leads to definitions in ha_innodb.cc
innobase_basename(file) is defined in ha_innodb.cc. Hence excluding that also.
@ storage/innobase/ut/ut0ut.c
cal_tm unused from MEB, was leading to earnings, hence disabling for MEB.
2012-06-07 19:14:26 +05:30
|
|
|
#endif /* !UNIV_HOTBACKUP */
|
2009-05-27 15:15:59 +05:30
|
|
|
/********************************************************************//**
|
|
|
|
Gets the number of fields in the internal representation of an index,
|
|
|
|
including fields added by the dictionary system.
|
|
|
|
@return number of fields */
|
|
|
|
UNIV_INLINE
|
|
|
|
ulint
|
|
|
|
dict_index_get_n_fields(
|
|
|
|
/*====================*/
|
|
|
|
const dict_index_t* index) /*!< in: an internal
|
|
|
|
representation of index (in
|
|
|
|
the dictionary cache) */
|
|
|
|
{
|
|
|
|
ut_ad(index);
|
|
|
|
ut_ad(index->magic_n == DICT_INDEX_MAGIC_N);
|
|
|
|
|
|
|
|
return(index->n_fields);
|
|
|
|
}
|
|
|
|
|
|
|
|
/********************************************************************//**
|
|
|
|
Gets the number of fields in the internal representation of an index
|
|
|
|
that uniquely determine the position of an index entry in the index, if
|
|
|
|
we do not take multiversioning into account: in the B-tree use the value
|
|
|
|
returned by dict_index_get_n_unique_in_tree.
|
|
|
|
@return number of fields */
|
|
|
|
UNIV_INLINE
|
|
|
|
ulint
|
|
|
|
dict_index_get_n_unique(
|
|
|
|
/*====================*/
|
|
|
|
const dict_index_t* index) /*!< in: an internal representation
|
|
|
|
of index (in the dictionary cache) */
|
|
|
|
{
|
|
|
|
ut_ad(index);
|
|
|
|
ut_ad(index->magic_n == DICT_INDEX_MAGIC_N);
|
|
|
|
ut_ad(index->cached);
|
|
|
|
|
|
|
|
return(index->n_uniq);
|
|
|
|
}
|
|
|
|
|
|
|
|
/********************************************************************//**
|
|
|
|
Gets the number of fields in the internal representation of an index
|
|
|
|
which uniquely determine the position of an index entry in the index, if
|
|
|
|
we also take multiversioning into account.
|
|
|
|
@return number of fields */
|
|
|
|
UNIV_INLINE
|
|
|
|
ulint
|
|
|
|
dict_index_get_n_unique_in_tree(
|
|
|
|
/*============================*/
|
|
|
|
const dict_index_t* index) /*!< in: an internal representation
|
|
|
|
of index (in the dictionary cache) */
|
|
|
|
{
|
|
|
|
ut_ad(index);
|
|
|
|
ut_ad(index->magic_n == DICT_INDEX_MAGIC_N);
|
|
|
|
ut_ad(index->cached);
|
|
|
|
|
|
|
|
if (dict_index_is_clust(index)) {
|
|
|
|
|
|
|
|
return(dict_index_get_n_unique(index));
|
|
|
|
}
|
|
|
|
|
|
|
|
return(dict_index_get_n_fields(index));
|
|
|
|
}
|
|
|
|
|
|
|
|
/********************************************************************//**
|
|
|
|
Gets the number of user-defined ordering fields in the index. In the internal
|
|
|
|
representation of clustered indexes we add the row id to the ordering fields
|
|
|
|
to make a clustered index unique, but this function returns the number of
|
|
|
|
fields the user defined in the index as ordering fields.
|
|
|
|
@return number of fields */
|
|
|
|
UNIV_INLINE
|
|
|
|
ulint
|
|
|
|
dict_index_get_n_ordering_defined_by_user(
|
|
|
|
/*======================================*/
|
|
|
|
const dict_index_t* index) /*!< in: an internal representation
|
|
|
|
of index (in the dictionary cache) */
|
|
|
|
{
|
|
|
|
return(index->n_user_defined_cols);
|
|
|
|
}
|
|
|
|
|
|
|
|
#ifdef UNIV_DEBUG
|
|
|
|
/********************************************************************//**
|
|
|
|
Gets the nth field of an index.
|
|
|
|
@return pointer to field object */
|
|
|
|
UNIV_INLINE
|
|
|
|
dict_field_t*
|
|
|
|
dict_index_get_nth_field(
|
|
|
|
/*=====================*/
|
|
|
|
const dict_index_t* index, /*!< in: index */
|
|
|
|
ulint pos) /*!< in: position of field */
|
|
|
|
{
|
|
|
|
ut_ad(index);
|
|
|
|
ut_ad(pos < index->n_def);
|
|
|
|
ut_ad(index->magic_n == DICT_INDEX_MAGIC_N);
|
|
|
|
|
|
|
|
return((dict_field_t*) (index->fields) + pos);
|
|
|
|
}
|
|
|
|
#endif /* UNIV_DEBUG */
|
|
|
|
|
|
|
|
/********************************************************************//**
|
|
|
|
Returns the position of a system column in an index.
|
|
|
|
@return position, ULINT_UNDEFINED if not contained */
|
|
|
|
UNIV_INLINE
|
|
|
|
ulint
|
|
|
|
dict_index_get_sys_col_pos(
|
|
|
|
/*=======================*/
|
|
|
|
const dict_index_t* index, /*!< in: index */
|
|
|
|
ulint type) /*!< in: DATA_ROW_ID, ... */
|
|
|
|
{
|
|
|
|
ut_ad(index);
|
|
|
|
ut_ad(index->magic_n == DICT_INDEX_MAGIC_N);
|
|
|
|
ut_ad(!(index->type & DICT_UNIVERSAL));
|
|
|
|
|
|
|
|
if (dict_index_is_clust(index)) {
|
|
|
|
|
|
|
|
return(dict_col_get_clust_pos(
|
|
|
|
dict_table_get_sys_col(index->table, type),
|
|
|
|
index));
|
|
|
|
}
|
|
|
|
|
|
|
|
return(dict_index_get_nth_col_pos(
|
|
|
|
index, dict_table_get_sys_col_no(index->table, type)));
|
|
|
|
}
|
|
|
|
|
|
|
|
/*********************************************************************//**
|
|
|
|
Gets the field column.
|
|
|
|
@return field->col, pointer to the table column */
|
|
|
|
UNIV_INLINE
|
|
|
|
const dict_col_t*
|
|
|
|
dict_field_get_col(
|
|
|
|
/*===============*/
|
|
|
|
const dict_field_t* field) /*!< in: index field */
|
|
|
|
{
|
|
|
|
ut_ad(field);
|
|
|
|
|
|
|
|
return(field->col);
|
|
|
|
}
|
|
|
|
|
|
|
|
/********************************************************************//**
|
|
|
|
Gets pointer to the nth column in an index.
|
|
|
|
@return column */
|
|
|
|
UNIV_INLINE
|
|
|
|
const dict_col_t*
|
|
|
|
dict_index_get_nth_col(
|
|
|
|
/*===================*/
|
|
|
|
const dict_index_t* index, /*!< in: index */
|
|
|
|
ulint pos) /*!< in: position of the field */
|
|
|
|
{
|
|
|
|
return(dict_field_get_col(dict_index_get_nth_field(index, pos)));
|
|
|
|
}
|
|
|
|
|
|
|
|
/********************************************************************//**
|
|
|
|
Gets the column number the nth field in an index.
|
|
|
|
@return column number */
|
|
|
|
UNIV_INLINE
|
|
|
|
ulint
|
|
|
|
dict_index_get_nth_col_no(
|
|
|
|
/*======================*/
|
|
|
|
const dict_index_t* index, /*!< in: index */
|
|
|
|
ulint pos) /*!< in: position of the field */
|
|
|
|
{
|
|
|
|
return(dict_col_get_no(dict_index_get_nth_col(index, pos)));
|
|
|
|
}
|
|
|
|
|
|
|
|
#ifndef UNIV_HOTBACKUP
|
|
|
|
/********************************************************************//**
|
|
|
|
Returns the minimum data size of an index record.
|
|
|
|
@return minimum data size in bytes */
|
|
|
|
UNIV_INLINE
|
|
|
|
ulint
|
|
|
|
dict_index_get_min_size(
|
|
|
|
/*====================*/
|
|
|
|
const dict_index_t* index) /*!< in: index */
|
|
|
|
{
|
|
|
|
ulint n = dict_index_get_n_fields(index);
|
|
|
|
ulint size = 0;
|
|
|
|
|
|
|
|
while (n--) {
|
|
|
|
size += dict_col_get_min_size(dict_index_get_nth_col(index,
|
|
|
|
n));
|
|
|
|
}
|
|
|
|
|
|
|
|
return(size);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*********************************************************************//**
|
|
|
|
Gets the space id of the root of the index tree.
|
|
|
|
@return space id */
|
|
|
|
UNIV_INLINE
|
|
|
|
ulint
|
|
|
|
dict_index_get_space(
|
|
|
|
/*=================*/
|
|
|
|
const dict_index_t* index) /*!< in: index */
|
|
|
|
{
|
|
|
|
ut_ad(index);
|
|
|
|
ut_ad(index->magic_n == DICT_INDEX_MAGIC_N);
|
|
|
|
|
|
|
|
return(index->space);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*********************************************************************//**
|
|
|
|
Sets the space id of the root of the index tree. */
|
|
|
|
UNIV_INLINE
|
|
|
|
void
|
|
|
|
dict_index_set_space(
|
|
|
|
/*=================*/
|
|
|
|
dict_index_t* index, /*!< in/out: index */
|
|
|
|
ulint space) /*!< in: space id */
|
|
|
|
{
|
|
|
|
ut_ad(index);
|
|
|
|
ut_ad(index->magic_n == DICT_INDEX_MAGIC_N);
|
|
|
|
|
|
|
|
index->space = space;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*********************************************************************//**
|
|
|
|
Gets the page number of the root of the index tree.
|
|
|
|
@return page number */
|
|
|
|
UNIV_INLINE
|
|
|
|
ulint
|
|
|
|
dict_index_get_page(
|
|
|
|
/*================*/
|
|
|
|
const dict_index_t* index) /*!< in: index */
|
|
|
|
{
|
|
|
|
ut_ad(index);
|
|
|
|
ut_ad(index->magic_n == DICT_INDEX_MAGIC_N);
|
|
|
|
|
|
|
|
return(index->page);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*********************************************************************//**
|
|
|
|
Gets the read-write lock of the index tree.
|
|
|
|
@return read-write lock */
|
|
|
|
UNIV_INLINE
|
|
|
|
rw_lock_t*
|
|
|
|
dict_index_get_lock(
|
|
|
|
/*================*/
|
|
|
|
dict_index_t* index) /*!< in: index */
|
|
|
|
{
|
|
|
|
ut_ad(index);
|
|
|
|
ut_ad(index->magic_n == DICT_INDEX_MAGIC_N);
|
|
|
|
|
|
|
|
return(&(index->lock));
|
|
|
|
}
|
|
|
|
|
|
|
|
/********************************************************************//**
|
|
|
|
Returns free space reserved for future updates of records. This is
|
|
|
|
relevant only in the case of many consecutive inserts, as updates
|
|
|
|
which make the records bigger might fragment the index.
|
|
|
|
@return number of free bytes on page, reserved for updates */
|
|
|
|
UNIV_INLINE
|
|
|
|
ulint
|
|
|
|
dict_index_get_space_reserve(void)
|
|
|
|
/*==============================*/
|
|
|
|
{
|
|
|
|
return(UNIV_PAGE_SIZE / 16);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**********************************************************************//**
|
|
|
|
Checks if a table is in the dictionary cache.
|
|
|
|
@return table, NULL if not found */
|
|
|
|
UNIV_INLINE
|
|
|
|
dict_table_t*
|
|
|
|
dict_table_check_if_in_cache_low(
|
|
|
|
/*=============================*/
|
|
|
|
const char* table_name) /*!< in: table name */
|
|
|
|
{
|
|
|
|
dict_table_t* table;
|
|
|
|
ulint table_fold;
|
|
|
|
|
|
|
|
ut_ad(table_name);
|
|
|
|
ut_ad(mutex_own(&(dict_sys->mutex)));
|
|
|
|
|
|
|
|
/* Look for the table name in the hash table */
|
|
|
|
table_fold = ut_fold_string(table_name);
|
|
|
|
|
|
|
|
HASH_SEARCH(name_hash, dict_sys->table_hash, table_fold,
|
|
|
|
dict_table_t*, table, ut_ad(table->cached),
|
|
|
|
!strcmp(table->name, table_name));
|
|
|
|
return(table);
|
|
|
|
}
|
|
|
|
|
2011-02-09 01:15:06 -08:00
|
|
|
/**********************************************************************//**
|
2011-08-16 18:07:59 -07:00
|
|
|
load a table into dictionary cache, ignore any error specified during load;
|
2011-02-09 01:15:06 -08:00
|
|
|
@return table, NULL if not found */
|
|
|
|
UNIV_INLINE
|
|
|
|
dict_table_t*
|
|
|
|
dict_table_get_low_ignore_err(
|
|
|
|
/*==========================*/
|
|
|
|
const char* table_name, /*!< in: table name */
|
|
|
|
dict_err_ignore_t
|
|
|
|
ignore_err) /*!< in: error to be ignored when
|
|
|
|
loading a table definition */
|
|
|
|
{
|
|
|
|
dict_table_t* table;
|
|
|
|
|
|
|
|
ut_ad(table_name);
|
|
|
|
ut_ad(mutex_own(&(dict_sys->mutex)));
|
|
|
|
|
|
|
|
table = dict_table_check_if_in_cache_low(table_name);
|
|
|
|
|
|
|
|
if (table == NULL) {
|
|
|
|
table = dict_load_table(table_name, TRUE, ignore_err);
|
|
|
|
}
|
|
|
|
|
|
|
|
ut_ad(!table || table->cached);
|
|
|
|
|
|
|
|
return(table);
|
|
|
|
}
|
|
|
|
|
2009-05-27 15:15:59 +05:30
|
|
|
/**********************************************************************//**
|
|
|
|
Gets a table; loads it to the dictionary cache if necessary. A low-level
|
|
|
|
function.
|
|
|
|
@return table, NULL if not found */
|
|
|
|
UNIV_INLINE
|
|
|
|
dict_table_t*
|
|
|
|
dict_table_get_low(
|
|
|
|
/*===============*/
|
|
|
|
const char* table_name) /*!< in: table name */
|
|
|
|
{
|
|
|
|
dict_table_t* table;
|
|
|
|
|
|
|
|
ut_ad(table_name);
|
|
|
|
ut_ad(mutex_own(&(dict_sys->mutex)));
|
|
|
|
|
|
|
|
table = dict_table_check_if_in_cache_low(table_name);
|
|
|
|
|
2011-08-16 18:07:59 -07:00
|
|
|
if (table && table->corrupted) {
|
|
|
|
fprintf(stderr, "InnoDB: table");
|
|
|
|
ut_print_name(stderr, NULL, TRUE, table->name);
|
|
|
|
if (srv_load_corrupted) {
|
|
|
|
fputs(" is corrupted, but"
|
|
|
|
" innodb_force_load_corrupted is set\n", stderr);
|
|
|
|
} else {
|
|
|
|
fputs(" is corrupted\n", stderr);
|
|
|
|
return(NULL);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-05-27 15:15:59 +05:30
|
|
|
if (table == NULL) {
|
2011-02-09 01:15:06 -08:00
|
|
|
table = dict_load_table(table_name, TRUE, DICT_ERR_IGNORE_NONE);
|
2009-05-27 15:15:59 +05:30
|
|
|
}
|
|
|
|
|
|
|
|
ut_ad(!table || table->cached);
|
|
|
|
|
|
|
|
return(table);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**********************************************************************//**
|
|
|
|
Returns a table object based on table id.
|
|
|
|
@return table, NULL if does not exist */
|
|
|
|
UNIV_INLINE
|
|
|
|
dict_table_t*
|
|
|
|
dict_table_get_on_id_low(
|
|
|
|
/*=====================*/
|
2010-06-23 14:06:59 +03:00
|
|
|
table_id_t table_id) /*!< in: table id */
|
2009-05-27 15:15:59 +05:30
|
|
|
{
|
|
|
|
dict_table_t* table;
|
|
|
|
ulint fold;
|
|
|
|
|
|
|
|
ut_ad(mutex_own(&(dict_sys->mutex)));
|
|
|
|
|
|
|
|
/* Look for the table name in the hash table */
|
2010-06-23 14:06:59 +03:00
|
|
|
fold = ut_fold_ull(table_id);
|
2009-05-27 15:15:59 +05:30
|
|
|
|
|
|
|
HASH_SEARCH(id_hash, dict_sys->table_id_hash, fold,
|
|
|
|
dict_table_t*, table, ut_ad(table->cached),
|
2010-06-23 14:06:59 +03:00
|
|
|
table->id == table_id);
|
2009-05-27 15:15:59 +05:30
|
|
|
if (table == NULL) {
|
|
|
|
table = dict_load_table_on_id(table_id);
|
|
|
|
}
|
|
|
|
|
|
|
|
ut_ad(!table || table->cached);
|
|
|
|
|
|
|
|
/* TODO: should get the type information from MySQL */
|
|
|
|
|
|
|
|
return(table);
|
|
|
|
}
|
2011-05-31 02:12:32 -07:00
|
|
|
|
|
|
|
/**********************************************************************//**
|
|
|
|
Determine bytes of column prefix to be stored in the undo log. Please
|
|
|
|
note if the table format is UNIV_FORMAT_A (< DICT_TF_FORMAT_ZIP), no prefix
|
|
|
|
needs to be stored in the undo log.
|
|
|
|
@return bytes of column prefix to be stored in the undo log */
|
|
|
|
UNIV_INLINE
|
|
|
|
ulint
|
|
|
|
dict_max_field_len_store_undo(
|
|
|
|
/*==========================*/
|
|
|
|
dict_table_t* table, /*!< in: table */
|
|
|
|
const dict_col_t* col) /*!< in: column which index prefix
|
|
|
|
is based on */
|
|
|
|
{
|
|
|
|
ulint prefix_len = 0;
|
|
|
|
|
|
|
|
if (dict_table_get_format(table) >= DICT_TF_FORMAT_ZIP)
|
|
|
|
{
|
|
|
|
prefix_len = col->max_prefix
|
|
|
|
? col->max_prefix
|
|
|
|
: DICT_MAX_FIELD_LEN_BY_FORMAT(table);
|
|
|
|
}
|
|
|
|
|
|
|
|
return(prefix_len);
|
|
|
|
}
|
|
|
|
|
2011-08-16 18:07:59 -07:00
|
|
|
/********************************************************************//**
|
|
|
|
Check whether the table is corrupted.
|
|
|
|
@return nonzero for corrupted table, zero for valid tables */
|
|
|
|
UNIV_INLINE
|
|
|
|
ulint
|
|
|
|
dict_table_is_corrupted(
|
|
|
|
/*====================*/
|
|
|
|
const dict_table_t* table) /*!< in: table */
|
|
|
|
{
|
|
|
|
ut_ad(table);
|
|
|
|
ut_ad(table->magic_n == DICT_TABLE_MAGIC_N);
|
|
|
|
|
|
|
|
return(UNIV_UNLIKELY(table->corrupted));
|
|
|
|
}
|
|
|
|
|
|
|
|
/********************************************************************//**
|
|
|
|
Check whether the index is corrupted.
|
|
|
|
@return nonzero for corrupted index, zero for valid indexes */
|
|
|
|
UNIV_INLINE
|
|
|
|
ulint
|
|
|
|
dict_index_is_corrupted(
|
|
|
|
/*====================*/
|
|
|
|
const dict_index_t* index) /*!< in: index */
|
|
|
|
{
|
|
|
|
ut_ad(index);
|
|
|
|
ut_ad(index->magic_n == DICT_INDEX_MAGIC_N);
|
|
|
|
|
|
|
|
return(UNIV_UNLIKELY((index->type & DICT_CORRUPT)
|
|
|
|
|| (index->table && index->table->corrupted)));
|
|
|
|
}
|
|
|
|
|
2009-05-27 15:15:59 +05:30
|
|
|
#endif /* !UNIV_HOTBACKUP */
|