diff --git a/mysql-test/main/global_temporary_table.result b/mysql-test/main/global_temporary_table.result index 2fcbaccec1047..4654293fb0647 100644 --- a/mysql-test/main/global_temporary_table.result +++ b/mysql-test/main/global_temporary_table.result @@ -1002,17 +1002,6 @@ create global temporary table t like t1; ERROR HY000: Cannot add foreign key constraint for `GLOBAL TEMPORARY TABLE` drop table t1; drop table t0; -# MDEV-37667 SIGSEGV on ALTER on locked GTT in low memory env -create global temporary table t (t text); -set max_session_mem_used= 8192; -insert t values (0); -ERROR HY000: The MariaDB server is running with the --max-session-mem-used=8192 option so it cannot execute this statement -lock table t write; -alter table t add z int; -ERROR HY000: The MariaDB server is running with the --max-session-mem-used=8192 option so it cannot execute this statement -set max_session_mem_used= default; -drop table t; -unlock tables; # MDEV-37668 SIGSEGV on DROP TABLE GTT under LOCK TABLES and different server_id create global temporary table t (x int) on commit preserve rows as select 1 'a'; create global temporary table t2 (x int key) on commit preserve rows; @@ -1241,22 +1230,6 @@ drop table t; set pseudo_slave_mode=0; Warnings: Warning 1231 Slave applier execution mode not active, statement ineffective. -# MDEV-38480 GTT: Aria gets error HA_ERR_CRASHED_ON_USAGE after TRUNCATE -set autocommit=0; -create global temporary table t (c int) engine=aria; -lock tables t write; -select * from t; -c -set max_session_mem_used=8192; -truncate t; -ERROR HY000: The MariaDB server is running with the --max-session-mem-used=8192 option so it cannot execute this statement -set max_session_mem_used= default; -unlock tables; -select * from t; -c -truncate t; -drop table t; -set autocommit=1; # MDEV-38468 GTT: use-after-free after failed BINLOG event in XA mode create global temporary table t (c int); xa start 'a'; @@ -1322,6 +1295,8 @@ set autocommit=1; create global temporary table t (c int) engine=innodb on commit preserve rows; set session transaction isolation level serializable; flush tables t with read lock; +Warnings: +Warning 1809 Table `test`.`t` in system tablespace insert t values (1); update t set c=c+1; # Cleanup @@ -1351,3 +1326,12 @@ 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. diff --git a/mysql-test/main/global_temporary_table.test b/mysql-test/main/global_temporary_table.test index 96d3aa6fe1ed2..024367ca04918 100644 --- a/mysql-test/main/global_temporary_table.test +++ b/mysql-test/main/global_temporary_table.test @@ -871,20 +871,6 @@ create global temporary table t like t1; drop table t1; drop table t0; ---echo # MDEV-37667 SIGSEGV on ALTER on locked GTT in low memory env ---disable_ps_protocol -create global temporary table t (t text); -set max_session_mem_used= 8192; ---error ER_OPTION_PREVENTS_STATEMENT -insert t values (0); -lock table t write; ---error ER_OPTION_PREVENTS_STATEMENT -alter table t add z int; -set max_session_mem_used= default; -drop table t; -unlock tables; ---enable_ps_protocol - --echo # MDEV-37668 SIGSEGV on DROP TABLE GTT under LOCK TABLES and different server_id create global temporary table t (x int) on commit preserve rows as select 1 'a'; create global temporary table t2 (x int key) on commit preserve rows; @@ -1113,21 +1099,6 @@ commit; drop table t; set pseudo_slave_mode=0; ---echo # MDEV-38480 GTT: Aria gets error HA_ERR_CRASHED_ON_USAGE after TRUNCATE -set autocommit=0; -create global temporary table t (c int) engine=aria; -lock tables t write; -select * from t; -set max_session_mem_used=8192; ---error ER_OPTION_PREVENTS_STATEMENT -truncate t; -set max_session_mem_used= default; -unlock tables; -select * from t; -truncate t; -drop table t; -set autocommit=1; - --echo # MDEV-38468 GTT: use-after-free after failed BINLOG event in XA mode create global temporary table t (c int); xa start 'a'; @@ -1234,3 +1205,16 @@ 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; diff --git a/mysql-test/suite/binlog/r/global_temporary_table.result b/mysql-test/suite/binlog/r/global_temporary_table.result index 5b50d474c5de6..5f246089d9c34 100644 --- a/mysql-test/suite/binlog/r/global_temporary_table.result +++ b/mysql-test/suite/binlog/r/global_temporary_table.result @@ -1005,17 +1005,6 @@ create global temporary table t like t1; ERROR HY000: Cannot add foreign key constraint for `GLOBAL TEMPORARY TABLE` drop table t1; drop table t0; -# MDEV-37667 SIGSEGV on ALTER on locked GTT in low memory env -create global temporary table t (t text); -set max_session_mem_used= 8192; -insert t values (0); -ERROR HY000: The MariaDB server is running with the --max-session-mem-used=8192 option so it cannot execute this statement -lock table t write; -alter table t add z int; -ERROR HY000: The MariaDB server is running with the --max-session-mem-used=8192 option so it cannot execute this statement -set max_session_mem_used= default; -drop table t; -unlock tables; # MDEV-37668 SIGSEGV on DROP TABLE GTT under LOCK TABLES and different server_id create global temporary table t (x int) on commit preserve rows as select 1 'a'; create global temporary table t2 (x int key) on commit preserve rows; @@ -1244,22 +1233,6 @@ drop table t; set pseudo_slave_mode=0; Warnings: Warning 1231 Slave applier execution mode not active, statement ineffective. -# MDEV-38480 GTT: Aria gets error HA_ERR_CRASHED_ON_USAGE after TRUNCATE -set autocommit=0; -create global temporary table t (c int) engine=aria; -lock tables t write; -select * from t; -c -set max_session_mem_used=8192; -truncate t; -ERROR HY000: The MariaDB server is running with the --max-session-mem-used=8192 option so it cannot execute this statement -set max_session_mem_used= default; -unlock tables; -select * from t; -c -truncate t; -drop table t; -set autocommit=1; # MDEV-38468 GTT: use-after-free after failed BINLOG event in XA mode create global temporary table t (c int); xa start 'a'; @@ -1325,6 +1298,8 @@ set autocommit=1; create global temporary table t (c int) engine=innodb on commit preserve rows; set session transaction isolation level serializable; flush tables t with read lock; +Warnings: +Warning 1809 Table `test`.`t` in system tablespace insert t values (1); update t set c=c+1; # Cleanup @@ -1354,6 +1329,15 @@ 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. include/show_binlog_events.inc Log_name Pos Event_type Server_id End_log_pos Info master-bin.000001 # Gtid # # GTID #-#-# @@ -1897,10 +1881,6 @@ master-bin.000001 # Query # # use `test`; DROP TABLE `t1` /* generated by server master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; DROP TABLE `t0` /* generated by server */ master-bin.000001 # Gtid # # GTID #-#-# -master-bin.000001 # Query # # use `test`; create global temporary table t (t text) -master-bin.000001 # Gtid # # GTID #-#-# -master-bin.000001 # Query # # use `test`; DROP TABLE `t` /* generated by server */ -master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; CREATE GLOBAL TEMPORARY TABLE `t` ( `x` int(11) DEFAULT NULL, `a` int(1) NOT NULL @@ -2042,10 +2022,6 @@ master-bin.000001 # Query # # use `test`; create global temporary table t (c int master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; DROP TABLE `t` /* generated by server */ master-bin.000001 # Gtid # # GTID #-#-# -master-bin.000001 # Query # # use `test`; create global temporary table t (c int) engine=aria -master-bin.000001 # Gtid # # GTID #-#-# -master-bin.000001 # Query # # use `test`; DROP TABLE `t` /* generated by server */ -master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; create global temporary table t (c int) master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Query # # use `test`; DROP TABLE `t` /* generated by server */ diff --git a/mysql-test/suite/rpl/r/global_temporary_table.result b/mysql-test/suite/rpl/r/global_temporary_table.result index 084c1be619dd9..fc9dea9b21c96 100644 --- a/mysql-test/suite/rpl/r/global_temporary_table.result +++ b/mysql-test/suite/rpl/r/global_temporary_table.result @@ -1005,17 +1005,6 @@ create global temporary table t like t1; ERROR HY000: Cannot add foreign key constraint for `GLOBAL TEMPORARY TABLE` drop table t1; drop table t0; -# MDEV-37667 SIGSEGV on ALTER on locked GTT in low memory env -create global temporary table t (t text); -set max_session_mem_used= 8192; -insert t values (0); -ERROR HY000: The MariaDB server is running with the --max-session-mem-used=8192 option so it cannot execute this statement -lock table t write; -alter table t add z int; -ERROR HY000: The MariaDB server is running with the --max-session-mem-used=8192 option so it cannot execute this statement -set max_session_mem_used= default; -drop table t; -unlock tables; # MDEV-37668 SIGSEGV on DROP TABLE GTT under LOCK TABLES and different server_id create global temporary table t (x int) on commit preserve rows as select 1 'a'; create global temporary table t2 (x int key) on commit preserve rows; @@ -1244,22 +1233,6 @@ drop table t; set pseudo_slave_mode=0; Warnings: Warning 1231 Slave applier execution mode not active, statement ineffective. -# MDEV-38480 GTT: Aria gets error HA_ERR_CRASHED_ON_USAGE after TRUNCATE -set autocommit=0; -create global temporary table t (c int) engine=aria; -lock tables t write; -select * from t; -c -set max_session_mem_used=8192; -truncate t; -ERROR HY000: The MariaDB server is running with the --max-session-mem-used=8192 option so it cannot execute this statement -set max_session_mem_used= default; -unlock tables; -select * from t; -c -truncate t; -drop table t; -set autocommit=1; # MDEV-38468 GTT: use-after-free after failed BINLOG event in XA mode create global temporary table t (c int); xa start 'a'; @@ -1325,6 +1298,8 @@ set autocommit=1; create global temporary table t (c int) engine=innodb on commit preserve rows; set session transaction isolation level serializable; flush tables t with read lock; +Warnings: +Warning 1809 Table `test`.`t` in system tablespace insert t values (1); update t set c=c+1; # Cleanup @@ -1354,6 +1329,15 @@ 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. connection slave; connection master; set @old_timeout= @@global.lock_wait_timeout; diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 255281ed90e28..92411133bd049 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -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()); diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc index 8b21f28cd2265..900479dc6beaf 100644 --- a/storage/innobase/handler/ha_innodb.cc +++ b/storage/innobase/handler/ha_innodb.cc @@ -11055,15 +11055,17 @@ 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. */ + 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. */ @@ -11086,6 +11088,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); @@ -11096,7 +11099,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"); } @@ -11152,7 +11155,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"); } @@ -11510,7 +11513,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(UNIV_PAGE_SSIZE_MAX), @@ -11531,7 +11535,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) { my_error(ER_NO_INDEX_ON_TEMPORARY, MYF(0), "FULLTEXT", "InnoDB"); DBUG_RETURN(false); @@ -11581,7 +11585,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, @@ -11653,7 +11657,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, @@ -11698,8 +11702,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) { @@ -11929,10 +11933,11 @@ create_table_info_t::set_tablespace_type( /* Ignore the current innodb-file-per-table setting if we are creating a temporary table. */ 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