mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
merge
This commit is contained in:
@ -6303,10 +6303,11 @@ create_clustered_index_when_no_primary(
|
||||
/*****************************************************************//**
|
||||
Return a display name for the row format
|
||||
@return row format name */
|
||||
|
||||
const char *get_row_format_name(
|
||||
/*============================*/
|
||||
enum row_type row_format) /*!< in: Row Format */
|
||||
UNIV_INTERN
|
||||
const char*
|
||||
get_row_format_name(
|
||||
/*================*/
|
||||
enum row_type row_format) /*!< in: Row Format */
|
||||
{
|
||||
switch (row_format) {
|
||||
case ROW_TYPE_COMPACT:
|
||||
@ -6321,12 +6322,38 @@ enum row_type row_format) /*!< in: Row Format */
|
||||
return("DEFAULT");
|
||||
case ROW_TYPE_FIXED:
|
||||
return("FIXED");
|
||||
default:
|
||||
case ROW_TYPE_PAGE:
|
||||
case ROW_TYPE_NOT_USED:
|
||||
break;
|
||||
}
|
||||
return("NOT USED");
|
||||
}
|
||||
|
||||
/** If file-per-table is missing, issue warning and set ret false */
|
||||
#define CHECK_ERROR_ROW_TYPE_NEEDS_FILE_PER_TABLE \
|
||||
if (!srv_file_per_table) { \
|
||||
push_warning_printf( \
|
||||
thd, MYSQL_ERROR::WARN_LEVEL_WARN, \
|
||||
ER_ILLEGAL_HA_CREATE_OPTION, \
|
||||
"InnoDB: ROW_FORMAT=%s requires" \
|
||||
" innodb_file_per_table.", \
|
||||
get_row_format_name(row_format)); \
|
||||
ret = FALSE; \
|
||||
}
|
||||
|
||||
/** If file-format is Antelope, issue warning and set ret false */
|
||||
#define CHECK_ERROR_ROW_TYPE_NEEDS_GT_ANTELOPE \
|
||||
if (srv_file_format < DICT_TF_FORMAT_ZIP) { \
|
||||
push_warning_printf( \
|
||||
thd, MYSQL_ERROR::WARN_LEVEL_WARN, \
|
||||
ER_ILLEGAL_HA_CREATE_OPTION, \
|
||||
"InnoDB: ROW_FORMAT=%s requires" \
|
||||
" innodb_file_format > Antelope.", \
|
||||
get_row_format_name(row_format)); \
|
||||
ret = FALSE; \
|
||||
}
|
||||
|
||||
|
||||
/*****************************************************************//**
|
||||
Validates the create options. We may build on this function
|
||||
in future. For now, it checks two specifiers:
|
||||
@ -6344,7 +6371,7 @@ create_options_are_valid(
|
||||
{
|
||||
ibool kbs_specified = FALSE;
|
||||
ibool ret = TRUE;
|
||||
enum row_type row_type = form->s->row_type;
|
||||
enum row_type row_format = form->s->row_type;
|
||||
|
||||
ut_ad(thd != NULL);
|
||||
|
||||
@ -6353,23 +6380,6 @@ create_options_are_valid(
|
||||
return(TRUE);
|
||||
}
|
||||
|
||||
/* Check for a valid Innodb ROW_FORMAT specifier. For example,
|
||||
ROW_TYPE_FIXED can be sent to Innodb */
|
||||
switch (row_type) {
|
||||
case ROW_TYPE_COMPACT:
|
||||
case ROW_TYPE_COMPRESSED:
|
||||
case ROW_TYPE_DYNAMIC:
|
||||
case ROW_TYPE_REDUNDANT:
|
||||
case ROW_TYPE_DEFAULT:
|
||||
break;
|
||||
default:
|
||||
push_warning(
|
||||
thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_ILLEGAL_HA_CREATE_OPTION,
|
||||
"InnoDB: invalid ROW_FORMAT specifier.");
|
||||
ret = FALSE;
|
||||
}
|
||||
|
||||
ut_ad(form != NULL);
|
||||
ut_ad(create_info != NULL);
|
||||
|
||||
@ -6382,7 +6392,23 @@ create_options_are_valid(
|
||||
case 4:
|
||||
case 8:
|
||||
case 16:
|
||||
/* Valid value. */
|
||||
/* Valid KEY_BLOCK_SIZE, check its dependencies. */
|
||||
if (!srv_file_per_table) {
|
||||
push_warning(
|
||||
thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_ILLEGAL_HA_CREATE_OPTION,
|
||||
"InnoDB: KEY_BLOCK_SIZE requires"
|
||||
" innodb_file_per_table.");
|
||||
ret = FALSE;
|
||||
}
|
||||
if (srv_file_format < DICT_TF_FORMAT_ZIP) {
|
||||
push_warning(
|
||||
thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_ILLEGAL_HA_CREATE_OPTION,
|
||||
"InnoDB: KEY_BLOCK_SIZE requires"
|
||||
" innodb_file_format > Antelope.");
|
||||
ret = FALSE;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
push_warning_printf(
|
||||
@ -6392,72 +6418,43 @@ create_options_are_valid(
|
||||
" Valid values are [1, 2, 4, 8, 16]",
|
||||
create_info->key_block_size);
|
||||
ret = FALSE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* If KEY_BLOCK_SIZE was specified, check for its
|
||||
dependencies. */
|
||||
if (kbs_specified && !srv_file_per_table) {
|
||||
push_warning(
|
||||
thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_ILLEGAL_HA_CREATE_OPTION,
|
||||
"InnoDB: KEY_BLOCK_SIZE"
|
||||
" requires innodb_file_per_table.");
|
||||
ret = FALSE;
|
||||
}
|
||||
|
||||
if (kbs_specified && srv_file_format < DICT_TF_FORMAT_ZIP) {
|
||||
push_warning(
|
||||
thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_ILLEGAL_HA_CREATE_OPTION,
|
||||
"InnoDB: KEY_BLOCK_SIZE requires"
|
||||
" innodb_file_format > Antelope.");
|
||||
ret = FALSE;
|
||||
}
|
||||
|
||||
switch (row_type) {
|
||||
/* Check for a valid Innodb ROW_FORMAT specifier and
|
||||
other incompatibilities. */
|
||||
switch (row_format) {
|
||||
case ROW_TYPE_COMPRESSED:
|
||||
case ROW_TYPE_DYNAMIC:
|
||||
/* These two ROW_FORMATs require srv_file_per_table
|
||||
and srv_file_format > Antelope */
|
||||
if (!srv_file_per_table) {
|
||||
push_warning_printf(
|
||||
thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_ILLEGAL_HA_CREATE_OPTION,
|
||||
"InnoDB: ROW_FORMAT=%s"
|
||||
" requires innodb_file_per_table.",
|
||||
get_row_format_name(row_type));
|
||||
ret = FALSE;
|
||||
}
|
||||
|
||||
if (srv_file_format < DICT_TF_FORMAT_ZIP) {
|
||||
push_warning_printf(
|
||||
thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_ILLEGAL_HA_CREATE_OPTION,
|
||||
"InnoDB: ROW_FORMAT=%s requires"
|
||||
" innodb_file_format > Antelope.",
|
||||
get_row_format_name(row_type));
|
||||
ret = FALSE;
|
||||
}
|
||||
default:
|
||||
CHECK_ERROR_ROW_TYPE_NEEDS_FILE_PER_TABLE;
|
||||
CHECK_ERROR_ROW_TYPE_NEEDS_GT_ANTELOPE;
|
||||
break;
|
||||
}
|
||||
|
||||
switch (row_type) {
|
||||
case ROW_TYPE_REDUNDANT:
|
||||
case ROW_TYPE_COMPACT:
|
||||
case ROW_TYPE_DYNAMIC:
|
||||
/* KEY_BLOCK_SIZE is only allowed with Compressed or Default */
|
||||
CHECK_ERROR_ROW_TYPE_NEEDS_FILE_PER_TABLE;
|
||||
CHECK_ERROR_ROW_TYPE_NEEDS_GT_ANTELOPE;
|
||||
/* fall through since dynamic also shuns KBS */
|
||||
case ROW_TYPE_COMPACT:
|
||||
case ROW_TYPE_REDUNDANT:
|
||||
if (kbs_specified) {
|
||||
push_warning_printf(
|
||||
thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_ILLEGAL_HA_CREATE_OPTION,
|
||||
"InnoDB: cannot specify ROW_FORMAT = %s"
|
||||
" with KEY_BLOCK_SIZE.",
|
||||
get_row_format_name(row_type));
|
||||
ret = FALSE;
|
||||
get_row_format_name(row_format));
|
||||
ret = FALSE;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
case ROW_TYPE_DEFAULT:
|
||||
break;
|
||||
case ROW_TYPE_FIXED:
|
||||
case ROW_TYPE_PAGE:
|
||||
case ROW_TYPE_NOT_USED:
|
||||
push_warning(
|
||||
thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_ILLEGAL_HA_CREATE_OPTION, \
|
||||
"InnoDB: invalid ROW_FORMAT specifier.");
|
||||
ret = FALSE;
|
||||
break;
|
||||
}
|
||||
|
||||
@ -6508,7 +6505,7 @@ ha_innobase::create(
|
||||
const ulint file_format = srv_file_format;
|
||||
const char* stmt;
|
||||
size_t stmt_len;
|
||||
enum row_type row_type;
|
||||
enum row_type row_format;
|
||||
|
||||
DBUG_ENTER("ha_innobase::create");
|
||||
|
||||
@ -6608,8 +6605,8 @@ ha_innobase::create(
|
||||
push_warning(
|
||||
thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_ILLEGAL_HA_CREATE_OPTION,
|
||||
"InnoDB: KEY_BLOCK_SIZE"
|
||||
" requires innodb_file_per_table.");
|
||||
"InnoDB: KEY_BLOCK_SIZE requires"
|
||||
" innodb_file_per_table.");
|
||||
flags = 0;
|
||||
}
|
||||
|
||||
@ -6626,20 +6623,19 @@ ha_innobase::create(
|
||||
push_warning_printf(
|
||||
thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_ILLEGAL_HA_CREATE_OPTION,
|
||||
"InnoDB: ignoring"
|
||||
" KEY_BLOCK_SIZE=%lu.",
|
||||
"InnoDB: ignoring KEY_BLOCK_SIZE=%lu.",
|
||||
create_info->key_block_size);
|
||||
}
|
||||
}
|
||||
|
||||
row_type = form->s->row_type;
|
||||
row_format = form->s->row_type;
|
||||
|
||||
if (flags) {
|
||||
/* if ROW_FORMAT is set to default,
|
||||
automatically change it to COMPRESSED.*/
|
||||
if (row_type == ROW_TYPE_DEFAULT) {
|
||||
row_type = ROW_TYPE_COMPRESSED;
|
||||
} else if (row_type != ROW_TYPE_COMPRESSED) {
|
||||
if (row_format == ROW_TYPE_DEFAULT) {
|
||||
row_format = ROW_TYPE_COMPRESSED;
|
||||
} else if (row_format != ROW_TYPE_COMPRESSED) {
|
||||
/* ROW_FORMAT other than COMPRESSED
|
||||
ignores KEY_BLOCK_SIZE. It does not
|
||||
make sense to reject conflicting
|
||||
@ -6656,7 +6652,7 @@ ha_innobase::create(
|
||||
}
|
||||
} else {
|
||||
/* flags == 0 means no KEY_BLOCK_SIZE.*/
|
||||
if (row_type == ROW_TYPE_COMPRESSED) {
|
||||
if (row_format == ROW_TYPE_COMPRESSED) {
|
||||
/* ROW_FORMAT=COMPRESSED without
|
||||
KEY_BLOCK_SIZE implies half the
|
||||
maximum KEY_BLOCK_SIZE. */
|
||||
@ -6671,7 +6667,7 @@ ha_innobase::create(
|
||||
}
|
||||
}
|
||||
|
||||
switch (row_type) {
|
||||
switch (row_format) {
|
||||
case ROW_TYPE_REDUNDANT:
|
||||
break;
|
||||
case ROW_TYPE_COMPRESSED:
|
||||
@ -6682,25 +6678,25 @@ ha_innobase::create(
|
||||
ER_ILLEGAL_HA_CREATE_OPTION,
|
||||
"InnoDB: ROW_FORMAT=%s requires"
|
||||
" innodb_file_per_table.",
|
||||
get_row_format_name(row_type));
|
||||
get_row_format_name(row_format));
|
||||
} else if (file_format < DICT_TF_FORMAT_ZIP) {
|
||||
push_warning_printf(
|
||||
thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_ILLEGAL_HA_CREATE_OPTION,
|
||||
"InnoDB: ROW_FORMAT=%s requires"
|
||||
" innodb_file_format > Antelope.",
|
||||
get_row_format_name(row_type));
|
||||
get_row_format_name(row_format));
|
||||
} else {
|
||||
flags |= DICT_TF_COMPACT
|
||||
| (DICT_TF_FORMAT_ZIP
|
||||
<< DICT_TF_FORMAT_SHIFT);
|
||||
| (DICT_TF_FORMAT_ZIP
|
||||
<< DICT_TF_FORMAT_SHIFT);
|
||||
break;
|
||||
}
|
||||
|
||||
/* fall through */
|
||||
case ROW_TYPE_NOT_USED:
|
||||
case ROW_TYPE_FIXED:
|
||||
default:
|
||||
case ROW_TYPE_PAGE:
|
||||
push_warning(
|
||||
thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_ILLEGAL_HA_CREATE_OPTION,
|
||||
@ -6818,23 +6814,25 @@ ha_innobase::create(
|
||||
setup at this stage and so we use thd. */
|
||||
|
||||
/* We need to copy the AUTOINC value from the old table if
|
||||
this is an ALTER TABLE or CREATE INDEX because CREATE INDEX
|
||||
does a table copy too. */
|
||||
this is an ALTER|OPTIMIZE TABLE or CREATE INDEX because CREATE INDEX
|
||||
does a table copy too. If query was one of :
|
||||
|
||||
CREATE TABLE ...AUTO_INCREMENT = x; or
|
||||
ALTER TABLE...AUTO_INCREMENT = x; or
|
||||
OPTIMIZE TABLE t; or
|
||||
CREATE INDEX x on t(...);
|
||||
|
||||
Find out a table definition from the dictionary and get
|
||||
the current value of the auto increment field. Set a new
|
||||
value to the auto increment field if the value is greater
|
||||
than the maximum value in the column. */
|
||||
|
||||
if (((create_info->used_fields & HA_CREATE_USED_AUTO)
|
||||
|| thd_sql_command(thd) == SQLCOM_ALTER_TABLE
|
||||
|| thd_sql_command(thd) == SQLCOM_OPTIMIZE
|
||||
|| thd_sql_command(thd) == SQLCOM_CREATE_INDEX)
|
||||
&& create_info->auto_increment_value > 0) {
|
||||
|
||||
/* Query was one of :
|
||||
CREATE TABLE ...AUTO_INCREMENT = x; or
|
||||
ALTER TABLE...AUTO_INCREMENT = x; or
|
||||
CREATE INDEX x on t(...);
|
||||
Find out a table definition from the dictionary and get
|
||||
the current value of the auto increment field. Set a new
|
||||
value to the auto increment field if the value is greater
|
||||
than the maximum value in the column. */
|
||||
|
||||
auto_inc_value = create_info->auto_increment_value;
|
||||
|
||||
dict_table_autoinc_lock(innobase_table);
|
||||
|
Reference in New Issue
Block a user