Commit 8cb7c903 authored by Tatiana A. Nurnberg's avatar Tatiana A. Nurnberg

auto-merge

parents b16ad3ba 0a6c5535
...@@ -40,6 +40,7 @@ MYRG_INFO *myrg_open(const char *name, int mode, int handle_locking) ...@@ -40,6 +40,7 @@ MYRG_INFO *myrg_open(const char *name, int mode, int handle_locking)
IO_CACHE file; IO_CACHE file;
MI_INFO *isam=0; MI_INFO *isam=0;
uint found_merge_insert_method= 0; uint found_merge_insert_method= 0;
my_bool bad_children= FALSE;
DBUG_ENTER("myrg_open"); DBUG_ENTER("myrg_open");
LINT_INIT(key_parts); LINT_INIT(key_parts);
...@@ -89,13 +90,13 @@ MYRG_INFO *myrg_open(const char *name, int mode, int handle_locking) ...@@ -89,13 +90,13 @@ MYRG_INFO *myrg_open(const char *name, int mode, int handle_locking)
fn_format(buff, buff, "", "", 0); fn_format(buff, buff, "", "", 0);
if (!(isam=mi_open(buff,mode,(handle_locking?HA_OPEN_WAIT_IF_LOCKED:0)))) if (!(isam=mi_open(buff,mode,(handle_locking?HA_OPEN_WAIT_IF_LOCKED:0))))
{ {
my_errno= HA_ERR_WRONG_MRG_TABLE_DEF;
if (handle_locking & HA_OPEN_FOR_REPAIR) if (handle_locking & HA_OPEN_FOR_REPAIR)
{ {
myrg_print_wrong_table(buff); myrg_print_wrong_table(buff);
bad_children= TRUE;
continue; continue;
} }
goto err; goto bad_children;
} }
if (!m_info) /* First file */ if (!m_info) /* First file */
{ {
...@@ -122,13 +123,13 @@ MYRG_INFO *myrg_open(const char *name, int mode, int handle_locking) ...@@ -122,13 +123,13 @@ MYRG_INFO *myrg_open(const char *name, int mode, int handle_locking)
files++; files++;
if (m_info->reclength != isam->s->base.reclength) if (m_info->reclength != isam->s->base.reclength)
{ {
my_errno=HA_ERR_WRONG_MRG_TABLE_DEF;
if (handle_locking & HA_OPEN_FOR_REPAIR) if (handle_locking & HA_OPEN_FOR_REPAIR)
{ {
myrg_print_wrong_table(buff); myrg_print_wrong_table(buff);
bad_children= TRUE;
continue; continue;
} }
goto err; goto bad_children;
} }
m_info->options|= isam->s->options; m_info->options|= isam->s->options;
m_info->records+= isam->state->records; m_info->records+= isam->state->records;
...@@ -141,8 +142,8 @@ MYRG_INFO *myrg_open(const char *name, int mode, int handle_locking) ...@@ -141,8 +142,8 @@ MYRG_INFO *myrg_open(const char *name, int mode, int handle_locking)
m_info->tables); m_info->tables);
} }
if (my_errno == HA_ERR_WRONG_MRG_TABLE_DEF) if (bad_children)
goto err; goto bad_children;
if (!m_info && !(m_info= (MYRG_INFO*) my_malloc(sizeof(MYRG_INFO), if (!m_info && !(m_info= (MYRG_INFO*) my_malloc(sizeof(MYRG_INFO),
MYF(MY_WME | MY_ZEROFILL)))) MYF(MY_WME | MY_ZEROFILL))))
goto err; goto err;
...@@ -170,12 +171,14 @@ MYRG_INFO *myrg_open(const char *name, int mode, int handle_locking) ...@@ -170,12 +171,14 @@ MYRG_INFO *myrg_open(const char *name, int mode, int handle_locking)
pthread_mutex_unlock(&THR_LOCK_open); pthread_mutex_unlock(&THR_LOCK_open);
DBUG_RETURN(m_info); DBUG_RETURN(m_info);
bad_children:
my_errno= HA_ERR_WRONG_MRG_TABLE_DEF;
err: err:
save_errno=my_errno; save_errno=my_errno;
switch (errpos) { switch (errpos) {
case 3: case 3:
while (files) while (files)
mi_close(m_info->open_tables[--files].table); (void) mi_close(m_info->open_tables[--files].table);
my_free((char*) m_info,MYF(0)); my_free((char*) m_info,MYF(0));
/* Fall through */ /* Fall through */
case 2: case 2:
......
# include/count_sessions.inc
#
# SUMMARY
#
# Stores the number of current sessions in $count_sessions.
#
#
# USAGE
#
# Please look into include/wait_until_count_sessions.inc
# for examples of typical usage.
#
#
# EXAMPLE
# backup.test, grant3.test
#
#
# Created: 2009-01-14 mleich
#
let $count_sessions= query_get_value(SHOW STATUS LIKE 'Threads_connected', Value, 1);
# include/wait_until_count_sessions.inc
#
# SUMMARY
#
# Waits until the passed number ($count_sessions) of concurrent sessions was
# observed via
# SHOW STATUS LIKE 'Threads_connected'
# or the operation times out.
# Note: Starting with 5.1 we could also use
# SELECT COUNT(*) FROM information_schema.processlist
# I stay with "SHOW STATUS LIKE 'Threads_connected'" because this
# runs in all versions 5.0+
#
#
# USAGE
#
# let $count_sessions= 3;
# --source include/wait_until_count_sessions.inc
#
# OR typical example of a test which uses more than one session
# Such a test could harm successing tests if there is no server shutdown
# and start between.cw
#
# If the testing box is slow than the disconnect of sessions belonging to
# the current test might happen when the successing test gets executed.
# This means the successing test might see activities like unexpected
# rows within the general log or the PROCESSLIST.
# Example from bug http://bugs.mysql.com/bug.php?id=40377
# --- bzr_mysql-6.0-rpl/.../r/log_state.result
# +++ bzr_mysql-6.0-rpl/.../r/log_state.reject
# @@ -25,6 +25,7 @@
# event_time user_host ... command_type argument
# TIMESTAMP USER_HOST ... Query create table t1(f1 int)
# TIMESTAMP USER_HOST ... Query select * from mysql.general_log
# +TIMESTAMP USER_HOST ... Quit
# ....
#
# What to do?
# -----------
# <start of test>
# # Determine initial number of connections (set $count_sessions)
# --source include/count_sessions.inc
# ...
# connect (con1,.....)
# ...
# connection default;
# ...
# disconnect con1;
# ...
# # Wait until we have reached the initial number of connections
# # or more than the sleep time above (10 seconds) has passed.
# # $count_sessions
# --source include/wait_until_count_sessions.inc
# <end of test>
#
# Important note about tests with unfortunate (= not cooperative
# to successing tests) architecture:
# connection con1;
# send SELECT ..., sleep(10)
# connection default;
# ...
# disconnect con1;
# <end of test>
# should be fixed by
# connection con1;
# send SELECT ..., sleep(10)
# connection default;
# ...
# connect con1;
# reap;
# connection default;
# disconnect con1;
# <end of test>
# and not only by appending include/wait_until_count_sessions.inc etc.
#
#
# EXAMPLE
#
# backup.test, grant3.test
#
#
# Created: 2009-01-14 mleich
#
let $wait_counter= 50;
if ($wait_timeout)
{
let $wait_counter= `SELECT $wait_timeout * 10`;
}
# Reset $wait_timeout so that its value won't be used on subsequent
# calls, and default will be used instead.
let $wait_timeout= 0;
while ($wait_counter)
{
let $current_sessions= query_get_value(SHOW STATUS LIKE 'Threads_connected', Value, 1);
let $success= `SELECT $current_sessions = $count_sessions`;
if ($success)
{
let $wait_counter= 0;
}
if (!$success)
{
real_sleep 0.1;
dec $wait_counter;
}
}
if (!$success)
{
--echo # Timeout in wait_until_count_sessions.inc
--echo # Number of sessions expected: $count_sessions found: $current_sessions
}
...@@ -319,4 +319,9 @@ select @my_uuid_date - @my_uuid_synthetic; ...@@ -319,4 +319,9 @@ select @my_uuid_date - @my_uuid_synthetic;
@my_uuid_date - @my_uuid_synthetic @my_uuid_date - @my_uuid_synthetic
0 0
set @@session.time_zone=@save_tz; set @@session.time_zone=@save_tz;
CREATE TABLE t1 (a DATE);
SELECT * FROM t1 WHERE a = NAME_CONST('reportDate',
_binary'2009-01-09' COLLATE 'binary');
a
DROP TABLE t1;
End of 5.0 tests End of 5.0 tests
...@@ -366,20 +366,20 @@ insert into mysql.user select * from t1; ...@@ -366,20 +366,20 @@ insert into mysql.user select * from t1;
drop table t1, t2; drop table t1, t2;
drop database TESTDB; drop database TESTDB;
flush privileges; flush privileges;
grant all privileges on test.* to `a@`@localhost; GRANT ALL PRIVILEGES ON test.* TO `a@`@localhost;
grant execute on * to `a@`@localhost; GRANT EXECUTE ON * TO `a@`@localhost;
create table t2 (s1 int); CREATE TABLE t2 (s1 INT);
insert into t2 values (1); INSERT INTO t2 VALUES (1);
drop function if exists f2; DROP FUNCTION IF EXISTS f2;
create function f2 () returns int begin declare v int; select s1 from t2 CREATE FUNCTION f2 () RETURNS INT
into v; return v; end// BEGIN DECLARE v INT; SELECT s1 FROM t2 INTO v; RETURN v; END//
select f2(); SELECT f2();
f2() f2()
1 1
drop function f2; DROP FUNCTION f2;
drop table t2; DROP TABLE t2;
REVOKE ALL PRIVILEGES, GRANT OPTION FROM `a@`@localhost; REVOKE ALL PRIVILEGES, GRANT OPTION FROM `a@`@localhost;
drop user `a@`@localhost; DROP USER `a@`@localhost;
drop database if exists mysqltest_1; drop database if exists mysqltest_1;
drop database if exists mysqltest_2; drop database if exists mysqltest_2;
drop user mysqltest_u1@localhost; drop user mysqltest_u1@localhost;
...@@ -436,6 +436,7 @@ SELECT * FROM t2; ...@@ -436,6 +436,7 @@ SELECT * FROM t2;
ERROR 42000: SELECT command denied to user 'mysqltest1'@'localhost' for column 'c' in table 't2' ERROR 42000: SELECT command denied to user 'mysqltest1'@'localhost' for column 'c' in table 't2'
SELECT * FROM t1 JOIN t2 USING (b); SELECT * FROM t1 JOIN t2 USING (b);
ERROR 42000: SELECT command denied to user 'mysqltest1'@'localhost' for column 'c' in table 't2' ERROR 42000: SELECT command denied to user 'mysqltest1'@'localhost' for column 'c' in table 't2'
USE test;
DROP TABLE db1.t1, db1.t2; DROP TABLE db1.t1, db1.t2;
DROP USER mysqltest1@localhost; DROP USER mysqltest1@localhost;
DROP DATABASE db1; DROP DATABASE db1;
......
drop table if exists t1; DROP TABLE IF EXISTS t1;
create table t1(a int) engine=innodb; CREATE TABLE t1(a INT) ENGINE=innodb;
lock tables t1 write; LOCK TABLES t1 WRITE;
insert into t1 values(10); INSERT INTO t1 VALUES(10);
select * from t1; SELECT * FROM t1;
a a
10 10
drop table t1; DROP TABLE t1;
...@@ -940,4 +940,15 @@ m1 CREATE TABLE `m1` ( ...@@ -940,4 +940,15 @@ m1 CREATE TABLE `m1` (
`a` int(11) default NULL `a` int(11) default NULL
) ENGINE=MRG_MyISAM DEFAULT CHARSET=latin1 ) ENGINE=MRG_MyISAM DEFAULT CHARSET=latin1
DROP TABLE t1, m1; DROP TABLE t1, m1;
CREATE TABLE t1(a INT);
CREATE TABLE t2(a VARCHAR(10));
CREATE TABLE m1(a INT) ENGINE=MERGE UNION=(t1, t2);
CREATE TABLE m2(a INT) ENGINE=MERGE UNION=(t1);
SELECT * FROM t1;
a
SELECT * FROM m1;
ERROR HY000: Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist
SELECT * FROM m2;
a
DROP TABLE t1, t2, m1, m2;
End of 5.0 tests End of 5.0 tests
This diff is collapsed.
...@@ -436,5 +436,14 @@ select @my_uuid_date - @my_uuid_synthetic; ...@@ -436,5 +436,14 @@ select @my_uuid_date - @my_uuid_synthetic;
set @@session.time_zone=@save_tz; set @@session.time_zone=@save_tz;
#
# Bug#42014: Crash, name_const with collate
#
CREATE TABLE t1 (a DATE);
SELECT * FROM t1 WHERE a = NAME_CONST('reportDate',
_binary'2009-01-09' COLLATE 'binary');
DROP TABLE t1;
--echo End of 5.0 tests --echo End of 5.0 tests
This diff is collapsed.
# Can't run with embedded server # Can't run with embedded server because we use GRANT
-- source include/not_embedded.inc -- source include/not_embedded.inc
# Save the initial number of concurrent sessions
--source include/count_sessions.inc
# Test of GRANT commands # Test of GRANT commands
SET NAMES binary; SET NAMES binary;
...@@ -23,10 +27,11 @@ grant create user on *.* to mysqltest_1@localhost; ...@@ -23,10 +27,11 @@ grant create user on *.* to mysqltest_1@localhost;
grant select on `my\_1`.* to mysqltest_1@localhost with grant option; grant select on `my\_1`.* to mysqltest_1@localhost with grant option;
connect (user_a,localhost,mysqltest_1,,); connect (user_a,localhost,mysqltest_1,,);
connection user_a; connection user_a;
--error 1410 --error ER_CANT_CREATE_USER_WITH_GRANT
grant select on `my\_1`.* to mysqltest_2@localhost; grant select on `my\_1`.* to mysqltest_2@localhost;
create user mysqltest_2@localhost; create user mysqltest_2@localhost;
disconnect user_a; disconnect user_a;
disconnect master;
connection default; connection default;
delete from mysql.user where user like 'mysqltest\_%'; delete from mysql.user where user like 'mysqltest\_%';
...@@ -36,7 +41,7 @@ delete from mysql.columns_priv where user like 'mysqltest\_%'; ...@@ -36,7 +41,7 @@ delete from mysql.columns_priv where user like 'mysqltest\_%';
flush privileges; flush privileges;
# #
# Bug: #19828 Case sensitivity in Grant/Revoke # Bug#19828 Case sensitivity in Grant/Revoke
# #
grant select on test.* to CUser@localhost; grant select on test.* to CUser@localhost;
...@@ -137,7 +142,7 @@ DROP USER CUser2@LOCALHOST; ...@@ -137,7 +142,7 @@ DROP USER CUser2@LOCALHOST;
# #
# Bug#31194: Privilege ordering does not order properly for wildcard values # Bug#31194 Privilege ordering does not order properly for wildcard values
# #
CREATE DATABASE mysqltest_1; CREATE DATABASE mysqltest_1;
...@@ -160,3 +165,6 @@ DROP DATABASE mysqltest_1; ...@@ -160,3 +165,6 @@ DROP DATABASE mysqltest_1;
--echo End of 5.0 tests --echo End of 5.0 tests
# Wait till we reached the initial number of concurrent sessions
--source include/wait_until_count_sessions.inc
# This is a test for bug 578 # Test for Bug#578 mysqlimport -l silently fails when binlog-ignore-db is set
-- source include/have_innodb.inc --source include/have_innodb.inc
# Save the initial number of concurrent sessions
--source include/count_sessions.inc
connect (con1,localhost,root,,); connect (con1,localhost,root,,);
connect (con2,localhost,root,,); connect (con2,localhost,root,,);
connection con1; connection con1;
--disable_warnings --disable_warnings
drop table if exists t1; DROP TABLE IF EXISTS t1;
create table t1(a int) engine=innodb; CREATE TABLE t1(a INT) ENGINE=innodb;
--enable_warnings --enable_warnings
lock tables t1 write; LOCK TABLES t1 WRITE;
insert into t1 values(10); INSERT INTO t1 VALUES(10);
disconnect con1; disconnect con1;
connection con2; connection con2;
# The bug was that, because of the LOCK TABLES, the handler "forgot" to commit, # The bug was that, because of the LOCK TABLES, the handler "forgot" to commit,
# and the other commit when we write to the binlog was not done because of # and the other commit when we write to the binlog was not done because of
# binlog-ignore-db # binlog-ignore-db
select * from t1; SELECT * FROM t1;
drop table t1; DROP TABLE t1;
connection default;
disconnect con2;
# End of 4.1 tests # End of 4.1 tests
# Wait till we reached the initial number of concurrent sessions
--source include/wait_until_count_sessions.inc
...@@ -556,4 +556,17 @@ ALTER TABLE m1 UNION=(); ...@@ -556,4 +556,17 @@ ALTER TABLE m1 UNION=();
SHOW CREATE TABLE m1; SHOW CREATE TABLE m1;
DROP TABLE t1, m1; DROP TABLE t1, m1;
#
# BUG#32047 - 'Spurious' errors while opening MERGE tables
#
CREATE TABLE t1(a INT);
CREATE TABLE t2(a VARCHAR(10));
CREATE TABLE m1(a INT) ENGINE=MERGE UNION=(t1, t2);
CREATE TABLE m2(a INT) ENGINE=MERGE UNION=(t1);
SELECT * FROM t1;
--error ER_WRONG_MRG_TABLE
SELECT * FROM m1;
SELECT * FROM m2;
DROP TABLE t1, t2, m1, m2;
--echo End of 5.0 tests --echo End of 5.0 tests
This diff is collapsed.
...@@ -3,6 +3,10 @@ ...@@ -3,6 +3,10 @@
-- source include/have_ssl.inc -- source include/have_ssl.inc
# Save the initial number of concurrent sessions
--source include/count_sessions.inc
--disable_warnings --disable_warnings
drop table if exists t1; drop table if exists t1;
--enable_warnings --enable_warnings
...@@ -21,38 +25,42 @@ connect (con2,localhost,ssl_user2,,,,,SSL); ...@@ -21,38 +25,42 @@ connect (con2,localhost,ssl_user2,,,,,SSL);
connect (con3,localhost,ssl_user3,,,,,SSL); connect (con3,localhost,ssl_user3,,,,,SSL);
connect (con4,localhost,ssl_user4,,,,,SSL); connect (con4,localhost,ssl_user4,,,,,SSL);
--replace_result $MASTER_MYSOCK MASTER_SOCKET $MASTER_MYPORT MASTER_PORT --replace_result $MASTER_MYSOCK MASTER_SOCKET $MASTER_MYPORT MASTER_PORT
--error 1045 --error ER_ACCESS_DENIED_ERROR
connect (con5,localhost,ssl_user5,,,,,SSL); connect (con5,localhost,ssl_user5,,,,,SSL);
connection con1; connection con1;
# Check ssl turned on # Check ssl turned on
SHOW STATUS LIKE 'Ssl_cipher'; SHOW STATUS LIKE 'Ssl_cipher';
select * from t1; select * from t1;
--error 1142 --error ER_TABLEACCESS_DENIED_ERROR
delete from t1; delete from t1;
connection con2; connection con2;
# Check ssl turned on # Check ssl turned on
SHOW STATUS LIKE 'Ssl_cipher'; SHOW STATUS LIKE 'Ssl_cipher';
select * from t1; select * from t1;
--error 1142 --error ER_TABLEACCESS_DENIED_ERROR
delete from t1; delete from t1;
connection con3; connection con3;
# Check ssl turned on # Check ssl turned on
SHOW STATUS LIKE 'Ssl_cipher'; SHOW STATUS LIKE 'Ssl_cipher';
select * from t1; select * from t1;
--error 1142 --error ER_TABLEACCESS_DENIED_ERROR
delete from t1; delete from t1;
connection con4; connection con4;
# Check ssl turned on # Check ssl turned on
SHOW STATUS LIKE 'Ssl_cipher'; SHOW STATUS LIKE 'Ssl_cipher';
select * from t1; select * from t1;
--error 1142 --error ER_TABLEACCESS_DENIED_ERROR
delete from t1; delete from t1;
connection default; connection default;
disconnect con1;
disconnect con2;
disconnect con3;
disconnect con4;
drop user ssl_user1@localhost, ssl_user2@localhost, drop user ssl_user1@localhost, ssl_user2@localhost,
ssl_user3@localhost, ssl_user4@localhost, ssl_user5@localhost; ssl_user3@localhost, ssl_user4@localhost, ssl_user5@localhost;
...@@ -97,7 +105,7 @@ drop table t1; ...@@ -97,7 +105,7 @@ drop table t1;
--exec $MYSQL_TEST --ssl-cert= --max-connect-retries=1 < $MYSQLTEST_VARDIR/tmp/test.sql 2>&1 --exec $MYSQL_TEST --ssl-cert= --max-connect-retries=1 < $MYSQLTEST_VARDIR/tmp/test.sql 2>&1
# #
# BUG#21611 Slave can't connect when master-ssl-cipher specified # Bug#21611 Slave can't connect when master-ssl-cipher specified
# - Apparently selecting a cipher doesn't work at all # - Apparently selecting a cipher doesn't work at all
# - Usa a cipher that both yaSSL and OpenSSL supports # - Usa a cipher that both yaSSL and OpenSSL supports
# #
...@@ -133,7 +141,7 @@ drop table t1; ...@@ -133,7 +141,7 @@ drop table t1;
--exec $MYSQL_TEST --ssl-cipher=UNKNOWN-CIPHER < $MYSQLTEST_VARDIR/tmp/test.sql 2>&1 --exec $MYSQL_TEST --ssl-cipher=UNKNOWN-CIPHER < $MYSQLTEST_VARDIR/tmp/test.sql 2>&1
# #
# Bug #27669 mysqldump: SSL connection error when trying to connect # Bug#27669 mysqldump: SSL connection error when trying to connect
# #
CREATE TABLE t1(a int); CREATE TABLE t1(a int);
...@@ -152,3 +160,7 @@ INSERT INTO t1 VALUES (1), (2); ...@@ -152,3 +160,7 @@ INSERT INTO t1 VALUES (1), (2);
--exec $MYSQL_DUMP --skip-create --skip-comments --ssl --ssl-cert=$MYSQL_TEST_DIR/std_data/client-cert.pem test 2>&1 --exec $MYSQL_DUMP --skip-create --skip-comments --ssl --ssl-cert=$MYSQL_TEST_DIR/std_data/client-cert.pem test 2>&1
DROP TABLE t1; DROP TABLE t1;
--remove_file $MYSQLTEST_VARDIR/tmp/test.sql
# Wait till we reached the initial number of concurrent sessions
--source include/wait_until_count_sessions.inc
...@@ -5,6 +5,10 @@ eval set @tmpdir="../tmp"; ...@@ -5,6 +5,10 @@ eval set @tmpdir="../tmp";
enable_query_log; enable_query_log;
-- source include/have_outfile.inc -- source include/have_outfile.inc
# Save the initial number of concurrent sessions
--source include/count_sessions.inc
# #
# test of into outfile|dumpfile # test of into outfile|dumpfile
# #
...@@ -46,7 +50,7 @@ select load_file(concat(@tmpdir,"/outfile-test.not-exist")); ...@@ -46,7 +50,7 @@ select load_file(concat(@tmpdir,"/outfile-test.not-exist"));
--remove_file $MYSQLTEST_VARDIR/tmp/outfile-test.3 --remove_file $MYSQLTEST_VARDIR/tmp/outfile-test.3
drop table t1; drop table t1;
# Bug#8191 # Bug#8191 SELECT INTO OUTFILE insists on FROM clause
disable_query_log; disable_query_log;
eval select 1 into outfile "../tmp/outfile-test.4"; eval select 1 into outfile "../tmp/outfile-test.4";
enable_query_log; enable_query_log;
...@@ -54,11 +58,11 @@ select load_file(concat(@tmpdir,"/outfile-test.4")); ...@@ -54,11 +58,11 @@ select load_file(concat(@tmpdir,"/outfile-test.4"));
--remove_file $MYSQLTEST_VARDIR/tmp/outfile-test.4 --remove_file $MYSQLTEST_VARDIR/tmp/outfile-test.4
# #
# Bug #5382: 'explain select into outfile' crashes the server # Bug#5382 'explain select into outfile' crashes the server
# #
CREATE TABLE t1 (a INT); CREATE TABLE t1 (a INT);
EXPLAIN EXPLAIN
SELECT * SELECT *
INTO OUTFILE '/tmp/t1.txt' INTO OUTFILE '/tmp/t1.txt'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\r\n' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\r\n'
...@@ -68,7 +72,7 @@ DROP TABLE t1; ...@@ -68,7 +72,7 @@ DROP TABLE t1;
# End of 4.1 tests # End of 4.1 tests
# #
# Bug#13202 SELECT * INTO OUTFILE ... FROM information_schema.schemata now fails # Bug#13202 SELECT * INTO OUTFILE ... FROM information_schema.schemata now fails
# #
disable_query_log; disable_query_log;
eval SELECT * INTO OUTFILE "../tmp/outfile-test.4" eval SELECT * INTO OUTFILE "../tmp/outfile-test.4"
...@@ -114,6 +118,7 @@ from information_schema.schemata ...@@ -114,6 +118,7 @@ from information_schema.schemata
where schema_name like 'mysqltest'; where schema_name like 'mysqltest';
connection default; connection default;
disconnect con28181_1;
grant file on *.* to user_1@localhost; grant file on *.* to user_1@localhost;
connect (con28181_2,localhost,user_1,,mysqltest); connect (con28181_2,localhost,user_1,,mysqltest);
...@@ -125,9 +130,12 @@ from information_schema.schemata ...@@ -125,9 +130,12 @@ from information_schema.schemata
where schema_name like 'mysqltest'; where schema_name like 'mysqltest';
connection default; connection default;
disconnect con28181_2;
--remove_file $MYSQLTEST_VARDIR/tmp/outfile-test.4 --remove_file $MYSQLTEST_VARDIR/tmp/outfile-test.4
use test; use test;
revoke all privileges on *.* from user_1@localhost; revoke all privileges on *.* from user_1@localhost;
drop user user_1@localhost; drop user user_1@localhost;
drop database mysqltest; drop database mysqltest;
# Wait till we reached the initial number of concurrent sessions
--source include/wait_until_count_sessions.inc
...@@ -6,7 +6,7 @@ drop table if exists t1,t2; ...@@ -6,7 +6,7 @@ drop table if exists t1,t2;
--enable_warnings --enable_warnings
# #
# Bug #19263: variables.test doesn't clean up after itself (I/II -- save) # Bug#19263: variables.test doesn't clean up after itself (I/II -- save)
# #
set @my_binlog_cache_size =@@global.binlog_cache_size; set @my_binlog_cache_size =@@global.binlog_cache_size;
set @my_connect_timeout =@@global.connect_timeout; set @my_connect_timeout =@@global.connect_timeout;
...@@ -172,46 +172,46 @@ SELECT @@version_compile_os LIKE 'non-existent'; ...@@ -172,46 +172,46 @@ SELECT @@version_compile_os LIKE 'non-existent';
# The following should give errors # The following should give errors
--error 1231 --error ER_WRONG_VALUE_FOR_VAR
set big_tables=OFFF; set big_tables=OFFF;
--error 1231 --error ER_WRONG_VALUE_FOR_VAR
set big_tables="OFFF"; set big_tables="OFFF";
--error 1193 --error ER_UNKNOWN_SYSTEM_VARIABLE
set unknown_variable=1; set unknown_variable=1;
--error 1232 --error ER_WRONG_TYPE_FOR_VAR
set max_join_size="hello"; set max_join_size="hello";
--error 1286 --error ER_UNKNOWN_STORAGE_ENGINE
set storage_engine=UNKNOWN_TABLE_TYPE; set storage_engine=UNKNOWN_TABLE_TYPE;
--error 1231 --error ER_WRONG_VALUE_FOR_VAR
set storage_engine=MERGE, big_tables=2; set storage_engine=MERGE, big_tables=2;
show local variables like 'storage_engine'; show local variables like 'storage_engine';
--error 1229 --error ER_GLOBAL_VARIABLE
set SESSION query_cache_size=10000; set SESSION query_cache_size=10000;
--error 1230 --error ER_NO_DEFAULT
set GLOBAL storage_engine=DEFAULT; set GLOBAL storage_engine=DEFAULT;
--error 1115 --error ER_UNKNOWN_CHARACTER_SET
set character_set_client=UNKNOWN_CHARACTER_SET; set character_set_client=UNKNOWN_CHARACTER_SET;
--error 1273 --error ER_UNKNOWN_COLLATION
set collation_connection=UNKNOWN_COLLATION; set collation_connection=UNKNOWN_COLLATION;
--error 1231 --error ER_WRONG_VALUE_FOR_VAR
set character_set_client=NULL; set character_set_client=NULL;
--error 1231 --error ER_WRONG_VALUE_FOR_VAR
set collation_connection=NULL; set collation_connection=NULL;
--error 1228 --error ER_LOCAL_VARIABLE
set global autocommit=1; set global autocommit=1;
--error 1238 --error ER_INCORRECT_GLOBAL_LOCAL_VAR
select @@global.timestamp; select @@global.timestamp;
--error 1238 --error ER_INCORRECT_GLOBAL_LOCAL_VAR
set @@version=''; set @@version='';
--error 1229 --error ER_GLOBAL_VARIABLE
set @@concurrent_insert=1; set @@concurrent_insert=1;
--error 1228 --error ER_LOCAL_VARIABLE
set @@global.sql_auto_is_null=1; set @@global.sql_auto_is_null=1;
--error 1238 --error ER_INCORRECT_GLOBAL_LOCAL_VAR
select @@global.sql_auto_is_null; select @@global.sql_auto_is_null;
--error 1229 --error ER_GLOBAL_VARIABLE
set myisam_max_sort_file_size=100; set myisam_max_sort_file_size=100;
--error 1231 --error ER_WRONG_VALUE_FOR_VAR
set @@SQL_WARNINGS=NULL; set @@SQL_WARNINGS=NULL;
# Test setting all variables # Test setting all variables
...@@ -338,23 +338,23 @@ drop table t1,t2; ...@@ -338,23 +338,23 @@ drop table t1,t2;
# error conditions # error conditions
# #
--error 1193 --error ER_UNKNOWN_SYSTEM_VARIABLE
select @@xxxxxxxxxx; select @@xxxxxxxxxx;
select 1; select 1;
--error 1238 --error ER_INCORRECT_GLOBAL_LOCAL_VAR
select @@session.key_buffer_size; select @@session.key_buffer_size;
--error 1229 --error ER_GLOBAL_VARIABLE
set ft_boolean_syntax = @@init_connect; set ft_boolean_syntax = @@init_connect;
--error 1231 --error ER_WRONG_VALUE_FOR_VAR
set global ft_boolean_syntax = @@init_connect; set global ft_boolean_syntax = @@init_connect;
--error 1229 --error ER_GLOBAL_VARIABLE
set init_connect = NULL; set init_connect = NULL;
set global init_connect = NULL; set global init_connect = NULL;
--error 1229 --error ER_GLOBAL_VARIABLE
set ft_boolean_syntax = @@init_connect; set ft_boolean_syntax = @@init_connect;
--error 1231 --error ER_WRONG_VALUE_FOR_VAR
set global ft_boolean_syntax = @@init_connect; set global ft_boolean_syntax = @@init_connect;
# Bug#3754 SET GLOBAL myisam_max_sort_file_size doesn't work as # Bug#3754 SET GLOBAL myisam_max_sort_file_size doesn't work as
...@@ -385,15 +385,15 @@ select @a, @b; ...@@ -385,15 +385,15 @@ select @a, @b;
# #
# Bug#2586:Disallow global/session/local as structured var. instance names # Bug#2586:Disallow global/session/local as structured var. instance names
# #
--error 1064 --error ER_PARSE_ERROR
set @@global.global.key_buffer_size= 1; set @@global.global.key_buffer_size= 1;
--error 1064 --error ER_PARSE_ERROR
set GLOBAL global.key_buffer_size= 1; set GLOBAL global.key_buffer_size= 1;
--error 1064 --error ER_PARSE_ERROR
SELECT @@global.global.key_buffer_size; SELECT @@global.global.key_buffer_size;
--error 1064 --error ER_PARSE_ERROR
SELECT @@global.session.key_buffer_size; SELECT @@global.session.key_buffer_size;
--error 1064 --error ER_PARSE_ERROR
SELECT @@global.local.key_buffer_size; SELECT @@global.local.key_buffer_size;
# BUG#5135: cannot turn on log_warnings with SET in 4.1 (and 4.0) # BUG#5135: cannot turn on log_warnings with SET in 4.1 (and 4.0)
...@@ -478,27 +478,27 @@ select @@lc_time_names; ...@@ -478,27 +478,27 @@ select @@lc_time_names;
--echo *** LC_TIME_NAMES: testing with string expressions --echo *** LC_TIME_NAMES: testing with string expressions
set lc_time_names=concat('de','_','DE'); set lc_time_names=concat('de','_','DE');
select @@lc_time_names; select @@lc_time_names;
--error 1105 --error ER_UNKNOWN_ERROR
set lc_time_names=concat('de','+','DE'); set lc_time_names=concat('de','+','DE');
select @@lc_time_names; select @@lc_time_names;
--echo LC_TIME_NAMES: testing with numeric expressions --echo LC_TIME_NAMES: testing with numeric expressions
set @@lc_time_names=1+2; set @@lc_time_names=1+2;
select @@lc_time_names; select @@lc_time_names;
--error 1232 --error ER_WRONG_TYPE_FOR_VAR
set @@lc_time_names=1/0; set @@lc_time_names=1/0;
select @@lc_time_names; select @@lc_time_names;
set lc_time_names=en_US; set lc_time_names=en_US;
--echo LC_TIME_NAMES: testing NULL and a negative number: --echo LC_TIME_NAMES: testing NULL and a negative number:
--error 1231 --error ER_WRONG_VALUE_FOR_VAR
set lc_time_names=NULL; set lc_time_names=NULL;
--error 1105 --error ER_UNKNOWN_ERROR
set lc_time_names=-1; set lc_time_names=-1;
select @@lc_time_names; select @@lc_time_names;
--echo LC_TIME_NAMES: testing locale with the last ID: --echo LC_TIME_NAMES: testing locale with the last ID:
set lc_time_names=108; set lc_time_names=108;
select @@lc_time_names; select @@lc_time_names;
--echo LC_TIME_NAMES: testing a number beyond the valid ID range: --echo LC_TIME_NAMES: testing a number beyond the valid ID range:
--error 1105 --error ER_UNKNOWN_ERROR
set lc_time_names=109; set lc_time_names=109;
select @@lc_time_names; select @@lc_time_names;
--echo LC_TIME_NAMES: testing that 0 is en_US: --echo LC_TIME_NAMES: testing that 0 is en_US:
...@@ -540,7 +540,7 @@ select @@query_prealloc_size = @test; ...@@ -540,7 +540,7 @@ select @@query_prealloc_size = @test;
# Bug#31588 buffer overrun when setting variables # Bug#31588 buffer overrun when setting variables
# #
# Buffer-size Off By One. Should throw valgrind-warning without fix #31588. # Buffer-size Off By One. Should throw valgrind-warning without fix #31588.
--error 1231 --error ER_WRONG_VALUE_FOR_VAR
set global sql_mode=repeat('a',80); set global sql_mode=repeat('a',80);
--echo End of 4.1 tests --echo End of 4.1 tests
...@@ -558,9 +558,9 @@ drop table t1; ...@@ -558,9 +558,9 @@ drop table t1;
# Bug #10339: read only variables. # Bug #10339: read only variables.
# #
--error 1238 --error ER_INCORRECT_GLOBAL_LOCAL_VAR
set @@warning_count=1; set @@warning_count=1;
--error 1238 --error ER_INCORRECT_GLOBAL_LOCAL_VAR
set @@global.error_count=1; set @@global.error_count=1;
# #
...@@ -578,9 +578,9 @@ select @@max_heap_table_size > 0; ...@@ -578,9 +578,9 @@ select @@max_heap_table_size > 0;
# Bug #11775 Variable character_set_system does not exist (sometimes) # Bug #11775 Variable character_set_system does not exist (sometimes)
# #
select @@character_set_system; select @@character_set_system;
--error 1238 --error ER_INCORRECT_GLOBAL_LOCAL_VAR
set global character_set_system = latin1; set global character_set_system = latin1;
--error 1238 --error ER_INCORRECT_GLOBAL_LOCAL_VAR
set @@global.version_compile_os='234'; set @@global.version_compile_os='234';
# #
...@@ -677,7 +677,7 @@ select @@@; ...@@ -677,7 +677,7 @@ select @@@;
# Don't actually output, since it depends on the system # Don't actually output, since it depends on the system
--replace_column 1 # --replace_column 1 #
select @@hostname; select @@hostname;
--error 1238 --error ER_INCORRECT_GLOBAL_LOCAL_VAR
set @@hostname= "anothername"; set @@hostname= "anothername";
--replace_column 2 # --replace_column 2 #
show variables like 'hostname'; show variables like 'hostname';
...@@ -688,12 +688,12 @@ show variables like 'hostname'; ...@@ -688,12 +688,12 @@ show variables like 'hostname';
SHOW VARIABLES LIKE 'log'; SHOW VARIABLES LIKE 'log';
SELECT @@log; SELECT @@log;
--error 1238 --error ER_INCORRECT_GLOBAL_LOCAL_VAR
SET GLOBAL log=0; SET GLOBAL log=0;
SHOW VARIABLES LIKE 'log_slow_queries'; SHOW VARIABLES LIKE 'log_slow_queries';
SELECT @@log_slow_queries; SELECT @@log_slow_queries;
--error 1238 --error ER_INCORRECT_GLOBAL_LOCAL_VAR
SET GLOBAL log_slow_queries=0; SET GLOBAL log_slow_queries=0;
--echo End of 5.0 tests --echo End of 5.0 tests
......
...@@ -293,7 +293,12 @@ sub start_mysqlds() ...@@ -293,7 +293,12 @@ sub start_mysqlds()
@groups = &find_groups($groupids); @groups = &find_groups($groupids);
for ($i = 0; defined($groups[$i]); $i++) for ($i = 0; defined($groups[$i]); $i++)
{ {
# Defaults are made explicit parameters to server execution...
@options = defaults_for_group($groups[$i]); @options = defaults_for_group($groups[$i]);
# ...so server MUST NOT try to read again from some config file, especially
# as the "right" file may be unknown to the server if we are using
# --defaults-file=... params in here.
unshift(@options,"--no-defaults");
$mysqld_found= 1; # The default $mysqld_found= 1; # The default
$mysqld_found= 0 if (!length($mysqld)); $mysqld_found= 0 if (!length($mysqld));
......
...@@ -1243,13 +1243,26 @@ Item::Type Item_name_const::type() const ...@@ -1243,13 +1243,26 @@ Item::Type Item_name_const::type() const
valid_args guarantees value_item->basic_const_item(); if type is valid_args guarantees value_item->basic_const_item(); if type is
FUNC_ITEM, then we have a fudged item_func_neg() on our hands FUNC_ITEM, then we have a fudged item_func_neg() on our hands
and return the underlying type. and return the underlying type.
For Item_func_set_collation()
e.g. NAME_CONST('name', 'value' COLLATE collation) we return its
'value' argument type.
*/ */
return valid_args ? if (!valid_args)
(((value_item->type() == FUNC_ITEM) && return NULL_ITEM;
(((Item_func *) value_item)->functype() == Item_func::NEG_FUNC)) ? Item::Type value_type= value_item->type();
((Item_func *) value_item)->key_item()->type() : if (value_type == FUNC_ITEM)
value_item->type()) : {
NULL_ITEM; /*
The second argument of NAME_CONST('name', 'value') must be
a simple constant item or a NEG_FUNC/COLLATE_FUNC.
*/
DBUG_ASSERT(((Item_func *) value_item)->functype() ==
Item_func::NEG_FUNC ||
((Item_func *) value_item)->functype() ==
Item_func::COLLATE_FUNC);
return ((Item_func *) value_item)->key_item()->type();
}
return value_type;
} }
......
...@@ -78,7 +78,6 @@ static store_key *get_store_key(THD *thd, ...@@ -78,7 +78,6 @@ static store_key *get_store_key(THD *thd,
KEYUSE *keyuse, table_map used_tables, KEYUSE *keyuse, table_map used_tables,
KEY_PART_INFO *key_part, char *key_buff, KEY_PART_INFO *key_part, char *key_buff,
uint maybe_null); uint maybe_null);
static bool make_simple_join(JOIN *join,TABLE *tmp_table);
static void make_outerjoin_info(JOIN *join); static void make_outerjoin_info(JOIN *join);
static bool make_join_select(JOIN *join,SQL_SELECT *select,COND *item); static bool make_join_select(JOIN *join,SQL_SELECT *select,COND *item);
static void make_join_readinfo(JOIN *join, ulonglong options); static void make_join_readinfo(JOIN *join, ulonglong options);
...@@ -1809,7 +1808,7 @@ JOIN::exec() ...@@ -1809,7 +1808,7 @@ JOIN::exec()
/* Free first data from old join */ /* Free first data from old join */
curr_join->join_free(); curr_join->join_free();
if (make_simple_join(curr_join, curr_tmp_table)) if (curr_join->make_simple_join(this, curr_tmp_table))
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
calc_group_buffer(curr_join, group_list); calc_group_buffer(curr_join, group_list);
count_field_types(select_lex, &curr_join->tmp_table_param, count_field_types(select_lex, &curr_join->tmp_table_param,
...@@ -1929,7 +1928,7 @@ JOIN::exec() ...@@ -1929,7 +1928,7 @@ JOIN::exec()
curr_join->select_distinct=0; curr_join->select_distinct=0;
} }
curr_tmp_table->reginfo.lock_type= TL_UNLOCK; curr_tmp_table->reginfo.lock_type= TL_UNLOCK;
if (make_simple_join(curr_join, curr_tmp_table)) if (curr_join->make_simple_join(this, curr_tmp_table))
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
calc_group_buffer(curr_join, curr_join->group_list); calc_group_buffer(curr_join, curr_join->group_list);
count_field_types(select_lex, &curr_join->tmp_table_param, count_field_types(select_lex, &curr_join->tmp_table_param,
...@@ -5431,48 +5430,42 @@ store_val_in_field(Field *field, Item *item, enum_check_fields check_flag) ...@@ -5431,48 +5430,42 @@ store_val_in_field(Field *field, Item *item, enum_check_fields check_flag)
} }
static bool /**
make_simple_join(JOIN *join,TABLE *tmp_table) @details Initialize a JOIN as a query execution plan
that accesses a single table via a table scan.
@param parent contains JOIN_TAB and TABLE object buffers for this join
@param tmp_table temporary table
@retval FALSE success
@retval TRUE error occurred
*/
bool
JOIN::make_simple_join(JOIN *parent, TABLE *tmp_table)
{ {
TABLE **tableptr; DBUG_ENTER("JOIN::make_simple_join");
JOIN_TAB *join_tab;
DBUG_ENTER("make_simple_join");
/* /*
Reuse TABLE * and JOIN_TAB if already allocated by a previous call Reuse TABLE * and JOIN_TAB if already allocated by a previous call
to this function through JOIN::exec (may happen for sub-queries). to this function through JOIN::exec (may happen for sub-queries).
*/ */
if (!join->table_reexec) if (!parent->join_tab_reexec &&
{ !(parent->join_tab_reexec= (JOIN_TAB*) thd->alloc(sizeof(JOIN_TAB))))
if (!(join->table_reexec= (TABLE**) join->thd->alloc(sizeof(TABLE*)))) DBUG_RETURN(TRUE); /* purecov: inspected */
DBUG_RETURN(TRUE); /* purecov: inspected */
if (join->tmp_join) join_tab= parent->join_tab_reexec;
join->tmp_join->table_reexec= join->table_reexec; table= &parent->table_reexec[0]; parent->table_reexec[0]= tmp_table;
} tables= 1;
if (!join->join_tab_reexec) const_tables= 0;
{ const_table_map= 0;
if (!(join->join_tab_reexec= tmp_table_param.field_count= tmp_table_param.sum_func_count=
(JOIN_TAB*) join->thd->alloc(sizeof(JOIN_TAB)))) tmp_table_param.func_count= 0;
DBUG_RETURN(TRUE); /* purecov: inspected */ tmp_table_param.copy_field= tmp_table_param.copy_field_end=0;
if (join->tmp_join) first_record= sort_and_group=0;
join->tmp_join->join_tab_reexec= join->join_tab_reexec; send_records= (ha_rows) 0;
} group= 0;
tableptr= join->table_reexec; row_limit= unit->select_limit_cnt;
join_tab= join->join_tab_reexec; do_send_rows= row_limit ? 1 : 0;
join->join_tab=join_tab;
join->table=tableptr; tableptr[0]=tmp_table;
join->tables=1;
join->const_tables=0;
join->const_table_map=0;
join->tmp_table_param.field_count= join->tmp_table_param.sum_func_count=
join->tmp_table_param.func_count=0;
join->tmp_table_param.copy_field=join->tmp_table_param.copy_field_end=0;
join->first_record=join->sort_and_group=0;
join->send_records=(ha_rows) 0;
join->group=0;
join->row_limit=join->unit->select_limit_cnt;
join->do_send_rows = (join->row_limit) ? 1 : 0;
join_tab->cache.buff=0; /* No caching */ join_tab->cache.buff=0; /* No caching */
join_tab->table=tmp_table; join_tab->table=tmp_table;
...@@ -5489,7 +5482,7 @@ make_simple_join(JOIN *join,TABLE *tmp_table) ...@@ -5489,7 +5482,7 @@ make_simple_join(JOIN *join,TABLE *tmp_table)
join_tab->ref.key = -1; join_tab->ref.key = -1;
join_tab->not_used_in_distinct=0; join_tab->not_used_in_distinct=0;
join_tab->read_first_record= join_init_read_record; join_tab->read_first_record= join_init_read_record;
join_tab->join=join; join_tab->join= this;
join_tab->ref.key_parts= 0; join_tab->ref.key_parts= 0;
bzero((char*) &join_tab->read_record,sizeof(join_tab->read_record)); bzero((char*) &join_tab->read_record,sizeof(join_tab->read_record));
tmp_table->status=0; tmp_table->status=0;
......
...@@ -352,9 +352,12 @@ public: ...@@ -352,9 +352,12 @@ public:
cleared only at the end of the execution of the whole query and not caching cleared only at the end of the execution of the whole query and not caching
allocations that occur in repetition at execution time will result in allocations that occur in repetition at execution time will result in
excessive memory usage. excessive memory usage.
Note: make_simple_join always creates an execution plan that accesses
a single table, thus it is sufficient to have a one-element array for
table_reexec.
*/ */
SORT_FIELD *sortorder; // make_unireg_sortorder() SORT_FIELD *sortorder; // make_unireg_sortorder()
TABLE **table_reexec; // make_simple_join() TABLE *table_reexec[1]; // make_simple_join()
JOIN_TAB *join_tab_reexec; // make_simple_join() JOIN_TAB *join_tab_reexec; // make_simple_join()
/* end of allocation caching storage */ /* end of allocation caching storage */
...@@ -384,7 +387,7 @@ public: ...@@ -384,7 +387,7 @@ public:
exec_tmp_table1= 0; exec_tmp_table1= 0;
exec_tmp_table2= 0; exec_tmp_table2= 0;
sortorder= 0; sortorder= 0;
table_reexec= 0; table_reexec[0]= 0;
join_tab_reexec= 0; join_tab_reexec= 0;
thd= thd_arg; thd= thd_arg;
sum_funcs= sum_funcs2= 0; sum_funcs= sum_funcs2= 0;
...@@ -476,6 +479,8 @@ public: ...@@ -476,6 +479,8 @@ public:
return (unit == &thd->lex->unit && (unit->fake_select_lex == 0 || return (unit == &thd->lex->unit && (unit->fake_select_lex == 0 ||
select_lex == unit->fake_select_lex)); select_lex == unit->fake_select_lex));
} }
private:
bool make_simple_join(JOIN *join, TABLE *tmp_table);
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment