mirror of
				https://github.com/MariaDB/server.git
				synced 2025-10-31 10:56:12 +01:00 
			
		
		
		
	 eb1f8b2919
			
		
	
	
	eb1f8b2919
	
	
	
		
			
			dict_find_max_space_id(): Return SELECT MAX(SPACE) FROM SYS_TABLES. dict_check_tablespaces_and_store_max_id(): In the normal case (no encryption plugin has been loaded and the change buffer is empty), invoke dict_find_max_space_id() and do not open any .ibd files. If a std::set<uint32_t> has been specified, open the files whose tablespace ID is mentioned. Else, open all data files that are identified by SYS_TABLES records. fil_ibd_open(): Remove a call to os_file_get_last_error() that can report a misleading error, such as EINVAL inside my_realpath() that is not an actual error. This could be invoked when a data file is found but the FSP_SPACE_FLAGS are incorrect, such as is the case for table test.td in ./mtr --mysqld=--innodb-buffer-pool-dump-at-shutdown=0 innodb.table_flags buf_load(): If any tablespaces could not be found, invoke dict_check_tablespaces_and_store_max_id() on the missing tablespaces. dict_load_tablespace(): Try to load the tablespace unless it was found to be futile. This fixes failures related to FTS_*.ibd files for FULLTEXT INDEX. btr_cur_t::search_leaf(): Prevent a crash when the tablespace does not exist. This was caught by the test innodb_fts.fts_concurrent_insert when the change to dict_load_tablespaces() was not present. We modify a few tests to ensure that tables will not be loaded at startup. For some fault injection tests this means that the corrupted tables will not be loaded, because dict_load_tablespace() would perform stricter checks than dict_check_tablespaces_and_store_max_id(). Tested by: Matthias Leich Reviewed by: Thirunarayanan Balathandayuthapani
		
			
				
	
	
		
			214 lines
		
	
	
	
		
			8.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			214 lines
		
	
	
	
		
			8.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*****************************************************************************
 | |
| 
 | |
| Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved.
 | |
| Copyright (c) 2017, 2022, MariaDB Corporation.
 | |
| 
 | |
| 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 Street, Fifth Floor, Boston, MA 02110-1335 USA
 | |
| 
 | |
| *****************************************************************************/
 | |
| 
 | |
| /**************************************************//**
 | |
| @file include/dict0load.h
 | |
| Loads to the memory cache database object definitions
 | |
| from dictionary tables
 | |
| 
 | |
| Created 4/24/1996 Heikki Tuuri
 | |
| *******************************************************/
 | |
| 
 | |
| #ifndef dict0load_h
 | |
| #define dict0load_h
 | |
| 
 | |
| #include "dict0types.h"
 | |
| #include "trx0types.h"
 | |
| #include "ut0byte.h"
 | |
| #include "mem0mem.h"
 | |
| #include "btr0types.h"
 | |
| 
 | |
| #include <deque>
 | |
| #include <set>
 | |
| 
 | |
| /** A stack of table names related through foreign key constraints */
 | |
| typedef std::deque<const char*, ut_allocator<const char*> >	dict_names_t;
 | |
| 
 | |
| /** Check MAX(SPACE) FROM SYS_TABLES and store it in fil_system.
 | |
| Open each data file if an encryption plugin has been loaded.
 | |
| 
 | |
| @param spaces  set of tablespace files to open */
 | |
| void dict_check_tablespaces_and_store_max_id(const std::set<uint32_t> *spaces);
 | |
| 
 | |
| /** Make sure the data_file_name is saved in dict_table_t if needed.
 | |
| @param[in,out]	table		Table object */
 | |
| void dict_get_and_save_data_dir_path(dict_table_t* table);
 | |
| 
 | |
| /***********************************************************************//**
 | |
| Loads a table object based on the table id.
 | |
| @return table; NULL if table does not exist */
 | |
| dict_table_t*
 | |
| dict_load_table_on_id(
 | |
| /*==================*/
 | |
| 	table_id_t		table_id,	/*!< in: table id */
 | |
| 	dict_err_ignore_t	ignore_err);	/*!< in: errors to ignore
 | |
| 						when loading the table */
 | |
| /********************************************************************//**
 | |
| This function is called when the database is booted.
 | |
| Loads system table index definitions except for the clustered index which
 | |
| is added to the dictionary cache at booting before calling this function. */
 | |
| void
 | |
| dict_load_sys_table(
 | |
| /*================*/
 | |
| 	dict_table_t*	table);	/*!< in: system table */
 | |
| /***********************************************************************//**
 | |
| Loads foreign key constraints where the table is either the foreign key
 | |
| holder or where the table is referenced by a foreign key. Adds these
 | |
| constraints to the data dictionary.
 | |
| 
 | |
| The foreign key constraint is loaded only if the referenced table is also
 | |
| in the dictionary cache.  If the referenced table is not in dictionary
 | |
| cache, then it is added to the output parameter (fk_tables).
 | |
| 
 | |
| @return DB_SUCCESS or error code */
 | |
| dberr_t
 | |
| dict_load_foreigns(
 | |
| /*===============*/
 | |
| 	const char*		table_name,	/*!< in: table name */
 | |
| 	const char**		col_names,	/*!< in: column names, or NULL
 | |
| 						to use table->col_names */
 | |
| 	trx_id_t		trx_id,		/*!< in: DDL transaction id,
 | |
| 						or 0 to check
 | |
| 						recursive load of tables
 | |
| 						chained by FK */
 | |
| 	bool			check_charsets,	/*!< in: whether to check
 | |
| 						charset compatibility */
 | |
| 	dict_err_ignore_t	ignore_err,	/*!< in: error to be ignored */
 | |
| 	dict_names_t&		fk_tables)	/*!< out: stack of table names
 | |
| 						which must be loaded
 | |
| 						subsequently to load all the
 | |
| 						foreign key constraints. */
 | |
| 	MY_ATTRIBUTE((nonnull(1)));
 | |
| 
 | |
| /********************************************************************//**
 | |
| This function opens a system table, and return the first record.
 | |
| @return first record of the system table */
 | |
| const rec_t*
 | |
| dict_startscan_system(
 | |
| /*==================*/
 | |
| 	btr_pcur_t*	pcur,		/*!< out: persistent cursor to
 | |
| 					the record */
 | |
| 	mtr_t*		mtr,		/*!< in: the mini-transaction */
 | |
| 	dict_table_t*	table);		/*!< in: system table */
 | |
| /********************************************************************//**
 | |
| This function get the next system table record as we scan the table.
 | |
| @return the record if found, NULL if end of scan. */
 | |
| const rec_t*
 | |
| dict_getnext_system(
 | |
| /*================*/
 | |
| 	btr_pcur_t*	pcur,		/*!< in/out: persistent cursor
 | |
| 					to the record */
 | |
| 	mtr_t*		mtr);		/*!< in: the mini-transaction */
 | |
| 
 | |
| /** Load a table definition from a SYS_TABLES record to dict_table_t.
 | |
| Do not load any columns or indexes.
 | |
| @param[in,out]	mtr		mini-transaction
 | |
| @param[in]	uncommitted	whether to use READ UNCOMMITTED isolation level
 | |
| @param[in]	rec		SYS_TABLES record
 | |
| @param[out,own]	table		table, or nullptr
 | |
| @return	error message
 | |
| @retval	nullptr on success */
 | |
| const char *dict_load_table_low(mtr_t *mtr, bool uncommitted,
 | |
|                                 const rec_t *rec, dict_table_t **table)
 | |
|   MY_ATTRIBUTE((nonnull, warn_unused_result));
 | |
| 
 | |
| /********************************************************************//**
 | |
| This function parses a SYS_INDEXES record and populate a dict_index_t
 | |
| structure with the information from the record. For detail information
 | |
| about SYS_INDEXES fields, please refer to dict_boot() function.
 | |
| @return error message, or NULL on success */
 | |
| const char*
 | |
| dict_process_sys_indexes_rec(
 | |
| /*=========================*/
 | |
| 	mem_heap_t*	heap,		/*!< in/out: heap memory */
 | |
| 	const rec_t*	rec,		/*!< in: current SYS_INDEXES rec */
 | |
| 	dict_index_t*	index,		/*!< out: dict_index_t to be
 | |
| 					filled */
 | |
| 	table_id_t*	table_id);	/*!< out: table id */
 | |
| /********************************************************************//**
 | |
| This function parses a SYS_COLUMNS record and populate a dict_column_t
 | |
| structure with the information from the record.
 | |
| @return error message, or NULL on success */
 | |
| const char*
 | |
| dict_process_sys_columns_rec(
 | |
| /*=========================*/
 | |
| 	mem_heap_t*	heap,		/*!< in/out: heap memory */
 | |
| 	const rec_t*	rec,		/*!< in: current SYS_COLUMNS rec */
 | |
| 	dict_col_t*	column,		/*!< out: dict_col_t to be filled */
 | |
| 	table_id_t*	table_id,	/*!< out: table id */
 | |
| 	const char**	col_name,	/*!< out: column name */
 | |
| 	ulint*		nth_v_col);	/*!< out: if virtual col, this is
 | |
| 					records its sequence number */
 | |
| 
 | |
| /** This function parses a SYS_VIRTUAL record and extract virtual column
 | |
| information
 | |
| @param[in,out]	heap		heap memory
 | |
| @param[in]	rec		current SYS_COLUMNS rec
 | |
| @param[in,out]	table_id	table id
 | |
| @param[in,out]	pos		virtual column position
 | |
| @param[in,out]	base_pos	base column position
 | |
| @return error message, or NULL on success */
 | |
| const char*
 | |
| dict_process_sys_virtual_rec(
 | |
| 	const rec_t*	rec,
 | |
| 	table_id_t*	table_id,
 | |
| 	ulint*		pos,
 | |
| 	ulint*		base_pos);
 | |
| /********************************************************************//**
 | |
| This function parses a SYS_FIELDS record and populate a dict_field_t
 | |
| structure with the information from the record.
 | |
| @return error message, or NULL on success */
 | |
| const char*
 | |
| dict_process_sys_fields_rec(
 | |
| /*========================*/
 | |
| 	mem_heap_t*	heap,		/*!< in/out: heap memory */
 | |
| 	const rec_t*	rec,		/*!< in: current SYS_FIELDS rec */
 | |
| 	dict_field_t*	sys_field,	/*!< out: dict_field_t to be
 | |
| 					filled */
 | |
| 	ulint*		pos,		/*!< out: Field position */
 | |
| 	index_id_t*	index_id,	/*!< out: current index id */
 | |
| 	index_id_t	last_id);	/*!< in: previous index id */
 | |
| /********************************************************************//**
 | |
| This function parses a SYS_FOREIGN record and populate a dict_foreign_t
 | |
| structure with the information from the record. For detail information
 | |
| about SYS_FOREIGN fields, please refer to dict_load_foreign() function
 | |
| @return error message, or NULL on success */
 | |
| const char*
 | |
| dict_process_sys_foreign_rec(
 | |
| /*=========================*/
 | |
| 	mem_heap_t*	heap,		/*!< in/out: heap memory */
 | |
| 	const rec_t*	rec,		/*!< in: current SYS_FOREIGN rec */
 | |
| 	dict_foreign_t*	foreign);	/*!< out: dict_foreign_t to be
 | |
| 					filled */
 | |
| /********************************************************************//**
 | |
| This function parses a SYS_FOREIGN_COLS record and extract necessary
 | |
| information from the record and return to caller.
 | |
| @return error message, or NULL on success */
 | |
| const char*
 | |
| dict_process_sys_foreign_col_rec(
 | |
| /*=============================*/
 | |
| 	mem_heap_t*	heap,		/*!< in/out: heap memory */
 | |
| 	const rec_t*	rec,		/*!< in: current SYS_FOREIGN_COLS rec */
 | |
| 	const char**	name,		/*!< out: foreign key constraint name */
 | |
| 	const char**	for_col_name,	/*!< out: referencing column name */
 | |
| 	const char**	ref_col_name,	/*!< out: referenced column name
 | |
| 					in referenced table */
 | |
| 	ulint*		pos);		/*!< out: column position */
 | |
| 
 | |
| #endif
 |