mariadb/sql/datadict.cc

192 lines
5.2 KiB
C++
Raw Normal View History

Bug#42643: InnoDB does not support replication of TRUNCATE TABLE The problem was that TRUNCATE TABLE didn't take a exclusive lock on a table if it resorted to truncating via delete of all rows in the table. Specifically for InnoDB tables, this could break proper isolation as InnoDB ends up aborting some granted locks when truncating a table. The solution is to take a exclusive metadata lock before TRUNCATE TABLE can proceed. This guarantees that no other transaction is using the table. Incompatible change: Truncate via delete no longer fails if sql_safe_updates is activated (this was a undocumented side effect). libmysqld/CMakeLists.txt: Add new files to the build list. libmysqld/Makefile.am: Add new files to the build list. mysql-test/extra/binlog_tests/binlog_truncate.test: Add test case for Bug#42643 mysql-test/include/mix1.inc: Update test case as TRUNCATE TABLE now grabs a exclusive lock. Ensure that TRUNCATE waits for granted locks on the table. mysql-test/suite/binlog/t/binlog_truncate_innodb.test: As with other data modifying statements, TRUNCATE is still not possible in a transaction with isolation level READ COMMITTED or READ UNCOMMITED. It would be possible to implement so, but it is not worth the effort. mysql-test/suite/binlog/t/binlog_truncate_myisam.test: Test under different binlog formats. mysql-test/suite/binlog/t/disabled.def: Re-enable test case. mysql-test/t/innodb_bug38231.test: Truncate no longer works with row-level locks. mysql-test/t/mdl_sync.test: Ensure that a acquired lock is not given up due to a conflict. mysql-test/t/partition_innodb_semi_consistent.test: End transaction as to release metadata locks. mysql-test/t/truncate.test: A metadata lock is now taken before the object is verified. sql/CMakeLists.txt: Add new files to the build list. sql/Makefile.am: Add new files to the build list. sql/datadict.cc: Introduce a new file specific for data dictionary operations. sql/datadict.h: Add header file. sql/sql_base.cc: Rename data dictionary function. sql/sql_bitmap.h: Include dependency. sql/sql_delete.cc: Move away from relying on mysql_delete() to delete all rows of a table. Thus, move any bits related to truncate to sql_truncate.cc sql/sql_delete.h: Remove parameter. sql/sql_parse.cc: Add protection against the global read lock -- a intention exclusive lock can be acquired in the truncate path. sql/sql_show.cc: Add sync point for testing scenarios where a pending flush is ignored. sql/sql_truncate.cc: Acquire a shared metadata lock before accessing table metadata. Upgrade the lock to a exclusive one if the table can be re-created. Rework binlog rules to better reflect the requirements. sql/sql_yacc.yy: Set appropriate lock types for table to be truncated. sql/table.h: Move to data dictionary header.
2010-05-25 17:01:38 -03:00
/* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
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 this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
MDEV-5120 Test suite test maria-no-logging fails The reason for the failure was a bug in an include file on debian that causes 'struct stat' to have different sized depending on the environment. This patch fixes so that we always include my_global.h or my_config.h before we include any other files. Other things: - Removed #include <my_global.h> in some include files; Better to always do this at the top level to have as few "always-include-this-file-first' files as possible. - Removed usage of some include files that where already included by my_global.h or by other files. client/mysql_plugin.c: Use my_global.h first client/mysqlslap.c: Remove duplicated include files extra/comp_err.c: Remove duplicated include files include/m_string.h: Remove duplicated include files include/maria.h: Remove duplicated include files libmysqld/emb_qcache.cc: Use my_global.h first plugin/semisync/semisync.h: Use my_pthread.h first sql/datadict.cc: Use my_global.h first sql/debug_sync.cc: Use my_global.h first sql/derror.cc: Use my_global.h first sql/des_key_file.cc: Use my_global.h first sql/discover.cc: Use my_global.h first sql/event_data_objects.cc: Use my_global.h first sql/event_db_repository.cc: Use my_global.h first sql/event_parse_data.cc: Use my_global.h first sql/event_queue.cc: Use my_global.h first sql/event_scheduler.cc: Use my_global.h first sql/events.cc: Use my_global.h first sql/field.cc: Use my_global.h first Remove duplicated include files sql/field_conv.cc: Use my_global.h first sql/filesort.cc: Use my_global.h first Remove duplicated include files sql/gstream.cc: Use my_global.h first sql/ha_ndbcluster.cc: Use my_global.h first sql/ha_ndbcluster_binlog.cc: Use my_global.h first sql/ha_ndbcluster_cond.cc: Use my_global.h first sql/ha_partition.cc: Use my_global.h first sql/handler.cc: Use my_global.h first sql/hash_filo.cc: Use my_global.h first sql/hostname.cc: Use my_global.h first sql/init.cc: Use my_global.h first sql/item.cc: Use my_global.h first sql/item_buff.cc: Use my_global.h first sql/item_cmpfunc.cc: Use my_global.h first sql/item_create.cc: Use my_global.h first sql/item_geofunc.cc: Use my_global.h first sql/item_inetfunc.cc: Use my_global.h first sql/item_row.cc: Use my_global.h first sql/item_strfunc.cc: Use my_global.h first sql/item_subselect.cc: Use my_global.h first sql/item_sum.cc: Use my_global.h first sql/item_timefunc.cc: Use my_global.h first sql/item_xmlfunc.cc: Use my_global.h first sql/key.cc: Use my_global.h first sql/lock.cc: Use my_global.h first sql/log.cc: Use my_global.h first sql/log_event.cc: Use my_global.h first sql/log_event_old.cc: Use my_global.h first sql/mf_iocache.cc: Use my_global.h first sql/mysql_install_db.cc: Remove duplicated include files sql/mysqld.cc: Remove duplicated include files sql/net_serv.cc: Remove duplicated include files sql/opt_range.cc: Use my_global.h first sql/opt_subselect.cc: Use my_global.h first sql/opt_sum.cc: Use my_global.h first sql/parse_file.cc: Use my_global.h first sql/partition_info.cc: Use my_global.h first sql/procedure.cc: Use my_global.h first sql/protocol.cc: Use my_global.h first sql/records.cc: Use my_global.h first sql/records.h: Don't include my_global.h Better to do this at the upper level sql/repl_failsafe.cc: Use my_global.h first sql/rpl_filter.cc: Use my_global.h first sql/rpl_gtid.cc: Use my_global.h first sql/rpl_handler.cc: Use my_global.h first sql/rpl_injector.cc: Use my_global.h first sql/rpl_record.cc: Use my_global.h first sql/rpl_record_old.cc: Use my_global.h first sql/rpl_reporting.cc: Use my_global.h first sql/rpl_rli.cc: Use my_global.h first sql/rpl_tblmap.cc: Use my_global.h first sql/rpl_utility.cc: Use my_global.h first sql/set_var.cc: Added comment sql/slave.cc: Use my_global.h first sql/sp.cc: Use my_global.h first sql/sp_cache.cc: Use my_global.h first sql/sp_head.cc: Use my_global.h first sql/sp_pcontext.cc: Use my_global.h first sql/sp_rcontext.cc: Use my_global.h first sql/spatial.cc: Use my_global.h first sql/sql_acl.cc: Use my_global.h first sql/sql_admin.cc: Use my_global.h first sql/sql_analyse.cc: Use my_global.h first sql/sql_audit.cc: Use my_global.h first sql/sql_base.cc: Use my_global.h first sql/sql_binlog.cc: Use my_global.h first sql/sql_bootstrap.cc: Use my_global.h first Use my_global.h first sql/sql_cache.cc: Use my_global.h first sql/sql_class.cc: Use my_global.h first sql/sql_client.cc: Use my_global.h first sql/sql_connect.cc: Use my_global.h first sql/sql_crypt.cc: Use my_global.h first sql/sql_cursor.cc: Use my_global.h first sql/sql_db.cc: Use my_global.h first sql/sql_delete.cc: Use my_global.h first sql/sql_derived.cc: Use my_global.h first sql/sql_do.cc: Use my_global.h first sql/sql_error.cc: Use my_global.h first sql/sql_explain.cc: Use my_global.h first sql/sql_expression_cache.cc: Use my_global.h first sql/sql_handler.cc: Use my_global.h first sql/sql_help.cc: Use my_global.h first sql/sql_insert.cc: Use my_global.h first sql/sql_lex.cc: Use my_global.h first sql/sql_load.cc: Use my_global.h first sql/sql_locale.cc: Use my_global.h first sql/sql_manager.cc: Use my_global.h first sql/sql_parse.cc: Use my_global.h first sql/sql_partition.cc: Use my_global.h first sql/sql_plugin.cc: Added comment sql/sql_prepare.cc: Use my_global.h first sql/sql_priv.h: Added error if we use this before including my_global.h This check is here becasue so many files includes sql_priv.h first. sql/sql_profile.cc: Use my_global.h first sql/sql_reload.cc: Use my_global.h first sql/sql_rename.cc: Use my_global.h first sql/sql_repl.cc: Use my_global.h first sql/sql_select.cc: Use my_global.h first sql/sql_servers.cc: Use my_global.h first sql/sql_show.cc: Added comment sql/sql_signal.cc: Use my_global.h first sql/sql_statistics.cc: Use my_global.h first sql/sql_table.cc: Use my_global.h first sql/sql_tablespace.cc: Use my_global.h first sql/sql_test.cc: Use my_global.h first sql/sql_time.cc: Use my_global.h first sql/sql_trigger.cc: Use my_global.h first sql/sql_udf.cc: Use my_global.h first sql/sql_union.cc: Use my_global.h first sql/sql_update.cc: Use my_global.h first sql/sql_view.cc: Use my_global.h first sql/sys_vars.cc: Added comment sql/table.cc: Use my_global.h first sql/thr_malloc.cc: Use my_global.h first sql/transaction.cc: Use my_global.h first sql/uniques.cc: Use my_global.h first sql/unireg.cc: Use my_global.h first sql/unireg.h: Removed inclusion of my_global.h storage/archive/ha_archive.cc: Added comment storage/blackhole/ha_blackhole.cc: Use my_global.h first storage/csv/ha_tina.cc: Use my_global.h first storage/csv/transparent_file.cc: Use my_global.h first storage/federated/ha_federated.cc: Use my_global.h first storage/federatedx/federatedx_io.cc: Use my_global.h first storage/federatedx/federatedx_io_mysql.cc: Use my_global.h first storage/federatedx/federatedx_io_null.cc: Use my_global.h first storage/federatedx/federatedx_txn.cc: Use my_global.h first storage/heap/ha_heap.cc: Use my_global.h first storage/innobase/handler/handler0alter.cc: Use my_global.h first storage/maria/ha_maria.cc: Use my_global.h first storage/maria/unittest/ma_maria_log_cleanup.c: Remove duplicated include files storage/maria/unittest/test_file.c: Added comment storage/myisam/ha_myisam.cc: Move sql_plugin.h first as this includes my_global.h storage/myisammrg/ha_myisammrg.cc: Use my_global.h first storage/oqgraph/oqgraph_thunk.cc: Use my_config.h and my_global.h first One could not include my_global.h before oqgraph_thunk.h (don't know why) storage/spider/ha_spider.cc: Use my_global.h first storage/spider/hs_client/config.cpp: Use my_global.h first storage/spider/hs_client/escape.cpp: Use my_global.h first storage/spider/hs_client/fatal.cpp: Use my_global.h first storage/spider/hs_client/hstcpcli.cpp: Use my_global.h first storage/spider/hs_client/socket.cpp: Use my_global.h first storage/spider/hs_client/string_util.cpp: Use my_global.h first storage/spider/spd_conn.cc: Use my_global.h first storage/spider/spd_copy_tables.cc: Use my_global.h first storage/spider/spd_db_conn.cc: Use my_global.h first storage/spider/spd_db_handlersocket.cc: Use my_global.h first storage/spider/spd_db_mysql.cc: Use my_global.h first storage/spider/spd_db_oracle.cc: Use my_global.h first storage/spider/spd_direct_sql.cc: Use my_global.h first storage/spider/spd_i_s.cc: Use my_global.h first storage/spider/spd_malloc.cc: Use my_global.h first storage/spider/spd_param.cc: Use my_global.h first storage/spider/spd_ping_table.cc: Use my_global.h first storage/spider/spd_sys_table.cc: Use my_global.h first storage/spider/spd_table.cc: Use my_global.h first storage/spider/spd_trx.cc: Use my_global.h first storage/xtradb/handler/handler0alter.cc: Use my_global.h first storage/xtradb/handler/i_s.cc: Use my_global.h first
2014-09-30 20:31:14 +03:00
#include <my_global.h>
Bug#42643: InnoDB does not support replication of TRUNCATE TABLE The problem was that TRUNCATE TABLE didn't take a exclusive lock on a table if it resorted to truncating via delete of all rows in the table. Specifically for InnoDB tables, this could break proper isolation as InnoDB ends up aborting some granted locks when truncating a table. The solution is to take a exclusive metadata lock before TRUNCATE TABLE can proceed. This guarantees that no other transaction is using the table. Incompatible change: Truncate via delete no longer fails if sql_safe_updates is activated (this was a undocumented side effect). libmysqld/CMakeLists.txt: Add new files to the build list. libmysqld/Makefile.am: Add new files to the build list. mysql-test/extra/binlog_tests/binlog_truncate.test: Add test case for Bug#42643 mysql-test/include/mix1.inc: Update test case as TRUNCATE TABLE now grabs a exclusive lock. Ensure that TRUNCATE waits for granted locks on the table. mysql-test/suite/binlog/t/binlog_truncate_innodb.test: As with other data modifying statements, TRUNCATE is still not possible in a transaction with isolation level READ COMMITTED or READ UNCOMMITED. It would be possible to implement so, but it is not worth the effort. mysql-test/suite/binlog/t/binlog_truncate_myisam.test: Test under different binlog formats. mysql-test/suite/binlog/t/disabled.def: Re-enable test case. mysql-test/t/innodb_bug38231.test: Truncate no longer works with row-level locks. mysql-test/t/mdl_sync.test: Ensure that a acquired lock is not given up due to a conflict. mysql-test/t/partition_innodb_semi_consistent.test: End transaction as to release metadata locks. mysql-test/t/truncate.test: A metadata lock is now taken before the object is verified. sql/CMakeLists.txt: Add new files to the build list. sql/Makefile.am: Add new files to the build list. sql/datadict.cc: Introduce a new file specific for data dictionary operations. sql/datadict.h: Add header file. sql/sql_base.cc: Rename data dictionary function. sql/sql_bitmap.h: Include dependency. sql/sql_delete.cc: Move away from relying on mysql_delete() to delete all rows of a table. Thus, move any bits related to truncate to sql_truncate.cc sql/sql_delete.h: Remove parameter. sql/sql_parse.cc: Add protection against the global read lock -- a intention exclusive lock can be acquired in the truncate path. sql/sql_show.cc: Add sync point for testing scenarios where a pending flush is ignored. sql/sql_truncate.cc: Acquire a shared metadata lock before accessing table metadata. Upgrade the lock to a exclusive one if the table can be re-created. Rework binlog rules to better reflect the requirements. sql/sql_yacc.yy: Set appropriate lock types for table to be truncated. sql/table.h: Move to data dictionary header.
2010-05-25 17:01:38 -03:00
#include "datadict.h"
#include "sql_priv.h"
#include "sql_class.h"
#include "sql_table.h"
MDEV-10139 Support for SEQUENCE objects Working features: CREATE OR REPLACE [TEMPORARY] SEQUENCE [IF NOT EXISTS] name [ INCREMENT [ BY | = ] increment ] [ MINVALUE [=] minvalue | NO MINVALUE ] [ MAXVALUE [=] maxvalue | NO MAXVALUE ] [ START [ WITH | = ] start ] [ CACHE [=] cache ] [ [ NO ] CYCLE ] ENGINE=xxx COMMENT=".." SELECT NEXT VALUE FOR sequence_name; SELECT NEXTVAL(sequence_name); SELECT PREVIOUS VALUE FOR sequence_name; SELECT LASTVAL(sequence_name); SHOW CREATE SEQUENCE sequence_name; SHOW CREATE TABLE sequence_name; CREATE TABLE sequence-structure ... SEQUENCE=1 ALTER TABLE sequence RENAME TO sequence2; RENAME TABLE sequence TO sequence2; DROP [TEMPORARY] SEQUENCE [IF EXISTS] sequence_names Missing features - SETVAL(value,sequence_name), to be used with replication. - Check replication, including checking that sequence tables are marked not transactional. - Check that a commit happens for NEXT VALUE that changes table data (may already work) - ALTER SEQUENCE. ANSI SQL version of setval. - Share identical sequence entries to not add things twice to table list. - testing insert/delete/update/truncate/load data - Run and fix Alibaba sequence tests (part of mysql-test/suite/sql_sequence) - Write documentation for NEXT VALUE / PREVIOUS_VALUE - NEXTVAL in DEFAULT - Ensure that NEXTVAL in DEFAULT uses database from base table - Two NEXTVAL for same row should give same answer. - Oracle syntax sequence_table.nextval, without any FOR or FROM. - Sequence tables are treated as 'not read constant tables' by SELECT; Would be better if we would have a separate list for sequence tables so that select doesn't know about them, except if refereed to with FROM. Other things done: - Improved output for safemalloc backtrack - frm_type_enum changed to Table_type - Removed lex->is_view and replaced with lex->table_type. This allows use to more easy check if item is view, sequence or table. - Added table flag HA_CAN_TABLES_WITHOUT_ROLLBACK, needed for handlers that want's to support sequences - Added handler calls: - engine_name(), to simplify getting engine name for partition and sequences - update_first_row(), to be able to do efficient sequence implementations. - Made binlog_log_row() global to be able to call it from ha_sequence.cc - Added handler variable: row_already_logged, to be able to flag that the changed row is already logging to replication log. - Added CF_DB_CHANGE and CF_SCHEMA_CHANGE flags to simplify deny_updates_if_read_only_option() - Added sp_add_cfetch() to avoid new conflicts in sql_yacc.yy - Moved code for add_table_options() out from sql_show.cc::show_create_table() - Added String::append_longlong() and used it in sql_show.cc to simplify code. - Added extra option to dd_frm_type() and ha_table_exists to indicate if the table is a sequence. Needed by DROP SQUENCE to not drop a table.
2017-03-25 23:36:56 +02:00
#include "ha_sequence.h"
Bug#42643: InnoDB does not support replication of TRUNCATE TABLE The problem was that TRUNCATE TABLE didn't take a exclusive lock on a table if it resorted to truncating via delete of all rows in the table. Specifically for InnoDB tables, this could break proper isolation as InnoDB ends up aborting some granted locks when truncating a table. The solution is to take a exclusive metadata lock before TRUNCATE TABLE can proceed. This guarantees that no other transaction is using the table. Incompatible change: Truncate via delete no longer fails if sql_safe_updates is activated (this was a undocumented side effect). libmysqld/CMakeLists.txt: Add new files to the build list. libmysqld/Makefile.am: Add new files to the build list. mysql-test/extra/binlog_tests/binlog_truncate.test: Add test case for Bug#42643 mysql-test/include/mix1.inc: Update test case as TRUNCATE TABLE now grabs a exclusive lock. Ensure that TRUNCATE waits for granted locks on the table. mysql-test/suite/binlog/t/binlog_truncate_innodb.test: As with other data modifying statements, TRUNCATE is still not possible in a transaction with isolation level READ COMMITTED or READ UNCOMMITED. It would be possible to implement so, but it is not worth the effort. mysql-test/suite/binlog/t/binlog_truncate_myisam.test: Test under different binlog formats. mysql-test/suite/binlog/t/disabled.def: Re-enable test case. mysql-test/t/innodb_bug38231.test: Truncate no longer works with row-level locks. mysql-test/t/mdl_sync.test: Ensure that a acquired lock is not given up due to a conflict. mysql-test/t/partition_innodb_semi_consistent.test: End transaction as to release metadata locks. mysql-test/t/truncate.test: A metadata lock is now taken before the object is verified. sql/CMakeLists.txt: Add new files to the build list. sql/Makefile.am: Add new files to the build list. sql/datadict.cc: Introduce a new file specific for data dictionary operations. sql/datadict.h: Add header file. sql/sql_base.cc: Rename data dictionary function. sql/sql_bitmap.h: Include dependency. sql/sql_delete.cc: Move away from relying on mysql_delete() to delete all rows of a table. Thus, move any bits related to truncate to sql_truncate.cc sql/sql_delete.h: Remove parameter. sql/sql_parse.cc: Add protection against the global read lock -- a intention exclusive lock can be acquired in the truncate path. sql/sql_show.cc: Add sync point for testing scenarios where a pending flush is ignored. sql/sql_truncate.cc: Acquire a shared metadata lock before accessing table metadata. Upgrade the lock to a exclusive one if the table can be re-created. Rework binlog rules to better reflect the requirements. sql/sql_yacc.yy: Set appropriate lock types for table to be truncated. sql/table.h: Move to data dictionary header.
2010-05-25 17:01:38 -03:00
static int read_string(File file, uchar**to, size_t length)
{
DBUG_ENTER("read_string");
my_free(*to);
if (!(*to= (uchar*) my_malloc(length+1,MYF(MY_WME))) ||
mysql_file_read(file, *to, length, MYF(MY_NABP)))
{
my_free(*to);
*to= 0;
DBUG_RETURN(1);
}
*((char*) *to+length)= '\0'; // C-style safety
DBUG_RETURN (0);
}
Bug#42643: InnoDB does not support replication of TRUNCATE TABLE The problem was that TRUNCATE TABLE didn't take a exclusive lock on a table if it resorted to truncating via delete of all rows in the table. Specifically for InnoDB tables, this could break proper isolation as InnoDB ends up aborting some granted locks when truncating a table. The solution is to take a exclusive metadata lock before TRUNCATE TABLE can proceed. This guarantees that no other transaction is using the table. Incompatible change: Truncate via delete no longer fails if sql_safe_updates is activated (this was a undocumented side effect). libmysqld/CMakeLists.txt: Add new files to the build list. libmysqld/Makefile.am: Add new files to the build list. mysql-test/extra/binlog_tests/binlog_truncate.test: Add test case for Bug#42643 mysql-test/include/mix1.inc: Update test case as TRUNCATE TABLE now grabs a exclusive lock. Ensure that TRUNCATE waits for granted locks on the table. mysql-test/suite/binlog/t/binlog_truncate_innodb.test: As with other data modifying statements, TRUNCATE is still not possible in a transaction with isolation level READ COMMITTED or READ UNCOMMITED. It would be possible to implement so, but it is not worth the effort. mysql-test/suite/binlog/t/binlog_truncate_myisam.test: Test under different binlog formats. mysql-test/suite/binlog/t/disabled.def: Re-enable test case. mysql-test/t/innodb_bug38231.test: Truncate no longer works with row-level locks. mysql-test/t/mdl_sync.test: Ensure that a acquired lock is not given up due to a conflict. mysql-test/t/partition_innodb_semi_consistent.test: End transaction as to release metadata locks. mysql-test/t/truncate.test: A metadata lock is now taken before the object is verified. sql/CMakeLists.txt: Add new files to the build list. sql/Makefile.am: Add new files to the build list. sql/datadict.cc: Introduce a new file specific for data dictionary operations. sql/datadict.h: Add header file. sql/sql_base.cc: Rename data dictionary function. sql/sql_bitmap.h: Include dependency. sql/sql_delete.cc: Move away from relying on mysql_delete() to delete all rows of a table. Thus, move any bits related to truncate to sql_truncate.cc sql/sql_delete.h: Remove parameter. sql/sql_parse.cc: Add protection against the global read lock -- a intention exclusive lock can be acquired in the truncate path. sql/sql_show.cc: Add sync point for testing scenarios where a pending flush is ignored. sql/sql_truncate.cc: Acquire a shared metadata lock before accessing table metadata. Upgrade the lock to a exclusive one if the table can be re-created. Rework binlog rules to better reflect the requirements. sql/sql_yacc.yy: Set appropriate lock types for table to be truncated. sql/table.h: Move to data dictionary header.
2010-05-25 17:01:38 -03:00
/**
Check type of .frm if we are not going to parse it.
@param[in] thd The current session.
@param[in] path path to FRM file.
@param[in/out] engine_name table engine name (length < NAME_CHAR_LEN)
engine_name is a LEX_STRING, where engine_name->str must point to
a buffer of at least NAME_CHAR_LEN+1 bytes.
Bug#42643: InnoDB does not support replication of TRUNCATE TABLE The problem was that TRUNCATE TABLE didn't take a exclusive lock on a table if it resorted to truncating via delete of all rows in the table. Specifically for InnoDB tables, this could break proper isolation as InnoDB ends up aborting some granted locks when truncating a table. The solution is to take a exclusive metadata lock before TRUNCATE TABLE can proceed. This guarantees that no other transaction is using the table. Incompatible change: Truncate via delete no longer fails if sql_safe_updates is activated (this was a undocumented side effect). libmysqld/CMakeLists.txt: Add new files to the build list. libmysqld/Makefile.am: Add new files to the build list. mysql-test/extra/binlog_tests/binlog_truncate.test: Add test case for Bug#42643 mysql-test/include/mix1.inc: Update test case as TRUNCATE TABLE now grabs a exclusive lock. Ensure that TRUNCATE waits for granted locks on the table. mysql-test/suite/binlog/t/binlog_truncate_innodb.test: As with other data modifying statements, TRUNCATE is still not possible in a transaction with isolation level READ COMMITTED or READ UNCOMMITED. It would be possible to implement so, but it is not worth the effort. mysql-test/suite/binlog/t/binlog_truncate_myisam.test: Test under different binlog formats. mysql-test/suite/binlog/t/disabled.def: Re-enable test case. mysql-test/t/innodb_bug38231.test: Truncate no longer works with row-level locks. mysql-test/t/mdl_sync.test: Ensure that a acquired lock is not given up due to a conflict. mysql-test/t/partition_innodb_semi_consistent.test: End transaction as to release metadata locks. mysql-test/t/truncate.test: A metadata lock is now taken before the object is verified. sql/CMakeLists.txt: Add new files to the build list. sql/Makefile.am: Add new files to the build list. sql/datadict.cc: Introduce a new file specific for data dictionary operations. sql/datadict.h: Add header file. sql/sql_base.cc: Rename data dictionary function. sql/sql_bitmap.h: Include dependency. sql/sql_delete.cc: Move away from relying on mysql_delete() to delete all rows of a table. Thus, move any bits related to truncate to sql_truncate.cc sql/sql_delete.h: Remove parameter. sql/sql_parse.cc: Add protection against the global read lock -- a intention exclusive lock can be acquired in the truncate path. sql/sql_show.cc: Add sync point for testing scenarios where a pending flush is ignored. sql/sql_truncate.cc: Acquire a shared metadata lock before accessing table metadata. Upgrade the lock to a exclusive one if the table can be re-created. Rework binlog rules to better reflect the requirements. sql/sql_yacc.yy: Set appropriate lock types for table to be truncated. sql/table.h: Move to data dictionary header.
2010-05-25 17:01:38 -03:00
MDEV-10139 Support for SEQUENCE objects Working features: CREATE OR REPLACE [TEMPORARY] SEQUENCE [IF NOT EXISTS] name [ INCREMENT [ BY | = ] increment ] [ MINVALUE [=] minvalue | NO MINVALUE ] [ MAXVALUE [=] maxvalue | NO MAXVALUE ] [ START [ WITH | = ] start ] [ CACHE [=] cache ] [ [ NO ] CYCLE ] ENGINE=xxx COMMENT=".." SELECT NEXT VALUE FOR sequence_name; SELECT NEXTVAL(sequence_name); SELECT PREVIOUS VALUE FOR sequence_name; SELECT LASTVAL(sequence_name); SHOW CREATE SEQUENCE sequence_name; SHOW CREATE TABLE sequence_name; CREATE TABLE sequence-structure ... SEQUENCE=1 ALTER TABLE sequence RENAME TO sequence2; RENAME TABLE sequence TO sequence2; DROP [TEMPORARY] SEQUENCE [IF EXISTS] sequence_names Missing features - SETVAL(value,sequence_name), to be used with replication. - Check replication, including checking that sequence tables are marked not transactional. - Check that a commit happens for NEXT VALUE that changes table data (may already work) - ALTER SEQUENCE. ANSI SQL version of setval. - Share identical sequence entries to not add things twice to table list. - testing insert/delete/update/truncate/load data - Run and fix Alibaba sequence tests (part of mysql-test/suite/sql_sequence) - Write documentation for NEXT VALUE / PREVIOUS_VALUE - NEXTVAL in DEFAULT - Ensure that NEXTVAL in DEFAULT uses database from base table - Two NEXTVAL for same row should give same answer. - Oracle syntax sequence_table.nextval, without any FOR or FROM. - Sequence tables are treated as 'not read constant tables' by SELECT; Would be better if we would have a separate list for sequence tables so that select doesn't know about them, except if refereed to with FROM. Other things done: - Improved output for safemalloc backtrack - frm_type_enum changed to Table_type - Removed lex->is_view and replaced with lex->table_type. This allows use to more easy check if item is view, sequence or table. - Added table flag HA_CAN_TABLES_WITHOUT_ROLLBACK, needed for handlers that want's to support sequences - Added handler calls: - engine_name(), to simplify getting engine name for partition and sequences - update_first_row(), to be able to do efficient sequence implementations. - Made binlog_log_row() global to be able to call it from ha_sequence.cc - Added handler variable: row_already_logged, to be able to flag that the changed row is already logging to replication log. - Added CF_DB_CHANGE and CF_SCHEMA_CHANGE flags to simplify deny_updates_if_read_only_option() - Added sp_add_cfetch() to avoid new conflicts in sql_yacc.yy - Moved code for add_table_options() out from sql_show.cc::show_create_table() - Added String::append_longlong() and used it in sql_show.cc to simplify code. - Added extra option to dd_frm_type() and ha_table_exists to indicate if the table is a sequence. Needed by DROP SQUENCE to not drop a table.
2017-03-25 23:36:56 +02:00
@param[out] is_sequence 1 if table is a SEQUENCE, 0 otherwise
@retval TABLE_TYPE_UNKNOWN error
@retval TABLE_TYPE_TABLE table
@retval TABLE_TYPE_SEQUENCE sequence table
@retval TABLE_TYPE_VIEW view
Bug#42643: InnoDB does not support replication of TRUNCATE TABLE The problem was that TRUNCATE TABLE didn't take a exclusive lock on a table if it resorted to truncating via delete of all rows in the table. Specifically for InnoDB tables, this could break proper isolation as InnoDB ends up aborting some granted locks when truncating a table. The solution is to take a exclusive metadata lock before TRUNCATE TABLE can proceed. This guarantees that no other transaction is using the table. Incompatible change: Truncate via delete no longer fails if sql_safe_updates is activated (this was a undocumented side effect). libmysqld/CMakeLists.txt: Add new files to the build list. libmysqld/Makefile.am: Add new files to the build list. mysql-test/extra/binlog_tests/binlog_truncate.test: Add test case for Bug#42643 mysql-test/include/mix1.inc: Update test case as TRUNCATE TABLE now grabs a exclusive lock. Ensure that TRUNCATE waits for granted locks on the table. mysql-test/suite/binlog/t/binlog_truncate_innodb.test: As with other data modifying statements, TRUNCATE is still not possible in a transaction with isolation level READ COMMITTED or READ UNCOMMITED. It would be possible to implement so, but it is not worth the effort. mysql-test/suite/binlog/t/binlog_truncate_myisam.test: Test under different binlog formats. mysql-test/suite/binlog/t/disabled.def: Re-enable test case. mysql-test/t/innodb_bug38231.test: Truncate no longer works with row-level locks. mysql-test/t/mdl_sync.test: Ensure that a acquired lock is not given up due to a conflict. mysql-test/t/partition_innodb_semi_consistent.test: End transaction as to release metadata locks. mysql-test/t/truncate.test: A metadata lock is now taken before the object is verified. sql/CMakeLists.txt: Add new files to the build list. sql/Makefile.am: Add new files to the build list. sql/datadict.cc: Introduce a new file specific for data dictionary operations. sql/datadict.h: Add header file. sql/sql_base.cc: Rename data dictionary function. sql/sql_bitmap.h: Include dependency. sql/sql_delete.cc: Move away from relying on mysql_delete() to delete all rows of a table. Thus, move any bits related to truncate to sql_truncate.cc sql/sql_delete.h: Remove parameter. sql/sql_parse.cc: Add protection against the global read lock -- a intention exclusive lock can be acquired in the truncate path. sql/sql_show.cc: Add sync point for testing scenarios where a pending flush is ignored. sql/sql_truncate.cc: Acquire a shared metadata lock before accessing table metadata. Upgrade the lock to a exclusive one if the table can be re-created. Rework binlog rules to better reflect the requirements. sql/sql_yacc.yy: Set appropriate lock types for table to be truncated. sql/table.h: Move to data dictionary header.
2010-05-25 17:01:38 -03:00
*/
MDEV-10139 Support for SEQUENCE objects Working features: CREATE OR REPLACE [TEMPORARY] SEQUENCE [IF NOT EXISTS] name [ INCREMENT [ BY | = ] increment ] [ MINVALUE [=] minvalue | NO MINVALUE ] [ MAXVALUE [=] maxvalue | NO MAXVALUE ] [ START [ WITH | = ] start ] [ CACHE [=] cache ] [ [ NO ] CYCLE ] ENGINE=xxx COMMENT=".." SELECT NEXT VALUE FOR sequence_name; SELECT NEXTVAL(sequence_name); SELECT PREVIOUS VALUE FOR sequence_name; SELECT LASTVAL(sequence_name); SHOW CREATE SEQUENCE sequence_name; SHOW CREATE TABLE sequence_name; CREATE TABLE sequence-structure ... SEQUENCE=1 ALTER TABLE sequence RENAME TO sequence2; RENAME TABLE sequence TO sequence2; DROP [TEMPORARY] SEQUENCE [IF EXISTS] sequence_names Missing features - SETVAL(value,sequence_name), to be used with replication. - Check replication, including checking that sequence tables are marked not transactional. - Check that a commit happens for NEXT VALUE that changes table data (may already work) - ALTER SEQUENCE. ANSI SQL version of setval. - Share identical sequence entries to not add things twice to table list. - testing insert/delete/update/truncate/load data - Run and fix Alibaba sequence tests (part of mysql-test/suite/sql_sequence) - Write documentation for NEXT VALUE / PREVIOUS_VALUE - NEXTVAL in DEFAULT - Ensure that NEXTVAL in DEFAULT uses database from base table - Two NEXTVAL for same row should give same answer. - Oracle syntax sequence_table.nextval, without any FOR or FROM. - Sequence tables are treated as 'not read constant tables' by SELECT; Would be better if we would have a separate list for sequence tables so that select doesn't know about them, except if refereed to with FROM. Other things done: - Improved output for safemalloc backtrack - frm_type_enum changed to Table_type - Removed lex->is_view and replaced with lex->table_type. This allows use to more easy check if item is view, sequence or table. - Added table flag HA_CAN_TABLES_WITHOUT_ROLLBACK, needed for handlers that want's to support sequences - Added handler calls: - engine_name(), to simplify getting engine name for partition and sequences - update_first_row(), to be able to do efficient sequence implementations. - Made binlog_log_row() global to be able to call it from ha_sequence.cc - Added handler variable: row_already_logged, to be able to flag that the changed row is already logging to replication log. - Added CF_DB_CHANGE and CF_SCHEMA_CHANGE flags to simplify deny_updates_if_read_only_option() - Added sp_add_cfetch() to avoid new conflicts in sql_yacc.yy - Moved code for add_table_options() out from sql_show.cc::show_create_table() - Added String::append_longlong() and used it in sql_show.cc to simplify code. - Added extra option to dd_frm_type() and ha_table_exists to indicate if the table is a sequence. Needed by DROP SQUENCE to not drop a table.
2017-03-25 23:36:56 +02:00
Table_type dd_frm_type(THD *thd, char *path, LEX_STRING *engine_name,
bool *is_sequence)
Bug#42643: InnoDB does not support replication of TRUNCATE TABLE The problem was that TRUNCATE TABLE didn't take a exclusive lock on a table if it resorted to truncating via delete of all rows in the table. Specifically for InnoDB tables, this could break proper isolation as InnoDB ends up aborting some granted locks when truncating a table. The solution is to take a exclusive metadata lock before TRUNCATE TABLE can proceed. This guarantees that no other transaction is using the table. Incompatible change: Truncate via delete no longer fails if sql_safe_updates is activated (this was a undocumented side effect). libmysqld/CMakeLists.txt: Add new files to the build list. libmysqld/Makefile.am: Add new files to the build list. mysql-test/extra/binlog_tests/binlog_truncate.test: Add test case for Bug#42643 mysql-test/include/mix1.inc: Update test case as TRUNCATE TABLE now grabs a exclusive lock. Ensure that TRUNCATE waits for granted locks on the table. mysql-test/suite/binlog/t/binlog_truncate_innodb.test: As with other data modifying statements, TRUNCATE is still not possible in a transaction with isolation level READ COMMITTED or READ UNCOMMITED. It would be possible to implement so, but it is not worth the effort. mysql-test/suite/binlog/t/binlog_truncate_myisam.test: Test under different binlog formats. mysql-test/suite/binlog/t/disabled.def: Re-enable test case. mysql-test/t/innodb_bug38231.test: Truncate no longer works with row-level locks. mysql-test/t/mdl_sync.test: Ensure that a acquired lock is not given up due to a conflict. mysql-test/t/partition_innodb_semi_consistent.test: End transaction as to release metadata locks. mysql-test/t/truncate.test: A metadata lock is now taken before the object is verified. sql/CMakeLists.txt: Add new files to the build list. sql/Makefile.am: Add new files to the build list. sql/datadict.cc: Introduce a new file specific for data dictionary operations. sql/datadict.h: Add header file. sql/sql_base.cc: Rename data dictionary function. sql/sql_bitmap.h: Include dependency. sql/sql_delete.cc: Move away from relying on mysql_delete() to delete all rows of a table. Thus, move any bits related to truncate to sql_truncate.cc sql/sql_delete.h: Remove parameter. sql/sql_parse.cc: Add protection against the global read lock -- a intention exclusive lock can be acquired in the truncate path. sql/sql_show.cc: Add sync point for testing scenarios where a pending flush is ignored. sql/sql_truncate.cc: Acquire a shared metadata lock before accessing table metadata. Upgrade the lock to a exclusive one if the table can be re-created. Rework binlog rules to better reflect the requirements. sql/sql_yacc.yy: Set appropriate lock types for table to be truncated. sql/table.h: Move to data dictionary header.
2010-05-25 17:01:38 -03:00
{
File file;
MDEV-10139 Support for SEQUENCE objects Working features: CREATE OR REPLACE [TEMPORARY] SEQUENCE [IF NOT EXISTS] name [ INCREMENT [ BY | = ] increment ] [ MINVALUE [=] minvalue | NO MINVALUE ] [ MAXVALUE [=] maxvalue | NO MAXVALUE ] [ START [ WITH | = ] start ] [ CACHE [=] cache ] [ [ NO ] CYCLE ] ENGINE=xxx COMMENT=".." SELECT NEXT VALUE FOR sequence_name; SELECT NEXTVAL(sequence_name); SELECT PREVIOUS VALUE FOR sequence_name; SELECT LASTVAL(sequence_name); SHOW CREATE SEQUENCE sequence_name; SHOW CREATE TABLE sequence_name; CREATE TABLE sequence-structure ... SEQUENCE=1 ALTER TABLE sequence RENAME TO sequence2; RENAME TABLE sequence TO sequence2; DROP [TEMPORARY] SEQUENCE [IF EXISTS] sequence_names Missing features - SETVAL(value,sequence_name), to be used with replication. - Check replication, including checking that sequence tables are marked not transactional. - Check that a commit happens for NEXT VALUE that changes table data (may already work) - ALTER SEQUENCE. ANSI SQL version of setval. - Share identical sequence entries to not add things twice to table list. - testing insert/delete/update/truncate/load data - Run and fix Alibaba sequence tests (part of mysql-test/suite/sql_sequence) - Write documentation for NEXT VALUE / PREVIOUS_VALUE - NEXTVAL in DEFAULT - Ensure that NEXTVAL in DEFAULT uses database from base table - Two NEXTVAL for same row should give same answer. - Oracle syntax sequence_table.nextval, without any FOR or FROM. - Sequence tables are treated as 'not read constant tables' by SELECT; Would be better if we would have a separate list for sequence tables so that select doesn't know about them, except if refereed to with FROM. Other things done: - Improved output for safemalloc backtrack - frm_type_enum changed to Table_type - Removed lex->is_view and replaced with lex->table_type. This allows use to more easy check if item is view, sequence or table. - Added table flag HA_CAN_TABLES_WITHOUT_ROLLBACK, needed for handlers that want's to support sequences - Added handler calls: - engine_name(), to simplify getting engine name for partition and sequences - update_first_row(), to be able to do efficient sequence implementations. - Made binlog_log_row() global to be able to call it from ha_sequence.cc - Added handler variable: row_already_logged, to be able to flag that the changed row is already logging to replication log. - Added CF_DB_CHANGE and CF_SCHEMA_CHANGE flags to simplify deny_updates_if_read_only_option() - Added sp_add_cfetch() to avoid new conflicts in sql_yacc.yy - Moved code for add_table_options() out from sql_show.cc::show_create_table() - Added String::append_longlong() and used it in sql_show.cc to simplify code. - Added extra option to dd_frm_type() and ha_table_exists to indicate if the table is a sequence. Needed by DROP SQUENCE to not drop a table.
2017-03-25 23:36:56 +02:00
uchar header[40]; //"TYPE=VIEW\n" it is 10 characters
Bug#42643: InnoDB does not support replication of TRUNCATE TABLE The problem was that TRUNCATE TABLE didn't take a exclusive lock on a table if it resorted to truncating via delete of all rows in the table. Specifically for InnoDB tables, this could break proper isolation as InnoDB ends up aborting some granted locks when truncating a table. The solution is to take a exclusive metadata lock before TRUNCATE TABLE can proceed. This guarantees that no other transaction is using the table. Incompatible change: Truncate via delete no longer fails if sql_safe_updates is activated (this was a undocumented side effect). libmysqld/CMakeLists.txt: Add new files to the build list. libmysqld/Makefile.am: Add new files to the build list. mysql-test/extra/binlog_tests/binlog_truncate.test: Add test case for Bug#42643 mysql-test/include/mix1.inc: Update test case as TRUNCATE TABLE now grabs a exclusive lock. Ensure that TRUNCATE waits for granted locks on the table. mysql-test/suite/binlog/t/binlog_truncate_innodb.test: As with other data modifying statements, TRUNCATE is still not possible in a transaction with isolation level READ COMMITTED or READ UNCOMMITED. It would be possible to implement so, but it is not worth the effort. mysql-test/suite/binlog/t/binlog_truncate_myisam.test: Test under different binlog formats. mysql-test/suite/binlog/t/disabled.def: Re-enable test case. mysql-test/t/innodb_bug38231.test: Truncate no longer works with row-level locks. mysql-test/t/mdl_sync.test: Ensure that a acquired lock is not given up due to a conflict. mysql-test/t/partition_innodb_semi_consistent.test: End transaction as to release metadata locks. mysql-test/t/truncate.test: A metadata lock is now taken before the object is verified. sql/CMakeLists.txt: Add new files to the build list. sql/Makefile.am: Add new files to the build list. sql/datadict.cc: Introduce a new file specific for data dictionary operations. sql/datadict.h: Add header file. sql/sql_base.cc: Rename data dictionary function. sql/sql_bitmap.h: Include dependency. sql/sql_delete.cc: Move away from relying on mysql_delete() to delete all rows of a table. Thus, move any bits related to truncate to sql_truncate.cc sql/sql_delete.h: Remove parameter. sql/sql_parse.cc: Add protection against the global read lock -- a intention exclusive lock can be acquired in the truncate path. sql/sql_show.cc: Add sync point for testing scenarios where a pending flush is ignored. sql/sql_truncate.cc: Acquire a shared metadata lock before accessing table metadata. Upgrade the lock to a exclusive one if the table can be re-created. Rework binlog rules to better reflect the requirements. sql/sql_yacc.yy: Set appropriate lock types for table to be truncated. sql/table.h: Move to data dictionary header.
2010-05-25 17:01:38 -03:00
size_t error;
MDEV-10139 Support for SEQUENCE objects Working features: CREATE OR REPLACE [TEMPORARY] SEQUENCE [IF NOT EXISTS] name [ INCREMENT [ BY | = ] increment ] [ MINVALUE [=] minvalue | NO MINVALUE ] [ MAXVALUE [=] maxvalue | NO MAXVALUE ] [ START [ WITH | = ] start ] [ CACHE [=] cache ] [ [ NO ] CYCLE ] ENGINE=xxx COMMENT=".." SELECT NEXT VALUE FOR sequence_name; SELECT NEXTVAL(sequence_name); SELECT PREVIOUS VALUE FOR sequence_name; SELECT LASTVAL(sequence_name); SHOW CREATE SEQUENCE sequence_name; SHOW CREATE TABLE sequence_name; CREATE TABLE sequence-structure ... SEQUENCE=1 ALTER TABLE sequence RENAME TO sequence2; RENAME TABLE sequence TO sequence2; DROP [TEMPORARY] SEQUENCE [IF EXISTS] sequence_names Missing features - SETVAL(value,sequence_name), to be used with replication. - Check replication, including checking that sequence tables are marked not transactional. - Check that a commit happens for NEXT VALUE that changes table data (may already work) - ALTER SEQUENCE. ANSI SQL version of setval. - Share identical sequence entries to not add things twice to table list. - testing insert/delete/update/truncate/load data - Run and fix Alibaba sequence tests (part of mysql-test/suite/sql_sequence) - Write documentation for NEXT VALUE / PREVIOUS_VALUE - NEXTVAL in DEFAULT - Ensure that NEXTVAL in DEFAULT uses database from base table - Two NEXTVAL for same row should give same answer. - Oracle syntax sequence_table.nextval, without any FOR or FROM. - Sequence tables are treated as 'not read constant tables' by SELECT; Would be better if we would have a separate list for sequence tables so that select doesn't know about them, except if refereed to with FROM. Other things done: - Improved output for safemalloc backtrack - frm_type_enum changed to Table_type - Removed lex->is_view and replaced with lex->table_type. This allows use to more easy check if item is view, sequence or table. - Added table flag HA_CAN_TABLES_WITHOUT_ROLLBACK, needed for handlers that want's to support sequences - Added handler calls: - engine_name(), to simplify getting engine name for partition and sequences - update_first_row(), to be able to do efficient sequence implementations. - Made binlog_log_row() global to be able to call it from ha_sequence.cc - Added handler variable: row_already_logged, to be able to flag that the changed row is already logging to replication log. - Added CF_DB_CHANGE and CF_SCHEMA_CHANGE flags to simplify deny_updates_if_read_only_option() - Added sp_add_cfetch() to avoid new conflicts in sql_yacc.yy - Moved code for add_table_options() out from sql_show.cc::show_create_table() - Added String::append_longlong() and used it in sql_show.cc to simplify code. - Added extra option to dd_frm_type() and ha_table_exists to indicate if the table is a sequence. Needed by DROP SQUENCE to not drop a table.
2017-03-25 23:36:56 +02:00
Table_type type= TABLE_TYPE_UNKNOWN;
uchar dbt;
Bug#42643: InnoDB does not support replication of TRUNCATE TABLE The problem was that TRUNCATE TABLE didn't take a exclusive lock on a table if it resorted to truncating via delete of all rows in the table. Specifically for InnoDB tables, this could break proper isolation as InnoDB ends up aborting some granted locks when truncating a table. The solution is to take a exclusive metadata lock before TRUNCATE TABLE can proceed. This guarantees that no other transaction is using the table. Incompatible change: Truncate via delete no longer fails if sql_safe_updates is activated (this was a undocumented side effect). libmysqld/CMakeLists.txt: Add new files to the build list. libmysqld/Makefile.am: Add new files to the build list. mysql-test/extra/binlog_tests/binlog_truncate.test: Add test case for Bug#42643 mysql-test/include/mix1.inc: Update test case as TRUNCATE TABLE now grabs a exclusive lock. Ensure that TRUNCATE waits for granted locks on the table. mysql-test/suite/binlog/t/binlog_truncate_innodb.test: As with other data modifying statements, TRUNCATE is still not possible in a transaction with isolation level READ COMMITTED or READ UNCOMMITED. It would be possible to implement so, but it is not worth the effort. mysql-test/suite/binlog/t/binlog_truncate_myisam.test: Test under different binlog formats. mysql-test/suite/binlog/t/disabled.def: Re-enable test case. mysql-test/t/innodb_bug38231.test: Truncate no longer works with row-level locks. mysql-test/t/mdl_sync.test: Ensure that a acquired lock is not given up due to a conflict. mysql-test/t/partition_innodb_semi_consistent.test: End transaction as to release metadata locks. mysql-test/t/truncate.test: A metadata lock is now taken before the object is verified. sql/CMakeLists.txt: Add new files to the build list. sql/Makefile.am: Add new files to the build list. sql/datadict.cc: Introduce a new file specific for data dictionary operations. sql/datadict.h: Add header file. sql/sql_base.cc: Rename data dictionary function. sql/sql_bitmap.h: Include dependency. sql/sql_delete.cc: Move away from relying on mysql_delete() to delete all rows of a table. Thus, move any bits related to truncate to sql_truncate.cc sql/sql_delete.h: Remove parameter. sql/sql_parse.cc: Add protection against the global read lock -- a intention exclusive lock can be acquired in the truncate path. sql/sql_show.cc: Add sync point for testing scenarios where a pending flush is ignored. sql/sql_truncate.cc: Acquire a shared metadata lock before accessing table metadata. Upgrade the lock to a exclusive one if the table can be re-created. Rework binlog rules to better reflect the requirements. sql/sql_yacc.yy: Set appropriate lock types for table to be truncated. sql/table.h: Move to data dictionary header.
2010-05-25 17:01:38 -03:00
DBUG_ENTER("dd_frm_type");
MDEV-10139 Support for SEQUENCE objects Working features: CREATE OR REPLACE [TEMPORARY] SEQUENCE [IF NOT EXISTS] name [ INCREMENT [ BY | = ] increment ] [ MINVALUE [=] minvalue | NO MINVALUE ] [ MAXVALUE [=] maxvalue | NO MAXVALUE ] [ START [ WITH | = ] start ] [ CACHE [=] cache ] [ [ NO ] CYCLE ] ENGINE=xxx COMMENT=".." SELECT NEXT VALUE FOR sequence_name; SELECT NEXTVAL(sequence_name); SELECT PREVIOUS VALUE FOR sequence_name; SELECT LASTVAL(sequence_name); SHOW CREATE SEQUENCE sequence_name; SHOW CREATE TABLE sequence_name; CREATE TABLE sequence-structure ... SEQUENCE=1 ALTER TABLE sequence RENAME TO sequence2; RENAME TABLE sequence TO sequence2; DROP [TEMPORARY] SEQUENCE [IF EXISTS] sequence_names Missing features - SETVAL(value,sequence_name), to be used with replication. - Check replication, including checking that sequence tables are marked not transactional. - Check that a commit happens for NEXT VALUE that changes table data (may already work) - ALTER SEQUENCE. ANSI SQL version of setval. - Share identical sequence entries to not add things twice to table list. - testing insert/delete/update/truncate/load data - Run and fix Alibaba sequence tests (part of mysql-test/suite/sql_sequence) - Write documentation for NEXT VALUE / PREVIOUS_VALUE - NEXTVAL in DEFAULT - Ensure that NEXTVAL in DEFAULT uses database from base table - Two NEXTVAL for same row should give same answer. - Oracle syntax sequence_table.nextval, without any FOR or FROM. - Sequence tables are treated as 'not read constant tables' by SELECT; Would be better if we would have a separate list for sequence tables so that select doesn't know about them, except if refereed to with FROM. Other things done: - Improved output for safemalloc backtrack - frm_type_enum changed to Table_type - Removed lex->is_view and replaced with lex->table_type. This allows use to more easy check if item is view, sequence or table. - Added table flag HA_CAN_TABLES_WITHOUT_ROLLBACK, needed for handlers that want's to support sequences - Added handler calls: - engine_name(), to simplify getting engine name for partition and sequences - update_first_row(), to be able to do efficient sequence implementations. - Made binlog_log_row() global to be able to call it from ha_sequence.cc - Added handler variable: row_already_logged, to be able to flag that the changed row is already logging to replication log. - Added CF_DB_CHANGE and CF_SCHEMA_CHANGE flags to simplify deny_updates_if_read_only_option() - Added sp_add_cfetch() to avoid new conflicts in sql_yacc.yy - Moved code for add_table_options() out from sql_show.cc::show_create_table() - Added String::append_longlong() and used it in sql_show.cc to simplify code. - Added extra option to dd_frm_type() and ha_table_exists to indicate if the table is a sequence. Needed by DROP SQUENCE to not drop a table.
2017-03-25 23:36:56 +02:00
*is_sequence= 0;
if ((file= mysql_file_open(key_file_frm, path, O_RDONLY | O_SHARE, MYF(0)))
< 0)
DBUG_RETURN(TABLE_TYPE_UNKNOWN);
Bug#42643: InnoDB does not support replication of TRUNCATE TABLE The problem was that TRUNCATE TABLE didn't take a exclusive lock on a table if it resorted to truncating via delete of all rows in the table. Specifically for InnoDB tables, this could break proper isolation as InnoDB ends up aborting some granted locks when truncating a table. The solution is to take a exclusive metadata lock before TRUNCATE TABLE can proceed. This guarantees that no other transaction is using the table. Incompatible change: Truncate via delete no longer fails if sql_safe_updates is activated (this was a undocumented side effect). libmysqld/CMakeLists.txt: Add new files to the build list. libmysqld/Makefile.am: Add new files to the build list. mysql-test/extra/binlog_tests/binlog_truncate.test: Add test case for Bug#42643 mysql-test/include/mix1.inc: Update test case as TRUNCATE TABLE now grabs a exclusive lock. Ensure that TRUNCATE waits for granted locks on the table. mysql-test/suite/binlog/t/binlog_truncate_innodb.test: As with other data modifying statements, TRUNCATE is still not possible in a transaction with isolation level READ COMMITTED or READ UNCOMMITED. It would be possible to implement so, but it is not worth the effort. mysql-test/suite/binlog/t/binlog_truncate_myisam.test: Test under different binlog formats. mysql-test/suite/binlog/t/disabled.def: Re-enable test case. mysql-test/t/innodb_bug38231.test: Truncate no longer works with row-level locks. mysql-test/t/mdl_sync.test: Ensure that a acquired lock is not given up due to a conflict. mysql-test/t/partition_innodb_semi_consistent.test: End transaction as to release metadata locks. mysql-test/t/truncate.test: A metadata lock is now taken before the object is verified. sql/CMakeLists.txt: Add new files to the build list. sql/Makefile.am: Add new files to the build list. sql/datadict.cc: Introduce a new file specific for data dictionary operations. sql/datadict.h: Add header file. sql/sql_base.cc: Rename data dictionary function. sql/sql_bitmap.h: Include dependency. sql/sql_delete.cc: Move away from relying on mysql_delete() to delete all rows of a table. Thus, move any bits related to truncate to sql_truncate.cc sql/sql_delete.h: Remove parameter. sql/sql_parse.cc: Add protection against the global read lock -- a intention exclusive lock can be acquired in the truncate path. sql/sql_show.cc: Add sync point for testing scenarios where a pending flush is ignored. sql/sql_truncate.cc: Acquire a shared metadata lock before accessing table metadata. Upgrade the lock to a exclusive one if the table can be re-created. Rework binlog rules to better reflect the requirements. sql/sql_yacc.yy: Set appropriate lock types for table to be truncated. sql/table.h: Move to data dictionary header.
2010-05-25 17:01:38 -03:00
error= mysql_file_read(file, (uchar*) header, sizeof(header), MYF(MY_NABP));
if (error)
goto err;
MDEV-10139 Support for SEQUENCE objects Working features: CREATE OR REPLACE [TEMPORARY] SEQUENCE [IF NOT EXISTS] name [ INCREMENT [ BY | = ] increment ] [ MINVALUE [=] minvalue | NO MINVALUE ] [ MAXVALUE [=] maxvalue | NO MAXVALUE ] [ START [ WITH | = ] start ] [ CACHE [=] cache ] [ [ NO ] CYCLE ] ENGINE=xxx COMMENT=".." SELECT NEXT VALUE FOR sequence_name; SELECT NEXTVAL(sequence_name); SELECT PREVIOUS VALUE FOR sequence_name; SELECT LASTVAL(sequence_name); SHOW CREATE SEQUENCE sequence_name; SHOW CREATE TABLE sequence_name; CREATE TABLE sequence-structure ... SEQUENCE=1 ALTER TABLE sequence RENAME TO sequence2; RENAME TABLE sequence TO sequence2; DROP [TEMPORARY] SEQUENCE [IF EXISTS] sequence_names Missing features - SETVAL(value,sequence_name), to be used with replication. - Check replication, including checking that sequence tables are marked not transactional. - Check that a commit happens for NEXT VALUE that changes table data (may already work) - ALTER SEQUENCE. ANSI SQL version of setval. - Share identical sequence entries to not add things twice to table list. - testing insert/delete/update/truncate/load data - Run and fix Alibaba sequence tests (part of mysql-test/suite/sql_sequence) - Write documentation for NEXT VALUE / PREVIOUS_VALUE - NEXTVAL in DEFAULT - Ensure that NEXTVAL in DEFAULT uses database from base table - Two NEXTVAL for same row should give same answer. - Oracle syntax sequence_table.nextval, without any FOR or FROM. - Sequence tables are treated as 'not read constant tables' by SELECT; Would be better if we would have a separate list for sequence tables so that select doesn't know about them, except if refereed to with FROM. Other things done: - Improved output for safemalloc backtrack - frm_type_enum changed to Table_type - Removed lex->is_view and replaced with lex->table_type. This allows use to more easy check if item is view, sequence or table. - Added table flag HA_CAN_TABLES_WITHOUT_ROLLBACK, needed for handlers that want's to support sequences - Added handler calls: - engine_name(), to simplify getting engine name for partition and sequences - update_first_row(), to be able to do efficient sequence implementations. - Made binlog_log_row() global to be able to call it from ha_sequence.cc - Added handler variable: row_already_logged, to be able to flag that the changed row is already logging to replication log. - Added CF_DB_CHANGE and CF_SCHEMA_CHANGE flags to simplify deny_updates_if_read_only_option() - Added sp_add_cfetch() to avoid new conflicts in sql_yacc.yy - Moved code for add_table_options() out from sql_show.cc::show_create_table() - Added String::append_longlong() and used it in sql_show.cc to simplify code. - Added extra option to dd_frm_type() and ha_table_exists to indicate if the table is a sequence. Needed by DROP SQUENCE to not drop a table.
2017-03-25 23:36:56 +02:00
if (!strncmp((char*) header, "TYPE=VIEW\n", 10))
{
MDEV-10139 Support for SEQUENCE objects Working features: CREATE OR REPLACE [TEMPORARY] SEQUENCE [IF NOT EXISTS] name [ INCREMENT [ BY | = ] increment ] [ MINVALUE [=] minvalue | NO MINVALUE ] [ MAXVALUE [=] maxvalue | NO MAXVALUE ] [ START [ WITH | = ] start ] [ CACHE [=] cache ] [ [ NO ] CYCLE ] ENGINE=xxx COMMENT=".." SELECT NEXT VALUE FOR sequence_name; SELECT NEXTVAL(sequence_name); SELECT PREVIOUS VALUE FOR sequence_name; SELECT LASTVAL(sequence_name); SHOW CREATE SEQUENCE sequence_name; SHOW CREATE TABLE sequence_name; CREATE TABLE sequence-structure ... SEQUENCE=1 ALTER TABLE sequence RENAME TO sequence2; RENAME TABLE sequence TO sequence2; DROP [TEMPORARY] SEQUENCE [IF EXISTS] sequence_names Missing features - SETVAL(value,sequence_name), to be used with replication. - Check replication, including checking that sequence tables are marked not transactional. - Check that a commit happens for NEXT VALUE that changes table data (may already work) - ALTER SEQUENCE. ANSI SQL version of setval. - Share identical sequence entries to not add things twice to table list. - testing insert/delete/update/truncate/load data - Run and fix Alibaba sequence tests (part of mysql-test/suite/sql_sequence) - Write documentation for NEXT VALUE / PREVIOUS_VALUE - NEXTVAL in DEFAULT - Ensure that NEXTVAL in DEFAULT uses database from base table - Two NEXTVAL for same row should give same answer. - Oracle syntax sequence_table.nextval, without any FOR or FROM. - Sequence tables are treated as 'not read constant tables' by SELECT; Would be better if we would have a separate list for sequence tables so that select doesn't know about them, except if refereed to with FROM. Other things done: - Improved output for safemalloc backtrack - frm_type_enum changed to Table_type - Removed lex->is_view and replaced with lex->table_type. This allows use to more easy check if item is view, sequence or table. - Added table flag HA_CAN_TABLES_WITHOUT_ROLLBACK, needed for handlers that want's to support sequences - Added handler calls: - engine_name(), to simplify getting engine name for partition and sequences - update_first_row(), to be able to do efficient sequence implementations. - Made binlog_log_row() global to be able to call it from ha_sequence.cc - Added handler variable: row_already_logged, to be able to flag that the changed row is already logging to replication log. - Added CF_DB_CHANGE and CF_SCHEMA_CHANGE flags to simplify deny_updates_if_read_only_option() - Added sp_add_cfetch() to avoid new conflicts in sql_yacc.yy - Moved code for add_table_options() out from sql_show.cc::show_create_table() - Added String::append_longlong() and used it in sql_show.cc to simplify code. - Added extra option to dd_frm_type() and ha_table_exists to indicate if the table is a sequence. Needed by DROP SQUENCE to not drop a table.
2017-03-25 23:36:56 +02:00
type= TABLE_TYPE_VIEW;
goto err;
}
MDEV-10139 Support for SEQUENCE objects Working features: CREATE OR REPLACE [TEMPORARY] SEQUENCE [IF NOT EXISTS] name [ INCREMENT [ BY | = ] increment ] [ MINVALUE [=] minvalue | NO MINVALUE ] [ MAXVALUE [=] maxvalue | NO MAXVALUE ] [ START [ WITH | = ] start ] [ CACHE [=] cache ] [ [ NO ] CYCLE ] ENGINE=xxx COMMENT=".." SELECT NEXT VALUE FOR sequence_name; SELECT NEXTVAL(sequence_name); SELECT PREVIOUS VALUE FOR sequence_name; SELECT LASTVAL(sequence_name); SHOW CREATE SEQUENCE sequence_name; SHOW CREATE TABLE sequence_name; CREATE TABLE sequence-structure ... SEQUENCE=1 ALTER TABLE sequence RENAME TO sequence2; RENAME TABLE sequence TO sequence2; DROP [TEMPORARY] SEQUENCE [IF EXISTS] sequence_names Missing features - SETVAL(value,sequence_name), to be used with replication. - Check replication, including checking that sequence tables are marked not transactional. - Check that a commit happens for NEXT VALUE that changes table data (may already work) - ALTER SEQUENCE. ANSI SQL version of setval. - Share identical sequence entries to not add things twice to table list. - testing insert/delete/update/truncate/load data - Run and fix Alibaba sequence tests (part of mysql-test/suite/sql_sequence) - Write documentation for NEXT VALUE / PREVIOUS_VALUE - NEXTVAL in DEFAULT - Ensure that NEXTVAL in DEFAULT uses database from base table - Two NEXTVAL for same row should give same answer. - Oracle syntax sequence_table.nextval, without any FOR or FROM. - Sequence tables are treated as 'not read constant tables' by SELECT; Would be better if we would have a separate list for sequence tables so that select doesn't know about them, except if refereed to with FROM. Other things done: - Improved output for safemalloc backtrack - frm_type_enum changed to Table_type - Removed lex->is_view and replaced with lex->table_type. This allows use to more easy check if item is view, sequence or table. - Added table flag HA_CAN_TABLES_WITHOUT_ROLLBACK, needed for handlers that want's to support sequences - Added handler calls: - engine_name(), to simplify getting engine name for partition and sequences - update_first_row(), to be able to do efficient sequence implementations. - Made binlog_log_row() global to be able to call it from ha_sequence.cc - Added handler variable: row_already_logged, to be able to flag that the changed row is already logging to replication log. - Added CF_DB_CHANGE and CF_SCHEMA_CHANGE flags to simplify deny_updates_if_read_only_option() - Added sp_add_cfetch() to avoid new conflicts in sql_yacc.yy - Moved code for add_table_options() out from sql_show.cc::show_create_table() - Added String::append_longlong() and used it in sql_show.cc to simplify code. - Added extra option to dd_frm_type() and ha_table_exists to indicate if the table is a sequence. Needed by DROP SQUENCE to not drop a table.
2017-03-25 23:36:56 +02:00
type= TABLE_TYPE_NORMAL;
Bug#42643: InnoDB does not support replication of TRUNCATE TABLE The problem was that TRUNCATE TABLE didn't take a exclusive lock on a table if it resorted to truncating via delete of all rows in the table. Specifically for InnoDB tables, this could break proper isolation as InnoDB ends up aborting some granted locks when truncating a table. The solution is to take a exclusive metadata lock before TRUNCATE TABLE can proceed. This guarantees that no other transaction is using the table. Incompatible change: Truncate via delete no longer fails if sql_safe_updates is activated (this was a undocumented side effect). libmysqld/CMakeLists.txt: Add new files to the build list. libmysqld/Makefile.am: Add new files to the build list. mysql-test/extra/binlog_tests/binlog_truncate.test: Add test case for Bug#42643 mysql-test/include/mix1.inc: Update test case as TRUNCATE TABLE now grabs a exclusive lock. Ensure that TRUNCATE waits for granted locks on the table. mysql-test/suite/binlog/t/binlog_truncate_innodb.test: As with other data modifying statements, TRUNCATE is still not possible in a transaction with isolation level READ COMMITTED or READ UNCOMMITED. It would be possible to implement so, but it is not worth the effort. mysql-test/suite/binlog/t/binlog_truncate_myisam.test: Test under different binlog formats. mysql-test/suite/binlog/t/disabled.def: Re-enable test case. mysql-test/t/innodb_bug38231.test: Truncate no longer works with row-level locks. mysql-test/t/mdl_sync.test: Ensure that a acquired lock is not given up due to a conflict. mysql-test/t/partition_innodb_semi_consistent.test: End transaction as to release metadata locks. mysql-test/t/truncate.test: A metadata lock is now taken before the object is verified. sql/CMakeLists.txt: Add new files to the build list. sql/Makefile.am: Add new files to the build list. sql/datadict.cc: Introduce a new file specific for data dictionary operations. sql/datadict.h: Add header file. sql/sql_base.cc: Rename data dictionary function. sql/sql_bitmap.h: Include dependency. sql/sql_delete.cc: Move away from relying on mysql_delete() to delete all rows of a table. Thus, move any bits related to truncate to sql_truncate.cc sql/sql_delete.h: Remove parameter. sql/sql_parse.cc: Add protection against the global read lock -- a intention exclusive lock can be acquired in the truncate path. sql/sql_show.cc: Add sync point for testing scenarios where a pending flush is ignored. sql/sql_truncate.cc: Acquire a shared metadata lock before accessing table metadata. Upgrade the lock to a exclusive one if the table can be re-created. Rework binlog rules to better reflect the requirements. sql/sql_yacc.yy: Set appropriate lock types for table to be truncated. sql/table.h: Move to data dictionary header.
2010-05-25 17:01:38 -03:00
if (!is_binary_frm_header(header) || !engine_name)
goto err;
Bug#42643: InnoDB does not support replication of TRUNCATE TABLE The problem was that TRUNCATE TABLE didn't take a exclusive lock on a table if it resorted to truncating via delete of all rows in the table. Specifically for InnoDB tables, this could break proper isolation as InnoDB ends up aborting some granted locks when truncating a table. The solution is to take a exclusive metadata lock before TRUNCATE TABLE can proceed. This guarantees that no other transaction is using the table. Incompatible change: Truncate via delete no longer fails if sql_safe_updates is activated (this was a undocumented side effect). libmysqld/CMakeLists.txt: Add new files to the build list. libmysqld/Makefile.am: Add new files to the build list. mysql-test/extra/binlog_tests/binlog_truncate.test: Add test case for Bug#42643 mysql-test/include/mix1.inc: Update test case as TRUNCATE TABLE now grabs a exclusive lock. Ensure that TRUNCATE waits for granted locks on the table. mysql-test/suite/binlog/t/binlog_truncate_innodb.test: As with other data modifying statements, TRUNCATE is still not possible in a transaction with isolation level READ COMMITTED or READ UNCOMMITED. It would be possible to implement so, but it is not worth the effort. mysql-test/suite/binlog/t/binlog_truncate_myisam.test: Test under different binlog formats. mysql-test/suite/binlog/t/disabled.def: Re-enable test case. mysql-test/t/innodb_bug38231.test: Truncate no longer works with row-level locks. mysql-test/t/mdl_sync.test: Ensure that a acquired lock is not given up due to a conflict. mysql-test/t/partition_innodb_semi_consistent.test: End transaction as to release metadata locks. mysql-test/t/truncate.test: A metadata lock is now taken before the object is verified. sql/CMakeLists.txt: Add new files to the build list. sql/Makefile.am: Add new files to the build list. sql/datadict.cc: Introduce a new file specific for data dictionary operations. sql/datadict.h: Add header file. sql/sql_base.cc: Rename data dictionary function. sql/sql_bitmap.h: Include dependency. sql/sql_delete.cc: Move away from relying on mysql_delete() to delete all rows of a table. Thus, move any bits related to truncate to sql_truncate.cc sql/sql_delete.h: Remove parameter. sql/sql_parse.cc: Add protection against the global read lock -- a intention exclusive lock can be acquired in the truncate path. sql/sql_show.cc: Add sync point for testing scenarios where a pending flush is ignored. sql/sql_truncate.cc: Acquire a shared metadata lock before accessing table metadata. Upgrade the lock to a exclusive one if the table can be re-created. Rework binlog rules to better reflect the requirements. sql/sql_yacc.yy: Set appropriate lock types for table to be truncated. sql/table.h: Move to data dictionary header.
2010-05-25 17:01:38 -03:00
engine_name->length= 0;
dbt= header[3];
/* cannot use ha_resolve_by_legacy_type without a THD */
if (thd && dbt < DB_TYPE_FIRST_DYNAMIC)
{
handlerton *ht= ha_resolve_by_legacy_type(thd, (enum legacy_db_type)dbt);
if (ht)
{
*engine_name= hton2plugin[ht->slot]->name;
goto err;
}
}
Bug#42643: InnoDB does not support replication of TRUNCATE TABLE The problem was that TRUNCATE TABLE didn't take a exclusive lock on a table if it resorted to truncating via delete of all rows in the table. Specifically for InnoDB tables, this could break proper isolation as InnoDB ends up aborting some granted locks when truncating a table. The solution is to take a exclusive metadata lock before TRUNCATE TABLE can proceed. This guarantees that no other transaction is using the table. Incompatible change: Truncate via delete no longer fails if sql_safe_updates is activated (this was a undocumented side effect). libmysqld/CMakeLists.txt: Add new files to the build list. libmysqld/Makefile.am: Add new files to the build list. mysql-test/extra/binlog_tests/binlog_truncate.test: Add test case for Bug#42643 mysql-test/include/mix1.inc: Update test case as TRUNCATE TABLE now grabs a exclusive lock. Ensure that TRUNCATE waits for granted locks on the table. mysql-test/suite/binlog/t/binlog_truncate_innodb.test: As with other data modifying statements, TRUNCATE is still not possible in a transaction with isolation level READ COMMITTED or READ UNCOMMITED. It would be possible to implement so, but it is not worth the effort. mysql-test/suite/binlog/t/binlog_truncate_myisam.test: Test under different binlog formats. mysql-test/suite/binlog/t/disabled.def: Re-enable test case. mysql-test/t/innodb_bug38231.test: Truncate no longer works with row-level locks. mysql-test/t/mdl_sync.test: Ensure that a acquired lock is not given up due to a conflict. mysql-test/t/partition_innodb_semi_consistent.test: End transaction as to release metadata locks. mysql-test/t/truncate.test: A metadata lock is now taken before the object is verified. sql/CMakeLists.txt: Add new files to the build list. sql/Makefile.am: Add new files to the build list. sql/datadict.cc: Introduce a new file specific for data dictionary operations. sql/datadict.h: Add header file. sql/sql_base.cc: Rename data dictionary function. sql/sql_bitmap.h: Include dependency. sql/sql_delete.cc: Move away from relying on mysql_delete() to delete all rows of a table. Thus, move any bits related to truncate to sql_truncate.cc sql/sql_delete.h: Remove parameter. sql/sql_parse.cc: Add protection against the global read lock -- a intention exclusive lock can be acquired in the truncate path. sql/sql_show.cc: Add sync point for testing scenarios where a pending flush is ignored. sql/sql_truncate.cc: Acquire a shared metadata lock before accessing table metadata. Upgrade the lock to a exclusive one if the table can be re-created. Rework binlog rules to better reflect the requirements. sql/sql_yacc.yy: Set appropriate lock types for table to be truncated. sql/table.h: Move to data dictionary header.
2010-05-25 17:01:38 -03:00
MDEV-10139 Support for SEQUENCE objects Working features: CREATE OR REPLACE [TEMPORARY] SEQUENCE [IF NOT EXISTS] name [ INCREMENT [ BY | = ] increment ] [ MINVALUE [=] minvalue | NO MINVALUE ] [ MAXVALUE [=] maxvalue | NO MAXVALUE ] [ START [ WITH | = ] start ] [ CACHE [=] cache ] [ [ NO ] CYCLE ] ENGINE=xxx COMMENT=".." SELECT NEXT VALUE FOR sequence_name; SELECT NEXTVAL(sequence_name); SELECT PREVIOUS VALUE FOR sequence_name; SELECT LASTVAL(sequence_name); SHOW CREATE SEQUENCE sequence_name; SHOW CREATE TABLE sequence_name; CREATE TABLE sequence-structure ... SEQUENCE=1 ALTER TABLE sequence RENAME TO sequence2; RENAME TABLE sequence TO sequence2; DROP [TEMPORARY] SEQUENCE [IF EXISTS] sequence_names Missing features - SETVAL(value,sequence_name), to be used with replication. - Check replication, including checking that sequence tables are marked not transactional. - Check that a commit happens for NEXT VALUE that changes table data (may already work) - ALTER SEQUENCE. ANSI SQL version of setval. - Share identical sequence entries to not add things twice to table list. - testing insert/delete/update/truncate/load data - Run and fix Alibaba sequence tests (part of mysql-test/suite/sql_sequence) - Write documentation for NEXT VALUE / PREVIOUS_VALUE - NEXTVAL in DEFAULT - Ensure that NEXTVAL in DEFAULT uses database from base table - Two NEXTVAL for same row should give same answer. - Oracle syntax sequence_table.nextval, without any FOR or FROM. - Sequence tables are treated as 'not read constant tables' by SELECT; Would be better if we would have a separate list for sequence tables so that select doesn't know about them, except if refereed to with FROM. Other things done: - Improved output for safemalloc backtrack - frm_type_enum changed to Table_type - Removed lex->is_view and replaced with lex->table_type. This allows use to more easy check if item is view, sequence or table. - Added table flag HA_CAN_TABLES_WITHOUT_ROLLBACK, needed for handlers that want's to support sequences - Added handler calls: - engine_name(), to simplify getting engine name for partition and sequences - update_first_row(), to be able to do efficient sequence implementations. - Made binlog_log_row() global to be able to call it from ha_sequence.cc - Added handler variable: row_already_logged, to be able to flag that the changed row is already logging to replication log. - Added CF_DB_CHANGE and CF_SCHEMA_CHANGE flags to simplify deny_updates_if_read_only_option() - Added sp_add_cfetch() to avoid new conflicts in sql_yacc.yy - Moved code for add_table_options() out from sql_show.cc::show_create_table() - Added String::append_longlong() and used it in sql_show.cc to simplify code. - Added extra option to dd_frm_type() and ha_table_exists to indicate if the table is a sequence. Needed by DROP SQUENCE to not drop a table.
2017-03-25 23:36:56 +02:00
if (((header[39] >> 4) & 3) == HA_CHOICE_YES)
*is_sequence= 1;
/* read the true engine name */
{
MY_STAT state;
uchar *frm_image= 0;
uint n_length;
if (mysql_file_fstat(file, &state, MYF(MY_WME)))
goto err;
if (mysql_file_seek(file, 0, SEEK_SET, MYF(MY_WME)))
goto err;
if (read_string(file, &frm_image, (size_t)state.st_size))
goto err;
if ((n_length= uint4korr(frm_image+55)))
{
uint record_offset= uint2korr(frm_image+6)+
((uint2korr(frm_image+14) == 0xffff ?
uint4korr(frm_image+47) : uint2korr(frm_image+14)));
uint reclength= uint2korr(frm_image+16);
uchar *next_chunk= frm_image + record_offset + reclength;
uchar *buff_end= next_chunk + n_length;
uint connect_string_length= uint2korr(next_chunk);
next_chunk+= connect_string_length + 2;
if (next_chunk + 2 < buff_end)
{
uint len= uint2korr(next_chunk);
if (len <= NAME_CHAR_LEN)
strmake(engine_name->str, (char*)next_chunk + 2,
engine_name->length= len);
}
}
my_free(frm_image);
}
Bug#42643: InnoDB does not support replication of TRUNCATE TABLE The problem was that TRUNCATE TABLE didn't take a exclusive lock on a table if it resorted to truncating via delete of all rows in the table. Specifically for InnoDB tables, this could break proper isolation as InnoDB ends up aborting some granted locks when truncating a table. The solution is to take a exclusive metadata lock before TRUNCATE TABLE can proceed. This guarantees that no other transaction is using the table. Incompatible change: Truncate via delete no longer fails if sql_safe_updates is activated (this was a undocumented side effect). libmysqld/CMakeLists.txt: Add new files to the build list. libmysqld/Makefile.am: Add new files to the build list. mysql-test/extra/binlog_tests/binlog_truncate.test: Add test case for Bug#42643 mysql-test/include/mix1.inc: Update test case as TRUNCATE TABLE now grabs a exclusive lock. Ensure that TRUNCATE waits for granted locks on the table. mysql-test/suite/binlog/t/binlog_truncate_innodb.test: As with other data modifying statements, TRUNCATE is still not possible in a transaction with isolation level READ COMMITTED or READ UNCOMMITED. It would be possible to implement so, but it is not worth the effort. mysql-test/suite/binlog/t/binlog_truncate_myisam.test: Test under different binlog formats. mysql-test/suite/binlog/t/disabled.def: Re-enable test case. mysql-test/t/innodb_bug38231.test: Truncate no longer works with row-level locks. mysql-test/t/mdl_sync.test: Ensure that a acquired lock is not given up due to a conflict. mysql-test/t/partition_innodb_semi_consistent.test: End transaction as to release metadata locks. mysql-test/t/truncate.test: A metadata lock is now taken before the object is verified. sql/CMakeLists.txt: Add new files to the build list. sql/Makefile.am: Add new files to the build list. sql/datadict.cc: Introduce a new file specific for data dictionary operations. sql/datadict.h: Add header file. sql/sql_base.cc: Rename data dictionary function. sql/sql_bitmap.h: Include dependency. sql/sql_delete.cc: Move away from relying on mysql_delete() to delete all rows of a table. Thus, move any bits related to truncate to sql_truncate.cc sql/sql_delete.h: Remove parameter. sql/sql_parse.cc: Add protection against the global read lock -- a intention exclusive lock can be acquired in the truncate path. sql/sql_show.cc: Add sync point for testing scenarios where a pending flush is ignored. sql/sql_truncate.cc: Acquire a shared metadata lock before accessing table metadata. Upgrade the lock to a exclusive one if the table can be re-created. Rework binlog rules to better reflect the requirements. sql/sql_yacc.yy: Set appropriate lock types for table to be truncated. sql/table.h: Move to data dictionary header.
2010-05-25 17:01:38 -03:00
/* Probably a table. */
err:
mysql_file_close(file, MYF(MY_WME));
DBUG_RETURN(type);
Bug#42643: InnoDB does not support replication of TRUNCATE TABLE The problem was that TRUNCATE TABLE didn't take a exclusive lock on a table if it resorted to truncating via delete of all rows in the table. Specifically for InnoDB tables, this could break proper isolation as InnoDB ends up aborting some granted locks when truncating a table. The solution is to take a exclusive metadata lock before TRUNCATE TABLE can proceed. This guarantees that no other transaction is using the table. Incompatible change: Truncate via delete no longer fails if sql_safe_updates is activated (this was a undocumented side effect). libmysqld/CMakeLists.txt: Add new files to the build list. libmysqld/Makefile.am: Add new files to the build list. mysql-test/extra/binlog_tests/binlog_truncate.test: Add test case for Bug#42643 mysql-test/include/mix1.inc: Update test case as TRUNCATE TABLE now grabs a exclusive lock. Ensure that TRUNCATE waits for granted locks on the table. mysql-test/suite/binlog/t/binlog_truncate_innodb.test: As with other data modifying statements, TRUNCATE is still not possible in a transaction with isolation level READ COMMITTED or READ UNCOMMITED. It would be possible to implement so, but it is not worth the effort. mysql-test/suite/binlog/t/binlog_truncate_myisam.test: Test under different binlog formats. mysql-test/suite/binlog/t/disabled.def: Re-enable test case. mysql-test/t/innodb_bug38231.test: Truncate no longer works with row-level locks. mysql-test/t/mdl_sync.test: Ensure that a acquired lock is not given up due to a conflict. mysql-test/t/partition_innodb_semi_consistent.test: End transaction as to release metadata locks. mysql-test/t/truncate.test: A metadata lock is now taken before the object is verified. sql/CMakeLists.txt: Add new files to the build list. sql/Makefile.am: Add new files to the build list. sql/datadict.cc: Introduce a new file specific for data dictionary operations. sql/datadict.h: Add header file. sql/sql_base.cc: Rename data dictionary function. sql/sql_bitmap.h: Include dependency. sql/sql_delete.cc: Move away from relying on mysql_delete() to delete all rows of a table. Thus, move any bits related to truncate to sql_truncate.cc sql/sql_delete.h: Remove parameter. sql/sql_parse.cc: Add protection against the global read lock -- a intention exclusive lock can be acquired in the truncate path. sql/sql_show.cc: Add sync point for testing scenarios where a pending flush is ignored. sql/sql_truncate.cc: Acquire a shared metadata lock before accessing table metadata. Upgrade the lock to a exclusive one if the table can be re-created. Rework binlog rules to better reflect the requirements. sql/sql_yacc.yy: Set appropriate lock types for table to be truncated. sql/table.h: Move to data dictionary header.
2010-05-25 17:01:38 -03:00
}
/*
Regenerate a metadata locked table.
@param thd Thread context.
@param db Name of the database to which the table belongs to.
@param name Table name.
2013-04-09 15:49:48 +02:00
@param path For temporary tables only - path to table files.
Otherwise NULL (the path is calculated from db and table names).
Bug#42643: InnoDB does not support replication of TRUNCATE TABLE The problem was that TRUNCATE TABLE didn't take a exclusive lock on a table if it resorted to truncating via delete of all rows in the table. Specifically for InnoDB tables, this could break proper isolation as InnoDB ends up aborting some granted locks when truncating a table. The solution is to take a exclusive metadata lock before TRUNCATE TABLE can proceed. This guarantees that no other transaction is using the table. Incompatible change: Truncate via delete no longer fails if sql_safe_updates is activated (this was a undocumented side effect). libmysqld/CMakeLists.txt: Add new files to the build list. libmysqld/Makefile.am: Add new files to the build list. mysql-test/extra/binlog_tests/binlog_truncate.test: Add test case for Bug#42643 mysql-test/include/mix1.inc: Update test case as TRUNCATE TABLE now grabs a exclusive lock. Ensure that TRUNCATE waits for granted locks on the table. mysql-test/suite/binlog/t/binlog_truncate_innodb.test: As with other data modifying statements, TRUNCATE is still not possible in a transaction with isolation level READ COMMITTED or READ UNCOMMITED. It would be possible to implement so, but it is not worth the effort. mysql-test/suite/binlog/t/binlog_truncate_myisam.test: Test under different binlog formats. mysql-test/suite/binlog/t/disabled.def: Re-enable test case. mysql-test/t/innodb_bug38231.test: Truncate no longer works with row-level locks. mysql-test/t/mdl_sync.test: Ensure that a acquired lock is not given up due to a conflict. mysql-test/t/partition_innodb_semi_consistent.test: End transaction as to release metadata locks. mysql-test/t/truncate.test: A metadata lock is now taken before the object is verified. sql/CMakeLists.txt: Add new files to the build list. sql/Makefile.am: Add new files to the build list. sql/datadict.cc: Introduce a new file specific for data dictionary operations. sql/datadict.h: Add header file. sql/sql_base.cc: Rename data dictionary function. sql/sql_bitmap.h: Include dependency. sql/sql_delete.cc: Move away from relying on mysql_delete() to delete all rows of a table. Thus, move any bits related to truncate to sql_truncate.cc sql/sql_delete.h: Remove parameter. sql/sql_parse.cc: Add protection against the global read lock -- a intention exclusive lock can be acquired in the truncate path. sql/sql_show.cc: Add sync point for testing scenarios where a pending flush is ignored. sql/sql_truncate.cc: Acquire a shared metadata lock before accessing table metadata. Upgrade the lock to a exclusive one if the table can be re-created. Rework binlog rules to better reflect the requirements. sql/sql_yacc.yy: Set appropriate lock types for table to be truncated. sql/table.h: Move to data dictionary header.
2010-05-25 17:01:38 -03:00
@retval FALSE Success.
@retval TRUE Error.
*/
2013-04-09 15:49:48 +02:00
bool dd_recreate_table(THD *thd, const char *db, const char *table_name,
const char *path)
Bug#42643: InnoDB does not support replication of TRUNCATE TABLE The problem was that TRUNCATE TABLE didn't take a exclusive lock on a table if it resorted to truncating via delete of all rows in the table. Specifically for InnoDB tables, this could break proper isolation as InnoDB ends up aborting some granted locks when truncating a table. The solution is to take a exclusive metadata lock before TRUNCATE TABLE can proceed. This guarantees that no other transaction is using the table. Incompatible change: Truncate via delete no longer fails if sql_safe_updates is activated (this was a undocumented side effect). libmysqld/CMakeLists.txt: Add new files to the build list. libmysqld/Makefile.am: Add new files to the build list. mysql-test/extra/binlog_tests/binlog_truncate.test: Add test case for Bug#42643 mysql-test/include/mix1.inc: Update test case as TRUNCATE TABLE now grabs a exclusive lock. Ensure that TRUNCATE waits for granted locks on the table. mysql-test/suite/binlog/t/binlog_truncate_innodb.test: As with other data modifying statements, TRUNCATE is still not possible in a transaction with isolation level READ COMMITTED or READ UNCOMMITED. It would be possible to implement so, but it is not worth the effort. mysql-test/suite/binlog/t/binlog_truncate_myisam.test: Test under different binlog formats. mysql-test/suite/binlog/t/disabled.def: Re-enable test case. mysql-test/t/innodb_bug38231.test: Truncate no longer works with row-level locks. mysql-test/t/mdl_sync.test: Ensure that a acquired lock is not given up due to a conflict. mysql-test/t/partition_innodb_semi_consistent.test: End transaction as to release metadata locks. mysql-test/t/truncate.test: A metadata lock is now taken before the object is verified. sql/CMakeLists.txt: Add new files to the build list. sql/Makefile.am: Add new files to the build list. sql/datadict.cc: Introduce a new file specific for data dictionary operations. sql/datadict.h: Add header file. sql/sql_base.cc: Rename data dictionary function. sql/sql_bitmap.h: Include dependency. sql/sql_delete.cc: Move away from relying on mysql_delete() to delete all rows of a table. Thus, move any bits related to truncate to sql_truncate.cc sql/sql_delete.h: Remove parameter. sql/sql_parse.cc: Add protection against the global read lock -- a intention exclusive lock can be acquired in the truncate path. sql/sql_show.cc: Add sync point for testing scenarios where a pending flush is ignored. sql/sql_truncate.cc: Acquire a shared metadata lock before accessing table metadata. Upgrade the lock to a exclusive one if the table can be re-created. Rework binlog rules to better reflect the requirements. sql/sql_yacc.yy: Set appropriate lock types for table to be truncated. sql/table.h: Move to data dictionary header.
2010-05-25 17:01:38 -03:00
{
bool error= TRUE;
HA_CREATE_INFO create_info;
2013-04-09 15:49:48 +02:00
char path_buf[FN_REFLEN + 1];
Bug#42643: InnoDB does not support replication of TRUNCATE TABLE The problem was that TRUNCATE TABLE didn't take a exclusive lock on a table if it resorted to truncating via delete of all rows in the table. Specifically for InnoDB tables, this could break proper isolation as InnoDB ends up aborting some granted locks when truncating a table. The solution is to take a exclusive metadata lock before TRUNCATE TABLE can proceed. This guarantees that no other transaction is using the table. Incompatible change: Truncate via delete no longer fails if sql_safe_updates is activated (this was a undocumented side effect). libmysqld/CMakeLists.txt: Add new files to the build list. libmysqld/Makefile.am: Add new files to the build list. mysql-test/extra/binlog_tests/binlog_truncate.test: Add test case for Bug#42643 mysql-test/include/mix1.inc: Update test case as TRUNCATE TABLE now grabs a exclusive lock. Ensure that TRUNCATE waits for granted locks on the table. mysql-test/suite/binlog/t/binlog_truncate_innodb.test: As with other data modifying statements, TRUNCATE is still not possible in a transaction with isolation level READ COMMITTED or READ UNCOMMITED. It would be possible to implement so, but it is not worth the effort. mysql-test/suite/binlog/t/binlog_truncate_myisam.test: Test under different binlog formats. mysql-test/suite/binlog/t/disabled.def: Re-enable test case. mysql-test/t/innodb_bug38231.test: Truncate no longer works with row-level locks. mysql-test/t/mdl_sync.test: Ensure that a acquired lock is not given up due to a conflict. mysql-test/t/partition_innodb_semi_consistent.test: End transaction as to release metadata locks. mysql-test/t/truncate.test: A metadata lock is now taken before the object is verified. sql/CMakeLists.txt: Add new files to the build list. sql/Makefile.am: Add new files to the build list. sql/datadict.cc: Introduce a new file specific for data dictionary operations. sql/datadict.h: Add header file. sql/sql_base.cc: Rename data dictionary function. sql/sql_bitmap.h: Include dependency. sql/sql_delete.cc: Move away from relying on mysql_delete() to delete all rows of a table. Thus, move any bits related to truncate to sql_truncate.cc sql/sql_delete.h: Remove parameter. sql/sql_parse.cc: Add protection against the global read lock -- a intention exclusive lock can be acquired in the truncate path. sql/sql_show.cc: Add sync point for testing scenarios where a pending flush is ignored. sql/sql_truncate.cc: Acquire a shared metadata lock before accessing table metadata. Upgrade the lock to a exclusive one if the table can be re-created. Rework binlog rules to better reflect the requirements. sql/sql_yacc.yy: Set appropriate lock types for table to be truncated. sql/table.h: Move to data dictionary header.
2010-05-25 17:01:38 -03:00
DBUG_ENTER("dd_recreate_table");
memset(&create_info, 0, sizeof(create_info));
2013-04-09 15:49:48 +02:00
if (path)
create_info.options|= HA_LEX_CREATE_TMP_TABLE;
else
{
build_table_filename(path_buf, sizeof(path_buf) - 1,
db, table_name, "", 0);
path= path_buf;
/* There should be a exclusive metadata lock on the table. */
DBUG_ASSERT(thd->mdl_context.is_lock_owner(MDL_key::TABLE, db, table_name,
MDL_EXCLUSIVE));
}
Bug#42643: InnoDB does not support replication of TRUNCATE TABLE The problem was that TRUNCATE TABLE didn't take a exclusive lock on a table if it resorted to truncating via delete of all rows in the table. Specifically for InnoDB tables, this could break proper isolation as InnoDB ends up aborting some granted locks when truncating a table. The solution is to take a exclusive metadata lock before TRUNCATE TABLE can proceed. This guarantees that no other transaction is using the table. Incompatible change: Truncate via delete no longer fails if sql_safe_updates is activated (this was a undocumented side effect). libmysqld/CMakeLists.txt: Add new files to the build list. libmysqld/Makefile.am: Add new files to the build list. mysql-test/extra/binlog_tests/binlog_truncate.test: Add test case for Bug#42643 mysql-test/include/mix1.inc: Update test case as TRUNCATE TABLE now grabs a exclusive lock. Ensure that TRUNCATE waits for granted locks on the table. mysql-test/suite/binlog/t/binlog_truncate_innodb.test: As with other data modifying statements, TRUNCATE is still not possible in a transaction with isolation level READ COMMITTED or READ UNCOMMITED. It would be possible to implement so, but it is not worth the effort. mysql-test/suite/binlog/t/binlog_truncate_myisam.test: Test under different binlog formats. mysql-test/suite/binlog/t/disabled.def: Re-enable test case. mysql-test/t/innodb_bug38231.test: Truncate no longer works with row-level locks. mysql-test/t/mdl_sync.test: Ensure that a acquired lock is not given up due to a conflict. mysql-test/t/partition_innodb_semi_consistent.test: End transaction as to release metadata locks. mysql-test/t/truncate.test: A metadata lock is now taken before the object is verified. sql/CMakeLists.txt: Add new files to the build list. sql/Makefile.am: Add new files to the build list. sql/datadict.cc: Introduce a new file specific for data dictionary operations. sql/datadict.h: Add header file. sql/sql_base.cc: Rename data dictionary function. sql/sql_bitmap.h: Include dependency. sql/sql_delete.cc: Move away from relying on mysql_delete() to delete all rows of a table. Thus, move any bits related to truncate to sql_truncate.cc sql/sql_delete.h: Remove parameter. sql/sql_parse.cc: Add protection against the global read lock -- a intention exclusive lock can be acquired in the truncate path. sql/sql_show.cc: Add sync point for testing scenarios where a pending flush is ignored. sql/sql_truncate.cc: Acquire a shared metadata lock before accessing table metadata. Upgrade the lock to a exclusive one if the table can be re-created. Rework binlog rules to better reflect the requirements. sql/sql_yacc.yy: Set appropriate lock types for table to be truncated. sql/table.h: Move to data dictionary header.
2010-05-25 17:01:38 -03:00
/* Attempt to reconstruct the table. */
error= ha_create_table(thd, path, db, table_name, &create_info, NULL);
Bug#42643: InnoDB does not support replication of TRUNCATE TABLE The problem was that TRUNCATE TABLE didn't take a exclusive lock on a table if it resorted to truncating via delete of all rows in the table. Specifically for InnoDB tables, this could break proper isolation as InnoDB ends up aborting some granted locks when truncating a table. The solution is to take a exclusive metadata lock before TRUNCATE TABLE can proceed. This guarantees that no other transaction is using the table. Incompatible change: Truncate via delete no longer fails if sql_safe_updates is activated (this was a undocumented side effect). libmysqld/CMakeLists.txt: Add new files to the build list. libmysqld/Makefile.am: Add new files to the build list. mysql-test/extra/binlog_tests/binlog_truncate.test: Add test case for Bug#42643 mysql-test/include/mix1.inc: Update test case as TRUNCATE TABLE now grabs a exclusive lock. Ensure that TRUNCATE waits for granted locks on the table. mysql-test/suite/binlog/t/binlog_truncate_innodb.test: As with other data modifying statements, TRUNCATE is still not possible in a transaction with isolation level READ COMMITTED or READ UNCOMMITED. It would be possible to implement so, but it is not worth the effort. mysql-test/suite/binlog/t/binlog_truncate_myisam.test: Test under different binlog formats. mysql-test/suite/binlog/t/disabled.def: Re-enable test case. mysql-test/t/innodb_bug38231.test: Truncate no longer works with row-level locks. mysql-test/t/mdl_sync.test: Ensure that a acquired lock is not given up due to a conflict. mysql-test/t/partition_innodb_semi_consistent.test: End transaction as to release metadata locks. mysql-test/t/truncate.test: A metadata lock is now taken before the object is verified. sql/CMakeLists.txt: Add new files to the build list. sql/Makefile.am: Add new files to the build list. sql/datadict.cc: Introduce a new file specific for data dictionary operations. sql/datadict.h: Add header file. sql/sql_base.cc: Rename data dictionary function. sql/sql_bitmap.h: Include dependency. sql/sql_delete.cc: Move away from relying on mysql_delete() to delete all rows of a table. Thus, move any bits related to truncate to sql_truncate.cc sql/sql_delete.h: Remove parameter. sql/sql_parse.cc: Add protection against the global read lock -- a intention exclusive lock can be acquired in the truncate path. sql/sql_show.cc: Add sync point for testing scenarios where a pending flush is ignored. sql/sql_truncate.cc: Acquire a shared metadata lock before accessing table metadata. Upgrade the lock to a exclusive one if the table can be re-created. Rework binlog rules to better reflect the requirements. sql/sql_yacc.yy: Set appropriate lock types for table to be truncated. sql/table.h: Move to data dictionary header.
2010-05-25 17:01:38 -03:00
DBUG_RETURN(error);
}