mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
Merge 10.6 into 10.7
This commit is contained in:
@@ -1997,11 +1997,10 @@ static void DBUGOpenFile(CODE_STATE *cs,
|
|||||||
static void DBUGCloseFile(CODE_STATE *cs, sFILE *new_value)
|
static void DBUGCloseFile(CODE_STATE *cs, sFILE *new_value)
|
||||||
{
|
{
|
||||||
sFILE *fp;
|
sFILE *fp;
|
||||||
if (!cs || !cs->stack || !cs->stack->out_file)
|
if (!cs || !cs->stack || !(fp= cs->stack->out_file))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
fp= cs->stack->out_file;
|
if (fp != sstdout && fp != sstderr && --fp->used == 0)
|
||||||
if (--fp->used == 0)
|
|
||||||
{
|
{
|
||||||
if (fclose(fp->file) == EOF)
|
if (fclose(fp->file) == EOF)
|
||||||
{
|
{
|
||||||
|
@@ -18,7 +18,7 @@
|
|||||||
.\" SQL scripts
|
.\" SQL scripts
|
||||||
.\" batch SQL files
|
.\" batch SQL files
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
mysql \- the MariaDB command\-line tool
|
mariadb \- the MariaDB command\-line tool (mysql is now a symlink to mariadb)
|
||||||
.SH "SYNOPSIS"
|
.SH "SYNOPSIS"
|
||||||
.HP \w'\fBmysql\ [\fR\fB\fIoptions\fR\fR\fB]\ \fR\fB\fIdb_name\fR\fR\ 'u
|
.HP \w'\fBmysql\ [\fR\fB\fIoptions\fR\fR\fB]\ \fR\fB\fIdb_name\fR\fR\ 'u
|
||||||
\fBmysql [\fR\fB\fIoptions\fR\fR\fB] \fR\fB\fIdb_name\fR\fR
|
\fBmysql [\fR\fB\fIoptions\fR\fR\fB] \fR\fB\fIdb_name\fR\fR
|
||||||
|
@@ -14,9 +14,9 @@
|
|||||||
.\" mysql_client_test
|
.\" mysql_client_test
|
||||||
.\" mysql_client_test_embedded
|
.\" mysql_client_test_embedded
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
mysql_client_test \- test client API
|
mariadb-client-test \- test client API (mysql_client_test is now a symlink to mariadb-client-test)
|
||||||
.br
|
.br
|
||||||
mysql_client_test_embedded \- test client API for embedded server
|
mariadb-client-test-embedded \- test client API for embedded server (mysql_client_test_embedded is now a symlink to mariadb-client-test-embedded)
|
||||||
.SH "SYNOPSIS"
|
.SH "SYNOPSIS"
|
||||||
.HP \w'\fBmysql_client_test\ [\fR\fB\fIoptions\fR\fR\fB]\ [\fR\fB\fItest_name\fR\fR\fB]\ \&.\&.\&.\fR\ 'u
|
.HP \w'\fBmysql_client_test\ [\fR\fB\fIoptions\fR\fR\fB]\ [\fR\fB\fItest_name\fR\fR\fB]\ \&.\&.\&.\fR\ 'u
|
||||||
\fBmysql_client_test [\fR\fB\fIoptions\fR\fR\fB] [\fR\fB\fItest_name\fR\fR\fB] \&.\&.\&.\fR
|
\fBmysql_client_test [\fR\fB\fIoptions\fR\fR\fB] [\fR\fB\fItest_name\fR\fR\fB] \&.\&.\&.\fR
|
||||||
|
@@ -13,7 +13,7 @@
|
|||||||
.\" -----------------------------------------------------------------
|
.\" -----------------------------------------------------------------
|
||||||
.\" mysql_convert_table_format
|
.\" mysql_convert_table_format
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
mysql_convert_table_format \- convert tables to use a given storage engine
|
mariadb-convert-table-format \- convert tables to use a given storage engine (mysql_convert_table_format is now a symlink to mariadb-convert-table-format)
|
||||||
.SH "SYNOPSIS"
|
.SH "SYNOPSIS"
|
||||||
.HP \w'\fBmysql_convert_table_format\ [\fR\fB\fIoptions\fR\fR\fB]\ \fR\fB\fIdb_name\fR\fR\ 'u
|
.HP \w'\fBmysql_convert_table_format\ [\fR\fB\fIoptions\fR\fR\fB]\ \fR\fB\fIdb_name\fR\fR\ 'u
|
||||||
\fBmysql_convert_table_format [\fR\fB\fIoptions\fR\fR\fB] \fR\fB\fIdb_name\fR\fR
|
\fBmysql_convert_table_format [\fR\fB\fIoptions\fR\fR\fB] \fR\fB\fIdb_name\fR\fR
|
||||||
|
@@ -13,7 +13,7 @@
|
|||||||
.\" -----------------------------------------------------------------
|
.\" -----------------------------------------------------------------
|
||||||
.\" mysql_find_rows
|
.\" mysql_find_rows
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
mysql_find_rows \- extract SQL statements from files
|
mariadb-find-rows \- extract SQL statements from files (mysql_find_rows is now a symlink to mariadb-find-rows)
|
||||||
.SH "SYNOPSIS"
|
.SH "SYNOPSIS"
|
||||||
.HP \w'\fBmysql_find_rows\ [\fR\fB\fIoptions\fR\fR\fB]\ [\fR\fB\fIfile_name\fR\fR\fB\ \&.\&.\&.]\fR\ 'u
|
.HP \w'\fBmysql_find_rows\ [\fR\fB\fIoptions\fR\fR\fB]\ [\fR\fB\fIfile_name\fR\fR\fB\ \&.\&.\&.]\fR\ 'u
|
||||||
\fBmysql_find_rows [\fR\fB\fIoptions\fR\fR\fB] [\fR\fB\fIfile_name\fR\fR\fB \&.\&.\&.]\fR
|
\fBmysql_find_rows [\fR\fB\fIoptions\fR\fR\fB] [\fR\fB\fIfile_name\fR\fR\fB \&.\&.\&.]\fR
|
||||||
|
@@ -13,7 +13,7 @@
|
|||||||
.\" -----------------------------------------------------------------
|
.\" -----------------------------------------------------------------
|
||||||
.\" mysql_fix_extensions
|
.\" mysql_fix_extensions
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
mysql_fix_extensions \- normalize table file name extensions
|
mariadb-fix-extensions \- normalize table file name extensions (mysql_fix_extensions is now a symlink to mariadb-fix-extensions)
|
||||||
.SH "SYNOPSIS"
|
.SH "SYNOPSIS"
|
||||||
.HP \w'\fBmysql_fix_extensions\ \fR\fB\fIdata_dir\fR\fR\ 'u
|
.HP \w'\fBmysql_fix_extensions\ \fR\fB\fIdata_dir\fR\fR\ 'u
|
||||||
\fBmysql_fix_extensions \fR\fB\fIdata_dir\fR\fR
|
\fBmysql_fix_extensions \fR\fB\fIdata_dir\fR\fR
|
||||||
|
@@ -13,7 +13,7 @@
|
|||||||
.\" -----------------------------------------------------------------
|
.\" -----------------------------------------------------------------
|
||||||
.\" mysql_install_db
|
.\" mysql_install_db
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
mysql_install_db \- initialize MariaDB data directory
|
mariadb-install-db \- initialize MariaDB data directory (mysql_install_db is now a symlink to mariadb-install-db)
|
||||||
.SH "SYNOPSIS"
|
.SH "SYNOPSIS"
|
||||||
.HP \w'\fBmysql_install_db\ [\fR\fB\fIoptions\fR\fR\fB]\fR\ 'u
|
.HP \w'\fBmysql_install_db\ [\fR\fB\fIoptions\fR\fR\fB]\fR\ 'u
|
||||||
\fBmysql_install_db [\fR\fB\fIoptions\fR\fR\fB]\fR
|
\fBmysql_install_db [\fR\fB\fIoptions\fR\fR\fB]\fR
|
||||||
|
@@ -9,7 +9,7 @@
|
|||||||
.\" disable justification (adjust text to left margin only)
|
.\" disable justification (adjust text to left margin only)
|
||||||
.ad l
|
.ad l
|
||||||
.SH NAME
|
.SH NAME
|
||||||
mysql_ldb \- RocksDB tool
|
mariadb-ldb \- RocksDB tool (mysql_ldb is now a symlink to mariadb-ldb)
|
||||||
.SH DESCRIPTION
|
.SH DESCRIPTION
|
||||||
Use \fBmysql_ldb \-\-help\fR for details on usage\.
|
Use \fBmysql_ldb \-\-help\fR for details on usage\.
|
||||||
.PP
|
.PP
|
||||||
|
@@ -22,7 +22,7 @@
|
|||||||
.\" -----------------------------------------------------------------
|
.\" -----------------------------------------------------------------
|
||||||
.\" mysql_plugin
|
.\" mysql_plugin
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
mysql_plugin \- configure MariaDB server plugins
|
mariadb-plugin \- configure MariaDB server plugins (mysql_plugin is now a symlink to mariadb-plugin)
|
||||||
.SH "SYNOPSIS"
|
.SH "SYNOPSIS"
|
||||||
.HP \w'\fBmysql_plugin\ [\fR\fB\fIoptions\fR\fR\fB]\ \fR\fB\fIplugin\fR\fR\fB\ {ENABLE|DISABLE}\fR\ 'u
|
.HP \w'\fBmysql_plugin\ [\fR\fB\fIoptions\fR\fR\fB]\ \fR\fB\fIplugin\fR\fR\fB\ {ENABLE|DISABLE}\fR\ 'u
|
||||||
\fBmysql_plugin [\fR\fB\fIoptions\fR\fR\fB] \fR\fB\fIplugin\fR\fR\fB {ENABLE|DISABLE}\fR
|
\fBmysql_plugin [\fR\fB\fIoptions\fR\fR\fB] \fR\fB\fIplugin\fR\fR\fB {ENABLE|DISABLE}\fR
|
||||||
|
@@ -13,7 +13,7 @@
|
|||||||
.\" -----------------------------------------------------------------
|
.\" -----------------------------------------------------------------
|
||||||
.\" mysql_secure_installation
|
.\" mysql_secure_installation
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
mysql_secure_installation \- improve MariaDB installation security
|
mariadb-secure-installation \- improve MariaDB installation security (mysql_secure_installation is now a symlink to mariadb-secure-installation)
|
||||||
.SH "SYNOPSIS"
|
.SH "SYNOPSIS"
|
||||||
.HP \w'\fBmysql_secure_installation\fR\ 'u
|
.HP \w'\fBmysql_secure_installation\fR\ 'u
|
||||||
\fBmysql_secure_installation\fR
|
\fBmysql_secure_installation\fR
|
||||||
|
@@ -13,7 +13,7 @@
|
|||||||
.\" -----------------------------------------------------------------
|
.\" -----------------------------------------------------------------
|
||||||
.\" mysql_setpermission
|
.\" mysql_setpermission
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
mysql_setpermission \- interactively set permissions in grant tables
|
mariadb-setpermission \- interactively set permissions in grant tables (mysql_setpermission is now a symlink to mariadb-setpermission)
|
||||||
.SH "SYNOPSIS"
|
.SH "SYNOPSIS"
|
||||||
.HP \w'\fBmysql_setpermission\ [\fR\fB\fIoptions\fR\fR\fB]\fR\ 'u
|
.HP \w'\fBmysql_setpermission\ [\fR\fB\fIoptions\fR\fR\fB]\fR\ 'u
|
||||||
\fBmysql_setpermission [\fR\fB\fIoptions\fR\fR\fB]\fR
|
\fBmysql_setpermission [\fR\fB\fIoptions\fR\fR\fB]\fR
|
||||||
|
@@ -14,7 +14,7 @@
|
|||||||
.\" mysql_tzinfo_to_sql
|
.\" mysql_tzinfo_to_sql
|
||||||
.\" time zone tables
|
.\" time zone tables
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
mysql_tzinfo_to_sql \- load the time zone tables
|
mariadb-tzinfo-to-sql \- load the time zone tables (mysql_tzinfo_to_sql is now a symlink to mariadb-tzinfo-to-sql)
|
||||||
.SH "SYNOPSIS"
|
.SH "SYNOPSIS"
|
||||||
.HP \w'\fBmysql_tzinfo_to_sql\ \fR\fB\fIarguments\fR\fR\ 'u
|
.HP \w'\fBmysql_tzinfo_to_sql\ \fR\fB\fIarguments\fR\fR\ 'u
|
||||||
\fBmysql_tzinfo_to_sql \fR\fB\fIarguments\fR\fR
|
\fBmysql_tzinfo_to_sql \fR\fB\fIarguments\fR\fR
|
||||||
|
@@ -15,7 +15,7 @@
|
|||||||
.\" upgrading MySQL
|
.\" upgrading MySQL
|
||||||
.\" MySQL: upgrading
|
.\" MySQL: upgrading
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
mysql_upgrade \- check tables for MariaDB upgrade
|
mariadb-upgrade \- check tables for MariaDB upgrade (mysql_upgrade is now a symlink to mariadb-upgrade)
|
||||||
.SH "SYNOPSIS"
|
.SH "SYNOPSIS"
|
||||||
.HP \w'\fBmysql_upgrade\ [\fR\fB\fIoptions\fR\fR\fB]\fR\ 'u
|
.HP \w'\fBmysql_upgrade\ [\fR\fB\fIoptions\fR\fR\fB]\fR\ 'u
|
||||||
\fBmysql_upgrade [\fR\fB\fIoptions\fR\fR\fB]\fR
|
\fBmysql_upgrade [\fR\fB\fIoptions\fR\fR\fB]\fR
|
||||||
|
@@ -13,7 +13,7 @@
|
|||||||
.\" -----------------------------------------------------------------
|
.\" -----------------------------------------------------------------
|
||||||
.\" mysql_waitpid
|
.\" mysql_waitpid
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
mysql_waitpid \- kill process and wait for its termination
|
mariadb-waitpid \- kill process and wait for its termination (mysql_waitpid is now a symlink to mariadb-waitpid)
|
||||||
.SH "SYNOPSIS"
|
.SH "SYNOPSIS"
|
||||||
.HP \w'\fBmysql_waitpid\ [\fR\fB\fIoptions\fR\fR\fB]\ \fR\fB\fIpid\fR\fR\fB\ \fR\fB\fIwait_time\fR\fR\ 'u
|
.HP \w'\fBmysql_waitpid\ [\fR\fB\fIoptions\fR\fR\fB]\ \fR\fB\fIpid\fR\fR\fB\ \fR\fB\fIwait_time\fR\fR\ 'u
|
||||||
\fBmysql_waitpid [\fR\fB\fIoptions\fR\fR\fB] \fR\fB\fIpid\fR\fR\fB \fR\fB\fIwait_time\fR\fR
|
\fBmysql_waitpid [\fR\fB\fIoptions\fR\fR\fB] \fR\fB\fIpid\fR\fR\fB \fR\fB\fIwait_time\fR\fR
|
||||||
|
@@ -13,7 +13,7 @@
|
|||||||
.\" -----------------------------------------------------------------
|
.\" -----------------------------------------------------------------
|
||||||
.\" mysqlaccess
|
.\" mysqlaccess
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
mysqlaccess \- client for checking access privileges
|
mariadb-access \- client for checking access privileges (mysqlaccess is now a symlink to mariadb-access)
|
||||||
.SH "SYNOPSIS"
|
.SH "SYNOPSIS"
|
||||||
.HP \w'\fBmysqlaccess\ [\fR\fB\fIhost_name\fR\fR\fB\ [\fR\fB\fIuser_name\fR\fR\fB\ [\fR\fB\fIdb_name\fR\fR\fB]]]\ [\fR\fB\fIoptions\fR\fR\fB]\fR\ 'u
|
.HP \w'\fBmysqlaccess\ [\fR\fB\fIhost_name\fR\fR\fB\ [\fR\fB\fIuser_name\fR\fR\fB\ [\fR\fB\fIdb_name\fR\fR\fB]]]\ [\fR\fB\fIoptions\fR\fR\fB]\fR\ 'u
|
||||||
\fBmysqlaccess [\fR\fB\fIhost_name\fR\fR\fB [\fR\fB\fIuser_name\fR\fR\fB [\fR\fB\fIdb_name\fR\fR\fB]]] [\fR\fB\fIoptions\fR\fR\fB]\fR
|
\fBmysqlaccess [\fR\fB\fIhost_name\fR\fR\fB [\fR\fB\fIuser_name\fR\fR\fB [\fR\fB\fIdb_name\fR\fR\fB]]] [\fR\fB\fIoptions\fR\fR\fB]\fR
|
||||||
|
@@ -15,7 +15,7 @@
|
|||||||
.\" administration: server
|
.\" administration: server
|
||||||
.\" server administration
|
.\" server administration
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
mysqladmin \- client for administering a MariaDB server
|
mariadb-admin \- client for administering a MariaDB server (mysqladmin is now a symlink to mariadb-admin)
|
||||||
.SH "SYNOPSIS"
|
.SH "SYNOPSIS"
|
||||||
.HP \w'\fBmysqladmin\ [\fR\fB\fIoptions\fR\fR\fB]\ \fR\fB\fIcommand\fR\fR\fB\ [\fR\fB\fIcommand\-arg\fR\fR\fB]\ [\fR\fB\fIcommand\fR\fR\fB\ [\fR\fB\fIcommand\-arg\fR\fR\fB]]\ \&.\&.\&.\fR\ 'u
|
.HP \w'\fBmysqladmin\ [\fR\fB\fIoptions\fR\fR\fB]\ \fR\fB\fIcommand\fR\fR\fB\ [\fR\fB\fIcommand\-arg\fR\fR\fB]\ [\fR\fB\fIcommand\fR\fR\fB\ [\fR\fB\fIcommand\-arg\fR\fR\fB]]\ \&.\&.\&.\fR\ 'u
|
||||||
\fBmysqladmin [\fR\fB\fIoptions\fR\fR\fB] \fR\fB\fIcommand\fR\fR\fB [\fR\fB\fIcommand\-arg\fR\fR\fB] [\fR\fB\fIcommand\fR\fR\fB [\fR\fB\fIcommand\-arg\fR\fR\fB]] \&.\&.\&.\fR
|
\fBmysqladmin [\fR\fB\fIoptions\fR\fR\fB] \fR\fB\fIcommand\fR\fR\fB [\fR\fB\fIcommand\-arg\fR\fR\fB] [\fR\fB\fIcommand\fR\fR\fB [\fR\fB\fIcommand\-arg\fR\fR\fB]] \&.\&.\&.\fR
|
||||||
|
@@ -13,7 +13,7 @@
|
|||||||
.\" -----------------------------------------------------------------
|
.\" -----------------------------------------------------------------
|
||||||
.\" mysqlbinlog
|
.\" mysqlbinlog
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
mysqlbinlog \- utility for processing binary log files
|
mariadb-binlog \- utility for processing binary log files (mysqlbinlog is now a symlink to mariadb-binlog)
|
||||||
.SH "SYNOPSIS"
|
.SH "SYNOPSIS"
|
||||||
.HP \w'\fBmysqlbinlog\ [\fR\fBoptions\fR\fB]\ \fR\fB\fIlog_file\fR\fR\fB\ \&.\&.\&.\fR\ 'u
|
.HP \w'\fBmysqlbinlog\ [\fR\fBoptions\fR\fB]\ \fR\fB\fIlog_file\fR\fR\fB\ \&.\&.\&.\fR\ 'u
|
||||||
\fBmysqlbinlog [\fR\fBoptions\fR\fB] \fR\fB\fIlog_file\fR\fR\fB \&.\&.\&.\fR
|
\fBmysqlbinlog [\fR\fBoptions\fR\fB] \fR\fB\fIlog_file\fR\fR\fB \&.\&.\&.\fR
|
||||||
|
@@ -17,7 +17,7 @@
|
|||||||
.\" tables: maintenance
|
.\" tables: maintenance
|
||||||
.\" tables: repair
|
.\" tables: repair
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
mysqlcheck \- a table maintenance program
|
mariadb-check \- a table maintenance program (mysqlcheck is now a symlink to mariadb-check)
|
||||||
.SH "SYNOPSIS"
|
.SH "SYNOPSIS"
|
||||||
.HP \w'\fBmysqlcheck\ [\fR\fB\fIoptions\fR\fR\fB]\ [\fR\fB\fIdb_name\fR\fR\fB\ [\fR\fB\fItbl_name\fR\fR\fB\ \&.\&.\&.]]\fR\ 'u
|
.HP \w'\fBmysqlcheck\ [\fR\fB\fIoptions\fR\fR\fB]\ [\fR\fB\fIdb_name\fR\fR\fB\ [\fR\fB\fItbl_name\fR\fR\fB\ \&.\&.\&.]]\fR\ 'u
|
||||||
\fBmysqlcheck [\fR\fB\fIoptions\fR\fR\fB] [\fR\fB\fIdb_name\fR\fR\fB [\fR\fB\fItbl_name\fR\fR\fB \&.\&.\&.]]\fR
|
\fBmysqlcheck [\fR\fB\fIoptions\fR\fR\fB] [\fR\fB\fIdb_name\fR\fR\fB [\fR\fB\fItbl_name\fR\fR\fB \&.\&.\&.]]\fR
|
||||||
|
@@ -14,7 +14,7 @@
|
|||||||
.\" mysqld: MariaDB server
|
.\" mysqld: MariaDB server
|
||||||
.\" MariaDB server: mysqld
|
.\" MariaDB server: mysqld
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
mysqld \- the MariaDB server
|
mariadbd \- the MariaDB server (mysqld is now a symlink to mariadbd)
|
||||||
.SH "SYNOPSIS"
|
.SH "SYNOPSIS"
|
||||||
.HP \w'\fBmysqld\ [\fR\fB\fIoptions\fR\fR\fB]\fR\ 'u
|
.HP \w'\fBmysqld\ [\fR\fB\fIoptions\fR\fR\fB]\fR\ 'u
|
||||||
\fBmysqld [\fR\fB\fIoptions\fR\fR\fB]\fR
|
\fBmysqld [\fR\fB\fIoptions\fR\fR\fB]\fR
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
'\" t
|
'\" t
|
||||||
.\"
|
.\"
|
||||||
.TH "\FBMARIADB-MULTI\FR" "1" "15 May 2020" "MariaDB 10\&.7" "MariaDB Database System"
|
.TH "\FBMARIADBD-MULTI\FR" "1" "15 May 2020" "MariaDB 10\&.7" "MariaDB Database System"
|
||||||
.\" -----------------------------------------------------------------
|
.\" -----------------------------------------------------------------
|
||||||
.\" * set default formatting
|
.\" * set default formatting
|
||||||
.\" -----------------------------------------------------------------
|
.\" -----------------------------------------------------------------
|
||||||
@@ -16,7 +16,7 @@
|
|||||||
.\" scripts
|
.\" scripts
|
||||||
.\" multi mysqld
|
.\" multi mysqld
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
mysqld_multi \- manage multiple MariaDB servers
|
mariadbd-multi \- manage multiple MariaDB servers (mysqld_multi is now a symlink to mariadbd-multi)
|
||||||
.SH "SYNOPSIS"
|
.SH "SYNOPSIS"
|
||||||
.HP \w'\fBmysqld_multi\ [\fR\fB\fIoptions\fR\fR\fB]\ {start|stop|report}\ [\fR\fB\fIGNR\fR\fR\fB[,\fR\fB\fIGNR\fR\fR\fB]\ \&.\&.\&.]\fR\ 'u
|
.HP \w'\fBmysqld_multi\ [\fR\fB\fIoptions\fR\fR\fB]\ {start|stop|report}\ [\fR\fB\fIGNR\fR\fR\fB[,\fR\fB\fIGNR\fR\fR\fB]\ \&.\&.\&.]\fR\ 'u
|
||||||
\fBmysqld_multi [\fR\fB\fIoptions\fR\fR\fB] {start|stop|report} [\fR\fB\fIGNR\fR\fR\fB[,\fR\fB\fIGNR\fR\fR\fB] \&.\&.\&.]\fR
|
\fBmysqld_multi [\fR\fB\fIoptions\fR\fR\fB] {start|stop|report} [\fR\fB\fIGNR\fR\fR\fB[,\fR\fB\fIGNR\fR\fR\fB] \&.\&.\&.]\fR
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
'\" t
|
'\" t
|
||||||
.\"
|
.\"
|
||||||
.TH "\FBMARIADB-SAFE\FR" "1" "15 May 2020" "MariaDB 10\&.7" "MariaDB Database System"
|
.TH "\FBMARIADBD-SAFE\FR" "1" "15 May 2020" "MariaDB 10\&.7" "MariaDB Database System"
|
||||||
.\" -----------------------------------------------------------------
|
.\" -----------------------------------------------------------------
|
||||||
.\" * set default formatting
|
.\" * set default formatting
|
||||||
.\" -----------------------------------------------------------------
|
.\" -----------------------------------------------------------------
|
||||||
@@ -15,7 +15,7 @@
|
|||||||
.\" tools: mysqld_safe
|
.\" tools: mysqld_safe
|
||||||
.\" scripts
|
.\" scripts
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
mysqld_safe \- MariaDB server startup script
|
mariadbd-safe \- MariaDB server startup script (mysqld_safe is now a symlink to mariadbd-safe)
|
||||||
.SH "SYNOPSIS"
|
.SH "SYNOPSIS"
|
||||||
.HP \w'\fBmysqld_safe\ \fR\fB\fIoptions\fR\fR\ 'u
|
.HP \w'\fBmysqld_safe\ \fR\fB\fIoptions\fR\fR\ 'u
|
||||||
\fBmysqld_safe \fR\fB\fIoptions\fR\fR
|
\fBmysqld_safe \fR\fB\fIoptions\fR\fR
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
'\" t
|
'\" t
|
||||||
.\"
|
.\"
|
||||||
.TH "\FBMARIADB-SAFE-HELPER\FR" "1" "15 May 2020" "MariaDB 10\&.7" "MariaDB Database System"
|
.TH "\FBMARIADBD-SAFE-HELPER\FR" "1" "15 May 2020" "MariaDB 10\&.7" "MariaDB Database System"
|
||||||
.\" -----------------------------------------------------------------
|
.\" -----------------------------------------------------------------
|
||||||
.\" * set default formatting
|
.\" * set default formatting
|
||||||
.\" -----------------------------------------------------------------
|
.\" -----------------------------------------------------------------
|
||||||
@@ -9,7 +9,7 @@
|
|||||||
.\" disable justification (adjust text to left margin only)
|
.\" disable justification (adjust text to left margin only)
|
||||||
.ad l
|
.ad l
|
||||||
.SH NAME
|
.SH NAME
|
||||||
mysqld_safe_helper \- helper script
|
mariadbd-safe-helper \- helper script (mysqld_safe_helper is now a symlink to mariadbd-safe-helper)
|
||||||
.SH DESCRIPTION
|
.SH DESCRIPTION
|
||||||
Use: Helper script\.
|
Use: Helper script\.
|
||||||
.PP
|
.PP
|
||||||
|
@@ -17,7 +17,7 @@
|
|||||||
.\" databases: dumping
|
.\" databases: dumping
|
||||||
.\" tables: dumping
|
.\" tables: dumping
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
mysqldump \- a database backup program
|
mariadb-dump \- a database backup program (mysqldump is now a symlink to mariadb-dump)
|
||||||
.SH "SYNOPSIS"
|
.SH "SYNOPSIS"
|
||||||
.HP \w'\fBmysqldump\ [\fR\fB\fIoptions\fR\fR\fB]\ [\fR\fB\fIdb_name\fR\fR\fB\ [\fR\fB\fItbl_name\fR\fR\fB\ \&.\&.\&.]]\fR\ 'u
|
.HP \w'\fBmysqldump\ [\fR\fB\fIoptions\fR\fR\fB]\ [\fR\fB\fIdb_name\fR\fR\fB\ [\fR\fB\fItbl_name\fR\fR\fB\ \&.\&.\&.]]\fR\ 'u
|
||||||
\fBmysqldump [\fR\fB\fIoptions\fR\fR\fB] [\fR\fB\fIdb_name\fR\fR\fB [\fR\fB\fItbl_name\fR\fR\fB \&.\&.\&.]]\fR
|
\fBmysqldump [\fR\fB\fIoptions\fR\fR\fB] [\fR\fB\fIdb_name\fR\fR\fB [\fR\fB\fItbl_name\fR\fR\fB \&.\&.\&.]]\fR
|
||||||
|
@@ -13,7 +13,7 @@
|
|||||||
.\" -----------------------------------------------------------------
|
.\" -----------------------------------------------------------------
|
||||||
.\" mysqldumpslow
|
.\" mysqldumpslow
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
mysqldumpslow \- Summarize slow query log files
|
mariadb-dumpslow \- Summarize slow query log files (mysqldumpslow is now a symlink to mariadb-dumpslow)
|
||||||
.SH "SYNOPSIS"
|
.SH "SYNOPSIS"
|
||||||
.HP \w'\fBmysqldumpslow\ [\fR\fBoptions\fR\fB]\ [\fR\fB\fIlog_file\fR\fR\fB\ \&.\&.\&.]\fR\ 'u
|
.HP \w'\fBmysqldumpslow\ [\fR\fBoptions\fR\fB]\ [\fR\fB\fIlog_file\fR\fR\fB\ \&.\&.\&.]\fR\ 'u
|
||||||
\fBmysqldumpslow [\fR\fBoptions\fR\fB] [\fR\fB\fIlog_file\fR\fR\fB \&.\&.\&.]\fR
|
\fBmysqldumpslow [\fR\fBoptions\fR\fB] [\fR\fB\fIlog_file\fR\fR\fB \&.\&.\&.]\fR
|
||||||
|
@@ -17,7 +17,7 @@
|
|||||||
.\" databases: dumping
|
.\" databases: dumping
|
||||||
.\" tables: dumping
|
.\" tables: dumping
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
mysqlhotcopy \- a database backup program
|
mariadb-hotcopy \- a database backup program (mysqlhotcopy is now a symlink to mariadb-hotcopy)
|
||||||
.SH "SYNOPSIS"
|
.SH "SYNOPSIS"
|
||||||
.HP \w'\fBmysqlhotcopy\ \fR\fB\fIarguments\fR\fR\ 'u
|
.HP \w'\fBmysqlhotcopy\ \fR\fB\fIarguments\fR\fR\ 'u
|
||||||
\fBmysqlhotcopy \fR\fB\fIarguments\fR\fR
|
\fBmysqlhotcopy \fR\fB\fIarguments\fR\fR
|
||||||
|
@@ -17,7 +17,7 @@
|
|||||||
.\" files: text
|
.\" files: text
|
||||||
.\" text files: importing
|
.\" text files: importing
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
mysqlimport \- a data import program
|
mariadb-import \- a data import program (mysqlimport is now a symlink to mariadb-import)
|
||||||
.SH "SYNOPSIS"
|
.SH "SYNOPSIS"
|
||||||
.HP \w'\fBmysqlimport\ [\fR\fB\fIoptions\fR\fR\fB]\ \fR\fB\fIdb_name\fR\fR\fB\ \fR\fB\fItextfile1\fR\fR\fB\ \&.\&.\&.\fR\ 'u
|
.HP \w'\fBmysqlimport\ [\fR\fB\fIoptions\fR\fR\fB]\ \fR\fB\fIdb_name\fR\fR\fB\ \fR\fB\fItextfile1\fR\fR\fB\ \&.\&.\&.\fR\ 'u
|
||||||
\fBmysqlimport [\fR\fB\fIoptions\fR\fR\fB] \fR\fB\fIdb_name\fR\fR\fB \fR\fB\fItextfile1\fR\fR\fB \&.\&.\&.\fR
|
\fBmysqlimport [\fR\fB\fIoptions\fR\fR\fB] \fR\fB\fIdb_name\fR\fR\fB \fR\fB\fItextfile1\fR\fR\fB \&.\&.\&.\fR
|
||||||
|
@@ -18,7 +18,7 @@
|
|||||||
.\" columns: displaying
|
.\" columns: displaying
|
||||||
.\" showing: database information
|
.\" showing: database information
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
mysqlshow \- display database, table, and column information
|
mariadb-show \- display database, table, and column information (mysqlshow is now a symlink to mariadb-show)
|
||||||
.SH "SYNOPSIS"
|
.SH "SYNOPSIS"
|
||||||
.HP \w'\fBmysqlshow\ [\fR\fB\fIoptions\fR\fR\fB]\ [\fR\fB\fIdb_name\fR\fR\fB\ [\fR\fB\fItbl_name\fR\fR\fB\ [\fR\fB\fIcol_name\fR\fR\fB]]]\fR\ 'u
|
.HP \w'\fBmysqlshow\ [\fR\fB\fIoptions\fR\fR\fB]\ [\fR\fB\fIdb_name\fR\fR\fB\ [\fR\fB\fItbl_name\fR\fR\fB\ [\fR\fB\fIcol_name\fR\fR\fB]]]\fR\ 'u
|
||||||
\fBmysqlshow [\fR\fB\fIoptions\fR\fR\fB] [\fR\fB\fIdb_name\fR\fR\fB [\fR\fB\fItbl_name\fR\fR\fB [\fR\fB\fIcol_name\fR\fR\fB]]]\fR
|
\fBmysqlshow [\fR\fB\fIoptions\fR\fR\fB] [\fR\fB\fIdb_name\fR\fR\fB [\fR\fB\fItbl_name\fR\fR\fB [\fR\fB\fIcol_name\fR\fR\fB]]]\fR
|
||||||
|
@@ -14,7 +14,7 @@
|
|||||||
.\" mysqlslap
|
.\" mysqlslap
|
||||||
.\" load emulation
|
.\" load emulation
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
mysqlslap \- load emulation client
|
mariadb-slap \- load emulation client (mysqlslap is now a symlink to mariadb-slap)
|
||||||
.SH "SYNOPSIS"
|
.SH "SYNOPSIS"
|
||||||
.HP \w'\fBmysqlslap\ [\fR\fB\fIoptions\fR\fR\fB]\fR\ 'u
|
.HP \w'\fBmysqlslap\ [\fR\fB\fIoptions\fR\fR\fB]\fR\ 'u
|
||||||
\fBmysqlslap [\fR\fB\fIoptions\fR\fR\fB]\fR
|
\fBmysqlslap [\fR\fB\fIoptions\fR\fR\fB]\fR
|
||||||
|
@@ -14,7 +14,7 @@
|
|||||||
.\" mysqltest
|
.\" mysqltest
|
||||||
.\" mysqltest_embedded
|
.\" mysqltest_embedded
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
mysqltest \- program to run test cases
|
mariadb-test \- program to run test cases (mysqltest is now a symlink to mariadb-test)
|
||||||
.br
|
.br
|
||||||
mysqltest_embedded \- program to run embedded test cases
|
mysqltest_embedded \- program to run embedded test cases
|
||||||
.SH "SYNOPSIS"
|
.SH "SYNOPSIS"
|
||||||
|
@@ -3454,10 +3454,10 @@ a b max_c avg_c a b max_c avg_c a b min_c a b c d
|
|||||||
6 20 315 279.3333 6 20 315 279.3333 6 20 214 6 20 315 279
|
6 20 315 279.3333 6 20 315 279.3333 6 20 214 6 20 315 279
|
||||||
6 20 315 279.3333 6 20 315 279.3333 8 33 114 8 80 800 314
|
6 20 315 279.3333 6 20 315 279.3333 8 33 114 8 80 800 314
|
||||||
6 20 315 279.3333 6 20 315 279.3333 6 20 214 6 23 303 909
|
6 20 315 279.3333 6 20 315 279.3333 6 20 214 6 23 303 909
|
||||||
6 20 315 279.3333 8 33 404 213.6667 6 20 214 6 20 315 279
|
|
||||||
6 20 315 279.3333 8 33 404 213.6667 6 20 214 6 23 303 909
|
|
||||||
8 33 404 213.6667 6 20 315 279.3333 8 33 114 8 64 248 107
|
8 33 404 213.6667 6 20 315 279.3333 8 33 114 8 64 248 107
|
||||||
8 33 404 213.6667 6 20 315 279.3333 8 33 114 8 80 800 314
|
8 33 404 213.6667 6 20 315 279.3333 8 33 114 8 80 800 314
|
||||||
|
6 20 315 279.3333 8 33 404 213.6667 6 20 214 6 20 315 279
|
||||||
|
6 20 315 279.3333 8 33 404 213.6667 6 20 214 6 23 303 909
|
||||||
8 33 404 213.6667 8 33 404 213.6667 7 11 708 7 13 312 406
|
8 33 404 213.6667 8 33 404 213.6667 7 11 708 7 13 312 406
|
||||||
8 33 404 213.6667 8 33 404 213.6667 8 33 114 8 64 248 107
|
8 33 404 213.6667 8 33 404 213.6667 8 33 114 8 64 248 107
|
||||||
8 33 404 213.6667 8 33 404 213.6667 6 20 214 6 20 315 279
|
8 33 404 213.6667 8 33 404 213.6667 6 20 214 6 20 315 279
|
||||||
@@ -3472,10 +3472,10 @@ a b max_c avg_c a b max_c avg_c a b min_c a b c d
|
|||||||
6 20 315 279.3333 6 20 315 279.3333 6 20 214 6 20 315 279
|
6 20 315 279.3333 6 20 315 279.3333 6 20 214 6 20 315 279
|
||||||
6 20 315 279.3333 6 20 315 279.3333 8 33 114 8 80 800 314
|
6 20 315 279.3333 6 20 315 279.3333 8 33 114 8 80 800 314
|
||||||
6 20 315 279.3333 6 20 315 279.3333 6 20 214 6 23 303 909
|
6 20 315 279.3333 6 20 315 279.3333 6 20 214 6 23 303 909
|
||||||
6 20 315 279.3333 8 33 404 213.6667 6 20 214 6 20 315 279
|
|
||||||
6 20 315 279.3333 8 33 404 213.6667 6 20 214 6 23 303 909
|
|
||||||
8 33 404 213.6667 6 20 315 279.3333 8 33 114 8 64 248 107
|
8 33 404 213.6667 6 20 315 279.3333 8 33 114 8 64 248 107
|
||||||
8 33 404 213.6667 6 20 315 279.3333 8 33 114 8 80 800 314
|
8 33 404 213.6667 6 20 315 279.3333 8 33 114 8 80 800 314
|
||||||
|
6 20 315 279.3333 8 33 404 213.6667 6 20 214 6 20 315 279
|
||||||
|
6 20 315 279.3333 8 33 404 213.6667 6 20 214 6 23 303 909
|
||||||
8 33 404 213.6667 8 33 404 213.6667 7 11 708 7 13 312 406
|
8 33 404 213.6667 8 33 404 213.6667 7 11 708 7 13 312 406
|
||||||
8 33 404 213.6667 8 33 404 213.6667 8 33 114 8 64 248 107
|
8 33 404 213.6667 8 33 404 213.6667 8 33 114 8 64 248 107
|
||||||
8 33 404 213.6667 8 33 404 213.6667 6 20 214 6 20 315 279
|
8 33 404 213.6667 8 33 404 213.6667 6 20 214 6 20 315 279
|
||||||
@@ -3487,8 +3487,8 @@ and (v1.max_c<500) and (v3.a=t2.a) and (v2.max_c>300);
|
|||||||
id select_type table type possible_keys key key_len ref rows Extra
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 PRIMARY t2 ALL NULL NULL NULL NULL 9 Using where
|
1 PRIMARY t2 ALL NULL NULL NULL NULL 9 Using where
|
||||||
1 PRIMARY <derived4> ref key0 key0 5 test.t2.a 2 Using where
|
1 PRIMARY <derived4> ref key0 key0 5 test.t2.a 2 Using where
|
||||||
1 PRIMARY <derived3> ALL NULL NULL NULL NULL 20 Using where; Using join buffer (flat, BNL join)
|
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 20 Using where; Using join buffer (flat, BNL join)
|
||||||
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 20 Using where; Using join buffer (incremental, BNL join)
|
1 PRIMARY <derived3> ALL NULL NULL NULL NULL 20 Using where; Using join buffer (incremental, BNL join)
|
||||||
4 DERIVED t1 ALL NULL NULL NULL NULL 20 Using where; Using temporary; Using filesort
|
4 DERIVED t1 ALL NULL NULL NULL NULL 20 Using where; Using temporary; Using filesort
|
||||||
3 DERIVED t1 ALL NULL NULL NULL NULL 20 Using where; Using temporary; Using filesort
|
3 DERIVED t1 ALL NULL NULL NULL NULL 20 Using where; Using temporary; Using filesort
|
||||||
2 DERIVED t1 ALL NULL NULL NULL NULL 20 Using temporary; Using filesort
|
2 DERIVED t1 ALL NULL NULL NULL NULL 20 Using temporary; Using filesort
|
||||||
@@ -3536,6 +3536,35 @@ EXPLAIN
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"block-nl-join": {
|
||||||
|
"table": {
|
||||||
|
"table_name": "<derived2>",
|
||||||
|
"access_type": "ALL",
|
||||||
|
"rows": 20,
|
||||||
|
"filtered": 100,
|
||||||
|
"attached_condition": "v1.max_c < 500"
|
||||||
|
},
|
||||||
|
"buffer_type": "flat",
|
||||||
|
"buffer_size": "715",
|
||||||
|
"join_type": "BNL",
|
||||||
|
"materialized": {
|
||||||
|
"query_block": {
|
||||||
|
"select_id": 2,
|
||||||
|
"having_condition": "max_c < 707 and max_c < 500",
|
||||||
|
"filesort": {
|
||||||
|
"sort_key": "t1.a, t1.b",
|
||||||
|
"temporary_table": {
|
||||||
|
"table": {
|
||||||
|
"table_name": "t1",
|
||||||
|
"access_type": "ALL",
|
||||||
|
"rows": 20,
|
||||||
|
"filtered": 100
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"block-nl-join": {
|
"block-nl-join": {
|
||||||
"table": {
|
"table": {
|
||||||
"table_name": "<derived3>",
|
"table_name": "<derived3>",
|
||||||
@@ -3544,9 +3573,10 @@ EXPLAIN
|
|||||||
"filtered": 100,
|
"filtered": 100,
|
||||||
"attached_condition": "v2.max_c > 300"
|
"attached_condition": "v2.max_c > 300"
|
||||||
},
|
},
|
||||||
"buffer_type": "flat",
|
"buffer_type": "incremental",
|
||||||
"buffer_size": "715",
|
"buffer_size": "9Kb",
|
||||||
"join_type": "BNL",
|
"join_type": "BNL",
|
||||||
|
"attached_condition": "v2.a = v1.a or v1.a = t2.a",
|
||||||
"materialized": {
|
"materialized": {
|
||||||
"query_block": {
|
"query_block": {
|
||||||
"select_id": 3,
|
"select_id": 3,
|
||||||
@@ -3565,36 +3595,6 @@ EXPLAIN
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
|
||||||
"block-nl-join": {
|
|
||||||
"table": {
|
|
||||||
"table_name": "<derived2>",
|
|
||||||
"access_type": "ALL",
|
|
||||||
"rows": 20,
|
|
||||||
"filtered": 100,
|
|
||||||
"attached_condition": "v1.max_c < 500"
|
|
||||||
},
|
|
||||||
"buffer_type": "incremental",
|
|
||||||
"buffer_size": "9Kb",
|
|
||||||
"join_type": "BNL",
|
|
||||||
"attached_condition": "v1.a = v2.a or v1.a = t2.a",
|
|
||||||
"materialized": {
|
|
||||||
"query_block": {
|
|
||||||
"select_id": 2,
|
|
||||||
"having_condition": "max_c < 707 and max_c < 500",
|
|
||||||
"filesort": {
|
|
||||||
"sort_key": "t1.a, t1.b",
|
|
||||||
"temporary_table": {
|
|
||||||
"table": {
|
|
||||||
"table_name": "t1",
|
|
||||||
"access_type": "ALL",
|
|
||||||
"rows": 20,
|
|
||||||
"filtered": 100
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -9684,11 +9684,22 @@ EXPLAIN
|
|||||||
"query_block": {
|
"query_block": {
|
||||||
"select_id": 1,
|
"select_id": 1,
|
||||||
"table": {
|
"table": {
|
||||||
"table_name": "<derived2>",
|
"table_name": "t1",
|
||||||
"access_type": "ALL",
|
"access_type": "ALL",
|
||||||
"rows": 2,
|
"rows": 2,
|
||||||
"filtered": 100,
|
"filtered": 100,
|
||||||
"attached_condition": "1 in (0,dt1.a)",
|
"attached_condition": "1 in (0,t1.a) and t1.a is not null"
|
||||||
|
},
|
||||||
|
"table": {
|
||||||
|
"table_name": "<derived2>",
|
||||||
|
"access_type": "ref",
|
||||||
|
"possible_keys": ["key0"],
|
||||||
|
"key": "key0",
|
||||||
|
"key_length": "5",
|
||||||
|
"used_key_parts": ["a"],
|
||||||
|
"ref": ["test.t1.a"],
|
||||||
|
"rows": 2,
|
||||||
|
"filtered": 100,
|
||||||
"materialized": {
|
"materialized": {
|
||||||
"query_block": {
|
"query_block": {
|
||||||
"select_id": 2,
|
"select_id": 2,
|
||||||
@@ -9706,18 +9717,6 @@ EXPLAIN
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
|
||||||
"block-nl-join": {
|
|
||||||
"table": {
|
|
||||||
"table_name": "t1",
|
|
||||||
"access_type": "ALL",
|
|
||||||
"rows": 2,
|
|
||||||
"filtered": 100
|
|
||||||
},
|
|
||||||
"buffer_type": "flat",
|
|
||||||
"buffer_size": "65",
|
|
||||||
"join_type": "BNL",
|
|
||||||
"attached_condition": "t1.a = dt1.a"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -9743,11 +9742,22 @@ EXPLAIN
|
|||||||
"query_block": {
|
"query_block": {
|
||||||
"select_id": 1,
|
"select_id": 1,
|
||||||
"table": {
|
"table": {
|
||||||
"table_name": "<derived2>",
|
"table_name": "t1",
|
||||||
"access_type": "ALL",
|
"access_type": "ALL",
|
||||||
"rows": 2,
|
"rows": 2,
|
||||||
"filtered": 100,
|
"filtered": 100,
|
||||||
"attached_condition": "dt.a in (1,dt.a)",
|
"attached_condition": "t1.a in (1,t1.a) and t1.a is not null"
|
||||||
|
},
|
||||||
|
"table": {
|
||||||
|
"table_name": "<derived2>",
|
||||||
|
"access_type": "ref",
|
||||||
|
"possible_keys": ["key0"],
|
||||||
|
"key": "key0",
|
||||||
|
"key_length": "5",
|
||||||
|
"used_key_parts": ["a"],
|
||||||
|
"ref": ["test.t1.a"],
|
||||||
|
"rows": 2,
|
||||||
|
"filtered": 100,
|
||||||
"materialized": {
|
"materialized": {
|
||||||
"query_block": {
|
"query_block": {
|
||||||
"select_id": 2,
|
"select_id": 2,
|
||||||
@@ -9765,18 +9775,6 @@ EXPLAIN
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
|
||||||
"block-nl-join": {
|
|
||||||
"table": {
|
|
||||||
"table_name": "t1",
|
|
||||||
"access_type": "ALL",
|
|
||||||
"rows": 2,
|
|
||||||
"filtered": 100
|
|
||||||
},
|
|
||||||
"buffer_type": "flat",
|
|
||||||
"buffer_size": "119",
|
|
||||||
"join_type": "BNL",
|
|
||||||
"attached_condition": "t1.a = dt.a"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -10376,11 +10374,22 @@ EXPLAIN
|
|||||||
"query_block": {
|
"query_block": {
|
||||||
"select_id": 1,
|
"select_id": 1,
|
||||||
"table": {
|
"table": {
|
||||||
"table_name": "<derived3>",
|
"table_name": "t1",
|
||||||
"access_type": "ALL",
|
"access_type": "ALL",
|
||||||
"rows": 2,
|
"rows": 2,
|
||||||
"filtered": 100,
|
"filtered": 100,
|
||||||
"attached_condition": "t.f2 < 2",
|
"attached_condition": "t1.f2 < 2 and t1.f2 is not null"
|
||||||
|
},
|
||||||
|
"table": {
|
||||||
|
"table_name": "<derived3>",
|
||||||
|
"access_type": "ref",
|
||||||
|
"possible_keys": ["key0"],
|
||||||
|
"key": "key0",
|
||||||
|
"key_length": "5",
|
||||||
|
"used_key_parts": ["f2"],
|
||||||
|
"ref": ["test.t1.f2"],
|
||||||
|
"rows": 2,
|
||||||
|
"filtered": 100,
|
||||||
"materialized": {
|
"materialized": {
|
||||||
"query_block": {
|
"query_block": {
|
||||||
"select_id": 3,
|
"select_id": 3,
|
||||||
@@ -10393,13 +10402,6 @@ EXPLAIN
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
|
||||||
"table": {
|
|
||||||
"table_name": "t1",
|
|
||||||
"access_type": "ALL",
|
|
||||||
"rows": 2,
|
|
||||||
"filtered": 100,
|
|
||||||
"attached_condition": "t1.f2 = t.f2"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -10417,11 +10419,22 @@ EXPLAIN
|
|||||||
"query_block": {
|
"query_block": {
|
||||||
"select_id": 1,
|
"select_id": 1,
|
||||||
"table": {
|
"table": {
|
||||||
"table_name": "<derived3>",
|
"table_name": "t1",
|
||||||
"access_type": "ALL",
|
"access_type": "ALL",
|
||||||
"rows": 2,
|
"rows": 2,
|
||||||
"filtered": 100,
|
"filtered": 100,
|
||||||
"attached_condition": "t.f2 < 2",
|
"attached_condition": "t1.f2 < 2 and t1.f2 is not null"
|
||||||
|
},
|
||||||
|
"table": {
|
||||||
|
"table_name": "<derived3>",
|
||||||
|
"access_type": "ref",
|
||||||
|
"possible_keys": ["key0"],
|
||||||
|
"key": "key0",
|
||||||
|
"key_length": "5",
|
||||||
|
"used_key_parts": ["f2"],
|
||||||
|
"ref": ["test.t1.f2"],
|
||||||
|
"rows": 1,
|
||||||
|
"filtered": 100,
|
||||||
"materialized": {
|
"materialized": {
|
||||||
"query_block": {
|
"query_block": {
|
||||||
"select_id": 3,
|
"select_id": 3,
|
||||||
@@ -10436,18 +10449,6 @@ EXPLAIN
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
|
||||||
"block-nl-join": {
|
|
||||||
"table": {
|
|
||||||
"table_name": "t1",
|
|
||||||
"access_type": "ALL",
|
|
||||||
"rows": 2,
|
|
||||||
"filtered": 100
|
|
||||||
},
|
|
||||||
"buffer_type": "flat",
|
|
||||||
"buffer_size": "65",
|
|
||||||
"join_type": "BNL",
|
|
||||||
"attached_condition": "t1.f2 = t.f2"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -14388,8 +14389,8 @@ a b c a b c
|
|||||||
3 21 500 3 21 231
|
3 21 500 3 21 231
|
||||||
explain select * from v1,t2 where (v1.b=t2.b) and (v1.a<4);
|
explain select * from v1,t2 where (v1.b=t2.b) and (v1.a<4);
|
||||||
id select_type table type possible_keys key key_len ref rows Extra
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 3 Using where
|
1 PRIMARY t2 ALL NULL NULL NULL NULL 9 Using where
|
||||||
1 PRIMARY t2 ALL NULL NULL NULL NULL 9 Using where; Using join buffer (flat, BNL join)
|
1 PRIMARY <derived2> ref key0 key0 5 test.t2.b 2 Using where
|
||||||
2 DERIVED t3 range i1 i1 5 NULL 2 Using index condition
|
2 DERIVED t3 range i1 i1 5 NULL 2 Using index condition
|
||||||
3 UNION t3 range i1 i1 5 NULL 1 Using index condition
|
3 UNION t3 range i1 i1 5 NULL 1 Using index condition
|
||||||
NULL UNION RESULT <union2,3> ALL NULL NULL NULL NULL NULL
|
NULL UNION RESULT <union2,3> ALL NULL NULL NULL NULL NULL
|
||||||
@@ -14399,9 +14400,21 @@ EXPLAIN
|
|||||||
"query_block": {
|
"query_block": {
|
||||||
"select_id": 1,
|
"select_id": 1,
|
||||||
"table": {
|
"table": {
|
||||||
"table_name": "<derived2>",
|
"table_name": "t2",
|
||||||
"access_type": "ALL",
|
"access_type": "ALL",
|
||||||
"rows": 3,
|
"rows": 9,
|
||||||
|
"filtered": 100,
|
||||||
|
"attached_condition": "t2.b is not null"
|
||||||
|
},
|
||||||
|
"table": {
|
||||||
|
"table_name": "<derived2>",
|
||||||
|
"access_type": "ref",
|
||||||
|
"possible_keys": ["key0"],
|
||||||
|
"key": "key0",
|
||||||
|
"key_length": "5",
|
||||||
|
"used_key_parts": ["b"],
|
||||||
|
"ref": ["test.t2.b"],
|
||||||
|
"rows": 2,
|
||||||
"filtered": 100,
|
"filtered": 100,
|
||||||
"attached_condition": "v1.a < 4",
|
"attached_condition": "v1.a < 4",
|
||||||
"materialized": {
|
"materialized": {
|
||||||
@@ -14447,18 +14460,6 @@ EXPLAIN
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
|
||||||
"block-nl-join": {
|
|
||||||
"table": {
|
|
||||||
"table_name": "t2",
|
|
||||||
"access_type": "ALL",
|
|
||||||
"rows": 9,
|
|
||||||
"filtered": 100
|
|
||||||
},
|
|
||||||
"buffer_type": "flat",
|
|
||||||
"buffer_size": "173",
|
|
||||||
"join_type": "BNL",
|
|
||||||
"attached_condition": "t2.b = v1.b"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -3,7 +3,7 @@ call mtr.add_suppression("mysql.user");
|
|||||||
flush tables;
|
flush tables;
|
||||||
flush privileges;
|
flush privileges;
|
||||||
Warnings:
|
Warnings:
|
||||||
Error 145 Table './mysql/user' is marked as crashed and should be repaired
|
Error 145 Got error '145 "Table was marked as crashed and should be repaired"' for './mysql/user'
|
||||||
Warning 1034 12544 clients are using or haven't closed the table properly
|
Warning 1034 12544 clients are using or haven't closed the table properly
|
||||||
Note 1034 Table is fixed
|
Note 1034 Table is fixed
|
||||||
# switching back from mysql.user to mysql.global_priv
|
# switching back from mysql.user to mysql.global_priv
|
||||||
|
@@ -274,12 +274,16 @@ delete from mysql.help_relation where help_keyword_id=@keyword1_id and help_topi
|
|||||||
delete from mysql.help_relation where help_keyword_id=@keyword2_id and help_topic_id=@topic1_id;
|
delete from mysql.help_relation where help_keyword_id=@keyword2_id and help_topic_id=@topic1_id;
|
||||||
delete from mysql.help_relation where help_keyword_id=@keyword3_id and help_topic_id=@topic3_id;
|
delete from mysql.help_relation where help_keyword_id=@keyword3_id and help_topic_id=@topic3_id;
|
||||||
delete from mysql.help_relation where help_keyword_id=@keyword3_id and help_topic_id=@topic4_id;
|
delete from mysql.help_relation where help_keyword_id=@keyword3_id and help_topic_id=@topic4_id;
|
||||||
End of 4.1 tests.
|
flush tables;
|
||||||
DROP TABLE IF EXISTS t1;
|
#
|
||||||
|
# End of 4.1 tests.
|
||||||
|
#
|
||||||
CREATE TABLE t1 (i INT);
|
CREATE TABLE t1 (i INT);
|
||||||
LOCK TABLES t1 WRITE;
|
LOCK TABLES t1 WRITE;
|
||||||
HELP no_such_topic;
|
HELP no_such_topic;
|
||||||
name is_it_category
|
name is_it_category
|
||||||
UNLOCK TABLES;
|
UNLOCK TABLES;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
End of 5.1 tests.
|
#
|
||||||
|
# End of 5.1 tests.
|
||||||
|
#
|
||||||
|
@@ -122,25 +122,22 @@ delete from mysql.help_relation where help_keyword_id=@keyword2_id and help_topi
|
|||||||
delete from mysql.help_relation where help_keyword_id=@keyword3_id and help_topic_id=@topic3_id;
|
delete from mysql.help_relation where help_keyword_id=@keyword3_id and help_topic_id=@topic3_id;
|
||||||
delete from mysql.help_relation where help_keyword_id=@keyword3_id and help_topic_id=@topic4_id;
|
delete from mysql.help_relation where help_keyword_id=@keyword3_id and help_topic_id=@topic4_id;
|
||||||
|
|
||||||
--echo End of 4.1 tests.
|
flush tables;
|
||||||
|
--echo #
|
||||||
|
--echo # End of 4.1 tests.
|
||||||
|
--echo #
|
||||||
|
|
||||||
#
|
#
|
||||||
# Test that we can use HELP even under LOCK TABLES. See bug#9953:
|
# Test that we can use HELP even under LOCK TABLES. See bug#9953:
|
||||||
# CONVERT_TZ requires mysql.time_zone_name to be locked.
|
# CONVERT_TZ requires mysql.time_zone_name to be locked.
|
||||||
#
|
#
|
||||||
--disable_warnings
|
|
||||||
DROP TABLE IF EXISTS t1;
|
|
||||||
--enable_warnings
|
|
||||||
|
|
||||||
CREATE TABLE t1 (i INT);
|
CREATE TABLE t1 (i INT);
|
||||||
|
|
||||||
LOCK TABLES t1 WRITE;
|
LOCK TABLES t1 WRITE;
|
||||||
|
|
||||||
HELP no_such_topic;
|
HELP no_such_topic;
|
||||||
|
|
||||||
UNLOCK TABLES;
|
UNLOCK TABLES;
|
||||||
|
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
--echo #
|
||||||
--echo End of 5.1 tests.
|
--echo # End of 5.1 tests.
|
||||||
|
--echo #
|
||||||
|
@@ -916,11 +916,11 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||||||
1 SIMPLE t6 ALL NULL NULL NULL NULL 3 100.00 Using where
|
1 SIMPLE t6 ALL NULL NULL NULL NULL 3 100.00 Using where
|
||||||
1 SIMPLE t8 ALL NULL NULL NULL NULL 2 100.00 Using where
|
1 SIMPLE t8 ALL NULL NULL NULL NULL 2 100.00 Using where
|
||||||
1 SIMPLE t2 ALL NULL NULL NULL NULL 8 100.00 Using where
|
1 SIMPLE t2 ALL NULL NULL NULL NULL 8 100.00 Using where
|
||||||
1 SIMPLE t4 ALL NULL NULL NULL NULL 2 100.00 Using where
|
|
||||||
1 SIMPLE t3 ALL NULL NULL NULL NULL 2 100.00 Using where
|
1 SIMPLE t3 ALL NULL NULL NULL NULL 2 100.00 Using where
|
||||||
|
1 SIMPLE t4 ALL NULL NULL NULL NULL 2 100.00 Using where
|
||||||
1 SIMPLE t9 ALL NULL NULL NULL NULL 3 100.00 Using where; Using join buffer (flat, BNL join)
|
1 SIMPLE t9 ALL NULL NULL NULL NULL 3 100.00 Using where; Using join buffer (flat, BNL join)
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1003 select `test`.`t0`.`a` AS `a`,`test`.`t0`.`b` AS `b`,`test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t3`.`a` AS `a`,`test`.`t3`.`b` AS `b`,`test`.`t4`.`a` AS `a`,`test`.`t4`.`b` AS `b`,`test`.`t5`.`a` AS `a`,`test`.`t5`.`b` AS `b`,`test`.`t6`.`a` AS `a`,`test`.`t6`.`b` AS `b`,`test`.`t7`.`a` AS `a`,`test`.`t7`.`b` AS `b`,`test`.`t8`.`a` AS `a`,`test`.`t8`.`b` AS `b`,`test`.`t9`.`a` AS `a`,`test`.`t9`.`b` AS `b` from `test`.`t0` join `test`.`t1` left join (`test`.`t2` left join (`test`.`t3` join `test`.`t4`) on(`test`.`t3`.`a` = 1 and `test`.`t4`.`b` = `test`.`t2`.`b` and `test`.`t2`.`a` > 0) join `test`.`t5` left join (`test`.`t6` join `test`.`t7` left join `test`.`t8` on(`test`.`t8`.`b` = `test`.`t5`.`b` and `test`.`t6`.`b` < 10)) on(`test`.`t7`.`b` = `test`.`t5`.`b` and `test`.`t6`.`b` >= 2)) on((`test`.`t3`.`b` = 2 or `test`.`t3`.`c` is null) and (`test`.`t6`.`b` = 2 or `test`.`t6`.`c` is null) and (`test`.`t5`.`b` = `test`.`t0`.`b` or `test`.`t3`.`c` is null or `test`.`t6`.`c` is null or `test`.`t8`.`c` is null) and `test`.`t1`.`a` <> 2) join `test`.`t9` where `test`.`t0`.`a` = 1 and `test`.`t1`.`b` = `test`.`t0`.`b` and `test`.`t9`.`a` = 1 and (`test`.`t2`.`a` >= 4 or `test`.`t2`.`c` is null) and (`test`.`t3`.`a` < 5 or `test`.`t3`.`c` is null) and (`test`.`t3`.`b` = `test`.`t4`.`b` or `test`.`t3`.`c` is null or `test`.`t4`.`c` is null) and (`test`.`t5`.`a` >= 2 or `test`.`t5`.`c` is null) and (`test`.`t6`.`a` >= 4 or `test`.`t6`.`c` is null) and (`test`.`t7`.`a` <= 2 or `test`.`t7`.`c` is null) and (`test`.`t8`.`a` < 1 or `test`.`t8`.`c` is null) and (`test`.`t9`.`b` = `test`.`t8`.`b` or `test`.`t8`.`c` is null)
|
Note 1003 select `test`.`t0`.`a` AS `a`,`test`.`t0`.`b` AS `b`,`test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t3`.`a` AS `a`,`test`.`t3`.`b` AS `b`,`test`.`t4`.`a` AS `a`,`test`.`t4`.`b` AS `b`,`test`.`t5`.`a` AS `a`,`test`.`t5`.`b` AS `b`,`test`.`t6`.`a` AS `a`,`test`.`t6`.`b` AS `b`,`test`.`t7`.`a` AS `a`,`test`.`t7`.`b` AS `b`,`test`.`t8`.`a` AS `a`,`test`.`t8`.`b` AS `b`,`test`.`t9`.`a` AS `a`,`test`.`t9`.`b` AS `b` from `test`.`t0` join `test`.`t1` left join (`test`.`t2` left join (`test`.`t3` join `test`.`t4`) on(`test`.`t3`.`a` = 1 and `test`.`t4`.`b` = `test`.`t2`.`b` and `test`.`t2`.`a` > 0) join `test`.`t5` left join (`test`.`t6` join `test`.`t7` left join `test`.`t8` on(`test`.`t8`.`b` = `test`.`t5`.`b` and `test`.`t6`.`b` < 10)) on(`test`.`t7`.`b` = `test`.`t5`.`b` and `test`.`t6`.`b` >= 2)) on((`test`.`t3`.`b` = 2 or `test`.`t3`.`c` is null) and (`test`.`t6`.`b` = 2 or `test`.`t6`.`c` is null) and (`test`.`t5`.`b` = `test`.`t0`.`b` or `test`.`t3`.`c` is null or `test`.`t6`.`c` is null or `test`.`t8`.`c` is null) and `test`.`t1`.`a` <> 2) join `test`.`t9` where `test`.`t0`.`a` = 1 and `test`.`t1`.`b` = `test`.`t0`.`b` and `test`.`t9`.`a` = 1 and (`test`.`t2`.`a` >= 4 or `test`.`t2`.`c` is null) and (`test`.`t3`.`a` < 5 or `test`.`t3`.`c` is null) and (`test`.`t4`.`b` = `test`.`t3`.`b` or `test`.`t3`.`c` is null or `test`.`t4`.`c` is null) and (`test`.`t5`.`a` >= 2 or `test`.`t5`.`c` is null) and (`test`.`t6`.`a` >= 4 or `test`.`t6`.`c` is null) and (`test`.`t7`.`a` <= 2 or `test`.`t7`.`c` is null) and (`test`.`t8`.`a` < 1 or `test`.`t8`.`c` is null) and (`test`.`t9`.`b` = `test`.`t8`.`b` or `test`.`t8`.`c` is null)
|
||||||
INSERT INTO t4 VALUES (-3,12,0), (-4,13,0), (-1,11,0), (-3,11,0), (-5,15,0);
|
INSERT INTO t4 VALUES (-3,12,0), (-4,13,0), (-1,11,0), (-3,11,0), (-5,15,0);
|
||||||
INSERT INTO t5 VALUES (-3,11,0), (-2,12,0), (-3,13,0), (-4,12,0);
|
INSERT INTO t5 VALUES (-3,11,0), (-2,12,0), (-3,13,0), (-4,12,0);
|
||||||
CREATE INDEX idx_b ON t4(b);
|
CREATE INDEX idx_b ON t4(b);
|
||||||
@@ -1476,9 +1476,9 @@ join t5 on t5.a=t3.b) on t3.a=t2.b;
|
|||||||
id select_type table type possible_keys key key_len ref rows Extra
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 SIMPLE t2 ALL NULL NULL NULL NULL X
|
1 SIMPLE t2 ALL NULL NULL NULL NULL X
|
||||||
1 SIMPLE t3 ref a a 5 test.t2.b X Using where
|
1 SIMPLE t3 ref a a 5 test.t2.b X Using where
|
||||||
1 SIMPLE t5 ref a a 5 test.t3.b X
|
1 SIMPLE t4 ref a a 5 test.t3.b X Using where
|
||||||
1 SIMPLE t4 ref a a 5 test.t5.a X Using where
|
|
||||||
1 SIMPLE t6 ref a a 5 test.t4.b X
|
1 SIMPLE t6 ref a a 5 test.t4.b X
|
||||||
|
1 SIMPLE t5 ref a a 5 test.t3.b X
|
||||||
drop table t0, t1, t2, t3, t4, t5, t6, t7;
|
drop table t0, t1, t2, t3, t4, t5, t6, t7;
|
||||||
create table t1 (a int);
|
create table t1 (a int);
|
||||||
insert into t1 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
insert into t1 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
||||||
|
@@ -925,11 +925,11 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||||||
1 SIMPLE t6 ALL NULL NULL NULL NULL 3 100.00 Using where; Using join buffer (incremental, BNL join)
|
1 SIMPLE t6 ALL NULL NULL NULL NULL 3 100.00 Using where; Using join buffer (incremental, BNL join)
|
||||||
1 SIMPLE t8 hash_ALL NULL #hash#$hj 5 test.t5.b 2 100.00 Using where; Using join buffer (incremental, BNLH join)
|
1 SIMPLE t8 hash_ALL NULL #hash#$hj 5 test.t5.b 2 100.00 Using where; Using join buffer (incremental, BNLH join)
|
||||||
1 SIMPLE t2 ALL NULL NULL NULL NULL 8 100.00 Using where; Using join buffer (incremental, BNL join)
|
1 SIMPLE t2 ALL NULL NULL NULL NULL 8 100.00 Using where; Using join buffer (incremental, BNL join)
|
||||||
1 SIMPLE t4 hash_ALL NULL #hash#$hj 5 test.t2.b 2 100.00 Using where; Using join buffer (incremental, BNLH join)
|
|
||||||
1 SIMPLE t3 ALL NULL NULL NULL NULL 2 100.00 Using where; Using join buffer (incremental, BNL join)
|
1 SIMPLE t3 ALL NULL NULL NULL NULL 2 100.00 Using where; Using join buffer (incremental, BNL join)
|
||||||
|
1 SIMPLE t4 hash_ALL NULL #hash#$hj 5 test.t2.b 2 100.00 Using where; Using join buffer (incremental, BNLH join)
|
||||||
1 SIMPLE t9 ALL NULL NULL NULL NULL 3 100.00 Using where; Using join buffer (incremental, BNL join)
|
1 SIMPLE t9 ALL NULL NULL NULL NULL 3 100.00 Using where; Using join buffer (incremental, BNL join)
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1003 select `test`.`t0`.`a` AS `a`,`test`.`t0`.`b` AS `b`,`test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t3`.`a` AS `a`,`test`.`t3`.`b` AS `b`,`test`.`t4`.`a` AS `a`,`test`.`t4`.`b` AS `b`,`test`.`t5`.`a` AS `a`,`test`.`t5`.`b` AS `b`,`test`.`t6`.`a` AS `a`,`test`.`t6`.`b` AS `b`,`test`.`t7`.`a` AS `a`,`test`.`t7`.`b` AS `b`,`test`.`t8`.`a` AS `a`,`test`.`t8`.`b` AS `b`,`test`.`t9`.`a` AS `a`,`test`.`t9`.`b` AS `b` from `test`.`t0` join `test`.`t1` left join (`test`.`t2` left join (`test`.`t3` join `test`.`t4`) on(`test`.`t3`.`a` = 1 and `test`.`t4`.`b` = `test`.`t2`.`b` and `test`.`t2`.`a` > 0 and `test`.`t2`.`b` is not null) join `test`.`t5` left join (`test`.`t6` join `test`.`t7` left join `test`.`t8` on(`test`.`t8`.`b` = `test`.`t5`.`b` and `test`.`t6`.`b` < 10 and `test`.`t5`.`b` is not null)) on(`test`.`t7`.`b` = `test`.`t5`.`b` and `test`.`t6`.`b` >= 2 and `test`.`t5`.`b` is not null)) on((`test`.`t3`.`b` = 2 or `test`.`t3`.`c` is null) and (`test`.`t6`.`b` = 2 or `test`.`t6`.`c` is null) and (`test`.`t5`.`b` = `test`.`t0`.`b` or `test`.`t3`.`c` is null or `test`.`t6`.`c` is null or `test`.`t8`.`c` is null) and `test`.`t1`.`a` <> 2) join `test`.`t9` where `test`.`t0`.`a` = 1 and `test`.`t1`.`b` = `test`.`t0`.`b` and `test`.`t9`.`a` = 1 and (`test`.`t2`.`a` >= 4 or `test`.`t2`.`c` is null) and (`test`.`t3`.`a` < 5 or `test`.`t3`.`c` is null) and (`test`.`t3`.`b` = `test`.`t4`.`b` or `test`.`t3`.`c` is null or `test`.`t4`.`c` is null) and (`test`.`t5`.`a` >= 2 or `test`.`t5`.`c` is null) and (`test`.`t6`.`a` >= 4 or `test`.`t6`.`c` is null) and (`test`.`t7`.`a` <= 2 or `test`.`t7`.`c` is null) and (`test`.`t8`.`a` < 1 or `test`.`t8`.`c` is null) and (`test`.`t9`.`b` = `test`.`t8`.`b` or `test`.`t8`.`c` is null)
|
Note 1003 select `test`.`t0`.`a` AS `a`,`test`.`t0`.`b` AS `b`,`test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t3`.`a` AS `a`,`test`.`t3`.`b` AS `b`,`test`.`t4`.`a` AS `a`,`test`.`t4`.`b` AS `b`,`test`.`t5`.`a` AS `a`,`test`.`t5`.`b` AS `b`,`test`.`t6`.`a` AS `a`,`test`.`t6`.`b` AS `b`,`test`.`t7`.`a` AS `a`,`test`.`t7`.`b` AS `b`,`test`.`t8`.`a` AS `a`,`test`.`t8`.`b` AS `b`,`test`.`t9`.`a` AS `a`,`test`.`t9`.`b` AS `b` from `test`.`t0` join `test`.`t1` left join (`test`.`t2` left join (`test`.`t3` join `test`.`t4`) on(`test`.`t3`.`a` = 1 and `test`.`t4`.`b` = `test`.`t2`.`b` and `test`.`t2`.`a` > 0 and `test`.`t2`.`b` is not null) join `test`.`t5` left join (`test`.`t6` join `test`.`t7` left join `test`.`t8` on(`test`.`t8`.`b` = `test`.`t5`.`b` and `test`.`t6`.`b` < 10 and `test`.`t5`.`b` is not null)) on(`test`.`t7`.`b` = `test`.`t5`.`b` and `test`.`t6`.`b` >= 2 and `test`.`t5`.`b` is not null)) on((`test`.`t3`.`b` = 2 or `test`.`t3`.`c` is null) and (`test`.`t6`.`b` = 2 or `test`.`t6`.`c` is null) and (`test`.`t5`.`b` = `test`.`t0`.`b` or `test`.`t3`.`c` is null or `test`.`t6`.`c` is null or `test`.`t8`.`c` is null) and `test`.`t1`.`a` <> 2) join `test`.`t9` where `test`.`t0`.`a` = 1 and `test`.`t1`.`b` = `test`.`t0`.`b` and `test`.`t9`.`a` = 1 and (`test`.`t2`.`a` >= 4 or `test`.`t2`.`c` is null) and (`test`.`t3`.`a` < 5 or `test`.`t3`.`c` is null) and (`test`.`t4`.`b` = `test`.`t3`.`b` or `test`.`t3`.`c` is null or `test`.`t4`.`c` is null) and (`test`.`t5`.`a` >= 2 or `test`.`t5`.`c` is null) and (`test`.`t6`.`a` >= 4 or `test`.`t6`.`c` is null) and (`test`.`t7`.`a` <= 2 or `test`.`t7`.`c` is null) and (`test`.`t8`.`a` < 1 or `test`.`t8`.`c` is null) and (`test`.`t9`.`b` = `test`.`t8`.`b` or `test`.`t8`.`c` is null)
|
||||||
INSERT INTO t4 VALUES (-3,12,0), (-4,13,0), (-1,11,0), (-3,11,0), (-5,15,0);
|
INSERT INTO t4 VALUES (-3,12,0), (-4,13,0), (-1,11,0), (-3,11,0), (-5,15,0);
|
||||||
INSERT INTO t5 VALUES (-3,11,0), (-2,12,0), (-3,13,0), (-4,12,0);
|
INSERT INTO t5 VALUES (-3,11,0), (-2,12,0), (-3,13,0), (-4,12,0);
|
||||||
CREATE INDEX idx_b ON t4(b);
|
CREATE INDEX idx_b ON t4(b);
|
||||||
@@ -1027,8 +1027,8 @@ id select_type table type possible_keys key key_len ref rows filtered Extra
|
|||||||
1 SIMPLE t3 ALL NULL NULL NULL NULL 2 100.00 Using where; Using join buffer (incremental, BNL join)
|
1 SIMPLE t3 ALL NULL NULL NULL NULL 2 100.00 Using where; Using join buffer (incremental, BNL join)
|
||||||
1 SIMPLE t4 ref idx_b idx_b 5 test.t2.b 2 100.00 Using where; Using join buffer (incremental, BKA join); Key-ordered Rowid-ordered scan
|
1 SIMPLE t4 ref idx_b idx_b 5 test.t2.b 2 100.00 Using where; Using join buffer (incremental, BKA join); Key-ordered Rowid-ordered scan
|
||||||
1 SIMPLE t5 ALL idx_b NULL NULL NULL 7 100.00 Using where; Using join buffer (incremental, BNL join)
|
1 SIMPLE t5 ALL idx_b NULL NULL NULL 7 100.00 Using where; Using join buffer (incremental, BNL join)
|
||||||
1 SIMPLE t6 ALL NULL NULL NULL NULL 3 100.00 Using where; Using join buffer (incremental, BNL join)
|
|
||||||
1 SIMPLE t7 hash_ALL NULL #hash#$hj 5 test.t5.b 2 100.00 Using where; Using join buffer (incremental, BNLH join)
|
1 SIMPLE t7 hash_ALL NULL #hash#$hj 5 test.t5.b 2 100.00 Using where; Using join buffer (incremental, BNLH join)
|
||||||
|
1 SIMPLE t6 ALL NULL NULL NULL NULL 3 100.00 Using where; Using join buffer (incremental, BNL join)
|
||||||
1 SIMPLE t8 ref idx_b idx_b 5 test.t5.b 2 100.00 Using where; Using join buffer (incremental, BKA join); Key-ordered Rowid-ordered scan
|
1 SIMPLE t8 ref idx_b idx_b 5 test.t5.b 2 100.00 Using where; Using join buffer (incremental, BKA join); Key-ordered Rowid-ordered scan
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1003 select `test`.`t0`.`a` AS `a`,`test`.`t0`.`b` AS `b`,`test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t3`.`a` AS `a`,`test`.`t3`.`b` AS `b`,`test`.`t4`.`a` AS `a`,`test`.`t4`.`b` AS `b`,`test`.`t5`.`a` AS `a`,`test`.`t5`.`b` AS `b`,`test`.`t6`.`a` AS `a`,`test`.`t6`.`b` AS `b`,`test`.`t7`.`a` AS `a`,`test`.`t7`.`b` AS `b`,`test`.`t8`.`a` AS `a`,`test`.`t8`.`b` AS `b`,`test`.`t9`.`a` AS `a`,`test`.`t9`.`b` AS `b` from `test`.`t0` join `test`.`t1` left join (`test`.`t2` left join (`test`.`t3` join `test`.`t4`) on(`test`.`t3`.`a` = 1 and `test`.`t4`.`b` = `test`.`t2`.`b` and `test`.`t2`.`a` > 0 and `test`.`t4`.`a` > 0 and `test`.`t2`.`b` is not null) join `test`.`t5` left join (`test`.`t6` join `test`.`t7` left join `test`.`t8` on(`test`.`t8`.`b` = `test`.`t5`.`b` and `test`.`t6`.`b` < 10 and `test`.`t8`.`a` >= 0 and `test`.`t5`.`b` is not null)) on(`test`.`t7`.`b` = `test`.`t5`.`b` and `test`.`t6`.`b` >= 2 and `test`.`t5`.`a` > 0 and `test`.`t5`.`b` is not null)) on((`test`.`t3`.`b` = 2 or `test`.`t3`.`c` is null) and (`test`.`t6`.`b` = 2 or `test`.`t6`.`c` is null) and (`test`.`t5`.`b` = `test`.`t0`.`b` or `test`.`t3`.`c` is null or `test`.`t6`.`c` is null or `test`.`t8`.`c` is null) and `test`.`t1`.`a` <> 2) join `test`.`t9` where `test`.`t0`.`a` = 1 and `test`.`t1`.`b` = `test`.`t0`.`b` and `test`.`t9`.`a` = 1 and (`test`.`t2`.`a` >= 4 or `test`.`t2`.`c` is null) and (`test`.`t3`.`a` < 5 or `test`.`t3`.`c` is null) and (`test`.`t4`.`b` = `test`.`t3`.`b` or `test`.`t3`.`c` is null or `test`.`t4`.`c` is null) and (`test`.`t5`.`a` >= 2 or `test`.`t5`.`c` is null) and (`test`.`t6`.`a` >= 4 or `test`.`t6`.`c` is null) and (`test`.`t7`.`a` <= 2 or `test`.`t7`.`c` is null) and (`test`.`t8`.`a` < 1 or `test`.`t8`.`c` is null) and (`test`.`t8`.`b` = `test`.`t9`.`b` or `test`.`t8`.`c` is null)
|
Note 1003 select `test`.`t0`.`a` AS `a`,`test`.`t0`.`b` AS `b`,`test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b`,`test`.`t3`.`a` AS `a`,`test`.`t3`.`b` AS `b`,`test`.`t4`.`a` AS `a`,`test`.`t4`.`b` AS `b`,`test`.`t5`.`a` AS `a`,`test`.`t5`.`b` AS `b`,`test`.`t6`.`a` AS `a`,`test`.`t6`.`b` AS `b`,`test`.`t7`.`a` AS `a`,`test`.`t7`.`b` AS `b`,`test`.`t8`.`a` AS `a`,`test`.`t8`.`b` AS `b`,`test`.`t9`.`a` AS `a`,`test`.`t9`.`b` AS `b` from `test`.`t0` join `test`.`t1` left join (`test`.`t2` left join (`test`.`t3` join `test`.`t4`) on(`test`.`t3`.`a` = 1 and `test`.`t4`.`b` = `test`.`t2`.`b` and `test`.`t2`.`a` > 0 and `test`.`t4`.`a` > 0 and `test`.`t2`.`b` is not null) join `test`.`t5` left join (`test`.`t6` join `test`.`t7` left join `test`.`t8` on(`test`.`t8`.`b` = `test`.`t5`.`b` and `test`.`t6`.`b` < 10 and `test`.`t8`.`a` >= 0 and `test`.`t5`.`b` is not null)) on(`test`.`t7`.`b` = `test`.`t5`.`b` and `test`.`t6`.`b` >= 2 and `test`.`t5`.`a` > 0 and `test`.`t5`.`b` is not null)) on((`test`.`t3`.`b` = 2 or `test`.`t3`.`c` is null) and (`test`.`t6`.`b` = 2 or `test`.`t6`.`c` is null) and (`test`.`t5`.`b` = `test`.`t0`.`b` or `test`.`t3`.`c` is null or `test`.`t6`.`c` is null or `test`.`t8`.`c` is null) and `test`.`t1`.`a` <> 2) join `test`.`t9` where `test`.`t0`.`a` = 1 and `test`.`t1`.`b` = `test`.`t0`.`b` and `test`.`t9`.`a` = 1 and (`test`.`t2`.`a` >= 4 or `test`.`t2`.`c` is null) and (`test`.`t3`.`a` < 5 or `test`.`t3`.`c` is null) and (`test`.`t4`.`b` = `test`.`t3`.`b` or `test`.`t3`.`c` is null or `test`.`t4`.`c` is null) and (`test`.`t5`.`a` >= 2 or `test`.`t5`.`c` is null) and (`test`.`t6`.`a` >= 4 or `test`.`t6`.`c` is null) and (`test`.`t7`.`a` <= 2 or `test`.`t7`.`c` is null) and (`test`.`t8`.`a` < 1 or `test`.`t8`.`c` is null) and (`test`.`t8`.`b` = `test`.`t9`.`b` or `test`.`t8`.`c` is null)
|
||||||
@@ -1485,9 +1485,9 @@ join t5 on t5.a=t3.b) on t3.a=t2.b;
|
|||||||
id select_type table type possible_keys key key_len ref rows Extra
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 SIMPLE t2 ALL NULL NULL NULL NULL X
|
1 SIMPLE t2 ALL NULL NULL NULL NULL X
|
||||||
1 SIMPLE t3 ref a a 5 test.t2.b X Using where; Using join buffer (flat, BKA join); Key-ordered Rowid-ordered scan
|
1 SIMPLE t3 ref a a 5 test.t2.b X Using where; Using join buffer (flat, BKA join); Key-ordered Rowid-ordered scan
|
||||||
1 SIMPLE t5 ref a a 5 test.t3.b X Using join buffer (incremental, BKA join); Key-ordered Rowid-ordered scan
|
1 SIMPLE t4 ref a a 5 test.t3.b X Using where; Using join buffer (incremental, BKA join); Key-ordered Rowid-ordered scan
|
||||||
1 SIMPLE t4 ref a a 5 test.t5.a X Using where; Using join buffer (incremental, BKA join); Key-ordered Rowid-ordered scan
|
|
||||||
1 SIMPLE t6 ref a a 5 test.t4.b X Using join buffer (incremental, BKA join); Key-ordered Rowid-ordered scan
|
1 SIMPLE t6 ref a a 5 test.t4.b X Using join buffer (incremental, BKA join); Key-ordered Rowid-ordered scan
|
||||||
|
1 SIMPLE t5 ref a a 5 test.t3.b X Using join buffer (incremental, BKA join); Key-ordered Rowid-ordered scan
|
||||||
drop table t0, t1, t2, t3, t4, t5, t6, t7;
|
drop table t0, t1, t2, t3, t4, t5, t6, t7;
|
||||||
create table t1 (a int);
|
create table t1 (a int);
|
||||||
insert into t1 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
insert into t1 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
||||||
|
@@ -5494,6 +5494,11 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) {
|
|||||||
"rows_for_plan": 729,
|
"rows_for_plan": 729,
|
||||||
"cost_for_plan": 451.8615234,
|
"cost_for_plan": 451.8615234,
|
||||||
"semijoin_strategy_choice": [
|
"semijoin_strategy_choice": [
|
||||||
|
{
|
||||||
|
"strategy": "FirstMatch",
|
||||||
|
"records": 27,
|
||||||
|
"read_time": 665.225293
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"strategy": "DuplicateWeedout",
|
"strategy": "DuplicateWeedout",
|
||||||
"records": 27,
|
"records": 27,
|
||||||
@@ -5644,44 +5649,6 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) {
|
|||||||
"cost_for_plan": 172.4410156,
|
"cost_for_plan": 172.4410156,
|
||||||
"semijoin_strategy_choice": [],
|
"semijoin_strategy_choice": [],
|
||||||
"rest_of_plan": [
|
"rest_of_plan": [
|
||||||
{
|
|
||||||
"plan_prefix": [
|
|
||||||
"t_outer_1",
|
|
||||||
"t_inner_1",
|
|
||||||
"t_outer_2",
|
|
||||||
"t_inner_3"
|
|
||||||
],
|
|
||||||
"table": "t_inner_4",
|
|
||||||
"best_access_path": {
|
|
||||||
"considered_access_paths": [
|
|
||||||
{
|
|
||||||
"access_type": "scan",
|
|
||||||
"resulting_rows": 3,
|
|
||||||
"cost": 2.005126953,
|
|
||||||
"chosen": true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"chosen_access_method": {
|
|
||||||
"type": "scan",
|
|
||||||
"records": 3,
|
|
||||||
"cost": 2.005126953,
|
|
||||||
"uses_join_buffering": true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"rows_for_plan": 2187,
|
|
||||||
"cost_for_plan": 611.8461426,
|
|
||||||
"semijoin_strategy_choice": [
|
|
||||||
{
|
|
||||||
"strategy": "FirstMatch",
|
|
||||||
"records": 81,
|
|
||||||
"read_time": 2232.809033
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"chosen_strategy": "FirstMatch"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"pruned_by_cost": true
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"plan_prefix": [
|
"plan_prefix": [
|
||||||
"t_outer_1",
|
"t_outer_1",
|
||||||
@@ -5710,6 +5677,35 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) {
|
|||||||
"cost_for_plan": 1486.656396,
|
"cost_for_plan": 1486.656396,
|
||||||
"semijoin_strategy_choice": [],
|
"semijoin_strategy_choice": [],
|
||||||
"pruned_by_cost": true
|
"pruned_by_cost": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"plan_prefix": [
|
||||||
|
"t_outer_1",
|
||||||
|
"t_inner_1",
|
||||||
|
"t_outer_2",
|
||||||
|
"t_inner_3"
|
||||||
|
],
|
||||||
|
"table": "t_inner_4",
|
||||||
|
"best_access_path": {
|
||||||
|
"considered_access_paths": [
|
||||||
|
{
|
||||||
|
"access_type": "scan",
|
||||||
|
"resulting_rows": 3,
|
||||||
|
"cost": 2.005126953,
|
||||||
|
"chosen": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"chosen_access_method": {
|
||||||
|
"type": "scan",
|
||||||
|
"records": 3,
|
||||||
|
"cost": 2.005126953,
|
||||||
|
"uses_join_buffering": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"rows_for_plan": 2187,
|
||||||
|
"cost_for_plan": 611.8461426,
|
||||||
|
"semijoin_strategy_choice": [],
|
||||||
|
"pruned_by_cost": true
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -5740,7 +5736,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) {
|
|||||||
"rest_of_plan": [
|
"rest_of_plan": [
|
||||||
{
|
{
|
||||||
"plan_prefix": ["t_outer_1", "t_inner_1", "t_inner_4"],
|
"plan_prefix": ["t_outer_1", "t_inner_1", "t_inner_4"],
|
||||||
"table": "t_outer_2",
|
"table": "t_inner_2",
|
||||||
"best_access_path": {
|
"best_access_path": {
|
||||||
"considered_access_paths": [
|
"considered_access_paths": [
|
||||||
{
|
{
|
||||||
@@ -5766,9 +5762,9 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) {
|
|||||||
"t_outer_1",
|
"t_outer_1",
|
||||||
"t_inner_1",
|
"t_inner_1",
|
||||||
"t_inner_4",
|
"t_inner_4",
|
||||||
"t_outer_2"
|
"t_inner_2"
|
||||||
],
|
],
|
||||||
"table": "t_inner_2",
|
"table": "t_outer_2",
|
||||||
"best_access_path": {
|
"best_access_path": {
|
||||||
"considered_access_paths": [
|
"considered_access_paths": [
|
||||||
{
|
{
|
||||||
@@ -5795,7 +5791,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) {
|
|||||||
"t_outer_1",
|
"t_outer_1",
|
||||||
"t_inner_1",
|
"t_inner_1",
|
||||||
"t_inner_4",
|
"t_inner_4",
|
||||||
"t_outer_2"
|
"t_inner_2"
|
||||||
],
|
],
|
||||||
"table": "t_inner_3",
|
"table": "t_inner_3",
|
||||||
"best_access_path": {
|
"best_access_path": {
|
||||||
@@ -5823,7 +5819,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"plan_prefix": ["t_outer_1", "t_inner_1", "t_inner_4"],
|
"plan_prefix": ["t_outer_1", "t_inner_1", "t_inner_4"],
|
||||||
"table": "t_inner_2",
|
"table": "t_outer_2",
|
||||||
"best_access_path": {
|
"best_access_path": {
|
||||||
"considered_access_paths": [
|
"considered_access_paths": [
|
||||||
{
|
{
|
||||||
@@ -5896,7 +5892,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) {
|
|||||||
"rest_of_plan": [
|
"rest_of_plan": [
|
||||||
{
|
{
|
||||||
"plan_prefix": ["t_outer_1", "t_inner_1", "t_inner_3"],
|
"plan_prefix": ["t_outer_1", "t_inner_1", "t_inner_3"],
|
||||||
"table": "t_outer_2",
|
"table": "t_inner_2",
|
||||||
"best_access_path": {
|
"best_access_path": {
|
||||||
"considered_access_paths": [
|
"considered_access_paths": [
|
||||||
{
|
{
|
||||||
@@ -5922,7 +5918,36 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) {
|
|||||||
"t_outer_1",
|
"t_outer_1",
|
||||||
"t_inner_1",
|
"t_inner_1",
|
||||||
"t_inner_3",
|
"t_inner_3",
|
||||||
"t_outer_2"
|
"t_inner_2"
|
||||||
|
],
|
||||||
|
"table": "t_outer_2",
|
||||||
|
"best_access_path": {
|
||||||
|
"considered_access_paths": [
|
||||||
|
{
|
||||||
|
"access_type": "scan",
|
||||||
|
"resulting_rows": 9,
|
||||||
|
"cost": 2.015380859,
|
||||||
|
"chosen": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"chosen_access_method": {
|
||||||
|
"type": "scan",
|
||||||
|
"records": 9,
|
||||||
|
"cost": 2.015380859,
|
||||||
|
"uses_join_buffering": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"rows_for_plan": 6561,
|
||||||
|
"cost_for_plan": 1486.656396,
|
||||||
|
"semijoin_strategy_choice": [],
|
||||||
|
"pruned_by_cost": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"plan_prefix": [
|
||||||
|
"t_outer_1",
|
||||||
|
"t_inner_1",
|
||||||
|
"t_inner_3",
|
||||||
|
"t_inner_2"
|
||||||
],
|
],
|
||||||
"table": "t_inner_4",
|
"table": "t_inner_4",
|
||||||
"best_access_path": {
|
"best_access_path": {
|
||||||
@@ -5945,38 +5970,33 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) {
|
|||||||
"cost_for_plan": 611.8461426,
|
"cost_for_plan": 611.8461426,
|
||||||
"semijoin_strategy_choice": [],
|
"semijoin_strategy_choice": [],
|
||||||
"pruned_by_cost": true
|
"pruned_by_cost": true
|
||||||
},
|
|
||||||
{
|
|
||||||
"plan_prefix": [
|
|
||||||
"t_outer_1",
|
|
||||||
"t_inner_1",
|
|
||||||
"t_inner_3",
|
|
||||||
"t_outer_2"
|
|
||||||
],
|
|
||||||
"table": "t_inner_2",
|
|
||||||
"best_access_path": {
|
|
||||||
"considered_access_paths": [
|
|
||||||
{
|
|
||||||
"access_type": "scan",
|
|
||||||
"resulting_rows": 9,
|
|
||||||
"cost": 2.015380859,
|
|
||||||
"chosen": true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"chosen_access_method": {
|
|
||||||
"type": "scan",
|
|
||||||
"records": 9,
|
|
||||||
"cost": 2.015380859,
|
|
||||||
"uses_join_buffering": true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"rows_for_plan": 6561,
|
|
||||||
"cost_for_plan": 1486.656396,
|
|
||||||
"semijoin_strategy_choice": [],
|
|
||||||
"pruned_by_cost": true
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"plan_prefix": ["t_outer_1", "t_inner_1", "t_inner_3"],
|
||||||
|
"table": "t_outer_2",
|
||||||
|
"best_access_path": {
|
||||||
|
"considered_access_paths": [
|
||||||
|
{
|
||||||
|
"access_type": "scan",
|
||||||
|
"resulting_rows": 9,
|
||||||
|
"cost": 2.015380859,
|
||||||
|
"chosen": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"chosen_access_method": {
|
||||||
|
"type": "scan",
|
||||||
|
"records": 9,
|
||||||
|
"cost": 2.015380859,
|
||||||
|
"uses_join_buffering": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"rows_for_plan": 729,
|
||||||
|
"cost_for_plan": 172.4410156,
|
||||||
|
"semijoin_strategy_choice": [],
|
||||||
|
"pruned_by_heuristic": true
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"plan_prefix": ["t_outer_1", "t_inner_1", "t_inner_3"],
|
"plan_prefix": ["t_outer_1", "t_inner_1", "t_inner_3"],
|
||||||
"table": "t_inner_4",
|
"table": "t_inner_4",
|
||||||
@@ -6007,7 +6027,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) {
|
|||||||
"t_inner_3",
|
"t_inner_3",
|
||||||
"t_inner_4"
|
"t_inner_4"
|
||||||
],
|
],
|
||||||
"table": "t_outer_2",
|
"table": "t_inner_2",
|
||||||
"best_access_path": {
|
"best_access_path": {
|
||||||
"considered_access_paths": [
|
"considered_access_paths": [
|
||||||
{
|
{
|
||||||
@@ -6036,7 +6056,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) {
|
|||||||
"t_inner_3",
|
"t_inner_3",
|
||||||
"t_inner_4"
|
"t_inner_4"
|
||||||
],
|
],
|
||||||
"table": "t_inner_2",
|
"table": "t_outer_2",
|
||||||
"best_access_path": {
|
"best_access_path": {
|
||||||
"considered_access_paths": [
|
"considered_access_paths": [
|
||||||
{
|
{
|
||||||
@@ -6059,30 +6079,6 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) {
|
|||||||
"pruned_by_cost": true
|
"pruned_by_cost": true
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
|
||||||
{
|
|
||||||
"plan_prefix": ["t_outer_1", "t_inner_1", "t_inner_3"],
|
|
||||||
"table": "t_inner_2",
|
|
||||||
"best_access_path": {
|
|
||||||
"considered_access_paths": [
|
|
||||||
{
|
|
||||||
"access_type": "scan",
|
|
||||||
"resulting_rows": 9,
|
|
||||||
"cost": 2.015380859,
|
|
||||||
"chosen": true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"chosen_access_method": {
|
|
||||||
"type": "scan",
|
|
||||||
"records": 9,
|
|
||||||
"cost": 2.015380859,
|
|
||||||
"uses_join_buffering": true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"rows_for_plan": 729,
|
|
||||||
"cost_for_plan": 172.4410156,
|
|
||||||
"semijoin_strategy_choice": [],
|
|
||||||
"pruned_by_heuristic": true
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@@ -326,8 +326,8 @@ group by c_name, c_custkey, o_orderkey, o_orderdate, o_totalprice
|
|||||||
order by o_totalprice desc, o_orderdate;
|
order by o_totalprice desc, o_orderdate;
|
||||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
1 PRIMARY orders ALL PRIMARY,i_o_custkey NULL NULL NULL 1500 100.00 Using where; Using temporary; Using filesort
|
1 PRIMARY orders ALL PRIMARY,i_o_custkey NULL NULL NULL 1500 100.00 Using where; Using temporary; Using filesort
|
||||||
1 PRIMARY <subquery2> eq_ref distinct_key distinct_key 4 dbt3_s001.orders.o_orderkey 1 100.00
|
|
||||||
1 PRIMARY customer eq_ref PRIMARY PRIMARY 4 dbt3_s001.orders.o_custkey 1 100.00
|
1 PRIMARY customer eq_ref PRIMARY PRIMARY 4 dbt3_s001.orders.o_custkey 1 100.00
|
||||||
|
1 PRIMARY <subquery2> eq_ref distinct_key distinct_key 4 dbt3_s001.orders.o_orderkey 1 100.00
|
||||||
1 PRIMARY lineitem ref PRIMARY,i_l_orderkey,i_l_orderkey_quantity i_l_orderkey_quantity 4 dbt3_s001.orders.o_orderkey 4 100.00 Using index
|
1 PRIMARY lineitem ref PRIMARY,i_l_orderkey,i_l_orderkey_quantity i_l_orderkey_quantity 4 dbt3_s001.orders.o_orderkey 4 100.00 Using index
|
||||||
2 MATERIALIZED lineitem index NULL i_l_orderkey_quantity 13 NULL 6005 100.00 Using index
|
2 MATERIALIZED lineitem index NULL i_l_orderkey_quantity 13 NULL 6005 100.00 Using index
|
||||||
Warnings:
|
Warnings:
|
||||||
@@ -360,8 +360,8 @@ group by c_name, c_custkey, o_orderkey, o_orderdate, o_totalprice
|
|||||||
order by o_totalprice desc, o_orderdate;
|
order by o_totalprice desc, o_orderdate;
|
||||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
1 PRIMARY orders ALL PRIMARY,i_o_custkey NULL NULL NULL 1500 100.00 Using where; Using temporary; Using filesort
|
1 PRIMARY orders ALL PRIMARY,i_o_custkey NULL NULL NULL 1500 100.00 Using where; Using temporary; Using filesort
|
||||||
1 PRIMARY <subquery2> eq_ref distinct_key distinct_key 4 dbt3_s001.orders.o_orderkey 1 100.00
|
|
||||||
1 PRIMARY customer eq_ref PRIMARY PRIMARY 4 dbt3_s001.orders.o_custkey 1 100.00
|
1 PRIMARY customer eq_ref PRIMARY PRIMARY 4 dbt3_s001.orders.o_custkey 1 100.00
|
||||||
|
1 PRIMARY <subquery2> eq_ref distinct_key distinct_key 4 dbt3_s001.orders.o_orderkey 1 100.00
|
||||||
1 PRIMARY lineitem ref PRIMARY,i_l_orderkey,i_l_orderkey_quantity i_l_orderkey_quantity 4 dbt3_s001.orders.o_orderkey 4 100.00 Using index
|
1 PRIMARY lineitem ref PRIMARY,i_l_orderkey,i_l_orderkey_quantity i_l_orderkey_quantity 4 dbt3_s001.orders.o_orderkey 4 100.00 Using index
|
||||||
2 MATERIALIZED lineitem index NULL i_l_orderkey_quantity 13 NULL 6005 100.00 Using index
|
2 MATERIALIZED lineitem index NULL i_l_orderkey_quantity 13 NULL 6005 100.00 Using index
|
||||||
Warnings:
|
Warnings:
|
||||||
|
@@ -331,8 +331,8 @@ group by c_name, c_custkey, o_orderkey, o_orderdate, o_totalprice
|
|||||||
order by o_totalprice desc, o_orderdate;
|
order by o_totalprice desc, o_orderdate;
|
||||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
1 PRIMARY orders ALL PRIMARY,i_o_custkey NULL NULL NULL 1500 100.00 Using where; Using temporary; Using filesort
|
1 PRIMARY orders ALL PRIMARY,i_o_custkey NULL NULL NULL 1500 100.00 Using where; Using temporary; Using filesort
|
||||||
1 PRIMARY <subquery2> eq_ref distinct_key distinct_key 4 dbt3_s001.orders.o_orderkey 1 100.00
|
|
||||||
1 PRIMARY customer eq_ref PRIMARY PRIMARY 4 dbt3_s001.orders.o_custkey 1 100.00
|
1 PRIMARY customer eq_ref PRIMARY PRIMARY 4 dbt3_s001.orders.o_custkey 1 100.00
|
||||||
|
1 PRIMARY <subquery2> eq_ref distinct_key distinct_key 4 dbt3_s001.orders.o_orderkey 1 100.00
|
||||||
1 PRIMARY lineitem ref PRIMARY,i_l_orderkey,i_l_orderkey_quantity i_l_orderkey_quantity 4 dbt3_s001.orders.o_orderkey 4 100.00 Using index
|
1 PRIMARY lineitem ref PRIMARY,i_l_orderkey,i_l_orderkey_quantity i_l_orderkey_quantity 4 dbt3_s001.orders.o_orderkey 4 100.00 Using index
|
||||||
2 MATERIALIZED lineitem index NULL PRIMARY 8 NULL 6005 100.00
|
2 MATERIALIZED lineitem index NULL PRIMARY 8 NULL 6005 100.00
|
||||||
Warnings:
|
Warnings:
|
||||||
@@ -365,8 +365,8 @@ group by c_name, c_custkey, o_orderkey, o_orderdate, o_totalprice
|
|||||||
order by o_totalprice desc, o_orderdate;
|
order by o_totalprice desc, o_orderdate;
|
||||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||||
1 PRIMARY orders ALL PRIMARY,i_o_custkey NULL NULL NULL 1500 100.00 Using where; Using temporary; Using filesort
|
1 PRIMARY orders ALL PRIMARY,i_o_custkey NULL NULL NULL 1500 100.00 Using where; Using temporary; Using filesort
|
||||||
1 PRIMARY <subquery2> eq_ref distinct_key distinct_key 4 dbt3_s001.orders.o_orderkey 1 100.00
|
|
||||||
1 PRIMARY customer eq_ref PRIMARY PRIMARY 4 dbt3_s001.orders.o_custkey 1 100.00
|
1 PRIMARY customer eq_ref PRIMARY PRIMARY 4 dbt3_s001.orders.o_custkey 1 100.00
|
||||||
|
1 PRIMARY <subquery2> eq_ref distinct_key distinct_key 4 dbt3_s001.orders.o_orderkey 1 100.00
|
||||||
1 PRIMARY lineitem ref PRIMARY,i_l_orderkey,i_l_orderkey_quantity i_l_orderkey_quantity 4 dbt3_s001.orders.o_orderkey 4 100.00 Using index
|
1 PRIMARY lineitem ref PRIMARY,i_l_orderkey,i_l_orderkey_quantity i_l_orderkey_quantity 4 dbt3_s001.orders.o_orderkey 4 100.00 Using index
|
||||||
2 MATERIALIZED lineitem index NULL PRIMARY 8 NULL 6005 100.00
|
2 MATERIALIZED lineitem index NULL PRIMARY 8 NULL 6005 100.00
|
||||||
Warnings:
|
Warnings:
|
||||||
|
@@ -1160,8 +1160,8 @@ id select_type table type possible_keys key key_len ref rows Extra
|
|||||||
1 PRIMARY A ALL NULL NULL NULL NULL 10
|
1 PRIMARY A ALL NULL NULL NULL NULL 10
|
||||||
1 PRIMARY B ALL NULL NULL NULL NULL 10 Using join buffer (flat, BNL join)
|
1 PRIMARY B ALL NULL NULL NULL NULL 10 Using join buffer (flat, BNL join)
|
||||||
1 PRIMARY E ALL NULL NULL NULL NULL 5 Start temporary; Using join buffer (flat, BNL join)
|
1 PRIMARY E ALL NULL NULL NULL NULL 5 Start temporary; Using join buffer (flat, BNL join)
|
||||||
1 PRIMARY D ALL NULL NULL NULL NULL 10 Using where; Using join buffer (flat, BNL join)
|
1 PRIMARY C ALL NULL NULL NULL NULL 10 Using where; Using join buffer (flat, BNL join)
|
||||||
1 PRIMARY C ALL NULL NULL NULL NULL 10 Using where; End temporary; Using join buffer (flat, BNL join)
|
1 PRIMARY D ALL NULL NULL NULL NULL 10 Using where; End temporary; Using join buffer (flat, BNL join)
|
||||||
flush status;
|
flush status;
|
||||||
select count(*) from t0 A, t0 B, t0 C, t0 D where D.a in (select a from t1 E where a+1 < 10000 + A.a + B.a +C.a+D.a);
|
select count(*) from t0 A, t0 B, t0 C, t0 D where D.a in (select a from t1 E where a+1 < 10000 + A.a + B.a +C.a+D.a);
|
||||||
count(*)
|
count(*)
|
||||||
|
@@ -1163,8 +1163,8 @@ id select_type table type possible_keys key key_len ref rows Extra
|
|||||||
1 PRIMARY A ALL NULL NULL NULL NULL 10
|
1 PRIMARY A ALL NULL NULL NULL NULL 10
|
||||||
1 PRIMARY B ALL NULL NULL NULL NULL 10 Using join buffer (flat, BNL join)
|
1 PRIMARY B ALL NULL NULL NULL NULL 10 Using join buffer (flat, BNL join)
|
||||||
1 PRIMARY E ALL NULL NULL NULL NULL 5 Using where; Start temporary; Using join buffer (incremental, BNL join)
|
1 PRIMARY E ALL NULL NULL NULL NULL 5 Using where; Start temporary; Using join buffer (incremental, BNL join)
|
||||||
1 PRIMARY D hash_ALL NULL #hash#$hj 5 test.E.a 10 Using where; Using join buffer (incremental, BNLH join)
|
1 PRIMARY C ALL NULL NULL NULL NULL 10 Using where; Using join buffer (incremental, BNL join)
|
||||||
1 PRIMARY C ALL NULL NULL NULL NULL 10 Using where; End temporary; Using join buffer (incremental, BNL join)
|
1 PRIMARY D hash_ALL NULL #hash#$hj 5 test.E.a 10 Using where; End temporary; Using join buffer (incremental, BNLH join)
|
||||||
flush status;
|
flush status;
|
||||||
select count(*) from t0 A, t0 B, t0 C, t0 D where D.a in (select a from t1 E where a+1 < 10000 + A.a + B.a +C.a+D.a);
|
select count(*) from t0 A, t0 B, t0 C, t0 D where D.a in (select a from t1 E where a+1 < 10000 + A.a + B.a +C.a+D.a);
|
||||||
count(*)
|
count(*)
|
||||||
|
@@ -2178,10 +2178,10 @@ INSERT INTO t5 VALUES (7,0),(9,0);
|
|||||||
explain
|
explain
|
||||||
SELECT * FROM t3 WHERE t3.a IN (SELECT t5.a FROM t2, t4, t5 WHERE t2.c = t5.a AND t2.b = t5.b);
|
SELECT * FROM t3 WHERE t3.a IN (SELECT t5.a FROM t2, t4, t5 WHERE t2.c = t5.a AND t2.b = t5.b);
|
||||||
id select_type table type possible_keys key key_len ref rows Extra
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 PRIMARY t5 index a a 10 NULL 2 Using index; Start temporary
|
1 PRIMARY t5 index a a 10 NULL 2 Using where; Using index; LooseScan
|
||||||
1 PRIMARY t4 ALL NULL NULL NULL NULL 3
|
1 PRIMARY t4 ALL NULL NULL NULL NULL 3
|
||||||
1 PRIMARY t2 ALL b NULL NULL NULL 10 Using where
|
1 PRIMARY t2 ref b b 5 test.t5.b 2 Using where; FirstMatch(t5)
|
||||||
1 PRIMARY t3 ALL NULL NULL NULL NULL 15 Using where; End temporary; Using join buffer (flat, BNL join)
|
1 PRIMARY t3 ALL NULL NULL NULL NULL 15 Using where; Using join buffer (flat, BNL join)
|
||||||
SELECT * FROM t3 WHERE t3.a IN (SELECT t5.a FROM t2, t4, t5 WHERE t2.c = t5.a AND t2.b = t5.b);
|
SELECT * FROM t3 WHERE t3.a IN (SELECT t5.a FROM t2, t4, t5 WHERE t2.c = t5.a AND t2.b = t5.b);
|
||||||
a
|
a
|
||||||
0
|
0
|
||||||
@@ -2500,8 +2500,8 @@ WHERE t1.a = t2.a AND t2.a IN (SELECT b FROM t3 STRAIGHT_JOIN t4);
|
|||||||
id select_type table type possible_keys key key_len ref rows Extra
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 PRIMARY t3 system NULL NULL NULL NULL 1
|
1 PRIMARY t3 system NULL NULL NULL NULL 1
|
||||||
1 PRIMARY <subquery2> ALL distinct_key NULL NULL NULL 1
|
1 PRIMARY <subquery2> ALL distinct_key NULL NULL NULL 1
|
||||||
1 PRIMARY t2 ref a a 5 const 1 Using index
|
1 PRIMARY t1 ref a a 5 const 1 Using index
|
||||||
1 PRIMARY t1 ref a a 5 func 1 Using index
|
1 PRIMARY t2 ref a a 5 func 1 Using index
|
||||||
2 MATERIALIZED t4 ALL NULL NULL NULL NULL 0
|
2 MATERIALIZED t4 ALL NULL NULL NULL NULL 0
|
||||||
SELECT * FROM t1, t2
|
SELECT * FROM t1, t2
|
||||||
WHERE t1.a = t2.a AND t2.a IN (SELECT b FROM t3 STRAIGHT_JOIN t4);
|
WHERE t1.a = t2.a AND t2.a IN (SELECT b FROM t3 STRAIGHT_JOIN t4);
|
||||||
|
@@ -1129,8 +1129,8 @@ id select_type table type possible_keys key key_len ref rows Extra
|
|||||||
1 PRIMARY alias3 ALL PRIMARY NULL NULL NULL # Using where
|
1 PRIMARY alias3 ALL PRIMARY NULL NULL NULL # Using where
|
||||||
1 PRIMARY alias4 ref PRIMARY,c c 4 test.alias3.d # Using index
|
1 PRIMARY alias4 ref PRIMARY,c c 4 test.alias3.d # Using index
|
||||||
1 PRIMARY alias5 eq_ref PRIMARY PRIMARY 4 test.alias4.b # Using where; FirstMatch(alias3)
|
1 PRIMARY alias5 eq_ref PRIMARY PRIMARY 4 test.alias4.b # Using where; FirstMatch(alias3)
|
||||||
1 PRIMARY alias2 ALL NULL NULL NULL NULL # Using join buffer (flat, BNL join)
|
|
||||||
1 PRIMARY alias1 ALL NULL NULL NULL NULL # Using join buffer (flat, BNL join)
|
1 PRIMARY alias1 ALL NULL NULL NULL NULL # Using join buffer (flat, BNL join)
|
||||||
|
1 PRIMARY alias2 ALL NULL NULL NULL NULL # Using join buffer (flat, BNL join)
|
||||||
SELECT COUNT(*) FROM t1 AS alias1, t1 AS alias2, t2 AS alias3
|
SELECT COUNT(*) FROM t1 AS alias1, t1 AS alias2, t2 AS alias3
|
||||||
WHERE alias3.d IN (
|
WHERE alias3.d IN (
|
||||||
SELECT alias4.c FROM t2 AS alias4, t2 AS alias5
|
SELECT alias4.c FROM t2 AS alias4, t2 AS alias5
|
||||||
@@ -1150,8 +1150,8 @@ id select_type table type possible_keys key key_len ref rows Extra
|
|||||||
1 PRIMARY alias3 ALL PRIMARY NULL NULL NULL # Using where
|
1 PRIMARY alias3 ALL PRIMARY NULL NULL NULL # Using where
|
||||||
1 PRIMARY alias4 ref PRIMARY,c c 4 test.alias3.d # Using index
|
1 PRIMARY alias4 ref PRIMARY,c c 4 test.alias3.d # Using index
|
||||||
1 PRIMARY alias5 eq_ref PRIMARY PRIMARY 4 test.alias4.b # Using where; FirstMatch(alias3)
|
1 PRIMARY alias5 eq_ref PRIMARY PRIMARY 4 test.alias4.b # Using where; FirstMatch(alias3)
|
||||||
1 PRIMARY alias2 ALL NULL NULL NULL NULL # Using join buffer (flat, BNL join)
|
|
||||||
1 PRIMARY alias1 ALL NULL NULL NULL NULL # Using join buffer (flat, BNL join)
|
1 PRIMARY alias1 ALL NULL NULL NULL NULL # Using join buffer (flat, BNL join)
|
||||||
|
1 PRIMARY alias2 ALL NULL NULL NULL NULL # Using join buffer (flat, BNL join)
|
||||||
SELECT COUNT(*) FROM t1 AS alias1, t1 AS alias2, t2 AS alias3
|
SELECT COUNT(*) FROM t1 AS alias1, t1 AS alias2, t2 AS alias3
|
||||||
WHERE alias3.d IN (
|
WHERE alias3.d IN (
|
||||||
SELECT alias4.c FROM t2 AS alias4, t2 AS alias5
|
SELECT alias4.c FROM t2 AS alias4, t2 AS alias5
|
||||||
|
@@ -1142,8 +1142,8 @@ id select_type table type possible_keys key key_len ref rows Extra
|
|||||||
1 PRIMARY alias3 ALL PRIMARY NULL NULL NULL # Using where
|
1 PRIMARY alias3 ALL PRIMARY NULL NULL NULL # Using where
|
||||||
1 PRIMARY alias4 ref PRIMARY,c c 4 test.alias3.d # Using index
|
1 PRIMARY alias4 ref PRIMARY,c c 4 test.alias3.d # Using index
|
||||||
1 PRIMARY alias5 eq_ref PRIMARY PRIMARY 4 test.alias4.b # Using where; FirstMatch(alias3)
|
1 PRIMARY alias5 eq_ref PRIMARY PRIMARY 4 test.alias4.b # Using where; FirstMatch(alias3)
|
||||||
1 PRIMARY alias2 ALL NULL NULL NULL NULL # Using join buffer (flat, BNL join)
|
1 PRIMARY alias1 ALL NULL NULL NULL NULL # Using join buffer (flat, BNL join)
|
||||||
1 PRIMARY alias1 ALL NULL NULL NULL NULL # Using join buffer (incremental, BNL join)
|
1 PRIMARY alias2 ALL NULL NULL NULL NULL # Using join buffer (incremental, BNL join)
|
||||||
SELECT COUNT(*) FROM t1 AS alias1, t1 AS alias2, t2 AS alias3
|
SELECT COUNT(*) FROM t1 AS alias1, t1 AS alias2, t2 AS alias3
|
||||||
WHERE alias3.d IN (
|
WHERE alias3.d IN (
|
||||||
SELECT alias4.c FROM t2 AS alias4, t2 AS alias5
|
SELECT alias4.c FROM t2 AS alias4, t2 AS alias5
|
||||||
@@ -1163,8 +1163,8 @@ id select_type table type possible_keys key key_len ref rows Extra
|
|||||||
1 PRIMARY alias3 ALL PRIMARY NULL NULL NULL # Using where
|
1 PRIMARY alias3 ALL PRIMARY NULL NULL NULL # Using where
|
||||||
1 PRIMARY alias4 ref PRIMARY,c c 4 test.alias3.d # Using index
|
1 PRIMARY alias4 ref PRIMARY,c c 4 test.alias3.d # Using index
|
||||||
1 PRIMARY alias5 eq_ref PRIMARY PRIMARY 4 test.alias4.b # Using where; FirstMatch(alias3)
|
1 PRIMARY alias5 eq_ref PRIMARY PRIMARY 4 test.alias4.b # Using where; FirstMatch(alias3)
|
||||||
1 PRIMARY alias2 ALL NULL NULL NULL NULL # Using join buffer (flat, BNL join)
|
1 PRIMARY alias1 ALL NULL NULL NULL NULL # Using join buffer (flat, BNL join)
|
||||||
1 PRIMARY alias1 ALL NULL NULL NULL NULL # Using join buffer (incremental, BNL join)
|
1 PRIMARY alias2 ALL NULL NULL NULL NULL # Using join buffer (incremental, BNL join)
|
||||||
SELECT COUNT(*) FROM t1 AS alias1, t1 AS alias2, t2 AS alias3
|
SELECT COUNT(*) FROM t1 AS alias1, t1 AS alias2, t2 AS alias3
|
||||||
WHERE alias3.d IN (
|
WHERE alias3.d IN (
|
||||||
SELECT alias4.c FROM t2 AS alias4, t2 AS alias5
|
SELECT alias4.c FROM t2 AS alias4, t2 AS alias5
|
||||||
|
@@ -1131,8 +1131,8 @@ id select_type table type possible_keys key key_len ref rows Extra
|
|||||||
1 PRIMARY alias3 ALL PRIMARY NULL NULL NULL # Using where
|
1 PRIMARY alias3 ALL PRIMARY NULL NULL NULL # Using where
|
||||||
1 PRIMARY alias4 ref PRIMARY,c c 4 test.alias3.d # Using index
|
1 PRIMARY alias4 ref PRIMARY,c c 4 test.alias3.d # Using index
|
||||||
1 PRIMARY alias5 eq_ref PRIMARY PRIMARY 4 test.alias4.b # Using where; FirstMatch(alias3)
|
1 PRIMARY alias5 eq_ref PRIMARY PRIMARY 4 test.alias4.b # Using where; FirstMatch(alias3)
|
||||||
1 PRIMARY alias2 ALL NULL NULL NULL NULL # Using join buffer (flat, BNL join)
|
|
||||||
1 PRIMARY alias1 ALL NULL NULL NULL NULL # Using join buffer (flat, BNL join)
|
1 PRIMARY alias1 ALL NULL NULL NULL NULL # Using join buffer (flat, BNL join)
|
||||||
|
1 PRIMARY alias2 ALL NULL NULL NULL NULL # Using join buffer (flat, BNL join)
|
||||||
SELECT COUNT(*) FROM t1 AS alias1, t1 AS alias2, t2 AS alias3
|
SELECT COUNT(*) FROM t1 AS alias1, t1 AS alias2, t2 AS alias3
|
||||||
WHERE alias3.d IN (
|
WHERE alias3.d IN (
|
||||||
SELECT alias4.c FROM t2 AS alias4, t2 AS alias5
|
SELECT alias4.c FROM t2 AS alias4, t2 AS alias5
|
||||||
@@ -1152,8 +1152,8 @@ id select_type table type possible_keys key key_len ref rows Extra
|
|||||||
1 PRIMARY alias3 ALL PRIMARY NULL NULL NULL # Using where
|
1 PRIMARY alias3 ALL PRIMARY NULL NULL NULL # Using where
|
||||||
1 PRIMARY alias4 ref PRIMARY,c c 4 test.alias3.d # Using index
|
1 PRIMARY alias4 ref PRIMARY,c c 4 test.alias3.d # Using index
|
||||||
1 PRIMARY alias5 eq_ref PRIMARY PRIMARY 4 test.alias4.b # Using where; FirstMatch(alias3)
|
1 PRIMARY alias5 eq_ref PRIMARY PRIMARY 4 test.alias4.b # Using where; FirstMatch(alias3)
|
||||||
1 PRIMARY alias2 ALL NULL NULL NULL NULL # Using join buffer (flat, BNL join)
|
|
||||||
1 PRIMARY alias1 ALL NULL NULL NULL NULL # Using join buffer (flat, BNL join)
|
1 PRIMARY alias1 ALL NULL NULL NULL NULL # Using join buffer (flat, BNL join)
|
||||||
|
1 PRIMARY alias2 ALL NULL NULL NULL NULL # Using join buffer (flat, BNL join)
|
||||||
SELECT COUNT(*) FROM t1 AS alias1, t1 AS alias2, t2 AS alias3
|
SELECT COUNT(*) FROM t1 AS alias1, t1 AS alias2, t2 AS alias3
|
||||||
WHERE alias3.d IN (
|
WHERE alias3.d IN (
|
||||||
SELECT alias4.c FROM t2 AS alias4, t2 AS alias5
|
SELECT alias4.c FROM t2 AS alias4, t2 AS alias5
|
||||||
@@ -1933,19 +1933,19 @@ AND t3.id_product IN (SELECT id_product FROM t2 t2_4 WHERE t2_4.id_t2 = 34 OR t2
|
|||||||
AND t3.id_product IN (SELECT id_product FROM t2 t2_5 WHERE t2_5.id_t2 = 29 OR t2_5.id_t2 = 28 OR t2_5.id_t2 = 26);
|
AND t3.id_product IN (SELECT id_product FROM t2 t2_5 WHERE t2_5.id_t2 = 29 OR t2_5.id_t2 = 28 OR t2_5.id_t2 = 26);
|
||||||
id select_type table type possible_keys key key_len ref rows Extra
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 PRIMARY t3 index PRIMARY PRIMARY 4 NULL 18 Using index
|
1 PRIMARY t3 index PRIMARY PRIMARY 4 NULL 18 Using index
|
||||||
1 PRIMARY <subquery3> eq_ref distinct_key distinct_key 4 func 1 Using where
|
|
||||||
1 PRIMARY t5 ALL NULL NULL NULL NULL 18 Using where; Using join buffer (flat, BNL join)
|
|
||||||
1 PRIMARY <subquery4> eq_ref distinct_key distinct_key 4 func 1 Using where
|
|
||||||
1 PRIMARY <subquery6> eq_ref distinct_key distinct_key 4 func 1 Using where
|
|
||||||
1 PRIMARY <subquery2> eq_ref distinct_key distinct_key 4 func 1 Using where
|
|
||||||
1 PRIMARY t4 eq_ref PRIMARY PRIMARY 8 test.t3.id_product,const 1 Using where; Using index
|
|
||||||
1 PRIMARY <subquery5> eq_ref distinct_key distinct_key 4 func 1 Using where
|
1 PRIMARY <subquery5> eq_ref distinct_key distinct_key 4 func 1 Using where
|
||||||
|
1 PRIMARY t5 ALL NULL NULL NULL NULL 18 Using where; Using join buffer (flat, BNL join)
|
||||||
|
1 PRIMARY <subquery6> eq_ref distinct_key distinct_key 4 func 1 Using where
|
||||||
|
1 PRIMARY t4 eq_ref PRIMARY PRIMARY 8 test.t3.id_product,const 1 Using where; Using index
|
||||||
|
1 PRIMARY <subquery3> eq_ref distinct_key distinct_key 4 func 1 Using where
|
||||||
1 PRIMARY t1 index NULL PRIMARY 8 NULL 73 Using where; Using index; Using join buffer (flat, BNL join)
|
1 PRIMARY t1 index NULL PRIMARY 8 NULL 73 Using where; Using index; Using join buffer (flat, BNL join)
|
||||||
|
1 PRIMARY <subquery4> eq_ref distinct_key distinct_key 4 func 1 Using where
|
||||||
|
1 PRIMARY <subquery2> eq_ref distinct_key distinct_key 4 func 1 Using where
|
||||||
|
5 MATERIALIZED t2_4 range id_t2,id_product id_t2 5 NULL 18 Using index condition; Using where
|
||||||
|
6 MATERIALIZED t2_5 range id_t2,id_product id_t2 5 NULL 31 Using index condition; Using where
|
||||||
3 MATERIALIZED t2_2 ref id_t2,id_product id_t2 5 const 12
|
3 MATERIALIZED t2_2 ref id_t2,id_product id_t2 5 const 12
|
||||||
4 MATERIALIZED t2_3 range id_t2,id_product id_t2 5 NULL 33 Using index condition; Using where
|
4 MATERIALIZED t2_3 range id_t2,id_product id_t2 5 NULL 33 Using index condition; Using where
|
||||||
6 MATERIALIZED t2_5 range id_t2,id_product id_t2 5 NULL 31 Using index condition; Using where
|
|
||||||
2 MATERIALIZED t2_1 ALL id_t2,id_product NULL NULL NULL 223 Using where
|
2 MATERIALIZED t2_1 ALL id_t2,id_product NULL NULL NULL 223 Using where
|
||||||
5 MATERIALIZED t2_4 range id_t2,id_product id_t2 5 NULL 18 Using index condition; Using where
|
|
||||||
set optimizer_switch='rowid_filter=default';
|
set optimizer_switch='rowid_filter=default';
|
||||||
drop table t1,t2,t3,t4,t5;
|
drop table t1,t2,t3,t4,t5;
|
||||||
set global innodb_stats_persistent= @innodb_stats_persistent_save;
|
set global innodb_stats_persistent= @innodb_stats_persistent_save;
|
||||||
|
@@ -2189,10 +2189,10 @@ INSERT INTO t5 VALUES (7,0),(9,0);
|
|||||||
explain
|
explain
|
||||||
SELECT * FROM t3 WHERE t3.a IN (SELECT t5.a FROM t2, t4, t5 WHERE t2.c = t5.a AND t2.b = t5.b);
|
SELECT * FROM t3 WHERE t3.a IN (SELECT t5.a FROM t2, t4, t5 WHERE t2.c = t5.a AND t2.b = t5.b);
|
||||||
id select_type table type possible_keys key key_len ref rows Extra
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 PRIMARY t5 index a a 10 NULL 2 Using index; Start temporary
|
1 PRIMARY t5 index a a 10 NULL 2 Using where; Using index; LooseScan
|
||||||
1 PRIMARY t4 ALL NULL NULL NULL NULL 3 Using join buffer (flat, BNL join)
|
1 PRIMARY t4 ALL NULL NULL NULL NULL 3
|
||||||
1 PRIMARY t2 ALL b NULL NULL NULL 10 Using where; Using join buffer (incremental, BNL join)
|
1 PRIMARY t2 ref b b 5 test.t5.b 2 Using where; FirstMatch(t5)
|
||||||
1 PRIMARY t3 ALL NULL NULL NULL NULL 15 Using where; End temporary; Using join buffer (incremental, BNL join)
|
1 PRIMARY t3 ALL NULL NULL NULL NULL 15 Using where; Using join buffer (flat, BNL join)
|
||||||
SELECT * FROM t3 WHERE t3.a IN (SELECT t5.a FROM t2, t4, t5 WHERE t2.c = t5.a AND t2.b = t5.b);
|
SELECT * FROM t3 WHERE t3.a IN (SELECT t5.a FROM t2, t4, t5 WHERE t2.c = t5.a AND t2.b = t5.b);
|
||||||
a
|
a
|
||||||
0
|
0
|
||||||
@@ -2511,8 +2511,8 @@ WHERE t1.a = t2.a AND t2.a IN (SELECT b FROM t3 STRAIGHT_JOIN t4);
|
|||||||
id select_type table type possible_keys key key_len ref rows Extra
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 PRIMARY t3 system NULL NULL NULL NULL 1
|
1 PRIMARY t3 system NULL NULL NULL NULL 1
|
||||||
1 PRIMARY <subquery2> ALL distinct_key NULL NULL NULL 1
|
1 PRIMARY <subquery2> ALL distinct_key NULL NULL NULL 1
|
||||||
1 PRIMARY t2 ref a a 5 const 1 Using index
|
1 PRIMARY t1 ref a a 5 const 1 Using index
|
||||||
1 PRIMARY t1 ref a a 5 func 1 Using index
|
1 PRIMARY t2 ref a a 5 func 1 Using index
|
||||||
2 MATERIALIZED t4 ALL NULL NULL NULL NULL 0
|
2 MATERIALIZED t4 ALL NULL NULL NULL NULL 0
|
||||||
SELECT * FROM t1, t2
|
SELECT * FROM t1, t2
|
||||||
WHERE t1.a = t2.a AND t2.a IN (SELECT b FROM t3 STRAIGHT_JOIN t4);
|
WHERE t1.a = t2.a AND t2.a IN (SELECT b FROM t3 STRAIGHT_JOIN t4);
|
||||||
|
@@ -8,6 +8,10 @@ connection default;
|
|||||||
SET DEBUG_SYNC='now WAIT_FOR c';
|
SET DEBUG_SYNC='now WAIT_FOR c';
|
||||||
# restart
|
# restart
|
||||||
disconnect wait;
|
disconnect wait;
|
||||||
|
SET @save_frequency=@@GLOBAL.innodb_purge_rseg_truncate_frequency;
|
||||||
|
SET GLOBAL innodb_purge_rseg_truncate_frequency=1;
|
||||||
|
InnoDB 0 transactions not purged
|
||||||
|
SET GLOBAL innodb_purge_rseg_truncate_frequency=@save_frequency;
|
||||||
SELECT COUNT(*) FROM t1;
|
SELECT COUNT(*) FROM t1;
|
||||||
COUNT(*)
|
COUNT(*)
|
||||||
0
|
0
|
||||||
|
1
mysql-test/suite/innodb/t/row_format_redundant.opt
Normal file
1
mysql-test/suite/innodb/t/row_format_redundant.opt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
--innodb-checksum-algorithm=crc32
|
@@ -17,7 +17,13 @@ SET DEBUG_SYNC='now WAIT_FOR c';
|
|||||||
--source include/restart_mysqld.inc
|
--source include/restart_mysqld.inc
|
||||||
disconnect wait;
|
disconnect wait;
|
||||||
|
|
||||||
|
SET @save_frequency=@@GLOBAL.innodb_purge_rseg_truncate_frequency;
|
||||||
|
SET GLOBAL innodb_purge_rseg_truncate_frequency=1;
|
||||||
|
--source include/wait_all_purged.inc
|
||||||
|
SET GLOBAL innodb_purge_rseg_truncate_frequency=@save_frequency;
|
||||||
|
|
||||||
--replace_result 2 0
|
--replace_result 2 0
|
||||||
SELECT COUNT(*) FROM t1;
|
SELECT COUNT(*) FROM t1;
|
||||||
TRUNCATE TABLE t1;
|
TRUNCATE TABLE t1;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
@@ -1,15 +1,17 @@
|
|||||||
call mtr.add_suppression('Unknown key id 1. Can''t continue');
|
call mtr.add_suppression('Unknown key id 1');
|
||||||
|
call mtr.add_suppression('try to repair it');
|
||||||
|
call mtr.add_suppression('Index is corrupted');
|
||||||
set global aria_encrypt_tables= 1;
|
set global aria_encrypt_tables= 1;
|
||||||
create table t1 (pk int primary key, a int, key(a)) engine=aria transactional=1;
|
create table t1 (pk int primary key, a int, key(a)) engine=aria transactional=1;
|
||||||
alter table t1 disable keys;
|
alter table t1 disable keys;
|
||||||
insert into t1 values (1,1);
|
insert into t1 values (1,1);
|
||||||
alter table t1 enable keys;
|
alter table t1 enable keys;
|
||||||
ERROR HY000: Unknown key id 1. Can't continue!
|
ERROR HY000: Unknown key id 1 for ./test/t1. Can't continue!
|
||||||
repair table t1 use_frm;
|
repair table t1 use_frm;
|
||||||
Table Op Msg_type Msg_text
|
Table Op Msg_type Msg_text
|
||||||
test.t1 repair warning Number of rows changed from 0 to 1
|
test.t1 repair warning Number of rows changed from 0 to 1
|
||||||
test.t1 repair Error Unknown key id 1. Can't continue!
|
test.t1 repair Error Unknown key id 1 for ./test/t1. Can't continue!
|
||||||
test.t1 repair Error Unknown key id 1. Can't continue!
|
test.t1 repair Error Unknown key id 1 for ./test/t1. Can't continue!
|
||||||
test.t1 repair status OK
|
test.t1 repair status OK
|
||||||
drop table t1;
|
drop table t1;
|
||||||
set global aria_encrypt_tables= default;
|
set global aria_encrypt_tables= default;
|
||||||
|
@@ -1,14 +1,18 @@
|
|||||||
#
|
#
|
||||||
# MDEV-18496 Crash when Aria encryption is enabled but plugin not available
|
# MDEV-18496 Crash when Aria encryption is enabled but plugin not available
|
||||||
#
|
#
|
||||||
call mtr.add_suppression('Unknown key id 1. Can''t continue');
|
call mtr.add_suppression('Unknown key id 1');
|
||||||
|
call mtr.add_suppression('try to repair it');
|
||||||
|
call mtr.add_suppression('Index is corrupted');
|
||||||
|
|
||||||
set global aria_encrypt_tables= 1;
|
set global aria_encrypt_tables= 1;
|
||||||
create table t1 (pk int primary key, a int, key(a)) engine=aria transactional=1;
|
create table t1 (pk int primary key, a int, key(a)) engine=aria transactional=1;
|
||||||
alter table t1 disable keys;
|
alter table t1 disable keys;
|
||||||
insert into t1 values (1,1);
|
insert into t1 values (1,1);
|
||||||
error 192;
|
--replace_result \\ /
|
||||||
|
--error 192
|
||||||
alter table t1 enable keys;
|
alter table t1 enable keys;
|
||||||
|
--replace_result \\ /
|
||||||
repair table t1 use_frm;
|
repair table t1 use_frm;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
set global aria_encrypt_tables= default;
|
set global aria_encrypt_tables= default;
|
||||||
|
@@ -26,9 +26,10 @@ a
|
|||||||
ThursdayMorningsMarket
|
ThursdayMorningsMarket
|
||||||
ThursdayMorningsMarketb
|
ThursdayMorningsMarketb
|
||||||
Warnings:
|
Warnings:
|
||||||
Error 145 t_corrupted2' is marked as crashed and should be repaired
|
Error 145 Got error '145 "Table was marked as crashed and should be repaired"' for './mysqltest/t_corrupted2'
|
||||||
Warning 1034 1 client is using or hasn't closed the table properly
|
Warning 1034 1 client is using or hasn't closed the table properly
|
||||||
Error 1034 Wrong base information on indexpage at page: 1
|
Error 176 Got error '176 "Read page with wrong checksum"' for './mysqltest/t_corrupted2.MAI'
|
||||||
|
Error 1034 Can't read indexpage from page: 1, error: 176
|
||||||
select * from t_corrupted2;
|
select * from t_corrupted2;
|
||||||
a
|
a
|
||||||
ThursdayMorningsMarket
|
ThursdayMorningsMarket
|
||||||
|
@@ -20,8 +20,8 @@ select count(*) from mysql.proc;
|
|||||||
# account for Unix and Windows variation.
|
# account for Unix and Windows variation.
|
||||||
call mtr.add_suppression("Checking table: '\\..mysqltest.t_corrupted2'");
|
call mtr.add_suppression("Checking table: '\\..mysqltest.t_corrupted2'");
|
||||||
call mtr.add_suppression("Recovering table: '\\..mysqltest.t_corrupted2'");
|
call mtr.add_suppression("Recovering table: '\\..mysqltest.t_corrupted2'");
|
||||||
call mtr.add_suppression("Table '\\..mysqltest.t_corrupted2' is marked as crashed and should be repaired");
|
call mtr.add_suppression("Table was marked as crashed and should be repaired");
|
||||||
call mtr.add_suppression("Table 't_corrupted2' is marked as crashed and should be repaired");
|
call mtr.add_suppression("Read page with wrong checksum");
|
||||||
|
|
||||||
let $def_checkinterval=`select @@global.aria_checkpoint_interval`;
|
let $def_checkinterval=`select @@global.aria_checkpoint_interval`;
|
||||||
|
|
||||||
@@ -78,7 +78,7 @@ perl;
|
|||||||
syswrite (FILE, $whatever) or die;
|
syswrite (FILE, $whatever) or die;
|
||||||
close FILE;
|
close FILE;
|
||||||
EOF
|
EOF
|
||||||
replace_regex /Table.*t_corrupted2/t_corrupted2/ ;
|
--replace_result \\ /
|
||||||
--enable_prepare_warnings
|
--enable_prepare_warnings
|
||||||
select * from t_corrupted2; # should show corruption and repair messages
|
select * from t_corrupted2; # should show corruption and repair messages
|
||||||
--disable_prepare_warnings
|
--disable_prepare_warnings
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
call mtr.add_suppression("Table '.*' is marked as crashed and should be repaired");
|
call mtr.add_suppression("Table was marked as crashed");
|
||||||
call mtr.add_suppression("Checking table: .*");
|
call mtr.add_suppression("Checking table: .*");
|
||||||
create table t1 (a int primary key auto_increment, b int) engine=aria transactional= 1;
|
create table t1 (a int primary key auto_increment, b int) engine=aria transactional= 1;
|
||||||
create table t2 (a int primary key auto_increment, b int) engine=aria transactional= 0;
|
create table t2 (a int primary key auto_increment, b int) engine=aria transactional= 0;
|
||||||
@@ -54,7 +54,7 @@ a b
|
|||||||
10 11
|
10 11
|
||||||
11 12
|
11 12
|
||||||
Warnings:
|
Warnings:
|
||||||
Error 145 Table './test/t2' is marked as crashed and should be repaired
|
Error 145 Got error '145 "Table was marked as crashed and should be repaired"' for './test/t2'
|
||||||
Warning 1034 1 client is using or hasn't closed the table properly
|
Warning 1034 1 client is using or hasn't closed the table properly
|
||||||
Note 1034 Table is fixed
|
Note 1034 Table is fixed
|
||||||
insert into t1 (b) values (100),(200);
|
insert into t1 (b) values (100),(200);
|
||||||
@@ -92,7 +92,7 @@ NEXT VALUE for s1 seq
|
|||||||
11 3
|
11 3
|
||||||
12 4
|
12 4
|
||||||
Warnings:
|
Warnings:
|
||||||
Error 145 Table './test/s1' is marked as crashed and should be repaired
|
Error 145 Got error '145 "Table was marked as crashed and should be repaired"' for './test/s1'
|
||||||
Warning 1034 1 client is using or hasn't closed the table properly
|
Warning 1034 1 client is using or hasn't closed the table properly
|
||||||
Note 1034 Table is fixed
|
Note 1034 Table is fixed
|
||||||
drop table t1,t2;
|
drop table t1,t2;
|
||||||
@@ -100,7 +100,7 @@ drop sequence s1;
|
|||||||
include/show_binlog_events.inc
|
include/show_binlog_events.inc
|
||||||
Log_name Pos Event_type Server_id End_log_pos Info
|
Log_name Pos Event_type Server_id End_log_pos Info
|
||||||
master-bin.000001 # Gtid # # BEGIN GTID #-#-#
|
master-bin.000001 # Gtid # # BEGIN GTID #-#-#
|
||||||
master-bin.000001 # Query # # use `mtr`; INSERT INTO test_suppressions (pattern) VALUES ( NAME_CONST('pattern',_latin1'Table \'.*\' is marked as crashed and should be repaired' COLLATE 'latin1_swedish_ci'))
|
master-bin.000001 # Query # # use `mtr`; INSERT INTO test_suppressions (pattern) VALUES ( NAME_CONST('pattern',_latin1'Table was marked as crashed' COLLATE 'latin1_swedish_ci'))
|
||||||
master-bin.000001 # Query # # COMMIT
|
master-bin.000001 # Query # # COMMIT
|
||||||
master-bin.000001 # Gtid # # BEGIN GTID #-#-#
|
master-bin.000001 # Gtid # # BEGIN GTID #-#-#
|
||||||
master-bin.000001 # Query # # use `mtr`; INSERT INTO test_suppressions (pattern) VALUES ( NAME_CONST('pattern',_latin1'Checking table: .*' COLLATE 'latin1_swedish_ci'))
|
master-bin.000001 # Query # # use `mtr`; INSERT INTO test_suppressions (pattern) VALUES ( NAME_CONST('pattern',_latin1'Checking table: .*' COLLATE 'latin1_swedish_ci'))
|
||||||
|
@@ -3,7 +3,7 @@
|
|||||||
# no-protocol doesn't print warnings about repaired tables
|
# no-protocol doesn't print warnings about repaired tables
|
||||||
--source include/no_protocol.inc
|
--source include/no_protocol.inc
|
||||||
|
|
||||||
call mtr.add_suppression("Table '.*' is marked as crashed and should be repaired");
|
call mtr.add_suppression("Table was marked as crashed");
|
||||||
call mtr.add_suppression("Checking table: .*");
|
call mtr.add_suppression("Checking table: .*");
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@@ -3,7 +3,7 @@
|
|||||||
#
|
#
|
||||||
# restart
|
# restart
|
||||||
FOUND 1 /InnoDB: New log file created, LSN=175964\d{8}/ in mysqld.1.err
|
FOUND 1 /InnoDB: New log file created, LSN=175964\d{8}/ in mysqld.1.err
|
||||||
CREATE TABLE t(i INT) ENGINE INNODB;
|
CREATE TABLE t(i INT) ENGINE=INNODB ENCRYPTED=YES;
|
||||||
INSERT INTO t VALUES(1);
|
INSERT INTO t VALUES(1);
|
||||||
# xtrabackup backup
|
# xtrabackup backup
|
||||||
SET GLOBAL innodb_flush_log_at_trx_commit=1;
|
SET GLOBAL innodb_flush_log_at_trx_commit=1;
|
||||||
@@ -16,6 +16,14 @@ INSERT INTO t VALUES(2);
|
|||||||
SELECT * FROM t;
|
SELECT * FROM t;
|
||||||
i
|
i
|
||||||
1
|
1
|
||||||
|
FLUSH TABLE t FOR EXPORT;
|
||||||
|
UNLOCK TABLES;
|
||||||
|
ALTER TABLE t DISCARD TABLESPACE;
|
||||||
|
ALTER TABLE t IMPORT TABLESPACE;
|
||||||
|
FLUSH TABLE t FOR EXPORT;
|
||||||
|
UNLOCK TABLES;
|
||||||
|
ALTER TABLE t DISCARD TABLESPACE;
|
||||||
|
ALTER TABLE t IMPORT TABLESPACE;
|
||||||
DROP TABLE t;
|
DROP TABLE t;
|
||||||
# shutdown server
|
# shutdown server
|
||||||
# remove datadir
|
# remove datadir
|
||||||
|
@@ -42,7 +42,7 @@ let SEARCH_FILE= $MYSQLTEST_VARDIR/log/mysqld.1.err;
|
|||||||
--let SEARCH_PATTERN= InnoDB: New log file created, LSN=175964\d{8}
|
--let SEARCH_PATTERN= InnoDB: New log file created, LSN=175964\d{8}
|
||||||
--source include/search_pattern_in_file.inc
|
--source include/search_pattern_in_file.inc
|
||||||
|
|
||||||
CREATE TABLE t(i INT) ENGINE INNODB;
|
CREATE TABLE t(i INT) ENGINE=INNODB ENCRYPTED=YES;
|
||||||
INSERT INTO t VALUES(1);
|
INSERT INTO t VALUES(1);
|
||||||
|
|
||||||
echo # xtrabackup backup;
|
echo # xtrabackup backup;
|
||||||
@@ -58,6 +58,22 @@ exec $XTRABACKUP --prepare --target-dir=$targetdir;
|
|||||||
--source include/restart_and_restore.inc
|
--source include/restart_and_restore.inc
|
||||||
--enable_result_log
|
--enable_result_log
|
||||||
SELECT * FROM t;
|
SELECT * FROM t;
|
||||||
|
FLUSH TABLE t FOR EXPORT;
|
||||||
|
copy_file $_datadir/test/t.ibd $_datadir/test/t_copy.ibd;
|
||||||
|
copy_file $_datadir/test/t.cfg $_datadir/test/t_copy.cfg;
|
||||||
|
UNLOCK TABLES;
|
||||||
|
ALTER TABLE t DISCARD TABLESPACE;
|
||||||
|
move_file $_datadir/test/t_copy.ibd $_datadir/test/t.ibd;
|
||||||
|
move_file $_datadir/test/t_copy.cfg $_datadir/test/t.cfg;
|
||||||
|
ALTER TABLE t IMPORT TABLESPACE;
|
||||||
|
FLUSH TABLE t FOR EXPORT;
|
||||||
|
copy_file $_datadir/test/t.ibd $_datadir/test/t_copy.ibd;
|
||||||
|
copy_file $_datadir/test/t.cfg $_datadir/test/t_copy.cfg;
|
||||||
|
UNLOCK TABLES;
|
||||||
|
ALTER TABLE t DISCARD TABLESPACE;
|
||||||
|
move_file $_datadir/test/t_copy.ibd $_datadir/test/t.ibd;
|
||||||
|
move_file $_datadir/test/t_copy.cfg $_datadir/test/t.cfg;
|
||||||
|
ALTER TABLE t IMPORT TABLESPACE;
|
||||||
DROP TABLE t;
|
DROP TABLE t;
|
||||||
rmdir $targetdir;
|
rmdir $targetdir;
|
||||||
let $targetdir= $targetdir_old;
|
let $targetdir= $targetdir_old;
|
||||||
|
@@ -23,7 +23,7 @@
|
|||||||
|
|
||||||
#ifndef MAIN
|
#ifndef MAIN
|
||||||
|
|
||||||
#if defined(__APPLE__) || defined(__FreeBSD__) || defined(__linux__) || defined(__sun) || defined(_WIN32)
|
#if defined(_AIX) || defined(__APPLE__) || defined(__FreeBSD__) || defined(__linux__) || defined(__sun) || defined(_WIN32)
|
||||||
static my_bool memcpy_and_test(uchar *to, uchar *from, uint len)
|
static my_bool memcpy_and_test(uchar *to, uchar *from, uint len)
|
||||||
{
|
{
|
||||||
uint i, res= 1;
|
uint i, res= 1;
|
||||||
@@ -74,7 +74,7 @@ err:
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
#elif defined(__linux__) || defined(__sun)
|
#elif defined(_AIX) || defined(__linux__) || defined(__sun)
|
||||||
#include <net/if.h>
|
#include <net/if.h>
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
#include <net/if_arp.h>
|
#include <net/if_arp.h>
|
||||||
@@ -87,11 +87,15 @@ err:
|
|||||||
my_bool my_gethwaddr(uchar *to)
|
my_bool my_gethwaddr(uchar *to)
|
||||||
{
|
{
|
||||||
int fd, res= 1;
|
int fd, res= 1;
|
||||||
|
#ifdef _AIX
|
||||||
|
struct ifhwaddr_req ifr[32];
|
||||||
|
#else
|
||||||
struct ifreq ifr[32];
|
struct ifreq ifr[32];
|
||||||
|
#endif
|
||||||
struct ifconf ifc;
|
struct ifconf ifc;
|
||||||
DBUG_ENTER("my_gethwaddr");
|
DBUG_ENTER("my_gethwaddr");
|
||||||
|
|
||||||
ifc.ifc_req= ifr;
|
ifc.ifc_req= (struct ifreq *) ifr;
|
||||||
ifc.ifc_len= sizeof(ifr);
|
ifc.ifc_len= sizeof(ifr);
|
||||||
|
|
||||||
fd = socket(AF_INET, SOCK_DGRAM, 0);
|
fd = socket(AF_INET, SOCK_DGRAM, 0);
|
||||||
@@ -106,9 +110,14 @@ my_bool my_gethwaddr(uchar *to)
|
|||||||
uint i;
|
uint i;
|
||||||
for (i= 0; res && i < ifc.ifc_len / sizeof(ifr[0]); i++)
|
for (i= 0; res && i < ifc.ifc_len / sizeof(ifr[0]); i++)
|
||||||
{
|
{
|
||||||
#ifdef __linux__
|
#if !defined(_AIX) || !defined(__linux__)
|
||||||
|
#if defined(__linux___)
|
||||||
|
#define HWADDR_DATA ifr[i].ifr_hwaddr.sa_data
|
||||||
|
#else
|
||||||
|
#define HWADDR_DATA ifr[i].ifr_hwaddr
|
||||||
|
#endif
|
||||||
if (ioctl(fd, SIOCGIFHWADDR, &ifr[i]) >= 0)
|
if (ioctl(fd, SIOCGIFHWADDR, &ifr[i]) >= 0)
|
||||||
res= memcpy_and_test(to, (uchar *)&ifr[i].ifr_hwaddr.sa_data,
|
res= memcpy_and_test(to, (uchar *)&HWADDR_DATA,
|
||||||
ETHER_ADDR_LEN);
|
ETHER_ADDR_LEN);
|
||||||
#else
|
#else
|
||||||
/*
|
/*
|
||||||
|
@@ -842,7 +842,7 @@ EOF
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if [ $WSREP_SST_OPT_BYPASS -eq 0 ]; then
|
if [ $WSREP_SST_OPT_BYPASS -eq 0 ]; then
|
||||||
if grep -m1 -qE "^$BYPASS_TAG([[space]]+.*)?\$" -- "$MAGIC_FILE"; then
|
if grep -m1 -qE "^$BYPASS_TAG([[:space:]]+.*)?\$" -- "$MAGIC_FILE"; then
|
||||||
readonly WSREP_SST_OPT_BYPASS=1
|
readonly WSREP_SST_OPT_BYPASS=1
|
||||||
readonly WSREP_TRANSFER_TYPE='IST'
|
readonly WSREP_TRANSFER_TYPE='IST'
|
||||||
fi
|
fi
|
||||||
|
@@ -179,6 +179,8 @@ handler::multi_range_read_info_const(uint keyno, RANGE_SEQ_IF *seq,
|
|||||||
{
|
{
|
||||||
/* Can't scan one range => can't do MRR scan at all */
|
/* Can't scan one range => can't do MRR scan at all */
|
||||||
total_rows= HA_POS_ERROR;
|
total_rows= HA_POS_ERROR;
|
||||||
|
if (thd->is_error())
|
||||||
|
DBUG_RETURN(HA_POS_ERROR);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (pages.first_page == UNUSED_PAGE_NO)
|
if (pages.first_page == UNUSED_PAGE_NO)
|
||||||
|
@@ -180,7 +180,7 @@
|
|||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
- optimize_semijoin_nests() does pre-optimization
|
- optimize_semijoin_nests() does pre-optimization
|
||||||
- during join optimization, the join has one JOIN_TAB (or is it POSITION?)
|
- during join optimization, the join has one JOIN_TAB (or is it POSITION?)
|
||||||
array, and suffix-based detection is used, see advance_sj_state()
|
array, and suffix-based detection is used, see optimize_semi_joins()
|
||||||
- after join optimization is done, get_best_combination() switches
|
- after join optimization is done, get_best_combination() switches
|
||||||
the data-structure to prefix-based, multiple JOIN_TAB ranges format.
|
the data-structure to prefix-based, multiple JOIN_TAB ranges format.
|
||||||
|
|
||||||
@@ -2761,7 +2761,7 @@ bool find_eq_ref_candidate(TABLE *table, table_map sj_inner_tables)
|
|||||||
Do semi-join optimization step after we've added a new tab to join prefix
|
Do semi-join optimization step after we've added a new tab to join prefix
|
||||||
|
|
||||||
SYNOPSIS
|
SYNOPSIS
|
||||||
advance_sj_state()
|
optimize_semi_joins()
|
||||||
join The join we're optimizing
|
join The join we're optimizing
|
||||||
remaining_tables Tables not in the join prefix
|
remaining_tables Tables not in the join prefix
|
||||||
new_join_tab Join tab we've just added to the join prefix
|
new_join_tab Join tab we've just added to the join prefix
|
||||||
@@ -2821,9 +2821,9 @@ bool is_multiple_semi_joins(JOIN *join, POSITION *prefix, uint idx, table_map in
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void advance_sj_state(JOIN *join, table_map remaining_tables, uint idx,
|
void optimize_semi_joins(JOIN *join, table_map remaining_tables, uint idx,
|
||||||
double *current_record_count, double *current_read_time,
|
double *current_record_count,
|
||||||
POSITION *loose_scan_pos)
|
double *current_read_time, POSITION *loose_scan_pos)
|
||||||
{
|
{
|
||||||
POSITION *pos= join->positions + idx;
|
POSITION *pos= join->positions + idx;
|
||||||
const JOIN_TAB *new_join_tab= pos->table;
|
const JOIN_TAB *new_join_tab= pos->table;
|
||||||
@@ -3014,19 +3014,36 @@ void advance_sj_state(JOIN *join, table_map remaining_tables, uint idx,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((emb_sj_nest= new_join_tab->emb_sj_nest))
|
update_sj_state(join, new_join_tab, idx, remaining_tables);
|
||||||
|
|
||||||
|
pos->prefix_cost.convert_from_cost(*current_read_time);
|
||||||
|
pos->prefix_record_count= *current_record_count;
|
||||||
|
pos->dups_producing_tables= dups_producing_tables;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Update JOIN's semi-join optimization state after the join tab new_tab
|
||||||
|
has been added into the join prefix.
|
||||||
|
|
||||||
|
@seealso restore_prev_sj_state() does the reverse actoion
|
||||||
|
*/
|
||||||
|
|
||||||
|
void update_sj_state(JOIN *join, const JOIN_TAB *new_tab,
|
||||||
|
uint idx, table_map remaining_tables)
|
||||||
|
{
|
||||||
|
if (TABLE_LIST *emb_sj_nest= new_tab->emb_sj_nest)
|
||||||
{
|
{
|
||||||
join->cur_sj_inner_tables |= emb_sj_nest->sj_inner_tables;
|
join->cur_sj_inner_tables |= emb_sj_nest->sj_inner_tables;
|
||||||
|
|
||||||
/* Remove the sj_nest if all of its SJ-inner tables are in cur_table_map */
|
/* Remove the sj_nest if all of its SJ-inner tables are in cur_table_map */
|
||||||
if (!(remaining_tables &
|
if (!(remaining_tables &
|
||||||
emb_sj_nest->sj_inner_tables & ~new_join_tab->table->map))
|
emb_sj_nest->sj_inner_tables & ~new_tab->table->map))
|
||||||
join->cur_sj_inner_tables &= ~emb_sj_nest->sj_inner_tables;
|
join->cur_sj_inner_tables &= ~emb_sj_nest->sj_inner_tables;
|
||||||
}
|
}
|
||||||
|
#ifndef DBUG_OFF
|
||||||
pos->prefix_cost.convert_from_cost(*current_read_time);
|
join->dbug_verify_sj_inner_tables(idx + 1);
|
||||||
pos->prefix_record_count= *current_record_count;
|
#endif
|
||||||
pos->dups_producing_tables= dups_producing_tables;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -3579,10 +3596,45 @@ bool Duplicate_weedout_picker::check_qep(JOIN *join,
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef DBUG_OFF
|
||||||
|
/*
|
||||||
|
Verify the value of JOIN::cur_sj_inner_tables by recomputing it
|
||||||
|
*/
|
||||||
|
void JOIN::dbug_verify_sj_inner_tables(uint prefix_size) const
|
||||||
|
{
|
||||||
|
table_map cur_map= const_table_map;
|
||||||
|
table_map nests_entered= 0;
|
||||||
|
if (emb_sjm_nest)
|
||||||
|
{
|
||||||
|
DBUG_ASSERT(cur_sj_inner_tables == 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (uint i= const_tables; i < prefix_size; i++)
|
||||||
|
{
|
||||||
|
JOIN_TAB *tab= positions[i].table;
|
||||||
|
cur_map |= tab->table->map;
|
||||||
|
if (TABLE_LIST *sj_nest= tab->emb_sj_nest)
|
||||||
|
{
|
||||||
|
nests_entered |= sj_nest->sj_inner_tables;
|
||||||
|
if (!(sj_nest->sj_inner_tables & ~cur_map))
|
||||||
|
{
|
||||||
|
// all nest tables are in the prefix already
|
||||||
|
nests_entered &= ~sj_nest->sj_inner_tables;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DBUG_ASSERT(nests_entered == cur_sj_inner_tables);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Remove the last join tab from from join->cur_sj_inner_tables bitmap
|
Remove the last join tab from from join->cur_sj_inner_tables bitmap
|
||||||
we assume remaining_tables doesnt contain @tab.
|
|
||||||
|
@note
|
||||||
|
remaining_tables contains @tab.
|
||||||
|
|
||||||
|
@seealso update_sj_state() does the reverse
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void restore_prev_sj_state(const table_map remaining_tables,
|
void restore_prev_sj_state(const table_map remaining_tables,
|
||||||
@@ -3596,15 +3648,30 @@ void restore_prev_sj_state(const table_map remaining_tables,
|
|||||||
tab->join->sjm_lookup_tables &= ~subq_tables;
|
tab->join->sjm_lookup_tables &= ~subq_tables;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((emb_sj_nest= tab->emb_sj_nest))
|
if (!tab->join->emb_sjm_nest && (emb_sj_nest= tab->emb_sj_nest))
|
||||||
{
|
{
|
||||||
|
table_map subq_tables= emb_sj_nest->sj_inner_tables &
|
||||||
|
~tab->join->const_table_map;
|
||||||
/* If we're removing the last SJ-inner table, remove the sj-nest */
|
/* If we're removing the last SJ-inner table, remove the sj-nest */
|
||||||
if ((remaining_tables & emb_sj_nest->sj_inner_tables) ==
|
if ((remaining_tables & subq_tables) == subq_tables)
|
||||||
(emb_sj_nest->sj_inner_tables & ~tab->table->map))
|
|
||||||
{
|
{
|
||||||
|
// All non-const tables of the SJ nest are in the remaining_tables.
|
||||||
|
// we are not in the nest anymore.
|
||||||
tab->join->cur_sj_inner_tables &= ~emb_sj_nest->sj_inner_tables;
|
tab->join->cur_sj_inner_tables &= ~emb_sj_nest->sj_inner_tables;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Semi-join nest has:
|
||||||
|
// - a table being removed (not in the prefix)
|
||||||
|
// - some tables in the prefix.
|
||||||
|
tab->join->cur_sj_inner_tables |= emb_sj_nest->sj_inner_tables;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef DBUG_OFF
|
||||||
|
/* positions[idx] has been removed. Verify the state for [0...idx-1] */
|
||||||
|
tab->join->dbug_verify_sj_inner_tables(idx);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -3831,8 +3898,8 @@ void fix_semijoin_strategies_for_picked_join_order(JOIN *join)
|
|||||||
join->best_positions[first].sj_strategy= SJ_OPT_MATERIALIZE_SCAN;
|
join->best_positions[first].sj_strategy= SJ_OPT_MATERIALIZE_SCAN;
|
||||||
join->best_positions[first].n_sj_tables= sjm->tables;
|
join->best_positions[first].n_sj_tables= sjm->tables;
|
||||||
/*
|
/*
|
||||||
Do what advance_sj_state did: re-run best_access_path for every table
|
Do what optimize_semi_joins did: re-run best_access_path for every
|
||||||
in the [last_inner_table + 1; pos..) range
|
table in the [last_inner_table + 1; pos..) range
|
||||||
*/
|
*/
|
||||||
double prefix_rec_count;
|
double prefix_rec_count;
|
||||||
/* Get the prefix record count */
|
/* Get the prefix record count */
|
||||||
@@ -5086,7 +5153,7 @@ int setup_semijoin_loosescan(JOIN *join)
|
|||||||
|
|
||||||
|
|
||||||
The choice between the strategies is made by the join optimizer (see
|
The choice between the strategies is made by the join optimizer (see
|
||||||
advance_sj_state() and fix_semijoin_strategies_for_picked_join_order()).
|
optimize_semi_joins() and fix_semijoin_strategies_for_picked_join_order()).
|
||||||
This function sets up all fields/structures/etc needed for execution except
|
This function sets up all fields/structures/etc needed for execution except
|
||||||
for setup/initialization of semi-join materialization which is done in
|
for setup/initialization of semi-join materialization which is done in
|
||||||
setup_sj_materialization() (todo: can't we move that to here also?)
|
setup_sj_materialization() (todo: can't we move that to here also?)
|
||||||
|
@@ -314,9 +314,11 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
void advance_sj_state(JOIN *join, table_map remaining_tables, uint idx,
|
void optimize_semi_joins(JOIN *join, table_map remaining_tables, uint idx,
|
||||||
double *current_record_count, double *current_read_time,
|
double *current_record_count,
|
||||||
POSITION *loose_scan_pos);
|
double *current_read_time, POSITION *loose_scan_pos);
|
||||||
|
void update_sj_state(JOIN *join, const JOIN_TAB *new_tab,
|
||||||
|
uint idx, table_map remaining_tables);
|
||||||
void restore_prev_sj_state(const table_map remaining_tables,
|
void restore_prev_sj_state(const table_map remaining_tables,
|
||||||
const JOIN_TAB *tab, uint idx);
|
const JOIN_TAB *tab, uint idx);
|
||||||
|
|
||||||
|
@@ -890,7 +890,7 @@ void partition_info::vers_check_limit(THD *thd)
|
|||||||
#ifndef DBUG_OFF
|
#ifndef DBUG_OFF
|
||||||
const uint32 sub_factor= num_subparts ? num_subparts : 1;
|
const uint32 sub_factor= num_subparts ? num_subparts : 1;
|
||||||
uint32 part_id= vers_info->hist_part->id * sub_factor;
|
uint32 part_id= vers_info->hist_part->id * sub_factor;
|
||||||
const uint32 part_id_end= part_id + sub_factor;
|
const uint32 part_id_end __attribute__((unused)) = part_id + sub_factor;
|
||||||
DBUG_ASSERT(part_id_end <= num_parts * sub_factor);
|
DBUG_ASSERT(part_id_end <= num_parts * sub_factor);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@@ -9444,7 +9444,7 @@ ER_JSON_ESCAPING
|
|||||||
spa "Incorrecta escapatoria en texto JSON en argumento %d a función '%s' en la posicón %d"
|
spa "Incorrecta escapatoria en texto JSON en argumento %d a función '%s' en la posicón %d"
|
||||||
ER_JSON_DEPTH
|
ER_JSON_DEPTH
|
||||||
chi "超过JSON嵌套深度的%d限制 参数%d 函数'%s' 位置%d的"
|
chi "超过JSON嵌套深度的%d限制 参数%d 函数'%s' 位置%d的"
|
||||||
eng "Limit of %d on JSON nested strucures depth is reached in argument %d to function '%s' at position %d"
|
eng "Limit of %d on JSON nested structures depth is reached in argument %d to function '%s' at position %d"
|
||||||
spa "El límite de %d en profundidad de estructuras JSON anidadas se ha alcanzado en argumento %d a función '%s' en la posición %d"
|
spa "El límite de %d en profundidad de estructuras JSON anidadas se ha alcanzado en argumento %d a función '%s' en la posición %d"
|
||||||
ER_JSON_PATH_EOS
|
ER_JSON_PATH_EOS
|
||||||
chi "JSON文本路径错误 参数%d 函数'%s'"
|
chi "JSON文本路径错误 参数%d 函数'%s'"
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
/* Copyright (c) 2000, 2017, Oracle and/or its affiliates.
|
/* Copyright (c) 2000, 2017, Oracle and/or its affiliates.
|
||||||
Copyright (c) 2009, 2021, MariaDB Corporation.
|
Copyright (c) 2009, 2022, MariaDB Corporation
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
@@ -6718,8 +6718,8 @@ static int queue_event(Master_info* mi, const uchar *buf, ulong event_len)
|
|||||||
can be satisfied only with the strict mode that ensures
|
can be satisfied only with the strict mode that ensures
|
||||||
against "genuine" gtid duplicates.
|
against "genuine" gtid duplicates.
|
||||||
*/
|
*/
|
||||||
rpl_gtid *gtid_in_slave_state=
|
IF_DBUG(rpl_gtid *gtid_in_slave_state=
|
||||||
mi->gtid_current_pos.find(mi->last_queued_gtid.domain_id);
|
mi->gtid_current_pos.find(mi->last_queued_gtid.domain_id),);
|
||||||
|
|
||||||
// Slave gtid state must not have updated yet to the last received gtid.
|
// Slave gtid state must not have updated yet to the last received gtid.
|
||||||
DBUG_ASSERT((mi->using_gtid == Master_info::USE_GTID_NO ||
|
DBUG_ASSERT((mi->using_gtid == Master_info::USE_GTID_NO ||
|
||||||
|
@@ -392,6 +392,7 @@ POSITION::POSITION()
|
|||||||
ref_depend_map= dups_producing_tables= 0;
|
ref_depend_map= dups_producing_tables= 0;
|
||||||
inner_tables_handled_with_other_sjs= 0;
|
inner_tables_handled_with_other_sjs= 0;
|
||||||
type= JT_UNKNOWN;
|
type= JT_UNKNOWN;
|
||||||
|
key_dependent= 0;
|
||||||
dups_weedout_picker.set_empty();
|
dups_weedout_picker.set_empty();
|
||||||
firstmatch_picker.set_empty();
|
firstmatch_picker.set_empty();
|
||||||
loosescan_picker.set_empty();
|
loosescan_picker.set_empty();
|
||||||
@@ -6290,7 +6291,11 @@ add_key_field(JOIN *join,
|
|||||||
Field IN ...
|
Field IN ...
|
||||||
*/
|
*/
|
||||||
if (field->flags & PART_KEY_FLAG)
|
if (field->flags & PART_KEY_FLAG)
|
||||||
stat[0].key_dependent|=used_tables;
|
{
|
||||||
|
stat[0].key_dependent|= used_tables;
|
||||||
|
if (field->key_start.bits_set())
|
||||||
|
stat[0].key_start_dependent= 1;
|
||||||
|
}
|
||||||
|
|
||||||
bool is_const=1;
|
bool is_const=1;
|
||||||
for (uint i=0; i<num_values; i++)
|
for (uint i=0; i<num_values; i++)
|
||||||
@@ -7241,6 +7246,7 @@ bool sort_and_filter_keyuse(THD *thd, DYNAMIC_ARRAY *keyuse,
|
|||||||
use= save_pos= dynamic_element(keyuse,0,KEYUSE*);
|
use= save_pos= dynamic_element(keyuse,0,KEYUSE*);
|
||||||
prev= &key_end;
|
prev= &key_end;
|
||||||
found_eq_constant= 0;
|
found_eq_constant= 0;
|
||||||
|
/* Loop over all elements except the last 'key_end' */
|
||||||
for (i=0 ; i < keyuse->elements-1 ; i++,use++)
|
for (i=0 ; i < keyuse->elements-1 ; i++,use++)
|
||||||
{
|
{
|
||||||
if (!use->is_for_hash_join())
|
if (!use->is_for_hash_join())
|
||||||
@@ -7634,7 +7640,7 @@ double cost_for_index_read(const THD *thd, const TABLE *table, uint key,
|
|||||||
Adjust cost from table->quick_costs calculated by
|
Adjust cost from table->quick_costs calculated by
|
||||||
multi_range_read_info_const() to be comparable with cost_for_index_read()
|
multi_range_read_info_const() to be comparable with cost_for_index_read()
|
||||||
|
|
||||||
This functions is needed because best_access_patch doesn't add
|
This functions is needed because best_access_path() doesn't add
|
||||||
TIME_FOR_COMPARE to it's costs until very late.
|
TIME_FOR_COMPARE to it's costs until very late.
|
||||||
Preferably we should fix so that all costs are comparably.
|
Preferably we should fix so that all costs are comparably.
|
||||||
(All compared costs should include TIME_FOR_COMPARE for all found
|
(All compared costs should include TIME_FOR_COMPARE for all found
|
||||||
@@ -7698,6 +7704,13 @@ best_access_path(JOIN *join,
|
|||||||
double best_time= DBL_MAX;
|
double best_time= DBL_MAX;
|
||||||
double records= DBL_MAX;
|
double records= DBL_MAX;
|
||||||
table_map best_ref_depends_map= 0;
|
table_map best_ref_depends_map= 0;
|
||||||
|
/*
|
||||||
|
key_dependent is 0 if all key parts could be used or if there was an
|
||||||
|
EQ_REF table found (which uses all key parts). In other words, we cannot
|
||||||
|
find a better key for the table even if remaining_tables is reduced.
|
||||||
|
Otherwise it's a bitmap of tables that could improve key usage.
|
||||||
|
*/
|
||||||
|
table_map key_dependent= 0;
|
||||||
Range_rowid_filter_cost_info *best_filter= 0;
|
Range_rowid_filter_cost_info *best_filter= 0;
|
||||||
double tmp;
|
double tmp;
|
||||||
ha_rows rec;
|
ha_rows rec;
|
||||||
@@ -7749,6 +7762,8 @@ best_access_path(JOIN *join,
|
|||||||
key_part_map const_part= 0;
|
key_part_map const_part= 0;
|
||||||
/* The or-null keypart in ref-or-null access: */
|
/* The or-null keypart in ref-or-null access: */
|
||||||
key_part_map ref_or_null_part= 0;
|
key_part_map ref_or_null_part= 0;
|
||||||
|
key_part_map all_parts= 0;
|
||||||
|
|
||||||
if (is_hash_join_key_no(key))
|
if (is_hash_join_key_no(key))
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
@@ -7780,7 +7795,7 @@ best_access_path(JOIN *join,
|
|||||||
do /* For each keypart */
|
do /* For each keypart */
|
||||||
{
|
{
|
||||||
uint keypart= keyuse->keypart;
|
uint keypart= keyuse->keypart;
|
||||||
table_map best_part_found_ref= 0;
|
table_map best_part_found_ref= 0, key_parts_dependent= 0;
|
||||||
double best_prev_record_reads= DBL_MAX;
|
double best_prev_record_reads= DBL_MAX;
|
||||||
|
|
||||||
do /* For each way to access the keypart */
|
do /* For each way to access the keypart */
|
||||||
@@ -7789,6 +7804,7 @@ best_access_path(JOIN *join,
|
|||||||
if 1. expression doesn't refer to forward tables
|
if 1. expression doesn't refer to forward tables
|
||||||
2. we won't get two ref-or-null's
|
2. we won't get two ref-or-null's
|
||||||
*/
|
*/
|
||||||
|
all_parts|= keyuse->keypart_map;
|
||||||
if (!(remaining_tables & keyuse->used_tables) &&
|
if (!(remaining_tables & keyuse->used_tables) &&
|
||||||
(!keyuse->validity_ref || *keyuse->validity_ref) &&
|
(!keyuse->validity_ref || *keyuse->validity_ref) &&
|
||||||
s->access_from_tables_is_allowed(keyuse->used_tables,
|
s->access_from_tables_is_allowed(keyuse->used_tables,
|
||||||
@@ -7797,6 +7813,7 @@ best_access_path(JOIN *join,
|
|||||||
KEY_OPTIMIZE_REF_OR_NULL)))
|
KEY_OPTIMIZE_REF_OR_NULL)))
|
||||||
{
|
{
|
||||||
found_part|= keyuse->keypart_map;
|
found_part|= keyuse->keypart_map;
|
||||||
|
key_parts_dependent= 0;
|
||||||
if (!(keyuse->used_tables & ~join->const_table_map))
|
if (!(keyuse->used_tables & ~join->const_table_map))
|
||||||
const_part|= keyuse->keypart_map;
|
const_part|= keyuse->keypart_map;
|
||||||
|
|
||||||
@@ -7819,10 +7836,16 @@ best_access_path(JOIN *join,
|
|||||||
if (keyuse->optimize & KEY_OPTIMIZE_REF_OR_NULL)
|
if (keyuse->optimize & KEY_OPTIMIZE_REF_OR_NULL)
|
||||||
ref_or_null_part |= keyuse->keypart_map;
|
ref_or_null_part |= keyuse->keypart_map;
|
||||||
}
|
}
|
||||||
|
else if (!(found_part & keyuse->keypart_map))
|
||||||
|
key_parts_dependent|= keyuse->used_tables;
|
||||||
|
|
||||||
loose_scan_opt.add_keyuse(remaining_tables, keyuse);
|
loose_scan_opt.add_keyuse(remaining_tables, keyuse);
|
||||||
keyuse++;
|
keyuse++;
|
||||||
} while (keyuse->table == table && keyuse->key == key &&
|
} while (keyuse->table == table && keyuse->key == key &&
|
||||||
keyuse->keypart == keypart);
|
keyuse->keypart == keypart);
|
||||||
|
/* If we found a usable key, remember the dependent tables */
|
||||||
|
if (all_parts & 1)
|
||||||
|
key_dependent|= key_parts_dependent;
|
||||||
found_ref|= best_part_found_ref;
|
found_ref|= best_part_found_ref;
|
||||||
} while (keyuse->table == table && keyuse->key == key);
|
} while (keyuse->table == table && keyuse->key == key);
|
||||||
|
|
||||||
@@ -8209,6 +8232,27 @@ best_access_path(JOIN *join,
|
|||||||
} /* for each key */
|
} /* for each key */
|
||||||
records= best_records;
|
records= best_records;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
No usable keys found. However, there may still be an option to use
|
||||||
|
"Range checked for each record" when all depending tables has
|
||||||
|
been read. s->key_dependent tells us which tables these could be and
|
||||||
|
s->key_start_dependent tells us if a first key part was used.
|
||||||
|
s->key_dependent may include more tables than could be used,
|
||||||
|
but this is ok as not having any usable keys is a rare thing and
|
||||||
|
the performance penalty for extra table bits is that
|
||||||
|
best_extension_by_limited_search() would not be able to prune tables
|
||||||
|
earlier.
|
||||||
|
Example query:
|
||||||
|
SELECT * FROM t1,t2 where t1.key1=t2.key1 OR t2.key2<1
|
||||||
|
*/
|
||||||
|
if (s->key_start_dependent)
|
||||||
|
key_dependent= s->key_dependent;
|
||||||
|
}
|
||||||
|
/* Check that s->key_dependent contains all used_tables found in s->keyuse */
|
||||||
|
key_dependent&= ~PSEUDO_TABLE_BITS;
|
||||||
|
DBUG_ASSERT((key_dependent & s->key_dependent) == key_dependent);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
If there is no key to access the table, but there is an equi-join
|
If there is no key to access the table, but there is an equi-join
|
||||||
@@ -8460,6 +8504,8 @@ best_access_path(JOIN *join,
|
|||||||
pos->use_join_buffer= best_uses_jbuf;
|
pos->use_join_buffer= best_uses_jbuf;
|
||||||
pos->spl_plan= spl_plan;
|
pos->spl_plan= spl_plan;
|
||||||
pos->range_rowid_filter_info= best_filter;
|
pos->range_rowid_filter_info= best_filter;
|
||||||
|
pos->key_dependent= (best_type == JT_EQ_REF ? (table_map) 0 :
|
||||||
|
key_dependent & remaining_tables);
|
||||||
|
|
||||||
loose_scan_opt.save_to_position(s, loose_scan_pos);
|
loose_scan_opt.save_to_position(s, loose_scan_pos);
|
||||||
|
|
||||||
@@ -8662,6 +8708,10 @@ choose_plan(JOIN *join, table_map join_tables)
|
|||||||
{
|
{
|
||||||
choose_initial_table_order(join);
|
choose_initial_table_order(join);
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
|
Note: constant tables are already in the join prefix. We don't
|
||||||
|
put them into the cur_sj_inner_tables, though.
|
||||||
|
*/
|
||||||
join->cur_sj_inner_tables= 0;
|
join->cur_sj_inner_tables= 0;
|
||||||
|
|
||||||
if (straight_join)
|
if (straight_join)
|
||||||
@@ -8941,7 +8991,7 @@ determine_search_depth(JOIN *join)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
static void
|
static void
|
||||||
optimize_straight_join(JOIN *join, table_map join_tables)
|
optimize_straight_join(JOIN *join, table_map remaining_tables)
|
||||||
{
|
{
|
||||||
JOIN_TAB *s;
|
JOIN_TAB *s;
|
||||||
uint idx= join->const_tables;
|
uint idx= join->const_tables;
|
||||||
@@ -8959,30 +9009,32 @@ optimize_straight_join(JOIN *join, table_map join_tables)
|
|||||||
Json_writer_object trace_one_table(thd);
|
Json_writer_object trace_one_table(thd);
|
||||||
if (unlikely(thd->trace_started()))
|
if (unlikely(thd->trace_started()))
|
||||||
{
|
{
|
||||||
trace_plan_prefix(join, idx, join_tables);
|
trace_plan_prefix(join, idx, remaining_tables);
|
||||||
trace_one_table.add_table_name(s);
|
trace_one_table.add_table_name(s);
|
||||||
}
|
}
|
||||||
/* Find the best access method from 's' to the current partial plan */
|
/* Find the best access method from 's' to the current partial plan */
|
||||||
best_access_path(join, s, join_tables, join->positions, idx,
|
best_access_path(join, s, remaining_tables, join->positions, idx,
|
||||||
disable_jbuf, record_count,
|
disable_jbuf, record_count,
|
||||||
position, &loose_scan_pos);
|
position, &loose_scan_pos);
|
||||||
|
|
||||||
/* compute the cost of the new plan extended with 's' */
|
/* Compute the cost of the new plan extended with 's' */
|
||||||
record_count= COST_MULT(record_count, position->records_read);
|
record_count= COST_MULT(record_count, position->records_read);
|
||||||
const double filter_cmp_gain= position->range_rowid_filter_info
|
const double filter_cmp_gain= position->range_rowid_filter_info
|
||||||
? position->range_rowid_filter_info->get_cmp_gain(record_count)
|
? position->range_rowid_filter_info->get_cmp_gain(record_count)
|
||||||
: 0;
|
: 0;
|
||||||
read_time+= COST_ADD(read_time - filter_cmp_gain,
|
read_time= COST_ADD(read_time,
|
||||||
COST_ADD(position->read_time,
|
COST_ADD(position->read_time -
|
||||||
record_count / TIME_FOR_COMPARE));
|
filter_cmp_gain,
|
||||||
advance_sj_state(join, join_tables, idx, &record_count, &read_time,
|
record_count /
|
||||||
&loose_scan_pos);
|
TIME_FOR_COMPARE));
|
||||||
|
optimize_semi_joins(join, remaining_tables, idx, &record_count, &read_time,
|
||||||
|
&loose_scan_pos);
|
||||||
|
|
||||||
join_tables&= ~(s->table->map);
|
remaining_tables&= ~(s->table->map);
|
||||||
double pushdown_cond_selectivity= 1.0;
|
double pushdown_cond_selectivity= 1.0;
|
||||||
if (use_cond_selectivity > 1)
|
if (use_cond_selectivity > 1)
|
||||||
pushdown_cond_selectivity= table_cond_selectivity(join, idx, s,
|
pushdown_cond_selectivity= table_cond_selectivity(join, idx, s,
|
||||||
join_tables);
|
remaining_tables);
|
||||||
position->cond_selectivity= pushdown_cond_selectivity;
|
position->cond_selectivity= pushdown_cond_selectivity;
|
||||||
++idx;
|
++idx;
|
||||||
}
|
}
|
||||||
@@ -9156,6 +9208,12 @@ greedy_search(JOIN *join,
|
|||||||
/* This has been already checked by best_extension_by_limited_search */
|
/* This has been already checked by best_extension_by_limited_search */
|
||||||
DBUG_ASSERT(!is_interleave_error);
|
DBUG_ASSERT(!is_interleave_error);
|
||||||
|
|
||||||
|
/*
|
||||||
|
Also, update the semi-join optimization state. Information about the
|
||||||
|
picked semi-join operation is in best_pos->...picker, but we need to
|
||||||
|
update the global state in the JOIN object, too.
|
||||||
|
*/
|
||||||
|
update_sj_state(join, best_table, idx, remaining_tables);
|
||||||
|
|
||||||
/* find the position of 'best_table' in 'join->best_ref' */
|
/* find the position of 'best_table' in 'join->best_ref' */
|
||||||
best_idx= idx;
|
best_idx= idx;
|
||||||
@@ -9163,8 +9221,13 @@ greedy_search(JOIN *join,
|
|||||||
while (pos && best_table != pos)
|
while (pos && best_table != pos)
|
||||||
pos= join->best_ref[++best_idx];
|
pos= join->best_ref[++best_idx];
|
||||||
DBUG_ASSERT((pos != NULL)); // should always find 'best_table'
|
DBUG_ASSERT((pos != NULL)); // should always find 'best_table'
|
||||||
/* move 'best_table' at the first free position in the array of joins */
|
/*
|
||||||
swap_variables(JOIN_TAB*, join->best_ref[idx], join->best_ref[best_idx]);
|
move 'best_table' at the first free position in the array of joins,
|
||||||
|
keeping the sorted table order intact
|
||||||
|
*/
|
||||||
|
memmove(join->best_ref + idx + 1, join->best_ref + idx,
|
||||||
|
sizeof(JOIN_TAB*) * (best_idx - idx));
|
||||||
|
join->best_ref[idx]= best_table;
|
||||||
|
|
||||||
/* compute the cost of the new plan extended with 'best_table' */
|
/* compute the cost of the new plan extended with 'best_table' */
|
||||||
record_count= COST_MULT(record_count, join->positions[idx].records_read);
|
record_count= COST_MULT(record_count, join->positions[idx].records_read);
|
||||||
@@ -9383,10 +9446,7 @@ double table_multi_eq_cond_selectivity(JOIN *join, uint idx, JOIN_TAB *s,
|
|||||||
double sel= 1.0;
|
double sel= 1.0;
|
||||||
COND_EQUAL *cond_equal= join->cond_equal;
|
COND_EQUAL *cond_equal= join->cond_equal;
|
||||||
|
|
||||||
if (!cond_equal || !cond_equal->current_level.elements)
|
if (!cond_equal || !cond_equal->current_level.elements || !s->keyuse)
|
||||||
return sel;
|
|
||||||
|
|
||||||
if (!s->keyuse)
|
|
||||||
return sel;
|
return sel;
|
||||||
|
|
||||||
Item_equal *item_equal;
|
Item_equal *item_equal;
|
||||||
@@ -9911,7 +9971,7 @@ best_extension_by_limited_search(JOIN *join,
|
|||||||
'join' is a partial plan with lower cost than the best plan so far,
|
'join' is a partial plan with lower cost than the best plan so far,
|
||||||
so continue expanding it further with the tables in 'remaining_tables'.
|
so continue expanding it further with the tables in 'remaining_tables'.
|
||||||
*/
|
*/
|
||||||
JOIN_TAB *s;
|
JOIN_TAB *s, **pos;
|
||||||
double best_record_count= DBL_MAX;
|
double best_record_count= DBL_MAX;
|
||||||
double best_read_time= DBL_MAX;
|
double best_read_time= DBL_MAX;
|
||||||
bool disable_jbuf= join->thd->variables.join_cache_level == 0;
|
bool disable_jbuf= join->thd->variables.join_cache_level == 0;
|
||||||
@@ -9939,11 +9999,13 @@ best_extension_by_limited_search(JOIN *join,
|
|||||||
if (join->emb_sjm_nest)
|
if (join->emb_sjm_nest)
|
||||||
allowed_tables= join->emb_sjm_nest->sj_inner_tables & ~join->const_table_map;
|
allowed_tables= join->emb_sjm_nest->sj_inner_tables & ~join->const_table_map;
|
||||||
|
|
||||||
for (JOIN_TAB **pos= join->best_ref + idx ; (s= *pos) ; pos++)
|
for (pos= join->best_ref + idx ; (s= *pos) ; pos++)
|
||||||
{
|
{
|
||||||
table_map real_table_bit= s->table->map;
|
table_map real_table_bit= s->table->map;
|
||||||
DBUG_ASSERT(remaining_tables & real_table_bit);
|
DBUG_ASSERT(remaining_tables & real_table_bit);
|
||||||
|
|
||||||
|
swap_variables(JOIN_TAB*, join->best_ref[idx], *pos);
|
||||||
|
|
||||||
if ((allowed_tables & real_table_bit) &&
|
if ((allowed_tables & real_table_bit) &&
|
||||||
!(remaining_tables & s->dependent) &&
|
!(remaining_tables & s->dependent) &&
|
||||||
!check_interleaving_with_nj(s))
|
!check_interleaving_with_nj(s))
|
||||||
@@ -9964,24 +10026,24 @@ best_extension_by_limited_search(JOIN *join,
|
|||||||
best_access_path(join, s, remaining_tables, join->positions, idx,
|
best_access_path(join, s, remaining_tables, join->positions, idx,
|
||||||
disable_jbuf, record_count, position, &loose_scan_pos);
|
disable_jbuf, record_count, position, &loose_scan_pos);
|
||||||
|
|
||||||
/* Compute the cost of extending the plan with 's' */
|
/* Compute the cost of the new plan extended with 's' */
|
||||||
current_record_count= COST_MULT(record_count, position->records_read);
|
current_record_count= COST_MULT(record_count, position->records_read);
|
||||||
const double filter_cmp_gain= position->range_rowid_filter_info
|
const double filter_cmp_gain= position->range_rowid_filter_info
|
||||||
? position->range_rowid_filter_info->get_cmp_gain(current_record_count)
|
? position->range_rowid_filter_info->get_cmp_gain(current_record_count)
|
||||||
: 0;
|
: 0;
|
||||||
current_read_time=COST_ADD(read_time,
|
current_read_time= COST_ADD(read_time,
|
||||||
COST_ADD(position->read_time -
|
COST_ADD(position->read_time -
|
||||||
filter_cmp_gain,
|
filter_cmp_gain,
|
||||||
current_record_count /
|
current_record_count /
|
||||||
TIME_FOR_COMPARE));
|
TIME_FOR_COMPARE));
|
||||||
|
|
||||||
if (unlikely(thd->trace_started()))
|
if (unlikely(thd->trace_started()))
|
||||||
{
|
{
|
||||||
trace_one_table.add("rows_for_plan", current_record_count);
|
trace_one_table.add("rows_for_plan", current_record_count);
|
||||||
trace_one_table.add("cost_for_plan", current_read_time);
|
trace_one_table.add("cost_for_plan", current_read_time);
|
||||||
}
|
}
|
||||||
advance_sj_state(join, remaining_tables, idx, ¤t_record_count,
|
optimize_semi_joins(join, remaining_tables, idx, ¤t_record_count,
|
||||||
¤t_read_time, &loose_scan_pos);
|
¤t_read_time, &loose_scan_pos);
|
||||||
|
|
||||||
/* Expand only partial plans with lower cost than the best QEP so far */
|
/* Expand only partial plans with lower cost than the best QEP so far */
|
||||||
if (current_read_time >= join->best_read)
|
if (current_read_time >= join->best_read)
|
||||||
@@ -10008,11 +10070,18 @@ best_extension_by_limited_search(JOIN *join,
|
|||||||
(idx == join->const_tables && // 's' is the first table in the QEP
|
(idx == join->const_tables && // 's' is the first table in the QEP
|
||||||
s->table == join->sort_by_table))
|
s->table == join->sort_by_table))
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
|
Store the current record count and cost as the best
|
||||||
|
possible cost at this level if the following holds:
|
||||||
|
- It's the lowest record number and cost so far
|
||||||
|
- There is no remaing table that could improve index usage
|
||||||
|
or we found an EQ_REF or REF key with less than 2
|
||||||
|
matching records (good enough).
|
||||||
|
*/
|
||||||
if (best_record_count >= current_record_count &&
|
if (best_record_count >= current_record_count &&
|
||||||
best_read_time >= current_read_time &&
|
best_read_time >= current_read_time &&
|
||||||
/* TODO: What is the reasoning behind this condition? */
|
(!(position->key_dependent & allowed_tables) ||
|
||||||
(!(s->key_dependent & allowed_tables & remaining_tables) ||
|
position->records_read < 2.0))
|
||||||
join->positions[idx].records_read < 2.0))
|
|
||||||
{
|
{
|
||||||
best_record_count= current_record_count;
|
best_record_count= current_record_count;
|
||||||
best_read_time= current_read_time;
|
best_read_time= current_read_time;
|
||||||
@@ -10056,7 +10125,6 @@ best_extension_by_limited_search(JOIN *join,
|
|||||||
allowed_tables)
|
allowed_tables)
|
||||||
{
|
{
|
||||||
/* Recursively expand the current partial plan */
|
/* Recursively expand the current partial plan */
|
||||||
swap_variables(JOIN_TAB*, join->best_ref[idx], *pos);
|
|
||||||
Json_writer_array trace_rest(thd, "rest_of_plan");
|
Json_writer_array trace_rest(thd, "rest_of_plan");
|
||||||
best_res=
|
best_res=
|
||||||
best_extension_by_limited_search(join,
|
best_extension_by_limited_search(join,
|
||||||
@@ -10069,8 +10137,7 @@ best_extension_by_limited_search(JOIN *join,
|
|||||||
prune_level,
|
prune_level,
|
||||||
use_cond_selectivity);
|
use_cond_selectivity);
|
||||||
if ((int) best_res < (int) SEARCH_OK)
|
if ((int) best_res < (int) SEARCH_OK)
|
||||||
DBUG_RETURN(best_res); // Abort
|
goto end; // Return best_res
|
||||||
swap_variables(JOIN_TAB*, join->best_ref[idx], *pos);
|
|
||||||
if (best_res == SEARCH_FOUND_EDGE &&
|
if (best_res == SEARCH_FOUND_EDGE &&
|
||||||
check_if_edge_table(join->positions+ idx,
|
check_if_edge_table(join->positions+ idx,
|
||||||
pushdown_cond_selectivity) !=
|
pushdown_cond_selectivity) !=
|
||||||
@@ -10115,11 +10182,27 @@ best_extension_by_limited_search(JOIN *join,
|
|||||||
if (best_res == SEARCH_FOUND_EDGE)
|
if (best_res == SEARCH_FOUND_EDGE)
|
||||||
{
|
{
|
||||||
trace_one_table.add("pruned_by_hanging_leaf", true);
|
trace_one_table.add("pruned_by_hanging_leaf", true);
|
||||||
DBUG_RETURN(best_res);
|
goto end;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
DBUG_RETURN(SEARCH_OK);
|
best_res= SEARCH_OK;
|
||||||
|
|
||||||
|
end:
|
||||||
|
/* Restore original table order */
|
||||||
|
if (!*pos)
|
||||||
|
pos--; // Revert last pos++ in for loop
|
||||||
|
if (pos != join->best_ref + idx)
|
||||||
|
{
|
||||||
|
JOIN_TAB *tmp= join->best_ref[idx];
|
||||||
|
uint elements= (uint) (pos - (join->best_ref + idx));
|
||||||
|
|
||||||
|
memmove((void*) (join->best_ref + idx),
|
||||||
|
(void*) (join->best_ref + idx + 1),
|
||||||
|
elements * sizeof(JOIN_TAB*));
|
||||||
|
*pos= tmp;
|
||||||
|
}
|
||||||
|
DBUG_RETURN(best_res);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -12519,6 +12602,7 @@ bool generate_derived_keys_for_table(KEYUSE *keyuse, uint count, uint keys)
|
|||||||
(uchar *) &first_keyuse))
|
(uchar *) &first_keyuse))
|
||||||
|
|
||||||
{
|
{
|
||||||
|
JOIN_TAB *tab;
|
||||||
first_keyuse= save_first_keyuse;
|
first_keyuse= save_first_keyuse;
|
||||||
if (table->add_tmp_key(table->s->keys, parts,
|
if (table->add_tmp_key(table->s->keys, parts,
|
||||||
get_next_field_for_derived_key,
|
get_next_field_for_derived_key,
|
||||||
@@ -12526,6 +12610,9 @@ bool generate_derived_keys_for_table(KEYUSE *keyuse, uint count, uint keys)
|
|||||||
FALSE))
|
FALSE))
|
||||||
return TRUE;
|
return TRUE;
|
||||||
table->reginfo.join_tab->keys.set_bit(table->s->keys);
|
table->reginfo.join_tab->keys.set_bit(table->s->keys);
|
||||||
|
tab= table->reginfo.join_tab;
|
||||||
|
for (uint i=0; i < parts; i++)
|
||||||
|
tab->key_dependent|= save_first_keyuse[i].used_tables;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@@ -376,6 +376,8 @@ typedef struct st_join_table {
|
|||||||
uint used_null_fields;
|
uint used_null_fields;
|
||||||
uint used_uneven_bit_fields;
|
uint used_uneven_bit_fields;
|
||||||
enum join_type type;
|
enum join_type type;
|
||||||
|
/* If first key part is used for any key in 'key_dependent' */
|
||||||
|
bool key_start_dependent;
|
||||||
bool cached_eq_ref_table,eq_ref_table;
|
bool cached_eq_ref_table,eq_ref_table;
|
||||||
bool shortcut_for_distinct;
|
bool shortcut_for_distinct;
|
||||||
bool sorted;
|
bool sorted;
|
||||||
@@ -958,6 +960,8 @@ public:
|
|||||||
/* If ref-based access is used: bitmap of tables this table depends on */
|
/* If ref-based access is used: bitmap of tables this table depends on */
|
||||||
table_map ref_depend_map;
|
table_map ref_depend_map;
|
||||||
|
|
||||||
|
/* tables that may help best_access_path() to find a better key */
|
||||||
|
table_map key_dependent;
|
||||||
/*
|
/*
|
||||||
Bitmap of semi-join inner tables that are in the join prefix and for
|
Bitmap of semi-join inner tables that are in the join prefix and for
|
||||||
which there's no provision for how to eliminate semi-join duplicates
|
which there's no provision for how to eliminate semi-join duplicates
|
||||||
@@ -1307,9 +1311,15 @@ public:
|
|||||||
Bitmap of inner tables of semi-join nests that have a proper subset of
|
Bitmap of inner tables of semi-join nests that have a proper subset of
|
||||||
their tables in the current join prefix. That is, of those semi-join
|
their tables in the current join prefix. That is, of those semi-join
|
||||||
nests that have their tables both in and outside of the join prefix.
|
nests that have their tables both in and outside of the join prefix.
|
||||||
|
(Note: tables that are constants but have not been pulled out of semi-join
|
||||||
|
nests are not considered part of semi-join nests)
|
||||||
*/
|
*/
|
||||||
table_map cur_sj_inner_tables;
|
table_map cur_sj_inner_tables;
|
||||||
|
|
||||||
|
#ifndef DBUG_OFF
|
||||||
|
void dbug_verify_sj_inner_tables(uint n_positions) const;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* We also maintain a stack of join optimization states in * join->positions[] */
|
/* We also maintain a stack of join optimization states in * join->positions[] */
|
||||||
/******* Join optimization state members end *******/
|
/******* Join optimization state members end *******/
|
||||||
|
|
||||||
|
@@ -2488,15 +2488,6 @@ MEM_ROOT tz_storage;
|
|||||||
char fullname[FN_REFLEN + 1];
|
char fullname[FN_REFLEN + 1];
|
||||||
char *root_name_end;
|
char *root_name_end;
|
||||||
|
|
||||||
/*
|
|
||||||
known file types that exist in the zoneinfo directory that are safe to
|
|
||||||
silently skip
|
|
||||||
*/
|
|
||||||
const char *known_extensions[]= {
|
|
||||||
".tab",
|
|
||||||
NullS
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Recursively scan zoneinfo directory and print all found time zone
|
Recursively scan zoneinfo directory and print all found time zone
|
||||||
@@ -2593,20 +2584,19 @@ scan_tz_dir(char * name_end, uint symlink_recursion_level, uint verbose)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
Some systems (like debian, opensuse etc) have description
|
Some systems (like Debian, openSUSE, etc) have non-timezone files:
|
||||||
files (.tab). We skip these silently if verbose is > 0
|
* iso3166.tab
|
||||||
|
* leap-seconds.list
|
||||||
|
* leapseconds
|
||||||
|
* tzdata.zi
|
||||||
|
* zone.tab
|
||||||
|
* zone1970.tab
|
||||||
|
We skip these silently unless verbose > 0.
|
||||||
*/
|
*/
|
||||||
const char *current_ext= fn_ext(fullname);
|
const char *current_ext= fn_ext(fullname);
|
||||||
my_bool known_ext= 0;
|
my_bool known_ext= strlen(current_ext) ||
|
||||||
|
!strcmp(my_basename(fullname), "leapseconds");
|
||||||
|
|
||||||
for (const char **ext= known_extensions ; *ext ; ext++)
|
|
||||||
{
|
|
||||||
if (!strcmp(*ext, current_ext))
|
|
||||||
{
|
|
||||||
known_ext= 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (verbose > 0 || !known_ext)
|
if (verbose > 0 || !known_ext)
|
||||||
{
|
{
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
|
@@ -128,7 +128,6 @@ SET(INNOBASE_SOURCES
|
|||||||
include/fil0crypt.h
|
include/fil0crypt.h
|
||||||
include/fil0crypt.inl
|
include/fil0crypt.inl
|
||||||
include/fil0fil.h
|
include/fil0fil.h
|
||||||
include/fil0fil.inl
|
|
||||||
include/fil0pagecompress.h
|
include/fil0pagecompress.h
|
||||||
include/fsp0file.h
|
include/fsp0file.h
|
||||||
include/fsp0fsp.h
|
include/fsp0fsp.h
|
||||||
|
@@ -234,7 +234,9 @@ buf_block_t *btr_block_get(const dict_index_t &index,
|
|||||||
{
|
{
|
||||||
if (!!page_is_comp(block->page.frame) != index.table->not_redundant() ||
|
if (!!page_is_comp(block->page.frame) != index.table->not_redundant() ||
|
||||||
btr_page_get_index_id(block->page.frame) != index.id ||
|
btr_page_get_index_id(block->page.frame) != index.id ||
|
||||||
!fil_page_index_page_check(block->page.frame))
|
!fil_page_index_page_check(block->page.frame) ||
|
||||||
|
index.is_spatial() !=
|
||||||
|
(fil_page_get_type(block->page.frame) == FIL_PAGE_RTREE))
|
||||||
{
|
{
|
||||||
*err= DB_PAGE_CORRUPTED;
|
*err= DB_PAGE_CORRUPTED;
|
||||||
block= nullptr;
|
block= nullptr;
|
||||||
@@ -1305,10 +1307,12 @@ static dberr_t btr_page_reorganize_low(page_cur_t *cursor, dict_index_t *index,
|
|||||||
page_get_max_insert_size_after_reorganize(block->page.frame, 1);
|
page_get_max_insert_size_after_reorganize(block->page.frame, 1);
|
||||||
|
|
||||||
if (UNIV_UNLIKELY(data_size1 != data_size2 || max1 != max2))
|
if (UNIV_UNLIKELY(data_size1 != data_size2 || max1 != max2))
|
||||||
ib::fatal() << "Page old data size " << data_size1
|
{
|
||||||
<< " new data size " << data_size2
|
sql_print_error("InnoDB: Page old data size %u new data size %u"
|
||||||
<< ", page old max ins size " << max1
|
", page old max ins size %zu new max ins size %zu",
|
||||||
<< " new max ins size " << max2;
|
data_size1, data_size2, max1, max2);
|
||||||
|
return DB_CORRUPTION;
|
||||||
|
}
|
||||||
|
|
||||||
/* Restore the cursor position. */
|
/* Restore the cursor position. */
|
||||||
if (pos)
|
if (pos)
|
||||||
@@ -2714,11 +2718,9 @@ page_move_rec_list_end(
|
|||||||
|
|
||||||
ut_ad(new_data_size >= old_data_size);
|
ut_ad(new_data_size >= old_data_size);
|
||||||
|
|
||||||
page_delete_rec_list_end(split_rec, block, index,
|
return page_delete_rec_list_end(split_rec, block, index,
|
||||||
new_n_recs - old_n_recs,
|
new_n_recs - old_n_recs,
|
||||||
new_data_size - old_data_size, mtr);
|
new_data_size - old_data_size, mtr);
|
||||||
|
|
||||||
return DB_SUCCESS;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*************************************************************//**
|
/*************************************************************//**
|
||||||
@@ -2978,10 +2980,15 @@ insert_empty:
|
|||||||
|
|
||||||
page_zip_copy_recs(new_block,
|
page_zip_copy_recs(new_block,
|
||||||
page_zip, page, cursor->index, mtr);
|
page_zip, page, cursor->index, mtr);
|
||||||
page_delete_rec_list_end(move_limit - page + new_page,
|
*err = page_delete_rec_list_end(move_limit
|
||||||
new_block, cursor->index,
|
- page + new_page,
|
||||||
ULINT_UNDEFINED,
|
new_block,
|
||||||
ULINT_UNDEFINED, mtr);
|
cursor->index,
|
||||||
|
ULINT_UNDEFINED,
|
||||||
|
ULINT_UNDEFINED, mtr);
|
||||||
|
if (*err != DB_SUCCESS) {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
/* Update the lock table and possible hash index. */
|
/* Update the lock table and possible hash index. */
|
||||||
if (cursor->index->has_locking()) {
|
if (cursor->index->has_locking()) {
|
||||||
@@ -3043,10 +3050,13 @@ insert_empty:
|
|||||||
|
|
||||||
/* Delete the records from the source page. */
|
/* Delete the records from the source page. */
|
||||||
|
|
||||||
page_delete_rec_list_end(move_limit, block,
|
*err = page_delete_rec_list_end(move_limit, block,
|
||||||
cursor->index,
|
cursor->index,
|
||||||
ULINT_UNDEFINED,
|
ULINT_UNDEFINED,
|
||||||
ULINT_UNDEFINED, mtr);
|
ULINT_UNDEFINED, mtr);
|
||||||
|
if (*err != DB_SUCCESS) {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
left_block = block;
|
left_block = block;
|
||||||
@@ -4697,13 +4707,16 @@ btr_validate_level(
|
|||||||
default:
|
default:
|
||||||
err = e;
|
err = e;
|
||||||
}
|
}
|
||||||
ut_a(index->table->space_id == block->page.id().space());
|
ut_ad(index->table->space_id == block->page.id().space());
|
||||||
ut_a(block->page.id().space() == page_get_space_id(page));
|
ut_ad(block->page.id().space() == page_get_space_id(page));
|
||||||
#ifdef UNIV_ZIP_DEBUG
|
#ifdef UNIV_ZIP_DEBUG
|
||||||
page_zip = buf_block_get_page_zip(block);
|
page_zip = buf_block_get_page_zip(block);
|
||||||
ut_a(!page_zip || page_zip_validate(page_zip, page, index));
|
ut_a(!page_zip || page_zip_validate(page_zip, page, index));
|
||||||
#endif /* UNIV_ZIP_DEBUG */
|
#endif /* UNIV_ZIP_DEBUG */
|
||||||
ut_a(!page_is_leaf(page));
|
if (page_is_leaf(page)) {
|
||||||
|
err = DB_CORRUPTION;
|
||||||
|
goto invalid_page;
|
||||||
|
}
|
||||||
|
|
||||||
page_cur_set_before_first(block, &cursor);
|
page_cur_set_before_first(block, &cursor);
|
||||||
page_cur_move_to_next(&cursor);
|
page_cur_move_to_next(&cursor);
|
||||||
@@ -4831,7 +4844,11 @@ func_exit:
|
|||||||
err = DB_CORRUPTION;
|
err = DB_CORRUPTION;
|
||||||
}
|
}
|
||||||
|
|
||||||
rec = page_rec_get_prev(page_get_supremum_rec(page));
|
if (!(rec = page_rec_get_prev(page_get_supremum_rec(page)))) {
|
||||||
|
btr_validate_report1(index, level, block);
|
||||||
|
fputs("InnoDB: broken record links\n", stderr);
|
||||||
|
goto invalid_page;
|
||||||
|
}
|
||||||
right_rec = page_rec_get_next(page_get_infimum_rec(
|
right_rec = page_rec_get_next(page_get_infimum_rec(
|
||||||
right_page));
|
right_page));
|
||||||
offsets = rec_get_offsets(rec, index, offsets,
|
offsets = rec_get_offsets(rec, index, offsets,
|
||||||
@@ -4855,10 +4872,12 @@ func_exit:
|
|||||||
fputs("InnoDB: records in wrong order"
|
fputs("InnoDB: records in wrong order"
|
||||||
" on adjacent pages\n", stderr);
|
" on adjacent pages\n", stderr);
|
||||||
|
|
||||||
fputs("InnoDB: record ", stderr);
|
|
||||||
rec = page_rec_get_prev(page_get_supremum_rec(page));
|
rec = page_rec_get_prev(page_get_supremum_rec(page));
|
||||||
rec_print(stderr, rec, index);
|
if (rec) {
|
||||||
putc('\n', stderr);
|
fputs("InnoDB: record ", stderr);
|
||||||
|
rec_print(stderr, rec, index);
|
||||||
|
putc('\n', stderr);
|
||||||
|
}
|
||||||
fputs("InnoDB: record ", stderr);
|
fputs("InnoDB: record ", stderr);
|
||||||
rec = page_rec_get_next(
|
rec = page_rec_get_next(
|
||||||
page_get_infimum_rec(right_page));
|
page_get_infimum_rec(right_page));
|
||||||
@@ -4903,15 +4922,17 @@ func_exit:
|
|||||||
rightmost_child = page_rec_is_supremum(
|
rightmost_child = page_rec_is_supremum(
|
||||||
page_rec_get_next(node_ptr));
|
page_rec_get_next(node_ptr));
|
||||||
|
|
||||||
btr_cur_position(
|
rec = page_rec_get_prev(page_get_supremum_rec(page));
|
||||||
index,
|
if (rec) {
|
||||||
page_rec_get_prev(page_get_supremum_rec(page)),
|
btr_cur_position(index, rec, block, &node_cur);
|
||||||
block, &node_cur);
|
|
||||||
|
|
||||||
offsets = btr_page_get_father_node_ptr_for_validate(
|
offsets = btr_page_get_father_node_ptr_for_validate(
|
||||||
offsets, heap, &node_cur, &mtr);
|
offsets, heap, &node_cur, &mtr);
|
||||||
|
} else {
|
||||||
|
offsets = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
if (node_ptr != btr_cur_get_rec(&node_cur)
|
if (!offsets || node_ptr != btr_cur_get_rec(&node_cur)
|
||||||
|| btr_node_ptr_get_child_page_no(node_ptr, offsets)
|
|| btr_node_ptr_get_child_page_no(node_ptr, offsets)
|
||||||
!= block->page.id().page_no()) {
|
!= block->page.id().page_no()) {
|
||||||
|
|
||||||
@@ -4923,14 +4944,17 @@ func_exit:
|
|||||||
fputs("InnoDB: node ptr ", stderr);
|
fputs("InnoDB: node ptr ", stderr);
|
||||||
rec_print(stderr, node_ptr, index);
|
rec_print(stderr, node_ptr, index);
|
||||||
|
|
||||||
rec = btr_cur_get_rec(&node_cur);
|
if (offsets) {
|
||||||
fprintf(stderr, "\n"
|
rec = btr_cur_get_rec(&node_cur);
|
||||||
"InnoDB: node ptr child page n:o %u\n",
|
fprintf(stderr, "\n"
|
||||||
btr_node_ptr_get_child_page_no(rec, offsets));
|
"InnoDB: node ptr child page n:o %u\n",
|
||||||
|
btr_node_ptr_get_child_page_no(
|
||||||
|
rec, offsets));
|
||||||
|
fputs("InnoDB: record on page ", stderr);
|
||||||
|
rec_print_new(stderr, rec, offsets);
|
||||||
|
putc('\n', stderr);
|
||||||
|
}
|
||||||
|
|
||||||
fputs("InnoDB: record on page ", stderr);
|
|
||||||
rec_print_new(stderr, rec, offsets);
|
|
||||||
putc('\n', stderr);
|
|
||||||
err = DB_CORRUPTION;
|
err = DB_CORRUPTION;
|
||||||
goto node_ptr_fails;
|
goto node_ptr_fails;
|
||||||
}
|
}
|
||||||
@@ -4961,15 +4985,21 @@ func_exit:
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (left_page_no == FIL_NULL) {
|
if (left_page_no == FIL_NULL) {
|
||||||
ut_a(node_ptr == page_rec_get_next(
|
if (page_has_prev(father_page)
|
||||||
page_get_infimum_rec(father_page)));
|
|| node_ptr != page_rec_get_next(
|
||||||
ut_a(!page_has_prev(father_page));
|
page_get_infimum_rec(father_page))) {
|
||||||
|
err = DB_CORRUPTION;
|
||||||
|
goto node_ptr_fails;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (right_page_no == FIL_NULL) {
|
if (right_page_no == FIL_NULL) {
|
||||||
ut_a(node_ptr == page_rec_get_prev(
|
if (page_has_next(father_page)
|
||||||
page_get_supremum_rec(father_page)));
|
|| node_ptr != page_rec_get_prev(
|
||||||
ut_a(!page_has_next(father_page));
|
page_get_supremum_rec(father_page))) {
|
||||||
|
err = DB_CORRUPTION;
|
||||||
|
goto node_ptr_fails;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
const rec_t* right_node_ptr;
|
const rec_t* right_node_ptr;
|
||||||
|
|
||||||
|
@@ -637,7 +637,7 @@ PageBulk::getSplitRec()
|
|||||||
< total_used_size / 2);
|
< total_used_size / 2);
|
||||||
|
|
||||||
/* Keep at least one record on left page */
|
/* Keep at least one record on left page */
|
||||||
if (page_rec_is_infimum(page_rec_get_prev(rec))) {
|
if (page_rec_is_second(rec, m_page)) {
|
||||||
rec = page_rec_get_next(rec);
|
rec = page_rec_get_next(rec);
|
||||||
ut_ad(page_rec_is_user_rec(rec));
|
ut_ad(page_rec_is_user_rec(rec));
|
||||||
}
|
}
|
||||||
@@ -679,35 +679,40 @@ void
|
|||||||
PageBulk::copyOut(
|
PageBulk::copyOut(
|
||||||
rec_t* split_rec)
|
rec_t* split_rec)
|
||||||
{
|
{
|
||||||
rec_t* rec;
|
|
||||||
rec_t* last_rec;
|
|
||||||
ulint n;
|
|
||||||
|
|
||||||
/* Suppose before copyOut, we have 5 records on the page:
|
/* Suppose before copyOut, we have 5 records on the page:
|
||||||
infimum->r1->r2->r3->r4->r5->supremum, and r3 is the split rec.
|
infimum->r1->r2->r3->r4->r5->supremum, and r3 is the split rec.
|
||||||
|
|
||||||
after copyOut, we have 2 records on the page:
|
after copyOut, we have 2 records on the page:
|
||||||
infimum->r1->r2->supremum. slot ajustment is not done. */
|
infimum->r1->r2->supremum. slot ajustment is not done. */
|
||||||
|
|
||||||
rec = page_rec_get_next(page_get_infimum_rec(m_page));
|
rec_t *rec = page_get_infimum_rec(m_page);
|
||||||
last_rec = page_rec_get_prev(page_get_supremum_rec(m_page));
|
ulint n;
|
||||||
n = 0;
|
|
||||||
|
|
||||||
while (rec != split_rec) {
|
for (n = 0;; n++) {
|
||||||
rec = page_rec_get_next(rec);
|
rec_t *next = page_rec_get_next(rec);
|
||||||
n++;
|
if (next == split_rec) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
rec = next;
|
||||||
}
|
}
|
||||||
|
|
||||||
ut_ad(n > 0);
|
ut_ad(n > 0);
|
||||||
|
|
||||||
|
const rec_t *last_rec = split_rec;
|
||||||
|
for (;;) {
|
||||||
|
const rec_t *next = page_rec_get_next_const(last_rec);
|
||||||
|
if (page_rec_is_supremum(next)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
last_rec = next;
|
||||||
|
}
|
||||||
|
|
||||||
/* Set last record's next in page */
|
/* Set last record's next in page */
|
||||||
rec_offs* offsets = NULL;
|
|
||||||
rec = page_rec_get_prev(split_rec);
|
|
||||||
const ulint n_core = page_rec_is_leaf(split_rec)
|
const ulint n_core = page_rec_is_leaf(split_rec)
|
||||||
? m_index->n_core_fields : 0;
|
? m_index->n_core_fields : 0;
|
||||||
|
|
||||||
offsets = rec_get_offsets(rec, m_index, offsets, n_core,
|
rec_offs* offsets = rec_get_offsets(rec, m_index, nullptr, n_core,
|
||||||
ULINT_UNDEFINED, &m_heap);
|
ULINT_UNDEFINED, &m_heap);
|
||||||
mach_write_to_2(rec - REC_NEXT, m_is_comp
|
mach_write_to_2(rec - REC_NEXT, m_is_comp
|
||||||
? static_cast<uint16_t>
|
? static_cast<uint16_t>
|
||||||
(PAGE_NEW_SUPREMUM - page_offset(rec))
|
(PAGE_NEW_SUPREMUM - page_offset(rec))
|
||||||
|
@@ -71,6 +71,7 @@ Created 10/16/1994 Heikki Tuuri
|
|||||||
#ifdef WITH_WSREP
|
#ifdef WITH_WSREP
|
||||||
#include "mysql/service_wsrep.h"
|
#include "mysql/service_wsrep.h"
|
||||||
#endif /* WITH_WSREP */
|
#endif /* WITH_WSREP */
|
||||||
|
#include "log.h"
|
||||||
|
|
||||||
/** Buffered B-tree operation types, introduced as part of delete buffering. */
|
/** Buffered B-tree operation types, introduced as part of delete buffering. */
|
||||||
enum btr_op_t {
|
enum btr_op_t {
|
||||||
@@ -2131,12 +2132,10 @@ need_opposite_intention:
|
|||||||
if (matched_fields
|
if (matched_fields
|
||||||
>= rec_offs_n_fields(offsets) - 1) {
|
>= rec_offs_n_fields(offsets) - 1) {
|
||||||
detected_same_key_root = true;
|
detected_same_key_root = true;
|
||||||
} else {
|
} else if (const rec_t* last_rec
|
||||||
const rec_t* last_rec;
|
= page_rec_get_prev_const(
|
||||||
|
page_get_supremum_rec(
|
||||||
last_rec = page_rec_get_prev_const(
|
page))) {
|
||||||
page_get_supremum_rec(page));
|
|
||||||
|
|
||||||
matched_fields = 0;
|
matched_fields = 0;
|
||||||
|
|
||||||
offsets2 = rec_get_offsets(
|
offsets2 = rec_get_offsets(
|
||||||
@@ -2150,6 +2149,9 @@ need_opposite_intention:
|
|||||||
>= rec_offs_n_fields(offsets) - 1) {
|
>= rec_offs_n_fields(offsets) - 1) {
|
||||||
detected_same_key_root = true;
|
detected_same_key_root = true;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
err = DB_CORRUPTION;
|
||||||
|
goto func_exit;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2709,7 +2711,10 @@ btr_cur_open_at_index_side(
|
|||||||
if (from_left) {
|
if (from_left) {
|
||||||
page_cur_move_to_next(page_cursor);
|
page_cur_move_to_next(page_cursor);
|
||||||
} else {
|
} else {
|
||||||
page_cur_move_to_prev(page_cursor);
|
if (!page_cur_move_to_prev(page_cursor)) {
|
||||||
|
err = DB_CORRUPTION;
|
||||||
|
goto exit_loop;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (estimate) {
|
if (estimate) {
|
||||||
@@ -2799,7 +2804,7 @@ btr_cur_open_at_index_side(
|
|||||||
}
|
}
|
||||||
|
|
||||||
exit_loop:
|
exit_loop:
|
||||||
if (heap) {
|
if (UNIV_LIKELY_NULL(heap)) {
|
||||||
mem_heap_free(heap);
|
mem_heap_free(heap);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3844,6 +3849,7 @@ static void btr_cur_write_sys(
|
|||||||
trx_write_roll_ptr(static_cast<byte*>(r->data), roll_ptr);
|
trx_write_roll_ptr(static_cast<byte*>(r->data), roll_ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MY_ATTRIBUTE((warn_unused_result))
|
||||||
/** Update DB_TRX_ID, DB_ROLL_PTR in a clustered index record.
|
/** Update DB_TRX_ID, DB_ROLL_PTR in a clustered index record.
|
||||||
@param[in,out] block clustered index leaf page
|
@param[in,out] block clustered index leaf page
|
||||||
@param[in,out] rec clustered index record
|
@param[in,out] rec clustered index record
|
||||||
@@ -3851,11 +3857,12 @@ static void btr_cur_write_sys(
|
|||||||
@param[in] offsets rec_get_offsets(rec, index)
|
@param[in] offsets rec_get_offsets(rec, index)
|
||||||
@param[in] trx transaction
|
@param[in] trx transaction
|
||||||
@param[in] roll_ptr DB_ROLL_PTR value
|
@param[in] roll_ptr DB_ROLL_PTR value
|
||||||
@param[in,out] mtr mini-transaction */
|
@param[in,out] mtr mini-transaction
|
||||||
static void btr_cur_upd_rec_sys(buf_block_t *block, rec_t *rec,
|
@return error code */
|
||||||
dict_index_t *index, const rec_offs *offsets,
|
static dberr_t btr_cur_upd_rec_sys(buf_block_t *block, rec_t *rec,
|
||||||
const trx_t *trx, roll_ptr_t roll_ptr,
|
dict_index_t *index, const rec_offs *offsets,
|
||||||
mtr_t *mtr)
|
const trx_t *trx, roll_ptr_t roll_ptr,
|
||||||
|
mtr_t *mtr)
|
||||||
{
|
{
|
||||||
ut_ad(index->is_primary());
|
ut_ad(index->is_primary());
|
||||||
ut_ad(rec_offs_validate(rec, index, offsets));
|
ut_ad(rec_offs_validate(rec, index, offsets));
|
||||||
@@ -3864,7 +3871,7 @@ static void btr_cur_upd_rec_sys(buf_block_t *block, rec_t *rec,
|
|||||||
{
|
{
|
||||||
page_zip_write_trx_id_and_roll_ptr(block, rec, offsets, index->db_trx_id(),
|
page_zip_write_trx_id_and_roll_ptr(block, rec, offsets, index->db_trx_id(),
|
||||||
trx->id, roll_ptr, mtr);
|
trx->id, roll_ptr, mtr);
|
||||||
return;
|
return DB_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
ulint offset= index->trx_id_offset;
|
ulint offset= index->trx_id_offset;
|
||||||
@@ -3894,8 +3901,8 @@ static void btr_cur_upd_rec_sys(buf_block_t *block, rec_t *rec,
|
|||||||
if (UNIV_LIKELY(index->trx_id_offset))
|
if (UNIV_LIKELY(index->trx_id_offset))
|
||||||
{
|
{
|
||||||
const rec_t *prev= page_rec_get_prev_const(rec);
|
const rec_t *prev= page_rec_get_prev_const(rec);
|
||||||
if (UNIV_UNLIKELY(prev == rec))
|
if (UNIV_UNLIKELY(!prev || prev == rec))
|
||||||
ut_ad(0);
|
return DB_CORRUPTION;
|
||||||
else if (page_rec_is_infimum(prev));
|
else if (page_rec_is_infimum(prev));
|
||||||
else
|
else
|
||||||
for (src= prev + offset; d < DATA_TRX_ID_LEN + DATA_ROLL_PTR_LEN; d++)
|
for (src= prev + offset; d < DATA_TRX_ID_LEN + DATA_ROLL_PTR_LEN; d++)
|
||||||
@@ -3933,6 +3940,8 @@ static void btr_cur_upd_rec_sys(buf_block_t *block, rec_t *rec,
|
|||||||
|
|
||||||
if (UNIV_LIKELY(len)) /* extra safety, to avoid corrupting the log */
|
if (UNIV_LIKELY(len)) /* extra safety, to avoid corrupting the log */
|
||||||
mtr->memcpy<mtr_t::MAYBE_NOP>(*block, dest, sys + d, len);
|
mtr->memcpy<mtr_t::MAYBE_NOP>(*block, dest, sys + d, len);
|
||||||
|
|
||||||
|
return DB_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*************************************************************//**
|
/*************************************************************//**
|
||||||
@@ -4238,8 +4247,11 @@ btr_cur_update_in_place(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!(flags & BTR_KEEP_SYS_FLAG)) {
|
if (!(flags & BTR_KEEP_SYS_FLAG)) {
|
||||||
btr_cur_upd_rec_sys(block, rec, index, offsets,
|
err = btr_cur_upd_rec_sys(block, rec, index, offsets,
|
||||||
thr_get_trx(thr), roll_ptr, mtr);
|
thr_get_trx(thr), roll_ptr, mtr);
|
||||||
|
if (UNIV_UNLIKELY(err != DB_SUCCESS)) {
|
||||||
|
goto func_exit;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
was_delete_marked = rec_get_deleted_flag(
|
was_delete_marked = rec_get_deleted_flag(
|
||||||
@@ -4693,7 +4705,9 @@ any_extern:
|
|||||||
|
|
||||||
page_cur_delete_rec(page_cursor, index, *offsets, mtr);
|
page_cur_delete_rec(page_cursor, index, *offsets, mtr);
|
||||||
|
|
||||||
page_cur_move_to_prev(page_cursor);
|
if (!page_cur_move_to_prev(page_cursor)) {
|
||||||
|
return DB_CORRUPTION;
|
||||||
|
}
|
||||||
|
|
||||||
if (!(flags & BTR_KEEP_SYS_FLAG)) {
|
if (!(flags & BTR_KEEP_SYS_FLAG)) {
|
||||||
btr_cur_write_sys(new_entry, index, trx_id, roll_ptr);
|
btr_cur_write_sys(new_entry, index, trx_id, roll_ptr);
|
||||||
@@ -5055,7 +5069,10 @@ btr_cur_pessimistic_update(
|
|||||||
|
|
||||||
page_cur_delete_rec(page_cursor, index, *offsets, mtr);
|
page_cur_delete_rec(page_cursor, index, *offsets, mtr);
|
||||||
|
|
||||||
page_cur_move_to_prev(page_cursor);
|
if (!page_cur_move_to_prev(page_cursor)) {
|
||||||
|
err = DB_CORRUPTION;
|
||||||
|
goto return_after_reservations;
|
||||||
|
}
|
||||||
|
|
||||||
rec = btr_cur_insert_if_possible(cursor, new_entry,
|
rec = btr_cur_insert_if_possible(cursor, new_entry,
|
||||||
offsets, offsets_heap, n_ext, mtr);
|
offsets, offsets_heap, n_ext, mtr);
|
||||||
@@ -5353,8 +5370,8 @@ btr_cur_del_mark_set_clust_rec(
|
|||||||
<< ib::hex(trx->id) << ": "
|
<< ib::hex(trx->id) << ": "
|
||||||
<< rec_printer(rec, offsets).str());
|
<< rec_printer(rec, offsets).str());
|
||||||
|
|
||||||
btr_cur_upd_rec_sys(block, rec, index, offsets, trx, roll_ptr, mtr);
|
return btr_cur_upd_rec_sys(block, rec, index, offsets, trx, roll_ptr,
|
||||||
return(err);
|
mtr);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*==================== B-TREE RECORD REMOVE =========================*/
|
/*==================== B-TREE RECORD REMOVE =========================*/
|
||||||
@@ -7195,29 +7212,29 @@ func_exit:
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** Check the FIL_PAGE_TYPE on an uncompressed BLOB page.
|
/** Check the FIL_PAGE_TYPE on an uncompressed BLOB page.
|
||||||
@param[in] block uncompressed BLOB page
|
@param block uncompressed BLOB page
|
||||||
@param[in] read true=read, false=purge */
|
@param op operation
|
||||||
static void btr_check_blob_fil_page_type(const buf_block_t& block, bool read)
|
@return whether the type is invalid */
|
||||||
|
static bool btr_check_blob_fil_page_type(const buf_block_t& block,
|
||||||
|
const char *op)
|
||||||
{
|
{
|
||||||
uint16_t type= fil_page_get_type(block.page.frame);
|
uint16_t type= fil_page_get_type(block.page.frame);
|
||||||
|
|
||||||
if (UNIV_LIKELY(type == FIL_PAGE_TYPE_BLOB))
|
if (UNIV_LIKELY(type == FIL_PAGE_TYPE_BLOB));
|
||||||
return;
|
else if (fil_space_t *space= fil_space_t::get(block.page.id().space()))
|
||||||
/* FIXME: take the tablespace as a parameter */
|
|
||||||
if (fil_space_t *space= fil_space_t::get(block.page.id().space()))
|
|
||||||
{
|
{
|
||||||
/* Old versions of InnoDB did not initialize FIL_PAGE_TYPE on BLOB
|
/* Old versions of InnoDB did not initialize FIL_PAGE_TYPE on BLOB
|
||||||
pages. Do not print anything about the type mismatch when reading
|
pages. Do not print anything about the type mismatch when reading
|
||||||
a BLOB page that may be from old versions. */
|
a BLOB page that may be from old versions. */
|
||||||
if (space->full_crc32() || DICT_TF_HAS_ATOMIC_BLOBS(space->flags))
|
bool fail= space->full_crc32() || DICT_TF_HAS_ATOMIC_BLOBS(space->flags);
|
||||||
{
|
if (fail)
|
||||||
ib::fatal() << "FIL_PAGE_TYPE=" << type
|
sql_print_error("InnoDB: FIL_PAGE_TYPE=%u on BLOB %s file %s page %u",
|
||||||
<< (read ? " on BLOB read file " : " on BLOB purge file ")
|
type, op, space->chain.start->name,
|
||||||
<< space->chain.start->name
|
block.page.id().page_no());
|
||||||
<< " page " << block.page.id().page_no();
|
|
||||||
}
|
|
||||||
space->release();
|
space->release();
|
||||||
|
return fail;
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*******************************************************************//**
|
/*******************************************************************//**
|
||||||
@@ -7364,7 +7381,7 @@ skip_free:
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ut_ad(!block->page.zip.data);
|
ut_ad(!block->page.zip.data);
|
||||||
btr_check_blob_fil_page_type(*ext_block, false);
|
btr_check_blob_fil_page_type(*ext_block, "purge");
|
||||||
|
|
||||||
const uint32_t next_page_no = mach_read_from_4(
|
const uint32_t next_page_no = mach_read_from_4(
|
||||||
page + FIL_PAGE_DATA
|
page + FIL_PAGE_DATA
|
||||||
@@ -7498,14 +7515,12 @@ btr_copy_blob_prefix(
|
|||||||
mtr_start(&mtr);
|
mtr_start(&mtr);
|
||||||
|
|
||||||
block = buf_page_get(id, 0, RW_S_LATCH, &mtr);
|
block = buf_page_get(id, 0, RW_S_LATCH, &mtr);
|
||||||
if (!block) {
|
if (!block || btr_check_blob_fil_page_type(*block, "read")) {
|
||||||
mtr.commit();
|
mtr.commit();
|
||||||
return copied_len;
|
return copied_len;
|
||||||
}
|
}
|
||||||
page = buf_block_get_frame(block);
|
page = buf_block_get_frame(block);
|
||||||
|
|
||||||
btr_check_blob_fil_page_type(*block, true);
|
|
||||||
|
|
||||||
blob_header = page + offset;
|
blob_header = page + offset;
|
||||||
part_len = btr_blob_get_part_len(blob_header);
|
part_len = btr_blob_get_part_len(blob_header);
|
||||||
copy_len = ut_min(part_len, len - copied_len);
|
copy_len = ut_min(part_len, len - copied_len);
|
||||||
|
@@ -707,9 +707,11 @@ processed:
|
|||||||
page_t* last_page = buf_block_get_frame(last_block);
|
page_t* last_page = buf_block_get_frame(last_block);
|
||||||
rec_t* rec = page_rec_get_prev(
|
rec_t* rec = page_rec_get_prev(
|
||||||
page_get_supremum_rec(last_page));
|
page_get_supremum_rec(last_page));
|
||||||
ut_a(page_rec_is_user_rec(rec));
|
if (rec && page_rec_is_user_rec(rec)) {
|
||||||
page_cur_position(rec, last_block,
|
page_cur_position(rec, last_block,
|
||||||
btr_pcur_get_page_cur(item->pcur));
|
btr_pcur_get_page_cur(
|
||||||
|
item->pcur));
|
||||||
|
}
|
||||||
btr_pcur_store_position(item->pcur, &mtr);
|
btr_pcur_store_position(item->pcur, &mtr);
|
||||||
mtr_commit(&mtr);
|
mtr_commit(&mtr);
|
||||||
/* Update the last_processed time of this index. */
|
/* Update the last_processed time of this index. */
|
||||||
|
@@ -148,6 +148,11 @@ before_first:
|
|||||||
|
|
||||||
if (page_rec_is_supremum_low(offs)) {
|
if (page_rec_is_supremum_low(offs)) {
|
||||||
rec = page_rec_get_prev(rec);
|
rec = page_rec_get_prev(rec);
|
||||||
|
if (UNIV_UNLIKELY(!rec || page_rec_is_infimum(rec))) {
|
||||||
|
ut_ad("corrupted index" == 0);
|
||||||
|
cursor->rel_pos = BTR_PCUR_AFTER_LAST_IN_TREE;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
ut_ad(!page_rec_is_infimum(rec));
|
ut_ad(!page_rec_is_infimum(rec));
|
||||||
if (UNIV_UNLIKELY(rec_is_metadata(rec, *index))) {
|
if (UNIV_UNLIKELY(rec_is_metadata(rec, *index))) {
|
||||||
@@ -486,7 +491,17 @@ btr_pcur_move_to_next_page(
|
|||||||
const page_t* page = btr_pcur_get_page(cursor);
|
const page_t* page = btr_pcur_get_page(cursor);
|
||||||
const uint32_t next_page_no = btr_page_get_next(page);
|
const uint32_t next_page_no = btr_page_get_next(page);
|
||||||
|
|
||||||
ut_ad(next_page_no != FIL_NULL);
|
switch (next_page_no) {
|
||||||
|
case 0:
|
||||||
|
case 1:
|
||||||
|
case FIL_NULL:
|
||||||
|
return DB_CORRUPTION;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (UNIV_UNLIKELY(next_page_no == btr_pcur_get_block(cursor)
|
||||||
|
->page.id().page_no())) {
|
||||||
|
return DB_CORRUPTION;
|
||||||
|
}
|
||||||
|
|
||||||
ulint mode = cursor->latch_mode;
|
ulint mode = cursor->latch_mode;
|
||||||
switch (mode) {
|
switch (mode) {
|
||||||
@@ -599,13 +614,9 @@ btr_pcur_move_to_prev(
|
|||||||
cursor->old_stored = false;
|
cursor->old_stored = false;
|
||||||
|
|
||||||
if (btr_pcur_is_before_first_on_page(cursor)) {
|
if (btr_pcur_is_before_first_on_page(cursor)) {
|
||||||
if (btr_pcur_is_before_first_in_tree(cursor)
|
return (!btr_pcur_is_before_first_in_tree(cursor)
|
||||||
|| btr_pcur_move_backward_from_page(cursor, mtr)) {
|
&& !btr_pcur_move_backward_from_page(cursor, mtr));
|
||||||
return false;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
btr_pcur_move_to_prev_on_page(cursor);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return btr_pcur_move_to_prev_on_page(cursor) != nullptr;
|
||||||
}
|
}
|
||||||
|
@@ -781,7 +781,7 @@ btr_search_check_guess(
|
|||||||
mem_heap_t* heap = NULL;
|
mem_heap_t* heap = NULL;
|
||||||
rec_offs offsets_[REC_OFFS_NORMAL_SIZE];
|
rec_offs offsets_[REC_OFFS_NORMAL_SIZE];
|
||||||
rec_offs* offsets = offsets_;
|
rec_offs* offsets = offsets_;
|
||||||
ibool success = FALSE;
|
bool success = false;
|
||||||
rec_offs_init(offsets_);
|
rec_offs_init(offsets_);
|
||||||
|
|
||||||
n_unique = dict_index_get_n_unique_in_tree(cursor->index);
|
n_unique = dict_index_get_n_unique_in_tree(cursor->index);
|
||||||
@@ -806,7 +806,7 @@ btr_search_check_guess(
|
|||||||
cursor->up_match = match;
|
cursor->up_match = match;
|
||||||
|
|
||||||
if (match >= n_unique) {
|
if (match >= n_unique) {
|
||||||
success = TRUE;
|
success = true;
|
||||||
goto exit_func;
|
goto exit_func;
|
||||||
}
|
}
|
||||||
} else if (mode == PAGE_CUR_LE) {
|
} else if (mode == PAGE_CUR_LE) {
|
||||||
@@ -835,10 +835,13 @@ btr_search_check_guess(
|
|||||||
match = 0;
|
match = 0;
|
||||||
|
|
||||||
if ((mode == PAGE_CUR_G) || (mode == PAGE_CUR_GE)) {
|
if ((mode == PAGE_CUR_G) || (mode == PAGE_CUR_GE)) {
|
||||||
ut_ad(!page_rec_is_infimum(rec));
|
|
||||||
|
|
||||||
const rec_t* prev_rec = page_rec_get_prev(rec);
|
const rec_t* prev_rec = page_rec_get_prev(rec);
|
||||||
|
|
||||||
|
if (UNIV_UNLIKELY(!prev_rec)) {
|
||||||
|
ut_ad("corrupted index" == 0);
|
||||||
|
goto exit_func;
|
||||||
|
}
|
||||||
|
|
||||||
if (page_rec_is_infimum(prev_rec)) {
|
if (page_rec_is_infimum(prev_rec)) {
|
||||||
success = !page_has_prev(page_align(prev_rec));
|
success = !page_has_prev(page_align(prev_rec));
|
||||||
goto exit_func;
|
goto exit_func;
|
||||||
|
@@ -403,28 +403,22 @@ static bool buf_page_decrypt_after_read(buf_page_t *bpage,
|
|||||||
return (true);
|
return (true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (node.space->purpose == FIL_TYPE_TEMPORARY
|
buf_tmp_buffer_t* slot;
|
||||||
|
|
||||||
|
if (id.space() == SRV_TMP_SPACE_ID
|
||||||
&& innodb_encrypt_temporary_tables) {
|
&& innodb_encrypt_temporary_tables) {
|
||||||
buf_tmp_buffer_t* slot = buf_pool.io_buf_reserve();
|
slot = buf_pool.io_buf_reserve();
|
||||||
ut_a(slot);
|
ut_a(slot);
|
||||||
slot->allocate();
|
slot->allocate();
|
||||||
|
bool ok = buf_tmp_page_decrypt(slot->crypt_buf, dst_frame);
|
||||||
if (!buf_tmp_page_decrypt(slot->crypt_buf, dst_frame)) {
|
|
||||||
slot->release();
|
|
||||||
ib::error() << "Encrypted page " << id
|
|
||||||
<< " in file " << node.name;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
slot->release();
|
slot->release();
|
||||||
return true;
|
return ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Page is encrypted if encryption information is found from
|
/* Page is encrypted if encryption information is found from
|
||||||
tablespace and page contains used key_version. This is true
|
tablespace and page contains used key_version. This is true
|
||||||
also for pages first compressed and then encrypted. */
|
also for pages first compressed and then encrypted. */
|
||||||
|
|
||||||
buf_tmp_buffer_t* slot;
|
|
||||||
uint key_version = buf_page_get_key_version(dst_frame, flags);
|
uint key_version = buf_page_get_key_version(dst_frame, flags);
|
||||||
|
|
||||||
if (page_compressed && !key_version) {
|
if (page_compressed && !key_version) {
|
||||||
@@ -441,13 +435,9 @@ decompress:
|
|||||||
slot->allocate();
|
slot->allocate();
|
||||||
|
|
||||||
decompress_with_slot:
|
decompress_with_slot:
|
||||||
ut_d(fil_page_type_validate(node.space, dst_frame));
|
|
||||||
|
|
||||||
ulint write_size = fil_page_decompress(
|
ulint write_size = fil_page_decompress(
|
||||||
slot->crypt_buf, dst_frame, flags);
|
slot->crypt_buf, dst_frame, flags);
|
||||||
slot->release();
|
slot->release();
|
||||||
ut_ad(!write_size
|
|
||||||
|| fil_page_type_validate(node.space, dst_frame));
|
|
||||||
ut_ad(node.space->referenced());
|
ut_ad(node.space->referenced());
|
||||||
return write_size != 0;
|
return write_size != 0;
|
||||||
}
|
}
|
||||||
@@ -467,7 +457,6 @@ decrypt_failed:
|
|||||||
slot = buf_pool.io_buf_reserve();
|
slot = buf_pool.io_buf_reserve();
|
||||||
ut_a(slot);
|
ut_a(slot);
|
||||||
slot->allocate();
|
slot->allocate();
|
||||||
ut_d(fil_page_type_validate(node.space, dst_frame));
|
|
||||||
|
|
||||||
/* decrypt using crypt_buf to dst_frame */
|
/* decrypt using crypt_buf to dst_frame */
|
||||||
if (!fil_space_decrypt(node.space, slot->crypt_buf, dst_frame)) {
|
if (!fil_space_decrypt(node.space, slot->crypt_buf, dst_frame)) {
|
||||||
@@ -475,8 +464,6 @@ decrypt_failed:
|
|||||||
goto decrypt_failed;
|
goto decrypt_failed;
|
||||||
}
|
}
|
||||||
|
|
||||||
ut_d(fil_page_type_validate(node.space, dst_frame));
|
|
||||||
|
|
||||||
if ((fil_space_t::full_crc32(flags) && page_compressed)
|
if ((fil_space_t::full_crc32(flags) && page_compressed)
|
||||||
|| fil_page_get_type(dst_frame)
|
|| fil_page_get_type(dst_frame)
|
||||||
== FIL_PAGE_PAGE_COMPRESSED_ENCRYPTED) {
|
== FIL_PAGE_PAGE_COMPRESSED_ENCRYPTED) {
|
||||||
@@ -2597,7 +2584,8 @@ loop:
|
|||||||
checksum cannot be decypted. */
|
checksum cannot be decypted. */
|
||||||
|
|
||||||
if (dberr_t local_err = buf_read_page(page_id, zip_size)) {
|
if (dberr_t local_err = buf_read_page(page_id, zip_size)) {
|
||||||
if (mode != BUF_GET_POSSIBLY_FREED
|
if (local_err != DB_CORRUPTION
|
||||||
|
&& mode != BUF_GET_POSSIBLY_FREED
|
||||||
&& retries++ < BUF_PAGE_READ_MAX_RETRIES) {
|
&& retries++ < BUF_PAGE_READ_MAX_RETRIES) {
|
||||||
DBUG_EXECUTE_IF("intermittent_read_failure",
|
DBUG_EXECUTE_IF("intermittent_read_failure",
|
||||||
retries = BUF_PAGE_READ_MAX_RETRIES;);
|
retries = BUF_PAGE_READ_MAX_RETRIES;);
|
||||||
|
@@ -621,7 +621,6 @@ static byte *buf_page_encrypt(fil_space_t* space, buf_page_t* bpage, byte* s,
|
|||||||
ut_ad(space->id == bpage->id().space());
|
ut_ad(space->id == bpage->id().space());
|
||||||
ut_ad(!*slot);
|
ut_ad(!*slot);
|
||||||
|
|
||||||
ut_d(fil_page_type_validate(space, s));
|
|
||||||
const uint32_t page_no= bpage->id().page_no();
|
const uint32_t page_no= bpage->id().page_no();
|
||||||
|
|
||||||
switch (page_no) {
|
switch (page_no) {
|
||||||
@@ -718,7 +717,6 @@ not_compressed:
|
|||||||
|
|
||||||
/* Workaround for MDEV-15527. */
|
/* Workaround for MDEV-15527. */
|
||||||
memset(tmp + len, 0 , srv_page_size - len);
|
memset(tmp + len, 0 , srv_page_size - len);
|
||||||
ut_d(fil_page_type_validate(space, tmp));
|
|
||||||
|
|
||||||
if (encrypted)
|
if (encrypted)
|
||||||
tmp= fil_space_encrypt(space, page_no, tmp, d);
|
tmp= fil_space_encrypt(space, page_no, tmp, d);
|
||||||
@@ -733,7 +731,6 @@ not_compressed:
|
|||||||
d= tmp;
|
d= tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
ut_d(fil_page_type_validate(space, d));
|
|
||||||
(*slot)->out_buf= d;
|
(*slot)->out_buf= d;
|
||||||
return d;
|
return d;
|
||||||
}
|
}
|
||||||
|
@@ -822,7 +822,8 @@ err_exit:
|
|||||||
high bit set in n_cols, and flags would be zero.
|
high bit set in n_cols, and flags would be zero.
|
||||||
MySQL 4.1 was the first version to support innodb_file_per_table,
|
MySQL 4.1 was the first version to support innodb_file_per_table,
|
||||||
that is, *space_id != 0. */
|
that is, *space_id != 0. */
|
||||||
if (not_redundant || *space_id != 0 || *n_cols & DICT_N_COLS_COMPACT) {
|
if (not_redundant || *space_id != 0 || *n_cols & DICT_N_COLS_COMPACT
|
||||||
|
|| fil_system.sys_space->full_crc32()) {
|
||||||
|
|
||||||
/* Get flags2 from SYS_TABLES.MIX_LEN */
|
/* Get flags2 from SYS_TABLES.MIX_LEN */
|
||||||
field = rec_get_nth_field_old(
|
field = rec_get_nth_field_old(
|
||||||
@@ -2651,7 +2652,6 @@ static dberr_t dict_load_foreign_cols(dict_foreign_t *foreign, trx_id_t trx_id)
|
|||||||
goto func_exit;
|
goto func_exit;
|
||||||
}
|
}
|
||||||
for (ulint i = 0; i < foreign->n_fields; i++) {
|
for (ulint i = 0; i < foreign->n_fields; i++) {
|
||||||
retry:
|
|
||||||
ut_a(btr_pcur_is_on_user_rec(&pcur));
|
ut_a(btr_pcur_is_on_user_rec(&pcur));
|
||||||
|
|
||||||
const rec_t* rec = btr_pcur_get_rec(&pcur);
|
const rec_t* rec = btr_pcur_get_rec(&pcur);
|
||||||
@@ -2684,9 +2684,7 @@ retry:
|
|||||||
|
|
||||||
if (rec_get_deleted_flag(rec, 0)) {
|
if (rec_get_deleted_flag(rec, 0)) {
|
||||||
ut_ad(id);
|
ut_ad(id);
|
||||||
next:
|
goto next;
|
||||||
btr_pcur_move_to_next_user_rec(&pcur, &mtr);
|
|
||||||
goto retry;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
field = rec_get_nth_field_old(
|
field = rec_get_nth_field_old(
|
||||||
@@ -2712,7 +2710,7 @@ next:
|
|||||||
rec, DICT_FLD__SYS_FOREIGN_COLS__REF_COL_NAME,
|
rec, DICT_FLD__SYS_FOREIGN_COLS__REF_COL_NAME,
|
||||||
&ref_col_name_len);
|
&ref_col_name_len);
|
||||||
|
|
||||||
ib::fatal sout;
|
ib::error sout;
|
||||||
|
|
||||||
sout << "Unable to load column names for foreign"
|
sout << "Unable to load column names for foreign"
|
||||||
" key '" << foreign->id
|
" key '" << foreign->id
|
||||||
@@ -2727,6 +2725,9 @@ next:
|
|||||||
sout << "', REF_COL_NAME='";
|
sout << "', REF_COL_NAME='";
|
||||||
sout.write(ref_col_name, ref_col_name_len);
|
sout.write(ref_col_name, ref_col_name_len);
|
||||||
sout << "')";
|
sout << "')";
|
||||||
|
|
||||||
|
err = DB_CORRUPTION;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
field = rec_get_nth_field_old(
|
field = rec_get_nth_field_old(
|
||||||
@@ -2744,6 +2745,7 @@ next:
|
|||||||
foreign->referenced_col_names[i] = mem_heap_strdupl(
|
foreign->referenced_col_names[i] = mem_heap_strdupl(
|
||||||
foreign->heap, (char*) field, len);
|
foreign->heap, (char*) field, len);
|
||||||
|
|
||||||
|
next:
|
||||||
btr_pcur_move_to_next_user_rec(&pcur, &mtr);
|
btr_pcur_move_to_next_user_rec(&pcur, &mtr);
|
||||||
}
|
}
|
||||||
func_exit:
|
func_exit:
|
||||||
|
@@ -640,10 +640,7 @@ static dberr_t fil_space_decrypt_full_crc32(
|
|||||||
lsn_t lsn = mach_read_from_8(src_frame + FIL_PAGE_LSN);
|
lsn_t lsn = mach_read_from_8(src_frame + FIL_PAGE_LSN);
|
||||||
uint offset = mach_read_from_4(src_frame + FIL_PAGE_OFFSET);
|
uint offset = mach_read_from_4(src_frame + FIL_PAGE_OFFSET);
|
||||||
|
|
||||||
ut_a(key_version != ENCRYPTION_KEY_NOT_ENCRYPTED);
|
ut_ad(key_version != ENCRYPTION_KEY_NOT_ENCRYPTED);
|
||||||
|
|
||||||
ut_ad(crypt_data);
|
|
||||||
ut_ad(crypt_data->is_encrypted());
|
|
||||||
|
|
||||||
memcpy(tmp_frame, src_frame, FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION);
|
memcpy(tmp_frame, src_frame, FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION);
|
||||||
|
|
||||||
@@ -665,15 +662,7 @@ static dberr_t fil_space_decrypt_full_crc32(
|
|||||||
(uint) space, offset, lsn);
|
(uint) space, offset, lsn);
|
||||||
|
|
||||||
if (rc != MY_AES_OK || dstlen != srclen) {
|
if (rc != MY_AES_OK || dstlen != srclen) {
|
||||||
if (rc == -1) {
|
return DB_DECRYPTION_FAILED;
|
||||||
return DB_DECRYPTION_FAILED;
|
|
||||||
}
|
|
||||||
|
|
||||||
ib::fatal() << "Unable to decrypt data-block "
|
|
||||||
<< " src: " << src << "srclen: "
|
|
||||||
<< srclen << " buf: " << dst << "buflen: "
|
|
||||||
<< dstlen << " return-code: " << rc
|
|
||||||
<< " Can't continue!";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Copy only checksum part in the trailer */
|
/* Copy only checksum part in the trailer */
|
||||||
@@ -707,8 +696,7 @@ static dberr_t fil_space_decrypt_for_non_full_checksum(
|
|||||||
src_frame + FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID);
|
src_frame + FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID);
|
||||||
ib_uint64_t lsn = mach_read_from_8(src_frame + FIL_PAGE_LSN);
|
ib_uint64_t lsn = mach_read_from_8(src_frame + FIL_PAGE_LSN);
|
||||||
|
|
||||||
ut_a(key_version != ENCRYPTION_KEY_NOT_ENCRYPTED);
|
ut_ad(key_version != ENCRYPTION_KEY_NOT_ENCRYPTED);
|
||||||
ut_a(crypt_data != NULL && crypt_data->is_encrypted());
|
|
||||||
|
|
||||||
/* read space & lsn */
|
/* read space & lsn */
|
||||||
uint header_len = FIL_PAGE_DATA;
|
uint header_len = FIL_PAGE_DATA;
|
||||||
@@ -735,18 +723,7 @@ static dberr_t fil_space_decrypt_for_non_full_checksum(
|
|||||||
space, offset, lsn);
|
space, offset, lsn);
|
||||||
|
|
||||||
if (! ((rc == MY_AES_OK) && ((ulint) dstlen == srclen))) {
|
if (! ((rc == MY_AES_OK) && ((ulint) dstlen == srclen))) {
|
||||||
|
return DB_DECRYPTION_FAILED;
|
||||||
if (rc == -1) {
|
|
||||||
return DB_DECRYPTION_FAILED;
|
|
||||||
}
|
|
||||||
|
|
||||||
ib::fatal() << "Unable to decrypt data-block "
|
|
||||||
<< " src: " << static_cast<const void*>(src)
|
|
||||||
<< "srclen: "
|
|
||||||
<< srclen << " buf: "
|
|
||||||
<< static_cast<const void*>(dst) << "buflen: "
|
|
||||||
<< dstlen << " return-code: " << rc
|
|
||||||
<< " Can't continue!";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* For compressed tables we do not store the FIL header because
|
/* For compressed tables we do not store the FIL header because
|
||||||
@@ -772,8 +749,8 @@ static dberr_t fil_space_decrypt_for_non_full_checksum(
|
|||||||
@param[in] tmp_frame Temporary buffer
|
@param[in] tmp_frame Temporary buffer
|
||||||
@param[in] physical_size page size
|
@param[in] physical_size page size
|
||||||
@param[in,out] src_frame Page to decrypt
|
@param[in,out] src_frame Page to decrypt
|
||||||
@param[out] err DB_SUCCESS or DB_DECRYPTION_FAILED
|
@retval DB_SUCCESS on success
|
||||||
@return DB_SUCCESS or error */
|
@retval DB_DECRYPTION_FAILED on error */
|
||||||
dberr_t
|
dberr_t
|
||||||
fil_space_decrypt(
|
fil_space_decrypt(
|
||||||
uint32_t space_id,
|
uint32_t space_id,
|
||||||
@@ -783,6 +760,10 @@ fil_space_decrypt(
|
|||||||
ulint physical_size,
|
ulint physical_size,
|
||||||
byte* src_frame)
|
byte* src_frame)
|
||||||
{
|
{
|
||||||
|
if (!crypt_data || !crypt_data->is_encrypted()) {
|
||||||
|
return DB_DECRYPTION_FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
if (fil_space_t::full_crc32(fsp_flags)) {
|
if (fil_space_t::full_crc32(fsp_flags)) {
|
||||||
return fil_space_decrypt_full_crc32(
|
return fil_space_decrypt_full_crc32(
|
||||||
space_id, crypt_data, tmp_frame, src_frame);
|
space_id, crypt_data, tmp_frame, src_frame);
|
||||||
@@ -799,7 +780,8 @@ Decrypt a page.
|
|||||||
@param[in] tmp_frame Temporary buffer used for decrypting
|
@param[in] tmp_frame Temporary buffer used for decrypting
|
||||||
@param[in,out] src_frame Page to decrypt
|
@param[in,out] src_frame Page to decrypt
|
||||||
@return decrypted page, or original not encrypted page if decryption is
|
@return decrypted page, or original not encrypted page if decryption is
|
||||||
not needed.*/
|
not needed.
|
||||||
|
@retval nullptr on failure */
|
||||||
byte*
|
byte*
|
||||||
fil_space_decrypt(
|
fil_space_decrypt(
|
||||||
const fil_space_t* space,
|
const fil_space_t* space,
|
||||||
@@ -808,7 +790,6 @@ fil_space_decrypt(
|
|||||||
{
|
{
|
||||||
const ulint physical_size = space->physical_size();
|
const ulint physical_size = space->physical_size();
|
||||||
|
|
||||||
ut_ad(space->crypt_data != NULL && space->crypt_data->is_encrypted());
|
|
||||||
ut_ad(space->referenced());
|
ut_ad(space->referenced());
|
||||||
|
|
||||||
if (DB_SUCCESS != fil_space_decrypt(space->id, space->flags,
|
if (DB_SUCCESS != fil_space_decrypt(space->id, space->flags,
|
||||||
@@ -820,9 +801,7 @@ fil_space_decrypt(
|
|||||||
|
|
||||||
/* Copy the decrypted page back to page buffer, not
|
/* Copy the decrypted page back to page buffer, not
|
||||||
really any other options. */
|
really any other options. */
|
||||||
memcpy(src_frame, tmp_frame, physical_size);
|
return static_cast<byte*>(memcpy(src_frame, tmp_frame, physical_size));
|
||||||
|
|
||||||
return src_frame;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************/
|
/***********************************************************************/
|
||||||
|
@@ -2831,7 +2831,7 @@ fail:
|
|||||||
io_error:
|
io_error:
|
||||||
#endif
|
#endif
|
||||||
set_corrupted();
|
set_corrupted();
|
||||||
err = DB_IO_ERROR;
|
err = DB_CORRUPTION;
|
||||||
node = nullptr;
|
node = nullptr;
|
||||||
goto release;
|
goto release;
|
||||||
}
|
}
|
||||||
|
@@ -718,7 +718,6 @@ rtr_split_page_move_rec_list(
|
|||||||
page_zip_des_t* new_page_zip
|
page_zip_des_t* new_page_zip
|
||||||
= buf_block_get_page_zip(new_block);
|
= buf_block_get_page_zip(new_block);
|
||||||
rec_t* rec;
|
rec_t* rec;
|
||||||
rec_t* ret;
|
|
||||||
ulint moved = 0;
|
ulint moved = 0;
|
||||||
ulint max_to_move = 0;
|
ulint max_to_move = 0;
|
||||||
rtr_rec_move_t* rec_move = NULL;
|
rtr_rec_move_t* rec_move = NULL;
|
||||||
@@ -733,7 +732,6 @@ rtr_split_page_move_rec_list(
|
|||||||
|
|
||||||
page = buf_block_get_frame(block);
|
page = buf_block_get_frame(block);
|
||||||
new_page = buf_block_get_frame(new_block);
|
new_page = buf_block_get_frame(new_block);
|
||||||
ret = page_rec_get_prev(page_get_supremum_rec(new_page));
|
|
||||||
|
|
||||||
end_split_node = node_array + page_get_n_recs(page);
|
end_split_node = node_array + page_get_n_recs(page);
|
||||||
|
|
||||||
@@ -804,32 +802,15 @@ rtr_split_page_move_rec_list(
|
|||||||
|
|
||||||
if (!page_zip_compress(new_block, index,
|
if (!page_zip_compress(new_block, index,
|
||||||
page_zip_level, mtr)) {
|
page_zip_level, mtr)) {
|
||||||
/* Before trying to reorganize the page,
|
if (dberr_t err =
|
||||||
store the number of preceding records on the page. */
|
|
||||||
ulint ret_pos = page_rec_get_n_recs_before(ret);
|
|
||||||
/* Before copying, "ret" was the predecessor
|
|
||||||
of the predefined supremum record. If it was
|
|
||||||
the predefined infimum record, then it would
|
|
||||||
still be the infimum, and we would have
|
|
||||||
ret_pos == 0. */
|
|
||||||
|
|
||||||
switch (dberr_t err =
|
|
||||||
page_zip_reorganize(new_block, index,
|
page_zip_reorganize(new_block, index,
|
||||||
page_zip_level, mtr)) {
|
page_zip_level, mtr)) {
|
||||||
case DB_FAIL:
|
if (err == DB_FAIL) {
|
||||||
if (UNIV_UNLIKELY
|
ut_a(page_zip_decompress(new_page_zip,
|
||||||
(!page_zip_decompress(new_page_zip,
|
new_page,
|
||||||
new_page, FALSE))) {
|
FALSE));
|
||||||
ut_error;
|
|
||||||
}
|
}
|
||||||
#ifdef UNIV_GIS_DEBUG
|
|
||||||
ut_ad(page_validate(new_page, index));
|
|
||||||
#endif
|
|
||||||
/* fall through */
|
|
||||||
default:
|
|
||||||
return err;
|
return err;
|
||||||
case DB_SUCCESS:
|
|
||||||
ret = page_rec_get_nth(new_page, ret_pos);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1284,14 +1265,9 @@ rtr_ins_enlarge_mbr(
|
|||||||
|
|
||||||
/*************************************************************//**
|
/*************************************************************//**
|
||||||
Copy recs from a page to new_block of rtree.
|
Copy recs from a page to new_block of rtree.
|
||||||
Differs from page_copy_rec_list_end, because this function does not
|
|
||||||
touch the lock table and max trx id on page or compress the page.
|
|
||||||
|
|
||||||
IMPORTANT: The caller will have to update IBUF_BITMAP_FREE
|
@return error code */
|
||||||
if new_block is a compressed leaf page in a secondary index.
|
dberr_t
|
||||||
This has to be done either within the same mini-transaction,
|
|
||||||
or by invoking ibuf_reset_free_bits() before mtr_commit(). */
|
|
||||||
void
|
|
||||||
rtr_page_copy_rec_list_end_no_locks(
|
rtr_page_copy_rec_list_end_no_locks(
|
||||||
/*================================*/
|
/*================================*/
|
||||||
buf_block_t* new_block, /*!< in: index page to copy to */
|
buf_block_t* new_block, /*!< in: index page to copy to */
|
||||||
@@ -1355,8 +1331,7 @@ rtr_page_copy_rec_list_end_no_locks(
|
|||||||
offsets1, offsets2, index, false,
|
offsets1, offsets2, index, false,
|
||||||
&cur_matched_fields);
|
&cur_matched_fields);
|
||||||
if (cmp < 0) {
|
if (cmp < 0) {
|
||||||
page_cur_move_to_prev(&page_cur);
|
goto move_to_prev;
|
||||||
break;
|
|
||||||
} else if (cmp > 0) {
|
} else if (cmp > 0) {
|
||||||
/* Skip small recs. */
|
/* Skip small recs. */
|
||||||
page_cur_move_to_next(&page_cur);
|
page_cur_move_to_next(&page_cur);
|
||||||
@@ -1379,26 +1354,23 @@ rtr_page_copy_rec_list_end_no_locks(
|
|||||||
/* If position is on suprenum rec, need to move to
|
/* If position is on suprenum rec, need to move to
|
||||||
previous rec. */
|
previous rec. */
|
||||||
if (page_rec_is_supremum(cur_rec)) {
|
if (page_rec_is_supremum(cur_rec)) {
|
||||||
page_cur_move_to_prev(&page_cur);
|
move_to_prev:
|
||||||
|
cur_rec = page_cur_move_to_prev(&page_cur);
|
||||||
|
} else {
|
||||||
|
cur_rec = page_cur_get_rec(&page_cur);
|
||||||
}
|
}
|
||||||
|
|
||||||
cur_rec = page_cur_get_rec(&page_cur);
|
if (UNIV_UNLIKELY(!cur_rec)) {
|
||||||
|
return DB_CORRUPTION;
|
||||||
|
}
|
||||||
|
|
||||||
offsets1 = rec_get_offsets(cur1_rec, index, offsets1, n_core,
|
offsets1 = rec_get_offsets(cur1_rec, index, offsets1, n_core,
|
||||||
ULINT_UNDEFINED, &heap);
|
ULINT_UNDEFINED, &heap);
|
||||||
|
|
||||||
ins_rec = page_cur_insert_rec_low(&page_cur, index,
|
ins_rec = page_cur_insert_rec_low(&page_cur, index,
|
||||||
cur1_rec, offsets1, mtr);
|
cur1_rec, offsets1, mtr);
|
||||||
if (UNIV_UNLIKELY(!ins_rec)) {
|
if (UNIV_UNLIKELY(!ins_rec || moved >= max_move)) {
|
||||||
fprintf(stderr, "page number %u and %u\n",
|
return DB_CORRUPTION;
|
||||||
new_block->page.id().page_no(),
|
|
||||||
block->page.id().page_no());
|
|
||||||
|
|
||||||
ib::fatal() << "rec offset " << page_offset(rec)
|
|
||||||
<< ", cur1 offset "
|
|
||||||
<< page_offset(page_cur_get_rec(&cur1))
|
|
||||||
<< ", cur_rec offset "
|
|
||||||
<< page_offset(cur_rec);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
rec_move[moved].new_rec = ins_rec;
|
rec_move[moved].new_rec = ins_rec;
|
||||||
@@ -1406,20 +1378,18 @@ rtr_page_copy_rec_list_end_no_locks(
|
|||||||
rec_move[moved].moved = false;
|
rec_move[moved].moved = false;
|
||||||
moved++;
|
moved++;
|
||||||
next:
|
next:
|
||||||
if (moved > max_move) {
|
|
||||||
ut_ad(0);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
page_cur_move_to_next(&cur1);
|
page_cur_move_to_next(&cur1);
|
||||||
}
|
}
|
||||||
|
|
||||||
*num_moved = moved;
|
*num_moved = moved;
|
||||||
|
return DB_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*************************************************************//**
|
/*************************************************************//**
|
||||||
Copy recs till a specified rec from a page to new_block of rtree. */
|
Copy recs till a specified rec from a page to new_block of rtree.
|
||||||
void
|
|
||||||
|
@return error code */
|
||||||
|
dberr_t
|
||||||
rtr_page_copy_rec_list_start_no_locks(
|
rtr_page_copy_rec_list_start_no_locks(
|
||||||
/*==================================*/
|
/*==================================*/
|
||||||
buf_block_t* new_block, /*!< in: index page to copy to */
|
buf_block_t* new_block, /*!< in: index page to copy to */
|
||||||
@@ -1474,9 +1444,7 @@ rtr_page_copy_rec_list_start_no_locks(
|
|||||||
offsets1, offsets2, index, false,
|
offsets1, offsets2, index, false,
|
||||||
&cur_matched_fields);
|
&cur_matched_fields);
|
||||||
if (cmp < 0) {
|
if (cmp < 0) {
|
||||||
page_cur_move_to_prev(&page_cur);
|
goto move_to_prev;
|
||||||
cur_rec = page_cur_get_rec(&page_cur);
|
|
||||||
break;
|
|
||||||
} else if (cmp > 0) {
|
} else if (cmp > 0) {
|
||||||
/* Skip small recs. */
|
/* Skip small recs. */
|
||||||
page_cur_move_to_next(&page_cur);
|
page_cur_move_to_next(&page_cur);
|
||||||
@@ -1500,23 +1468,22 @@ rtr_page_copy_rec_list_start_no_locks(
|
|||||||
/* If position is on suprenum rec, need to move to
|
/* If position is on suprenum rec, need to move to
|
||||||
previous rec. */
|
previous rec. */
|
||||||
if (page_rec_is_supremum(cur_rec)) {
|
if (page_rec_is_supremum(cur_rec)) {
|
||||||
page_cur_move_to_prev(&page_cur);
|
move_to_prev:
|
||||||
|
cur_rec = page_cur_move_to_prev(&page_cur);
|
||||||
|
if (UNIV_UNLIKELY(!cur_rec)) {
|
||||||
|
return DB_CORRUPTION;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
cur_rec = page_cur_get_rec(&page_cur);
|
||||||
}
|
}
|
||||||
|
|
||||||
cur_rec = page_cur_get_rec(&page_cur);
|
|
||||||
|
|
||||||
offsets1 = rec_get_offsets(cur1_rec, index, offsets1, n_core,
|
offsets1 = rec_get_offsets(cur1_rec, index, offsets1, n_core,
|
||||||
ULINT_UNDEFINED, &heap);
|
ULINT_UNDEFINED, &heap);
|
||||||
|
|
||||||
ins_rec = page_cur_insert_rec_low(&page_cur, index,
|
ins_rec = page_cur_insert_rec_low(&page_cur, index,
|
||||||
cur1_rec, offsets1, mtr);
|
cur1_rec, offsets1, mtr);
|
||||||
if (UNIV_UNLIKELY(!ins_rec)) {
|
if (UNIV_UNLIKELY(!ins_rec || moved >= max_move)) {
|
||||||
ib::fatal() << new_block->page.id()
|
return DB_CORRUPTION;
|
||||||
<< "rec offset " << page_offset(rec)
|
|
||||||
<< ", cur1 offset "
|
|
||||||
<< page_offset(page_cur_get_rec(&cur1))
|
|
||||||
<< ", cur_rec offset "
|
|
||||||
<< page_offset(cur_rec);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
rec_move[moved].new_rec = ins_rec;
|
rec_move[moved].new_rec = ins_rec;
|
||||||
@@ -1524,15 +1491,11 @@ rtr_page_copy_rec_list_start_no_locks(
|
|||||||
rec_move[moved].moved = false;
|
rec_move[moved].moved = false;
|
||||||
moved++;
|
moved++;
|
||||||
next:
|
next:
|
||||||
if (moved > max_move) {
|
|
||||||
ut_ad(0);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
page_cur_move_to_next(&cur1);
|
page_cur_move_to_next(&cur1);
|
||||||
}
|
}
|
||||||
|
|
||||||
*num_moved = moved;
|
*num_moved = moved;
|
||||||
|
return DB_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************//**
|
/****************************************************************//**
|
||||||
|
@@ -7450,9 +7450,12 @@ ha_innobase::build_template(
|
|||||||
|
|
||||||
ulint num_v = 0;
|
ulint num_v = 0;
|
||||||
|
|
||||||
if ((active_index != MAX_KEY
|
if (active_index != MAX_KEY
|
||||||
&& active_index == pushed_idx_cond_keyno)
|
&& active_index == pushed_idx_cond_keyno) {
|
||||||
|| (pushed_rowid_filter && rowid_filter_is_active)) {
|
m_prebuilt->idx_cond = this;
|
||||||
|
goto icp;
|
||||||
|
} else if (pushed_rowid_filter && rowid_filter_is_active) {
|
||||||
|
icp:
|
||||||
/* Push down an index condition or an end_range check. */
|
/* Push down an index condition or an end_range check. */
|
||||||
for (ulint i = 0; i < n_fields; i++) {
|
for (ulint i = 0; i < n_fields; i++) {
|
||||||
const Field* field = table->field[i];
|
const Field* field = table->field[i];
|
||||||
@@ -7633,9 +7636,6 @@ ha_innobase::build_template(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (active_index == pushed_idx_cond_keyno) {
|
|
||||||
m_prebuilt->idx_cond = this;
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
no_icp:
|
no_icp:
|
||||||
/* No index condition pushdown */
|
/* No index condition pushdown */
|
||||||
|
@@ -1993,7 +1993,7 @@ static bool innobase_table_is_empty(const dict_table_t *table,
|
|||||||
btr_pcur_t pcur;
|
btr_pcur_t pcur;
|
||||||
buf_block_t *block;
|
buf_block_t *block;
|
||||||
page_cur_t *cur;
|
page_cur_t *cur;
|
||||||
const rec_t *rec;
|
rec_t *rec;
|
||||||
bool next_page= false;
|
bool next_page= false;
|
||||||
|
|
||||||
mtr.start();
|
mtr.start();
|
||||||
@@ -2004,9 +2004,9 @@ non_empty:
|
|||||||
mtr.commit();
|
mtr.commit();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
btr_pcur_move_to_next_user_rec(&pcur, &mtr);
|
rec= page_rec_get_next(btr_pcur_get_rec(&pcur));
|
||||||
if (!rec_is_metadata(btr_pcur_get_rec(&pcur), *clust_index))
|
if (rec_is_metadata(rec, *clust_index))
|
||||||
btr_pcur_move_to_prev_on_page(&pcur);
|
btr_pcur_get_page_cur(&pcur)->rec= rec;
|
||||||
scan_leaf:
|
scan_leaf:
|
||||||
cur= btr_pcur_get_page_cur(&pcur);
|
cur= btr_pcur_get_page_cur(&pcur);
|
||||||
page_cur_move_to_next(cur);
|
page_cur_move_to_next(cur);
|
||||||
|
@@ -2035,23 +2035,25 @@ ibuf_get_merge_page_nos_func(
|
|||||||
|
|
||||||
*n_stored = 0;
|
*n_stored = 0;
|
||||||
|
|
||||||
limit = ut_min(IBUF_MAX_N_PAGES_MERGED,
|
|
||||||
buf_pool_get_curr_size() / 4);
|
|
||||||
|
|
||||||
if (page_rec_is_supremum(rec)) {
|
if (page_rec_is_supremum(rec)) {
|
||||||
|
|
||||||
rec = page_rec_get_prev_const(rec);
|
rec = page_rec_get_prev_const(rec);
|
||||||
|
if (UNIV_UNLIKELY(!rec)) {
|
||||||
|
corruption:
|
||||||
|
ut_ad("corrupted page" == 0);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (page_rec_is_infimum(rec)) {
|
if (page_rec_is_infimum(rec)) {
|
||||||
|
|
||||||
rec = page_rec_get_next_const(rec);
|
rec = page_rec_get_next_const(rec);
|
||||||
|
if (page_rec_is_supremum(rec)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (page_rec_is_supremum(rec)) {
|
limit = ut_min(IBUF_MAX_N_PAGES_MERGED,
|
||||||
|
buf_pool_get_curr_size() / 4);
|
||||||
return(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
first_page_no = ibuf_rec_get_page_no(mtr, rec);
|
first_page_no = ibuf_rec_get_page_no(mtr, rec);
|
||||||
first_space_id = ibuf_rec_get_space(mtr, rec);
|
first_space_id = ibuf_rec_get_space(mtr, rec);
|
||||||
@@ -2083,7 +2085,9 @@ ibuf_get_merge_page_nos_func(
|
|||||||
prev_page_no = rec_page_no;
|
prev_page_no = rec_page_no;
|
||||||
prev_space_id = rec_space_id;
|
prev_space_id = rec_space_id;
|
||||||
|
|
||||||
rec = page_rec_get_prev_const(rec);
|
if (UNIV_UNLIKELY(!(rec = page_rec_get_prev_const(rec)))) {
|
||||||
|
goto corruption;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
rec = page_rec_get_next_const(rec);
|
rec = page_rec_get_next_const(rec);
|
||||||
@@ -2809,14 +2813,16 @@ ibuf_get_volume_buffered(
|
|||||||
page = page_align(rec);
|
page = page_align(rec);
|
||||||
ut_ad(page_validate(page, ibuf.index));
|
ut_ad(page_validate(page, ibuf.index));
|
||||||
|
|
||||||
if (page_rec_is_supremum(rec)) {
|
if (page_rec_is_supremum(rec)
|
||||||
rec = page_rec_get_prev_const(rec);
|
&& UNIV_UNLIKELY(!(rec = page_rec_get_prev_const(rec)))) {
|
||||||
|
corruption:
|
||||||
|
ut_ad("corrupted page" == 0);
|
||||||
|
return srv_page_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t prev_page_no;
|
uint32_t prev_page_no;
|
||||||
|
|
||||||
for (; !page_rec_is_infimum(rec);
|
for (; !page_rec_is_infimum(rec); ) {
|
||||||
rec = page_rec_get_prev_const(rec)) {
|
|
||||||
ut_ad(page_align(rec) == page);
|
ut_ad(page_align(rec) == page);
|
||||||
|
|
||||||
if (page_no != ibuf_rec_get_page_no(mtr, rec)
|
if (page_no != ibuf_rec_get_page_no(mtr, rec)
|
||||||
@@ -2828,6 +2834,10 @@ ibuf_get_volume_buffered(
|
|||||||
volume += ibuf_get_volume_buffered_count(
|
volume += ibuf_get_volume_buffered_count(
|
||||||
mtr, rec,
|
mtr, rec,
|
||||||
hash_bitmap, UT_ARR_SIZE(hash_bitmap), n_recs);
|
hash_bitmap, UT_ARR_SIZE(hash_bitmap), n_recs);
|
||||||
|
|
||||||
|
if (UNIV_UNLIKELY(!(rec = page_rec_get_prev_const(rec)))) {
|
||||||
|
goto corruption;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Look at the previous page */
|
/* Look at the previous page */
|
||||||
@@ -2853,13 +2863,16 @@ ibuf_get_volume_buffered(
|
|||||||
|
|
||||||
if (UNIV_UNLIKELY(memcmp_aligned<4>(prev_page + FIL_PAGE_NEXT,
|
if (UNIV_UNLIKELY(memcmp_aligned<4>(prev_page + FIL_PAGE_NEXT,
|
||||||
page + FIL_PAGE_OFFSET, 4))) {
|
page + FIL_PAGE_OFFSET, 4))) {
|
||||||
return 0;
|
return srv_page_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
rec = page_get_supremum_rec(prev_page);
|
rec = page_rec_get_prev_const(page_get_supremum_rec(prev_page));
|
||||||
rec = page_rec_get_prev_const(rec);
|
|
||||||
|
|
||||||
for (;; rec = page_rec_get_prev_const(rec)) {
|
if (UNIV_UNLIKELY(!rec)) {
|
||||||
|
goto corruption;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
ut_ad(page_align(rec) == prev_page);
|
ut_ad(page_align(rec) == prev_page);
|
||||||
|
|
||||||
if (page_rec_is_infimum(rec)) {
|
if (page_rec_is_infimum(rec)) {
|
||||||
@@ -2880,6 +2893,10 @@ ibuf_get_volume_buffered(
|
|||||||
volume += ibuf_get_volume_buffered_count(
|
volume += ibuf_get_volume_buffered_count(
|
||||||
mtr, rec,
|
mtr, rec,
|
||||||
hash_bitmap, UT_ARR_SIZE(hash_bitmap), n_recs);
|
hash_bitmap, UT_ARR_SIZE(hash_bitmap), n_recs);
|
||||||
|
|
||||||
|
if (UNIV_UNLIKELY(!(rec = page_rec_get_prev_const(rec)))) {
|
||||||
|
goto corruption;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
count_later:
|
count_later:
|
||||||
@@ -3801,7 +3818,10 @@ ibuf_insert_to_index_page(
|
|||||||
buffered one. */
|
buffered one. */
|
||||||
|
|
||||||
page_cur_delete_rec(&page_cur, index, offsets, mtr);
|
page_cur_delete_rec(&page_cur, index, offsets, mtr);
|
||||||
page_cur_move_to_prev(&page_cur);
|
if (!(page_cur_move_to_prev(&page_cur))) {
|
||||||
|
err = DB_CORRUPTION;
|
||||||
|
goto updated_in_place;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
offsets = NULL;
|
offsets = NULL;
|
||||||
}
|
}
|
||||||
|
@@ -331,10 +331,11 @@ void
|
|||||||
btr_pcur_move_to_next_on_page(
|
btr_pcur_move_to_next_on_page(
|
||||||
/*==========================*/
|
/*==========================*/
|
||||||
btr_pcur_t* cursor);/*!< in/out: persistent cursor */
|
btr_pcur_t* cursor);/*!< in/out: persistent cursor */
|
||||||
|
MY_ATTRIBUTE((nonnull, warn_unused_result))
|
||||||
/*********************************************************//**
|
/*********************************************************//**
|
||||||
Moves the persistent cursor to the previous record on the same page. */
|
Moves the persistent cursor to the previous record on the same page. */
|
||||||
UNIV_INLINE
|
UNIV_INLINE
|
||||||
void
|
rec_t*
|
||||||
btr_pcur_move_to_prev_on_page(
|
btr_pcur_move_to_prev_on_page(
|
||||||
/*==========================*/
|
/*==========================*/
|
||||||
btr_pcur_t* cursor);/*!< in/out: persistent cursor */
|
btr_pcur_t* cursor);/*!< in/out: persistent cursor */
|
||||||
|
@@ -171,17 +171,16 @@ btr_pcur_move_to_next_on_page(
|
|||||||
/*********************************************************//**
|
/*********************************************************//**
|
||||||
Moves the persistent cursor to the previous record on the same page. */
|
Moves the persistent cursor to the previous record on the same page. */
|
||||||
UNIV_INLINE
|
UNIV_INLINE
|
||||||
void
|
rec_t*
|
||||||
btr_pcur_move_to_prev_on_page(
|
btr_pcur_move_to_prev_on_page(
|
||||||
/*==========================*/
|
/*==========================*/
|
||||||
btr_pcur_t* cursor) /*!< in/out: persistent cursor */
|
btr_pcur_t* cursor) /*!< in/out: persistent cursor */
|
||||||
{
|
{
|
||||||
ut_ad(cursor->pos_state == BTR_PCUR_IS_POSITIONED);
|
ut_ad(cursor->pos_state == BTR_PCUR_IS_POSITIONED);
|
||||||
ut_ad(cursor->latch_mode != BTR_NO_LATCHES);
|
ut_ad(cursor->latch_mode != BTR_NO_LATCHES);
|
||||||
|
|
||||||
page_cur_move_to_prev(btr_pcur_get_page_cur(cursor));
|
|
||||||
|
|
||||||
cursor->old_stored = false;
|
cursor->old_stored = false;
|
||||||
|
|
||||||
|
return page_cur_move_to_prev(btr_pcur_get_page_cur(cursor));
|
||||||
}
|
}
|
||||||
|
|
||||||
/*********************************************************//**
|
/*********************************************************//**
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
|
|
||||||
Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
||||||
Copyright (c) 2015, 2021, MariaDB Corporation.
|
Copyright (c) 2015, 2022, MariaDB Corporation.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify it under
|
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
|
the terms of the GNU General Public License as published by the Free Software
|
||||||
@@ -141,9 +141,6 @@ enum dberr_t {
|
|||||||
|
|
||||||
DB_IO_PARTIAL_FAILED, /*!< Partial IO request failed */
|
DB_IO_PARTIAL_FAILED, /*!< Partial IO request failed */
|
||||||
|
|
||||||
DB_FORCED_ABORT, /*!< Transaction was forced to rollback
|
|
||||||
by a higher priority transaction */
|
|
||||||
|
|
||||||
DB_TABLE_CORRUPT, /*!< Table/clustered index is
|
DB_TABLE_CORRUPT, /*!< Table/clustered index is
|
||||||
corrupted */
|
corrupted */
|
||||||
|
|
||||||
|
@@ -296,7 +296,8 @@ byte* fil_space_encrypt(
|
|||||||
@param[in] tmp_frame Temporary buffer
|
@param[in] tmp_frame Temporary buffer
|
||||||
@param[in] physical_size page size
|
@param[in] physical_size page size
|
||||||
@param[in,out] src_frame Page to decrypt
|
@param[in,out] src_frame Page to decrypt
|
||||||
@return DB_SUCCESS or error */
|
@retval DB_SUCCESS on success
|
||||||
|
@retval DB_DECRYPTION_FAILED on error */
|
||||||
dberr_t
|
dberr_t
|
||||||
fil_space_decrypt(
|
fil_space_decrypt(
|
||||||
uint32_t space_id,
|
uint32_t space_id,
|
||||||
@@ -312,7 +313,8 @@ Decrypt a page
|
|||||||
@param[in] tmp_frame Temporary buffer used for decrypting
|
@param[in] tmp_frame Temporary buffer used for decrypting
|
||||||
@param[in,out] src_frame Page to decrypt
|
@param[in,out] src_frame Page to decrypt
|
||||||
@return decrypted page, or original not encrypted page if decryption is
|
@return decrypted page, or original not encrypted page if decryption is
|
||||||
not needed.*/
|
not needed.
|
||||||
|
@retval nullptr on failure */
|
||||||
byte*
|
byte*
|
||||||
fil_space_decrypt(
|
fil_space_decrypt(
|
||||||
const fil_space_t* space,
|
const fil_space_t* space,
|
||||||
|
@@ -24,8 +24,7 @@ The low-level file system
|
|||||||
Created 10/25/1995 Heikki Tuuri
|
Created 10/25/1995 Heikki Tuuri
|
||||||
*******************************************************/
|
*******************************************************/
|
||||||
|
|
||||||
#ifndef fil0fil_h
|
#pragma once
|
||||||
#define fil0fil_h
|
|
||||||
|
|
||||||
#include "fsp0types.h"
|
#include "fsp0types.h"
|
||||||
#include "mach0data.h"
|
#include "mach0data.h"
|
||||||
@@ -1836,7 +1835,4 @@ void test_make_filepath();
|
|||||||
@return block size */
|
@return block size */
|
||||||
ulint fil_space_get_block_size(const fil_space_t* space, unsigned offset);
|
ulint fil_space_get_block_size(const fil_space_t* space, unsigned offset);
|
||||||
|
|
||||||
#include "fil0fil.inl"
|
|
||||||
#endif /* UNIV_INNOCHECKSUM */
|
#endif /* UNIV_INNOCHECKSUM */
|
||||||
|
|
||||||
#endif /* fil0fil_h */
|
|
||||||
|
@@ -1,145 +0,0 @@
|
|||||||
/*****************************************************************************
|
|
||||||
|
|
||||||
Copyright (c) 2015, 2019, 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/fil0fil.ic
|
|
||||||
The low-level file system support functions
|
|
||||||
|
|
||||||
Created 31/03/2015 Jan Lindström
|
|
||||||
*******************************************************/
|
|
||||||
|
|
||||||
#ifndef fil0fil_ic
|
|
||||||
#define fil0fil_ic
|
|
||||||
|
|
||||||
/*******************************************************************//**
|
|
||||||
Return page type name */
|
|
||||||
UNIV_INLINE
|
|
||||||
const char*
|
|
||||||
fil_get_page_type_name(
|
|
||||||
/*===================*/
|
|
||||||
ulint page_type) /*!< in: FIL_PAGE_TYPE */
|
|
||||||
{
|
|
||||||
switch(page_type) {
|
|
||||||
case FIL_PAGE_PAGE_COMPRESSED_ENCRYPTED:
|
|
||||||
return "PAGE_COMPRESSED_ENRYPTED";
|
|
||||||
case FIL_PAGE_PAGE_COMPRESSED:
|
|
||||||
return "PAGE_COMPRESSED";
|
|
||||||
case FIL_PAGE_TYPE_INSTANT:
|
|
||||||
case FIL_PAGE_INDEX:
|
|
||||||
return "INDEX";
|
|
||||||
case FIL_PAGE_RTREE:
|
|
||||||
return "RTREE";
|
|
||||||
case FIL_PAGE_UNDO_LOG:
|
|
||||||
return "UNDO LOG";
|
|
||||||
case FIL_PAGE_INODE:
|
|
||||||
return "INODE";
|
|
||||||
case FIL_PAGE_IBUF_FREE_LIST:
|
|
||||||
return "IBUF_FREE_LIST";
|
|
||||||
case FIL_PAGE_TYPE_ALLOCATED:
|
|
||||||
return "ALLOCATED";
|
|
||||||
case FIL_PAGE_IBUF_BITMAP:
|
|
||||||
return "IBUF_BITMAP";
|
|
||||||
case FIL_PAGE_TYPE_SYS:
|
|
||||||
return "SYS";
|
|
||||||
case FIL_PAGE_TYPE_TRX_SYS:
|
|
||||||
return "TRX_SYS";
|
|
||||||
case FIL_PAGE_TYPE_FSP_HDR:
|
|
||||||
return "FSP_HDR";
|
|
||||||
case FIL_PAGE_TYPE_XDES:
|
|
||||||
return "XDES";
|
|
||||||
case FIL_PAGE_TYPE_BLOB:
|
|
||||||
return "BLOB";
|
|
||||||
case FIL_PAGE_TYPE_ZBLOB:
|
|
||||||
return "ZBLOB";
|
|
||||||
case FIL_PAGE_TYPE_ZBLOB2:
|
|
||||||
return "ZBLOB2";
|
|
||||||
case FIL_PAGE_TYPE_UNKNOWN:
|
|
||||||
return "OLD UNKNOWN PAGE TYPE";
|
|
||||||
default:
|
|
||||||
return "PAGE TYPE CORRUPTED";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef UNIV_DEBUG
|
|
||||||
/** Validate page type.
|
|
||||||
@param[in] space Tablespace object
|
|
||||||
@param[in] page page to validate
|
|
||||||
@return true if valid, false if not */
|
|
||||||
UNIV_INLINE
|
|
||||||
bool
|
|
||||||
fil_page_type_validate(
|
|
||||||
fil_space_t* space,
|
|
||||||
const byte* page)
|
|
||||||
{
|
|
||||||
const uint16_t page_type = fil_page_get_type(page);
|
|
||||||
|
|
||||||
if ((page_type & 1U << FIL_PAGE_COMPRESS_FCRC32_MARKER)
|
|
||||||
&& space->full_crc32()
|
|
||||||
&& space->is_compressed()) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Validate page type */
|
|
||||||
if (!((page_type == FIL_PAGE_PAGE_COMPRESSED ||
|
|
||||||
page_type == FIL_PAGE_PAGE_COMPRESSED_ENCRYPTED ||
|
|
||||||
page_type == FIL_PAGE_INDEX ||
|
|
||||||
page_type == FIL_PAGE_TYPE_INSTANT ||
|
|
||||||
page_type == FIL_PAGE_RTREE ||
|
|
||||||
page_type == FIL_PAGE_UNDO_LOG ||
|
|
||||||
page_type == FIL_PAGE_INODE ||
|
|
||||||
page_type == FIL_PAGE_IBUF_FREE_LIST ||
|
|
||||||
page_type == FIL_PAGE_TYPE_ALLOCATED ||
|
|
||||||
page_type == FIL_PAGE_IBUF_BITMAP ||
|
|
||||||
page_type == FIL_PAGE_TYPE_SYS ||
|
|
||||||
page_type == FIL_PAGE_TYPE_TRX_SYS ||
|
|
||||||
page_type == FIL_PAGE_TYPE_FSP_HDR ||
|
|
||||||
page_type == FIL_PAGE_TYPE_XDES ||
|
|
||||||
page_type == FIL_PAGE_TYPE_BLOB ||
|
|
||||||
page_type == FIL_PAGE_TYPE_ZBLOB ||
|
|
||||||
page_type == FIL_PAGE_TYPE_ZBLOB2 ||
|
|
||||||
page_type == FIL_PAGE_TYPE_UNKNOWN))) {
|
|
||||||
|
|
||||||
ulint space_id = mach_read_from_4(
|
|
||||||
page + FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID);
|
|
||||||
|
|
||||||
ulint offset = mach_read_from_4(page + FIL_PAGE_OFFSET);
|
|
||||||
|
|
||||||
ulint key_version = mach_read_from_4(
|
|
||||||
page + FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION);
|
|
||||||
|
|
||||||
if (space && space->full_crc32()) {
|
|
||||||
key_version = mach_read_from_4(
|
|
||||||
page + FIL_PAGE_FCRC32_KEY_VERSION);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Dump out the page info */
|
|
||||||
ib::fatal() << "Page " << space_id << ":" << offset
|
|
||||||
<< " name " << (space && space->chain.start
|
|
||||||
? space->chain.start->name : "???")
|
|
||||||
<< " page_type " << page_type
|
|
||||||
<< " key_version " << key_version
|
|
||||||
<< " lsn " << mach_read_from_8(page + FIL_PAGE_LSN)
|
|
||||||
<< " compressed_len " << mach_read_from_2(page + FIL_PAGE_DATA);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
#endif /* UNIV_DEBUG */
|
|
||||||
|
|
||||||
#endif /* fil0fil_ic */
|
|
@@ -337,9 +337,12 @@ rtr_get_parent_cursor(
|
|||||||
ulint level, /*!< in: index level of buffer page */
|
ulint level, /*!< in: index level of buffer page */
|
||||||
ulint is_insert); /*!< in: whether insert operation */
|
ulint is_insert); /*!< in: whether insert operation */
|
||||||
|
|
||||||
|
MY_ATTRIBUTE((warn_unused_result))
|
||||||
/*************************************************************//**
|
/*************************************************************//**
|
||||||
Copy recs from a page to new_block of rtree. */
|
Copy recs from a page to new_block of rtree.
|
||||||
void
|
|
||||||
|
@return error code */
|
||||||
|
dberr_t
|
||||||
rtr_page_copy_rec_list_end_no_locks(
|
rtr_page_copy_rec_list_end_no_locks(
|
||||||
/*================================*/
|
/*================================*/
|
||||||
buf_block_t* new_block, /*!< in: index page to copy to */
|
buf_block_t* new_block, /*!< in: index page to copy to */
|
||||||
@@ -352,9 +355,12 @@ rtr_page_copy_rec_list_end_no_locks(
|
|||||||
ulint* num_moved, /*!< out: num of rec to move */
|
ulint* num_moved, /*!< out: num of rec to move */
|
||||||
mtr_t* mtr); /*!< in: mtr */
|
mtr_t* mtr); /*!< in: mtr */
|
||||||
|
|
||||||
|
MY_ATTRIBUTE((warn_unused_result))
|
||||||
/*************************************************************//**
|
/*************************************************************//**
|
||||||
Copy recs till a specified rec from a page to new_block of rtree. */
|
Copy recs till a specified rec from a page to new_block of rtree.
|
||||||
void
|
|
||||||
|
@return error code */
|
||||||
|
dberr_t
|
||||||
rtr_page_copy_rec_list_start_no_locks(
|
rtr_page_copy_rec_list_start_no_locks(
|
||||||
/*==================================*/
|
/*==================================*/
|
||||||
buf_block_t* new_block, /*!< in: index page to copy to */
|
buf_block_t* new_block, /*!< in: index page to copy to */
|
||||||
|
@@ -120,10 +120,11 @@ void
|
|||||||
page_cur_move_to_next(
|
page_cur_move_to_next(
|
||||||
/*==================*/
|
/*==================*/
|
||||||
page_cur_t* cur); /*!< in/out: cursor; must not be after last */
|
page_cur_t* cur); /*!< in/out: cursor; must not be after last */
|
||||||
|
MY_ATTRIBUTE((nonnull, warn_unused_result))
|
||||||
/**********************************************************//**
|
/**********************************************************//**
|
||||||
Moves the cursor to the previous record on page. */
|
Moves the cursor to the previous record on page. */
|
||||||
UNIV_INLINE
|
UNIV_INLINE
|
||||||
void
|
rec_t*
|
||||||
page_cur_move_to_prev(
|
page_cur_move_to_prev(
|
||||||
/*==================*/
|
/*==================*/
|
||||||
page_cur_t* cur); /*!< in/out: cursor; not before first */
|
page_cur_t* cur); /*!< in/out: cursor; not before first */
|
||||||
|
@@ -168,14 +168,14 @@ page_cur_move_to_next(
|
|||||||
/**********************************************************//**
|
/**********************************************************//**
|
||||||
Moves the cursor to the previous record on page. */
|
Moves the cursor to the previous record on page. */
|
||||||
UNIV_INLINE
|
UNIV_INLINE
|
||||||
void
|
rec_t*
|
||||||
page_cur_move_to_prev(
|
page_cur_move_to_prev(
|
||||||
/*==================*/
|
/*==================*/
|
||||||
page_cur_t* cur) /*!< in/out: page cursor, not before first */
|
page_cur_t* cur) /*!< in/out: page cursor, not before first */
|
||||||
{
|
{
|
||||||
ut_ad(!page_cur_is_before_first(cur));
|
ut_ad(!page_cur_is_before_first(cur));
|
||||||
|
|
||||||
cur->rec = page_rec_get_prev(cur->rec);
|
return cur->rec = page_rec_get_prev(cur->rec);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Search the right position for a page cursor.
|
/** Search the right position for a page cursor.
|
||||||
|
@@ -669,7 +669,8 @@ page_dir_calc_reserved_space(
|
|||||||
ulint n_recs); /*!< in: number of records */
|
ulint n_recs); /*!< in: number of records */
|
||||||
/***************************************************************//**
|
/***************************************************************//**
|
||||||
Looks for the directory slot which owns the given record.
|
Looks for the directory slot which owns the given record.
|
||||||
@return the directory slot number */
|
@return the directory slot number
|
||||||
|
@retval ULINT_UNDEFINED on corruption */
|
||||||
ulint
|
ulint
|
||||||
page_dir_find_owner_slot(
|
page_dir_find_owner_slot(
|
||||||
/*=====================*/
|
/*=====================*/
|
||||||
@@ -763,7 +764,8 @@ page_rec_get_next_non_del_marked(
|
|||||||
const rec_t* rec); /*!< in: pointer to record */
|
const rec_t* rec); /*!< in: pointer to record */
|
||||||
/************************************************************//**
|
/************************************************************//**
|
||||||
Gets the pointer to the previous record.
|
Gets the pointer to the previous record.
|
||||||
@return pointer to previous record */
|
@return pointer to previous record
|
||||||
|
@retval nullptr on error */
|
||||||
UNIV_INLINE
|
UNIV_INLINE
|
||||||
const rec_t*
|
const rec_t*
|
||||||
page_rec_get_prev_const(
|
page_rec_get_prev_const(
|
||||||
@@ -772,13 +774,13 @@ page_rec_get_prev_const(
|
|||||||
infimum */
|
infimum */
|
||||||
/************************************************************//**
|
/************************************************************//**
|
||||||
Gets the pointer to the previous record.
|
Gets the pointer to the previous record.
|
||||||
@return pointer to previous record */
|
@param rec record (not page infimum)
|
||||||
UNIV_INLINE
|
@return pointer to previous record
|
||||||
rec_t*
|
@retval nullptr on error */
|
||||||
page_rec_get_prev(
|
inline rec_t *page_rec_get_prev(rec_t *rec)
|
||||||
/*==============*/
|
{
|
||||||
rec_t* rec); /*!< in: pointer to record,
|
return const_cast<rec_t*>(page_rec_get_prev_const(rec));
|
||||||
must not be page infimum */
|
}
|
||||||
|
|
||||||
/************************************************************//**
|
/************************************************************//**
|
||||||
true if the record is the first user record on a page.
|
true if the record is the first user record on a page.
|
||||||
@@ -997,7 +999,7 @@ page_copy_rec_list_start(
|
|||||||
/*************************************************************//**
|
/*************************************************************//**
|
||||||
Deletes records from a page from a given record onward, including that record.
|
Deletes records from a page from a given record onward, including that record.
|
||||||
The infimum and supremum records are not deleted. */
|
The infimum and supremum records are not deleted. */
|
||||||
void
|
dberr_t
|
||||||
page_delete_rec_list_end(
|
page_delete_rec_list_end(
|
||||||
/*=====================*/
|
/*=====================*/
|
||||||
rec_t* rec, /*!< in: pointer to record on page */
|
rec_t* rec, /*!< in: pointer to record on page */
|
||||||
@@ -1009,7 +1011,7 @@ page_delete_rec_list_end(
|
|||||||
records in the end of the chain to
|
records in the end of the chain to
|
||||||
delete, or ULINT_UNDEFINED if not known */
|
delete, or ULINT_UNDEFINED if not known */
|
||||||
mtr_t* mtr) /*!< in: mtr */
|
mtr_t* mtr) /*!< in: mtr */
|
||||||
MY_ATTRIBUTE((nonnull));
|
MY_ATTRIBUTE((nonnull, warn_unused_result));
|
||||||
/*************************************************************//**
|
/*************************************************************//**
|
||||||
Deletes records from page, up to the given record, NOT including
|
Deletes records from page, up to the given record, NOT including
|
||||||
that record. Infimum and supremum records are not deleted. */
|
that record. Infimum and supremum records are not deleted. */
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
|
|
||||||
Copyright (c) 1994, 2019, Oracle and/or its affiliates. All Rights Reserved.
|
Copyright (c) 1994, 2019, Oracle and/or its affiliates. All Rights Reserved.
|
||||||
Copyright (c) 2016, 2021, MariaDB Corporation.
|
Copyright (c) 2016, 2022, MariaDB Corporation.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify it under
|
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
|
the terms of the GNU General Public License as published by the Free Software
|
||||||
@@ -24,9 +24,6 @@ Index page routines
|
|||||||
Created 2/2/1994 Heikki Tuuri
|
Created 2/2/1994 Heikki Tuuri
|
||||||
*******************************************************/
|
*******************************************************/
|
||||||
|
|
||||||
#ifndef page0page_ic
|
|
||||||
#define page0page_ic
|
|
||||||
|
|
||||||
#ifndef UNIV_INNOCHECKSUM
|
#ifndef UNIV_INNOCHECKSUM
|
||||||
#include "rem0cmp.h"
|
#include "rem0cmp.h"
|
||||||
#include "mtr0log.h"
|
#include "mtr0log.h"
|
||||||
@@ -506,7 +503,8 @@ page_rec_get_next_non_del_marked(
|
|||||||
|
|
||||||
/************************************************************//**
|
/************************************************************//**
|
||||||
Gets the pointer to the previous record.
|
Gets the pointer to the previous record.
|
||||||
@return pointer to previous record */
|
@return pointer to previous record
|
||||||
|
@retval nullptr on error */
|
||||||
UNIV_INLINE
|
UNIV_INLINE
|
||||||
const rec_t*
|
const rec_t*
|
||||||
page_rec_get_prev_const(
|
page_rec_get_prev_const(
|
||||||
@@ -528,42 +526,28 @@ page_rec_get_prev_const(
|
|||||||
|
|
||||||
slot_no = page_dir_find_owner_slot(rec);
|
slot_no = page_dir_find_owner_slot(rec);
|
||||||
|
|
||||||
ut_a(slot_no != 0);
|
if (UNIV_UNLIKELY(!slot_no || slot_no == ULINT_UNDEFINED)) {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
slot = page_dir_get_nth_slot(page, slot_no - 1);
|
slot = page_dir_get_nth_slot(page, slot_no - 1);
|
||||||
|
|
||||||
rec2 = page_dir_slot_get_rec(slot);
|
rec2 = page_dir_slot_get_rec(slot);
|
||||||
|
|
||||||
if (page_is_comp(page)) {
|
if (page_is_comp(page)) {
|
||||||
while (rec != rec2) {
|
while (rec2 && rec != rec2) {
|
||||||
prev_rec = rec2;
|
prev_rec = rec2;
|
||||||
rec2 = page_rec_get_next_low(rec2, TRUE);
|
rec2 = page_rec_get_next_low(rec2, TRUE);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
while (rec != rec2) {
|
while (rec2 && rec != rec2) {
|
||||||
prev_rec = rec2;
|
prev_rec = rec2;
|
||||||
rec2 = page_rec_get_next_low(rec2, FALSE);
|
rec2 = page_rec_get_next_low(rec2, FALSE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ut_a(prev_rec);
|
|
||||||
|
|
||||||
return(prev_rec);
|
return(prev_rec);
|
||||||
}
|
}
|
||||||
|
|
||||||
/************************************************************//**
|
|
||||||
Gets the pointer to the previous record.
|
|
||||||
@return pointer to previous record */
|
|
||||||
UNIV_INLINE
|
|
||||||
rec_t*
|
|
||||||
page_rec_get_prev(
|
|
||||||
/*==============*/
|
|
||||||
rec_t* rec) /*!< in: pointer to record, must not be page
|
|
||||||
infimum */
|
|
||||||
{
|
|
||||||
return((rec_t*) page_rec_get_prev_const(rec));
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* UNIV_INNOCHECKSUM */
|
#endif /* UNIV_INNOCHECKSUM */
|
||||||
|
|
||||||
/************************************************************//**
|
/************************************************************//**
|
||||||
@@ -720,5 +704,3 @@ page_get_instant(const page_t* page)
|
|||||||
return static_cast<uint16_t>(i >> 3); /* i / 8 */
|
return static_cast<uint16_t>(i >> 3); /* i / 8 */
|
||||||
}
|
}
|
||||||
#endif /* !UNIV_INNOCHECKSUM */
|
#endif /* !UNIV_INNOCHECKSUM */
|
||||||
|
|
||||||
#endif
|
|
||||||
|
@@ -1621,7 +1621,9 @@ copied:
|
|||||||
|
|
||||||
if (UNIV_UNLIKELY(n_owned == PAGE_DIR_SLOT_MAX_N_OWNED))
|
if (UNIV_UNLIKELY(n_owned == PAGE_DIR_SLOT_MAX_N_OWNED))
|
||||||
{
|
{
|
||||||
const auto owner= page_dir_find_owner_slot(next_rec);
|
const ulint owner= page_dir_find_owner_slot(next_rec);
|
||||||
|
if (UNIV_UNLIKELY(owner == ULINT_UNDEFINED))
|
||||||
|
return nullptr;
|
||||||
page_dir_split_slot(*block,
|
page_dir_split_slot(*block,
|
||||||
page_dir_get_nth_slot(block->page.frame, owner));
|
page_dir_get_nth_slot(block->page.frame, owner));
|
||||||
}
|
}
|
||||||
@@ -2047,8 +2049,12 @@ inc_dir:
|
|||||||
record. If the number exceeds PAGE_DIR_SLOT_MAX_N_OWNED,
|
record. If the number exceeds PAGE_DIR_SLOT_MAX_N_OWNED,
|
||||||
we have to split the corresponding directory slot in two. */
|
we have to split the corresponding directory slot in two. */
|
||||||
if (UNIV_UNLIKELY(n_owned == PAGE_DIR_SLOT_MAX_N_OWNED))
|
if (UNIV_UNLIKELY(n_owned == PAGE_DIR_SLOT_MAX_N_OWNED))
|
||||||
page_zip_dir_split_slot(cursor->block,
|
{
|
||||||
page_dir_find_owner_slot(next_rec), mtr);
|
const ulint owner= page_dir_find_owner_slot(next_rec);
|
||||||
|
if (UNIV_UNLIKELY(owner == ULINT_UNDEFINED))
|
||||||
|
return nullptr;
|
||||||
|
page_zip_dir_split_slot(cursor->block, owner, mtr);
|
||||||
|
}
|
||||||
|
|
||||||
page_zip_write_rec(cursor->block, insert_rec, index, offsets, 1, mtr);
|
page_zip_write_rec(cursor->block, insert_rec, index, offsets, 1, mtr);
|
||||||
return insert_rec;
|
return insert_rec;
|
||||||
@@ -2144,7 +2150,6 @@ page_cur_delete_rec(
|
|||||||
rec_t* current_rec;
|
rec_t* current_rec;
|
||||||
rec_t* prev_rec = NULL;
|
rec_t* prev_rec = NULL;
|
||||||
rec_t* next_rec;
|
rec_t* next_rec;
|
||||||
ulint cur_slot_no;
|
|
||||||
ulint cur_n_owned;
|
ulint cur_n_owned;
|
||||||
rec_t* rec;
|
rec_t* rec;
|
||||||
|
|
||||||
@@ -2188,8 +2193,13 @@ page_cur_delete_rec(
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Save to local variables some data associated with current_rec */
|
/* Save to local variables some data associated with current_rec */
|
||||||
cur_slot_no = page_dir_find_owner_slot(current_rec);
|
ulint cur_slot_no = page_dir_find_owner_slot(current_rec);
|
||||||
ut_ad(cur_slot_no > 0);
|
|
||||||
|
if (UNIV_UNLIKELY(!cur_slot_no || cur_slot_no == ULINT_UNDEFINED)) {
|
||||||
|
/* Avoid crashing due to a corrupted page. */
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
cur_dir_slot = page_dir_get_nth_slot(block->page.frame, cur_slot_no);
|
cur_dir_slot = page_dir_get_nth_slot(block->page.frame, cur_slot_no);
|
||||||
cur_n_owned = page_dir_slot_get_n_owned(cur_dir_slot);
|
cur_n_owned = page_dir_slot_get_n_owned(cur_dir_slot);
|
||||||
|
|
||||||
|
@@ -82,7 +82,8 @@ is 50 x 4 bytes = 200 bytes. */
|
|||||||
|
|
||||||
/***************************************************************//**
|
/***************************************************************//**
|
||||||
Looks for the directory slot which owns the given record.
|
Looks for the directory slot which owns the given record.
|
||||||
@return the directory slot number */
|
@return the directory slot number
|
||||||
|
@retval ULINT_UNDEFINED on corruption */
|
||||||
ulint
|
ulint
|
||||||
page_dir_find_owner_slot(
|
page_dir_find_owner_slot(
|
||||||
/*=====================*/
|
/*=====================*/
|
||||||
@@ -135,7 +136,7 @@ page_dir_find_owner_slot(
|
|||||||
+ mach_decode_2(rec_offs_bytes));
|
+ mach_decode_2(rec_offs_bytes));
|
||||||
}
|
}
|
||||||
|
|
||||||
ut_error;
|
return ULINT_UNDEFINED;
|
||||||
}
|
}
|
||||||
|
|
||||||
slot += PAGE_DIR_SLOT_SIZE;
|
slot += PAGE_DIR_SLOT_SIZE;
|
||||||
@@ -589,12 +590,12 @@ page_copy_rec_list_end(
|
|||||||
|
|
||||||
/* For spatial index, we need to insert recs one by one
|
/* For spatial index, we need to insert recs one by one
|
||||||
to keep recs ordered. */
|
to keep recs ordered. */
|
||||||
rtr_page_copy_rec_list_end_no_locks(new_block,
|
*err = rtr_page_copy_rec_list_end_no_locks(new_block,
|
||||||
block, rec, index,
|
block, rec, index,
|
||||||
heap, rec_move,
|
heap, rec_move,
|
||||||
max_to_move,
|
max_to_move,
|
||||||
&num_moved,
|
&num_moved,
|
||||||
mtr);
|
mtr);
|
||||||
} else {
|
} else {
|
||||||
*err = page_copy_rec_list_end_no_locks(new_block, block, rec,
|
*err = page_copy_rec_list_end_no_locks(new_block, block, rec,
|
||||||
index, mtr);
|
index, mtr);
|
||||||
@@ -719,6 +720,11 @@ page_copy_rec_list_start(
|
|||||||
rec_offs* offsets = offsets_;
|
rec_offs* offsets = offsets_;
|
||||||
rec_offs_init(offsets_);
|
rec_offs_init(offsets_);
|
||||||
|
|
||||||
|
if (UNIV_UNLIKELY(!ret)) {
|
||||||
|
*err = DB_CORRUPTION;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/* Here, "ret" may be pointing to a user record or the
|
/* Here, "ret" may be pointing to a user record or the
|
||||||
predefined infimum record. */
|
predefined infimum record. */
|
||||||
|
|
||||||
@@ -753,10 +759,14 @@ page_copy_rec_list_start(
|
|||||||
|
|
||||||
/* For spatial index, we need to insert recs one by one
|
/* For spatial index, we need to insert recs one by one
|
||||||
to keep recs ordered. */
|
to keep recs ordered. */
|
||||||
rtr_page_copy_rec_list_start_no_locks(new_block,
|
*err = rtr_page_copy_rec_list_start_no_locks(new_block,
|
||||||
block, rec, index, heap,
|
block, rec, index,
|
||||||
rec_move, max_to_move,
|
heap, rec_move,
|
||||||
&num_moved, mtr);
|
max_to_move,
|
||||||
|
&num_moved, mtr);
|
||||||
|
if (*err != DB_SUCCESS) {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
while (page_cur_get_rec(&cur1) != rec) {
|
while (page_cur_get_rec(&cur1) != rec) {
|
||||||
offsets = rec_get_offsets(cur1.rec, index, offsets,
|
offsets = rec_get_offsets(cur1.rec, index, offsets,
|
||||||
@@ -857,7 +867,7 @@ zip_reorganize:
|
|||||||
/*************************************************************//**
|
/*************************************************************//**
|
||||||
Deletes records from a page from a given record onward, including that record.
|
Deletes records from a page from a given record onward, including that record.
|
||||||
The infimum and supremum records are not deleted. */
|
The infimum and supremum records are not deleted. */
|
||||||
void
|
dberr_t
|
||||||
page_delete_rec_list_end(
|
page_delete_rec_list_end(
|
||||||
/*=====================*/
|
/*=====================*/
|
||||||
rec_t* rec, /*!< in: pointer to record on page */
|
rec_t* rec, /*!< in: pointer to record on page */
|
||||||
@@ -884,7 +894,7 @@ page_delete_rec_list_end(
|
|||||||
{
|
{
|
||||||
ut_ad(n_recs == 0 || n_recs == ULINT_UNDEFINED);
|
ut_ad(n_recs == 0 || n_recs == ULINT_UNDEFINED);
|
||||||
/* Nothing to do, there are no records bigger than the page supremum. */
|
/* Nothing to do, there are no records bigger than the page supremum. */
|
||||||
return;
|
return DB_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (page_rec_is_infimum(rec) ||
|
if (page_rec_is_infimum(rec) ||
|
||||||
@@ -895,7 +905,7 @@ page_delete_rec_list_end(
|
|||||||
{
|
{
|
||||||
/* We are deleting all records. */
|
/* We are deleting all records. */
|
||||||
page_create_empty(block, index, mtr);
|
page_create_empty(block, index, mtr);
|
||||||
return;
|
return DB_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0 // FIXME: consider deleting the last record as a special case
|
#if 0 // FIXME: consider deleting the last record as a special case
|
||||||
@@ -903,7 +913,7 @@ page_delete_rec_list_end(
|
|||||||
{
|
{
|
||||||
page_cur_t cursor= { index, rec, offsets, block };
|
page_cur_t cursor= { index, rec, offsets, block };
|
||||||
page_cur_delete_rec(&cursor, index, offsets, mtr);
|
page_cur_delete_rec(&cursor, index, offsets, mtr);
|
||||||
return;
|
return DB_SUCCESS;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -936,12 +946,16 @@ page_delete_rec_list_end(
|
|||||||
|
|
||||||
if (UNIV_LIKELY_NULL(heap))
|
if (UNIV_LIKELY_NULL(heap))
|
||||||
mem_heap_free(heap);
|
mem_heap_free(heap);
|
||||||
return;
|
return DB_SUCCESS;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
byte *prev_rec= page_rec_get_prev(rec);
|
byte *prev_rec= page_rec_get_prev(rec);
|
||||||
|
if (UNIV_UNLIKELY(!prev_rec))
|
||||||
|
return DB_CORRUPTION;
|
||||||
byte *last_rec= page_rec_get_prev(page_get_supremum_rec(page));
|
byte *last_rec= page_rec_get_prev(page_get_supremum_rec(page));
|
||||||
|
if (UNIV_UNLIKELY(!last_rec))
|
||||||
|
return DB_CORRUPTION;
|
||||||
|
|
||||||
// FIXME: consider a special case of shrinking PAGE_HEAP_TOP
|
// FIXME: consider a special case of shrinking PAGE_HEAP_TOP
|
||||||
|
|
||||||
@@ -998,9 +1012,11 @@ page_delete_rec_list_end(
|
|||||||
ut_ad(n_owned > count);
|
ut_ad(n_owned > count);
|
||||||
n_owned-= count;
|
n_owned-= count;
|
||||||
slot_index= page_dir_find_owner_slot(owner_rec);
|
slot_index= page_dir_find_owner_slot(owner_rec);
|
||||||
ut_ad(slot_index > 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (UNIV_UNLIKELY(!slot_index || slot_index == ULINT_UNDEFINED))
|
||||||
|
return DB_CORRUPTION;
|
||||||
|
|
||||||
mtr->write<2,mtr_t::MAYBE_NOP>(*block, my_assume_aligned<2>
|
mtr->write<2,mtr_t::MAYBE_NOP>(*block, my_assume_aligned<2>
|
||||||
(PAGE_N_DIR_SLOTS + PAGE_HEADER + page),
|
(PAGE_N_DIR_SLOTS + PAGE_HEADER + page),
|
||||||
slot_index + 1);
|
slot_index + 1);
|
||||||
@@ -1046,7 +1062,7 @@ page_delete_rec_list_end(
|
|||||||
mach_write_to_2(last_rec - REC_NEXT, free
|
mach_write_to_2(last_rec - REC_NEXT, free
|
||||||
? static_cast<uint16_t>(free - page_offset(last_rec))
|
? static_cast<uint16_t>(free - page_offset(last_rec))
|
||||||
: 0U);
|
: 0U);
|
||||||
return;
|
return DB_SUCCESS;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
mtr->write<1,mtr_t::MAYBE_NOP>(*block, owned, new_owned);
|
mtr->write<1,mtr_t::MAYBE_NOP>(*block, owned, new_owned);
|
||||||
@@ -1066,6 +1082,8 @@ page_delete_rec_list_end(
|
|||||||
mtr->write<2>(*block, prev_rec - REC_NEXT, PAGE_OLD_SUPREMUM);
|
mtr->write<2>(*block, prev_rec - REC_NEXT, PAGE_OLD_SUPREMUM);
|
||||||
mtr->write<2>(*block, last_rec - REC_NEXT, free);
|
mtr->write<2>(*block, last_rec - REC_NEXT, free);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return DB_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*************************************************************//**
|
/*************************************************************//**
|
||||||
|
@@ -1519,15 +1519,10 @@ inline bool IndexPurge::open() noexcept
|
|||||||
&m_pcur, true, 0, &m_mtr) != DB_SUCCESS)
|
&m_pcur, true, 0, &m_mtr) != DB_SUCCESS)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
btr_pcur_move_to_next_user_rec(&m_pcur, &m_mtr);
|
rec_t *rec= page_rec_get_next(btr_pcur_get_rec(&m_pcur));
|
||||||
if (rec_is_metadata(btr_pcur_get_rec(&m_pcur), *m_index))
|
if (rec_is_metadata(rec, *m_index))
|
||||||
{
|
|
||||||
if (!btr_pcur_is_on_user_rec(&m_pcur))
|
|
||||||
return false;
|
|
||||||
/* Skip the metadata pseudo-record. */
|
/* Skip the metadata pseudo-record. */
|
||||||
}
|
btr_pcur_get_page_cur(&m_pcur)->rec= rec;
|
||||||
else
|
|
||||||
btr_pcur_move_to_prev_on_page(&m_pcur);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1570,55 +1565,10 @@ dberr_t IndexPurge::next() noexcept
|
|||||||
return DB_END_OF_INDEX;
|
return DB_END_OF_INDEX;
|
||||||
}
|
}
|
||||||
|
|
||||||
buf_block_t* block = btr_pcur_get_block(&m_pcur);
|
if (dberr_t err = btr_pcur_move_to_next_page(&m_pcur,
|
||||||
uint32_t next_page = btr_page_get_next(
|
&m_mtr)) {
|
||||||
block->page.frame);
|
return err;
|
||||||
|
|
||||||
/* MDEV-13542 FIXME: Make these checks part of
|
|
||||||
btr_pcur_move_to_next_page(), and introduce a
|
|
||||||
return status that will be checked in all callers! */
|
|
||||||
switch (next_page) {
|
|
||||||
default:
|
|
||||||
if (next_page != block->page.id().page_no()) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
/* MDEV-20931 FIXME: Check that
|
|
||||||
next_page is within the tablespace
|
|
||||||
bounds! Also check that it is not a
|
|
||||||
change buffer bitmap page. */
|
|
||||||
/* fall through */
|
|
||||||
case 0:
|
|
||||||
case 1:
|
|
||||||
case FIL_NULL:
|
|
||||||
return DB_CORRUPTION;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dict_index_t* index = m_pcur.btr_cur.index;
|
|
||||||
buf_block_t* next_block = btr_block_get(
|
|
||||||
*index, next_page, BTR_MODIFY_LEAF, false,
|
|
||||||
&m_mtr);
|
|
||||||
|
|
||||||
if (UNIV_UNLIKELY(!next_block
|
|
||||||
|| !fil_page_index_page_check(
|
|
||||||
next_block->page.frame)
|
|
||||||
|| !!dict_index_is_spatial(index)
|
|
||||||
!= (fil_page_get_type(
|
|
||||||
next_block->page.frame)
|
|
||||||
== FIL_PAGE_RTREE)
|
|
||||||
|| page_is_comp(next_block->page.frame)
|
|
||||||
!= page_is_comp(block->page.frame)
|
|
||||||
|| btr_page_get_prev(
|
|
||||||
next_block->page.frame)
|
|
||||||
!= block->page.id().page_no())) {
|
|
||||||
return DB_CORRUPTION;
|
|
||||||
}
|
|
||||||
|
|
||||||
btr_leaf_page_release(block, BTR_MODIFY_LEAF, &m_mtr);
|
|
||||||
|
|
||||||
page_cur_set_before_first(next_block,
|
|
||||||
&m_pcur.btr_cur.page_cur);
|
|
||||||
|
|
||||||
ut_d(page_check_dir(next_block->page.frame));
|
|
||||||
} else {
|
} else {
|
||||||
btr_pcur_move_to_next_on_page(&m_pcur);
|
btr_pcur_move_to_next_on_page(&m_pcur);
|
||||||
}
|
}
|
||||||
@@ -2335,11 +2285,11 @@ row_import_set_sys_max_row_id(
|
|||||||
|
|
||||||
if (btr_pcur_open_at_index_side(false, index, BTR_SEARCH_LEAF,
|
if (btr_pcur_open_at_index_side(false, index, BTR_SEARCH_LEAF,
|
||||||
&pcur, true, 0, &mtr) == DB_SUCCESS) {
|
&pcur, true, 0, &mtr) == DB_SUCCESS) {
|
||||||
btr_pcur_move_to_prev_on_page(&pcur);
|
rec = btr_pcur_move_to_prev_on_page(&pcur);
|
||||||
rec = btr_pcur_get_rec(&pcur);
|
|
||||||
|
|
||||||
/* Check for empty table. */
|
if (!rec) {
|
||||||
if (page_rec_is_infimum(rec)) {
|
/* The table is corrupted. */
|
||||||
|
} else if (page_rec_is_infimum(rec)) {
|
||||||
/* The table is empty. */
|
/* The table is empty. */
|
||||||
} else if (rec_is_metadata(rec, *index)) {
|
} else if (rec_is_metadata(rec, *index)) {
|
||||||
/* The clustered index contains the metadata
|
/* The clustered index contains the metadata
|
||||||
|
@@ -139,7 +139,10 @@ public:
|
|||||||
|
|
||||||
if (log_sys.check_flush_or_checkpoint()) {
|
if (log_sys.check_flush_or_checkpoint()) {
|
||||||
if (mtr_started) {
|
if (mtr_started) {
|
||||||
btr_pcur_move_to_prev_on_page(pcur);
|
if (!btr_pcur_move_to_prev_on_page(pcur)) {
|
||||||
|
error = DB_CORRUPTION;
|
||||||
|
break;
|
||||||
|
}
|
||||||
btr_pcur_store_position(pcur, scan_mtr);
|
btr_pcur_store_position(pcur, scan_mtr);
|
||||||
scan_mtr->commit();
|
scan_mtr->commit();
|
||||||
mtr_started = false;
|
mtr_started = false;
|
||||||
@@ -2010,14 +2013,27 @@ row_merge_read_clustered_index(
|
|||||||
err_exit:
|
err_exit:
|
||||||
trx->error_key_num = 0;
|
trx->error_key_num = 0;
|
||||||
goto func_exit;
|
goto func_exit;
|
||||||
}
|
|
||||||
btr_pcur_move_to_next_user_rec(&pcur, &mtr);
|
|
||||||
if (rec_is_metadata(btr_pcur_get_rec(&pcur), *clust_index)) {
|
|
||||||
ut_ad(btr_pcur_is_on_user_rec(&pcur));
|
|
||||||
/* Skip the metadata pseudo-record. */
|
|
||||||
} else {
|
} else {
|
||||||
ut_ad(!clust_index->is_instant());
|
rec_t* rec = page_rec_get_next(btr_pcur_get_rec(&pcur));
|
||||||
btr_pcur_move_to_prev_on_page(&pcur);
|
if (!rec) {
|
||||||
|
corrupted_metadata:
|
||||||
|
err = DB_CORRUPTION;
|
||||||
|
goto err_exit;
|
||||||
|
}
|
||||||
|
if (rec_get_info_bits(rec, page_rec_is_comp(rec))
|
||||||
|
& REC_INFO_MIN_REC_FLAG) {
|
||||||
|
if (!clust_index->is_instant()) {
|
||||||
|
goto corrupted_metadata;
|
||||||
|
}
|
||||||
|
if (page_rec_is_comp(rec)
|
||||||
|
&& rec_get_status(rec) != REC_STATUS_INSTANT) {
|
||||||
|
goto corrupted_metadata;
|
||||||
|
}
|
||||||
|
/* Skip the metadata pseudo-record. */
|
||||||
|
btr_pcur_get_page_cur(&pcur)->rec = rec;
|
||||||
|
} else if (clust_index->is_instant()) {
|
||||||
|
goto corrupted_metadata;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check if the table is supposed to be empty for our read view.
|
/* Check if the table is supposed to be empty for our read view.
|
||||||
@@ -2157,13 +2173,16 @@ err_exit:
|
|||||||
|
|
||||||
/* Store the cursor position on the last user
|
/* Store the cursor position on the last user
|
||||||
record on the page. */
|
record on the page. */
|
||||||
btr_pcur_move_to_prev_on_page(&pcur);
|
if (!btr_pcur_move_to_prev_on_page(&pcur)) {
|
||||||
|
goto corrupted_index;
|
||||||
|
}
|
||||||
/* Leaf pages must never be empty, unless
|
/* Leaf pages must never be empty, unless
|
||||||
this is the only page in the index tree. */
|
this is the only page in the index tree. */
|
||||||
ut_ad(btr_pcur_is_on_user_rec(&pcur)
|
if (!btr_pcur_is_on_user_rec(&pcur)
|
||||||
|| btr_pcur_get_block(
|
&& btr_pcur_get_block(&pcur)->page.id()
|
||||||
&pcur)->page.id().page_no()
|
.page_no() != clust_index->page) {
|
||||||
== clust_index->page);
|
goto corrupted_index;
|
||||||
|
}
|
||||||
|
|
||||||
btr_pcur_store_position(&pcur, &mtr);
|
btr_pcur_store_position(&pcur, &mtr);
|
||||||
mtr.commit();
|
mtr.commit();
|
||||||
@@ -2666,8 +2685,10 @@ write_buffers:
|
|||||||
we must reread it on the next
|
we must reread it on the next
|
||||||
loop iteration. */
|
loop iteration. */
|
||||||
if (mtr_started) {
|
if (mtr_started) {
|
||||||
btr_pcur_move_to_prev_on_page(
|
if (!btr_pcur_move_to_prev_on_page(&pcur)) {
|
||||||
&pcur);
|
err = DB_CORRUPTION;
|
||||||
|
goto func_exit;
|
||||||
|
}
|
||||||
btr_pcur_store_position(
|
btr_pcur_store_position(
|
||||||
&pcur, &mtr);
|
&pcur, &mtr);
|
||||||
|
|
||||||
|
@@ -4715,6 +4715,15 @@ wait_table_again:
|
|||||||
pcur, moves_up, &mtr);
|
pcur, moves_up, &mtr);
|
||||||
|
|
||||||
if (UNIV_UNLIKELY(need_to_process)) {
|
if (UNIV_UNLIKELY(need_to_process)) {
|
||||||
|
if (UNIV_UNLIKELY(!btr_pcur_get_rec(pcur))) {
|
||||||
|
mtr.commit();
|
||||||
|
trx->op_info = "";
|
||||||
|
if (UNIV_LIKELY_NULL(heap)) {
|
||||||
|
mem_heap_free(heap);
|
||||||
|
}
|
||||||
|
return DB_CORRUPTION;
|
||||||
|
}
|
||||||
|
|
||||||
if (UNIV_UNLIKELY(prebuilt->row_read_type
|
if (UNIV_UNLIKELY(prebuilt->row_read_type
|
||||||
== ROW_READ_DID_SEMI_CONSISTENT)) {
|
== ROW_READ_DID_SEMI_CONSISTENT)) {
|
||||||
/* We did a semi-consistent read,
|
/* We did a semi-consistent read,
|
||||||
@@ -4732,7 +4741,7 @@ wait_table_again:
|
|||||||
pessimistic locking read, the record
|
pessimistic locking read, the record
|
||||||
cannot be skipped. */
|
cannot be skipped. */
|
||||||
|
|
||||||
goto next_rec;
|
goto next_rec_after_check;
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (dtuple_get_n_fields(search_tuple) > 0) {
|
} else if (dtuple_get_n_fields(search_tuple) > 0) {
|
||||||
@@ -5727,6 +5736,7 @@ next_rec:
|
|||||||
== ROW_READ_DID_SEMI_CONSISTENT)) {
|
== ROW_READ_DID_SEMI_CONSISTENT)) {
|
||||||
prebuilt->row_read_type = ROW_READ_TRY_SEMI_CONSISTENT;
|
prebuilt->row_read_type = ROW_READ_TRY_SEMI_CONSISTENT;
|
||||||
}
|
}
|
||||||
|
next_rec_after_check:
|
||||||
did_semi_consistent_read = false;
|
did_semi_consistent_read = false;
|
||||||
prebuilt->new_rec_locks = 0;
|
prebuilt->new_rec_locks = 0;
|
||||||
vrow = NULL;
|
vrow = NULL;
|
||||||
@@ -5752,7 +5762,6 @@ next_rec:
|
|||||||
/* No need to do store restore for R-tree */
|
/* No need to do store restore for R-tree */
|
||||||
mtr.commit();
|
mtr.commit();
|
||||||
mtr.start();
|
mtr.start();
|
||||||
mtr_extra_clust_savepoint = 0;
|
|
||||||
} else if (mtr_extra_clust_savepoint) {
|
} else if (mtr_extra_clust_savepoint) {
|
||||||
/* We must release any clustered index latches
|
/* We must release any clustered index latches
|
||||||
if we are moving to the next non-clustered
|
if we are moving to the next non-clustered
|
||||||
@@ -5760,9 +5769,10 @@ next_rec:
|
|||||||
order if we would access a different clustered
|
order if we would access a different clustered
|
||||||
index page right away without releasing the previous. */
|
index page right away without releasing the previous. */
|
||||||
mtr.rollback_to_savepoint(mtr_extra_clust_savepoint);
|
mtr.rollback_to_savepoint(mtr_extra_clust_savepoint);
|
||||||
mtr_extra_clust_savepoint = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mtr_extra_clust_savepoint = 0;
|
||||||
|
|
||||||
if (moves_up) {
|
if (moves_up) {
|
||||||
if (UNIV_UNLIKELY(spatial_search)) {
|
if (UNIV_UNLIKELY(spatial_search)) {
|
||||||
if (rtr_pcur_move_to_next(
|
if (rtr_pcur_move_to_next(
|
||||||
@@ -5792,6 +5802,10 @@ next_rec:
|
|||||||
if (btr_pcur_move_to_prev(pcur, &mtr)) {
|
if (btr_pcur_move_to_prev(pcur, &mtr)) {
|
||||||
goto rec_loop;
|
goto rec_loop;
|
||||||
}
|
}
|
||||||
|
if (UNIV_UNLIKELY(!btr_pcur_get_rec(pcur))) {
|
||||||
|
err = DB_CORRUPTION;
|
||||||
|
goto normal_return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
not_moved:
|
not_moved:
|
||||||
|
@@ -449,9 +449,6 @@ ut_strerr(
|
|||||||
return("Table is compressed or encrypted but uncompress or decrypt failed.");
|
return("Table is compressed or encrypted but uncompress or decrypt failed.");
|
||||||
case DB_IO_PARTIAL_FAILED:
|
case DB_IO_PARTIAL_FAILED:
|
||||||
return("Partial IO failed");
|
return("Partial IO failed");
|
||||||
case DB_FORCED_ABORT:
|
|
||||||
return("Transaction aborted by another higher priority "
|
|
||||||
"transaction");
|
|
||||||
case DB_COMPUTE_VALUE_FAILED:
|
case DB_COMPUTE_VALUE_FAILED:
|
||||||
return("Compute generated column failed");
|
return("Compute generated column failed");
|
||||||
case DB_NO_FK_ON_S_BASE_COL:
|
case DB_NO_FK_ON_S_BASE_COL:
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user