Merging with 5.1-5.1.29-rc
This commit is contained in:
commit
04c054048b
34
configure.in
34
configure.in
@ -455,46 +455,50 @@ fi
|
||||
|
||||
AC_SUBST(ABI_CHECK)
|
||||
|
||||
# Lock for PS
|
||||
# Look for PS usage. We use double dollar-signs in FIND_PROC because this
|
||||
# value is written to a makefile, which interprets away one level of
|
||||
# dollar-signs. So, interpretation stages are m4 and then shell in autoconf,
|
||||
# then Make, then shell. The autoconf substitution uses single quotes, so
|
||||
# no unprotected single quotes should appear in the expression.
|
||||
AC_PATH_PROG(PS, ps, ps)
|
||||
AC_MSG_CHECKING("how to check if pid exists")
|
||||
PS=$ac_cv_path_PS
|
||||
# Linux style
|
||||
if $PS p $$ 2> /dev/null | grep `echo $0 | sed s/\-//` > /dev/null
|
||||
if $PS wwwp $$ 2> /dev/null | grep -- "$0" > /dev/null
|
||||
then
|
||||
FIND_PROC="$PS p \$\$PID | grep -v grep | grep \$\$MYSQLD > /dev/null"
|
||||
FIND_PROC="$PS wwwp \$\$PID | grep -v \" grep\" | grep -v mysqld_safe | grep -- \"\$\$MYSQLD\" > /dev/null"
|
||||
# Solaris
|
||||
elif $PS -fp $$ 2> /dev/null | grep $0 > /dev/null
|
||||
elif $PS -fp $$ 2> /dev/null | grep -- $0 > /dev/null
|
||||
then
|
||||
FIND_PROC="$PS -p \$\$PID | grep -v grep | grep \$\$MYSQLD > /dev/null"
|
||||
FIND_PROC="$PS -p \$\$PID | grep -v \" grep\" | grep -v mysqld_safe | grep -- \"\$\$MYSQLD\" > /dev/null"
|
||||
# BSD style
|
||||
elif $PS -uaxww 2> /dev/null | grep $0 > /dev/null
|
||||
elif $PS -uaxww 2> /dev/null | grep -- $0 > /dev/null
|
||||
then
|
||||
FIND_PROC="$PS -uaxww | grep -v grep | grep \$\$MYSQLD | grep \" \$\$PID \" > /dev/null"
|
||||
FIND_PROC="$PS -uaxww | grep -v \" grep\" | grep -v mysqld_safe | grep -- \"\$\$MYSQLD\" | grep \" \$\$PID \" > /dev/null"
|
||||
# SysV style
|
||||
elif $PS -ef 2> /dev/null | grep $0 > /dev/null
|
||||
elif $PS -ef 2> /dev/null | grep -- $0 > /dev/null
|
||||
then
|
||||
FIND_PROC="$PS -ef | grep -v grep | grep \$\$MYSQLD | grep \" \$\$PID \" > /dev/null"
|
||||
FIND_PROC="$PS -ef | grep -v \" grep\" | grep -v mysqld_safe | grep -- \"\$\$MYSQLD\" | grep \" \$\$PID \" > /dev/null"
|
||||
# Do anybody use this?
|
||||
elif $PS $$ 2> /dev/null | grep $0 > /dev/null
|
||||
elif $PS $$ 2> /dev/null | grep -- $0 > /dev/null
|
||||
then
|
||||
FIND_PROC="$PS \$\$PID | grep -v grep | grep \$\$MYSQLD > /dev/null"
|
||||
FIND_PROC="$PS \$\$PID | grep -v \" grep\" | grep -v mysqld_safe | grep -- \"\$\$MYSQLD\" > /dev/null"
|
||||
else
|
||||
case $SYSTEM_TYPE in
|
||||
*freebsd*|*dragonfly*)
|
||||
FIND_PROC="$PS p \$\$PID | grep -v grep | grep \$\$MYSQLD > /dev/null"
|
||||
FIND_PROC="$PS p \$\$PID | grep -v \" grep\" | grep -v mysqld_safe | grep -- \"\$\$MYSQLD\" > /dev/null"
|
||||
;;
|
||||
*darwin*)
|
||||
FIND_PROC="$PS -uaxww | grep -v grep | grep \$\$MYSQLD | grep \" \$\$PID \" > /dev/null"
|
||||
FIND_PROC="$PS -uaxww | grep -v \" grep\" | grep -v mysqld_safe | grep -- \"\$\$MYSQLD\" | grep \" \$\$PID \" > /dev/null"
|
||||
;;
|
||||
*cygwin*)
|
||||
FIND_PROC="$PS -e | grep -v grep | grep \$\$MYSQLD | grep \" \$\$PID \" > /dev/null"
|
||||
FIND_PROC="$PS -e | grep -v \" grep\" | grep -v mysqld_safe | grep -- \"\$\$MYSQLD\" | grep \" \$\$PID \" > /dev/null"
|
||||
;;
|
||||
*netware*)
|
||||
FIND_PROC=
|
||||
;;
|
||||
*)
|
||||
AC_MSG_ERROR([Could not find the right ps switches. Which OS is this ?. See the Installation chapter in the Reference Manual.])
|
||||
AC_MSG_ERROR([Could not find the right ps and/or grep switches. Which OS is this? See the Installation chapter in the Reference Manual.])
|
||||
esac
|
||||
fi
|
||||
AC_SUBST(FIND_PROC)
|
||||
|
@ -21,6 +21,40 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*
|
||||
There was a problem on MacOSX with a shared object ha_example.so.
|
||||
It used hash_search(). During build of ha_example.so no libmysys
|
||||
was specified. Since MacOSX had a hash_search() in the system
|
||||
library, it built the shared object so that the dynamic linker
|
||||
linked hash_search() to the system library, which caused a crash
|
||||
when called. To come around this, we renamed hash_search() to
|
||||
my_hash_search(), as we did long ago with hash_insert() and
|
||||
hash_reset(). However, this time we made the move complete with
|
||||
all names. To keep compatibility, we redefine the old names.
|
||||
Since every C and C++ file, that uses HASH, needs to include
|
||||
this file, the change is complete. Both names could be used
|
||||
in the code, but the my_* versions are recommended now.
|
||||
*/
|
||||
#define hash_get_key my_hash_get_key
|
||||
#define hash_free_key my_hash_free_key
|
||||
#define hash_init my_hash_init
|
||||
#define hash_init2 my_hash_init2
|
||||
#define _hash_init _my_hash_init
|
||||
#define hash_free my_hash_free
|
||||
#define hash_reset my_hash_reset
|
||||
#define hash_element my_hash_element
|
||||
#define hash_search my_hash_search
|
||||
#define hash_first my_hash_first
|
||||
#define hash_next my_hash_next
|
||||
#define hash_insert my_hash_insert
|
||||
#define hash_delete my_hash_delete
|
||||
#define hash_update my_hash_update
|
||||
#define hash_replace my_hash_replace
|
||||
#define hash_check my_hash_check
|
||||
#define hash_clear my_hash_clear
|
||||
#define hash_inited my_hash_inited
|
||||
#define hash_init_opt my_hash_init_opt
|
||||
|
||||
/*
|
||||
Overhead to store an element in hash
|
||||
Can be used to approximate memory consumption for a hash
|
||||
@ -30,8 +64,8 @@ extern "C" {
|
||||
/* flags for hash_init */
|
||||
#define HASH_UNIQUE 1 /* hash_insert fails on duplicate key */
|
||||
|
||||
typedef uchar *(*hash_get_key)(const uchar *,size_t*,my_bool);
|
||||
typedef void (*hash_free_key)(void *);
|
||||
typedef uchar *(*my_hash_get_key)(const uchar *,size_t*,my_bool);
|
||||
typedef void (*my_hash_free_key)(void *);
|
||||
|
||||
typedef struct st_hash {
|
||||
size_t key_offset,key_length; /* Length of key if const length */
|
||||
@ -39,7 +73,7 @@ typedef struct st_hash {
|
||||
ulong records;
|
||||
uint flags;
|
||||
DYNAMIC_ARRAY array; /* Place for hash_keys */
|
||||
hash_get_key get_key;
|
||||
my_hash_get_key get_key;
|
||||
void (*free)(void *);
|
||||
CHARSET_INFO *charset;
|
||||
} HASH;
|
||||
@ -47,30 +81,34 @@ typedef struct st_hash {
|
||||
/* A search iterator state */
|
||||
typedef uint HASH_SEARCH_STATE;
|
||||
|
||||
#define hash_init(A,B,C,D,E,F,G,H) _hash_init(A,0,B,C,D,E,F,G,H CALLER_INFO)
|
||||
#define hash_init2(A,B,C,D,E,F,G,H,I) _hash_init(A,B,C,D,E,F,G,H,I CALLER_INFO)
|
||||
my_bool _hash_init(HASH *hash, uint growth_size,CHARSET_INFO *charset,
|
||||
ulong default_array_elements, size_t key_offset,
|
||||
size_t key_length, hash_get_key get_key,
|
||||
void (*free_element)(void*), uint flags CALLER_INFO_PROTO);
|
||||
void hash_free(HASH *tree);
|
||||
#define my_hash_init(A,B,C,D,E,F,G,H) \
|
||||
_my_hash_init(A,0,B,C,D,E,F,G,H CALLER_INFO)
|
||||
#define my_hash_init2(A,B,C,D,E,F,G,H,I) \
|
||||
_my_hash_init(A,B,C,D,E,F,G,H,I CALLER_INFO)
|
||||
my_bool _my_hash_init(HASH *hash, uint growth_size, CHARSET_INFO *charset,
|
||||
ulong default_array_elements, size_t key_offset,
|
||||
size_t key_length, my_hash_get_key get_key,
|
||||
void (*free_element)(void*),
|
||||
uint flags CALLER_INFO_PROTO);
|
||||
void my_hash_free(HASH *tree);
|
||||
void my_hash_reset(HASH *hash);
|
||||
uchar *hash_element(HASH *hash,ulong idx);
|
||||
uchar *hash_search(const HASH *info, const uchar *key, size_t length);
|
||||
uchar *hash_first(const HASH *info, const uchar *key, size_t length,
|
||||
HASH_SEARCH_STATE *state);
|
||||
uchar *hash_next(const HASH *info, const uchar *key, size_t length,
|
||||
HASH_SEARCH_STATE *state);
|
||||
my_bool my_hash_insert(HASH *info,const uchar *data);
|
||||
my_bool hash_delete(HASH *hash,uchar *record);
|
||||
my_bool hash_update(HASH *hash,uchar *record,uchar *old_key,size_t old_key_length);
|
||||
void hash_replace(HASH *hash, HASH_SEARCH_STATE *state, uchar *new_row);
|
||||
my_bool hash_check(HASH *hash); /* Only in debug library */
|
||||
uchar *my_hash_element(HASH *hash, ulong idx);
|
||||
uchar *my_hash_search(const HASH *info, const uchar *key, size_t length);
|
||||
uchar *my_hash_first(const HASH *info, const uchar *key, size_t length,
|
||||
HASH_SEARCH_STATE *state);
|
||||
uchar *my_hash_next(const HASH *info, const uchar *key, size_t length,
|
||||
HASH_SEARCH_STATE *state);
|
||||
my_bool my_hash_insert(HASH *info, const uchar *data);
|
||||
my_bool my_hash_delete(HASH *hash, uchar *record);
|
||||
my_bool my_hash_update(HASH *hash, uchar *record, uchar *old_key,
|
||||
size_t old_key_length);
|
||||
void my_hash_replace(HASH *hash, HASH_SEARCH_STATE *state, uchar *new_row);
|
||||
my_bool my_hash_check(HASH *hash); /* Only in debug library */
|
||||
|
||||
#define hash_clear(H) bzero((char*) (H),sizeof(*(H)))
|
||||
#define hash_inited(H) ((H)->array.buffer != 0)
|
||||
#define hash_init_opt(A,B,C,D,E,F,G,H) \
|
||||
(!hash_inited(A) && _hash_init(A,0,B,C,D,E,F,G, H CALLER_INFO))
|
||||
#define my_hash_clear(H) bzero((char*) (H), sizeof(*(H)))
|
||||
#define my_hash_inited(H) ((H)->array.buffer != 0)
|
||||
#define my_hash_init_opt(A,B,C,D,E,F,G,H) \
|
||||
(!my_hash_inited(A) && _my_hash_init(A,0,B,C,D,E,F,G, H CALLER_INFO))
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
@ -487,3 +487,18 @@ select * from t2 where a=4 or b=4;
|
||||
|
||||
drop table t1, t2;
|
||||
|
||||
#
|
||||
# Bug #37943: Reproducible mysqld crash/sigsegv in sel_trees_can_be_ored
|
||||
#
|
||||
|
||||
CREATE TABLE t1 (a varchar(8), b set('a','b','c','d','e','f','g','h'),
|
||||
KEY b(b), KEY a(a));
|
||||
INSERT INTO t1 VALUES ('y',''), ('z','');
|
||||
|
||||
#should not crash
|
||||
SELECT b,a from t1 WHERE (b!='c' AND b!='f' && b!='h') OR
|
||||
(a='pure-S') OR (a='DE80337a') OR (a='DE80799');
|
||||
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo End of 5.0 tests
|
||||
|
@ -3601,7 +3601,16 @@ sub run_testcase ($) {
|
||||
{
|
||||
mtr_timer_stop_all($glob_timers);
|
||||
mtr_report("\nServers started, exiting");
|
||||
exit(0);
|
||||
if ($glob_win32_perl)
|
||||
{
|
||||
#ActiveState perl hangs when using normal exit, use POSIX::_exit instead
|
||||
use POSIX qw[ _exit ];
|
||||
POSIX::_exit(0);
|
||||
}
|
||||
else
|
||||
{
|
||||
exit(0);
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
|
@ -1559,6 +1559,8 @@ SHOW INDEX FROM t1;
|
||||
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
|
||||
t1 1 c1 1 c1 A NULL NULL NULL YES BTREE
|
||||
DROP TABLE t1;
|
||||
create user mysqltest_1@'test@test';
|
||||
ERROR HY000: Malformed hostname (illegal symbol: '@')
|
||||
CREATE TABLE t1 (a INTEGER AUTO_INCREMENT PRIMARY KEY, b INTEGER NOT NULL);
|
||||
INSERT IGNORE INTO t1 (b) VALUES (5);
|
||||
CREATE TABLE IF NOT EXISTS t2 (a INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY)
|
||||
|
@ -9,7 +9,9 @@ DROP DATABASE IF EXISTS federated;
|
||||
CREATE DATABASE federated;
|
||||
DROP DATABASE IF EXISTS federated;
|
||||
CREATE DATABASE federated;
|
||||
SET @OLD_CONCURRENT_INSERT= @@GLOBAL.CONCURRENT_INSERT;
|
||||
SET @OLD_MASTER_CONCURRENT_INSERT= @@GLOBAL.CONCURRENT_INSERT;
|
||||
SET @@GLOBAL.CONCURRENT_INSERT= 0;
|
||||
SET @OLD_SLAVE_CONCURRENT_INSERT= @@GLOBAL.CONCURRENT_INSERT;
|
||||
SET @@GLOBAL.CONCURRENT_INSERT= 0;
|
||||
DROP TABLE IF EXISTS federated.bug_13118_table;
|
||||
CREATE TABLE federated.t1 (
|
||||
@ -51,9 +53,10 @@ id value
|
||||
7 54
|
||||
8 55
|
||||
DROP TABLE federated.t1;
|
||||
SET @@GLOBAL.CONCURRENT_INSERT= @OLD_MASTER_CONCURRENT_INSERT;
|
||||
DROP TABLE federated.t1;
|
||||
SET @@GLOBAL.CONCURRENT_INSERT= @OLD_SLAVE_CONCURRENT_INSERT;
|
||||
DROP TABLE IF EXISTS federated.t1;
|
||||
DROP DATABASE IF EXISTS federated;
|
||||
DROP TABLE IF EXISTS federated.t1;
|
||||
DROP DATABASE IF EXISTS federated;
|
||||
SET @@GLOBAL.CONCURRENT_INSERT= @OLD_CONCURRENT_INSERT;
|
||||
|
@ -520,6 +520,16 @@ a filler b
|
||||
4 zz 4
|
||||
5 qq 4
|
||||
drop table t1, t2;
|
||||
CREATE TABLE t1 (a varchar(8), b set('a','b','c','d','e','f','g','h'),
|
||||
KEY b(b), KEY a(a));
|
||||
INSERT INTO t1 VALUES ('y',''), ('z','');
|
||||
SELECT b,a from t1 WHERE (b!='c' AND b!='f' && b!='h') OR
|
||||
(a='pure-S') OR (a='DE80337a') OR (a='DE80799');
|
||||
b a
|
||||
y
|
||||
z
|
||||
DROP TABLE t1;
|
||||
End of 5.0 tests
|
||||
#---------------- ROR-index_merge tests -----------------------
|
||||
SET SESSION STORAGE_ENGINE = MyISAM;
|
||||
drop table if exists t0,t1,t2;
|
||||
|
@ -221,3 +221,24 @@ drop view testdb_1.v1, v2, testdb_1.v3, v4;
|
||||
drop database testdb_1;
|
||||
drop user testdb_1@localhost;
|
||||
drop user testdb_2@localhost;
|
||||
create database testdb_1;
|
||||
create table testdb_1.t1 (a int);
|
||||
create view testdb_1.v1 as select * from testdb_1.t1;
|
||||
grant show view on testdb_1.* to mysqltest_1@localhost;
|
||||
grant select on testdb_1.v1 to mysqltest_1@localhost;
|
||||
select table_schema, table_name, view_definition from information_schema.views
|
||||
where table_name='v1';
|
||||
table_schema table_name view_definition
|
||||
testdb_1 v1 select `testdb_1`.`t1`.`a` AS `a` from `testdb_1`.`t1`
|
||||
show create view testdb_1.v1;
|
||||
View Create View character_set_client collation_connection
|
||||
v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `testdb_1`.`v1` AS select `testdb_1`.`t1`.`a` AS `a` from `testdb_1`.`t1` latin1 latin1_swedish_ci
|
||||
revoke select on testdb_1.v1 from mysqltest_1@localhost;
|
||||
select table_schema, table_name, view_definition from information_schema.views
|
||||
where table_name='v1';
|
||||
table_schema table_name view_definition
|
||||
testdb_1 v1
|
||||
show create view testdb_1.v1;
|
||||
ERROR 42000: SELECT command denied to user 'mysqltest_1'@'localhost' for table 'v1'
|
||||
drop user mysqltest_1@localhost;
|
||||
drop database testdb_1;
|
||||
|
@ -747,11 +747,13 @@ select t1.b from v1a;
|
||||
ERROR 42S22: Unknown column 't1.b' in 'field list'
|
||||
select * from v1a join v1b on t1.b = t2.b;
|
||||
ERROR 42S22: Unknown column 't1.b' in 'on clause'
|
||||
select * from information_schema.statistics join information_schema.columns
|
||||
using(table_name,column_name) where table_name='user';
|
||||
TABLE_NAME COLUMN_NAME TABLE_CATALOG TABLE_SCHEMA NON_UNIQUE INDEX_SCHEMA INDEX_NAME SEQ_IN_INDEX COLLATION CARDINALITY SUB_PART PACKED NULLABLE INDEX_TYPE COMMENT TABLE_CATALOG TABLE_SCHEMA ORDINAL_POSITION COLUMN_DEFAULT IS_NULLABLE DATA_TYPE CHARACTER_MAXIMUM_LENGTH CHARACTER_OCTET_LENGTH NUMERIC_PRECISION NUMERIC_SCALE CHARACTER_SET_NAME COLLATION_NAME COLUMN_TYPE COLUMN_KEY EXTRA PRIVILEGES COLUMN_COMMENT
|
||||
user Host NULL mysql 0 mysql PRIMARY 1 A # NULL NULL BTREE NULL mysql 1 NO char 60 180 NULL NULL utf8 utf8_bin char(60) PRI #
|
||||
user User NULL mysql 0 mysql PRIMARY 2 A # NULL NULL BTREE NULL mysql 2 NO char 16 48 NULL NULL utf8 utf8_bin char(16) PRI #
|
||||
select
|
||||
statistics.TABLE_NAME, statistics.COLUMN_NAME, statistics.TABLE_CATALOG, statistics.TABLE_SCHEMA, statistics.NON_UNIQUE, statistics.INDEX_SCHEMA, statistics.INDEX_NAME, statistics.SEQ_IN_INDEX, statistics.COLLATION, statistics.SUB_PART, statistics.PACKED, statistics.NULLABLE, statistics.INDEX_TYPE, statistics.COMMENT,
|
||||
columns.TABLE_CATALOG, columns.TABLE_SCHEMA, columns.COLUMN_DEFAULT, columns.IS_NULLABLE, columns.DATA_TYPE, columns.CHARACTER_MAXIMUM_LENGTH, columns.CHARACTER_OCTET_LENGTH, columns.NUMERIC_PRECISION, columns.NUMERIC_SCALE, columns.CHARACTER_SET_NAME, columns.COLLATION_NAME, columns.COLUMN_TYPE, columns.COLUMN_KEY, columns.EXTRA, columns.COLUMN_COMMENT
|
||||
from information_schema.statistics join information_schema.columns using(table_name,column_name) where table_name='user';
|
||||
TABLE_NAME COLUMN_NAME TABLE_CATALOG TABLE_SCHEMA NON_UNIQUE INDEX_SCHEMA INDEX_NAME SEQ_IN_INDEX COLLATION SUB_PART PACKED NULLABLE INDEX_TYPE COMMENT TABLE_CATALOG TABLE_SCHEMA COLUMN_DEFAULT IS_NULLABLE DATA_TYPE CHARACTER_MAXIMUM_LENGTH CHARACTER_OCTET_LENGTH NUMERIC_PRECISION NUMERIC_SCALE CHARACTER_SET_NAME COLLATION_NAME COLUMN_TYPE COLUMN_KEY EXTRA COLUMN_COMMENT
|
||||
user Host NULL mysql 0 mysql PRIMARY 1 A NULL NULL BTREE NULL mysql NO char 60 180 NULL NULL utf8 utf8_bin char(60) PRI
|
||||
user User NULL mysql 0 mysql PRIMARY 2 A NULL NULL BTREE NULL mysql NO char 16 48 NULL NULL utf8 utf8_bin char(16) PRI
|
||||
drop table t1;
|
||||
drop table t2;
|
||||
drop table t3;
|
||||
|
@ -1448,13 +1448,15 @@ create trigger t_ad after delete on t for each row insert into t values (old.s1)
|
||||
insert into t values (1);
|
||||
drop table t;
|
||||
USE mysql;
|
||||
TRUNCATE TABLE general_log;
|
||||
SET @old_general_log_state = @@global.general_log;
|
||||
SET GLOBAL general_log = 0;
|
||||
ALTER TABLE general_log ENGINE = MyISAM;
|
||||
ALTER TABLE general_log PARTITION BY RANGE (TO_DAYS(event_time))
|
||||
(PARTITION p0 VALUES LESS THAN (733144), PARTITION p1 VALUES LESS THAN (3000000));
|
||||
ERROR HY000: Incorrect usage of PARTITION and log table
|
||||
ALTER TABLE general_log ENGINE = CSV;
|
||||
SET GLOBAL general_log = default;
|
||||
SET GLOBAL general_log = @old_general_log_state;
|
||||
use test;
|
||||
create table t2 (b int);
|
||||
create table t1 (b int)
|
||||
@ -1637,6 +1639,25 @@ select count(*) from t1, t2 where t1.createdDate = t2.createdDate;
|
||||
count(*)
|
||||
1
|
||||
drop table t1, t2;
|
||||
SET @orig_sql_mode = @@SQL_MODE;
|
||||
SET SQL_MODE='STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO';
|
||||
CREATE TABLE t1 (c1 INT)
|
||||
PARTITION BY LIST(1 DIV c1) (
|
||||
PARTITION p0 VALUES IN (NULL),
|
||||
PARTITION p1 VALUES IN (1)
|
||||
);
|
||||
INSERT INTO t1 VALUES (0);
|
||||
ERROR 22012: Division by 0
|
||||
SELECT * FROM t1;
|
||||
c1
|
||||
TRUNCATE t1;
|
||||
INSERT INTO t1 VALUES (NULL), (0), (1), (2);
|
||||
ERROR 22012: Division by 0
|
||||
SELECT * FROM t1;
|
||||
c1
|
||||
NULL
|
||||
DROP TABLE t1;
|
||||
SET SQL_MODE= @orig_sql_mode;
|
||||
create table t1 (s1 int) partition by hash(s1) partitions 2;
|
||||
create index i on t1 (s1);
|
||||
insert into t1 values (1);
|
||||
|
@ -1,37 +1,17 @@
|
||||
SET @global_slow_launch_time = @@GLOBAL.slow_launch_time;
|
||||
'#--------------------FN_DYNVARS_124_01-------------------------#'
|
||||
** Connection default **
|
||||
'#--------------------FN_DYNVARS_124_01-------------------------#'
|
||||
SET @@GLOBAL.slow_launch_time=0;
|
||||
SELECT @@GLOBAL.slow_launch_time;
|
||||
@@GLOBAL.slow_launch_time
|
||||
0
|
||||
** Connecting conn5 using username 'root' **
|
||||
** Connecting conn6 using username 'root' **
|
||||
** Connecting conn7 using username 'root' **
|
||||
** Connecting conn8 using username 'root' **
|
||||
** Connecting conn9 using username 'root' **
|
||||
** Connecting conn10 using username 'root' **
|
||||
** Connecting conn11 using username 'root' **
|
||||
** Connecting conn12 using username 'root' **
|
||||
** Connecting conn13 using username 'root' **
|
||||
** Connecting conn14 using username 'root' **
|
||||
** Connecting conn15 using username 'root' **
|
||||
** Connecting conn16 using username 'root' **
|
||||
show status like 'slow_launch_threads';
|
||||
Variable_name Value
|
||||
Slow_launch_threads 12
|
||||
12 Expected
|
||||
** Connection default **
|
||||
** Disconnecting conn5 **
|
||||
** Disconnecting conn6 **
|
||||
** Disconnecting conn7 **
|
||||
** Disconnecting conn8 **
|
||||
** Disconnecting conn9 **
|
||||
** Disconnecting conn10 **
|
||||
** Disconnecting conn11 **
|
||||
** Disconnecting conn12 **
|
||||
** Disconnecting conn13 **
|
||||
** Disconnecting conn14 **
|
||||
** Disconnecting conn15 **
|
||||
** Disconnecting conn16 **
|
||||
** Connecting conn1 using username 'root' **
|
||||
** Switch to connection default and disconnect conn1 **
|
||||
'#--------------------FN_DYNVARS_124_02-------------------------#'
|
||||
SET @@GLOBAL.slow_launch_time= 1000;
|
||||
SELECT @@GLOBAL.slow_launch_time;
|
||||
@@GLOBAL.slow_launch_time
|
||||
1000
|
||||
** Connecting conn2 using username 'root' **
|
||||
** Switch to connection default and disconnect conn2 **
|
||||
SET @@GLOBAL.slow_launch_time = @global_slow_launch_time;
|
||||
|
@ -1,3 +1,5 @@
|
||||
set @old_concurrent_insert= @@global.concurrent_insert;
|
||||
set @@global.concurrent_insert= 0;
|
||||
flush status;
|
||||
show status like 'Table_lock%';
|
||||
Variable_name Value
|
||||
@ -7,22 +9,31 @@ select * from information_schema.session_status where variable_name like 'Table_
|
||||
VARIABLE_NAME VARIABLE_VALUE
|
||||
TABLE_LOCKS_IMMEDIATE 2
|
||||
TABLE_LOCKS_WAITED 0
|
||||
SET SQL_LOG_BIN=0;
|
||||
# Switched to connection: con1
|
||||
set sql_log_bin=0;
|
||||
set @old_general_log = @@global.general_log;
|
||||
set global general_log = 'OFF';
|
||||
drop table if exists t1;
|
||||
create table t1(n int) engine=myisam;
|
||||
insert into t1 values(1);
|
||||
select 1;
|
||||
1
|
||||
1
|
||||
# Switched to connection: con2
|
||||
lock tables t1 read;
|
||||
unlock tables;
|
||||
lock tables t1 read;
|
||||
# Switched to connection: con1
|
||||
update t1 set n = 3;
|
||||
# Switched to connection: con2
|
||||
unlock tables;
|
||||
# Switched to connection: con1
|
||||
show status like 'Table_locks_waited';
|
||||
Variable_name Value
|
||||
Table_locks_waited 1
|
||||
drop table t1;
|
||||
set global general_log = @old_general_log;
|
||||
# Switched to connection: default
|
||||
select 1;
|
||||
1
|
||||
1
|
||||
@ -198,3 +209,4 @@ ERROR 42000: SELECT command denied to user 'mysqltest_1'@'localhost' for table '
|
||||
drop database db37908;
|
||||
drop procedure proc37908;
|
||||
drop function func37908;
|
||||
set @@global.concurrent_insert= @old_concurrent_insert;
|
||||
|
@ -188,3 +188,5 @@ b val
|
||||
12 e
|
||||
13 f
|
||||
14 g
|
||||
drop trigger t1_after_insert;
|
||||
drop table t1,t2;
|
||||
|
@ -1,5 +1,10 @@
|
||||
-- source include/have_innodb.inc
|
||||
-- source include/have_binlog_format_mixed_or_statement.inc
|
||||
|
||||
# You cannot use `KILL' with the Embedded MySQL Server library,
|
||||
# because the embedded server merely runs inside the threads of the host
|
||||
# application. -- the docs
|
||||
|
||||
-- source include/not_embedded.inc
|
||||
|
||||
###
|
||||
@ -22,6 +27,12 @@ select get_lock("a", 20);
|
||||
|
||||
connection con2;
|
||||
let $ID= `select connection_id()`;
|
||||
|
||||
#
|
||||
# reset master does not reset binlogging on the embedded server.
|
||||
# the test is not run on the embedded for reason of using KILL query.
|
||||
# `reset master' problem is to be addressed by bug#15580 fixes.
|
||||
#
|
||||
reset master;
|
||||
send insert into t2 values (null, null), (null, get_lock("a", 10));
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
33
mysql-test/suite/funcs_1/storedproc/param_check.inc
Normal file
33
mysql-test/suite/funcs_1/storedproc/param_check.inc
Normal file
@ -0,0 +1,33 @@
|
||||
# suite/funcs_1/storedproc/param_check.inc
|
||||
#
|
||||
# Auxiliary routine to be sourced by
|
||||
# suite/funcs_1/t/storedproc.test
|
||||
#
|
||||
# Purpose:
|
||||
# The assignment of float values to objects of type DECIMAL causes
|
||||
# conversions and in some cases an adjustment of the value to
|
||||
# a border of the value range.
|
||||
# Try to reveal that function and procedure parameters get a similar
|
||||
# mangling of the value like columns.
|
||||
#
|
||||
# Variables to be set before sourcing this routine
|
||||
# $test_value - value to be checked
|
||||
#
|
||||
# Created:
|
||||
# 2008-08-27 mleich
|
||||
#
|
||||
|
||||
eval UPDATE t1_aux SET f1 = NULL;
|
||||
# Enforce that all user variables have the same data type and initial value.
|
||||
SELECT f1,f1,f1,f1 INTO @v1_tab,@v1_proc,@v2_proc,@v1_func FROM t1_aux;
|
||||
|
||||
eval UPDATE t1_aux SET f1 = $test_value;
|
||||
SELECT f1 INTO @v1_tab FROM t1_aux;
|
||||
eval CALL sproc_1($test_value, @v1_proc);
|
||||
eval SET @v1_func = func_1($test_value);
|
||||
|
||||
if (`SELECT @v1_tab <> @v1_proc OR @v1_tab <> @v2_proc OR @v1_tab <> @v1_func`)
|
||||
{
|
||||
--echo Error: @v1_tab, @v1_proc, @v2_proc, @v1_func are not all equal
|
||||
SELECT @v1_tab, @v1_proc, @v2_proc, @v1_func;
|
||||
}
|
@ -1,13 +0,0 @@
|
||||
#### suite/funcs_1/t/innodb_storedproc.test
|
||||
#
|
||||
|
||||
# This test cannot be used for the embedded server because we check here
|
||||
# privileges.
|
||||
--source include/not_embedded.inc
|
||||
|
||||
--source include/have_innodb.inc
|
||||
let $engine_type= innodb;
|
||||
|
||||
--source suite/funcs_1/storedproc/load_sp_tb.inc
|
||||
|
||||
--source suite/funcs_1/storedproc/storedproc_master.inc
|
@ -1,13 +0,0 @@
|
||||
#### suite/funcs_1/t/memory_storedproc.test
|
||||
#
|
||||
|
||||
# This test cannot be used for the embedded server because we check here
|
||||
# privileges.
|
||||
--source include/not_embedded.inc
|
||||
|
||||
SET @@session.sql_mode = 'NO_ENGINE_SUBSTITUTION';
|
||||
let $engine_type= memory;
|
||||
|
||||
--source suite/funcs_1/storedproc/load_sp_tb.inc
|
||||
|
||||
--source suite/funcs_1/storedproc/storedproc_master.inc
|
@ -1,13 +0,0 @@
|
||||
#### suite/funcs_1/t/myisam_storedproc.test
|
||||
#
|
||||
|
||||
# This test cannot be used for the embedded server because we check here
|
||||
# privileges.
|
||||
--source include/not_embedded.inc
|
||||
|
||||
SET @@session.sql_mode = 'NO_ENGINE_SUBSTITUTION';
|
||||
let $engine_type= myisam;
|
||||
|
||||
--source suite/funcs_1/storedproc/load_sp_tb.inc
|
||||
|
||||
--source suite/funcs_1/storedproc/storedproc_master.inc
|
@ -1,13 +0,0 @@
|
||||
#### suite/funcs_1/t/ndb_storedproc.test
|
||||
#
|
||||
|
||||
# This test cannot be used for the embedded server because we check here
|
||||
# privileges.
|
||||
--source include/not_embedded.inc
|
||||
|
||||
--source include/have_ndb.inc
|
||||
let $engine_type= ndb;
|
||||
|
||||
--source suite/funcs_1/storedproc/load_sp_tb.inc
|
||||
|
||||
--source suite/funcs_1/storedproc/storedproc_master.inc
|
File diff suppressed because it is too large
Load Diff
@ -158,10 +158,16 @@ DROP VIEW IF EXISTS v1;
|
||||
|
||||
--disable_query_log
|
||||
# Storage for the SELECTs to be used for the VIEW definition
|
||||
# Attention: my_select must be no too small because a statement like
|
||||
# SELECT LOAD_FILE(< file in MYSQLTEST_VARDIR >)
|
||||
# AS my_col,
|
||||
# id FROM t1_values';
|
||||
# might be a very long
|
||||
# Bug#38427 "Data too long" ... tests "<ENGINE>_func_view" fail
|
||||
CREATE TABLE t1_selects
|
||||
(
|
||||
id BIGINT AUTO_INCREMENT,
|
||||
my_select VARCHAR(200) NOT NULL,
|
||||
my_select VARCHAR(1000) NOT NULL,
|
||||
disable_result ENUM('Yes','No') NOT NULL default 'No',
|
||||
PRIMARY KEY(id),
|
||||
UNIQUE (my_select)
|
||||
|
@ -24,6 +24,9 @@ drop table if exists t1,t2;
|
||||
create table t1(f int);
|
||||
create table t2(f int);
|
||||
insert into t1 values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
|
||||
SELECT COUNT(*) FROM t1;
|
||||
COUNT(*)
|
||||
10
|
||||
create temporary table t3(f int);
|
||||
insert into t3 select * from t1 where f<6;
|
||||
create temporary table t3(f int);
|
||||
|
@ -56,6 +56,8 @@ drop table if exists t1,t2;
|
||||
create table t1(f int);
|
||||
create table t2(f int);
|
||||
insert into t1 values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
|
||||
# Auxiliary select (We want that all rows are in the table)
|
||||
SELECT COUNT(*) FROM t1;
|
||||
|
||||
connection con1;
|
||||
create temporary table t3(f int);
|
||||
|
@ -1175,6 +1175,11 @@ CREATE TABLE t1(c1 VARCHAR(33), KEY USING HASH (c1) USING BTREE) ENGINE=MEMORY;
|
||||
SHOW INDEX FROM t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
#
|
||||
# Bug#35924 DEFINER should be stored 'quoted' in I_S
|
||||
#
|
||||
--error ER_UNKNOWN_ERROR
|
||||
create user mysqltest_1@'test@test';
|
||||
|
||||
#
|
||||
# Bug#38821: Assert table->auto_increment_field_not_null failed in open_table()
|
||||
|
@ -14,4 +14,4 @@ csv_alter_table : Bug#33696 2008-01-21 pcrews no .result file - bug allows
|
||||
thread_cache_size_func : Bug#36733 main.thread_cache_size_func fails randomly
|
||||
log_tables.test : Bug #37798: main.log_tables fails randomly on powermacg5 and windows
|
||||
slow_query_log_func.test : Bug #37962: *_func tests containing sleeps/race conditions
|
||||
|
||||
events-bugs.test : Bug #39848, Bug #39863, Bug #39569, Bug #37774
|
||||
|
@ -1,15 +1,16 @@
|
||||
--source include/have_bug25714.inc
|
||||
source include/federated.inc;
|
||||
|
||||
connection default;
|
||||
|
||||
connection master;
|
||||
# Disable concurrent inserts to avoid test failures when reading
|
||||
# data from concurrent connections (insert might return before
|
||||
# the data is actually in the table).
|
||||
SET @OLD_CONCURRENT_INSERT= @@GLOBAL.CONCURRENT_INSERT;
|
||||
SET @OLD_MASTER_CONCURRENT_INSERT= @@GLOBAL.CONCURRENT_INSERT;
|
||||
SET @@GLOBAL.CONCURRENT_INSERT= 0;
|
||||
|
||||
connection slave;
|
||||
SET @OLD_SLAVE_CONCURRENT_INSERT= @@GLOBAL.CONCURRENT_INSERT;
|
||||
SET @@GLOBAL.CONCURRENT_INSERT= 0;
|
||||
--disable_warnings
|
||||
DROP TABLE IF EXISTS federated.bug_13118_table;
|
||||
--enable_warnings
|
||||
@ -46,11 +47,12 @@ SELECT LAST_INSERT_ID();
|
||||
SELECT * from federated.t1;
|
||||
|
||||
DROP TABLE federated.t1;
|
||||
SET @@GLOBAL.CONCURRENT_INSERT= @OLD_MASTER_CONCURRENT_INSERT;
|
||||
connection slave;
|
||||
DROP TABLE federated.t1;
|
||||
SET @@GLOBAL.CONCURRENT_INSERT= @OLD_SLAVE_CONCURRENT_INSERT;
|
||||
|
||||
|
||||
source include/federated_cleanup.inc;
|
||||
|
||||
connection default;
|
||||
|
||||
SET @@GLOBAL.CONCURRENT_INSERT= @OLD_CONCURRENT_INSERT;
|
||||
|
@ -82,6 +82,7 @@ drop function func2;
|
||||
drop database `inf%`;
|
||||
drop procedure mbase.p1;
|
||||
drop database mbase;
|
||||
disconnect user1;
|
||||
|
||||
#
|
||||
# Bug#18282 INFORMATION_SCHEMA.TABLES provides inconsistent info about invalid views
|
||||
@ -210,3 +211,32 @@ drop view testdb_1.v1, v2, testdb_1.v3, v4;
|
||||
drop database testdb_1;
|
||||
drop user testdb_1@localhost;
|
||||
drop user testdb_2@localhost;
|
||||
|
||||
#
|
||||
# Bug#22763 Disrepancy between SHOW CREATE VIEW and I_S.VIEWS
|
||||
#
|
||||
create database testdb_1;
|
||||
create table testdb_1.t1 (a int);
|
||||
create view testdb_1.v1 as select * from testdb_1.t1;
|
||||
|
||||
grant show view on testdb_1.* to mysqltest_1@localhost;
|
||||
grant select on testdb_1.v1 to mysqltest_1@localhost;
|
||||
|
||||
connect (user1,localhost,mysqltest_1,,test);
|
||||
connection user1;
|
||||
select table_schema, table_name, view_definition from information_schema.views
|
||||
where table_name='v1';
|
||||
show create view testdb_1.v1;
|
||||
|
||||
connection default;
|
||||
revoke select on testdb_1.v1 from mysqltest_1@localhost;
|
||||
connection user1;
|
||||
select table_schema, table_name, view_definition from information_schema.views
|
||||
where table_name='v1';
|
||||
--error ER_TABLEACCESS_DENIED_ERROR
|
||||
show create view testdb_1.v1;
|
||||
|
||||
connection default;
|
||||
drop user mysqltest_1@localhost;
|
||||
drop database testdb_1;
|
||||
disconnect user1;
|
||||
|
@ -546,10 +546,12 @@ select * from v1a join v1b on t1.b = t2.b;
|
||||
#
|
||||
# Bug #17523 natural join and information_schema
|
||||
#
|
||||
# We mask out the Privileges column because it differs with embedded server
|
||||
--replace_column 31 # 10 #
|
||||
select * from information_schema.statistics join information_schema.columns
|
||||
using(table_name,column_name) where table_name='user';
|
||||
# Omit columns.PRIVILIGES as it may vary with embedded server.
|
||||
# Omit columns.ORDINAL_POSITION and statistics.CARDINALITY as it may vary with hostname='localhost'.
|
||||
select
|
||||
statistics.TABLE_NAME, statistics.COLUMN_NAME, statistics.TABLE_CATALOG, statistics.TABLE_SCHEMA, statistics.NON_UNIQUE, statistics.INDEX_SCHEMA, statistics.INDEX_NAME, statistics.SEQ_IN_INDEX, statistics.COLLATION, statistics.SUB_PART, statistics.PACKED, statistics.NULLABLE, statistics.INDEX_TYPE, statistics.COMMENT,
|
||||
columns.TABLE_CATALOG, columns.TABLE_SCHEMA, columns.COLUMN_DEFAULT, columns.IS_NULLABLE, columns.DATA_TYPE, columns.CHARACTER_MAXIMUM_LENGTH, columns.CHARACTER_OCTET_LENGTH, columns.NUMERIC_PRECISION, columns.NUMERIC_SCALE, columns.CHARACTER_SET_NAME, columns.COLLATION_NAME, columns.COLUMN_TYPE, columns.COLUMN_KEY, columns.EXTRA, columns.COLUMN_COMMENT
|
||||
from information_schema.statistics join information_schema.columns using(table_name,column_name) where table_name='user';
|
||||
|
||||
drop table t1;
|
||||
drop table t2;
|
||||
|
@ -1589,13 +1589,15 @@ drop table t;
|
||||
#
|
||||
|
||||
USE mysql;
|
||||
TRUNCATE TABLE general_log;
|
||||
SET @old_general_log_state = @@global.general_log;
|
||||
SET GLOBAL general_log = 0;
|
||||
ALTER TABLE general_log ENGINE = MyISAM;
|
||||
--error ER_WRONG_USAGE
|
||||
ALTER TABLE general_log PARTITION BY RANGE (TO_DAYS(event_time))
|
||||
(PARTITION p0 VALUES LESS THAN (733144), PARTITION p1 VALUES LESS THAN (3000000));
|
||||
ALTER TABLE general_log ENGINE = CSV;
|
||||
SET GLOBAL general_log = default;
|
||||
SET GLOBAL general_log = @old_general_log_state;
|
||||
use test;
|
||||
|
||||
#
|
||||
@ -1791,6 +1793,29 @@ select count(*) from t1, t2 where t1.createdDate = t2.createdDate;
|
||||
|
||||
drop table t1, t2;
|
||||
|
||||
#
|
||||
# Bug #38083 Error-causing row inserted into partitioned table despite error
|
||||
#
|
||||
SET @orig_sql_mode = @@SQL_MODE;
|
||||
SET SQL_MODE='STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO';
|
||||
CREATE TABLE t1 (c1 INT)
|
||||
PARTITION BY LIST(1 DIV c1) (
|
||||
PARTITION p0 VALUES IN (NULL),
|
||||
PARTITION p1 VALUES IN (1)
|
||||
);
|
||||
|
||||
-- error ER_DIVISION_BY_ZERO
|
||||
INSERT INTO t1 VALUES (0);
|
||||
SELECT * FROM t1;
|
||||
TRUNCATE t1;
|
||||
-- error ER_DIVISION_BY_ZERO
|
||||
INSERT INTO t1 VALUES (NULL), (0), (1), (2);
|
||||
SELECT * FROM t1;
|
||||
DROP TABLE t1;
|
||||
SET SQL_MODE= @orig_sql_mode;
|
||||
|
||||
|
||||
|
||||
#
|
||||
# Bug #38005 Partitions: error with insert select
|
||||
#
|
||||
|
@ -1,6 +1,6 @@
|
||||
############# mysql-test\t\SLOW_LAUNCH_time_func.test ##########################
|
||||
############# mysql-test\t\slow_launch_time_func.test ##########################
|
||||
# #
|
||||
# Variable Name: slow_launch_time #
|
||||
# Variable Name: slow_launch_time #
|
||||
# Scope: SESSION #
|
||||
# Access Type: Dynamic #
|
||||
# Data Type: NUMERIC #
|
||||
@ -9,14 +9,20 @@
|
||||
# #
|
||||
# #
|
||||
# Creation Date: 2008-03-02 #
|
||||
# Author: Sharique Abdullah #
|
||||
# Author: Sharique Abdullah #
|
||||
# #
|
||||
# Last change: 2008-09-09 mleich Reimplementation of this test #
|
||||
# - Fix Bug#36874 : main.slow_launch_time_func test fails #
|
||||
# randomly #
|
||||
# - Fix other failures and streamline the test #
|
||||
# #
|
||||
# Description: Test Cases of Dynamic System Variable "slow_launch_time " #
|
||||
# that checks behavior of this variable in the following ways #
|
||||
# * Functionality based on different values #
|
||||
# #
|
||||
#Reference: http://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html#
|
||||
# option_mysqld_slow_launch_time #
|
||||
# Reference: #
|
||||
# http://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html #
|
||||
# option_mysqld_slow_launch_time #
|
||||
# #
|
||||
################################################################################
|
||||
|
||||
@ -28,82 +34,71 @@
|
||||
|
||||
SET @global_slow_launch_time = @@GLOBAL.slow_launch_time;
|
||||
|
||||
--echo ** Connection default **
|
||||
connection default;
|
||||
|
||||
--echo '#--------------------FN_DYNVARS_124_01-------------------------#'
|
||||
|
||||
#####################################
|
||||
# Increase number of connection #
|
||||
#####################################
|
||||
|
||||
--echo ** Connection default **
|
||||
connection default;
|
||||
########################################################################
|
||||
# Reveal that a new connect gets counted as "slow launched thread" if #
|
||||
# @@GLOBAL.slow_launch_time = 0. #
|
||||
# The value of slow_launch_threads must be increased by 1. #
|
||||
########################################################################
|
||||
|
||||
SET @@GLOBAL.slow_launch_time=0;
|
||||
SELECT @@GLOBAL.slow_launch_time;
|
||||
|
||||
--echo ** Connecting conn5 using username 'root' **
|
||||
CONNECT (conn5,localhost,root,,);
|
||||
--echo ** Connecting conn6 using username 'root' **
|
||||
CONNECT (conn6,localhost,root,,);
|
||||
--echo ** Connecting conn7 using username 'root' **
|
||||
CONNECT (conn7,localhost,root,,);
|
||||
--echo ** Connecting conn8 using username 'root' **
|
||||
CONNECT (conn8,localhost,root,,);
|
||||
--echo ** Connecting conn9 using username 'root' **
|
||||
CONNECT (conn9,localhost,root,,);
|
||||
--echo ** Connecting conn10 using username 'root' **
|
||||
CONNECT (conn10,localhost,root,,);
|
||||
--echo ** Connecting conn11 using username 'root' **
|
||||
CONNECT (conn11,localhost,root,,);
|
||||
--echo ** Connecting conn12 using username 'root' **
|
||||
CONNECT (conn12,localhost,root,,);
|
||||
--echo ** Connecting conn13 using username 'root' **
|
||||
CONNECT (conn13,localhost,root,,);
|
||||
--echo ** Connecting conn14 using username 'root' **
|
||||
CONNECT (conn14,localhost,root,,);
|
||||
--echo ** Connecting conn15 using username 'root' **
|
||||
CONNECT (conn15,localhost,root,,);
|
||||
--echo ** Connecting conn16 using username 'root' **
|
||||
CONNECT (conn16,localhost,root,,);
|
||||
let $value_before=
|
||||
query_get_value(show status like 'slow_launch_threads', Value, 1);
|
||||
--echo ** Connecting conn1 using username 'root' **
|
||||
CONNECT (conn1,localhost,root,,);
|
||||
let $value_after=
|
||||
query_get_value(show status like 'slow_launch_threads', Value, 1);
|
||||
if (!`SELECT $value_after = $value_before + 1`)
|
||||
{
|
||||
--echo ERROR: Subtest FN_DYNVARS_124_01 failed
|
||||
--echo A new connect should be counted as 'slow_launch_thread' if
|
||||
--echo @@GLOBAL.slow_launch_time=0
|
||||
SELECT @@GLOBAL.slow_launch_time;
|
||||
echo Number of slow_launch_threads before new connect: $value_before;
|
||||
echo Number of slow_launch_threads after new connect: $value_after;
|
||||
}
|
||||
--echo ** Switch to connection default and disconnect conn1 **
|
||||
connection default;
|
||||
disconnect conn1;
|
||||
|
||||
--echo '#--------------------FN_DYNVARS_124_02-------------------------#'
|
||||
|
||||
#
|
||||
# Checking status of slow_launch_threads
|
||||
#
|
||||
########################################################################
|
||||
# Reveal that a new connect gets not counted as "slow launched thread" #
|
||||
# if @@GLOBAL.slow_launch_time is sufficient big. #
|
||||
# The value of slow_launch_threads must not change. #
|
||||
########################################################################
|
||||
|
||||
show status like 'slow_launch_threads';
|
||||
--echo 12 Expected
|
||||
SET @@GLOBAL.slow_launch_time= 1000;
|
||||
SELECT @@GLOBAL.slow_launch_time;
|
||||
|
||||
let $value_before=
|
||||
query_get_value(show status like 'slow_launch_threads', Value, 1);
|
||||
--echo ** Connecting conn2 using username 'root' **
|
||||
CONNECT (conn2,localhost,root,,);
|
||||
let $value_after=
|
||||
query_get_value(show status like 'slow_launch_threads', Value, 1);
|
||||
if (!`SELECT $value_after = $value_before`)
|
||||
{
|
||||
--echo ERROR: Subtest FN_DYNVARS_124_02 failed
|
||||
--echo A new connect must not be counted as 'slow_launch_thread' if
|
||||
--echo @@GLOBAL.slow_launch_time is sufficient big.
|
||||
SELECT @@GLOBAL.slow_launch_time;
|
||||
echo Number of slow_launch_threads before new connect: $value_before;
|
||||
echo Number of slow_launch_threads after new connect: $value_after;
|
||||
}
|
||||
|
||||
#
|
||||
# Cleanup
|
||||
#
|
||||
|
||||
--echo ** Connection default **
|
||||
--echo ** Switch to connection default and disconnect conn2 **
|
||||
connection default;
|
||||
|
||||
--echo ** Disconnecting conn5 **
|
||||
disconnect conn5;
|
||||
--echo ** Disconnecting conn6 **
|
||||
disconnect conn6;
|
||||
--echo ** Disconnecting conn7 **
|
||||
disconnect conn7;
|
||||
--echo ** Disconnecting conn8 **
|
||||
disconnect conn8;
|
||||
--echo ** Disconnecting conn9 **
|
||||
disconnect conn9;
|
||||
--echo ** Disconnecting conn10 **
|
||||
disconnect conn10;
|
||||
--echo ** Disconnecting conn11 **
|
||||
disconnect conn11;
|
||||
--echo ** Disconnecting conn12 **
|
||||
disconnect conn12;
|
||||
--echo ** Disconnecting conn13 **
|
||||
disconnect conn13;
|
||||
--echo ** Disconnecting conn14 **
|
||||
disconnect conn14;
|
||||
--echo ** Disconnecting conn15 **
|
||||
disconnect conn15;
|
||||
--echo ** Disconnecting conn16 **
|
||||
disconnect conn16;
|
||||
|
||||
disconnect conn2;
|
||||
SET @@GLOBAL.slow_launch_time = @global_slow_launch_time;
|
||||
|
@ -4,6 +4,11 @@
|
||||
# embedded server causes different stat
|
||||
-- source include/not_embedded.inc
|
||||
|
||||
# Disable concurrent inserts to avoid sporadic test failures as it might
|
||||
# affect the the value of variables used throughout the test case.
|
||||
set @old_concurrent_insert= @@global.concurrent_insert;
|
||||
set @@global.concurrent_insert= 0;
|
||||
|
||||
# PS causes different statistics
|
||||
--disable_ps_protocol
|
||||
|
||||
@ -12,54 +17,45 @@ connect (con2,localhost,root,,);
|
||||
|
||||
flush status;
|
||||
|
||||
# Logging to the general query log table (--log-output=table --log) increments
|
||||
# Table_locks_immediate with each query, so here Immediate becomes 1
|
||||
show status like 'Table_lock%';
|
||||
# ++Immediate = 2
|
||||
select * from information_schema.session_status where variable_name like 'Table_lock%';
|
||||
|
||||
connection con1;
|
||||
# ++Immediate = 3
|
||||
SET SQL_LOG_BIN=0;
|
||||
set @old_general_log = @@global.general_log;
|
||||
--echo # Switched to connection: con1
|
||||
set sql_log_bin=0;
|
||||
set @old_general_log = @@global.general_log;
|
||||
set global general_log = 'OFF';
|
||||
--disable_warnings
|
||||
# ++Immediate = 4
|
||||
drop table if exists t1;
|
||||
--enable_warnings
|
||||
|
||||
# ++Immediate = 5
|
||||
create table t1(n int) engine=myisam;
|
||||
# Immediate + 2 = 7
|
||||
insert into t1 values(1);
|
||||
# Execute dummy select in order to ensure that tables used in the
|
||||
# previous statement are unlocked and closed.
|
||||
select 1;
|
||||
|
||||
connection con2;
|
||||
# Immediate + 2 = 9
|
||||
--echo # Switched to connection: con2
|
||||
lock tables t1 read;
|
||||
# ++Immediate = 10
|
||||
unlock tables;
|
||||
# Immediate + 2 = 12
|
||||
lock tables t1 read;
|
||||
|
||||
connection con1;
|
||||
# ++Immediate = 13
|
||||
--echo # Switched to connection: con1
|
||||
let $ID= `select connection_id()`;
|
||||
# ++Immediate = 14 (Not +2, because this increments Table_locks_waited)
|
||||
--send
|
||||
update t1 set n = 3;
|
||||
--send update t1 set n = 3
|
||||
|
||||
connection con2;
|
||||
--echo # Switched to connection: con2
|
||||
# wait for the other query to start executing
|
||||
let $wait_condition= select 1 from INFORMATION_SCHEMA.PROCESSLIST where ID = $ID and STATE = "Locked";
|
||||
# Immediate = 14 + $wait_condition_reps ($wait_timeout is 0, so no extra select
|
||||
# is done inside wait_condition.inc)
|
||||
--source include/wait_condition.inc
|
||||
# ++Immediate = 15 + $wait_condition_reps
|
||||
unlock tables;
|
||||
|
||||
connection con1;
|
||||
--echo # Switched to connection: con1
|
||||
reap;
|
||||
# ++Immediate = 16 + $wait_condition_reps
|
||||
show status like 'Table_locks_waited';
|
||||
drop table t1;
|
||||
set global general_log = @old_general_log;
|
||||
@ -67,6 +63,7 @@ set global general_log = @old_general_log;
|
||||
disconnect con2;
|
||||
disconnect con1;
|
||||
connection default;
|
||||
--echo # Switched to connection: default
|
||||
|
||||
# End of 4.1 tests
|
||||
|
||||
@ -295,3 +292,7 @@ drop database db37908;
|
||||
drop procedure proc37908;
|
||||
drop function func37908;
|
||||
# End of 5.1 tests
|
||||
|
||||
# Restore global concurrent_insert value. Keep in the end of the test file.
|
||||
--connection default
|
||||
set @@global.concurrent_insert= @old_concurrent_insert;
|
||||
|
@ -175,3 +175,5 @@ insert into t1 values ( 123, 'a'), ( 123, 'b'), ( 123, 'c'),
|
||||
insert into t1 values ( 654, 'a'), ( 654, 'b'), ( 654, 'c'),
|
||||
(654, 'd'), (654, 'e'), (654, 'f'), (654, 'g');
|
||||
select * from t2 order by b;
|
||||
drop trigger t1_after_insert;
|
||||
drop table t1,t2;
|
||||
|
138
mysys/hash.c
138
mysys/hash.c
@ -33,7 +33,7 @@ typedef struct st_hash_info {
|
||||
uchar *data; /* data for current entry */
|
||||
} HASH_LINK;
|
||||
|
||||
static uint hash_mask(uint hashnr,uint buffmax,uint maxlength);
|
||||
static uint my_hash_mask(uint hashnr, uint buffmax, uint maxlength);
|
||||
static void movelink(HASH_LINK *array,uint pos,uint next_link,uint newlink);
|
||||
static int hashcmp(const HASH *hash, HASH_LINK *pos, const uchar *key,
|
||||
size_t length);
|
||||
@ -46,19 +46,19 @@ static uint calc_hash(const HASH *hash, const uchar *key, size_t length)
|
||||
}
|
||||
|
||||
my_bool
|
||||
_hash_init(HASH *hash,uint growth_size, CHARSET_INFO *charset,
|
||||
ulong size, size_t key_offset, size_t key_length,
|
||||
hash_get_key get_key,
|
||||
void (*free_element)(void*),uint flags CALLER_INFO_PROTO)
|
||||
_my_hash_init(HASH *hash, uint growth_size, CHARSET_INFO *charset,
|
||||
ulong size, size_t key_offset, size_t key_length,
|
||||
my_hash_get_key get_key,
|
||||
void (*free_element)(void*), uint flags CALLER_INFO_PROTO)
|
||||
{
|
||||
DBUG_ENTER("hash_init");
|
||||
DBUG_ENTER("my_hash_init");
|
||||
DBUG_PRINT("enter",("hash: 0x%lx size: %u", (long) hash, (uint) size));
|
||||
|
||||
hash->records=0;
|
||||
if (my_init_dynamic_array_ci(&hash->array, sizeof(HASH_LINK), size,
|
||||
growth_size))
|
||||
{
|
||||
hash->free=0; /* Allow call to hash_free */
|
||||
hash->free=0; /* Allow call to my_hash_free */
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
hash->key_offset=key_offset;
|
||||
@ -76,14 +76,14 @@ _hash_init(HASH *hash,uint growth_size, CHARSET_INFO *charset,
|
||||
Call hash->free on all elements in hash.
|
||||
|
||||
SYNOPSIS
|
||||
hash_free_elements()
|
||||
my_hash_free_elements()
|
||||
hash hash table
|
||||
|
||||
NOTES:
|
||||
Sets records to 0
|
||||
*/
|
||||
|
||||
static inline void hash_free_elements(HASH *hash)
|
||||
static inline void my_hash_free_elements(HASH *hash)
|
||||
{
|
||||
if (hash->free)
|
||||
{
|
||||
@ -100,18 +100,18 @@ static inline void hash_free_elements(HASH *hash)
|
||||
Free memory used by hash.
|
||||
|
||||
SYNOPSIS
|
||||
hash_free()
|
||||
my_hash_free()
|
||||
hash the hash to delete elements of
|
||||
|
||||
NOTES: Hash can't be reused without calling hash_init again.
|
||||
NOTES: Hash can't be reused without calling my_hash_init again.
|
||||
*/
|
||||
|
||||
void hash_free(HASH *hash)
|
||||
void my_hash_free(HASH *hash)
|
||||
{
|
||||
DBUG_ENTER("hash_free");
|
||||
DBUG_ENTER("my_hash_free");
|
||||
DBUG_PRINT("enter",("hash: 0x%lx", (long) hash));
|
||||
|
||||
hash_free_elements(hash);
|
||||
my_hash_free_elements(hash);
|
||||
hash->free= 0;
|
||||
delete_dynamic(&hash->array);
|
||||
DBUG_VOID_RETURN;
|
||||
@ -131,7 +131,7 @@ void my_hash_reset(HASH *hash)
|
||||
DBUG_ENTER("my_hash_reset");
|
||||
DBUG_PRINT("enter",("hash: 0x%lxd", (long) hash));
|
||||
|
||||
hash_free_elements(hash);
|
||||
my_hash_free_elements(hash);
|
||||
reset_dynamic(&hash->array);
|
||||
/* Set row pointers so that the hash can be reused at once */
|
||||
hash->blength= 1;
|
||||
@ -146,8 +146,8 @@ void my_hash_reset(HASH *hash)
|
||||
*/
|
||||
|
||||
static inline char*
|
||||
hash_key(const HASH *hash, const uchar *record, size_t *length,
|
||||
my_bool first)
|
||||
my_hash_key(const HASH *hash, const uchar *record, size_t *length,
|
||||
my_bool first)
|
||||
{
|
||||
if (hash->get_key)
|
||||
return (char*) (*hash->get_key)(record,length,first);
|
||||
@ -157,18 +157,18 @@ hash_key(const HASH *hash, const uchar *record, size_t *length,
|
||||
|
||||
/* Calculate pos according to keys */
|
||||
|
||||
static uint hash_mask(uint hashnr,uint buffmax,uint maxlength)
|
||||
static uint my_hash_mask(uint hashnr, uint buffmax, uint maxlength)
|
||||
{
|
||||
if ((hashnr & (buffmax-1)) < maxlength) return (hashnr & (buffmax-1));
|
||||
return (hashnr & ((buffmax >> 1) -1));
|
||||
}
|
||||
|
||||
static uint hash_rec_mask(const HASH *hash, HASH_LINK *pos,
|
||||
uint buffmax, uint maxlength)
|
||||
static uint my_hash_rec_mask(const HASH *hash, HASH_LINK *pos,
|
||||
uint buffmax, uint maxlength)
|
||||
{
|
||||
size_t length;
|
||||
uchar *key= (uchar*) hash_key(hash,pos->data,&length,0);
|
||||
return hash_mask(calc_hash(hash,key,length),buffmax,maxlength);
|
||||
uchar *key= (uchar*) my_hash_key(hash, pos->data, &length, 0);
|
||||
return my_hash_mask(calc_hash(hash, key, length), buffmax, maxlength);
|
||||
}
|
||||
|
||||
|
||||
@ -181,15 +181,15 @@ inline
|
||||
unsigned int rec_hashnr(HASH *hash,const uchar *record)
|
||||
{
|
||||
size_t length;
|
||||
uchar *key= (uchar*) hash_key(hash,record,&length,0);
|
||||
uchar *key= (uchar*) my_hash_key(hash, record, &length, 0);
|
||||
return calc_hash(hash,key,length);
|
||||
}
|
||||
|
||||
|
||||
uchar* hash_search(const HASH *hash, const uchar *key, size_t length)
|
||||
uchar* my_hash_search(const HASH *hash, const uchar *key, size_t length)
|
||||
{
|
||||
HASH_SEARCH_STATE state;
|
||||
return hash_first(hash, key, length, &state);
|
||||
return my_hash_first(hash, key, length, &state);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -199,18 +199,18 @@ uchar* hash_search(const HASH *hash, const uchar *key, size_t length)
|
||||
Assigns the number of the found record to HASH_SEARCH_STATE state
|
||||
*/
|
||||
|
||||
uchar* hash_first(const HASH *hash, const uchar *key, size_t length,
|
||||
HASH_SEARCH_STATE *current_record)
|
||||
uchar* my_hash_first(const HASH *hash, const uchar *key, size_t length,
|
||||
HASH_SEARCH_STATE *current_record)
|
||||
{
|
||||
HASH_LINK *pos;
|
||||
uint flag,idx;
|
||||
DBUG_ENTER("hash_first");
|
||||
DBUG_ENTER("my_hash_first");
|
||||
|
||||
flag=1;
|
||||
if (hash->records)
|
||||
{
|
||||
idx=hash_mask(calc_hash(hash,key,length ? length : hash->key_length),
|
||||
hash->blength,hash->records);
|
||||
idx= my_hash_mask(calc_hash(hash, key, length ? length : hash->key_length),
|
||||
hash->blength, hash->records);
|
||||
do
|
||||
{
|
||||
pos= dynamic_element(&hash->array,idx,HASH_LINK*);
|
||||
@ -223,7 +223,7 @@ uchar* hash_first(const HASH *hash, const uchar *key, size_t length,
|
||||
if (flag)
|
||||
{
|
||||
flag=0; /* Reset flag */
|
||||
if (hash_rec_mask(hash,pos,hash->blength,hash->records) != idx)
|
||||
if (my_hash_rec_mask(hash, pos, hash->blength, hash->records) != idx)
|
||||
break; /* Wrong link */
|
||||
}
|
||||
}
|
||||
@ -234,10 +234,10 @@ uchar* hash_first(const HASH *hash, const uchar *key, size_t length,
|
||||
}
|
||||
|
||||
/* Get next record with identical key */
|
||||
/* Can only be called if previous calls was hash_search */
|
||||
/* Can only be called if previous calls was my_hash_search */
|
||||
|
||||
uchar* hash_next(const HASH *hash, const uchar *key, size_t length,
|
||||
HASH_SEARCH_STATE *current_record)
|
||||
uchar* my_hash_next(const HASH *hash, const uchar *key, size_t length,
|
||||
HASH_SEARCH_STATE *current_record)
|
||||
{
|
||||
HASH_LINK *pos;
|
||||
uint idx;
|
||||
@ -297,7 +297,7 @@ static int hashcmp(const HASH *hash, HASH_LINK *pos, const uchar *key,
|
||||
size_t length)
|
||||
{
|
||||
size_t rec_keylength;
|
||||
uchar *rec_key= (uchar*) hash_key(hash,pos->data,&rec_keylength,1);
|
||||
uchar *rec_key= (uchar*) my_hash_key(hash, pos->data, &rec_keylength, 1);
|
||||
return ((length && length != rec_keylength) ||
|
||||
my_strnncoll(hash->charset, (uchar*) rec_key, rec_keylength,
|
||||
(uchar*) key, rec_keylength));
|
||||
@ -306,7 +306,7 @@ static int hashcmp(const HASH *hash, HASH_LINK *pos, const uchar *key,
|
||||
|
||||
/* Write a hash-key to the hash-index */
|
||||
|
||||
my_bool my_hash_insert(HASH *info,const uchar *record)
|
||||
my_bool my_hash_insert(HASH *info, const uchar *record)
|
||||
{
|
||||
int flag;
|
||||
size_t idx;
|
||||
@ -321,8 +321,8 @@ my_bool my_hash_insert(HASH *info,const uchar *record)
|
||||
|
||||
if (HASH_UNIQUE & info->flags)
|
||||
{
|
||||
uchar *key= (uchar*) hash_key(info, record, &idx, 1);
|
||||
if (hash_search(info, key, idx))
|
||||
uchar *key= (uchar*) my_hash_key(info, record, &idx, 1);
|
||||
if (my_hash_search(info, key, idx))
|
||||
return(TRUE); /* Duplicate entry */
|
||||
}
|
||||
|
||||
@ -341,7 +341,7 @@ my_bool my_hash_insert(HASH *info,const uchar *record)
|
||||
pos=data+idx;
|
||||
hash_nr=rec_hashnr(info,pos->data);
|
||||
if (flag == 0) /* First loop; Check if ok */
|
||||
if (hash_mask(hash_nr,info->blength,info->records) != first_index)
|
||||
if (my_hash_mask(hash_nr, info->blength, info->records) != first_index)
|
||||
break;
|
||||
if (!(hash_nr & halfbuff))
|
||||
{ /* Key will not move */
|
||||
@ -413,7 +413,7 @@ my_bool my_hash_insert(HASH *info,const uchar *record)
|
||||
}
|
||||
/* Check if we are at the empty position */
|
||||
|
||||
idx=hash_mask(rec_hashnr(info,record),info->blength,info->records+1);
|
||||
idx= my_hash_mask(rec_hashnr(info, record), info->blength, info->records + 1);
|
||||
pos=data+idx;
|
||||
if (pos == empty)
|
||||
{
|
||||
@ -424,7 +424,7 @@ my_bool my_hash_insert(HASH *info,const uchar *record)
|
||||
{
|
||||
/* Check if more records in same hash-nr family */
|
||||
empty[0]=pos[0];
|
||||
gpos=data+hash_rec_mask(info,pos,info->blength,info->records+1);
|
||||
gpos= data + my_hash_rec_mask(info, pos, info->blength, info->records + 1);
|
||||
if (pos == gpos)
|
||||
{
|
||||
pos->data=(uchar*) record;
|
||||
@ -449,18 +449,18 @@ my_bool my_hash_insert(HASH *info,const uchar *record)
|
||||
** if there is a free-function it's called for record if found
|
||||
******************************************************************************/
|
||||
|
||||
my_bool hash_delete(HASH *hash,uchar *record)
|
||||
my_bool my_hash_delete(HASH *hash, uchar *record)
|
||||
{
|
||||
uint blength,pos2,pos_hashnr,lastpos_hashnr,idx,empty_index;
|
||||
HASH_LINK *data,*lastpos,*gpos,*pos,*pos3,*empty;
|
||||
DBUG_ENTER("hash_delete");
|
||||
DBUG_ENTER("my_hash_delete");
|
||||
if (!hash->records)
|
||||
DBUG_RETURN(1);
|
||||
|
||||
blength=hash->blength;
|
||||
data=dynamic_element(&hash->array,0,HASH_LINK*);
|
||||
/* Search after record with key */
|
||||
pos=data+ hash_mask(rec_hashnr(hash,record),blength,hash->records);
|
||||
pos= data + my_hash_mask(rec_hashnr(hash, record), blength, hash->records);
|
||||
gpos = 0;
|
||||
|
||||
while (pos->data != record)
|
||||
@ -491,7 +491,7 @@ my_bool hash_delete(HASH *hash,uchar *record)
|
||||
/* Move the last key (lastpos) */
|
||||
lastpos_hashnr=rec_hashnr(hash,lastpos->data);
|
||||
/* pos is where lastpos should be */
|
||||
pos=data+hash_mask(lastpos_hashnr,hash->blength,hash->records);
|
||||
pos= data + my_hash_mask(lastpos_hashnr, hash->blength, hash->records);
|
||||
if (pos == empty) /* Move to empty position. */
|
||||
{
|
||||
empty[0]=lastpos[0];
|
||||
@ -499,7 +499,7 @@ my_bool hash_delete(HASH *hash,uchar *record)
|
||||
}
|
||||
pos_hashnr=rec_hashnr(hash,pos->data);
|
||||
/* pos3 is where the pos should be */
|
||||
pos3= data+hash_mask(pos_hashnr,hash->blength,hash->records);
|
||||
pos3= data + my_hash_mask(pos_hashnr, hash->blength, hash->records);
|
||||
if (pos != pos3)
|
||||
{ /* pos is on wrong posit */
|
||||
empty[0]=pos[0]; /* Save it here */
|
||||
@ -507,8 +507,8 @@ my_bool hash_delete(HASH *hash,uchar *record)
|
||||
movelink(data,(uint) (pos-data),(uint) (pos3-data),empty_index);
|
||||
goto exit;
|
||||
}
|
||||
pos2= hash_mask(lastpos_hashnr,blength,hash->records+1);
|
||||
if (pos2 == hash_mask(pos_hashnr,blength,hash->records+1))
|
||||
pos2= my_hash_mask(lastpos_hashnr, blength, hash->records + 1);
|
||||
if (pos2 == my_hash_mask(pos_hashnr, blength, hash->records + 1))
|
||||
{ /* Identical key-positions */
|
||||
if (pos2 != hash->records)
|
||||
{
|
||||
@ -536,26 +536,26 @@ exit:
|
||||
This is much more efficent than using a delete & insert.
|
||||
*/
|
||||
|
||||
my_bool hash_update(HASH *hash, uchar *record, uchar *old_key,
|
||||
size_t old_key_length)
|
||||
my_bool my_hash_update(HASH *hash, uchar *record, uchar *old_key,
|
||||
size_t old_key_length)
|
||||
{
|
||||
uint new_index,new_pos_index,blength,records,empty;
|
||||
size_t idx;
|
||||
HASH_LINK org_link,*data,*previous,*pos;
|
||||
DBUG_ENTER("hash_update");
|
||||
DBUG_ENTER("my_hash_update");
|
||||
|
||||
if (HASH_UNIQUE & hash->flags)
|
||||
{
|
||||
HASH_SEARCH_STATE state;
|
||||
uchar *found, *new_key= (uchar*) hash_key(hash, record, &idx, 1);
|
||||
if ((found= hash_first(hash, new_key, idx, &state)))
|
||||
uchar *found, *new_key= (uchar*) my_hash_key(hash, record, &idx, 1);
|
||||
if ((found= my_hash_first(hash, new_key, idx, &state)))
|
||||
{
|
||||
do
|
||||
{
|
||||
if (found != record)
|
||||
DBUG_RETURN(1); /* Duplicate entry */
|
||||
}
|
||||
while ((found= hash_next(hash, new_key, idx, &state)));
|
||||
while ((found= my_hash_next(hash, new_key, idx, &state)));
|
||||
}
|
||||
}
|
||||
|
||||
@ -564,11 +564,11 @@ my_bool hash_update(HASH *hash, uchar *record, uchar *old_key,
|
||||
|
||||
/* Search after record with key */
|
||||
|
||||
idx=hash_mask(calc_hash(hash, old_key,(old_key_length ?
|
||||
old_key_length :
|
||||
hash->key_length)),
|
||||
blength,records);
|
||||
new_index=hash_mask(rec_hashnr(hash,record),blength,records);
|
||||
idx= my_hash_mask(calc_hash(hash, old_key, (old_key_length ?
|
||||
old_key_length :
|
||||
hash->key_length)),
|
||||
blength, records);
|
||||
new_index= my_hash_mask(rec_hashnr(hash, record), blength, records);
|
||||
if (idx == new_index)
|
||||
DBUG_RETURN(0); /* Nothing to do (No record check) */
|
||||
previous=0;
|
||||
@ -618,7 +618,7 @@ my_bool hash_update(HASH *hash, uchar *record, uchar *old_key,
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
pos=data+new_index;
|
||||
new_pos_index=hash_rec_mask(hash,pos,blength,records);
|
||||
new_pos_index= my_hash_rec_mask(hash, pos, blength, records);
|
||||
if (new_index != new_pos_index)
|
||||
{ /* Other record in wrong position */
|
||||
data[empty] = *pos;
|
||||
@ -636,7 +636,7 @@ my_bool hash_update(HASH *hash, uchar *record, uchar *old_key,
|
||||
}
|
||||
|
||||
|
||||
uchar *hash_element(HASH *hash,ulong idx)
|
||||
uchar *my_hash_element(HASH *hash, ulong idx)
|
||||
{
|
||||
if (idx < hash->records)
|
||||
return dynamic_element(&hash->array,idx,HASH_LINK*)->data;
|
||||
@ -649,7 +649,8 @@ uchar *hash_element(HASH *hash,ulong idx)
|
||||
isn't changed
|
||||
*/
|
||||
|
||||
void hash_replace(HASH *hash, HASH_SEARCH_STATE *current_record, uchar *new_row)
|
||||
void my_hash_replace(HASH *hash, HASH_SEARCH_STATE *current_record,
|
||||
uchar *new_row)
|
||||
{
|
||||
if (*current_record != NO_RECORD) /* Safety */
|
||||
dynamic_element(&hash->array, *current_record, HASH_LINK*)->data= new_row;
|
||||
@ -658,7 +659,7 @@ void hash_replace(HASH *hash, HASH_SEARCH_STATE *current_record, uchar *new_row)
|
||||
|
||||
#ifndef DBUG_OFF
|
||||
|
||||
my_bool hash_check(HASH *hash)
|
||||
my_bool my_hash_check(HASH *hash)
|
||||
{
|
||||
int error;
|
||||
uint i,rec_link,found,max_links,seek,links,idx;
|
||||
@ -671,7 +672,7 @@ my_bool hash_check(HASH *hash)
|
||||
|
||||
for (i=found=max_links=seek=0 ; i < records ; i++)
|
||||
{
|
||||
if (hash_rec_mask(hash,data+i,blength,records) == i)
|
||||
if (my_hash_rec_mask(hash, data + i, blength, records) == i)
|
||||
{
|
||||
found++; seek++; links=1;
|
||||
for (idx=data[i].next ;
|
||||
@ -687,11 +688,12 @@ my_bool hash_check(HASH *hash)
|
||||
}
|
||||
hash_info=data+idx;
|
||||
seek+= ++links;
|
||||
if ((rec_link=hash_rec_mask(hash,hash_info,blength,records)) != i)
|
||||
if ((rec_link= my_hash_rec_mask(hash, hash_info,
|
||||
blength, records)) != i)
|
||||
{
|
||||
DBUG_PRINT("error",
|
||||
("Record in wrong link at %d: Start %d Record: 0x%lx Record-link %d",
|
||||
idx, i, (long) hash_info->data, rec_link));
|
||||
DBUG_PRINT("error", ("Record in wrong link at %d: Start %d "
|
||||
"Record: 0x%lx Record-link %d",
|
||||
idx, i, (long) hash_info->data, rec_link));
|
||||
error=1;
|
||||
}
|
||||
else
|
||||
|
@ -22,9 +22,9 @@ DROP TABLE tmp_db;
|
||||
CREATE TEMPORARY TABLE tmp_user LIKE user;
|
||||
set @current_hostname= @@hostname;
|
||||
INSERT INTO tmp_user VALUES ('localhost','root','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','',0,0,0,0);
|
||||
REPLACE INTO tmp_user VALUES (@current_hostname,'root','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','',0,0,0,0);
|
||||
REPLACE INTO tmp_user SELECT @current_hostname,'root','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','',0,0,0,0 FROM dual WHERE LOWER( @current_hostname) != 'localhost';
|
||||
REPLACE INTO tmp_user VALUES ('127.0.0.1','root','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','',0,0,0,0);
|
||||
INSERT INTO tmp_user (host,user) VALUES ('localhost','');
|
||||
INSERT INTO tmp_user (host,user) VALUES (@current_hostname,'');
|
||||
INSERT INTO tmp_user (host,user) SELECT @current_hostname,'' FROM dual WHERE LOWER(@current_hostname ) != 'localhost';
|
||||
INSERT INTO user SELECT * FROM tmp_user WHERE @had_user_table=0;
|
||||
DROP TABLE tmp_user;
|
||||
|
@ -373,6 +373,10 @@ int ha_finalize_handlerton(st_plugin_int *plugin)
|
||||
handlerton *hton= (handlerton *)plugin->data;
|
||||
DBUG_ENTER("ha_finalize_handlerton");
|
||||
|
||||
/* hton can be NULL here, if ha_initialize_handlerton() failed. */
|
||||
if (!hton)
|
||||
goto end;
|
||||
|
||||
switch (hton->state)
|
||||
{
|
||||
case SHOW_OPTION_NO:
|
||||
@ -401,8 +405,16 @@ int ha_finalize_handlerton(st_plugin_int *plugin)
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
In case a plugin is uninstalled and re-installed later, it should
|
||||
reuse an array slot. Otherwise the number of uninstall/install
|
||||
cycles would be limited.
|
||||
*/
|
||||
hton2plugin[hton->slot]= NULL;
|
||||
|
||||
my_free((uchar*)hton, MYF(0));
|
||||
|
||||
end:
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
@ -437,6 +449,7 @@ int ha_initialize_handlerton(st_plugin_int *plugin)
|
||||
case SHOW_OPTION_YES:
|
||||
{
|
||||
uint tmp;
|
||||
ulong fslot;
|
||||
/* now check the db_type for conflict */
|
||||
if (hton->db_type <= DB_TYPE_UNKNOWN ||
|
||||
hton->db_type >= DB_TYPE_DEFAULT ||
|
||||
@ -461,7 +474,31 @@ int ha_initialize_handlerton(st_plugin_int *plugin)
|
||||
tmp= hton->savepoint_offset;
|
||||
hton->savepoint_offset= savepoint_alloc_size;
|
||||
savepoint_alloc_size+= tmp;
|
||||
hton->slot= total_ha++;
|
||||
|
||||
/*
|
||||
In case a plugin is uninstalled and re-installed later, it should
|
||||
reuse an array slot. Otherwise the number of uninstall/install
|
||||
cycles would be limited. So look for a free slot.
|
||||
*/
|
||||
DBUG_PRINT("plugin", ("total_ha: %lu", total_ha));
|
||||
for (fslot= 0; fslot < total_ha; fslot++)
|
||||
{
|
||||
if (!hton2plugin[fslot])
|
||||
break;
|
||||
}
|
||||
if (fslot < total_ha)
|
||||
hton->slot= fslot;
|
||||
else
|
||||
{
|
||||
if (total_ha >= MAX_HA)
|
||||
{
|
||||
sql_print_error("Too many plugins loaded. Limit is %lu. "
|
||||
"Failed on '%s'", (ulong) MAX_HA, plugin->name.str);
|
||||
goto err;
|
||||
}
|
||||
hton->slot= total_ha++;
|
||||
}
|
||||
|
||||
hton2plugin[hton->slot]=plugin;
|
||||
if (hton->prepare)
|
||||
total_ha_2pc++;
|
||||
|
@ -1732,6 +1732,12 @@ public:
|
||||
but we don't have a primary key
|
||||
*/
|
||||
virtual void use_hidden_primary_key();
|
||||
virtual uint alter_table_flags(uint flags)
|
||||
{
|
||||
if (ht->alter_table_flags)
|
||||
return ht->alter_table_flags(flags);
|
||||
return 0;
|
||||
}
|
||||
|
||||
protected:
|
||||
/* Service methods for use by storage engines. */
|
||||
|
@ -803,6 +803,7 @@ bool check_string_byte_length(LEX_STRING *str, const char *err_msg,
|
||||
bool check_string_char_length(LEX_STRING *str, const char *err_msg,
|
||||
uint max_char_length, CHARSET_INFO *cs,
|
||||
bool no_error);
|
||||
bool check_host_name(LEX_STRING *str);
|
||||
|
||||
bool parse_sql(THD *thd,
|
||||
Parser_state *parser_state,
|
||||
|
@ -574,6 +574,7 @@ public:
|
||||
keys_map.clear_all();
|
||||
bzero((char*) keys,sizeof(keys));
|
||||
}
|
||||
SEL_TREE(SEL_TREE *arg, RANGE_OPT_PARAM *param);
|
||||
/*
|
||||
Note: there may exist SEL_TREE objects with sel_tree->type=KEY and
|
||||
keys[i]=0 for all i. (SergeyP: it is not clear whether there is any
|
||||
@ -767,6 +768,7 @@ public:
|
||||
trees_next(trees),
|
||||
trees_end(trees + PREALLOCED_TREES)
|
||||
{}
|
||||
SEL_IMERGE (SEL_IMERGE *arg, RANGE_OPT_PARAM *param);
|
||||
int or_sel_tree(RANGE_OPT_PARAM *param, SEL_TREE *tree);
|
||||
int or_sel_tree_with_checks(RANGE_OPT_PARAM *param, SEL_TREE *new_tree);
|
||||
int or_sel_imerge_with_checks(RANGE_OPT_PARAM *param, SEL_IMERGE* imerge);
|
||||
@ -883,6 +885,61 @@ int SEL_IMERGE::or_sel_imerge_with_checks(RANGE_OPT_PARAM *param, SEL_IMERGE* im
|
||||
}
|
||||
|
||||
|
||||
SEL_TREE::SEL_TREE(SEL_TREE *arg, RANGE_OPT_PARAM *param): Sql_alloc()
|
||||
{
|
||||
keys_map= arg->keys_map;
|
||||
type= arg->type;
|
||||
for (int idx= 0; idx < MAX_KEY; idx++)
|
||||
{
|
||||
if ((keys[idx]= arg->keys[idx]))
|
||||
keys[idx]->increment_use_count(1);
|
||||
}
|
||||
|
||||
List_iterator<SEL_IMERGE> it(arg->merges);
|
||||
for (SEL_IMERGE *el= it++; el; el= it++)
|
||||
{
|
||||
SEL_IMERGE *merge= new SEL_IMERGE(el, param);
|
||||
if (!merge || merge->trees == merge->trees_next)
|
||||
{
|
||||
merges.empty();
|
||||
return;
|
||||
}
|
||||
merges.push_back (merge);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
SEL_IMERGE::SEL_IMERGE (SEL_IMERGE *arg, RANGE_OPT_PARAM *param) : Sql_alloc()
|
||||
{
|
||||
uint elements= (arg->trees_end - arg->trees);
|
||||
if (elements > PREALLOCED_TREES)
|
||||
{
|
||||
uint size= elements * sizeof (SEL_TREE **);
|
||||
if (!(trees= (SEL_TREE **)alloc_root(param->mem_root, size)))
|
||||
goto mem_err;
|
||||
}
|
||||
else
|
||||
trees= &trees_prealloced[0];
|
||||
|
||||
trees_next= trees;
|
||||
trees_end= trees + elements;
|
||||
|
||||
for (SEL_TREE **tree = trees, **arg_tree= arg->trees; tree < trees_end;
|
||||
tree++, arg_tree++)
|
||||
{
|
||||
if (!(*tree= new SEL_TREE(*arg_tree, param)))
|
||||
goto mem_err;
|
||||
}
|
||||
|
||||
return;
|
||||
|
||||
mem_err:
|
||||
trees= &trees_prealloced[0];
|
||||
trees_next= trees;
|
||||
trees_end= trees;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Perform AND operation on two index_merge lists and store result in *im1.
|
||||
*/
|
||||
@ -942,10 +999,23 @@ int imerge_list_or_tree(RANGE_OPT_PARAM *param,
|
||||
{
|
||||
SEL_IMERGE *imerge;
|
||||
List_iterator<SEL_IMERGE> it(*im1);
|
||||
bool tree_used= FALSE;
|
||||
while ((imerge= it++))
|
||||
{
|
||||
if (imerge->or_sel_tree_with_checks(param, tree))
|
||||
SEL_TREE *or_tree;
|
||||
if (tree_used)
|
||||
{
|
||||
or_tree= new SEL_TREE (tree, param);
|
||||
if (!or_tree ||
|
||||
(or_tree->keys_map.is_clear_all() && or_tree->merges.is_empty()))
|
||||
return FALSE;
|
||||
}
|
||||
else
|
||||
or_tree= tree;
|
||||
|
||||
if (imerge->or_sel_tree_with_checks(param, or_tree))
|
||||
it.remove();
|
||||
tree_used= TRUE;
|
||||
}
|
||||
return im1->is_empty();
|
||||
}
|
||||
@ -5549,7 +5619,9 @@ get_mm_parts(RANGE_OPT_PARAM *param, COND *cond_func, Field *field,
|
||||
tree->keys_map.set_bit(key_part->key);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (tree && tree->merges.is_empty() && tree->keys_map.is_clear_all())
|
||||
tree= NULL;
|
||||
DBUG_RETURN(tree);
|
||||
}
|
||||
|
||||
|
@ -1949,7 +1949,8 @@ sp_head::execute_procedure(THD *thd, List<Item> *args)
|
||||
thd->rollback_item_tree_changes();
|
||||
}
|
||||
|
||||
DBUG_PRINT("info",(" %.*s: eval args done", m_name.length, m_name.str));
|
||||
DBUG_PRINT("info",(" %.*s: eval args done", (int) m_name.length,
|
||||
m_name.str));
|
||||
}
|
||||
if (!(m_flags & LOG_SLOW_STATEMENTS) && thd->enable_slow_log)
|
||||
{
|
||||
|
@ -3720,6 +3720,20 @@ void assign_new_table_id(TABLE_SHARE *share)
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
#ifndef DBUG_OFF
|
||||
/* Cause a spurious statement reprepare for debug purposes. */
|
||||
static bool inject_reprepare(THD *thd)
|
||||
{
|
||||
if (thd->m_reprepare_observer && thd->stmt_arena->is_reprepared == FALSE)
|
||||
{
|
||||
thd->m_reprepare_observer->report_error(thd);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
Compare metadata versions of an element obtained from the table
|
||||
definition cache and its corresponding node in the parse tree.
|
||||
@ -3773,15 +3787,7 @@ check_and_update_table_version(THD *thd,
|
||||
tables->set_table_ref_id(table_share);
|
||||
}
|
||||
|
||||
#ifndef DBUG_OFF
|
||||
/* Spuriously reprepare each statement. */
|
||||
if (_db_strict_keyword_("reprepare_each_statement") &&
|
||||
thd->m_reprepare_observer && thd->stmt_arena->is_reprepared == FALSE)
|
||||
{
|
||||
thd->m_reprepare_observer->report_error(thd);
|
||||
return TRUE;
|
||||
}
|
||||
#endif
|
||||
DBUG_EXECUTE_IF("reprepare_each_statement", return inject_reprepare(thd););
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
@ -7507,6 +7507,39 @@ int test_if_data_home_dir(const char *dir)
|
||||
C_MODE_END
|
||||
|
||||
|
||||
/**
|
||||
Check that host name string is valid.
|
||||
|
||||
@param[in] str string to be checked
|
||||
|
||||
@return Operation status
|
||||
@retval FALSE host name is ok
|
||||
@retval TRUE host name string is longer than max_length or
|
||||
has invalid symbols
|
||||
*/
|
||||
|
||||
bool check_host_name(LEX_STRING *str)
|
||||
{
|
||||
const char *name= str->str;
|
||||
const char *end= str->str + str->length;
|
||||
if (check_string_byte_length(str, ER(ER_HOSTNAME), HOSTNAME_LENGTH))
|
||||
return TRUE;
|
||||
|
||||
while (name != end)
|
||||
{
|
||||
if (*name == '@')
|
||||
{
|
||||
my_printf_error(ER_UNKNOWN_ERROR,
|
||||
"Malformed hostname (illegal symbol: '%c')", MYF(0),
|
||||
*name);
|
||||
return TRUE;
|
||||
}
|
||||
name++;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
extern int MYSQLparse(void *thd); // from sql_yacc.cc
|
||||
|
||||
|
||||
|
@ -4257,6 +4257,27 @@ static int get_schema_views_record(THD *thd, TABLE_LIST *tables,
|
||||
!my_strcasecmp(system_charset_info, tables->definer.host.str,
|
||||
sctx->priv_host))
|
||||
tables->allowed_show= TRUE;
|
||||
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
||||
else
|
||||
{
|
||||
if ((thd->col_access & (SHOW_VIEW_ACL|SELECT_ACL)) ==
|
||||
(SHOW_VIEW_ACL|SELECT_ACL))
|
||||
tables->allowed_show= TRUE;
|
||||
else
|
||||
{
|
||||
TABLE_LIST table_list;
|
||||
uint view_access;
|
||||
memset(&table_list, 0, sizeof(table_list));
|
||||
table_list.db= tables->view_db.str;
|
||||
table_list.table_name= tables->view_name.str;
|
||||
table_list.grant.privilege= thd->col_access;
|
||||
view_access= get_table_grant(thd, &table_list);
|
||||
if ((view_access & (SHOW_VIEW_ACL|SELECT_ACL)) ==
|
||||
(SHOW_VIEW_ACL|SELECT_ACL))
|
||||
tables->allowed_show= TRUE;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
restore_record(table, s->default_values);
|
||||
tmp_db_name= &tables->view_db;
|
||||
|
@ -11301,8 +11301,7 @@ user:
|
||||
if (check_string_char_length(&$$->user, ER(ER_USERNAME),
|
||||
USERNAME_CHAR_LENGTH,
|
||||
system_charset_info, 0) ||
|
||||
check_string_byte_length(&$$->host, ER(ER_HOSTNAME),
|
||||
HOSTNAME_LENGTH))
|
||||
check_host_name(&$$->host))
|
||||
MYSQL_YYABORT;
|
||||
}
|
||||
| CURRENT_USER optional_braces
|
||||
|
Loading…
x
Reference in New Issue
Block a user