MySQL 8.4.0
Source Code Documentation
sql_gipk.cc File Reference
#include "sql_gipk.h"
#include "sql/create_field.h"
#include "sql/dd/properties.h"
#include "sql/dd/types/abstract_table.h"
#include "sql/dd/types/index.h"
#include "sql/sql_alter.h"
#include "sql/sql_class.h"
#include "sql/sql_lex.h"
#include "sql/sql_table.h"

Functions

bool is_generated_invisible_primary_key_column_name (const char *column_name)
 Check if column_name matches generated invisible primary key column name. More...
 
static bool is_generating_invisible_pk_supported_for_se (handlerton *se_handlerton)
 Check if invisible primary key generation is supported for the table's storage engine. More...
 
bool is_generate_invisible_primary_key_mode_active (THD *thd)
 Check if generate invisible primary key mode is active. More...
 
bool is_candidate_table_for_invisible_primary_key_generation (const HA_CREATE_INFO *create_info, Alter_info *alter_info)
 Check if table being created is suitable for invisible primary key generation. More...
 
static bool validate_invisible_primary_key_generation (THD *thd, Alter_info *alter_info)
 Validate invisible primary key generation for a candidate table (table being created). More...
 
static bool generate_invisible_primary_key (THD *thd, Alter_info *alter_info)
 Generates invisible primary key for a table. More...
 
bool validate_and_generate_invisible_primary_key (THD *thd, Alter_info *alter_info)
 Validate and generate invisible primary key for a candidate table (table being created). More...
 
bool adjust_generated_invisible_primary_key_column_position (THD *thd, handlerton *se_handlerton, TABLE *old_table, List< Create_field > *prepared_create_list)
 Adjust generated invisible primary key column position in prepared fields list for the ALTER TABLE statement. More...
 
static bool is_candidate_table_for_pk_alter_restrictions_check (handlerton *se_handlerton, TABLE *old_table)
 Check if table being altered is suitable to apply primary key ALTER restriction checks. More...
 
bool check_primary_key_alter_restrictions (THD *thd, handlerton *se_handlerton, Alter_info *alter_info, TABLE *old_table)
 Check ALTER restrictions on primary key and column. More...
 
bool table_def_has_generated_invisible_primary_key (THD *thd, handlerton *se_handlerton, const List< Create_field > &create_fields, uint keys, const KEY *keyinfo)
 Check that definition of a table being created or altered has a generated invisible primary key definition. More...
 
static bool is_generated_invisible_primary_key_column (Field *field)
 Check if column is a generated invisible primary key column. More...
 
static bool is_generated_invisible_primary_key (const KEY *key)
 Check if KEY is of a generated invisible primary key. More...
 
static const KEYfind_generated_invisible_primary_key (const TABLE *table)
 Find generated invisible primary key in KEYs list of a table. More...
 
bool table_has_generated_invisible_primary_key (const TABLE *table)
 Check if table has a generated invisible primary key. More...
 

Variables

const char * gipk_column_name = "my_row_id"
 

Function Documentation

◆ adjust_generated_invisible_primary_key_column_position()

bool adjust_generated_invisible_primary_key_column_position ( THD thd,
handlerton se_handlerton,
TABLE old_table,
List< Create_field > *  prepared_create_list 
)

Adjust generated invisible primary key column position in prepared fields list for the ALTER TABLE statement.

Make sure generated invisible column is positioned at the first place.

Parameters
[in]thdThread handle.
[in]se_handlertonHandlerton instance of table's storage engine
[in]old_tableOld definition of a table being altered.
[in,out]prepared_create_listCreate_field list prepared for ALTER in prepare_fields_and_keys().
Return values
falseOn success.
trueOn failure.

◆ check_primary_key_alter_restrictions()

bool check_primary_key_alter_restrictions ( THD thd,
handlerton se_handlerton,
Alter_info alter_info,
TABLE old_table 
)

Check ALTER restrictions on primary key and column.

Following ALTER restrictions are applicable on primary key and column,

) When sql_generate_invisible_primary_key is enabled then, primary key is allowed to drop only if new table definition has a primary key.

) Generated invisible primary key is allowed to drop only if primary key column is also dropped. This restriction is applicable irrespective of sql_generate_invisible_primary_key's state.

) CHANGE/MODIFY OR ALTER operations on generated invisible primary key columns are not allowed except ALTER operation to change column visibility attribute. This restriction is applicable irrespective of sql_generate_invisible_primary_key's state.

Parameters
[in]thdThread handle.
[in]se_handlertonHandlerton instance of table's storage engine
[in]alter_infoAlter_info instance describing new table definition of a table being altered.
[in]old_tableOld definition of a table being altered.
Return values
falseOn success.
trueOn failure.

◆ find_generated_invisible_primary_key()

static const KEY * find_generated_invisible_primary_key ( const TABLE table)
static

Find generated invisible primary key in KEYs list of a table.

Parameters
tableTABLE instance of a table.
Return values
KEY*KEY instance of a generated primary key.
nullptrIf table does not have a generated invisible primary key.

◆ generate_invisible_primary_key()

static bool generate_invisible_primary_key ( THD thd,
Alter_info alter_info 
)
static

Generates invisible primary key for a table.

Parameters
[in]thdThread handle.
[in,out]alter_infoAlter_info instance describing table being created or altered.
Return values
falseOn success.
trueOn failure.

◆ is_candidate_table_for_invisible_primary_key_generation()

bool is_candidate_table_for_invisible_primary_key_generation ( const HA_CREATE_INFO create_info,
Alter_info alter_info 
)

Check if table being created is suitable for invisible primary key generation.

Primary key is generated only if a) explicit primary key is not defined for a table b) primary key generation is supported for the storage engine.

Parameters
[in]create_infoHA_CREATE_INFO instance describing table being created.
[in]alter_infoAlter_info instance describing table being created.
Return values
trueif table is suitable for primary key generation.
falseOtherwise.

◆ is_candidate_table_for_pk_alter_restrictions_check()

static bool is_candidate_table_for_pk_alter_restrictions_check ( handlerton se_handlerton,
TABLE old_table 
)
static

Check if table being altered is suitable to apply primary key ALTER restriction checks.

Parameters
se_handlertonHandlerton instance of table's storage engine.
old_tableOld definition of table being altered.
Return values
trueif table is suitable to apply ALTER restriction checks.
falseOtherwise.

◆ is_generate_invisible_primary_key_mode_active()

bool is_generate_invisible_primary_key_mode_active ( THD thd)

Check if generate invisible primary key mode is active.

Note: For bootstreap and initialize system threads, generate invisible primary key mode is not applicable. If there are any system table without explicit primary key then primary key is not generated for them while bootstrapping or initializing.

Parameters
[in]thdThread handle.
Returns
true if @sql_generate_invisible_primary_key is ON for thread other than bootstrap and initialize system threads.

◆ is_generated_invisible_primary_key()

static bool is_generated_invisible_primary_key ( const KEY key)
static

Check if KEY is of a generated invisible primary key.

Parameters
keyKEY instance.
Return values
trueIf KEY is of a generated invisible primary key.
falseOtherwise.

◆ is_generated_invisible_primary_key_column()

static bool is_generated_invisible_primary_key_column ( Field field)
static

Check if column is a generated invisible primary key column.

Parameters
fieldFIELD instance.
Return values
trueIf column is a generated invisible primary key column.
falseOtherwise.

◆ is_generated_invisible_primary_key_column_name()

bool is_generated_invisible_primary_key_column_name ( const char *  column_name)

Check if column_name matches generated invisible primary key column name.

Parameters
[in]column_nameName of a column.
Return values
truecolumn_name matches generated invisible primary key column name.
falseOtherwise.

◆ is_generating_invisible_pk_supported_for_se()

static bool is_generating_invisible_pk_supported_for_se ( handlerton se_handlerton)
static

Check if invisible primary key generation is supported for the table's storage engine.

Parameters
se_handlertonHandlerton instance of storage engine.
Return values
trueIf generating primary key is supported.
falseOtherwise.

◆ table_def_has_generated_invisible_primary_key()

bool table_def_has_generated_invisible_primary_key ( THD thd,
handlerton se_handlerton,
const List< Create_field > &  create_fields,
uint  keys,
const KEY keyinfo 
)

Check that definition of a table being created or altered has a generated invisible primary key definition.

Parameters
[in]thdThread handle.
[in]se_handlertonHandlerton instance of table's storage engine
[in]create_fieldsList of Create_field instance for the table columns.
[in]keysNumber of KEY structs in the 'keyinfo'.
[in]keyinfoAn array of KEY structs for the indexes.
Returns
true if table definition has a generated invisible primary key otherwise returns false.

◆ table_has_generated_invisible_primary_key()

bool table_has_generated_invisible_primary_key ( const TABLE table)

Check if table has a generated invisible primary key.

Parameters
[in]tableTABLE instance of a table.
Return values
trueIf table has a generated invisible primary key.
falseOtherwise.

◆ validate_and_generate_invisible_primary_key()

bool validate_and_generate_invisible_primary_key ( THD thd,
Alter_info alter_info 
)

Validate and generate invisible primary key for a candidate table (table being created).

Primary key is generated if, a) Table is a non-partitioned table. Generating invisible primary key is not supported for partitioned tables for now. b) Table does not have a column with auto_increment attribute. c) Table does not have a column with name "my_row_id". d) Table is not created using CREATE TABLE ... SELECT in binlog_format=STATEMENT mode. Otherwise an error is reported in the validation of phase.

Parameters
[in]thdThread handle.
[in,out]alter_infoAlter_info instance describing table being created or altered.
Return values
falseOn success.
trueOn failure.

◆ validate_invisible_primary_key_generation()

static bool validate_invisible_primary_key_generation ( THD thd,
Alter_info alter_info 
)
static

Validate invisible primary key generation for a candidate table (table being created).

Parameters
thdThread handle.
alter_infoAlter_info instance describing table being created.
Return values
falseOn success.
trueOn failure.

Variable Documentation

◆ gipk_column_name

const char* gipk_column_name = "my_row_id"