mirror of
				https://github.com/MariaDB/server.git
				synced 2025-11-04 04:46:15 +01:00 
			
		
		
		
	mtr_t::trx: New public const data member. If it is nullptr, per-connection statistics will not be updated. The transaction is not necessarily in active state. We may merely use it as an "anchor" for buffering updates of buf_pool.stat.n_page_gets in trx_t::pages_accessed. As part of this, we try to create mtr_t less often, reusing one object in multiple places. Some read operations will invoke mtr_t::rollback_to_savepoint() to release their own page latches within a larger mini-transactions. Reviewed by: Vladislav Lesin Tested by: Saahil Alam
		
			
				
	
	
		
			230 lines
		
	
	
	
		
			9.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			230 lines
		
	
	
	
		
			9.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/*****************************************************************************
 | 
						|
 | 
						|
Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved.
 | 
						|
Copyright (c) 2017, 2023, 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
 | 
						|
@param upgrade whether we need to invoke ibuf_upgrade() */
 | 
						|
void dict_load_tablespaces(const std::set<uint32_t> *spaces= nullptr,
 | 
						|
                           bool upgrade= false);
 | 
						|
 | 
						|
/** 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 */
 | 
						|
/** Load definitions for table indexes. Adds them to the data dictionary cache.
 | 
						|
@param mtr         mini-transaction
 | 
						|
@param table       table definition
 | 
						|
@param uncommitted false=READ COMMITTED, true=READ UNCOMMITTED
 | 
						|
@param heap        memory heap for temporary storage
 | 
						|
@param ignore_err  errors to be ignored when loading the index definition
 | 
						|
@return error code
 | 
						|
@retval DB_SUCCESS if all indexes were successfully loaded
 | 
						|
@retval DB_CORRUPTION if corruption of dictionary table
 | 
						|
@retval DB_UNSUPPORTED if table has unknown index type */
 | 
						|
MY_ATTRIBUTE((nonnull))
 | 
						|
dberr_t dict_load_indexes(mtr_t *mtr, dict_table_t *table, bool uncommitted,
 | 
						|
                          mem_heap_t *heap, dict_err_ignore_t ignore_err);
 | 
						|
/***********************************************************************//**
 | 
						|
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(
 | 
						|
/*===============*/
 | 
						|
	mtr_t&			mtr,		/*!< in/out: mini-transaction*/
 | 
						|
	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(2)));
 | 
						|
 | 
						|
/********************************************************************//**
 | 
						|
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 */
 | 
						|
 | 
						|
/** This function gets the next system table record as it scans
 | 
						|
the table.
 | 
						|
@param pcur persistent cursor
 | 
						|
@param mtr  mini-transaction
 | 
						|
@return the next record if found
 | 
						|
@retval nullptr at the end of the table */
 | 
						|
const rec_t*
 | 
						|
dict_getnext_system_low(btr_pcur_t *pcur, mtr_t *mtr);
 | 
						|
#endif
 |