Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions mysql-test/main/global_temporary_table.result
Original file line number Diff line number Diff line change
Expand Up @@ -1351,3 +1351,14 @@ ERROR HY000: 'mysql.help_topic' is not of type 'BASE TABLE'
drop table mysql.help_topic;
rename table mysql.help_topic1 to mysql.help_topic;
disconnect con1;
# MDEV-40167 - GTT created with the InnoDB incorrectly accept FULLTEXT/VECTOR indexes
CREATE GLOBAL TEMPORARY TABLE gtt (id INT PRIMARY KEY, body TEXT, FULLTEXT (body))
ENGINE=InnoDB ON COMMIT PRESERVE ROWS;
ERROR HY000: Cannot create FULLTEXT index on temporary InnoDB table
CREATE GLOBAL TEMPORARY TABLE gtt_v (id INT PRIMARY KEY, v VECTOR (4) NOT NULL, VECTOR INDEX (v))
ENGINE=InnoDB ON COMMIT PRESERVE ROWS;
ERROR HY000: Cannot create VECTOR index on temporary InnoDB table
CREATE GLOBAL TEMPORARY TABLE gtt (id INT ) ENGINE=InnoDB ROW_FORMAT=COMPRESSED ON COMMIT PRESERVE ROWS;
ERROR HY000: InnoDB refuses to write tables with ROW_FORMAT=COMPRESSED or KEY_BLOCK_SIZE.
CREATE GLOBAL TEMPORARY TABLE g (id INT PRIMARY KEY) ENGINE=InnoDB DATA DIRECTORY='/tmp' ON COMMIT PRESERVE ROWS;
ERROR HY000: Can't create table `test`.`g` (errno: 140 "Wrong create options")
16 changes: 16 additions & 0 deletions mysql-test/main/global_temporary_table.test
Original file line number Diff line number Diff line change
Expand Up @@ -1234,3 +1234,19 @@ drop table mysql.help_topic;
rename table mysql.help_topic1 to mysql.help_topic;

--disconnect con1

--echo # MDEV-40167 - GTT created with the InnoDB incorrectly accept FULLTEXT/VECTOR indexes

--error ER_NO_INDEX_ON_TEMPORARY
CREATE GLOBAL TEMPORARY TABLE gtt (id INT PRIMARY KEY, body TEXT, FULLTEXT (body))
ENGINE=InnoDB ON COMMIT PRESERVE ROWS;

--error ER_NO_INDEX_ON_TEMPORARY
CREATE GLOBAL TEMPORARY TABLE gtt_v (id INT PRIMARY KEY, v VECTOR (4) NOT NULL, VECTOR INDEX (v))
ENGINE=InnoDB ON COMMIT PRESERVE ROWS;

--error ER_UNSUPPORTED_COMPRESSED_TABLE
CREATE GLOBAL TEMPORARY TABLE gtt (id INT ) ENGINE=InnoDB ROW_FORMAT=COMPRESSED ON COMMIT PRESERVE ROWS;

--error ER_CANT_CREATE_TABLE
CREATE GLOBAL TEMPORARY TABLE g (id INT PRIMARY KEY) ENGINE=InnoDB DATA DIRECTORY='/tmp' ON COMMIT PRESERVE ROWS;
2 changes: 1 addition & 1 deletion sql/sql_table.cc
Original file line number Diff line number Diff line change
Expand Up @@ -3778,7 +3778,7 @@ mysql_prepare_create_table_finalize(THD *thd, HA_CREATE_INFO *create_info,
my_error(ER_INDEX_CANNOT_HAVE_NULL, MYF(0), "VECTOR");
DBUG_RETURN(TRUE);
}
if (create_info->tmp_table())
if (create_info->tmp_table() || create_info->global_tmp_table())
{
my_error(ER_NO_INDEX_ON_TEMPORARY, MYF(0), "VECTOR",
file->table_type());
Expand Down
46 changes: 25 additions & 21 deletions storage/innobase/handler/ha_innodb.cc
Original file line number Diff line number Diff line change
Expand Up @@ -11055,15 +11055,16 @@ create_table_info_t::create_option_data_directory_is_valid()
is_valid = false;
}

/* Do not use DATA DIRECTORY with TEMPORARY TABLE. */
if (m_create_info->tmp_table()) {
push_warning(
m_thd, Sql_condition::WARN_LEVEL_WARN,
ER_ILLEGAL_HA_CREATE_OPTION,
"InnoDB: DATA DIRECTORY cannot be used"
" for TEMPORARY tables.");
is_valid = false;
}
/* Do not use DATA DIRECTORY with TEMPORARY TABLE or
GLOBAL TEMPORARY TABLE. */
Comment thread
FooBarrior marked this conversation as resolved.
if (m_create_info->tmp_table() || m_create_info->global_tmp_table()) {
push_warning_printf(
m_thd, Sql_condition::WARN_LEVEL_WARN,
ER_ILLEGAL_HA_CREATE_OPTION,
"InnoDB: DATA DIRECTORY cannot be used for %s tables.",
m_create_info->global_tmp_table() ? "GLOBAL TEMPORARY" : "TEMPORARY");
is_valid = false;
}

/* We check for a DATA DIRECTORY mixed with TABLESPACE in
create_option_tablespace_is_valid(), no need to here. */
Expand All @@ -11086,6 +11087,7 @@ create_table_info_t::create_options_are_invalid()
const char* ret = NULL;
enum row_type row_format = m_create_info->row_type;
const bool is_temp = m_create_info->tmp_table();
const bool is_global_temp = m_create_info->global_tmp_table();

ut_ad(m_thd != NULL);

Expand All @@ -11096,7 +11098,7 @@ create_table_info_t::create_options_are_invalid()

/* Check if a non-zero KEY_BLOCK_SIZE was specified. */
if (has_key_block_size) {
if (is_temp || innodb_read_only_compressed) {
if (is_temp || is_global_temp || innodb_read_only_compressed) {
my_error(ER_UNSUPPORTED_COMPRESSED_TABLE, MYF(0));
return("KEY_BLOCK_SIZE");
}
Expand Down Expand Up @@ -11152,7 +11154,7 @@ create_table_info_t::create_options_are_invalid()
other incompatibilities. */
switch (row_format) {
case ROW_TYPE_COMPRESSED:
if (is_temp || innodb_read_only_compressed) {
if (is_temp || is_global_temp || innodb_read_only_compressed) {
my_error(ER_UNSUPPORTED_COMPRESSED_TABLE, MYF(0));
return("ROW_FORMAT");
}
Expand Down Expand Up @@ -11510,7 +11512,8 @@ bool create_table_info_t::innobase_table_flags()
rec_format_t innodb_row_format =
get_row_format(m_default_row_format);
const bool is_temp = m_create_info->tmp_table();
bool zip_allowed = !is_temp;
const bool is_global_temp = m_create_info->global_tmp_table();
bool zip_allowed = !is_temp && !is_global_temp;

const ulint zip_ssize_max =
ut_min(static_cast<ulint>(UNIV_PAGE_SSIZE_MAX),
Expand All @@ -11531,7 +11534,7 @@ bool create_table_info_t::innobase_table_flags()

/* We don't support FTS indexes in temporary
tables. */
if (is_temp) {
if (is_temp || is_global_temp) {
Comment thread
pranavktiwari marked this conversation as resolved.
my_error(ER_NO_INDEX_ON_TEMPORARY, MYF(0),
"FULLTEXT", "InnoDB");
DBUG_RETURN(false);
Expand Down Expand Up @@ -11581,7 +11584,7 @@ bool create_table_info_t::innobase_table_flags()
}

/* Make sure compressed row format is allowed. */
if (is_temp) {
if (is_temp || is_global_temp) {
push_warning(
m_thd, Sql_condition::WARN_LEVEL_WARN,
ER_ILLEGAL_HA_CREATE_OPTION,
Expand Down Expand Up @@ -11653,7 +11656,7 @@ bool create_table_info_t::innobase_table_flags()
innodb_row_format = REC_FORMAT_COMPACT;
break;
case ROW_TYPE_COMPRESSED:
if (is_temp) {
if (is_temp || is_global_temp) {
push_warning_printf(
m_thd, Sql_condition::WARN_LEVEL_WARN,
ER_ILLEGAL_HA_CREATE_OPTION,
Expand Down Expand Up @@ -11698,8 +11701,8 @@ bool create_table_info_t::innobase_table_flags()
zip_allowed = false;
}

ut_ad(!is_temp || !zip_allowed);
ut_ad(!is_temp || innodb_row_format != REC_FORMAT_COMPRESSED);
ut_ad(!(is_temp || is_global_temp) || !zip_allowed);
ut_ad(!(is_temp || is_global_temp) || innodb_row_format != REC_FORMAT_COMPRESSED);

/* Set the table flags */
if (!zip_allowed) {
Expand Down Expand Up @@ -11926,13 +11929,14 @@ create_table_info_t::set_tablespace_type(
m_innodb_file_per_table
|| table_being_altered_is_file_per_table;

/* Ignore the current innodb-file-per-table setting if we are
creating a temporary table. */
/* Ignore the current innodb-file-per-table setting if we are
creating a temporary table (local or global). */
m_use_file_per_table = m_allow_file_per_table
&& !m_create_info->tmp_table();
&& !m_create_info->tmp_table()
&& !m_create_info->global_tmp_table();

/* DATA DIRECTORY must have m_use_file_per_table but cannot be
used with TEMPORARY tables. */
used with TEMPORARY tables and global temporary tables. */
m_use_data_dir =
m_use_file_per_table
&& m_create_info->data_file_name
Expand Down