mirror of
https://github.com/MariaDB/server.git
synced 2025-01-15 19:42:28 +01:00
Merge 10.3 into 10.4
This commit is contained in:
commit
02979daab4
76 changed files with 4013 additions and 519 deletions
|
@ -170,7 +170,7 @@ debug_cflags="-DEXTRA_DEBUG -DSAFE_MUTEX -DSAFEMALLOC"
|
|||
error_inject="--with-error-inject "
|
||||
#
|
||||
# Base C++ flags for all builds
|
||||
base_cxxflags="-felide-constructors -fexceptions -fno-rtti"
|
||||
base_cxxflags="-felide-constructors -fexceptions"
|
||||
#
|
||||
# Flags for optimizing builds.
|
||||
# Be as fast as we can be without losing our ability to backtrace.
|
||||
|
|
|
@ -48,7 +48,7 @@ if test -z "$CXX" ; then
|
|||
# Set some required compile options
|
||||
if test -z "$CXXFLAGS" ; then
|
||||
export CXXFLAGS
|
||||
CXXFLAGS="-felide-constructors -fno-exceptions -fno-rtti"
|
||||
CXXFLAGS="-felide-constructors -fno-exceptions"
|
||||
fi
|
||||
fi
|
||||
|
||||
|
|
|
@ -34,7 +34,7 @@ extra_flags="$fast_cflags -unroll2 -ip -mp -restrict"
|
|||
# IPO link: can not find "-lstdc++_shared"
|
||||
# icpc: error: problem during multi-file optimization compilation (code 1)
|
||||
extra_flags="$extra_flags -no-ipo"
|
||||
base_cxxflags="-fno-exceptions -fno-rtti"
|
||||
base_cxxflags="-fno-exceptions"
|
||||
extra_configs="$pentium_configs $static_link $disable_64_bit_plugins"
|
||||
|
||||
. "$path/FINISH.sh"
|
||||
|
|
|
@ -34,7 +34,7 @@ extra_flags="$fast_cflags -unroll2 -ip -mp -restrict"
|
|||
# IPO link: can not find "-lstdc++_shared"
|
||||
# icpc: error: problem during multi-file optimization compilation (code 1)
|
||||
extra_flags="$extra_flags -no-ipo"
|
||||
base_cxxflags="-fno-exceptions -fno-rtti"
|
||||
base_cxxflags="-fno-exceptions"
|
||||
extra_configs="$pentium_configs $static_link --with-yassl"
|
||||
|
||||
. "$path/FINISH.sh"
|
||||
|
|
|
@ -8,7 +8,7 @@ path=`dirname $0`
|
|||
. "$path/autorun.sh"
|
||||
|
||||
export PATH=/usr/local/pgcc/bin:$PATH
|
||||
CFLAGS="-Wimplicit -Wreturn-type -Wid-clash-51 -Wswitch -Wtrigraphs -Wcomment -W -Wchar-subscripts -Wformat -Wimplicit-function-dec -Wimplicit-int -Wparentheses -Wsign-compare -Wwrite-strings -Wunused -O6 -mpentiumpro -fomit-frame-pointer -mstack-align-double" CXX=g++ CXXFLAGS="-Wimplicit -Wreturn-type -Wid-clash-51 -Wswitch -Wtrigraphs -Wcomment -W -Wchar-subscripts -Wformat -Wimplicit-function-dec -Wimplicit-int -Wparentheses -Wsign-compare -Wwrite-strings -Woverloaded-virtual -Wextern-inline -Wsign-promo -Wreorder -Wctor-dtor-privacy -Wnon-virtual-dtor -felide-constructors -fno-exceptions -fno-rtti -O6 -fomit-frame-pointer -mpentiumpro -mstack-align-double" ./configure --prefix=/usr/local/mysql --enable-assembler --with-extra-charsets=complex --enable-thread-safe-client --with-mysqld-ldflags=-all-static --with-client-ldflags=-all-static
|
||||
CFLAGS="-Wimplicit -Wreturn-type -Wid-clash-51 -Wswitch -Wtrigraphs -Wcomment -W -Wchar-subscripts -Wformat -Wimplicit-function-dec -Wimplicit-int -Wparentheses -Wsign-compare -Wwrite-strings -Wunused -O6 -mpentiumpro -fomit-frame-pointer -mstack-align-double" CXX=g++ CXXFLAGS="-Wimplicit -Wreturn-type -Wid-clash-51 -Wswitch -Wtrigraphs -Wcomment -W -Wchar-subscripts -Wformat -Wimplicit-function-dec -Wimplicit-int -Wparentheses -Wsign-compare -Wwrite-strings -Woverloaded-virtual -Wextern-inline -Wsign-promo -Wreorder -Wctor-dtor-privacy -Wnon-virtual-dtor -felide-constructors -fno-exceptions -O6 -fomit-frame-pointer -mpentiumpro -mstack-align-double" ./configure --prefix=/usr/local/mysql --enable-assembler --with-extra-charsets=complex --enable-thread-safe-client --with-mysqld-ldflags=-all-static --with-client-ldflags=-all-static
|
||||
|
||||
gmake -j 4
|
||||
|
||||
|
|
|
@ -57,7 +57,7 @@ extra_flags="$pentium_cflags $debug_cflags $valgrind_flags"
|
|||
|
||||
c_warnings="-Wall -Wcheck -wd161,444,279,810,981,1292,1469,1572"
|
||||
cxx_warnings="$c_warnings -wd869,874"
|
||||
base_cxxflags="-fno-exceptions -fno-rtti"
|
||||
base_cxxflags="-fno-exceptions"
|
||||
extra_configs="$pentium_configs $debug_configs $valgrind_configs"
|
||||
|
||||
. "$path/FINISH.sh"
|
||||
|
|
|
@ -24,6 +24,6 @@ PATH=$PATH:/usr/ccs/bin:/usr/local/bin
|
|||
path=`dirname $0`
|
||||
. "$path/autorun.sh"
|
||||
|
||||
CFLAGS="-g -Wimplicit -Wreturn-type -Wswitch -Wtrigraphs -Wcomment -W -Wchar-subscripts -Wformat -Wparentheses -Wsign-compare -Wwrite-strings -Wunused -O3 -fno-omit-frame-pointer -mcpu=v8 -Wa,-xarch=v8plusa $EXTRA_FLAGS $EXTRA_CFLAGS" CXX=g++ CXXFLAGS="-Wimplicit -Wreturn-type -Wswitch -Wtrigraphs -Wcomment -W -Wchar-subscripts -Wformat -Wparentheses -Wsign-compare -Wwrite-strings -Woverloaded-virtual -Wsign-promo -Wreorder -Wctor-dtor-privacy -Wnon-virtual-dtor -felide-constructors -fno-exceptions -fno-rtti -O3 -fno-omit-frame-pointer -mcpu=v8 -Wa,-xarch=v8plusa -g $EXTRA_FLAGS $EXTRA_CXXFLAGS" LIBS="-lmtmalloc" ./configure --prefix=/usr/local/mysql --enable-assembler --with-extra-charsets=complex --enable-thread-safe-client
|
||||
CFLAGS="-g -Wimplicit -Wreturn-type -Wswitch -Wtrigraphs -Wcomment -W -Wchar-subscripts -Wformat -Wparentheses -Wsign-compare -Wwrite-strings -Wunused -O3 -fno-omit-frame-pointer -mcpu=v8 -Wa,-xarch=v8plusa $EXTRA_FLAGS $EXTRA_CFLAGS" CXX=g++ CXXFLAGS="-Wimplicit -Wreturn-type -Wswitch -Wtrigraphs -Wcomment -W -Wchar-subscripts -Wformat -Wparentheses -Wsign-compare -Wwrite-strings -Woverloaded-virtual -Wsign-promo -Wreorder -Wctor-dtor-privacy -Wnon-virtual-dtor -felide-constructors -fno-exceptions -O3 -fno-omit-frame-pointer -mcpu=v8 -Wa,-xarch=v8plusa -g $EXTRA_FLAGS $EXTRA_CXXFLAGS" LIBS="-lmtmalloc" ./configure --prefix=/usr/local/mysql --enable-assembler --with-extra-charsets=complex --enable-thread-safe-client
|
||||
|
||||
make -j 4
|
||||
|
|
|
@ -6,6 +6,6 @@ make -k clean || true
|
|||
path=`dirname $0`
|
||||
. "$path/autorun.sh"
|
||||
|
||||
CFLAGS="-g -Wimplicit -Wreturn-type -Wswitch -Wtrigraphs -Wcomment -W -Wchar-subscripts -Wformat -Wparentheses -Wsign-compare -Wwrite-strings -Wunused -O3 -fno-omit-frame-pointer" CXX=g++ CXXFLAGS="-g -Wimplicit -Wreturn-type -Wswitch -Wtrigraphs -Wcomment -W -Wchar-subscripts -Wformat -Wparentheses -Wsign-compare -Wwrite-strings -Woverloaded-virtual -Wsign-promo -Wreorder -Wctor-dtor-privacy -Wnon-virtual-dtor -felide-constructors -fno-exceptions -fno-rtti -O3 -fno-omit-frame-pointer" ./configure --prefix=/usr/local/mysql --enable-assembler --with-extra-charsets=complex --enable-thread-safe-client --with-debug
|
||||
CFLAGS="-g -Wimplicit -Wreturn-type -Wswitch -Wtrigraphs -Wcomment -W -Wchar-subscripts -Wformat -Wparentheses -Wsign-compare -Wwrite-strings -Wunused -O3 -fno-omit-frame-pointer" CXX=g++ CXXFLAGS="-g -Wimplicit -Wreturn-type -Wswitch -Wtrigraphs -Wcomment -W -Wchar-subscripts -Wformat -Wparentheses -Wsign-compare -Wwrite-strings -Woverloaded-virtual -Wsign-promo -Wreorder -Wctor-dtor-privacy -Wnon-virtual-dtor -felide-constructors -fno-exceptions -O3 -fno-omit-frame-pointer" ./configure --prefix=/usr/local/mysql --enable-assembler --with-extra-charsets=complex --enable-thread-safe-client --with-debug
|
||||
|
||||
make -j 4
|
||||
|
|
|
@ -37,7 +37,7 @@ make -k maintainer-clean || true
|
|||
path=`dirname $0`
|
||||
. "$path/autorun.sh"
|
||||
|
||||
CFLAGS="-g -Wimplicit -Wreturn-type -Wswitch -Wtrigraphs -Wcomment -W -Wchar-subscripts -Wformat -Wimplicit-int -Wparentheses -Wsign-compare -Wwrite-strings -Wunused -DHAVE_valgrind -DEXTRA_DEBUG -O2" CXX=g++ CXXLD=g++ CXXFLAGS="-g -Wimplicit -Wreturn-type -Wswitch -Wtrigraphs -Wcomment -W -Wchar-subscripts -Wformat -Wparentheses -Wsign-compare -Wwrite-strings -Woverloaded-virtual -Wsign-promo -Wreorder -Wctor-dtor-privacy -Wnon-virtual-dtor -felide-constructors -fno-exceptions -fno-rtti -DHAVE_valgrind -DEXTRA_DEBUG -O2" ./configure --prefix=/usr/local/mysql --enable-assembler --with-extra-charsets=complex --enable-thread-safe-client --with-embedded-server --with-innodb $EXTRA_CONFIG_FLAGS
|
||||
CFLAGS="-g -Wimplicit -Wreturn-type -Wswitch -Wtrigraphs -Wcomment -W -Wchar-subscripts -Wformat -Wimplicit-int -Wparentheses -Wsign-compare -Wwrite-strings -Wunused -DHAVE_valgrind -DEXTRA_DEBUG -O2" CXX=g++ CXXLD=g++ CXXFLAGS="-g -Wimplicit -Wreturn-type -Wswitch -Wtrigraphs -Wcomment -W -Wchar-subscripts -Wformat -Wparentheses -Wsign-compare -Wwrite-strings -Woverloaded-virtual -Wsign-promo -Wreorder -Wctor-dtor-privacy -Wnon-virtual-dtor -felide-constructors -fno-exceptions -DHAVE_valgrind -DEXTRA_DEBUG -O2" ./configure --prefix=/usr/local/mysql --enable-assembler --with-extra-charsets=complex --enable-thread-safe-client --with-embedded-server --with-innodb $EXTRA_CONFIG_FLAGS
|
||||
|
||||
make -j 4
|
||||
|
||||
|
|
|
@ -40,6 +40,7 @@
|
|||
#include "my_readline.h"
|
||||
#include <signal.h>
|
||||
#include <violite.h>
|
||||
#include <my_sys.h>
|
||||
#include <source_revision.h>
|
||||
#if defined(USE_LIBEDIT_INTERFACE) && defined(HAVE_LOCALE_H)
|
||||
#include <locale.h>
|
||||
|
@ -4694,7 +4695,8 @@ sql_real_connect(char *host,char *database,char *user,char *password,
|
|||
select_limit,max_join_size);
|
||||
mysql_options(&mysql, MYSQL_INIT_COMMAND, init_command);
|
||||
}
|
||||
|
||||
if (!strcmp(default_charset,MYSQL_AUTODETECT_CHARSET_NAME))
|
||||
default_charset= (char *)my_default_csname();
|
||||
mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, default_charset);
|
||||
|
||||
my_bool can_handle_expired= opt_connect_expired_password || !status.batch;
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Copyright (c) 2000, 2014, Oracle and/or its affiliates.
|
||||
Copyright (c) 2010, 2017, MariaDB
|
||||
Copyright (c) 2010, 2019, MariaDB
|
||||
|
||||
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
|
||||
|
@ -26,6 +26,7 @@
|
|||
#include <welcome_copyright_notice.h>
|
||||
#include <my_rnd.h>
|
||||
#include <password.h>
|
||||
#include <my_sys.h>
|
||||
|
||||
#define ADMIN_VERSION "9.1"
|
||||
#define MAX_MYSQL_VAR 512
|
||||
|
@ -366,6 +367,8 @@ int main(int argc,char *argv[])
|
|||
#endif
|
||||
if (opt_protocol)
|
||||
mysql_options(&mysql,MYSQL_OPT_PROTOCOL,(char*)&opt_protocol);
|
||||
if (!strcmp(default_charset,MYSQL_AUTODETECT_CHARSET_NAME))
|
||||
default_charset= (char *)my_default_csname();
|
||||
mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, default_charset);
|
||||
error_flags= (myf)(opt_nobeep ? 0 : ME_BELL);
|
||||
|
||||
|
|
|
@ -434,8 +434,10 @@ static int get_options(int *argc, char ***argv)
|
|||
else
|
||||
default_charset= (char*) MYSQL_AUTODETECT_CHARSET_NAME;
|
||||
}
|
||||
if (strcmp(default_charset, MYSQL_AUTODETECT_CHARSET_NAME) &&
|
||||
!get_charset_by_csname(default_charset, MY_CS_PRIMARY, MYF(MY_WME)))
|
||||
if (!strcmp(default_charset, MYSQL_AUTODETECT_CHARSET_NAME))
|
||||
default_charset= (char *)my_default_csname();
|
||||
|
||||
if (!get_charset_by_csname(default_charset, MY_CS_PRIMARY, MYF(MY_WME)))
|
||||
{
|
||||
printf("Unsupported character set: %s\n", default_charset);
|
||||
DBUG_RETURN(1);
|
||||
|
|
|
@ -30,6 +30,8 @@
|
|||
#define IMPORT_VERSION "3.7"
|
||||
|
||||
#include "client_priv.h"
|
||||
#include <my_sys.h>
|
||||
|
||||
#include "mysql_version.h"
|
||||
|
||||
#include <welcome_copyright_notice.h> /* ORACLE_WELCOME_COPYRIGHT_NOTICE */
|
||||
|
@ -461,8 +463,9 @@ static MYSQL *db_connect(char *host, char *database,
|
|||
|
||||
if (opt_default_auth && *opt_default_auth)
|
||||
mysql_options(mysql, MYSQL_DEFAULT_AUTH, opt_default_auth);
|
||||
|
||||
mysql_options(mysql, MYSQL_SET_CHARSET_NAME, default_charset);
|
||||
if (!strcmp(default_charset,MYSQL_AUTODETECT_CHARSET_NAME))
|
||||
default_charset= (char *)my_default_csname();
|
||||
mysql_options(mysql, MYSQL_SET_CHARSET_NAME, my_default_csname());
|
||||
mysql_options(mysql, MYSQL_OPT_CONNECT_ATTR_RESET, 0);
|
||||
mysql_options4(mysql, MYSQL_OPT_CONNECT_ATTR_ADD,
|
||||
"program_name", "mysqlimport");
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
Copyright (c) 2000, 2015, Oracle and/or its affiliates.
|
||||
Copyright (c) 2010, 2017, MariaDB
|
||||
Copyright (c) 2010, 2019, MariaDB
|
||||
|
||||
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
|
||||
|
@ -130,6 +130,8 @@ int main(int argc, char **argv)
|
|||
if (opt_protocol)
|
||||
mysql_options(&mysql,MYSQL_OPT_PROTOCOL,(char*)&opt_protocol);
|
||||
|
||||
if (!strcmp(default_charset,MYSQL_AUTODETECT_CHARSET_NAME))
|
||||
default_charset= (char *)my_default_csname();
|
||||
mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, default_charset);
|
||||
|
||||
if (opt_plugin_dir && *opt_plugin_dir)
|
||||
|
|
|
@ -1049,6 +1049,7 @@ extern char *get_tty_password(const char *opt_message);
|
|||
/* File system character set */
|
||||
extern CHARSET_INFO *fs_character_set(void);
|
||||
#endif
|
||||
extern const char *my_default_csname(void);
|
||||
extern size_t escape_quotes_for_mysql(CHARSET_INFO *charset_info,
|
||||
char *to, size_t to_length,
|
||||
const char *from, size_t length);
|
||||
|
|
61
mysql-test/include/column_compression_syntax_varbinary.inc
Normal file
61
mysql-test/include/column_compression_syntax_varbinary.inc
Normal file
|
@ -0,0 +1,61 @@
|
|||
--echo #
|
||||
--echo # The following statements run without warnings.
|
||||
--echo #
|
||||
|
||||
--eval CREATE TABLE t1 (a $type COMPRESSED)
|
||||
SHOW CREATE TABLE t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # The following statements run without warnings.
|
||||
--echo # They have extra column attributes (or GENERATED) after COMPRESSED.
|
||||
--echo #
|
||||
|
||||
--eval CREATE TABLE t1 (a $type COMPRESSED DEFAULT '')
|
||||
SHOW CREATE TABLE t1;
|
||||
DROP TABLE t1;
|
||||
--eval CREATE TABLE t1 (a $type COMPRESSED NULL)
|
||||
SHOW CREATE TABLE t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
--eval CREATE TABLE t1 (a $type COMPRESSED GENERATED ALWAYS AS (REPEAT('a',10)))
|
||||
SHOW CREATE TABLE t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # The following statements return deprecated syntax warnings
|
||||
--echo #
|
||||
|
||||
--eval CREATE TABLE t1 (a $type DEFAULT '' COMPRESSED)
|
||||
SHOW CREATE TABLE t1;
|
||||
DROP TABLE t1;
|
||||
--eval CREATE TABLE t1 (a $type NULL COMPRESSED)
|
||||
SHOW CREATE TABLE t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # The following statements fail by the grammar,
|
||||
--echo # because COMPRESSED immediately follows 'field_type'.
|
||||
--echo #
|
||||
|
||||
--error ER_PARSE_ERROR
|
||||
--eval CREATE TABLE t1 (a $type COMPRESSED COMPRESSED)
|
||||
|
||||
--echo #
|
||||
--echo # The following statements are not prohibited by the *.yy grammar,
|
||||
--echo # because the sequence `field_type attribute COMPRESSED` is allowed
|
||||
--echo # (notice there is at least one attribute after `field_type`).
|
||||
--echo # The first COMPRESSED is parsed inside `field_type`.
|
||||
--echo # The second COMPRESSED passes through the parser but then is caught
|
||||
--echo # inside Column_definition::set_compressed_deprecated_with_type_check()
|
||||
--echo # and a syntax error is raised.
|
||||
--echo #
|
||||
|
||||
--error ER_PARSE_ERROR
|
||||
--eval CREATE TABLE t1 (a $type COMPRESSED DEFAULT '' COMPRESSED)
|
||||
--error ER_PARSE_ERROR
|
||||
--eval CREATE TABLE t1 (a $type COMPRESSED NULL COMPRESSED)
|
||||
--error ER_PARSE_ERROR
|
99
mysql-test/include/column_compression_syntax_varchar.inc
Normal file
99
mysql-test/include/column_compression_syntax_varchar.inc
Normal file
|
@ -0,0 +1,99 @@
|
|||
--echo #
|
||||
--echo # The following statements run without warnings.
|
||||
--echo # The `compressed opt_binary` grammar sequence is covered.
|
||||
--echo #
|
||||
|
||||
--eval CREATE TABLE t1 (a $type COMPRESSED)
|
||||
SHOW CREATE TABLE t1;
|
||||
DROP TABLE t1;
|
||||
--eval CREATE TABLE t1 (a $type COMPRESSED BINARY)
|
||||
SHOW CREATE TABLE t1;
|
||||
DROP TABLE t1;
|
||||
--eval CREATE TABLE t1 (a $type COMPRESSED BINARY ASCII)
|
||||
SHOW CREATE TABLE t1;
|
||||
DROP TABLE t1;
|
||||
--eval CREATE TABLE t1 (a $type COMPRESSED BYTE)
|
||||
SHOW CREATE TABLE t1;
|
||||
DROP TABLE t1;
|
||||
--eval CREATE TABLE t1 (a $type COMPRESSED ASCII)
|
||||
SHOW CREATE TABLE t1;
|
||||
DROP TABLE t1;
|
||||
--eval CREATE TABLE t1 (a $type COMPRESSED UNICODE)
|
||||
SHOW CREATE TABLE t1;
|
||||
DROP TABLE t1;
|
||||
--eval CREATE TABLE t1 (a $type COMPRESSED CHARACTER SET utf8)
|
||||
SHOW CREATE TABLE t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # The following statements run without warnings.
|
||||
--echo # They have extra column attributes (or GENERATED) after COMPRESSED.
|
||||
--echo #
|
||||
|
||||
--eval CREATE TABLE t1 (a $type COMPRESSED BYTE DEFAULT '')
|
||||
SHOW CREATE TABLE t1;
|
||||
DROP TABLE t1;
|
||||
--eval CREATE TABLE t1 (a $type COMPRESSED BINARY DEFAULT '')
|
||||
SHOW CREATE TABLE t1;
|
||||
DROP TABLE t1;
|
||||
--eval CREATE TABLE t1 (a $type COMPRESSED ASCII DEFAULT '')
|
||||
SHOW CREATE TABLE t1;
|
||||
DROP TABLE t1;
|
||||
--eval CREATE TABLE t1 (a $type COMPRESSED CHARACTER SET utf8 DEFAULT '')
|
||||
SHOW CREATE TABLE t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
--eval CREATE TABLE t1 (a $type COMPRESSED CHARACTER SET utf8 GENERATED ALWAYS AS (REPEAT('a',100)))
|
||||
SHOW CREATE TABLE t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # The following statements return deprecated syntax warnings
|
||||
--echo #
|
||||
|
||||
--eval CREATE TABLE t1 (a $type BINARY COMPRESSED)
|
||||
SHOW CREATE TABLE t1;
|
||||
DROP TABLE t1;
|
||||
--eval CREATE TABLE t1 (a $type ASCII COMPRESSED)
|
||||
SHOW CREATE TABLE t1;
|
||||
DROP TABLE t1;
|
||||
--eval CREATE TABLE t1 (a $type BYTE COMPRESSED)
|
||||
SHOW CREATE TABLE t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # The following statements fail by the grammar,
|
||||
--echo # because COMPRESSED immediately follows 'field_type'.
|
||||
--echo #
|
||||
|
||||
--error ER_PARSE_ERROR
|
||||
--eval CREATE TABLE t1 (a $type COMPRESSED BYTE COMPRESSED)
|
||||
--error ER_PARSE_ERROR
|
||||
--eval CREATE TABLE t1 (a $type COMPRESSED BINARY COMPRESSED)
|
||||
--error ER_PARSE_ERROR
|
||||
--eval CREATE TABLE t1 (a $type COMPRESSED ASCII COMPRESSED)
|
||||
--error ER_PARSE_ERROR
|
||||
--eval CREATE TABLE t1 (a $type COMPRESSED CHARACTER SET utf8 COMPRESSED)
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # The following statements are not prohibited by the *.yy grammar,
|
||||
--echo # because the sequence `field_type attribute COMPRESSED` is allowed
|
||||
--echo # (notice there is at least one attribute after `field_type`).
|
||||
--echo # The first COMPRESSED is parsed inside `field_type`.
|
||||
--echo # The second COMPRESSED passes through the parser but then is caught
|
||||
--echo # inside Column_definition::set_compressed_deprecated_with_type_check()
|
||||
--echo # and a syntax error is raised.
|
||||
--echo #
|
||||
|
||||
--error ER_PARSE_ERROR
|
||||
--eval CREATE TABLE t1 (a $type COMPRESSED BYTE DEFAULT '' COMPRESSED)
|
||||
--error ER_PARSE_ERROR
|
||||
--eval CREATE TABLE t1 (a $type COMPRESSED BINARY DEFAULT '' COMPRESSED)
|
||||
--error ER_PARSE_ERROR
|
||||
--eval CREATE TABLE t1 (a $type COMPRESSED ASCII DEFAULT '' COMPRESSED)
|
||||
--error ER_PARSE_ERROR
|
||||
--eval CREATE TABLE t1 (a $type COMPRESSED CHARACTER SET utf8 DEFAULT '' COMPRESSED)
|
2
mysql-test/main/charset_client_win.result
Normal file
2
mysql-test/main/charset_client_win.result
Normal file
|
@ -0,0 +1,2 @@
|
|||
@@character_set_client
|
||||
cp1257
|
2
mysql-test/main/charset_client_win.test
Normal file
2
mysql-test/main/charset_client_win.test
Normal file
|
@ -0,0 +1,2 @@
|
|||
--source include/windows.inc
|
||||
--exec chcp 1257 > NUL && $MYSQL --default-character-set=auto -e "select @@character_set_client"
|
File diff suppressed because it is too large
Load diff
|
@ -20,7 +20,7 @@ let $typec= VARCHAR(10000) COMPRESSED;
|
|||
let $typeu= VARCHAR(10000);
|
||||
--source column_compression.inc
|
||||
|
||||
let $typec= TEXT CHARSET ucs2 COMPRESSED;
|
||||
let $typec= TEXT COMPRESSED CHARSET ucs2;
|
||||
let $typeu= TEXT;
|
||||
--source column_compression.inc
|
||||
|
||||
|
@ -29,21 +29,25 @@ let $typec= BLOB COMPRESSED;
|
|||
let $typeu= BLOB;
|
||||
--source column_compression.inc
|
||||
|
||||
--error ER_WRONG_FIELD_SPEC
|
||||
--error ER_PARSE_ERROR
|
||||
CREATE TABLE t1(a CHAR(100) COMPRESSED);
|
||||
--error ER_WRONG_FIELD_SPEC
|
||||
CREATE TABLE t1(a CHAR(100) NOT NULL COMPRESSED);
|
||||
--error ER_PARSE_ERROR
|
||||
CREATE TABLE t1(a INT COMPRESSED);
|
||||
--error ER_UNKNOWN_COMPRESSION_METHOD
|
||||
CREATE TABLE t1(a BLOB COMPRESSED=unknown);
|
||||
--error ER_PARSE_ERROR
|
||||
CREATE TABLE t1(a BLOB COMPRESSED COMPRESSED);
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1(a INT);
|
||||
--error ER_WRONG_FIELD_SPEC
|
||||
--error ER_PARSE_ERROR
|
||||
ALTER TABLE t1 MODIFY a INT COMPRESSED;
|
||||
--error ER_WRONG_FIELD_SPEC
|
||||
ALTER TABLE t1 MODIFY a INT NOT NULL COMPRESSED;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo # Test CSV
|
||||
CREATE TABLE t1(a BLOB NOT NULL COMPRESSED) ENGINE=CSV;
|
||||
CREATE TABLE t1(a BLOB COMPRESSED NOT NULL) ENGINE=CSV;
|
||||
INSERT INTO t1 VALUES(REPEAT('a', 110));
|
||||
SELECT LENGTH(a) FROM t1;
|
||||
ALTER TABLE t1 ENGINE=MyISAM;
|
||||
|
@ -153,8 +157,8 @@ DROP TABLE t1;
|
|||
|
||||
CREATE TABLE t1
|
||||
(
|
||||
a VARCHAR(10) CHARACTER SET latin1 COMPRESSED,
|
||||
b VARCHAR(10) CHARACTER SET utf8 COMPRESSED
|
||||
a VARCHAR(10) COMPRESSED CHARACTER SET latin1,
|
||||
b VARCHAR(10) COMPRESSED CHARACTER SET utf8
|
||||
);
|
||||
SELECT COLUMN_NAME, CHARACTER_MAXIMUM_LENGTH, CHARACTER_OCTET_LENGTH
|
||||
FROM INFORMATION_SCHEMA.COLUMNS
|
||||
|
@ -176,8 +180,78 @@ DROP TABLE t1;
|
|||
--echo # MDEV-16729 VARCHAR COMPRESSED is created with a wrong length for multi-byte character sets
|
||||
--echo #
|
||||
|
||||
CREATE OR REPLACE TABLE t1 (a VARCHAR(1000) CHARACTER SET utf8 COMPRESSED);
|
||||
CREATE OR REPLACE TABLE t1 (a VARCHAR(1000) COMPRESSED CHARACTER SET utf8);
|
||||
SHOW CREATE TABLE t1;
|
||||
SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS
|
||||
WHERE TABLE_SCHEMA='test' AND TABLE_NAME='t1';
|
||||
DROP TABLE t1;
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-17363 - Compressed columns cannot be restored from dump
|
||||
--echo #
|
||||
--error ER_WRONG_FIELD_SPEC
|
||||
CREATE TABLE t1(a INT NOT NULL COMPRESSED);
|
||||
SHOW WARNINGS;
|
||||
|
||||
CREATE TABLE t1(
|
||||
a JSON COMPRESSED,
|
||||
b VARCHAR(1000) COMPRESSED BINARY,
|
||||
c NVARCHAR(1000) COMPRESSED BINARY,
|
||||
d TINYTEXT COMPRESSED BINARY
|
||||
);
|
||||
SHOW CREATE TABLE t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # VARCHAR and TEXT variants
|
||||
--echo #
|
||||
|
||||
--let type=VARCHAR(10)
|
||||
--source include/column_compression_syntax_varchar.inc
|
||||
|
||||
--let type=TINYTEXT
|
||||
--source include/column_compression_syntax_varchar.inc
|
||||
|
||||
--let type=TEXT
|
||||
--source include/column_compression_syntax_varchar.inc
|
||||
|
||||
--let type=MEDIUMTEXT
|
||||
--source include/column_compression_syntax_varchar.inc
|
||||
|
||||
--let type=LONGTEXT
|
||||
--source include/column_compression_syntax_varchar.inc
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # VARBINARY and BLOB variables
|
||||
--echo #
|
||||
|
||||
--let type=VARCHAR(10)
|
||||
--source include/column_compression_syntax_varbinary.inc
|
||||
|
||||
--let type=TINYBLOB
|
||||
--source include/column_compression_syntax_varbinary.inc
|
||||
|
||||
--let type=BLOB
|
||||
--source include/column_compression_syntax_varbinary.inc
|
||||
|
||||
--let type=MEDIUMBLOB
|
||||
--source include/column_compression_syntax_varbinary.inc
|
||||
|
||||
--let type=LONGBLOB
|
||||
--source include/column_compression_syntax_varbinary.inc
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # NVARCHAR
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1 (a NVARCHAR(10) COMPRESSED);
|
||||
SHOW CREATE TABLE t1;
|
||||
DROP TABLE t1;
|
||||
--error ER_PARSE_ERROR
|
||||
CREATE TABLE t1 (a NVARCHAR(10) COMPRESSED BINARY COMPRESSED);
|
||||
--error ER_PARSE_ERROR
|
||||
CREATE TABLE t1 (a NVARCHAR(10) COMPRESSED DEFAULT '' COMPRESSED);
|
||||
|
|
|
@ -358,3 +358,36 @@ CREATE TABLE raise (raise int);
|
|||
DROP TABLE raise;
|
||||
CREATE TABLE reuse (reuse int);
|
||||
DROP TABLE reuse;
|
||||
#
|
||||
# MDEV-17363 Compressed columns cannot be restored from dump
|
||||
# COMPRESSED is not valid as an SP label any more
|
||||
# but is still valid as an SP variable name.
|
||||
#
|
||||
BEGIN NOT ATOMIC
|
||||
compressed:
|
||||
BEGIN
|
||||
SELECT 1 AS a;
|
||||
END;
|
||||
END
|
||||
$$
|
||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'compressed:
|
||||
BEGIN
|
||||
SELECT 1 AS a;
|
||||
END;
|
||||
END' at line 2
|
||||
BEGIN NOT ATOMIC
|
||||
`compressed`:
|
||||
BEGIN
|
||||
SELECT 1 AS a;
|
||||
END;
|
||||
END
|
||||
$$
|
||||
a
|
||||
1
|
||||
BEGIN NOT ATOMIC
|
||||
DECLARE compressed INT DEFAULT 1;
|
||||
SELECT compressed;
|
||||
END
|
||||
$$
|
||||
compressed
|
||||
1
|
||||
|
|
|
@ -259,3 +259,39 @@ DROP TABLE raise;
|
|||
|
||||
CREATE TABLE reuse (reuse int);
|
||||
DROP TABLE reuse;
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-17363 Compressed columns cannot be restored from dump
|
||||
--echo # COMPRESSED is not valid as an SP label any more
|
||||
--echo # but is still valid as an SP variable name.
|
||||
--echo #
|
||||
|
||||
DELIMITER $$;
|
||||
--error ER_PARSE_ERROR
|
||||
BEGIN NOT ATOMIC
|
||||
compressed:
|
||||
BEGIN
|
||||
SELECT 1 AS a;
|
||||
END;
|
||||
END
|
||||
$$
|
||||
DELIMITER ;$$
|
||||
|
||||
DELIMITER $$;
|
||||
BEGIN NOT ATOMIC
|
||||
`compressed`:
|
||||
BEGIN
|
||||
SELECT 1 AS a;
|
||||
END;
|
||||
END
|
||||
$$
|
||||
DELIMITER ;$$
|
||||
|
||||
DELIMITER $$;
|
||||
BEGIN NOT ATOMIC
|
||||
DECLARE compressed INT DEFAULT 1;
|
||||
SELECT compressed;
|
||||
END
|
||||
$$
|
||||
DELIMITER ;$$
|
||||
|
|
|
@ -103,7 +103,43 @@ ALTER TABLE test.t1 RENAME to test.t1_orig;
|
|||
include/diff_tables.inc [test.t1, test.t1_orig]
|
||||
# Cleanup
|
||||
DROP TABLE test.t1, test.t1_orig;
|
||||
# End tests
|
||||
#
|
||||
# Start of 10.3 tests
|
||||
#
|
||||
#
|
||||
# MDEV-17363 Compressed columns cannot be restored from dump
|
||||
#
|
||||
CREATE TABLE t1 (a VARCHAR(1000) COMPRESSED CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL);
|
||||
INSERT INTO `t1` VALUES (REPEAT('a', 256));
|
||||
# Begin testing mysqldump output + restore
|
||||
# Create 'original table name - <table>_orig
|
||||
SET @orig_table_name = CONCAT('test.t1', '_orig');
|
||||
# Rename original table
|
||||
ALTER TABLE test.t1 RENAME to test.t1_orig;
|
||||
# Recreate table from mysqldump output
|
||||
# Compare original and recreated tables
|
||||
# Recreated table: test.t1
|
||||
# Original table: test.t1_orig
|
||||
include/diff_tables.inc [test.t1, test.t1_orig]
|
||||
# Cleanup
|
||||
DROP TABLE test.t1, test.t1_orig;
|
||||
CREATE TABLE t1 (a LONGTEXT COMPRESSED CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL);
|
||||
INSERT INTO `t1` VALUES (REPEAT('a', 256));
|
||||
# Begin testing mysqldump output + restore
|
||||
# Create 'original table name - <table>_orig
|
||||
SET @orig_table_name = CONCAT('test.t1', '_orig');
|
||||
# Rename original table
|
||||
ALTER TABLE test.t1 RENAME to test.t1_orig;
|
||||
# Recreate table from mysqldump output
|
||||
# Compare original and recreated tables
|
||||
# Recreated table: test.t1
|
||||
# Original table: test.t1_orig
|
||||
include/diff_tables.inc [test.t1, test.t1_orig]
|
||||
# Cleanup
|
||||
DROP TABLE test.t1, test.t1_orig;
|
||||
#
|
||||
# End of 10.3 tests
|
||||
#
|
||||
# Cleanup
|
||||
# Reset concurrent_insert to its original value
|
||||
SET @@global.concurrent_insert = @old_concurrent_insert;
|
||||
|
|
|
@ -101,7 +101,29 @@ INSERT INTO `t1` VALUES (0x602010000280100005E71A);
|
|||
let $table_name = test.t1;
|
||||
--source include/mysqldump.inc
|
||||
|
||||
--echo # End tests
|
||||
--echo #
|
||||
--echo # Start of 10.3 tests
|
||||
--echo #
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-17363 Compressed columns cannot be restored from dump
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1 (a VARCHAR(1000) COMPRESSED CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL);
|
||||
INSERT INTO `t1` VALUES (REPEAT('a', 256));
|
||||
--exec $MYSQL_DUMP --skip-extended-insert test --skip-comments t1 > $mysqldumpfile
|
||||
let $table_name = test.t1;
|
||||
--source include/mysqldump.inc
|
||||
|
||||
CREATE TABLE t1 (a LONGTEXT COMPRESSED CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL);
|
||||
INSERT INTO `t1` VALUES (REPEAT('a', 256));
|
||||
--exec $MYSQL_DUMP --skip-extended-insert test --skip-comments t1 > $mysqldumpfile
|
||||
let $table_name = test.t1;
|
||||
--source include/mysqldump.inc
|
||||
|
||||
--echo #
|
||||
--echo # End of 10.3 tests
|
||||
--echo #
|
||||
|
||||
--echo # Cleanup
|
||||
--echo # Reset concurrent_insert to its original value
|
||||
|
|
|
@ -8791,6 +8791,33 @@ Note 1050 Table 't1' already exists
|
|||
drop procedure p4;
|
||||
drop table t1;
|
||||
set @@sql_mode=@save_sql_mode;
|
||||
#
|
||||
# MDEV-17363 Compressed columns cannot be restored from dump
|
||||
# COMPRESSED conflicted between data type and SP label,
|
||||
# so it's not allowed as an SP label any more.
|
||||
#
|
||||
CREATE FUNCTION f1() RETURNS TEXT COMPRESSED
|
||||
BEGIN
|
||||
RETURN '';
|
||||
END;
|
||||
$$
|
||||
SHOW CREATE FUNCTION f1;
|
||||
Function sql_mode Create Function character_set_client collation_connection Database Collation
|
||||
f1 STRICT_ALL_TABLES CREATE DEFINER=`root`@`localhost` FUNCTION `f1`() RETURNS text COMPRESSED CHARSET latin1
|
||||
BEGIN
|
||||
RETURN '';
|
||||
END latin1 latin1_swedish_ci latin1_swedish_ci
|
||||
DROP FUNCTION f1;
|
||||
CREATE FUNCTION f1() RETURNS TEXT
|
||||
COMPRESSED:
|
||||
BEGIN
|
||||
RETURN '';
|
||||
END;
|
||||
$$
|
||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ':
|
||||
BEGIN
|
||||
RETURN '';
|
||||
END' at line 2
|
||||
# End of 10.3 tests
|
||||
#
|
||||
# Start of 10.4 tests
|
||||
|
|
|
@ -10322,6 +10322,32 @@ drop procedure p4;
|
|||
drop table t1;
|
||||
set @@sql_mode=@save_sql_mode;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-17363 Compressed columns cannot be restored from dump
|
||||
--echo # COMPRESSED conflicted between data type and SP label,
|
||||
--echo # so it's not allowed as an SP label any more.
|
||||
--echo #
|
||||
|
||||
DELIMITER $$;
|
||||
CREATE FUNCTION f1() RETURNS TEXT COMPRESSED
|
||||
BEGIN
|
||||
RETURN '';
|
||||
END;
|
||||
$$
|
||||
DELIMITER ;$$
|
||||
SHOW CREATE FUNCTION f1;
|
||||
DROP FUNCTION f1;
|
||||
|
||||
DELIMITER $$;
|
||||
--error ER_PARSE_ERROR
|
||||
CREATE FUNCTION f1() RETURNS TEXT
|
||||
COMPRESSED:
|
||||
BEGIN
|
||||
RETURN '';
|
||||
END;
|
||||
$$
|
||||
DELIMITER ;$$
|
||||
|
||||
--echo # End of 10.3 tests
|
||||
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load diff
26
mysql-test/suite/compat/oracle/r/keywords.result
Normal file
26
mysql-test/suite/compat/oracle/r/keywords.result
Normal file
|
@ -0,0 +1,26 @@
|
|||
SET sql_mode=ORACLE;
|
||||
#
|
||||
# MDEV-17363 Compressed columns cannot be restored from dump
|
||||
# In sql_mode=ORACLE, COMPRESSED is still valid both as an SP label
|
||||
# and an SP variable name.
|
||||
#
|
||||
BEGIN
|
||||
IF TRUE THEN
|
||||
GOTO compressed;
|
||||
END IF;
|
||||
SELECT 'This should not be reached' AS warn;
|
||||
<<compressed>>
|
||||
BEGIN
|
||||
SELECT 1 AS a;
|
||||
END;
|
||||
END
|
||||
$$
|
||||
a
|
||||
1
|
||||
DECLARE compressed INT DEFAULT 1;
|
||||
BEGIN
|
||||
SELECT compressed;
|
||||
END
|
||||
$$
|
||||
compressed
|
||||
1
|
38
mysql-test/suite/compat/oracle/r/mysqldump_restore.result
Normal file
38
mysql-test/suite/compat/oracle/r/mysqldump_restore.result
Normal file
|
@ -0,0 +1,38 @@
|
|||
SET sql_mode=ORACLE;
|
||||
#
|
||||
# Start of 10.3 tests
|
||||
#
|
||||
#
|
||||
# MDEV-17363 Compressed columns cannot be restored from dump
|
||||
#
|
||||
CREATE TABLE t1 (a VARCHAR(1000) COMPRESSED CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL);
|
||||
INSERT INTO `t1` VALUES (REPEAT('a', 256));
|
||||
# Begin testing mysqldump output + restore
|
||||
# Create 'original table name - <table>_orig
|
||||
SET @orig_table_name = CONCAT('test.t1', '_orig');
|
||||
# Rename original table
|
||||
ALTER TABLE test.t1 RENAME to test.t1_orig;
|
||||
# Recreate table from mysqldump output
|
||||
# Compare original and recreated tables
|
||||
# Recreated table: test.t1
|
||||
# Original table: test.t1_orig
|
||||
include/diff_tables.inc [test.t1, test.t1_orig]
|
||||
# Cleanup
|
||||
DROP TABLE test.t1, test.t1_orig;
|
||||
CREATE TABLE t1 (a LONGTEXT COMPRESSED CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL);
|
||||
INSERT INTO `t1` VALUES (REPEAT('a', 256));
|
||||
# Begin testing mysqldump output + restore
|
||||
# Create 'original table name - <table>_orig
|
||||
SET @orig_table_name = CONCAT('test.t1', '_orig');
|
||||
# Rename original table
|
||||
ALTER TABLE test.t1 RENAME to test.t1_orig;
|
||||
# Recreate table from mysqldump output
|
||||
# Compare original and recreated tables
|
||||
# Recreated table: test.t1
|
||||
# Original table: test.t1_orig
|
||||
include/diff_tables.inc [test.t1, test.t1_orig]
|
||||
# Cleanup
|
||||
DROP TABLE test.t1, test.t1_orig;
|
||||
#
|
||||
# End of 10.3 tests
|
||||
#
|
|
@ -9,3 +9,76 @@ INSERT INTO t1 VALUES (REPEAT('a',10000));
|
|||
SELECT DATA_LENGTH<100 AS c FROM INFORMATION_SCHEMA.TABLES
|
||||
WHERE TABLE_NAME='t1' AND TABLE_SCHEMA='test';
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-17363 - Compressed columns cannot be restored from dump
|
||||
--echo #
|
||||
|
||||
--error ER_WRONG_FIELD_SPEC
|
||||
CREATE TABLE t1(a INT NOT NULL COMPRESSED);
|
||||
SHOW WARNINGS;
|
||||
|
||||
CREATE TABLE t1(
|
||||
a JSON COMPRESSED,
|
||||
b VARCHAR(1000) COMPRESSED BINARY,
|
||||
c NVARCHAR(1000) COMPRESSED BINARY,
|
||||
d TINYTEXT COMPRESSED BINARY
|
||||
);
|
||||
SHOW CREATE TABLE t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # VARCHAR and TEXT variants
|
||||
--echo #
|
||||
|
||||
--let type=VARCHAR(10)
|
||||
--source include/column_compression_syntax_varchar.inc
|
||||
|
||||
--let type=VARCHAR2(10)
|
||||
--source include/column_compression_syntax_varchar.inc
|
||||
|
||||
--let type=TINYTEXT
|
||||
--source include/column_compression_syntax_varchar.inc
|
||||
|
||||
--let type=TEXT
|
||||
--source include/column_compression_syntax_varchar.inc
|
||||
|
||||
--let type=MEDIUMTEXT
|
||||
--source include/column_compression_syntax_varchar.inc
|
||||
|
||||
--let type=LONGTEXT
|
||||
--source include/column_compression_syntax_varchar.inc
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # VARBINARY and BLOB variables
|
||||
--echo #
|
||||
|
||||
--let type=VARCHAR(10)
|
||||
--source include/column_compression_syntax_varbinary.inc
|
||||
|
||||
--let type=TINYBLOB
|
||||
--source include/column_compression_syntax_varbinary.inc
|
||||
|
||||
--let type=BLOB
|
||||
--source include/column_compression_syntax_varbinary.inc
|
||||
|
||||
--let type=MEDIUMBLOB
|
||||
--source include/column_compression_syntax_varbinary.inc
|
||||
|
||||
--let type=LONGBLOB
|
||||
--source include/column_compression_syntax_varbinary.inc
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # NVARCHAR
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1 (a NVARCHAR(10) COMPRESSED);
|
||||
SHOW CREATE TABLE t1;
|
||||
DROP TABLE t1;
|
||||
--error ER_PARSE_ERROR
|
||||
CREATE TABLE t1 (a NVARCHAR(10) COMPRESSED BINARY COMPRESSED);
|
||||
--error ER_PARSE_ERROR
|
||||
CREATE TABLE t1 (a NVARCHAR(10) COMPRESSED DEFAULT '' COMPRESSED);
|
||||
|
|
29
mysql-test/suite/compat/oracle/t/keywords.test
Normal file
29
mysql-test/suite/compat/oracle/t/keywords.test
Normal file
|
@ -0,0 +1,29 @@
|
|||
SET sql_mode=ORACLE;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-17363 Compressed columns cannot be restored from dump
|
||||
--echo # In sql_mode=ORACLE, COMPRESSED is still valid both as an SP label
|
||||
--echo # and an SP variable name.
|
||||
--echo #
|
||||
|
||||
DELIMITER $$;
|
||||
BEGIN
|
||||
IF TRUE THEN
|
||||
GOTO compressed;
|
||||
END IF;
|
||||
SELECT 'This should not be reached' AS warn;
|
||||
<<compressed>>
|
||||
BEGIN
|
||||
SELECT 1 AS a;
|
||||
END;
|
||||
END
|
||||
$$
|
||||
DELIMITER ;$$
|
||||
|
||||
DELIMITER $$;
|
||||
DECLARE compressed INT DEFAULT 1;
|
||||
BEGIN
|
||||
SELECT compressed;
|
||||
END
|
||||
$$
|
||||
DELIMITER ;$$
|
30
mysql-test/suite/compat/oracle/t/mysqldump_restore.test
Normal file
30
mysql-test/suite/compat/oracle/t/mysqldump_restore.test
Normal file
|
@ -0,0 +1,30 @@
|
|||
# See comments in mysql-test/main/mysqldump_restore.test
|
||||
--source include/not_embedded.inc
|
||||
|
||||
SET sql_mode=ORACLE;
|
||||
|
||||
let $mysqldumpfile = $MYSQLTEST_VARDIR/tmp/mysqldumpfile.sql;
|
||||
|
||||
--echo #
|
||||
--echo # Start of 10.3 tests
|
||||
--echo #
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-17363 Compressed columns cannot be restored from dump
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1 (a VARCHAR(1000) COMPRESSED CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL);
|
||||
INSERT INTO `t1` VALUES (REPEAT('a', 256));
|
||||
--exec $MYSQL_DUMP --skip-extended-insert test --skip-comments t1 > $mysqldumpfile
|
||||
let $table_name = test.t1;
|
||||
--source include/mysqldump.inc
|
||||
|
||||
CREATE TABLE t1 (a LONGTEXT COMPRESSED CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL);
|
||||
INSERT INTO `t1` VALUES (REPEAT('a', 256));
|
||||
--exec $MYSQL_DUMP --skip-extended-insert test --skip-comments t1 > $mysqldumpfile
|
||||
let $table_name = test.t1;
|
||||
--source include/mysqldump.inc
|
||||
|
||||
--echo #
|
||||
--echo # End of 10.3 tests
|
||||
--echo #
|
|
@ -176,11 +176,11 @@ algorithm=instant;
|
|||
ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY
|
||||
drop table enum_and_set;
|
||||
create table compressed (
|
||||
a varchar(255) charset utf8mb3 compressed
|
||||
a varchar(255) compressed charset utf8mb3
|
||||
) engine=innodb;
|
||||
insert into compressed values ('AAA'), ('bbb'), ('CCC');
|
||||
alter table compressed
|
||||
modify a varchar(255) charset utf8mb4 compressed,
|
||||
modify a varchar(255) compressed charset utf8mb4,
|
||||
algorithm=instant;
|
||||
select * from compressed;
|
||||
a
|
||||
|
|
|
@ -208,13 +208,13 @@ alter table enum_and_set
|
|||
drop table enum_and_set;
|
||||
|
||||
create table compressed (
|
||||
a varchar(255) charset utf8mb3 compressed
|
||||
a varchar(255) compressed charset utf8mb3
|
||||
) engine=innodb;
|
||||
|
||||
insert into compressed values ('AAA'), ('bbb'), ('CCC');
|
||||
|
||||
alter table compressed
|
||||
modify a varchar(255) charset utf8mb4 compressed,
|
||||
modify a varchar(255) compressed charset utf8mb4,
|
||||
algorithm=instant;
|
||||
|
||||
select * from compressed;
|
||||
|
|
|
@ -47,3 +47,46 @@ t1 CREATE TABLE `t1` (
|
|||
) ENGINE=Aria DEFAULT CHARSET=latin1 PAGE_CHECKSUM=1 TRANSACTIONAL=1
|
||||
CREATE TABLE t2 SELECT * FROM t1;
|
||||
DROP TABLE t1, t2;
|
||||
#
|
||||
# MDEV-19055 Assertion `(_my_thread_var())->thr_errno != 0' failed in pagecache_read
|
||||
#
|
||||
CREATE OR REPLACE TABLE t1 (x INT) ENGINE=Aria;
|
||||
CREATE TEMPORARY TABLE t2 (a TIME) ENGINE=Aria;
|
||||
ALTER TABLE t2 ADD b DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;
|
||||
ALTER TABLE t2 ADD CHECK (b = 4);
|
||||
INSERT IGNORE INTO t2 () VALUES (),(),(),();
|
||||
ALTER IGNORE TABLE t2 ADD c INT;
|
||||
SELECT count(a),sum(a) FROM t2;
|
||||
count(a) sum(a)
|
||||
0 NULL
|
||||
DELETE FROM t2 ORDER BY c LIMIT 1;
|
||||
INSERT IGNORE INTO t2 SELECT * FROM t2;
|
||||
OPTIMIZE TABLE t2;
|
||||
Table Op Msg_type Msg_text
|
||||
test.t2 optimize status OK
|
||||
SELECT count(a),sum(a) FROM t2;
|
||||
count(a) sum(a)
|
||||
0 NULL
|
||||
INSERT IGNORE INTO t2 SELECT * FROM t2;
|
||||
SET SQL_MODE= 'STRICT_ALL_TABLES';
|
||||
SELECT count(a),sum(a) FROM t2;
|
||||
count(a) sum(a)
|
||||
0 NULL
|
||||
ALTER TABLE t2 CHANGE IF EXISTS d c INT;
|
||||
ERROR 22007: Truncated incorrect datetime value: '4'
|
||||
SELECT count(a),sum(a) FROM t2;
|
||||
count(a) sum(a)
|
||||
0 NULL
|
||||
ALTER IGNORE TABLE t2 ADD IF NOT EXISTS e BIT;
|
||||
ALTER TABLE t1 MODIFY IF EXISTS xx INT;
|
||||
INSERT IGNORE INTO t2 () VALUES (),(),(),();
|
||||
SELECT count(a),sum(a) FROM t2;
|
||||
count(a) sum(a)
|
||||
0 NULL
|
||||
check table t1;
|
||||
Table Op Msg_type Msg_text
|
||||
test.t1 check status OK
|
||||
check table t2;
|
||||
Table Op Msg_type Msg_text
|
||||
test.t2 check status OK
|
||||
DROP TABLE t1,t2;
|
||||
|
|
|
@ -42,3 +42,38 @@ ALTER TABLE t1 ORDER BY unknown_column;
|
|||
SHOW CREATE TABLE t1;
|
||||
CREATE TABLE t2 SELECT * FROM t1;
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-19055 Assertion `(_my_thread_var())->thr_errno != 0' failed in pagecache_read
|
||||
--echo #
|
||||
|
||||
--disable_warnings
|
||||
CREATE OR REPLACE TABLE t1 (x INT) ENGINE=Aria;
|
||||
CREATE TEMPORARY TABLE t2 (a TIME) ENGINE=Aria;
|
||||
ALTER TABLE t2 ADD b DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;
|
||||
ALTER TABLE t2 ADD CHECK (b = 4);
|
||||
INSERT IGNORE INTO t2 () VALUES (),(),(),();
|
||||
ALTER IGNORE TABLE t2 ADD c INT;
|
||||
SELECT count(a),sum(a) FROM t2;
|
||||
DELETE FROM t2 ORDER BY c LIMIT 1;
|
||||
INSERT IGNORE INTO t2 SELECT * FROM t2;
|
||||
OPTIMIZE TABLE t2;
|
||||
SELECT count(a),sum(a) FROM t2;
|
||||
INSERT IGNORE INTO t2 SELECT * FROM t2;
|
||||
SET SQL_MODE= 'STRICT_ALL_TABLES';
|
||||
SELECT count(a),sum(a) FROM t2;
|
||||
--error ER_TRUNCATED_WRONG_VALUE
|
||||
ALTER TABLE t2 CHANGE IF EXISTS d c INT;
|
||||
SELECT count(a),sum(a) FROM t2;
|
||||
ALTER IGNORE TABLE t2 ADD IF NOT EXISTS e BIT;
|
||||
ALTER TABLE t1 MODIFY IF EXISTS xx INT;
|
||||
INSERT IGNORE INTO t2 () VALUES (),(),(),();
|
||||
SELECT count(a),sum(a) FROM t2;
|
||||
--enable_warnings
|
||||
check table t1;
|
||||
check table t2;
|
||||
DROP TABLE t1,t2;
|
||||
|
||||
#
|
||||
# End of 10.2 tests
|
||||
#
|
||||
|
|
23
mysql-test/suite/maria/temporary.result
Normal file
23
mysql-test/suite/maria/temporary.result
Normal file
|
@ -0,0 +1,23 @@
|
|||
CREATE TABLE t1 (b INT);
|
||||
INSERT INTO t1 VALUES (5);
|
||||
CREATE TEMPORARY TABLE t1 (a INT) ENGINE=Aria ROW_FORMAT=DYNAMIC;
|
||||
INSERT INTO t1 VALUES (1);
|
||||
DELETE FROM t1 LIMIT 2;
|
||||
OPTIMIZE TABLE t1;
|
||||
Table Op Msg_type Msg_text
|
||||
test.t1 optimize status OK
|
||||
CHECK TABLE t1;
|
||||
Table Op Msg_type Msg_text
|
||||
test.t1 check status OK
|
||||
SELECT * FROM t1;
|
||||
a
|
||||
INSERT INTO t1 VALUES (1),(2);
|
||||
CHECK TABLE t1;
|
||||
Table Op Msg_type Msg_text
|
||||
test.t1 check status OK
|
||||
ALTER TABLE t1 CHANGE COLUMN IF EXISTS x x INT;
|
||||
Warnings:
|
||||
Note 1054 Unknown column 'x' in 't1'
|
||||
ALTER TABLE t1;
|
||||
DROP TEMPORARY TABLE t1;
|
||||
DROP TABLE t1;
|
20
mysql-test/suite/maria/temporary.test
Normal file
20
mysql-test/suite/maria/temporary.test
Normal file
|
@ -0,0 +1,20 @@
|
|||
#
|
||||
# MDEV-19595
|
||||
# ER_CRASHED_ON_USAGE and Assertion `!is_set() || (m_status == DA_OK_BULK && is_bulk_op())'
|
||||
# failed upon actions on temporary Aria table with ROW_FORMAT DYNAMIC
|
||||
#
|
||||
|
||||
CREATE TABLE t1 (b INT);
|
||||
INSERT INTO t1 VALUES (5);
|
||||
CREATE TEMPORARY TABLE t1 (a INT) ENGINE=Aria ROW_FORMAT=DYNAMIC;
|
||||
INSERT INTO t1 VALUES (1);
|
||||
DELETE FROM t1 LIMIT 2;
|
||||
OPTIMIZE TABLE t1;
|
||||
CHECK TABLE t1;
|
||||
SELECT * FROM t1;
|
||||
INSERT INTO t1 VALUES (1),(2);
|
||||
CHECK TABLE t1;
|
||||
ALTER TABLE t1 CHANGE COLUMN IF EXISTS x x INT;
|
||||
ALTER TABLE t1;
|
||||
DROP TEMPORARY TABLE t1;
|
||||
DROP TABLE t1;
|
|
@ -443,5 +443,43 @@ ERROR HY000: Incorrect information in file: './test/t1.frm'
|
|||
ALTER TABLE t1;
|
||||
ERROR HY000: Incorrect information in file: './test/t1.frm'
|
||||
#
|
||||
# MDEV-19771 REPLACE on table with virtual_field can cause crash in set_ok_status()
|
||||
|
||||
create or replace table t1 (pk int primary key, col_bit bit(15) default null,
|
||||
vcol_bit bit(10) GENERATED ALWAYS AS (`col_bit`) VIRTUAL);
|
||||
replace INTO `t1` (`pk`,col_bit) VALUES (99,1000);
|
||||
select pk, col_bit+0, vcol_bit+0 from t1;
|
||||
pk col_bit+0 vcol_bit+0
|
||||
99 1000 1000
|
||||
replace INTO `t1` (`pk`,col_bit) VALUES (99,10000);
|
||||
select pk, col_bit+0, vcol_bit+0 from t1;
|
||||
pk col_bit+0 vcol_bit+0
|
||||
99 10000 1023
|
||||
REPLACE LOW_PRIORITY INTO `t1` (`pk`) VALUES (99);
|
||||
Warnings:
|
||||
Warning 1264 Out of range value for column 'vcol_bit' at row 1
|
||||
drop table t1;
|
||||
#
|
||||
# MDEV-17837 REPLACE on table with virtual_field can cause crash in set_ok_status()
|
||||
#
|
||||
SET @old_sql_mode=@@sql_mode;
|
||||
SET sql_mode= STRICT_ALL_TABLES;
|
||||
CREATE TABLE t1 (
|
||||
pk INT,
|
||||
i TINYINT,
|
||||
vi TINYINT AS (i+1) PERSISTENT,
|
||||
PRIMARY KEY(pk)
|
||||
);
|
||||
INSERT INTO t1 (pk,i) VALUES (1,1);
|
||||
TRUNCATE TABLE t1;
|
||||
INSERT IGNORE INTO t1 (pk,i) VALUES (1,127);
|
||||
Warnings:
|
||||
Warning 1264 Out of range value for column 'vi' at row 1
|
||||
REPLACE INTO t1 (pk,i) VALUES (1,2);
|
||||
Warnings:
|
||||
Warning 1264 Out of range value for column 'vi' at row 1
|
||||
DROP TABLE t1;
|
||||
SET @sql_mode=@old_sql_mode;
|
||||
#
|
||||
# End of 10.2 tests
|
||||
#
|
||||
|
|
|
@ -408,6 +408,40 @@ SHOW CREATE TABLE t1;
|
|||
ALTER TABLE t1;
|
||||
--remove_file $MYSQLD_DATADIR/test/t1.frm
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-19771 REPLACE on table with virtual_field can cause crash in set_ok_status()
|
||||
--echo
|
||||
|
||||
create or replace table t1 (pk int primary key, col_bit bit(15) default null,
|
||||
vcol_bit bit(10) GENERATED ALWAYS AS (`col_bit`) VIRTUAL);
|
||||
replace INTO `t1` (`pk`,col_bit) VALUES (99,1000);
|
||||
select pk, col_bit+0, vcol_bit+0 from t1;
|
||||
replace INTO `t1` (`pk`,col_bit) VALUES (99,10000);
|
||||
select pk, col_bit+0, vcol_bit+0 from t1;
|
||||
REPLACE LOW_PRIORITY INTO `t1` (`pk`) VALUES (99);
|
||||
drop table t1;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-17837 REPLACE on table with virtual_field can cause crash in set_ok_status()
|
||||
--echo #
|
||||
|
||||
SET @old_sql_mode=@@sql_mode;
|
||||
SET sql_mode= STRICT_ALL_TABLES;
|
||||
|
||||
CREATE TABLE t1 (
|
||||
pk INT,
|
||||
i TINYINT,
|
||||
vi TINYINT AS (i+1) PERSISTENT,
|
||||
PRIMARY KEY(pk)
|
||||
);
|
||||
|
||||
INSERT INTO t1 (pk,i) VALUES (1,1);
|
||||
TRUNCATE TABLE t1;
|
||||
INSERT IGNORE INTO t1 (pk,i) VALUES (1,127);
|
||||
REPLACE INTO t1 (pk,i) VALUES (1,2);
|
||||
DROP TABLE t1;
|
||||
SET @sql_mode=@old_sql_mode;
|
||||
|
||||
--echo #
|
||||
--echo # End of 10.2 tests
|
||||
--echo #
|
||||
|
|
218
mysys/charset.c
218
mysys/charset.c
|
@ -20,7 +20,12 @@
|
|||
#include <m_string.h>
|
||||
#include <my_dir.h>
|
||||
#include <my_xml.h>
|
||||
|
||||
#ifdef HAVE_LANGINFO_H
|
||||
#include <langinfo.h>
|
||||
#endif
|
||||
#ifdef HAVE_LOCALE_H
|
||||
#include <locale.h>
|
||||
#endif
|
||||
|
||||
/*
|
||||
The code below implements this functionality:
|
||||
|
@ -1216,3 +1221,214 @@ size_t escape_quotes_for_mysql(CHARSET_INFO *charset_info,
|
|||
*to= 0;
|
||||
return overflow ? (ulong)~0 : (ulong) (to - to_start);
|
||||
}
|
||||
|
||||
|
||||
typedef enum my_cs_match_type_enum
|
||||
{
|
||||
/* MySQL and OS charsets are fully compatible */
|
||||
my_cs_exact,
|
||||
/* MySQL charset is very close to OS charset */
|
||||
my_cs_approx,
|
||||
/*
|
||||
MySQL knows this charset, but it is not supported as client character set.
|
||||
*/
|
||||
my_cs_unsupp
|
||||
} my_cs_match_type;
|
||||
|
||||
|
||||
typedef struct str2str_st
|
||||
{
|
||||
const char* os_name;
|
||||
const char* my_name;
|
||||
my_cs_match_type param;
|
||||
} MY_CSET_OS_NAME;
|
||||
|
||||
static const MY_CSET_OS_NAME charsets[] =
|
||||
{
|
||||
#ifdef _WIN32
|
||||
{"cp437", "cp850", my_cs_approx},
|
||||
{"cp850", "cp850", my_cs_exact},
|
||||
{"cp852", "cp852", my_cs_exact},
|
||||
{"cp858", "cp850", my_cs_approx},
|
||||
{"cp866", "cp866", my_cs_exact},
|
||||
{"cp874", "tis620", my_cs_approx},
|
||||
{"cp932", "cp932", my_cs_exact},
|
||||
{"cp936", "gbk", my_cs_approx},
|
||||
{"cp949", "euckr", my_cs_approx},
|
||||
{"cp950", "big5", my_cs_exact},
|
||||
{"cp1200", "utf16le", my_cs_unsupp},
|
||||
{"cp1201", "utf16", my_cs_unsupp},
|
||||
{"cp1250", "cp1250", my_cs_exact},
|
||||
{"cp1251", "cp1251", my_cs_exact},
|
||||
{"cp1252", "latin1", my_cs_exact},
|
||||
{"cp1253", "greek", my_cs_exact},
|
||||
{"cp1254", "latin5", my_cs_exact},
|
||||
{"cp1255", "hebrew", my_cs_approx},
|
||||
{"cp1256", "cp1256", my_cs_exact},
|
||||
{"cp1257", "cp1257", my_cs_exact},
|
||||
{"cp10000", "macroman", my_cs_exact},
|
||||
{"cp10001", "sjis", my_cs_approx},
|
||||
{"cp10002", "big5", my_cs_approx},
|
||||
{"cp10008", "gb2312", my_cs_approx},
|
||||
{"cp10021", "tis620", my_cs_approx},
|
||||
{"cp10029", "macce", my_cs_exact},
|
||||
{"cp12001", "utf32", my_cs_unsupp},
|
||||
{"cp20107", "swe7", my_cs_exact},
|
||||
{"cp20127", "latin1", my_cs_approx},
|
||||
{"cp20866", "koi8r", my_cs_exact},
|
||||
{"cp20932", "ujis", my_cs_exact},
|
||||
{"cp20936", "gb2312", my_cs_approx},
|
||||
{"cp20949", "euckr", my_cs_approx},
|
||||
{"cp21866", "koi8u", my_cs_exact},
|
||||
{"cp28591", "latin1", my_cs_approx},
|
||||
{"cp28592", "latin2", my_cs_exact},
|
||||
{"cp28597", "greek", my_cs_exact},
|
||||
{"cp28598", "hebrew", my_cs_exact},
|
||||
{"cp28599", "latin5", my_cs_exact},
|
||||
{"cp28603", "latin7", my_cs_exact},
|
||||
#ifdef UNCOMMENT_THIS_WHEN_WL_4579_IS_DONE
|
||||
{"cp28605", "latin9", my_cs_exact},
|
||||
#endif
|
||||
{"cp38598", "hebrew", my_cs_exact},
|
||||
{"cp51932", "ujis", my_cs_exact},
|
||||
{"cp51936", "gb2312", my_cs_exact},
|
||||
{"cp51949", "euckr", my_cs_exact},
|
||||
{"cp51950", "big5", my_cs_exact},
|
||||
#ifdef UNCOMMENT_THIS_WHEN_WL_WL_4024_IS_DONE
|
||||
{"cp54936", "gb18030", my_cs_exact},
|
||||
#endif
|
||||
{"cp65001", "utf8", my_cs_exact},
|
||||
|
||||
#else /* not Windows */
|
||||
|
||||
{"646", "latin1", my_cs_approx}, /* Default on Solaris */
|
||||
{"ANSI_X3.4-1968", "latin1", my_cs_approx},
|
||||
{"ansi1251", "cp1251", my_cs_exact},
|
||||
{"armscii8", "armscii8", my_cs_exact},
|
||||
{"armscii-8", "armscii8", my_cs_exact},
|
||||
{"ASCII", "latin1", my_cs_approx},
|
||||
{"Big5", "big5", my_cs_exact},
|
||||
{"cp1251", "cp1251", my_cs_exact},
|
||||
{"cp1255", "hebrew", my_cs_approx},
|
||||
{"CP866", "cp866", my_cs_exact},
|
||||
{"eucCN", "gb2312", my_cs_exact},
|
||||
{"euc-CN", "gb2312", my_cs_exact},
|
||||
{"eucJP", "ujis", my_cs_exact},
|
||||
{"euc-JP", "ujis", my_cs_exact},
|
||||
{"eucKR", "euckr", my_cs_exact},
|
||||
{"euc-KR", "euckr", my_cs_exact},
|
||||
#ifdef UNCOMMENT_THIS_WHEN_WL_WL_4024_IS_DONE
|
||||
{"gb18030", "gb18030", my_cs_exact},
|
||||
#endif
|
||||
{"gb2312", "gb2312", my_cs_exact},
|
||||
{"gbk", "gbk", my_cs_exact},
|
||||
{"georgianps", "geostd8", my_cs_exact},
|
||||
{"georgian-ps", "geostd8", my_cs_exact},
|
||||
{"IBM-1252", "cp1252", my_cs_exact},
|
||||
|
||||
{"iso88591", "latin1", my_cs_approx},
|
||||
{"ISO_8859-1", "latin1", my_cs_approx},
|
||||
{"ISO8859-1", "latin1", my_cs_approx},
|
||||
{"ISO-8859-1", "latin1", my_cs_approx},
|
||||
|
||||
{"iso885913", "latin7", my_cs_exact},
|
||||
{"ISO_8859-13", "latin7", my_cs_exact},
|
||||
{"ISO8859-13", "latin7", my_cs_exact},
|
||||
{"ISO-8859-13", "latin7", my_cs_exact},
|
||||
|
||||
#ifdef UNCOMMENT_THIS_WHEN_WL_4579_IS_DONE
|
||||
{"iso885915", "latin9", my_cs_exact},
|
||||
{"ISO_8859-15", "latin9", my_cs_exact},
|
||||
{"ISO8859-15", "latin9", my_cs_exact},
|
||||
{"ISO-8859-15", "latin9", my_cs_exact},
|
||||
#endif
|
||||
|
||||
{"iso88592", "latin2", my_cs_exact},
|
||||
{"ISO_8859-2", "latin2", my_cs_exact},
|
||||
{"ISO8859-2", "latin2", my_cs_exact},
|
||||
{"ISO-8859-2", "latin2", my_cs_exact},
|
||||
|
||||
{"iso88597", "greek", my_cs_exact},
|
||||
{"ISO_8859-7", "greek", my_cs_exact},
|
||||
{"ISO8859-7", "greek", my_cs_exact},
|
||||
{"ISO-8859-7", "greek", my_cs_exact},
|
||||
|
||||
{"iso88598", "hebrew", my_cs_exact},
|
||||
{"ISO_8859-8", "hebrew", my_cs_exact},
|
||||
{"ISO8859-8", "hebrew", my_cs_exact},
|
||||
{"ISO-8859-8", "hebrew", my_cs_exact},
|
||||
|
||||
{"iso88599", "latin5", my_cs_exact},
|
||||
{"ISO_8859-9", "latin5", my_cs_exact},
|
||||
{"ISO8859-9", "latin5", my_cs_exact},
|
||||
{"ISO-8859-9", "latin5", my_cs_exact},
|
||||
|
||||
{"koi8r", "koi8r", my_cs_exact},
|
||||
{"KOI8-R", "koi8r", my_cs_exact},
|
||||
{"koi8u", "koi8u", my_cs_exact},
|
||||
{"KOI8-U", "koi8u", my_cs_exact},
|
||||
|
||||
{"roman8", "hp8", my_cs_exact}, /* Default on HP UX */
|
||||
|
||||
{"Shift_JIS", "sjis", my_cs_exact},
|
||||
{"SJIS", "sjis", my_cs_exact},
|
||||
{"shiftjisx0213", "sjis", my_cs_exact},
|
||||
|
||||
{"tis620", "tis620", my_cs_exact},
|
||||
{"tis-620", "tis620", my_cs_exact},
|
||||
|
||||
{"ujis", "ujis", my_cs_exact},
|
||||
|
||||
{"US-ASCII", "latin1", my_cs_approx},
|
||||
|
||||
{"utf8", "utf8", my_cs_exact},
|
||||
{"utf-8", "utf8", my_cs_exact},
|
||||
#endif
|
||||
{NULL, NULL, 0}
|
||||
};
|
||||
|
||||
|
||||
static const char*
|
||||
my_os_charset_to_mysql_charset(const char* csname)
|
||||
{
|
||||
const MY_CSET_OS_NAME* csp;
|
||||
for (csp = charsets; csp->os_name; csp++)
|
||||
{
|
||||
if (!strcasecmp(csp->os_name, csname))
|
||||
{
|
||||
switch (csp->param)
|
||||
{
|
||||
case my_cs_exact:
|
||||
return csp->my_name;
|
||||
|
||||
case my_cs_approx:
|
||||
/*
|
||||
Maybe we should print a warning eventually:
|
||||
character set correspondence is not exact.
|
||||
*/
|
||||
return csp->my_name;
|
||||
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
const char* my_default_csname()
|
||||
{
|
||||
const char* csname = NULL;
|
||||
#ifdef _WIN32
|
||||
char cpbuf[64];
|
||||
int cp = GetConsoleCP();
|
||||
if (cp == 0)
|
||||
cp = GetACP();
|
||||
snprintf(cpbuf, sizeof(cpbuf), "cp%d", (int)cp);
|
||||
csname = my_os_charset_to_mysql_charset(cpbuf);
|
||||
#elif defined(HAVE_SETLOCALE) && defined(HAVE_NL_LANGINFO)
|
||||
if (setlocale(LC_CTYPE, "") && (csname = nl_langinfo(CODESET)))
|
||||
csname = my_os_charset_to_mysql_charset(csname);
|
||||
#endif
|
||||
return csname ? csname : MYSQL_DEFAULT_CHARSET_NAME;
|
||||
}
|
|
@ -68,6 +68,8 @@ size_t my_pread(File Filedes, uchar *Buffer, size_t Count, my_off_t offset,
|
|||
|
||||
if (readbytes != Count)
|
||||
{
|
||||
/* We should never read with wrong file descriptor! */
|
||||
DBUG_ASSERT(readbytes != (size_t)-1 || errno != EBADF);
|
||||
my_errno= errno;
|
||||
if (errno == 0 || (readbytes != (size_t) -1 &&
|
||||
(MyFlags & (MY_NABP | MY_FNABP))))
|
||||
|
|
|
@ -1669,250 +1669,13 @@ static MYSQL_METHODS client_methods=
|
|||
};
|
||||
|
||||
|
||||
|
||||
typedef enum my_cs_match_type_enum
|
||||
{
|
||||
/* MySQL and OS charsets are fully compatible */
|
||||
my_cs_exact,
|
||||
/* MySQL charset is very close to OS charset */
|
||||
my_cs_approx,
|
||||
/*
|
||||
MySQL knows this charset, but it is not supported as client character set.
|
||||
*/
|
||||
my_cs_unsupp
|
||||
} my_cs_match_type;
|
||||
|
||||
|
||||
typedef struct str2str_st
|
||||
{
|
||||
const char *os_name;
|
||||
const char *my_name;
|
||||
my_cs_match_type param;
|
||||
} MY_CSET_OS_NAME;
|
||||
|
||||
const MY_CSET_OS_NAME charsets[]=
|
||||
{
|
||||
#ifdef __WIN__
|
||||
{"cp437", "cp850", my_cs_approx},
|
||||
{"cp850", "cp850", my_cs_exact},
|
||||
{"cp852", "cp852", my_cs_exact},
|
||||
{"cp858", "cp850", my_cs_approx},
|
||||
{"cp866", "cp866", my_cs_exact},
|
||||
{"cp874", "tis620", my_cs_approx},
|
||||
{"cp932", "cp932", my_cs_exact},
|
||||
{"cp936", "gbk", my_cs_approx},
|
||||
{"cp949", "euckr", my_cs_approx},
|
||||
{"cp950", "big5", my_cs_exact},
|
||||
{"cp1200", "utf16le", my_cs_unsupp},
|
||||
{"cp1201", "utf16", my_cs_unsupp},
|
||||
{"cp1250", "cp1250", my_cs_exact},
|
||||
{"cp1251", "cp1251", my_cs_exact},
|
||||
{"cp1252", "latin1", my_cs_exact},
|
||||
{"cp1253", "greek", my_cs_exact},
|
||||
{"cp1254", "latin5", my_cs_exact},
|
||||
{"cp1255", "hebrew", my_cs_approx},
|
||||
{"cp1256", "cp1256", my_cs_exact},
|
||||
{"cp1257", "cp1257", my_cs_exact},
|
||||
{"cp10000", "macroman", my_cs_exact},
|
||||
{"cp10001", "sjis", my_cs_approx},
|
||||
{"cp10002", "big5", my_cs_approx},
|
||||
{"cp10008", "gb2312", my_cs_approx},
|
||||
{"cp10021", "tis620", my_cs_approx},
|
||||
{"cp10029", "macce", my_cs_exact},
|
||||
{"cp12001", "utf32", my_cs_unsupp},
|
||||
{"cp20107", "swe7", my_cs_exact},
|
||||
{"cp20127", "latin1", my_cs_approx},
|
||||
{"cp20866", "koi8r", my_cs_exact},
|
||||
{"cp20932", "ujis", my_cs_exact},
|
||||
{"cp20936", "gb2312", my_cs_approx},
|
||||
{"cp20949", "euckr", my_cs_approx},
|
||||
{"cp21866", "koi8u", my_cs_exact},
|
||||
{"cp28591", "latin1", my_cs_approx},
|
||||
{"cp28592", "latin2", my_cs_exact},
|
||||
{"cp28597", "greek", my_cs_exact},
|
||||
{"cp28598", "hebrew", my_cs_exact},
|
||||
{"cp28599", "latin5", my_cs_exact},
|
||||
{"cp28603", "latin7", my_cs_exact},
|
||||
#ifdef UNCOMMENT_THIS_WHEN_WL_4579_IS_DONE
|
||||
{"cp28605", "latin9", my_cs_exact},
|
||||
#endif
|
||||
{"cp38598", "hebrew", my_cs_exact},
|
||||
{"cp51932", "ujis", my_cs_exact},
|
||||
{"cp51936", "gb2312", my_cs_exact},
|
||||
{"cp51949", "euckr", my_cs_exact},
|
||||
{"cp51950", "big5", my_cs_exact},
|
||||
#ifdef UNCOMMENT_THIS_WHEN_WL_WL_4024_IS_DONE
|
||||
{"cp54936", "gb18030", my_cs_exact},
|
||||
#endif
|
||||
{"cp65001", "utf8", my_cs_exact},
|
||||
|
||||
#else /* not Windows */
|
||||
|
||||
{"646", "latin1", my_cs_approx}, /* Default on Solaris */
|
||||
{"ANSI_X3.4-1968", "latin1", my_cs_approx},
|
||||
{"ansi1251", "cp1251", my_cs_exact},
|
||||
{"armscii8", "armscii8", my_cs_exact},
|
||||
{"armscii-8", "armscii8", my_cs_exact},
|
||||
{"ASCII", "latin1", my_cs_approx},
|
||||
{"Big5", "big5", my_cs_exact},
|
||||
{"cp1251", "cp1251", my_cs_exact},
|
||||
{"cp1255", "hebrew", my_cs_approx},
|
||||
{"CP866", "cp866", my_cs_exact},
|
||||
{"eucCN", "gb2312", my_cs_exact},
|
||||
{"euc-CN", "gb2312", my_cs_exact},
|
||||
{"eucJP", "ujis", my_cs_exact},
|
||||
{"euc-JP", "ujis", my_cs_exact},
|
||||
{"eucKR", "euckr", my_cs_exact},
|
||||
{"euc-KR", "euckr", my_cs_exact},
|
||||
#ifdef UNCOMMENT_THIS_WHEN_WL_WL_4024_IS_DONE
|
||||
{"gb18030", "gb18030", my_cs_exact},
|
||||
#endif
|
||||
{"gb2312", "gb2312", my_cs_exact},
|
||||
{"gbk", "gbk", my_cs_exact},
|
||||
{"georgianps", "geostd8", my_cs_exact},
|
||||
{"georgian-ps", "geostd8", my_cs_exact},
|
||||
{"IBM-1252", "cp1252", my_cs_exact},
|
||||
|
||||
{"iso88591", "latin1", my_cs_approx},
|
||||
{"ISO_8859-1", "latin1", my_cs_approx},
|
||||
{"ISO8859-1", "latin1", my_cs_approx},
|
||||
{"ISO-8859-1", "latin1", my_cs_approx},
|
||||
|
||||
{"iso885913", "latin7", my_cs_exact},
|
||||
{"ISO_8859-13", "latin7", my_cs_exact},
|
||||
{"ISO8859-13", "latin7", my_cs_exact},
|
||||
{"ISO-8859-13", "latin7", my_cs_exact},
|
||||
|
||||
#ifdef UNCOMMENT_THIS_WHEN_WL_4579_IS_DONE
|
||||
{"iso885915", "latin9", my_cs_exact},
|
||||
{"ISO_8859-15", "latin9", my_cs_exact},
|
||||
{"ISO8859-15", "latin9", my_cs_exact},
|
||||
{"ISO-8859-15", "latin9", my_cs_exact},
|
||||
#endif
|
||||
|
||||
{"iso88592", "latin2", my_cs_exact},
|
||||
{"ISO_8859-2", "latin2", my_cs_exact},
|
||||
{"ISO8859-2", "latin2", my_cs_exact},
|
||||
{"ISO-8859-2", "latin2", my_cs_exact},
|
||||
|
||||
{"iso88597", "greek", my_cs_exact},
|
||||
{"ISO_8859-7", "greek", my_cs_exact},
|
||||
{"ISO8859-7", "greek", my_cs_exact},
|
||||
{"ISO-8859-7", "greek", my_cs_exact},
|
||||
|
||||
{"iso88598", "hebrew", my_cs_exact},
|
||||
{"ISO_8859-8", "hebrew", my_cs_exact},
|
||||
{"ISO8859-8", "hebrew", my_cs_exact},
|
||||
{"ISO-8859-8", "hebrew", my_cs_exact},
|
||||
|
||||
{"iso88599", "latin5", my_cs_exact},
|
||||
{"ISO_8859-9", "latin5", my_cs_exact},
|
||||
{"ISO8859-9", "latin5", my_cs_exact},
|
||||
{"ISO-8859-9", "latin5", my_cs_exact},
|
||||
|
||||
{"koi8r", "koi8r", my_cs_exact},
|
||||
{"KOI8-R", "koi8r", my_cs_exact},
|
||||
{"koi8u", "koi8u", my_cs_exact},
|
||||
{"KOI8-U", "koi8u", my_cs_exact},
|
||||
|
||||
{"roman8", "hp8", my_cs_exact}, /* Default on HP UX */
|
||||
|
||||
{"Shift_JIS", "sjis", my_cs_exact},
|
||||
{"SJIS", "sjis", my_cs_exact},
|
||||
{"shiftjisx0213", "sjis", my_cs_exact},
|
||||
|
||||
{"tis620", "tis620", my_cs_exact},
|
||||
{"tis-620", "tis620", my_cs_exact},
|
||||
|
||||
{"ujis", "ujis", my_cs_exact},
|
||||
|
||||
{"US-ASCII", "latin1", my_cs_approx},
|
||||
|
||||
{"utf8", "utf8", my_cs_exact},
|
||||
{"utf-8", "utf8", my_cs_exact},
|
||||
#endif
|
||||
{NULL, NULL, 0}
|
||||
};
|
||||
|
||||
|
||||
static const char *
|
||||
my_os_charset_to_mysql_charset(const char *csname)
|
||||
{
|
||||
const MY_CSET_OS_NAME *csp;
|
||||
for (csp= charsets; csp->os_name; csp++)
|
||||
{
|
||||
if (!my_strcasecmp(&my_charset_latin1, csp->os_name, csname))
|
||||
{
|
||||
switch (csp->param)
|
||||
{
|
||||
case my_cs_exact:
|
||||
return csp->my_name;
|
||||
|
||||
case my_cs_approx:
|
||||
/*
|
||||
Maybe we should print a warning eventually:
|
||||
character set correspondence is not exact.
|
||||
*/
|
||||
return csp->my_name;
|
||||
|
||||
default:
|
||||
my_printf_error(ER_UNKNOWN_ERROR,
|
||||
"OS character set '%s'"
|
||||
" is not supported by MySQL client",
|
||||
MYF(0), csp->my_name);
|
||||
goto def;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
my_printf_error(ER_UNKNOWN_ERROR,
|
||||
"Unknown OS character set '%s'.",
|
||||
MYF(0), csname);
|
||||
|
||||
def:
|
||||
csname= MYSQL_DEFAULT_CHARSET_NAME;
|
||||
my_printf_error(ER_UNKNOWN_ERROR,
|
||||
"Switching to the default character set '%s'.",
|
||||
MYF(0), csname);
|
||||
return csname;
|
||||
}
|
||||
|
||||
|
||||
#ifndef __WIN__
|
||||
#include <stdlib.h> /* for getenv() */
|
||||
#ifdef HAVE_LANGINFO_H
|
||||
#include <langinfo.h>
|
||||
#endif
|
||||
#ifdef HAVE_LOCALE_H
|
||||
#include <locale.h>
|
||||
#endif
|
||||
#endif /* __WIN__ */
|
||||
|
||||
|
||||
#include <my_sys.h>
|
||||
static int
|
||||
mysql_autodetect_character_set(MYSQL *mysql)
|
||||
{
|
||||
const char *csname= MYSQL_DEFAULT_CHARSET_NAME;
|
||||
|
||||
#ifdef __WIN__
|
||||
char cpbuf[64];
|
||||
{
|
||||
UINT cp= GetConsoleCP();
|
||||
if (cp == 0)
|
||||
cp= GetACP();
|
||||
my_snprintf(cpbuf, sizeof(cpbuf), "cp%d", (int)cp);
|
||||
csname= my_os_charset_to_mysql_charset(cpbuf);
|
||||
}
|
||||
#elif defined(HAVE_SETLOCALE) && defined(HAVE_NL_LANGINFO)
|
||||
{
|
||||
if (setlocale(LC_CTYPE, "") && (csname= nl_langinfo(CODESET)))
|
||||
csname= my_os_charset_to_mysql_charset(csname);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (mysql->options.charset_name)
|
||||
my_free(mysql->options.charset_name);
|
||||
if (!(mysql->options.charset_name= my_strdup(csname, MYF(MY_WME))))
|
||||
if (!(mysql->options.charset_name= my_strdup(my_default_csname(),MYF(MY_WME))))
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
@ -1953,16 +1716,13 @@ C_MODE_START
|
|||
int mysql_init_character_set(MYSQL *mysql)
|
||||
{
|
||||
/* Set character set */
|
||||
if (!mysql->options.charset_name)
|
||||
if (!mysql->options.charset_name ||
|
||||
!strcmp(mysql->options.charset_name,
|
||||
MYSQL_AUTODETECT_CHARSET_NAME))
|
||||
{
|
||||
if (!(mysql->options.charset_name=
|
||||
my_strdup(MYSQL_DEFAULT_CHARSET_NAME,MYF(MY_WME))))
|
||||
if (mysql_autodetect_character_set(mysql))
|
||||
return 1;
|
||||
}
|
||||
else if (!strcmp(mysql->options.charset_name,
|
||||
MYSQL_AUTODETECT_CHARSET_NAME) &&
|
||||
mysql_autodetect_character_set(mysql))
|
||||
return 1;
|
||||
|
||||
mysql_set_character_set_with_default_collation(mysql);
|
||||
|
||||
|
|
40
sql/field.cc
40
sql/field.cc
|
@ -10929,12 +10929,6 @@ bool Column_definition::has_default_expression()
|
|||
|
||||
bool Column_definition::set_compressed(const char *method)
|
||||
{
|
||||
enum enum_field_types sql_type= real_field_type();
|
||||
/* We can't use f_is_blob here as pack_flag is not yet set */
|
||||
if (sql_type == MYSQL_TYPE_VARCHAR || sql_type == MYSQL_TYPE_TINY_BLOB ||
|
||||
sql_type == MYSQL_TYPE_BLOB || sql_type == MYSQL_TYPE_MEDIUM_BLOB ||
|
||||
sql_type == MYSQL_TYPE_LONG_BLOB)
|
||||
{
|
||||
if (!method || !strcmp(method, zlib_compression_method->name))
|
||||
{
|
||||
unireg_check= Field::TMYSQL_COMPRESSED;
|
||||
|
@ -10942,7 +10936,41 @@ bool Column_definition::set_compressed(const char *method)
|
|||
return false;
|
||||
}
|
||||
my_error(ER_UNKNOWN_COMPRESSION_METHOD, MYF(0), method);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool Column_definition::set_compressed_deprecated(THD *thd, const char *method)
|
||||
{
|
||||
push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN,
|
||||
ER_WARN_DEPRECATED_SYNTAX,
|
||||
ER_THD(thd, ER_WARN_DEPRECATED_SYNTAX),
|
||||
"<data type> <character set clause> ... COMPRESSED...",
|
||||
"'<data type> COMPRESSED... <character set clause> ...'");
|
||||
return set_compressed(method);
|
||||
}
|
||||
|
||||
|
||||
bool
|
||||
Column_definition::set_compressed_deprecated_column_attribute(THD *thd,
|
||||
const char *pos,
|
||||
const char *method)
|
||||
{
|
||||
if (compression_method_ptr)
|
||||
{
|
||||
/*
|
||||
Compression method has already been set, e.g.:
|
||||
a VARCHAR(10) COMPRESSED DEFAULT 10 COMPRESSED
|
||||
*/
|
||||
thd->parse_error(ER_SYNTAX_ERROR, pos);
|
||||
return true;
|
||||
}
|
||||
enum enum_field_types sql_type= real_field_type();
|
||||
/* We can't use f_is_blob here as pack_flag is not yet set */
|
||||
if (sql_type == MYSQL_TYPE_VARCHAR || sql_type == MYSQL_TYPE_TINY_BLOB ||
|
||||
sql_type == MYSQL_TYPE_BLOB || sql_type == MYSQL_TYPE_MEDIUM_BLOB ||
|
||||
sql_type == MYSQL_TYPE_LONG_BLOB)
|
||||
return set_compressed_deprecated(thd, method);
|
||||
else
|
||||
my_error(ER_WRONG_FIELD_SPEC, MYF(0), field_name.str);
|
||||
return true;
|
||||
|
|
|
@ -4832,6 +4832,10 @@ public:
|
|||
*this= *def;
|
||||
}
|
||||
bool set_compressed(const char *method);
|
||||
bool set_compressed_deprecated(THD *thd, const char *method);
|
||||
bool set_compressed_deprecated_column_attribute(THD *thd,
|
||||
const char *pos,
|
||||
const char *method);
|
||||
void set_compression_method(Compression_method *compression_method_arg)
|
||||
{ compression_method_ptr= compression_method_arg; }
|
||||
Compression_method *compression_method() const
|
||||
|
|
|
@ -195,8 +195,7 @@ bool init_read_record(READ_RECORD *info,THD *thd, TABLE *table,
|
|||
info->table=table;
|
||||
info->addon_field= addon_field;
|
||||
|
||||
if ((table->s->tmp_table == INTERNAL_TMP_TABLE ||
|
||||
table->s->tmp_table == NON_TRANSACTIONAL_TMP_TABLE) &&
|
||||
if ((table->s->tmp_table == INTERNAL_TMP_TABLE) &&
|
||||
!addon_field)
|
||||
(void) table->file->extra(HA_EXTRA_MMAP);
|
||||
|
||||
|
|
|
@ -808,7 +808,7 @@ int set_var::light_check(THD *thd)
|
|||
if (var->check_type(type))
|
||||
{
|
||||
int err= type == OPT_GLOBAL ? ER_LOCAL_VARIABLE : ER_GLOBAL_VARIABLE;
|
||||
my_error(err, MYF(0), var->name);
|
||||
my_error(err, MYF(0), var->name.str);
|
||||
return -1;
|
||||
}
|
||||
if (type == OPT_GLOBAL && check_global_access(thd, SUPER_ACL))
|
||||
|
|
|
@ -700,8 +700,11 @@ static bool mysql_admin_table(THD* thd, TABLE_LIST* tables,
|
|||
MDL_SHARED_NO_READ_WRITE lock (MDL_SHARED_WRITE cannot be upgraded)
|
||||
by *not* having HA_CONCURRENT_OPTIMIZE table_flag.
|
||||
*/
|
||||
if (lock_type == TL_WRITE && !table->table->s->tmp_table &&
|
||||
table->mdl_request.type > MDL_SHARED_WRITE)
|
||||
if (lock_type == TL_WRITE && table->mdl_request.type > MDL_SHARED_WRITE)
|
||||
{
|
||||
if (table->table->s->tmp_table)
|
||||
thd->close_unused_temporary_table_instances(tables);
|
||||
else
|
||||
{
|
||||
if (wait_while_table_is_used(thd, table->table, HA_EXTRA_NOT_USED))
|
||||
goto err;
|
||||
|
@ -714,6 +717,7 @@ static bool mysql_admin_table(THD* thd, TABLE_LIST* tables,
|
|||
*/
|
||||
open_for_modify= 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (table->table->s->crashed && operator_func == &handler::ha_check)
|
||||
{
|
||||
|
|
|
@ -681,7 +681,7 @@ mysql_ha_fix_cond_and_key(SQL_HANDLER *handler,
|
|||
HA_ONLY_WHOLE_INDEX))
|
||||
{
|
||||
my_error(ER_KEY_DOESNT_SUPPORT, MYF(0),
|
||||
table->file->index_type(handler->keyno), keyinfo->name);
|
||||
table->file->index_type(handler->keyno), keyinfo->name.str);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
|
|
@ -1790,12 +1790,15 @@ int write_record(THD *thd, TABLE *table,COPY_INFO *info)
|
|||
}
|
||||
if (table->vfield)
|
||||
{
|
||||
my_bool abort_on_warning= thd->abort_on_warning;
|
||||
/*
|
||||
We have not yet called update_virtual_fields(VOL_UPDATE_FOR_READ)
|
||||
in handler methods for the just read row in record[1].
|
||||
*/
|
||||
table->move_fields(table->field, table->record[1], table->record[0]);
|
||||
thd->abort_on_warning= 0;
|
||||
table->update_virtual_fields(table->file, VCOL_UPDATE_FOR_REPLACE);
|
||||
thd->abort_on_warning= abort_on_warning;
|
||||
table->move_fields(table->field, table->record[0], table->record[1]);
|
||||
}
|
||||
if (info->handle_duplicates == DUP_UPDATE)
|
||||
|
|
|
@ -794,8 +794,6 @@ void init_update_queries(void)
|
|||
Note that SQLCOM_RENAME_TABLE should not be in this list!
|
||||
*/
|
||||
sql_command_flags[SQLCOM_CREATE_TABLE]|= CF_PREOPEN_TMP_TABLES;
|
||||
sql_command_flags[SQLCOM_DROP_TABLE]|= CF_PREOPEN_TMP_TABLES;
|
||||
sql_command_flags[SQLCOM_DROP_SEQUENCE]|= CF_PREOPEN_TMP_TABLES;
|
||||
sql_command_flags[SQLCOM_CREATE_INDEX]|= CF_PREOPEN_TMP_TABLES;
|
||||
sql_command_flags[SQLCOM_ALTER_TABLE]|= CF_PREOPEN_TMP_TABLES;
|
||||
sql_command_flags[SQLCOM_TRUNCATE]|= CF_PREOPEN_TMP_TABLES;
|
||||
|
@ -4799,7 +4797,14 @@ mysql_execute_command(THD *thd)
|
|||
case SQLCOM_DROP_SEQUENCE:
|
||||
case SQLCOM_DROP_TABLE:
|
||||
{
|
||||
int result;
|
||||
DBUG_ASSERT(first_table == all_tables && first_table != 0);
|
||||
|
||||
thd->open_options|= HA_OPEN_FOR_REPAIR;
|
||||
result= thd->open_temporary_tables(all_tables);
|
||||
thd->open_options&= ~HA_OPEN_FOR_REPAIR;
|
||||
if (result)
|
||||
goto error;
|
||||
if (!lex->tmp_table())
|
||||
{
|
||||
if (check_table_access(thd, DROP_ACL, all_tables, FALSE, UINT_MAX, FALSE))
|
||||
|
|
|
@ -10066,6 +10066,8 @@ do_continue:;
|
|||
|
||||
DEBUG_SYNC(thd, "alter_table_copy_after_lock_upgrade");
|
||||
}
|
||||
else
|
||||
thd->close_unused_temporary_table_instances(table_list);
|
||||
|
||||
// It's now safe to take the table level lock.
|
||||
if (lock_tables(thd, table_list, alter_ctx.tables_opened,
|
||||
|
|
108
sql/sql_yacc.yy
108
sql/sql_yacc.yy
|
@ -2059,7 +2059,10 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize);
|
|||
ref_list opt_match_clause opt_on_update_delete use
|
||||
opt_delete_options opt_delete_option varchar nchar nvarchar
|
||||
opt_outer table_list table_name table_alias_ref_list table_alias_ref
|
||||
opt_attribute opt_attribute_list attribute column_list column_list_id
|
||||
attribute attribute_list
|
||||
compressed_deprecated_data_type_attribute
|
||||
compressed_deprecated_column_attribute
|
||||
column_list column_list_id
|
||||
opt_column_list grant_privileges grant_ident grant_list grant_option
|
||||
object_privilege object_privilege_list user_list user_and_role_list
|
||||
rename_list table_or_tables
|
||||
|
@ -6671,7 +6674,10 @@ opt_asrow_attribute_list:
|
|||
;
|
||||
|
||||
field_def:
|
||||
opt_attribute
|
||||
/* empty */ { }
|
||||
| attribute_list
|
||||
| attribute_list compressed_deprecated_column_attribute
|
||||
| attribute_list compressed_deprecated_column_attribute attribute_list
|
||||
| opt_generated_always AS virtual_column_func
|
||||
{
|
||||
Lex->last_field->vcol_info= $3;
|
||||
|
@ -6860,6 +6866,13 @@ field_type_numeric:
|
|||
;
|
||||
|
||||
|
||||
opt_binary_and_compression:
|
||||
/* empty */
|
||||
| binary
|
||||
| binary compressed_deprecated_data_type_attribute
|
||||
| compressed opt_binary
|
||||
;
|
||||
|
||||
field_type_string:
|
||||
char opt_field_length_default_1 opt_binary
|
||||
{
|
||||
|
@ -6875,25 +6888,25 @@ field_type_string:
|
|||
Lex->charset=&my_charset_bin;
|
||||
$$.set(&type_handler_string, $2);
|
||||
}
|
||||
| varchar field_length opt_binary
|
||||
| varchar field_length opt_binary_and_compression
|
||||
{
|
||||
$$.set(&type_handler_varchar, $2);
|
||||
}
|
||||
| VARCHAR2_ORACLE_SYM field_length opt_binary
|
||||
| VARCHAR2_ORACLE_SYM field_length opt_binary_and_compression
|
||||
{
|
||||
$$.set(&type_handler_varchar, $2);
|
||||
}
|
||||
| nvarchar field_length opt_bin_mod
|
||||
| nvarchar field_length opt_compressed opt_bin_mod
|
||||
{
|
||||
$$.set(&type_handler_varchar, $2);
|
||||
bincmp_collation(national_charset_info, $3);
|
||||
bincmp_collation(national_charset_info, $4);
|
||||
}
|
||||
| VARBINARY field_length
|
||||
| VARBINARY field_length opt_compressed
|
||||
{
|
||||
Lex->charset=&my_charset_bin;
|
||||
$$.set(&type_handler_varchar, $2);
|
||||
}
|
||||
| RAW_ORACLE_SYM field_length
|
||||
| RAW_ORACLE_SYM field_length opt_compressed
|
||||
{
|
||||
Lex->charset= &my_charset_bin;
|
||||
$$.set(&type_handler_varchar, $2);
|
||||
|
@ -6959,17 +6972,17 @@ field_type_temporal:
|
|||
|
||||
|
||||
field_type_lob:
|
||||
TINYBLOB
|
||||
TINYBLOB opt_compressed
|
||||
{
|
||||
Lex->charset=&my_charset_bin;
|
||||
$$.set(&type_handler_tiny_blob);
|
||||
}
|
||||
| BLOB_MARIADB_SYM opt_field_length
|
||||
| BLOB_MARIADB_SYM opt_field_length opt_compressed
|
||||
{
|
||||
Lex->charset=&my_charset_bin;
|
||||
$$.set(&type_handler_blob, $2);
|
||||
}
|
||||
| BLOB_ORACLE_SYM opt_field_length
|
||||
| BLOB_ORACLE_SYM opt_field_length opt_compressed
|
||||
{
|
||||
Lex->charset=&my_charset_bin;
|
||||
$$.set(&type_handler_long_blob);
|
||||
|
@ -6985,36 +6998,36 @@ field_type_lob:
|
|||
sym_group_geom.needed_define));
|
||||
#endif
|
||||
}
|
||||
| MEDIUMBLOB
|
||||
| MEDIUMBLOB opt_compressed
|
||||
{
|
||||
Lex->charset=&my_charset_bin;
|
||||
$$.set(&type_handler_medium_blob);
|
||||
}
|
||||
| LONGBLOB
|
||||
| LONGBLOB opt_compressed
|
||||
{
|
||||
Lex->charset=&my_charset_bin;
|
||||
$$.set(&type_handler_long_blob);
|
||||
}
|
||||
| LONG_SYM VARBINARY
|
||||
| LONG_SYM VARBINARY opt_compressed
|
||||
{
|
||||
Lex->charset=&my_charset_bin;
|
||||
$$.set(&type_handler_medium_blob);
|
||||
}
|
||||
| LONG_SYM varchar opt_binary
|
||||
| LONG_SYM varchar opt_binary_and_compression
|
||||
{ $$.set(&type_handler_medium_blob); }
|
||||
| TINYTEXT opt_binary
|
||||
| TINYTEXT opt_binary_and_compression
|
||||
{ $$.set(&type_handler_tiny_blob); }
|
||||
| TEXT_SYM opt_field_length opt_binary
|
||||
| TEXT_SYM opt_field_length opt_binary_and_compression
|
||||
{ $$.set(&type_handler_blob, $2); }
|
||||
| MEDIUMTEXT opt_binary
|
||||
| MEDIUMTEXT opt_binary_and_compression
|
||||
{ $$.set(&type_handler_medium_blob); }
|
||||
| LONGTEXT opt_binary
|
||||
| LONGTEXT opt_binary_and_compression
|
||||
{ $$.set(&type_handler_long_blob); }
|
||||
| CLOB_ORACLE_SYM opt_binary
|
||||
| CLOB_ORACLE_SYM opt_binary_and_compression
|
||||
{ $$.set(&type_handler_long_blob); }
|
||||
| LONG_SYM opt_binary
|
||||
| LONG_SYM opt_binary_and_compression
|
||||
{ $$.set(&type_handler_medium_blob); }
|
||||
| JSON_SYM
|
||||
| JSON_SYM opt_compressed
|
||||
{
|
||||
Lex->charset= &my_charset_utf8mb4_bin;
|
||||
$$.set(&type_handler_json_longtext);
|
||||
|
@ -7130,13 +7143,9 @@ opt_precision:
|
|||
| precision { $$= $1; }
|
||||
;
|
||||
|
||||
opt_attribute:
|
||||
/* empty */ {}
|
||||
| opt_attribute_list {}
|
||||
;
|
||||
|
||||
opt_attribute_list:
|
||||
opt_attribute_list attribute {}
|
||||
attribute_list:
|
||||
attribute_list attribute {}
|
||||
| attribute
|
||||
;
|
||||
|
||||
|
@ -7164,11 +7173,6 @@ attribute:
|
|||
$2->name,Lex->charset->csname));
|
||||
Lex->last_field->charset= $2;
|
||||
}
|
||||
| COMPRESSED_SYM opt_compression_method
|
||||
{
|
||||
if (unlikely(Lex->last_field->set_compressed($2)))
|
||||
MYSQL_YYABORT;
|
||||
}
|
||||
| serial_attribute
|
||||
;
|
||||
|
||||
|
@ -7177,6 +7181,36 @@ opt_compression_method:
|
|||
| equal ident { $$= $2.str; }
|
||||
;
|
||||
|
||||
opt_compressed:
|
||||
/* empty */ {}
|
||||
| compressed { }
|
||||
;
|
||||
|
||||
compressed:
|
||||
COMPRESSED_SYM opt_compression_method
|
||||
{
|
||||
if (unlikely(Lex->last_field->set_compressed($2)))
|
||||
MYSQL_YYABORT;
|
||||
}
|
||||
;
|
||||
|
||||
compressed_deprecated_data_type_attribute:
|
||||
COMPRESSED_SYM opt_compression_method
|
||||
{
|
||||
if (unlikely(Lex->last_field->set_compressed_deprecated(thd, $2)))
|
||||
MYSQL_YYABORT;
|
||||
}
|
||||
;
|
||||
|
||||
compressed_deprecated_column_attribute:
|
||||
COMPRESSED_SYM opt_compression_method
|
||||
{
|
||||
if (unlikely(Lex->last_field->
|
||||
set_compressed_deprecated_column_attribute(thd, $1.pos(), $2)))
|
||||
MYSQL_YYABORT;
|
||||
}
|
||||
;
|
||||
|
||||
asrow_attribute:
|
||||
not NULL_SYM
|
||||
{
|
||||
|
@ -7335,7 +7369,11 @@ charset_or_alias:
|
|||
|
||||
opt_binary:
|
||||
/* empty */ { bincmp_collation(NULL, false); }
|
||||
| BYTE_SYM { bincmp_collation(&my_charset_bin, false); }
|
||||
| binary {}
|
||||
;
|
||||
|
||||
binary:
|
||||
BYTE_SYM { bincmp_collation(&my_charset_bin, false); }
|
||||
| charset_or_alias opt_bin_mod { bincmp_collation($1, $2); }
|
||||
| BINARY { bincmp_collation(NULL, true); }
|
||||
| BINARY charset_or_alias { bincmp_collation($2, true); }
|
||||
|
@ -15695,6 +15733,7 @@ keyword_sp_var_not_label:
|
|||
| COLUMN_DELETE_SYM
|
||||
| COLUMN_GET_SYM
|
||||
| COMMENT_SYM
|
||||
| COMPRESSED_SYM
|
||||
| DEALLOCATE_SYM
|
||||
| EXAMINED_SYM
|
||||
| EXCLUDE_SYM
|
||||
|
@ -15908,7 +15947,6 @@ keyword_sp_var_and_label:
|
|||
| COMMITTED_SYM
|
||||
| COMPACT_SYM
|
||||
| COMPLETION_SYM
|
||||
| COMPRESSED_SYM
|
||||
| CONCURRENT
|
||||
| CONNECTION_SYM
|
||||
| CONSISTENT_SYM
|
||||
|
|
|
@ -295,10 +295,10 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize);
|
|||
%parse-param { THD *thd }
|
||||
%lex-param { THD *thd }
|
||||
/*
|
||||
Currently there are 49 shift/reduce conflicts.
|
||||
Currently there are 51 shift/reduce conflicts.
|
||||
We should not introduce new conflicts any more.
|
||||
*/
|
||||
%expect 49
|
||||
%expect 51
|
||||
|
||||
/*
|
||||
Comments for TOKENS.
|
||||
|
@ -1546,7 +1546,10 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize);
|
|||
ref_list opt_match_clause opt_on_update_delete use
|
||||
opt_delete_options opt_delete_option varchar nchar nvarchar
|
||||
opt_outer table_list table_name table_alias_ref_list table_alias_ref
|
||||
opt_attribute opt_attribute_list attribute column_list column_list_id
|
||||
attribute attribute_list
|
||||
compressed_deprecated_data_type_attribute
|
||||
compressed_deprecated_column_attribute
|
||||
column_list column_list_id
|
||||
opt_column_list grant_privileges grant_ident grant_list grant_option
|
||||
object_privilege object_privilege_list user_list user_and_role_list
|
||||
rename_list table_or_tables
|
||||
|
@ -6680,7 +6683,10 @@ opt_asrow_attribute_list:
|
|||
;
|
||||
|
||||
field_def:
|
||||
opt_attribute
|
||||
/* empty */ { }
|
||||
| attribute_list
|
||||
| attribute_list compressed_deprecated_column_attribute
|
||||
| attribute_list compressed_deprecated_column_attribute attribute_list
|
||||
| opt_generated_always AS virtual_column_func
|
||||
{
|
||||
Lex->last_field->vcol_info= $3;
|
||||
|
@ -6879,6 +6885,13 @@ field_type_numeric:
|
|||
;
|
||||
|
||||
|
||||
opt_binary_and_compression:
|
||||
/* empty */
|
||||
| binary
|
||||
| binary compressed_deprecated_data_type_attribute
|
||||
| compressed opt_binary
|
||||
;
|
||||
|
||||
field_type_string:
|
||||
char opt_field_length_default_1 opt_binary
|
||||
{
|
||||
|
@ -6894,25 +6907,25 @@ field_type_string:
|
|||
Lex->charset=&my_charset_bin;
|
||||
$$.set(&type_handler_string, $2);
|
||||
}
|
||||
| varchar field_length opt_binary
|
||||
| varchar field_length opt_binary_and_compression
|
||||
{
|
||||
$$.set(&type_handler_varchar, $2);
|
||||
}
|
||||
| VARCHAR2_ORACLE_SYM field_length opt_binary
|
||||
| VARCHAR2_ORACLE_SYM field_length opt_binary_and_compression
|
||||
{
|
||||
$$.set(&type_handler_varchar, $2);
|
||||
}
|
||||
| nvarchar field_length opt_bin_mod
|
||||
| nvarchar field_length opt_compressed opt_bin_mod
|
||||
{
|
||||
$$.set(&type_handler_varchar, $2);
|
||||
bincmp_collation(national_charset_info, $3);
|
||||
bincmp_collation(national_charset_info, $4);
|
||||
}
|
||||
| VARBINARY field_length
|
||||
| VARBINARY field_length opt_compressed
|
||||
{
|
||||
Lex->charset=&my_charset_bin;
|
||||
$$.set(&type_handler_varchar, $2);
|
||||
}
|
||||
| RAW_ORACLE_SYM field_length
|
||||
| RAW_ORACLE_SYM field_length opt_compressed
|
||||
{
|
||||
Lex->charset= &my_charset_bin;
|
||||
$$.set(&type_handler_varchar, $2);
|
||||
|
@ -7020,17 +7033,17 @@ field_type_temporal:
|
|||
|
||||
|
||||
field_type_lob:
|
||||
TINYBLOB
|
||||
TINYBLOB opt_compressed
|
||||
{
|
||||
Lex->charset=&my_charset_bin;
|
||||
$$.set(&type_handler_tiny_blob);
|
||||
}
|
||||
| BLOB_MARIADB_SYM opt_field_length
|
||||
| BLOB_MARIADB_SYM opt_field_length opt_compressed
|
||||
{
|
||||
Lex->charset=&my_charset_bin;
|
||||
$$.set(&type_handler_blob, $2);
|
||||
}
|
||||
| BLOB_ORACLE_SYM opt_field_length
|
||||
| BLOB_ORACLE_SYM opt_field_length opt_compressed
|
||||
{
|
||||
Lex->charset=&my_charset_bin;
|
||||
$$.set(&type_handler_long_blob);
|
||||
|
@ -7046,36 +7059,36 @@ field_type_lob:
|
|||
sym_group_geom.needed_define));
|
||||
#endif
|
||||
}
|
||||
| MEDIUMBLOB
|
||||
| MEDIUMBLOB opt_compressed
|
||||
{
|
||||
Lex->charset=&my_charset_bin;
|
||||
$$.set(&type_handler_medium_blob);
|
||||
}
|
||||
| LONGBLOB
|
||||
| LONGBLOB opt_compressed
|
||||
{
|
||||
Lex->charset=&my_charset_bin;
|
||||
$$.set(&type_handler_long_blob);
|
||||
}
|
||||
| LONG_SYM VARBINARY
|
||||
| LONG_SYM VARBINARY opt_compressed
|
||||
{
|
||||
Lex->charset=&my_charset_bin;
|
||||
$$.set(&type_handler_medium_blob);
|
||||
}
|
||||
| LONG_SYM varchar opt_binary
|
||||
| LONG_SYM varchar opt_binary_and_compression
|
||||
{ $$.set(&type_handler_medium_blob); }
|
||||
| TINYTEXT opt_binary
|
||||
| TINYTEXT opt_binary_and_compression
|
||||
{ $$.set(&type_handler_tiny_blob); }
|
||||
| TEXT_SYM opt_field_length opt_binary
|
||||
| TEXT_SYM opt_field_length opt_binary_and_compression
|
||||
{ $$.set(&type_handler_blob, $2); }
|
||||
| MEDIUMTEXT opt_binary
|
||||
| MEDIUMTEXT opt_binary_and_compression
|
||||
{ $$.set(&type_handler_medium_blob); }
|
||||
| LONGTEXT opt_binary
|
||||
| LONGTEXT opt_binary_and_compression
|
||||
{ $$.set(&type_handler_long_blob); }
|
||||
| CLOB_ORACLE_SYM opt_binary
|
||||
| CLOB_ORACLE_SYM opt_binary_and_compression
|
||||
{ $$.set(&type_handler_long_blob); }
|
||||
| LONG_SYM opt_binary
|
||||
| LONG_SYM opt_binary_and_compression
|
||||
{ $$.set(&type_handler_medium_blob); }
|
||||
| JSON_SYM
|
||||
| JSON_SYM opt_compressed
|
||||
{
|
||||
Lex->charset= &my_charset_utf8mb4_bin;
|
||||
$$.set(&type_handler_json_longtext);
|
||||
|
@ -7218,13 +7231,9 @@ opt_precision:
|
|||
| precision { $$= $1; }
|
||||
;
|
||||
|
||||
opt_attribute:
|
||||
/* empty */ {}
|
||||
| opt_attribute_list {}
|
||||
;
|
||||
|
||||
opt_attribute_list:
|
||||
opt_attribute_list attribute {}
|
||||
attribute_list:
|
||||
attribute_list attribute {}
|
||||
| attribute
|
||||
;
|
||||
|
||||
|
@ -7252,11 +7261,6 @@ attribute:
|
|||
$2->name,Lex->charset->csname));
|
||||
Lex->last_field->charset= $2;
|
||||
}
|
||||
| COMPRESSED_SYM opt_compression_method
|
||||
{
|
||||
if (unlikely(Lex->last_field->set_compressed($2)))
|
||||
MYSQL_YYABORT;
|
||||
}
|
||||
| serial_attribute
|
||||
;
|
||||
|
||||
|
@ -7265,6 +7269,36 @@ opt_compression_method:
|
|||
| equal ident { $$= $2.str; }
|
||||
;
|
||||
|
||||
opt_compressed:
|
||||
/* empty */ {}
|
||||
| compressed { }
|
||||
;
|
||||
|
||||
compressed:
|
||||
COMPRESSED_SYM opt_compression_method
|
||||
{
|
||||
if (unlikely(Lex->last_field->set_compressed($2)))
|
||||
MYSQL_YYABORT;
|
||||
}
|
||||
;
|
||||
|
||||
compressed_deprecated_data_type_attribute:
|
||||
COMPRESSED_SYM opt_compression_method
|
||||
{
|
||||
if (unlikely(Lex->last_field->set_compressed_deprecated(thd, $2)))
|
||||
MYSQL_YYABORT;
|
||||
}
|
||||
;
|
||||
|
||||
compressed_deprecated_column_attribute:
|
||||
COMPRESSED_SYM opt_compression_method
|
||||
{
|
||||
if (unlikely(Lex->last_field->
|
||||
set_compressed_deprecated_column_attribute(thd, $1.pos(), $2)))
|
||||
MYSQL_YYABORT;
|
||||
}
|
||||
;
|
||||
|
||||
asrow_attribute:
|
||||
not NULL_SYM
|
||||
{
|
||||
|
@ -7436,7 +7470,11 @@ charset_or_alias:
|
|||
|
||||
opt_binary:
|
||||
/* empty */ { bincmp_collation(NULL, false); }
|
||||
| BYTE_SYM { bincmp_collation(&my_charset_bin, false); }
|
||||
| binary {}
|
||||
;
|
||||
|
||||
binary:
|
||||
BYTE_SYM { bincmp_collation(&my_charset_bin, false); }
|
||||
| charset_or_alias opt_bin_mod { bincmp_collation($1, $2); }
|
||||
| BINARY { bincmp_collation(NULL, true); }
|
||||
| BINARY charset_or_alias { bincmp_collation($2, true); }
|
||||
|
@ -15795,6 +15833,7 @@ keyword_label:
|
|||
| keyword_sp_var_and_label
|
||||
| keyword_sysvar_type
|
||||
| FUNCTION_SYM
|
||||
| COMPRESSED_SYM
|
||||
;
|
||||
|
||||
keyword_sysvar_name:
|
||||
|
@ -15864,6 +15903,7 @@ keyword_sp_var_not_label:
|
|||
| COLUMN_DELETE_SYM
|
||||
| COLUMN_GET_SYM
|
||||
| COMMENT_SYM
|
||||
| COMPRESSED_SYM
|
||||
| DEALLOCATE_SYM
|
||||
| EXAMINED_SYM
|
||||
| EXCLUDE_SYM
|
||||
|
@ -16077,7 +16117,6 @@ keyword_sp_var_and_label:
|
|||
| COMMITTED_SYM
|
||||
| COMPACT_SYM
|
||||
| COMPLETION_SYM
|
||||
| COMPRESSED_SYM
|
||||
| CONCURRENT
|
||||
| CONNECTION_SYM
|
||||
| CONSISTENT_SYM
|
||||
|
|
|
@ -390,6 +390,9 @@ bool THD::open_temporary_table(TABLE_LIST *tl)
|
|||
rgi_slave->is_parallel_exec &&
|
||||
wait_for_prior_commit())
|
||||
DBUG_RETURN(true);
|
||||
|
||||
if (!table && is_error())
|
||||
DBUG_RETURN(true); // Error when opening table
|
||||
}
|
||||
|
||||
if (!table)
|
||||
|
|
|
@ -7827,7 +7827,7 @@ dup_fk:
|
|||
Sql_condition::WARN_LEVEL_WARN,
|
||||
HA_ERR_WRONG_INDEX,
|
||||
"InnoDB could not find key"
|
||||
" with name %s", key->name);
|
||||
" with name %s", key->name.str);
|
||||
} else {
|
||||
ut_ad(!index->to_be_dropped);
|
||||
if (!index->is_primary()) {
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 2013, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2018, MariaDB Corporation.
|
||||
Copyright (c) 2018, 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
|
||||
|
@ -358,6 +358,24 @@ public:
|
|||
return(true);
|
||||
}
|
||||
|
||||
/**
|
||||
Iterate over all the blocks in reverse and call the iterator
|
||||
@return false if iteration was terminated. */
|
||||
template <typename Functor>
|
||||
bool for_each_block_in_reverse(const Functor& functor) const
|
||||
{
|
||||
for (block_t* block = UT_LIST_GET_LAST(m_list);
|
||||
block != NULL;
|
||||
block = UT_LIST_GET_PREV(m_node, block)) {
|
||||
|
||||
if (!functor(block)) {
|
||||
return(false);
|
||||
}
|
||||
}
|
||||
|
||||
return(true);
|
||||
}
|
||||
|
||||
/**
|
||||
@return the first block */
|
||||
block_t* front()
|
||||
|
|
|
@ -525,7 +525,7 @@ struct mtr_t {
|
|||
/** Check if this mini-transaction is dirtying a clean page.
|
||||
@param block block being x-fixed
|
||||
@return true if the mtr is dirtying a clean page. */
|
||||
static bool is_block_dirtied(const buf_block_t* block)
|
||||
static inline bool is_block_dirtied(const buf_block_t* block)
|
||||
MY_ATTRIBUTE((warn_unused_result));
|
||||
|
||||
private:
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 1995, 2014, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2017, MariaDB Corporation.
|
||||
Copyright (c) 2017, 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
|
||||
|
@ -26,6 +26,20 @@ Created 11/26/1995 Heikki Tuuri
|
|||
|
||||
#include "buf0buf.h"
|
||||
|
||||
/** Check if a mini-transaction is dirtying a clean page.
|
||||
@return true if the mtr is dirtying a clean page. */
|
||||
bool
|
||||
mtr_t::is_block_dirtied(const buf_block_t* block)
|
||||
{
|
||||
ut_ad(buf_block_get_state(block) == BUF_BLOCK_FILE_PAGE);
|
||||
ut_ad(block->page.buf_fix_count > 0);
|
||||
|
||||
/* It is OK to read oldest_modification because no
|
||||
other thread can be performing a write of it and it
|
||||
is only during write that the value is reset to 0. */
|
||||
return(block->page.oldest_modification == 0);
|
||||
}
|
||||
|
||||
/**
|
||||
Pushes an object to an mtr memo stack. */
|
||||
void
|
||||
|
|
|
@ -38,7 +38,9 @@ enum mtr_log_t {
|
|||
/** Default mode: log all operations modifying disk-based data */
|
||||
MTR_LOG_ALL = 21,
|
||||
|
||||
/** Log no operations and dirty pages are not added to the flush list */
|
||||
/** Log no operations and dirty pages are not added to the flush list.
|
||||
Set when applying log in crash recovery or when a modification of a
|
||||
ROW_FORMAT=COMPRESSED page is attempted. */
|
||||
MTR_LOG_NONE = 22,
|
||||
|
||||
/** Don't generate REDO log but add dirty pages to flush list */
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 1995, 2017, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2017, 2018, MariaDB Corporation.
|
||||
Copyright (c) 2017, 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
|
||||
|
@ -37,15 +37,42 @@ Created 11/26/1995 Heikki Tuuri
|
|||
|
||||
/** Iterate over a memo block in reverse. */
|
||||
template <typename Functor>
|
||||
struct Iterate {
|
||||
struct CIterate {
|
||||
CIterate() : functor() {}
|
||||
|
||||
/** Release specific object */
|
||||
explicit Iterate(Functor& functor)
|
||||
:
|
||||
m_functor(functor)
|
||||
CIterate(const Functor& functor) : functor(functor) {}
|
||||
|
||||
/** @return false if the functor returns false. */
|
||||
bool operator()(mtr_buf_t::block_t* block) const
|
||||
{
|
||||
/* Do nothing */
|
||||
const mtr_memo_slot_t* start =
|
||||
reinterpret_cast<const mtr_memo_slot_t*>(
|
||||
block->begin());
|
||||
|
||||
mtr_memo_slot_t* slot =
|
||||
reinterpret_cast<mtr_memo_slot_t*>(
|
||||
block->end());
|
||||
|
||||
ut_ad(!(block->used() % sizeof(*slot)));
|
||||
|
||||
while (slot-- != start) {
|
||||
|
||||
if (!functor(slot)) {
|
||||
return(false);
|
||||
}
|
||||
}
|
||||
|
||||
return(true);
|
||||
}
|
||||
|
||||
Functor functor;
|
||||
};
|
||||
|
||||
template <typename Functor>
|
||||
struct Iterate {
|
||||
Iterate() : functor() {}
|
||||
|
||||
Iterate(const Functor& functor) : functor(functor) {}
|
||||
|
||||
/** @return false if the functor returns false. */
|
||||
bool operator()(mtr_buf_t::block_t* block)
|
||||
|
@ -62,7 +89,7 @@ struct Iterate {
|
|||
|
||||
while (slot-- != start) {
|
||||
|
||||
if (!m_functor(slot)) {
|
||||
if (!functor(slot)) {
|
||||
return(false);
|
||||
}
|
||||
}
|
||||
|
@ -70,7 +97,7 @@ struct Iterate {
|
|||
return(true);
|
||||
}
|
||||
|
||||
Functor& m_functor;
|
||||
Functor functor;
|
||||
};
|
||||
|
||||
/** Find specific object */
|
||||
|
@ -430,20 +457,6 @@ private:
|
|||
lsn_t m_end_lsn;
|
||||
};
|
||||
|
||||
/** Check if a mini-transaction is dirtying a clean page.
|
||||
@return true if the mtr is dirtying a clean page. */
|
||||
bool
|
||||
mtr_t::is_block_dirtied(const buf_block_t* block)
|
||||
{
|
||||
ut_ad(buf_block_get_state(block) == BUF_BLOCK_FILE_PAGE);
|
||||
ut_ad(block->page.buf_fix_count > 0);
|
||||
|
||||
/* It is OK to read oldest_modification because no
|
||||
other thread can be performing a write of it and it
|
||||
is only during write that the value is reset to 0. */
|
||||
return(block->page.oldest_modification == 0);
|
||||
}
|
||||
|
||||
/** Write the block contents to the REDO log */
|
||||
struct mtr_write_log_t {
|
||||
/** Append a block to the redo log buffer.
|
||||
|
@ -509,12 +522,7 @@ mtr_t::Command::release_resources()
|
|||
/* Currently only used in commit */
|
||||
ut_ad(m_impl->m_state == MTR_STATE_COMMITTING);
|
||||
|
||||
#ifdef UNIV_DEBUG
|
||||
DebugCheck release;
|
||||
Iterate<DebugCheck> iterator(release);
|
||||
|
||||
m_impl->m_memo.for_each_block_in_reverse(iterator);
|
||||
#endif /* UNIV_DEBUG */
|
||||
ut_d(m_impl->m_memo.for_each_block_in_reverse(CIterate<DebugCheck>()));
|
||||
|
||||
/* Reset the mtr buffers */
|
||||
m_impl->m_log.erase();
|
||||
|
@ -701,11 +709,10 @@ mtr_t::memo_release(const void* object, ulint type)
|
|||
middle of a mini-transaction. */
|
||||
ut_ad(!m_impl.m_modifications || type != MTR_MEMO_PAGE_X_FIX);
|
||||
|
||||
Find find(object, type);
|
||||
Iterate<Find> iterator(find);
|
||||
Iterate<Find> iteration(Find(object, type));
|
||||
|
||||
if (!m_impl.m_memo.for_each_block_in_reverse(iterator)) {
|
||||
memo_slot_release(find.m_slot);
|
||||
if (!m_impl.m_memo.for_each_block_in_reverse(iteration)) {
|
||||
memo_slot_release(iteration.functor.m_slot);
|
||||
return(true);
|
||||
}
|
||||
|
||||
|
@ -725,11 +732,10 @@ mtr_t::release_page(const void* ptr, mtr_memo_type_t type)
|
|||
middle of a mini-transaction. */
|
||||
ut_ad(!m_impl.m_modifications || type != MTR_MEMO_PAGE_X_FIX);
|
||||
|
||||
FindPage find(ptr, type);
|
||||
Iterate<FindPage> iterator(find);
|
||||
Iterate<FindPage> iteration(FindPage(ptr, type));
|
||||
|
||||
if (!m_impl.m_memo.for_each_block_in_reverse(iterator)) {
|
||||
memo_slot_release(find.get_slot());
|
||||
if (!m_impl.m_memo.for_each_block_in_reverse(iteration)) {
|
||||
memo_slot_release(iteration.functor.get_slot());
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -853,10 +859,7 @@ mtr_t::Command::finish_write(
|
|||
void
|
||||
mtr_t::Command::release_all()
|
||||
{
|
||||
ReleaseAll release;
|
||||
Iterate<ReleaseAll> iterator(release);
|
||||
|
||||
m_impl->m_memo.for_each_block_in_reverse(iterator);
|
||||
m_impl->m_memo.for_each_block_in_reverse(CIterate<ReleaseAll>());
|
||||
|
||||
/* Note that we have released the latches. */
|
||||
m_locks_released = 1;
|
||||
|
@ -866,10 +869,7 @@ mtr_t::Command::release_all()
|
|||
void
|
||||
mtr_t::Command::release_latches()
|
||||
{
|
||||
ReleaseLatches release;
|
||||
Iterate<ReleaseLatches> iterator(release);
|
||||
|
||||
m_impl->m_memo.for_each_block_in_reverse(iterator);
|
||||
m_impl->m_memo.for_each_block_in_reverse(CIterate<ReleaseLatches>());
|
||||
|
||||
/* Note that we have released the latches. */
|
||||
m_locks_released = 1;
|
||||
|
@ -879,10 +879,10 @@ mtr_t::Command::release_latches()
|
|||
void
|
||||
mtr_t::Command::release_blocks()
|
||||
{
|
||||
ReleaseBlocks release(m_start_lsn, m_end_lsn, m_impl->m_flush_observer);
|
||||
Iterate<ReleaseBlocks> iterator(release);
|
||||
|
||||
m_impl->m_memo.for_each_block_in_reverse(iterator);
|
||||
m_impl->m_memo.for_each_block_in_reverse(
|
||||
CIterate<const ReleaseBlocks>(
|
||||
ReleaseBlocks(m_start_lsn, m_end_lsn,
|
||||
m_impl->m_flush_observer)));
|
||||
}
|
||||
|
||||
/** Write the redo log record, add dirty pages to the flush list and release
|
||||
|
@ -927,10 +927,8 @@ mtr_t::memo_contains(
|
|||
const void* object,
|
||||
ulint type)
|
||||
{
|
||||
Find find(object, type);
|
||||
Iterate<Find> iterator(find);
|
||||
|
||||
if (memo->for_each_block_in_reverse(iterator)) {
|
||||
Iterate<Find> iteration(Find(object, type));
|
||||
if (memo->for_each_block_in_reverse(iteration)) {
|
||||
return(false);
|
||||
}
|
||||
|
||||
|
@ -1019,10 +1017,8 @@ mtr_t::memo_contains_flagged(const void* ptr, ulint flags) const
|
|||
ut_ad(m_impl.m_magic_n == MTR_MAGIC_N);
|
||||
ut_ad(is_committing() || is_active());
|
||||
|
||||
FlaggedCheck check(ptr, flags);
|
||||
Iterate<FlaggedCheck> iterator(check);
|
||||
|
||||
return(!m_impl.m_memo.for_each_block_in_reverse(iterator));
|
||||
return !m_impl.m_memo.for_each_block_in_reverse(
|
||||
CIterate<FlaggedCheck>(FlaggedCheck(ptr, flags)));
|
||||
}
|
||||
|
||||
/** Check if memo contains the given page.
|
||||
|
@ -1036,11 +1032,9 @@ mtr_t::memo_contains_page_flagged(
|
|||
const byte* ptr,
|
||||
ulint flags) const
|
||||
{
|
||||
FindPage check(ptr, flags);
|
||||
Iterate<FindPage> iterator(check);
|
||||
|
||||
return(m_impl.m_memo.for_each_block_in_reverse(iterator)
|
||||
? NULL : check.get_block());
|
||||
Iterate<FindPage> iteration(FindPage(ptr, flags));
|
||||
return m_impl.m_memo.for_each_block_in_reverse(iteration)
|
||||
? NULL : iteration.functor.get_block();
|
||||
}
|
||||
|
||||
/** Mark the given latched page as modified.
|
||||
|
|
|
@ -1252,6 +1252,7 @@ int ha_maria::check(THD * thd, HA_CHECK_OPT * check_opt)
|
|||
|
||||
if (!file || !param) return HA_ADMIN_INTERNAL_ERROR;
|
||||
|
||||
unmap_file(file);
|
||||
maria_chk_init(param);
|
||||
param->thd= thd;
|
||||
param->op_name= "check";
|
||||
|
@ -1485,6 +1486,7 @@ int ha_maria::zerofill(THD * thd, HA_CHECK_OPT *check_opt)
|
|||
if (!file || !param)
|
||||
return HA_ADMIN_INTERNAL_ERROR;
|
||||
|
||||
unmap_file(file);
|
||||
old_trn= file->trn;
|
||||
maria_chk_init(param);
|
||||
param->thd= thd;
|
||||
|
@ -1583,6 +1585,7 @@ int ha_maria::repair(THD *thd, HA_CHECK *param, bool do_optimize)
|
|||
param->out_flag= 0;
|
||||
share->state.dupp_key= MI_MAX_KEY;
|
||||
strmov(fixed_name, share->open_file_name.str);
|
||||
unmap_file(file);
|
||||
|
||||
/*
|
||||
Don't lock tables if we have used LOCK TABLE or if we come from
|
||||
|
@ -1762,7 +1765,6 @@ int ha_maria::assign_to_keycache(THD * thd, HA_CHECK_OPT *check_opt)
|
|||
TABLE_LIST *table_list= table->pos_in_table_list;
|
||||
DBUG_ENTER("ha_maria::assign_to_keycache");
|
||||
|
||||
|
||||
table->keys_in_use_for_query.clear_all();
|
||||
|
||||
if (table_list->process_index_hints(table))
|
||||
|
@ -2723,7 +2725,8 @@ int ha_maria::external_lock(THD *thd, int lock_type)
|
|||
}
|
||||
else
|
||||
{
|
||||
TRN *trn= (file->trn != &dummy_transaction_object ? file->trn : 0);
|
||||
/* We have to test for THD_TRN to protect against implicit commits */
|
||||
TRN *trn= (file->trn != &dummy_transaction_object && THD_TRN ? file->trn : 0);
|
||||
/* End of transaction */
|
||||
|
||||
/*
|
||||
|
|
|
@ -5245,6 +5245,8 @@ my_bool _ma_scan_init_block_record(MARIA_HA *info)
|
|||
{
|
||||
MARIA_SHARE *share= info->s;
|
||||
DBUG_ENTER("_ma_scan_init_block_record");
|
||||
DBUG_ASSERT(info->dfile.file == share->bitmap.file.file);
|
||||
|
||||
/*
|
||||
bitmap_buff may already be allocated if this is the second call to
|
||||
rnd_init() without a rnd_end() in between, see sql/handler.h
|
||||
|
|
|
@ -113,10 +113,7 @@ int maria_close(register MARIA_HA *info)
|
|||
if (flush_pagecache_blocks(share->pagecache, &share->kfile,
|
||||
share->deleting ? FLUSH_IGNORE_CHANGED : FLUSH_RELEASE))
|
||||
error= my_errno;
|
||||
#ifdef HAVE_MMAP
|
||||
if (share->file_map)
|
||||
_ma_unmap_file(info);
|
||||
#endif
|
||||
unmap_file(info);
|
||||
if (((share->changed && share->base.born_transactional) ||
|
||||
maria_is_crashed(info) || (share->temporary && !share->deleting)))
|
||||
{
|
||||
|
|
|
@ -38,6 +38,9 @@ int maria_delete_all_rows(MARIA_HA *info)
|
|||
MARIA_SHARE *share= info->s;
|
||||
my_bool log_record;
|
||||
LSN lsn;
|
||||
#ifdef HAVE_MMAP
|
||||
my_bool mmap_file= share->file_map != 0;
|
||||
#endif
|
||||
DBUG_ENTER("maria_delete_all_rows");
|
||||
|
||||
if (share->options & HA_OPTION_READ_ONLY_DATA)
|
||||
|
@ -95,7 +98,7 @@ int maria_delete_all_rows(MARIA_HA *info)
|
|||
*/
|
||||
|
||||
#ifdef HAVE_MMAP
|
||||
if (share->file_map)
|
||||
if (mmap_file)
|
||||
_ma_unmap_file(info);
|
||||
#endif
|
||||
|
||||
|
@ -141,7 +144,7 @@ int maria_delete_all_rows(MARIA_HA *info)
|
|||
_ma_writeinfo(info, WRITEINFO_UPDATE_KEYFILE);
|
||||
#ifdef HAVE_MMAP
|
||||
/* Map again */
|
||||
if (share->file_map)
|
||||
if (mmap_file)
|
||||
_ma_dynmap_file(info, (my_off_t) 0);
|
||||
#endif
|
||||
DBUG_RETURN(0);
|
||||
|
|
|
@ -1564,8 +1564,13 @@ my_bool _ma_memmap_file(MARIA_HA *info)
|
|||
|
||||
void _ma_unmap_file(MARIA_HA *info)
|
||||
{
|
||||
my_munmap((char*) info->s->file_map,
|
||||
(size_t) info->s->mmaped_length + MEMMAP_EXTRA_MARGIN);
|
||||
MARIA_SHARE *share= info->s;
|
||||
my_munmap((char*) share->file_map,
|
||||
(size_t) share->mmaped_length + MEMMAP_EXTRA_MARGIN);
|
||||
share->file_map= 0;
|
||||
share->file_read= _ma_nommap_pread;
|
||||
share->file_write= _ma_nommap_pwrite;
|
||||
info->opt_flag&= ~MEMMAP_USED;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -3464,8 +3464,6 @@ restart:
|
|||
pagecache_pthread_mutex_lock(&pagecache->cache_lock);
|
||||
#endif
|
||||
}
|
||||
if (status & PCBLOCK_ERROR)
|
||||
my_errno= block->error;
|
||||
}
|
||||
|
||||
remove_reader(block);
|
||||
|
@ -3497,6 +3495,7 @@ restart:
|
|||
|
||||
if (status & PCBLOCK_ERROR)
|
||||
{
|
||||
my_errno= block->error;
|
||||
DBUG_ASSERT(my_errno != 0);
|
||||
DBUG_PRINT("error", ("Got error %d when doing page read", my_errno));
|
||||
DBUG_RETURN((uchar *) 0);
|
||||
|
|
|
@ -292,6 +292,11 @@ static int run_test(const char *filename)
|
|||
if (!silent)
|
||||
printf("- Updating rows\n");
|
||||
|
||||
create_key(key, j);
|
||||
if ((maria_rkey(file, read_record, 0, key,
|
||||
HA_WHOLE_KEY, HA_READ_KEY_EXACT)))
|
||||
printf("Can't find last written row with maria_rkey\n");
|
||||
|
||||
/* Update first last row to force extend of file */
|
||||
if (maria_rsame(file,read_record,-1))
|
||||
{
|
||||
|
|
|
@ -1437,3 +1437,11 @@ extern my_bool ma_yield_and_check_if_killed(MARIA_HA *info, int inx);
|
|||
extern my_bool ma_killed_standalone(MARIA_HA *);
|
||||
|
||||
extern uint _ma_file_callback_to_id(void *callback_data);
|
||||
|
||||
static inline void unmap_file(MARIA_HA *info __attribute__((unused)))
|
||||
{
|
||||
#ifdef HAVE_MMAP
|
||||
if (info->s->file_map)
|
||||
_ma_unmap_file(info);
|
||||
#endif
|
||||
}
|
||||
|
|
|
@ -11034,6 +11034,41 @@ void ha_rocksdb::read_thd_vars(THD *const thd) {
|
|||
m_checksums_pct = THDVAR(thd, checksums_pct);
|
||||
}
|
||||
|
||||
ulonglong ha_rocksdb::table_flags() const
|
||||
{
|
||||
DBUG_ENTER_FUNC();
|
||||
|
||||
/*
|
||||
HA_BINLOG_STMT_CAPABLE
|
||||
Upstream: MyRocks advertises itself as it supports SBR, but has additional
|
||||
checks in ha_rocksdb::external_lock()/ start_stmt() which will return an
|
||||
error if one tries to run the statement.
|
||||
Exceptions: @@rocksdb_unsafe_for_binlog or we are an SQL slave thread.
|
||||
|
||||
MariaDB: Inform the upper layer we don't support SBR, so it switches to RBR
|
||||
if possible. The exceptions are the same as with the upstream.
|
||||
|
||||
HA_REC_NOT_IN_SEQ
|
||||
If we don't set it, filesort crashes, because it assumes rowids are
|
||||
1..8 byte numbers
|
||||
HA_PRIMARY_KEY_IN_READ_INDEX
|
||||
This flag is always set, even for tables that:
|
||||
- have no PK
|
||||
- have some (or all) of PK that can't be decoded from the secondary
|
||||
index.
|
||||
*/
|
||||
THD *thd= ha_thd();
|
||||
DBUG_RETURN(HA_BINLOG_ROW_CAPABLE |
|
||||
((thd && (THDVAR(thd, unsafe_for_binlog) ||thd->rgi_slave))?
|
||||
HA_BINLOG_STMT_CAPABLE : 0) |
|
||||
HA_REC_NOT_IN_SEQ | HA_CAN_INDEX_BLOBS |
|
||||
HA_PRIMARY_KEY_IN_READ_INDEX |
|
||||
HA_PRIMARY_KEY_REQUIRED_FOR_POSITION | HA_NULL_IN_KEY |
|
||||
HA_PARTIAL_COLUMN_READ |
|
||||
HA_TABLE_SCAN_ON_INDEX);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
@return
|
||||
|
@ -11046,6 +11081,9 @@ int ha_rocksdb::external_lock(THD *const thd, int lock_type) {
|
|||
DBUG_ASSERT(thd != nullptr);
|
||||
|
||||
int res = HA_EXIT_SUCCESS;
|
||||
#if 0
|
||||
// MariaDB uses a different way to implement this, see ha_rocksdb::table_flags
|
||||
|
||||
int binlog_format = my_core::thd_binlog_format(thd);
|
||||
bool unsafe_for_binlog = THDVAR(ha_thd(), unsafe_for_binlog);
|
||||
|
||||
|
@ -11074,6 +11112,7 @@ int ha_rocksdb::external_lock(THD *const thd, int lock_type) {
|
|||
my_error(ER_REQUIRE_ROW_BINLOG_FORMAT, MYF(0));
|
||||
DBUG_RETURN(HA_ERR_UNSUPPORTED);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (lock_type == F_UNLCK) {
|
||||
Rdb_transaction *const tx = get_tx_from_thd(thd);
|
||||
|
@ -11176,20 +11215,6 @@ int ha_rocksdb::external_lock(THD *const thd, int lock_type) {
|
|||
int ha_rocksdb::start_stmt(THD *const thd, thr_lock_type lock_type) {
|
||||
DBUG_ENTER_FUNC();
|
||||
|
||||
/*
|
||||
MariaDB: the following is a copy of the check in ha_rocksdb::external_lock:
|
||||
*/
|
||||
int binlog_format = my_core::thd_binlog_format(thd);
|
||||
bool unsafe_for_binlog = THDVAR(ha_thd(), unsafe_for_binlog);
|
||||
if (lock_type >= TL_WRITE_ALLOW_WRITE &&
|
||||
!thd->rgi_slave && !unsafe_for_binlog &&
|
||||
binlog_format != BINLOG_FORMAT_ROW &&
|
||||
binlog_format != BINLOG_FORMAT_UNSPEC &&
|
||||
my_core::thd_binlog_filter_ok(thd)) {
|
||||
my_error(ER_REQUIRE_ROW_BINLOG_FORMAT, MYF(0));
|
||||
DBUG_RETURN(HA_ERR_UNSUPPORTED);
|
||||
}
|
||||
|
||||
DBUG_ASSERT(thd != nullptr);
|
||||
|
||||
Rdb_transaction *const tx = get_or_create_tx(thd);
|
||||
|
|
|
@ -863,31 +863,7 @@ public:
|
|||
This is a list of flags that indicate what functionality the storage engine
|
||||
implements. The current table flags are documented in handler.h
|
||||
*/
|
||||
ulonglong table_flags() const override {
|
||||
DBUG_ENTER_FUNC();
|
||||
|
||||
/*
|
||||
HA_BINLOG_STMT_CAPABLE
|
||||
We are saying that this engine is just statement capable to have
|
||||
an engine that can only handle statement-based logging. This is
|
||||
used in testing.
|
||||
HA_REC_NOT_IN_SEQ
|
||||
If we don't set it, filesort crashes, because it assumes rowids are
|
||||
1..8 byte numbers
|
||||
HA_PRIMARY_KEY_IN_READ_INDEX
|
||||
This flag is always set, even for tables that:
|
||||
- have no PK
|
||||
- have some (or all) of PK that can't be decoded from the secondary
|
||||
index.
|
||||
*/
|
||||
DBUG_RETURN(HA_BINLOG_ROW_CAPABLE | HA_BINLOG_STMT_CAPABLE |
|
||||
HA_REC_NOT_IN_SEQ | HA_CAN_INDEX_BLOBS |
|
||||
HA_PRIMARY_KEY_IN_READ_INDEX |
|
||||
HA_PRIMARY_KEY_REQUIRED_FOR_POSITION | HA_NULL_IN_KEY |
|
||||
HA_PARTIAL_COLUMN_READ |
|
||||
HA_TABLE_SCAN_ON_INDEX);
|
||||
}
|
||||
|
||||
ulonglong table_flags() const override ;
|
||||
private:
|
||||
bool init_with_fields(); /* no 'override' in MariaDB */
|
||||
public:
|
||||
|
|
|
@ -18,7 +18,16 @@ set @tmp_bf= @@binlog_format;
|
|||
set binlog_format='STATEMENT';
|
||||
lock tables t1 write;
|
||||
insert into t1 values(1);
|
||||
ERROR HY000: Can't execute updates on master with binlog_format != ROW.
|
||||
ERROR HY000: Cannot execute statement: impossible to write to binary log since BINLOG_FORMAT = STATEMENT and at least one table uses a storage engine limited to row-based logging.
|
||||
unlock tables;
|
||||
set @@binlog_format=@tmp_bf;
|
||||
drop table t1;
|
||||
#
|
||||
# MDEV-17045: MyRocks tables cannot be updated when binlog_format=MIXED.
|
||||
#
|
||||
set @tmp_bf= @@binlog_format;
|
||||
set binlog_format='MIXED';
|
||||
create table t1 (pk int primary key) engine=rocksdb;
|
||||
insert into t1 values (1);
|
||||
drop table t1;
|
||||
set @@binlog_format=@tmp_bf;
|
||||
|
|
|
@ -8,7 +8,7 @@ select @@binlog_format;
|
|||
STATEMENT
|
||||
create table t1 (pk int primary key) engine=rocksdb;
|
||||
insert into t1 values (1),(2),(3);
|
||||
ERROR HY000: Can't execute updates on master with binlog_format != ROW.
|
||||
ERROR HY000: Cannot execute statement: impossible to write to binary log since BINLOG_FORMAT = STATEMENT and at least one table uses a storage engine limited to row-based logging.
|
||||
set session rocksdb_unsafe_for_binlog=on;
|
||||
insert into t1 values (1),(2),(3);
|
||||
select * from t1;
|
||||
|
@ -19,7 +19,7 @@ pk
|
|||
delete from t1;
|
||||
set session rocksdb_unsafe_for_binlog=off;
|
||||
insert into t1 values (1),(2),(3);
|
||||
ERROR HY000: Can't execute updates on master with binlog_format != ROW.
|
||||
ERROR HY000: Cannot execute statement: impossible to write to binary log since BINLOG_FORMAT = STATEMENT and at least one table uses a storage engine limited to row-based logging.
|
||||
set binlog_format=row;
|
||||
insert into t1 values (1),(2),(3);
|
||||
include/sync_slave_sql_with_master.inc
|
||||
|
|
|
@ -21,10 +21,20 @@ unlock tables;
|
|||
set @tmp_bf= @@binlog_format;
|
||||
set binlog_format='STATEMENT';
|
||||
lock tables t1 write;
|
||||
--error ER_REQUIRE_ROW_BINLOG_FORMAT
|
||||
--error ER_BINLOG_STMT_MODE_AND_ROW_ENGINE
|
||||
insert into t1 values(1);
|
||||
unlock tables;
|
||||
set @@binlog_format=@tmp_bf;
|
||||
|
||||
drop table t1;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-17045: MyRocks tables cannot be updated when binlog_format=MIXED.
|
||||
--echo #
|
||||
set @tmp_bf= @@binlog_format;
|
||||
set binlog_format='MIXED';
|
||||
create table t1 (pk int primary key) engine=rocksdb;
|
||||
insert into t1 values (1);
|
||||
drop table t1;
|
||||
set @@binlog_format=@tmp_bf;
|
||||
|
||||
|
|
|
@ -12,7 +12,7 @@ connection master;
|
|||
|
||||
select @@binlog_format;
|
||||
create table t1 (pk int primary key) engine=rocksdb;
|
||||
--error ER_REQUIRE_ROW_BINLOG_FORMAT
|
||||
--error ER_BINLOG_STMT_MODE_AND_ROW_ENGINE
|
||||
insert into t1 values (1),(2),(3);
|
||||
|
||||
set session rocksdb_unsafe_for_binlog=on;
|
||||
|
@ -21,7 +21,7 @@ select * from t1;
|
|||
delete from t1;
|
||||
set session rocksdb_unsafe_for_binlog=off;
|
||||
|
||||
--error ER_REQUIRE_ROW_BINLOG_FORMAT
|
||||
--error ER_BINLOG_STMT_MODE_AND_ROW_ENGINE
|
||||
insert into t1 values (1),(2),(3);
|
||||
|
||||
set binlog_format=row;
|
||||
|
|
Loading…
Reference in a new issue