Merge branch '5.5' into 10.0

This commit is contained in:
Sergei Golubchik 2016-08-10 19:19:05 +02:00
commit 309c08c17c
64 changed files with 1247 additions and 276 deletions

View File

@ -240,7 +240,7 @@ static int process_selected_tables(char *db, char **table_names, int tables);
static int process_all_tables_in_db(char *database); static int process_all_tables_in_db(char *database);
static int process_one_db(char *database); static int process_one_db(char *database);
static int use_db(char *database); static int use_db(char *database);
static int handle_request_for_tables(char *tables, size_t length, my_bool view); static int handle_request_for_tables(char *, size_t, my_bool, my_bool);
static int dbConnect(char *host, char *user,char *passwd); static int dbConnect(char *host, char *user,char *passwd);
static void dbDisconnect(char *host); static void dbDisconnect(char *host);
static void DBerror(MYSQL *mysql, const char *when); static void DBerror(MYSQL *mysql, const char *when);
@ -577,7 +577,7 @@ static int process_selected_tables(char *db, char **table_names, int tables)
} }
*--end = 0; *--end = 0;
handle_request_for_tables(table_names_comma_sep + 1, tot_length - 1, handle_request_for_tables(table_names_comma_sep + 1, tot_length - 1,
opt_do_views != 0); opt_do_views != 0, opt_all_in_1);
my_free(table_names_comma_sep); my_free(table_names_comma_sep);
} }
else else
@ -588,7 +588,7 @@ static int process_selected_tables(char *db, char **table_names, int tables)
view= is_view(table); view= is_view(table);
if (view < 0) if (view < 0)
continue; continue;
handle_request_for_tables(table, table_len, (view == 1)); handle_request_for_tables(table, table_len, view == 1, opt_all_in_1);
} }
DBUG_RETURN(0); DBUG_RETURN(0);
} /* process_selected_tables */ } /* process_selected_tables */
@ -616,13 +616,9 @@ static char *fix_table_name(char *dest, char *src)
*dest++= '`'; *dest++= '`';
for (; *src; src++) for (; *src; src++)
{ {
switch (*src) { if (*src == '`')
case '`': /* escape backtick character */
*dest++= '`'; *dest++= '`';
/* fall through */ *dest++= *src;
default:
*dest++= *src;
}
} }
*dest++= '`'; *dest++= '`';
@ -711,9 +707,9 @@ static int process_all_tables_in_db(char *database)
*--end = 0; *--end = 0;
*--views_end = 0; *--views_end = 0;
if (tot_length) if (tot_length)
handle_request_for_tables(tables + 1, tot_length - 1, FALSE); handle_request_for_tables(tables + 1, tot_length - 1, FALSE, opt_all_in_1);
if (tot_views_length) if (tot_views_length)
handle_request_for_tables(views + 1, tot_views_length - 1, TRUE); handle_request_for_tables(views + 1, tot_views_length - 1, TRUE, opt_all_in_1);
my_free(tables); my_free(tables);
my_free(views); my_free(views);
} }
@ -739,7 +735,7 @@ static int process_all_tables_in_db(char *database)
!strcmp(row[0], "slow_log"))) !strcmp(row[0], "slow_log")))
continue; /* Skip logging tables */ continue; /* Skip logging tables */
handle_request_for_tables(row[0], fixed_name_length(row[0]), view); handle_request_for_tables(row[0], fixed_name_length(row[0]), view, opt_all_in_1);
} }
} }
mysql_free_result(res); mysql_free_result(res);
@ -800,13 +796,11 @@ static int rebuild_table(char *name)
int rc= 0; int rc= 0;
DBUG_ENTER("rebuild_table"); DBUG_ENTER("rebuild_table");
query= (char*)my_malloc(sizeof(char) * (12 + fixed_name_length(name) + 6 + 1), query= (char*)my_malloc(sizeof(char) * (12 + strlen(name) + 6 + 1),
MYF(MY_WME)); MYF(MY_WME));
if (!query) if (!query)
DBUG_RETURN(1); DBUG_RETURN(1);
ptr= strmov(query, "ALTER TABLE "); ptr= strxmov(query, "ALTER TABLE ", name, " FORCE", NullS);
ptr= fix_table_name(ptr, name);
ptr= strxmov(ptr, " FORCE", NullS);
if (verbose >= 3) if (verbose >= 3)
puts(query); puts(query);
if (mysql_real_query(sock, query, (ulong)(ptr - query))) if (mysql_real_query(sock, query, (ulong)(ptr - query)))
@ -869,7 +863,8 @@ static int disable_binlog()
return run_query(stmt, 0); return run_query(stmt, 0);
} }
static int handle_request_for_tables(char *tables, size_t length, my_bool view) static int handle_request_for_tables(char *tables, size_t length,
my_bool view, my_bool dont_quote)
{ {
char *query, *end, options[100], message[100]; char *query, *end, options[100], message[100];
char table_name_buff[NAME_CHAR_LEN*2*2+1], *table_name; char table_name_buff[NAME_CHAR_LEN*2*2+1], *table_name;
@ -928,7 +923,7 @@ static int handle_request_for_tables(char *tables, size_t length, my_bool view)
if (!(query =(char *) my_malloc(query_size, MYF(MY_WME)))) if (!(query =(char *) my_malloc(query_size, MYF(MY_WME))))
DBUG_RETURN(1); DBUG_RETURN(1);
if (opt_all_in_1) if (dont_quote)
{ {
DBUG_ASSERT(strlen(op)+strlen(tables)+strlen(options)+8+1 <= query_size); DBUG_ASSERT(strlen(op)+strlen(tables)+strlen(options)+8+1 <= query_size);
@ -973,6 +968,13 @@ static int handle_request_for_tables(char *tables, size_t length, my_bool view)
DBUG_RETURN(0); DBUG_RETURN(0);
} }
static void insert_table_name(DYNAMIC_ARRAY *arr, char *in, size_t dblen)
{
char buf[NAME_LEN*2+2];
in[dblen]= 0;
my_snprintf(buf, sizeof(buf), "%`s.%`s", in, in + dblen + 1);
insert_dynamic(arr, (uchar*) buf);
}
static void print_result() static void print_result()
{ {
@ -980,16 +982,13 @@ static void print_result()
MYSQL_ROW row; MYSQL_ROW row;
char prev[(NAME_LEN+9)*3+2]; char prev[(NAME_LEN+9)*3+2];
char prev_alter[MAX_ALTER_STR_SIZE]; char prev_alter[MAX_ALTER_STR_SIZE];
char *db_name; size_t length_of_db= strlen(sock->db);
uint length_of_db;
uint i; uint i;
my_bool found_error=0, table_rebuild=0; my_bool found_error=0, table_rebuild=0;
DYNAMIC_ARRAY *array4repair= &tables4repair; DYNAMIC_ARRAY *array4repair= &tables4repair;
DBUG_ENTER("print_result"); DBUG_ENTER("print_result");
res = mysql_use_result(sock); res = mysql_use_result(sock);
db_name= sock->db;
length_of_db= strlen(db_name);
prev[0] = '\0'; prev[0] = '\0';
prev_alter[0]= 0; prev_alter[0]= 0;
@ -1013,16 +1012,10 @@ static void print_result()
if (prev_alter[0]) if (prev_alter[0])
insert_dynamic(&alter_table_cmds, (uchar*) prev_alter); insert_dynamic(&alter_table_cmds, (uchar*) prev_alter);
else else
{ insert_table_name(&tables4rebuild, prev, length_of_db);
char *table_name= prev + (length_of_db+1);
insert_dynamic(&tables4rebuild, (uchar*) table_name);
}
} }
else else
{ insert_table_name(array4repair, prev, length_of_db);
char *table_name= prev + (length_of_db+1);
insert_dynamic(array4repair, table_name);
}
} }
array4repair= &tables4repair; array4repair= &tables4repair;
found_error=0; found_error=0;
@ -1067,16 +1060,10 @@ static void print_result()
if (prev_alter[0]) if (prev_alter[0])
insert_dynamic(&alter_table_cmds, prev_alter); insert_dynamic(&alter_table_cmds, prev_alter);
else else
{ insert_table_name(&tables4rebuild, prev, length_of_db);
char *table_name= prev + (length_of_db+1);
insert_dynamic(&tables4rebuild, table_name);
}
} }
else else
{ insert_table_name(array4repair, prev, length_of_db);
char *table_name= prev + (length_of_db+1);
insert_dynamic(array4repair, table_name);
}
} }
mysql_free_result(res); mysql_free_result(res);
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
@ -1221,7 +1208,7 @@ int main(int argc, char **argv)
for (i = 0; i < tables4repair.elements ; i++) for (i = 0; i < tables4repair.elements ; i++)
{ {
char *name= (char*) dynamic_array_ptr(&tables4repair, i); char *name= (char*) dynamic_array_ptr(&tables4repair, i);
handle_request_for_tables(name, fixed_name_length(name), FALSE); handle_request_for_tables(name, fixed_name_length(name), FALSE, TRUE);
} }
for (i = 0; i < tables4rebuild.elements ; i++) for (i = 0; i < tables4rebuild.elements ; i++)
rebuild_table((char*) dynamic_array_ptr(&tables4rebuild, i)); rebuild_table((char*) dynamic_array_ptr(&tables4rebuild, i));
@ -1232,7 +1219,7 @@ int main(int argc, char **argv)
for (i = 0; i < views4repair.elements ; i++) for (i = 0; i < views4repair.elements ; i++)
{ {
char *name= (char*) dynamic_array_ptr(&views4repair, i); char *name= (char*) dynamic_array_ptr(&views4repair, i);
handle_request_for_tables(name, fixed_name_length(name), TRUE); handle_request_for_tables(name, fixed_name_length(name), TRUE, TRUE);
} }
} }
ret= MY_TEST(first_error); ret= MY_TEST(first_error);

View File

@ -37,6 +37,7 @@
/* Global Thread counter */ /* Global Thread counter */
uint counter= 0; uint counter= 0;
pthread_mutex_t init_mutex;
pthread_mutex_t counter_mutex; pthread_mutex_t counter_mutex;
pthread_cond_t count_threshhold; pthread_cond_t count_threshhold;
@ -421,8 +422,19 @@ static MYSQL *db_connect(char *host, char *database,
MYSQL *mysql; MYSQL *mysql;
if (verbose) if (verbose)
fprintf(stdout, "Connecting to %s\n", host ? host : "localhost"); fprintf(stdout, "Connecting to %s\n", host ? host : "localhost");
if (!(mysql= mysql_init(NULL))) if (opt_use_threads && !lock_tables)
return 0; {
pthread_mutex_lock(&init_mutex);
if (!(mysql= mysql_init(NULL)))
{
pthread_mutex_unlock(&init_mutex);
return 0;
}
pthread_mutex_unlock(&init_mutex);
}
else
if (!(mysql= mysql_init(NULL)))
return 0;
if (opt_compress) if (opt_compress)
mysql_options(mysql,MYSQL_OPT_COMPRESS,NullS); mysql_options(mysql,MYSQL_OPT_COMPRESS,NullS);
if (opt_local_file) if (opt_local_file)
@ -614,7 +626,7 @@ error:
pthread_cond_signal(&count_threshhold); pthread_cond_signal(&count_threshhold);
pthread_mutex_unlock(&counter_mutex); pthread_mutex_unlock(&counter_mutex);
mysql_thread_end(); mysql_thread_end();
pthread_exit(0);
return 0; return 0;
} }
@ -638,15 +650,31 @@ int main(int argc, char **argv)
if (opt_use_threads && !lock_tables) if (opt_use_threads && !lock_tables)
{ {
pthread_t mainthread; /* Thread descriptor */ char **save_argv;
pthread_attr_t attr; /* Thread attributes */ uint worker_thread_count= 0, table_count= 0, i= 0;
pthread_t *worker_threads; /* Thread descriptor */
pthread_attr_t attr; /* Thread attributes */
pthread_attr_init(&attr); pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, pthread_attr_setdetachstate(&attr,
PTHREAD_CREATE_DETACHED); PTHREAD_CREATE_JOINABLE);
pthread_mutex_init(&init_mutex, NULL);
pthread_mutex_init(&counter_mutex, NULL); pthread_mutex_init(&counter_mutex, NULL);
pthread_cond_init(&count_threshhold, NULL); pthread_cond_init(&count_threshhold, NULL);
/* Count the number of tables. This number denotes the total number
of threads spawn.
*/
save_argv= argv;
for (table_count= 0; *argv != NULL; argv++)
table_count++;
argv= save_argv;
if (!(worker_threads= (pthread_t*) my_malloc(table_count *
sizeof(*worker_threads),
MYF(0))))
return -2;
for (counter= 0; *argv != NULL; argv++) /* Loop through tables */ for (counter= 0; *argv != NULL; argv++) /* Loop through tables */
{ {
pthread_mutex_lock(&counter_mutex); pthread_mutex_lock(&counter_mutex);
@ -661,15 +689,16 @@ int main(int argc, char **argv)
counter++; counter++;
pthread_mutex_unlock(&counter_mutex); pthread_mutex_unlock(&counter_mutex);
/* now create the thread */ /* now create the thread */
if (pthread_create(&mainthread, &attr, worker_thread, if (pthread_create(&worker_threads[worker_thread_count], &attr,
(void *)*argv) != 0) worker_thread, (void *)*argv) != 0)
{ {
pthread_mutex_lock(&counter_mutex); pthread_mutex_lock(&counter_mutex);
counter--; counter--;
pthread_mutex_unlock(&counter_mutex); pthread_mutex_unlock(&counter_mutex);
fprintf(stderr,"%s: Could not create thread\n", fprintf(stderr,"%s: Could not create thread\n", my_progname);
my_progname); continue;
} }
worker_thread_count++;
} }
/* /*
@ -684,9 +713,18 @@ int main(int argc, char **argv)
pthread_cond_timedwait(&count_threshhold, &counter_mutex, &abstime); pthread_cond_timedwait(&count_threshhold, &counter_mutex, &abstime);
} }
pthread_mutex_unlock(&counter_mutex); pthread_mutex_unlock(&counter_mutex);
pthread_mutex_destroy(&init_mutex);
pthread_mutex_destroy(&counter_mutex); pthread_mutex_destroy(&counter_mutex);
pthread_cond_destroy(&count_threshhold); pthread_cond_destroy(&count_threshhold);
pthread_attr_destroy(&attr); pthread_attr_destroy(&attr);
for(i= 0; i < worker_thread_count; i++)
{
if (pthread_join(worker_threads[i], NULL))
fprintf(stderr,"%s: Could not join worker thread.\n", my_progname);
}
my_free(worker_threads);
} }
else else
{ {

View File

@ -1,12 +0,0 @@
#
# show server variables
#
--disable_query_log
--echo ===== ENGINES =====
show engines;
--echo ===== VARIABLES =====
show variables;
--echo ===== STOP =====
--enable_query_log
exit;

View File

@ -279,7 +279,6 @@ my $opt_port_base= $ENV{'MTR_PORT_BASE'} || "auto";
my $build_thread= 0; my $build_thread= 0;
my $opt_record; my $opt_record;
my $opt_report_features;
our $opt_resfile= $ENV{'MTR_RESULT_FILE'} || 0; our $opt_resfile= $ENV{'MTR_RESULT_FILE'} || 0;
@ -434,21 +433,6 @@ sub main {
exit 0; exit 0;
} }
if ( $opt_report_features ) {
# Put "report features" as the first test to run
my $tinfo = My::Test->new
(
name => 'report_features',
# No result_file => Prints result
path => 'include/report-features.test',
template_path => "include/default_my.cnf",
master_opt => [],
slave_opt => [],
suite => 'main',
);
unshift(@$tests, $tinfo);
}
####################################################################### #######################################################################
my $num_tests= @$tests; my $num_tests= @$tests;
if ( $opt_parallel eq "auto" ) { if ( $opt_parallel eq "auto" ) {
@ -1214,7 +1198,6 @@ sub command_line_setup {
'client-libdir=s' => \$path_client_libdir, 'client-libdir=s' => \$path_client_libdir,
# Misc # Misc
'report-features' => \$opt_report_features,
'comment=s' => \$opt_comment, 'comment=s' => \$opt_comment,
'fast' => \$opt_fast, 'fast' => \$opt_fast,
'force-restart' => \$opt_force_restart, 'force-restart' => \$opt_force_restart,
@ -6634,7 +6617,6 @@ Misc options
gprof Collect profiling information using gprof. gprof Collect profiling information using gprof.
experimental=<file> Refer to list of tests considered experimental; experimental=<file> Refer to list of tests considered experimental;
failures will be marked exp-fail instead of fail. failures will be marked exp-fail instead of fail.
report-features First run a "test" that reports mysql features
timestamp Print timestamp before each test report line timestamp Print timestamp before each test report line
timediff With --timestamp, also print time passed since timediff With --timestamp, also print time passed since
*previous* test started *previous* test started

View File

@ -2270,3 +2270,42 @@ t2_id GROUP_CONCAT(IF (t6.b, t6.f, t5.f) ORDER BY 1)
EXECUTE stmt; EXECUTE stmt;
t2_id GROUP_CONCAT(IF (t6.b, t6.f, t5.f) ORDER BY 1) t2_id GROUP_CONCAT(IF (t6.b, t6.f, t5.f) ORDER BY 1)
DROP TABLE t1,t2,t3,t4,t5,t6; DROP TABLE t1,t2,t3,t4,t5,t6;
#
# MDEV-10500 CASE/IF Statement returns multiple values and shifts further result values to the next column
#
CREATE TABLE t1 (
id int not null AUTO_INCREMENT,
active bool not null,
data1 bigint,
data2 bigint,
data3 bigint,
primary key (id)
);
INSERT INTO t1 (active,data1,data2,data3) VALUES (1,null,100,200);
SELECT
CASE WHEN active THEN SUM(data1) END AS C_1,
SUM(data2) AS C_2,
SUM(data3) AS C_3
FROM t1;
C_1 C_2 C_3
NULL 100 200
SELECT
IF(active, SUM(data1), 5) AS C_1,
SUM(data2) AS C_2,
SUM(data3) AS C_3
FROM t1;
C_1 C_2 C_3
NULL 100 200
DROP TABLE t1;
#
# MDEV-10468 Assertion `nr >= 0.0' failed in Item_sum_std::val_real()
#
SELECT STDDEV_POP(f) FROM (SELECT "1e+309" AS f UNION SELECT "-1e+309" AS f) tbl;
STDDEV_POP(f)
1.7976931348623157e308
Warnings:
Warning 1292 Truncated incorrect DOUBLE value: '1e+309'
Warning 1292 Truncated incorrect DOUBLE value: '-1e+309'
SELECT STDDEV(f) FROM (SELECT 1.7976931348623157e+308 AS f UNION SELECT -1.7976931348623157e+308 AS f) tbl;
STDDEV(f)
1.7976931348623157e308

View File

@ -777,12 +777,18 @@ select 5.9 div 2, 1.23456789e3 DIV 2, 1.23456789e9 DIV 2, 1.23456789e19 DIV 2;
5.9 div 2 1.23456789e3 DIV 2 1.23456789e9 DIV 2 1.23456789e19 DIV 2 5.9 div 2 1.23456789e3 DIV 2 1.23456789e9 DIV 2 1.23456789e19 DIV 2
2 617 617283945 6172839450000000000 2 617 617283945 6172839450000000000
# #
# MDEV-10467 Assertion `nr >= 0.0' failed in Item_sum_std::val_real()
#
CREATE TABLE t1 (i INT);
INSERT INTO t1 VALUES (1),(2);
SELECT STDDEV_SAMP(ROUND('0', 309)) FROM t1;
STDDEV_SAMP(ROUND('0', 309))
0
DROP TABLE t1;
#
# End of 5.5 tests # End of 5.5 tests
# #
# #
# Start of 10.0 tests
#
#
# MDEV-5781 Item_sum_std::val_real(): Assertion `nr >= 0.0' fails on query with STDDEV_POP, ROUND and variable # MDEV-5781 Item_sum_std::val_real(): Assertion `nr >= 0.0' fails on query with STDDEV_POP, ROUND and variable
# #
SELECT STDDEV_POP(ROUND(0,@A:=2009)) FROM (SELECT 1 UNION SELECT 2) fake_table; SELECT STDDEV_POP(ROUND(0,@A:=2009)) FROM (SELECT 1 UNION SELECT 2) fake_table;

View File

@ -571,6 +571,13 @@ AND 57813X540X1723 = 'Test';
N AVG N AVG
0 NULL 0 NULL
drop table t1; drop table t1;
SELECT NAME_CONST('a', -(1 OR 2)) OR 1;
ERROR HY000: Incorrect arguments to NAME_CONST
SELECT NAME_CONST('a', -(1 AND 2)) OR 1;
ERROR HY000: Incorrect arguments to NAME_CONST
SELECT NAME_CONST('a', -(1)) OR 1;
NAME_CONST('a', -(1)) OR 1
1
# #
# End of 5.5 tests # End of 5.5 tests
# #

View File

@ -507,7 +507,7 @@ DROP TABLE t1;
# Bug#11765139 58069: LOAD DATA INFILE: VALGRIND REPORTS INVALID MEMORY READS AND WRITES WITH U # Bug#11765139 58069: LOAD DATA INFILE: VALGRIND REPORTS INVALID MEMORY READS AND WRITES WITH U
# #
CREATE TABLE t1(f1 INT); CREATE TABLE t1(f1 INT);
SELECT 0xE1BB30 INTO OUTFILE 't1.dat'; SELECT 0xE1C330 INTO OUTFILE 't1.dat';
LOAD DATA INFILE 't1.dat' IGNORE INTO TABLE t1 CHARACTER SET utf8; LOAD DATA INFILE 't1.dat' IGNORE INTO TABLE t1 CHARACTER SET utf8;
DROP TABLE t1; DROP TABLE t1;
# #
@ -532,3 +532,27 @@ FIELDS TERMINATED BY 't' LINES TERMINATED BY '';
Got one of the listed errors Got one of the listed errors
SET @@sql_mode= @old_mode; SET @@sql_mode= @old_mode;
DROP TABLE t1; DROP TABLE t1;
#
# Bug#23080148 - Backport of Bug#20683959.
# Bug#20683959 LOAD DATA INFILE IGNORES A SPECIFIC ROW SILENTLY
# UNDER DB CHARSET IS UTF8.
#
CREATE DATABASE d1 CHARSET latin1;
USE d1;
CREATE TABLE t1 (val TEXT);
LOAD DATA INFILE '../../std_data/bug20683959loaddata.txt' INTO TABLE t1;
SELECT COUNT(*) FROM t1;
COUNT(*)
1
SELECT HEX(val) FROM t1;
HEX(val)
C38322525420406E696F757A656368756E3A20E98198E2889AF58081AEE7B99DE4B88AE383A3E7B99DE69690F58087B3E7B9A7EFBDA8E7B99DEFBDB3E7B99DE78999E880B3E7B8BAEFBDAAE7B9A7E89699E296A1E7B8BAE4BBA3EFBD8CE7B8BAEFBDA9E7B8B2E2889AE38184E7B99DEFBDB3E7B99DE4B88AE383A3E7B99DE69690F58087B3E7B9A7EFBDA8E7B99DEFBDB3E7B99DE5B3A8EFBD84E8ABA0EFBDA8E89C89F580948EE599AAE7B8BAEFBDAAE7B8BAE9A198EFBDA9EFBDB1E7B9A7E581B5E289A0E7B8BAEFBDBEE7B9A7E9A194EFBDA9E882B4EFBDA5EFBDB5E980A7F5808B96E28693E99EABE38287E58F99E7B8BAE58AB1E28691E7B8BAF5808B9AE7828AE98095EFBDB1E7B8BAEFBDAFE7B8B2E288ABE6A89FE89EB3E6BA98F58081ADE88EA0EFBDBAE98095E6BA98F58081AEE89D93EFBDBAE8AD9BEFBDACE980A7F5808B96E28693E7B8BAF580918EE288AAE7B8BAE4B88AEFBC9EE7B8BAE4B99DE28691E7B8BAF5808B96EFBCA0E88DB3E6A68AEFBDB9EFBDB3E981B2E5B3A8E296A1E7B8BAE7A4BCE7828AE88DB3E6A68AEFBDB0EFBDBDE7B8BAA0E7B8BAE88B93EFBDBEE5B899EFBC9E
CREATE DATABASE d2 CHARSET utf8;
USE d2;
CREATE TABLE t1 (val TEXT);
LOAD DATA INFILE '../../std_data/bug20683959loaddata.txt' INTO TABLE t1;
ERROR HY000: Invalid utf8 character string: 'Ã"RT @niouzechun: \9058\221A'
DROP TABLE d1.t1, d2.t1;
DROP DATABASE d1;
DROP DATABASE d2;

View File

@ -0,0 +1,114 @@
CREATE TABLE t1 (
pk INT AUTO_INCREMENT,
i INT,
d DATE,
dt DATETIME,
v VARCHAR(1),
PRIMARY KEY (pk),
KEY (dt)
) ENGINE=MyISAM;
INSERT INTO t1 (i, d, dt, v) VALUES
(9, '2005-07-23', '2004-05-13 01:01:39', 't'),
(2, '2009-11-01', '2003-12-24 07:39:29', 'h'),
(6, NULL, '2008-07-03 05:32:22', 'l'),
(6, '2007-07-16', '2008-08-28 18:46:11', 'j'),
(5, NULL, '2001-07-12 21:27:00', 'h'),
(3, '2007-07-22', '1900-01-01 00:00:00', 'p'),
(2, '2000-11-21', '2007-05-25 11:58:54', 'g'),
(6, '1900-01-01', '2009-06-03 17:11:10', 'i'),
(2, '2008-02-10', '2001-06-15 16:20:07', 'p'),
(3, '2009-06-04', '1900-01-01 00:00:00', 'h'),
(9, '2007-04-25', '1900-01-01 00:00:00', 'e'),
(9, '2006-03-02', '1900-01-01 00:00:00', 'e'),
(1, '1900-01-01', '2002-11-08 09:33:27', 'u'),
(7, '2008-07-13', '2007-08-07 17:35:52', 'j'),
(0, '2004-11-12', '2006-05-01 00:00:00', 'e'),
(0, '1900-01-01', '2003-05-01 00:00:00', 'z'),
(1, '2009-09-02', '2007-02-12 09:30:49', 'w'),
(0, '2004-11-06', '1900-01-01 00:00:00', 't'),
(4, '2003-01-06', '2002-07-03 02:51:11', 'i'),
(6, '2006-01-14', '2008-02-26 04:57:32', 'i'),
(0, '2002-01-19', '2009-02-12 00:00:00', 'i'),
(8, '2007-02-12', '1900-01-01 00:00:00', 'b'),
(4, '1900-01-01', '2001-05-16 05:28:40', 'm'),
(2, '2005-07-16', NULL, 'j'),
(1, '2004-09-04', '2001-01-24 21:45:18', 'v'),
(3, '2009-07-01', NULL, NULL),
(2, '2009-07-21', '2002-07-24 00:00:00', 'h'),
(4, NULL, '2001-11-03 12:22:30', 'q'),
(1, '2002-06-22', '2008-06-17 03:17:59', 'f'),
(7, '2005-06-23', '2005-12-24 00:00:00', 'p'),
(6, '2001-05-20', '2008-10-23 00:00:00', NULL),
(3, '2001-10-01', '2000-10-12 16:32:35', 'o'),
(3, '2001-01-07', '2005-09-11 10:09:54', 'w'),
(6, '2007-11-02', '2009-09-10 01:44:18', 'l'),
(6, NULL, NULL, 'i'),
(9, NULL, '2002-05-18 15:21:55', 'd'),
(4, '2008-12-21', '2004-10-15 10:09:54', 'j'),
(6, '2003-10-05', '2009-07-13 03:51:02', 'e'),
(2, '2001-03-03', '1900-01-01 00:00:00', 'e'),
(2, '2007-04-04', '2001-11-08 21:14:52', 'q'),
(5, NULL, '2006-12-02 00:00:00', 'm'),
(0, '2009-01-04', '1900-01-01 00:00:00', NULL),
(8, '2008-04-03', '2005-01-01 11:55:18', 'q'),
(8, NULL, '2005-02-28 03:44:02', 'w'),
(0, '2003-08-22', NULL, 'c'),
(9, '1900-01-01', NULL, 'y'),
(NULL, NULL, '2006-08-25 16:28:09', 'g'),
(5, '2004-07-04', '2002-08-11 00:00:00', 'z'),
(1, '1900-01-01', '2007-07-22 21:19:18', 'm'),
(2, '2007-02-04', '2006-02-10 18:41:38', 't'),
(2, '1900-01-01', '2009-02-16 14:58:58', 'd'),
(7, '2001-03-14', '2007-08-14 00:00:00', 'h'),
(0, NULL, '1900-01-01 00:00:00', NULL),
(1, '2008-10-05', NULL, 'f'),
(6, '2001-11-25', '2008-12-03 06:59:23', 'l'),
(NULL, '2003-01-27', '2008-10-04 00:00:00', 'g'),
(8, '2008-08-08', '2009-07-07 07:00:21', 'v'),
(8, '2006-07-03', '2001-04-15 00:00:00', NULL),
(5, '2002-11-21', '2007-07-08 04:01:58', 'm'),
(5, '2006-04-08', '2007-09-23 00:01:35', 'i'),
(5, '2001-05-06', '2008-05-15 00:00:00', 'h'),
(7, '1900-01-01', '1900-01-01 00:00:00', 'u'),
(30, '2007-04-16', '2004-03-05 23:35:38', 'o'),
(NULL, '1900-01-01', '2007-08-25 01:32:47', 'z'),
(6, '2004-12-03', '1900-01-01 00:00:00', 'o'),
(8, '2001-06-23', '1900-01-01 00:00:00', 'f'),
(NULL, '2008-12-15', '2001-05-19 08:28:28', 'a'),
(9, '2000-02-15', '2009-09-03 06:07:22', 'd'),
(2, '2001-08-05', '2006-10-08 07:17:27', 'k'),
(5, '2004-01-17', '2003-09-06 20:36:01', 'd'),
(4, '2003-10-01', '2001-02-05 18:10:49', 'u'),
(4, '2003-07-28', '2001-01-07 16:11:37', 'h'),
(0, '1900-01-01', '2008-08-01 05:26:38', 'w'),
(9, '1900-01-01', '2001-05-08 00:00:00', 't'),
(1, '2000-04-17', '2008-07-10 21:26:28', 'i'),
(8, '2002-01-05', '2006-08-06 20:56:35', 'k'),
(9, '2001-04-10', '2003-02-17 00:00:00', 'z'),
(0, '2009-12-04', NULL, 'h'),
(7, NULL, '2004-10-27 00:29:57', 'h'),
(2, '2006-03-07', '2008-03-04 06:14:13', 'b'),
(0, '2001-10-15', '2001-03-17 00:00:00', 'm'),
(5, '1900-01-01', '2009-02-21 11:35:50', 'i'),
(4, NULL, '1900-01-01 00:00:00', 'w'),
(5, '2009-04-05', '1900-01-01 00:00:00', 'm'),
(6, '2001-03-19', '2001-04-12 00:00:00', 'q'),
(NULL, '2009-12-08', '2001-12-04 20:21:01', 'k'),
(2, '2005-02-09', '2001-05-27 08:41:01', 'l'),
(9, '2004-05-25', '2004-09-18 00:00:00', 'c'),
(3, '2005-01-17', '2002-09-12 11:18:48', 'd'),
(0, '2003-08-28', '1900-01-01 00:00:00', 'k'),
(6, '2006-10-11', '2003-10-28 03:31:02', 'a'),
(5, '1900-01-01', '2001-08-22 10:20:09', 'p'),
(8, '1900-01-01', '2008-04-24 00:00:00', 'o'),
(4, '2005-08-18', '2006-11-10 10:08:49', 'e'),
(NULL, '2007-03-12', '2007-10-16 00:00:00', 'n'),
(1, '2000-11-18', '2009-05-27 12:25:07', 't'),
(4, '2001-03-03', NULL, 'u'),
(3, '2003-09-11', '2001-09-10 18:10:10', 'f'),
(4, '2007-06-17', '1900-01-01 00:00:00', 't'),
(NULL, '2008-09-11', '2004-06-07 23:17:09', 'k');
ALTER TABLE t1 ADD UNIQUE KEY ind1 (pk, d, i, v);
ALTER TABLE t1 ADD UNIQUE KEY ind2 (d, v);
ERROR 23000: Duplicate entry '2008-09-11-k' for key 'ind2'
DROP TABLE t1;

View File

@ -343,10 +343,37 @@ DROP TABLE bug47205;
# #
#MDEV-6128:[PATCH] mysqlcheck wrongly escapes '.' in table names #MDEV-6128:[PATCH] mysqlcheck wrongly escapes '.' in table names
# #
CREATE TABLE test.`t.1` (id int); create table `t.1` (id int);
create view `v.1` as select 1;
mysqlcheck test t.1 mysqlcheck test t.1
test.t.1 OK test.t.1 OK
drop table test.`t.1`; mysqlcheck --all-in-1 test t.1
test.t.1 OK
mysqlcheck --all-in-1 --databases --process-views test
test.t.1 OK
test.v.1 OK
create table `t.2`(a varchar(20) primary key) default character set utf8 collate utf8_general_ci engine=innodb;
flush table `t.2`;
mysqlcheck --check-upgrade --auto-repair test
test.t.1 OK
test.t.2
error : Table rebuild required. Please do "ALTER TABLE `t.2` FORCE" or dump/reload to fix it!
test.t.3 Needs upgrade
Repairing tables
test.t.3 OK
check table `t.1`, `t.2`, `t.3`;
Table Op Msg_type Msg_text
test.t.1 check status OK
test.t.2 check status OK
test.t.3 check status OK
check table `t.1`, `t.2`, `t.3` for upgrade;
Table Op Msg_type Msg_text
test.t.1 check status OK
test.t.2 check status OK
test.t.3 check status OK
drop view `v.1`;
drop table test.`t.1`, `t.2`, `t.3`;
# #
# MDEV-8123 mysqlcheck: new --process-views option conflicts with --quick, --extended and such # MDEV-8123 mysqlcheck: new --process-views option conflicts with --quick, --extended and such
# #
@ -381,6 +408,57 @@ show tables;
Tables_in_test Tables_in_test
t1`1 t1`1
drop table `t1``1`; drop table `t1``1`;
call mtr.add_suppression("ha_myisam");
call mtr.add_suppression("Checking table");
create database mysqltest1;
create table mysqltest1.t1 (a int) engine=myisam;
create table t2 (a int);
check table mysqltest1.t1;
Table Op Msg_type Msg_text
mysqltest1.t1 check warning Size of datafile is: 4 Should be: 0
mysqltest1.t1 check error got error: 0 when reading datafile at record: 0
mysqltest1.t1 check error Corrupt
mtr.global_suppressions Table is already up to date
mtr.test_suppressions Table is already up to date
mysql.column_stats Table is already up to date
mysql.columns_priv Table is already up to date
mysql.db Table is already up to date
mysql.event Table is already up to date
mysql.func Table is already up to date
mysql.gtid_slave_pos Table is already up to date
mysql.help_category Table is already up to date
mysql.help_keyword Table is already up to date
mysql.help_relation Table is already up to date
mysql.help_topic Table is already up to date
mysql.host Table is already up to date
mysql.index_stats Table is already up to date
mysql.innodb_index_stats OK
mysql.innodb_table_stats OK
mysql.plugin Table is already up to date
mysql.proc Table is already up to date
mysql.procs_priv Table is already up to date
mysql.proxies_priv Table is already up to date
mysql.roles_mapping Table is already up to date
mysql.servers Table is already up to date
mysql.table_stats Table is already up to date
mysql.tables_priv Table is already up to date
mysql.time_zone Table is already up to date
mysql.time_zone_leap_second Table is already up to date
mysql.time_zone_name Table is already up to date
mysql.time_zone_transition Table is already up to date
mysql.time_zone_transition_type Table is already up to date
mysql.user Table is already up to date
mysqltest1.t1
warning : Table is marked as crashed
warning : Size of datafile is: 4 Should be: 0
error : got error: 0 when reading datafile at record: 0
error : Corrupt
test.t2 Table is already up to date
Repairing tables
mysqltest1.t1 OK
drop table t2;
drop database mysqltest1;
# #
#MDEV-7384 [PATCH] add PERSISENT FOR ALL option to mysqlanalyze/mysqlcheck #MDEV-7384 [PATCH] add PERSISENT FOR ALL option to mysqlanalyze/mysqlcheck
# #

View File

@ -2114,6 +2114,37 @@ a b
1 1 1 1
drop table t2; drop table t2;
# #
# MDEV-10228: Delete missing rows with OR conditions
# (The example uses UPDATE, because UPDATE allows to use index hints
# and so it's possible to make an example that works with any storage
# engine)
#
CREATE TABLE t1 (
key1varchar varchar(14) NOT NULL,
key2int int(11) NOT NULL DEFAULT '0',
col1 int,
PRIMARY KEY (key1varchar,key2int),
KEY key1varchar (key1varchar),
KEY key2int (key2int)
) DEFAULT CHARSET=utf8;
insert into t1 values
('value1',0, 0),
('value1',1, 0),
('value1',1000685, 0),
('value1',1003560, 0),
('value1',1004807, 0);
update t1 force index (PRIMARY) set col1=12345
where (key1varchar='value1' AND (key2int <=1 OR key2int > 1));
# The following must show col1=12345 for all rows:
select * from t1;
key1varchar key2int col1
value1 0 12345
value1 1 12345
value1 1000685 12345
value1 1003560 12345
value1 1004807 12345
drop table t1;
#
# BUG#13731380: RANGE OPTIMIZER CALLS RECORDS_IN_RANGE() FOR OPEN RANGE # BUG#13731380: RANGE OPTIMIZER CALLS RECORDS_IN_RANGE() FOR OPEN RANGE
# #
CREATE TABLE t1 (pk INT PRIMARY KEY); CREATE TABLE t1 (pk INT PRIMARY KEY);

View File

@ -2116,6 +2116,37 @@ a b
1 1 1 1
drop table t2; drop table t2;
# #
# MDEV-10228: Delete missing rows with OR conditions
# (The example uses UPDATE, because UPDATE allows to use index hints
# and so it's possible to make an example that works with any storage
# engine)
#
CREATE TABLE t1 (
key1varchar varchar(14) NOT NULL,
key2int int(11) NOT NULL DEFAULT '0',
col1 int,
PRIMARY KEY (key1varchar,key2int),
KEY key1varchar (key1varchar),
KEY key2int (key2int)
) DEFAULT CHARSET=utf8;
insert into t1 values
('value1',0, 0),
('value1',1, 0),
('value1',1000685, 0),
('value1',1003560, 0),
('value1',1004807, 0);
update t1 force index (PRIMARY) set col1=12345
where (key1varchar='value1' AND (key2int <=1 OR key2int > 1));
# The following must show col1=12345 for all rows:
select * from t1;
key1varchar key2int col1
value1 0 12345
value1 1 12345
value1 1000685 12345
value1 1003560 12345
value1 1004807 12345
drop table t1;
#
# BUG#13731380: RANGE OPTIMIZER CALLS RECORDS_IN_RANGE() FOR OPEN RANGE # BUG#13731380: RANGE OPTIMIZER CALLS RECORDS_IN_RANGE() FOR OPEN RANGE
# #
CREATE TABLE t1 (pk INT PRIMARY KEY); CREATE TABLE t1 (pk INT PRIMARY KEY);

View File

@ -320,3 +320,23 @@ c2
DROP TRIGGER t1_ai; DROP TRIGGER t1_ai;
DROP TABLE t1, t2; DROP TABLE t1, t2;
End of 5.0 tests End of 5.0 tests
#
# Bug#21142859: FUNCTION UPDATING A VIEW FAILS TO FIND TABLE THAT ACTUALLY EXISTS
#
CREATE TABLE t1 SELECT 1 AS fld1, 'A' AS fld2;
CREATE TABLE t2 (fld3 INT, fld4 CHAR(1));
CREATE VIEW v1 AS SELECT * FROM t1;
CREATE TRIGGER t1_au AFTER UPDATE ON t1
FOR EACH ROW INSERT INTO t2 VALUES (new.fld1, new.fld2);
CREATE FUNCTION f1() RETURNS INT
BEGIN
UPDATE v1 SET fld2='B' WHERE fld1=1;
RETURN row_count();
END !
# Without the patch, an error was getting reported.
SELECT f1();
f1()
1
DROP FUNCTION f1;
DROP VIEW v1;
DROP TABLE t1,t2;

View File

@ -165,6 +165,7 @@ str_to_date( '', a )
NULL NULL
DROP TABLE t1; DROP TABLE t1;
CREATE TABLE t1 (a DATE, b INT, PRIMARY KEY (a,b)); CREATE TABLE t1 (a DATE, b INT, PRIMARY KEY (a,b));
SET timestamp=UNIX_TIMESTAMP('2016-07-21 14:48:18');
INSERT INTO t1 VALUES (DATE(NOW()), 1); INSERT INTO t1 VALUES (DATE(NOW()), 1);
SELECT COUNT(*) FROM t1 WHERE a = NOW(); SELECT COUNT(*) FROM t1 WHERE a = NOW();
COUNT(*) COUNT(*)
@ -192,6 +193,7 @@ COUNT(*)
EXPLAIN SELECT COUNT(*) FROM t1 WHERE a = NOW(); EXPLAIN SELECT COUNT(*) FROM t1 WHERE a = NOW();
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 ALL NULL NULL NULL NULL 2 Using where 1 SIMPLE t1 ALL NULL NULL NULL NULL 2 Using where
SET timestamp=DEFAULT;
DROP TABLE t1; DROP TABLE t1;
CREATE TABLE t1 (a DATE); CREATE TABLE t1 (a DATE);
CREATE TABLE t2 (a DATE); CREATE TABLE t2 (a DATE);

View File

@ -5518,6 +5518,21 @@ test.v1 check Error 'test.v1' is not BASE TABLE
test.v1 check status Operation failed test.v1 check status Operation failed
drop view v1; drop view v1;
drop table t1; drop table t1;
#
# MDEV-10419: crash in mariadb 10.1.16-MariaDB-1~trusty
#
CREATE TABLE t1 (c1 CHAR(13));
CREATE TABLE t2 (c2 CHAR(13));
CREATE FUNCTION f() RETURNS INT RETURN 0;
CREATE OR REPLACE VIEW v1 AS select f() from t1 where c1 in (select c2 from t2);
DROP FUNCTION f;
SHOW CREATE VIEW v1;
View Create View character_set_client collation_connection
v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select `f`() AS `f()` from `t1` where `test`.`t1`.`c1` in (select `test`.`t2`.`c2` from `t2`) latin1 latin1_swedish_ci
Warnings:
Warning 1356 View 'test.v1' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them
drop view v1;
drop table t1,t2;
# ----------------------------------------------------------------- # -----------------------------------------------------------------
# -- End of 5.5 tests. # -- End of 5.5 tests.
# ----------------------------------------------------------------- # -----------------------------------------------------------------

View File

@ -311,10 +311,10 @@ concat('c-', 1000 + C.a, '-c'),
'filler' 'filler'
from t1 A, t1 B, t1 C; from t1 A, t1 B, t1 C;
explain explain
select count(length(a) + length(filler)) from t2 where a>='a-1000-a' and a <'a-1001-a'; select count(length(a) + length(filler)) from t2 force index (a) where a>='a-1000-a' and a <'a-1001-a';
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t2 range a a 9 NULL 99 Using index condition; Rowid-ordered scan 1 SIMPLE t2 range a a 9 NULL 99 Using index condition; Rowid-ordered scan
select count(length(a) + length(filler)) from t2 where a>='a-1000-a' and a <'a-1001-a'; select count(length(a) + length(filler)) from t2 force index (a) where a>='a-1000-a' and a <'a-1001-a';
count(length(a) + length(filler)) count(length(a) + length(filler))
100 100
drop table t2; drop table t2;

View File

@ -0,0 +1 @@
Ã"RT @niouzechun: 遘√<E98198><E2889A><EFBFBD><EFBFBD>繝上ャ繝斐<E7B99D><E69690><EFBFBD><EFBFBD>繧ィ繝ウ繝牙耳縺ェ繧薙□縺代縺ゥ縲√い繝ウ繝上ャ繝斐<E7B99D><E69690><EFBFBD><EFBFBD>繧ィ繝ウ繝峨諠ィ蜉<EFBDA8><E89C89><EFBFBD><EFBFBD>噪縺ェ縺願ゥア繧偵≠縺セ繧顔ゥ肴・オ逧<EFBDB5><E980A7><EFBFBD><EFBFBD>↓鞫ょ叙縺励↑縺<E28691><E7B8BA><EFBFBD><EFBFBD>炊逕ア縺ッ縲∫樟螳溘<E89EB3><E6BA98><EFBFBD><EFBFBD>莠コ逕溘<E98095><E6BA98><EFBFBD><EFBFBD>蝓コ譛ャ逧<EFBDAC><E980A7><EFBFBD><EFBFBD>↓縺<E28693><E7B8BA><EFBFBD><EFBFBD>縺上縺九↑縺<E28691><E7B8BA><EFBFBD><EFBFBD>荳榊ケウ遲峨□縺礼炊荳榊ース縺<EFBDBD>縺苓セ帙

View File

@ -0,0 +1,58 @@
DROP TABLE IF EXISTS t1 ;
# READ_ONLY does nothing to SUPER users
# so we use a non-SUPER one:
GRANT CREATE, SELECT, DROP ON *.* TO test@localhost;
connect con1,localhost,test,,test;
connection default;
SET GLOBAL READ_ONLY=1;
connection con1;
CREATE TEMPORARY TABLE t1 (a INT) ENGINE=INNODB;
# Test INSERTS with autocommit being off and on.
BEGIN;
INSERT INTO t1 VALUES (10);
COMMIT;
INSERT INTO t1 VALUES (20);
# Test UPDATES with autocommit being off and on.
BEGIN;
UPDATE t1 SET a=30 WHERE a=10;
COMMIT;
UPDATE t1 SET a=40 WHERE a=20;
connection default;
SET GLOBAL READ_ONLY=0;
# Test scenario where global read_only is enabled in the middle of transaction.
# Test INSERT operations on temporary tables, INSERTs should be successful even
# when global read_only is enabled.
connection con1;
BEGIN;
INSERT INTO t1 VALUES(50);
connection default;
SET GLOBAL READ_ONLY=1;
connection con1;
SELECT @@GLOBAL.READ_ONLY;
@@GLOBAL.READ_ONLY
1
COMMIT;
connection default;
SET GLOBAL READ_ONLY=0;
# Test UPDATE operations on temporary tables, UPDATEs should be successful even
# when global read_only is enabled.
connection con1;
BEGIN;
UPDATE t1 SET a=60 WHERE a=50;
connection default;
SET GLOBAL READ_ONLY=1;
connection con1;
SELECT @@GLOBAL.READ_ONLY;
@@GLOBAL.READ_ONLY
1
COMMIT;
SELECT * FROM t1;
a
30
40
60
# Clean up
connection default;
SET GLOBAL READ_ONLY=0;
disconnect con1;
DROP USER test@localhost;

View File

@ -0,0 +1,91 @@
# ==== Purpose ====
#
# Check that DMLs are allowed on temporary tables, when server is in read only
# mode and binary log is enabled with binlog-format being stmt/mixed mode.
#
# ==== Implementation ====
#
# Start the server with binary log being enabled. Mark the server as read only.
# Create a non-SUPER user and let the user to create a temporary table and
# perform DML operations on that temporary table. DMLs should not be blocked
# with a 'server read-only mode' error.
#
# ==== References ====
#
# Bug#12818255: READ-ONLY OPTION DOES NOT ALLOW INSERTS/UPDATES ON TEMPORARY
# TABLES
# Bug#14294223: CHANGES NOT ALLOWED TO TEMPORARY TABLES ON READ-ONLY SERVERS
###############################################################################
--source include/have_log_bin.inc
--source include/have_innodb.inc
--disable_warnings
DROP TABLE IF EXISTS t1 ;
--enable_warnings
--enable_connect_log
--echo # READ_ONLY does nothing to SUPER users
--echo # so we use a non-SUPER one:
GRANT CREATE, SELECT, DROP ON *.* TO test@localhost;
connect (con1,localhost,test,,test);
connection default;
SET GLOBAL READ_ONLY=1;
connection con1;
CREATE TEMPORARY TABLE t1 (a INT) ENGINE=INNODB;
--echo # Test INSERTS with autocommit being off and on.
BEGIN;
INSERT INTO t1 VALUES (10);
COMMIT;
INSERT INTO t1 VALUES (20);
--echo # Test UPDATES with autocommit being off and on.
BEGIN;
UPDATE t1 SET a=30 WHERE a=10;
COMMIT;
UPDATE t1 SET a=40 WHERE a=20;
connection default;
SET GLOBAL READ_ONLY=0;
--echo # Test scenario where global read_only is enabled in the middle of transaction.
--echo # Test INSERT operations on temporary tables, INSERTs should be successful even
--echo # when global read_only is enabled.
connection con1;
BEGIN;
INSERT INTO t1 VALUES(50);
connection default;
SET GLOBAL READ_ONLY=1;
connection con1;
SELECT @@GLOBAL.READ_ONLY;
COMMIT;
connection default;
SET GLOBAL READ_ONLY=0;
--echo # Test UPDATE operations on temporary tables, UPDATEs should be successful even
--echo # when global read_only is enabled.
connection con1;
BEGIN;
UPDATE t1 SET a=60 WHERE a=50;
connection default;
SET GLOBAL READ_ONLY=1;
connection con1;
SELECT @@GLOBAL.READ_ONLY;
COMMIT;
SELECT * FROM t1;
--echo # Clean up
connection default;
SET GLOBAL READ_ONLY=0;
disconnect con1;
DROP USER test@localhost;
--disable_connect_log

View File

@ -5,6 +5,9 @@ grant proxy on pam_test to test_pam;
show variables like 'pam%'; show variables like 'pam%';
Variable_name Value Variable_name Value
pam_use_cleartext_plugin ON pam_use_cleartext_plugin ON
#
# same test as in pam.test now fails
#
drop user test_pam; drop user test_pam;
drop user pam_test; drop user pam_test;
uninstall plugin pam; uninstall plugin pam;

View File

@ -29,5 +29,6 @@ EOF
--remove_file $MYSQLTEST_VARDIR/tmp/pam_bad.txt --remove_file $MYSQLTEST_VARDIR/tmp/pam_bad.txt
drop user test_pam; drop user test_pam;
drop user pam_test; drop user pam_test;
let $count_sessions= 1;
--source include/wait_until_count_sessions.inc
uninstall plugin pam; uninstall plugin pam;

View File

@ -3,11 +3,22 @@
show variables like 'pam%'; show variables like 'pam%';
--write_file $MYSQLTEST_VARDIR/tmp/pam_good.txt
not very secret challenge
9225
select user(), current_user(), database();
EOF
--echo #
--echo # same test as in pam.test now fails
--echo #
--error 1 --error 1
--exec echo FAIL | $MYSQL_TEST -u test_pam --plugin-dir=$plugindir --exec $MYSQL_TEST -u test_pam --plugin-dir=$plugindir < $MYSQLTEST_VARDIR/tmp/pam_good.txt
--remove_file $MYSQLTEST_VARDIR/tmp/pam_good.txt
drop user test_pam; drop user test_pam;
drop user pam_test; drop user pam_test;
--disable_warnings let $count_sessions= 1;
--source include/wait_until_count_sessions.inc
uninstall plugin pam; uninstall plugin pam;

View File

@ -12,6 +12,16 @@ SET @@global.general_log_file = mytest.log;
ERROR 42000: Incorrect argument type to variable 'general_log_file' ERROR 42000: Incorrect argument type to variable 'general_log_file'
SET @@global.general_log_file = 12; SET @@global.general_log_file = 12;
ERROR 42000: Incorrect argument type to variable 'general_log_file' ERROR 42000: Incorrect argument type to variable 'general_log_file'
SET @@global.general_log_file = 'my.cnf';
ERROR 42000: Variable 'general_log_file' can't be set to the value of 'my.cnf'
SET @@global.general_log_file = '/tmp/my.cnf';
ERROR 42000: Variable 'general_log_file' can't be set to the value of '/tmp/my.cnf'
SET @@global.general_log_file = '.my.cnf';
ERROR 42000: Variable 'general_log_file' can't be set to the value of '.my.cnf'
SET @@global.general_log_file = 'my.cnf\0foo';
ERROR 42000: Variable 'general_log_file' can't be set to the value of 'my.cnf'
SET @@global.general_log_file = 'my.ini';
ERROR 42000: Variable 'general_log_file' can't be set to the value of 'my.ini'
'#----------------------FN_DYNVARS_004_03------------------------#' '#----------------------FN_DYNVARS_004_03------------------------#'
SELECT @@global.general_log_file = VARIABLE_VALUE SELECT @@global.general_log_file = VARIABLE_VALUE
FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES

View File

@ -9,6 +9,16 @@ SET @@global.slow_query_log_file = mytest.log;
ERROR 42000: Incorrect argument type to variable 'slow_query_log_file' ERROR 42000: Incorrect argument type to variable 'slow_query_log_file'
SET @@global.slow_query_log_file = 12; SET @@global.slow_query_log_file = 12;
ERROR 42000: Incorrect argument type to variable 'slow_query_log_file' ERROR 42000: Incorrect argument type to variable 'slow_query_log_file'
SET @@global.slow_query_log_file = 'my.cnf';
ERROR 42000: Variable 'slow_query_log_file' can't be set to the value of 'my.cnf'
SET @@global.slow_query_log_file = '/tmp/my.cnf';
ERROR 42000: Variable 'slow_query_log_file' can't be set to the value of '/tmp/my.cnf'
SET @@global.general_log_file = '.my.cnf';
ERROR 42000: Variable 'general_log_file' can't be set to the value of '.my.cnf'
SET @@global.general_log_file = 'my.cnf\0foo';
ERROR 42000: Variable 'general_log_file' can't be set to the value of 'my.cnf'
SET @@global.general_log_file = 'my.ini';
ERROR 42000: Variable 'general_log_file' can't be set to the value of 'my.ini'
'#----------------------FN_DYNVARS_004_03------------------------#' '#----------------------FN_DYNVARS_004_03------------------------#'
SELECT @@global.slow_query_log_file = VARIABLE_VALUE SELECT @@global.slow_query_log_file = VARIABLE_VALUE
FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES

View File

@ -58,6 +58,20 @@ SET @@global.general_log_file = mytest.log;
--error ER_WRONG_TYPE_FOR_VAR --error ER_WRONG_TYPE_FOR_VAR
SET @@global.general_log_file = 12; SET @@global.general_log_file = 12;
#
# MDEV-10465
#
--error ER_WRONG_VALUE_FOR_VAR
SET @@global.general_log_file = 'my.cnf';
--error ER_WRONG_VALUE_FOR_VAR
SET @@global.general_log_file = '/tmp/my.cnf';
--error ER_WRONG_VALUE_FOR_VAR
SET @@global.general_log_file = '.my.cnf';
--error ER_WRONG_VALUE_FOR_VAR
SET @@global.general_log_file = 'my.cnf\0foo';
--error ER_WRONG_VALUE_FOR_VAR
SET @@global.general_log_file = 'my.ini';
--echo '#----------------------FN_DYNVARS_004_03------------------------#' --echo '#----------------------FN_DYNVARS_004_03------------------------#'
############################################################################## ##############################################################################

View File

@ -56,6 +56,20 @@ SET @@global.slow_query_log_file = mytest.log;
--error ER_WRONG_TYPE_FOR_VAR --error ER_WRONG_TYPE_FOR_VAR
SET @@global.slow_query_log_file = 12; SET @@global.slow_query_log_file = 12;
#
# MDEV-10465
#
--error ER_WRONG_VALUE_FOR_VAR
SET @@global.slow_query_log_file = 'my.cnf';
--error ER_WRONG_VALUE_FOR_VAR
SET @@global.slow_query_log_file = '/tmp/my.cnf';
--error ER_WRONG_VALUE_FOR_VAR
SET @@global.general_log_file = '.my.cnf';
--error ER_WRONG_VALUE_FOR_VAR
SET @@global.general_log_file = 'my.cnf\0foo';
--error ER_WRONG_VALUE_FOR_VAR
SET @@global.general_log_file = 'my.ini';
--echo '#----------------------FN_DYNVARS_004_03------------------------#' --echo '#----------------------FN_DYNVARS_004_03------------------------#'
############################################################################## ##############################################################################
# Check if the value in GLOBAL Tables matches values in variable # # Check if the value in GLOBAL Tables matches values in variable #

View File

@ -1565,3 +1565,34 @@ EXECUTE stmt;
EXECUTE stmt; EXECUTE stmt;
DROP TABLE t1,t2,t3,t4,t5,t6; DROP TABLE t1,t2,t3,t4,t5,t6;
--echo #
--echo # MDEV-10500 CASE/IF Statement returns multiple values and shifts further result values to the next column
--echo #
CREATE TABLE t1 (
id int not null AUTO_INCREMENT,
active bool not null,
data1 bigint,
data2 bigint,
data3 bigint,
primary key (id)
);
INSERT INTO t1 (active,data1,data2,data3) VALUES (1,null,100,200);
SELECT
CASE WHEN active THEN SUM(data1) END AS C_1,
SUM(data2) AS C_2,
SUM(data3) AS C_3
FROM t1;
SELECT
IF(active, SUM(data1), 5) AS C_1,
SUM(data2) AS C_2,
SUM(data3) AS C_3
FROM t1;
DROP TABLE t1;
--echo #
--echo # MDEV-10468 Assertion `nr >= 0.0' failed in Item_sum_std::val_real()
--echo #
SELECT STDDEV_POP(f) FROM (SELECT "1e+309" AS f UNION SELECT "-1e+309" AS f) tbl;
SELECT STDDEV(f) FROM (SELECT 1.7976931348623157e+308 AS f UNION SELECT -1.7976931348623157e+308 AS f) tbl;

View File

@ -578,11 +578,15 @@ select 5 div 2.0;
select 5.9 div 2, 1.23456789e3 DIV 2, 1.23456789e9 DIV 2, 1.23456789e19 DIV 2; select 5.9 div 2, 1.23456789e3 DIV 2, 1.23456789e9 DIV 2, 1.23456789e19 DIV 2;
--echo # --echo #
--echo # End of 5.5 tests --echo # MDEV-10467 Assertion `nr >= 0.0' failed in Item_sum_std::val_real()
--echo # --echo #
CREATE TABLE t1 (i INT);
INSERT INTO t1 VALUES (1),(2);
SELECT STDDEV_SAMP(ROUND('0', 309)) FROM t1;
DROP TABLE t1;
--echo # --echo #
--echo # Start of 10.0 tests --echo # End of 5.5 tests
--echo # --echo #
--echo # --echo #
@ -590,7 +594,6 @@ select 5.9 div 2, 1.23456789e3 DIV 2, 1.23456789e9 DIV 2, 1.23456789e19 DIV 2;
--echo # --echo #
SELECT STDDEV_POP(ROUND(0,@A:=2009)) FROM (SELECT 1 UNION SELECT 2) fake_table; SELECT STDDEV_POP(ROUND(0,@A:=2009)) FROM (SELECT 1 UNION SELECT 2) fake_table;
--echo # --echo #
--echo # End of 10.0 tests --echo # End of 10.0 tests
--echo # --echo #

View File

@ -596,6 +596,16 @@ AND 57813X540X1723 = 'Test';
drop table t1; drop table t1;
#
# Bug#12735545 - PARSER STACK OVERFLOW WITH NAME_CONST
# CONTAINING OR EXPRESSION
#
--error ER_WRONG_ARGUMENTS
SELECT NAME_CONST('a', -(1 OR 2)) OR 1;
--error ER_WRONG_ARGUMENTS
SELECT NAME_CONST('a', -(1 AND 2)) OR 1;
SELECT NAME_CONST('a', -(1)) OR 1;
--echo # --echo #
--echo # End of 5.5 tests --echo # End of 5.5 tests
--echo # --echo #

View File

@ -612,7 +612,7 @@ disconnect con1;
--echo # --echo #
CREATE TABLE t1(f1 INT); CREATE TABLE t1(f1 INT);
EVAL SELECT 0xE1BB30 INTO OUTFILE 't1.dat'; EVAL SELECT 0xE1C330 INTO OUTFILE 't1.dat';
--disable_warnings --disable_warnings
LOAD DATA INFILE 't1.dat' IGNORE INTO TABLE t1 CHARACTER SET utf8; LOAD DATA INFILE 't1.dat' IGNORE INTO TABLE t1 CHARACTER SET utf8;
--enable_warnings --enable_warnings
@ -658,3 +658,26 @@ SET @@sql_mode= @old_mode;
--remove_file $MYSQLTEST_VARDIR/mysql --remove_file $MYSQLTEST_VARDIR/mysql
DROP TABLE t1; DROP TABLE t1;
--echo
--echo #
--echo # Bug#23080148 - Backport of Bug#20683959.
--echo # Bug#20683959 LOAD DATA INFILE IGNORES A SPECIFIC ROW SILENTLY
--echo # UNDER DB CHARSET IS UTF8.
--echo #
CREATE DATABASE d1 CHARSET latin1;
USE d1;
CREATE TABLE t1 (val TEXT);
LOAD DATA INFILE '../../std_data/bug20683959loaddata.txt' INTO TABLE t1;
SELECT COUNT(*) FROM t1;
SELECT HEX(val) FROM t1;
CREATE DATABASE d2 CHARSET utf8;
USE d2;
CREATE TABLE t1 (val TEXT);
--error ER_INVALID_CHARACTER_STRING
LOAD DATA INFILE '../../std_data/bug20683959loaddata.txt' INTO TABLE t1;
DROP TABLE d1.t1, d2.t1;
DROP DATABASE d1;
DROP DATABASE d2;

View File

@ -0,0 +1,117 @@
#
# MDEV-10506 Protocol::end_statement(): Assertion `0' failed upon ALTER TABLE
#
CREATE TABLE t1 (
pk INT AUTO_INCREMENT,
i INT,
d DATE,
dt DATETIME,
v VARCHAR(1),
PRIMARY KEY (pk),
KEY (dt)
) ENGINE=MyISAM;
INSERT INTO t1 (i, d, dt, v) VALUES
(9, '2005-07-23', '2004-05-13 01:01:39', 't'),
(2, '2009-11-01', '2003-12-24 07:39:29', 'h'),
(6, NULL, '2008-07-03 05:32:22', 'l'),
(6, '2007-07-16', '2008-08-28 18:46:11', 'j'),
(5, NULL, '2001-07-12 21:27:00', 'h'),
(3, '2007-07-22', '1900-01-01 00:00:00', 'p'),
(2, '2000-11-21', '2007-05-25 11:58:54', 'g'),
(6, '1900-01-01', '2009-06-03 17:11:10', 'i'),
(2, '2008-02-10', '2001-06-15 16:20:07', 'p'),
(3, '2009-06-04', '1900-01-01 00:00:00', 'h'),
(9, '2007-04-25', '1900-01-01 00:00:00', 'e'),
(9, '2006-03-02', '1900-01-01 00:00:00', 'e'),
(1, '1900-01-01', '2002-11-08 09:33:27', 'u'),
(7, '2008-07-13', '2007-08-07 17:35:52', 'j'),
(0, '2004-11-12', '2006-05-01 00:00:00', 'e'),
(0, '1900-01-01', '2003-05-01 00:00:00', 'z'),
(1, '2009-09-02', '2007-02-12 09:30:49', 'w'),
(0, '2004-11-06', '1900-01-01 00:00:00', 't'),
(4, '2003-01-06', '2002-07-03 02:51:11', 'i'),
(6, '2006-01-14', '2008-02-26 04:57:32', 'i'),
(0, '2002-01-19', '2009-02-12 00:00:00', 'i'),
(8, '2007-02-12', '1900-01-01 00:00:00', 'b'),
(4, '1900-01-01', '2001-05-16 05:28:40', 'm'),
(2, '2005-07-16', NULL, 'j'),
(1, '2004-09-04', '2001-01-24 21:45:18', 'v'),
(3, '2009-07-01', NULL, NULL),
(2, '2009-07-21', '2002-07-24 00:00:00', 'h'),
(4, NULL, '2001-11-03 12:22:30', 'q'),
(1, '2002-06-22', '2008-06-17 03:17:59', 'f'),
(7, '2005-06-23', '2005-12-24 00:00:00', 'p'),
(6, '2001-05-20', '2008-10-23 00:00:00', NULL),
(3, '2001-10-01', '2000-10-12 16:32:35', 'o'),
(3, '2001-01-07', '2005-09-11 10:09:54', 'w'),
(6, '2007-11-02', '2009-09-10 01:44:18', 'l'),
(6, NULL, NULL, 'i'),
(9, NULL, '2002-05-18 15:21:55', 'd'),
(4, '2008-12-21', '2004-10-15 10:09:54', 'j'),
(6, '2003-10-05', '2009-07-13 03:51:02', 'e'),
(2, '2001-03-03', '1900-01-01 00:00:00', 'e'),
(2, '2007-04-04', '2001-11-08 21:14:52', 'q'),
(5, NULL, '2006-12-02 00:00:00', 'm'),
(0, '2009-01-04', '1900-01-01 00:00:00', NULL),
(8, '2008-04-03', '2005-01-01 11:55:18', 'q'),
(8, NULL, '2005-02-28 03:44:02', 'w'),
(0, '2003-08-22', NULL, 'c'),
(9, '1900-01-01', NULL, 'y'),
(NULL, NULL, '2006-08-25 16:28:09', 'g'),
(5, '2004-07-04', '2002-08-11 00:00:00', 'z'),
(1, '1900-01-01', '2007-07-22 21:19:18', 'm'),
(2, '2007-02-04', '2006-02-10 18:41:38', 't'),
(2, '1900-01-01', '2009-02-16 14:58:58', 'd'),
(7, '2001-03-14', '2007-08-14 00:00:00', 'h'),
(0, NULL, '1900-01-01 00:00:00', NULL),
(1, '2008-10-05', NULL, 'f'),
(6, '2001-11-25', '2008-12-03 06:59:23', 'l'),
(NULL, '2003-01-27', '2008-10-04 00:00:00', 'g'),
(8, '2008-08-08', '2009-07-07 07:00:21', 'v'),
(8, '2006-07-03', '2001-04-15 00:00:00', NULL),
(5, '2002-11-21', '2007-07-08 04:01:58', 'm'),
(5, '2006-04-08', '2007-09-23 00:01:35', 'i'),
(5, '2001-05-06', '2008-05-15 00:00:00', 'h'),
(7, '1900-01-01', '1900-01-01 00:00:00', 'u'),
(30, '2007-04-16', '2004-03-05 23:35:38', 'o'),
(NULL, '1900-01-01', '2007-08-25 01:32:47', 'z'),
(6, '2004-12-03', '1900-01-01 00:00:00', 'o'),
(8, '2001-06-23', '1900-01-01 00:00:00', 'f'),
(NULL, '2008-12-15', '2001-05-19 08:28:28', 'a'),
(9, '2000-02-15', '2009-09-03 06:07:22', 'd'),
(2, '2001-08-05', '2006-10-08 07:17:27', 'k'),
(5, '2004-01-17', '2003-09-06 20:36:01', 'd'),
(4, '2003-10-01', '2001-02-05 18:10:49', 'u'),
(4, '2003-07-28', '2001-01-07 16:11:37', 'h'),
(0, '1900-01-01', '2008-08-01 05:26:38', 'w'),
(9, '1900-01-01', '2001-05-08 00:00:00', 't'),
(1, '2000-04-17', '2008-07-10 21:26:28', 'i'),
(8, '2002-01-05', '2006-08-06 20:56:35', 'k'),
(9, '2001-04-10', '2003-02-17 00:00:00', 'z'),
(0, '2009-12-04', NULL, 'h'),
(7, NULL, '2004-10-27 00:29:57', 'h'),
(2, '2006-03-07', '2008-03-04 06:14:13', 'b'),
(0, '2001-10-15', '2001-03-17 00:00:00', 'm'),
(5, '1900-01-01', '2009-02-21 11:35:50', 'i'),
(4, NULL, '1900-01-01 00:00:00', 'w'),
(5, '2009-04-05', '1900-01-01 00:00:00', 'm'),
(6, '2001-03-19', '2001-04-12 00:00:00', 'q'),
(NULL, '2009-12-08', '2001-12-04 20:21:01', 'k'),
(2, '2005-02-09', '2001-05-27 08:41:01', 'l'),
(9, '2004-05-25', '2004-09-18 00:00:00', 'c'),
(3, '2005-01-17', '2002-09-12 11:18:48', 'd'),
(0, '2003-08-28', '1900-01-01 00:00:00', 'k'),
(6, '2006-10-11', '2003-10-28 03:31:02', 'a'),
(5, '1900-01-01', '2001-08-22 10:20:09', 'p'),
(8, '1900-01-01', '2008-04-24 00:00:00', 'o'),
(4, '2005-08-18', '2006-11-10 10:08:49', 'e'),
(NULL, '2007-03-12', '2007-10-16 00:00:00', 'n'),
(1, '2000-11-18', '2009-05-27 12:25:07', 't'),
(4, '2001-03-03', NULL, 'u'),
(3, '2003-09-11', '2001-09-10 18:10:10', 'f'),
(4, '2007-06-17', '1900-01-01 00:00:00', 't'),
(NULL, '2008-09-11', '2004-06-07 23:17:09', 'k');
ALTER TABLE t1 ADD UNIQUE KEY ind1 (pk, d, i, v);
--error ER_DUP_ENTRY
ALTER TABLE t1 ADD UNIQUE KEY ind2 (d, v);
DROP TABLE t1;

View File

@ -309,15 +309,36 @@ CHECK TABLE bug47205 FOR UPGRADE;
DROP TABLE bug47205; DROP TABLE bug47205;
--echo # --echo #
--echo #MDEV-6128:[PATCH] mysqlcheck wrongly escapes '.' in table names --echo #MDEV-6128:[PATCH] mysqlcheck wrongly escapes '.' in table names
--echo # --echo #
CREATE TABLE test.`t.1` (id int); create table `t.1` (id int);
create view `v.1` as select 1;
--echo mysqlcheck test t.1 --echo mysqlcheck test t.1
--exec $MYSQL_CHECK test t.1 --exec $MYSQL_CHECK test t.1
--echo mysqlcheck --all-in-1 test t.1
--exec $MYSQL_CHECK --all-in-1 test t.1
--echo mysqlcheck --all-in-1 --databases --process-views test
--exec $MYSQL_CHECK --all-in-1 --databases --process-views test
drop table test.`t.1`; create table `t.2`(a varchar(20) primary key) default character set utf8 collate utf8_general_ci engine=innodb;
flush table `t.2`;
--remove_file $MYSQLD_DATADIR/test/t@002e2.frm
--copy_file std_data/bug47205.frm $MYSQLD_DATADIR/test/t@002e2.frm
--copy_file std_data/bug36055.frm $MYSQLD_DATADIR/test/t@002e3.frm
--copy_file std_data/bug36055.MYD $MYSQLD_DATADIR/test/t@002e3.MYD
--copy_file std_data/bug36055.MYI $MYSQLD_DATADIR/test/t@002e3.MYI
--echo mysqlcheck --check-upgrade --auto-repair test
--exec $MYSQL_CHECK --check-upgrade --auto-repair test
check table `t.1`, `t.2`, `t.3`;
check table `t.1`, `t.2`, `t.3` for upgrade;
drop view `v.1`;
drop table test.`t.1`, `t.2`, `t.3`;
--echo # --echo #
--echo # MDEV-8123 mysqlcheck: new --process-views option conflicts with --quick, --extended and such --echo # MDEV-8123 mysqlcheck: new --process-views option conflicts with --quick, --extended and such
@ -355,6 +376,28 @@ create table `#mysql50#t1``1` (a int) engine=myisam;
show tables; show tables;
drop table `t1``1`; drop table `t1``1`;
#
# MDEV-9440 mysqlcheck -A --auto-repair selects wrong database when trying to repair broken table
#
call mtr.add_suppression("ha_myisam");
call mtr.add_suppression("Checking table");
create database mysqltest1;
create table mysqltest1.t1 (a int) engine=myisam;
create table t2 (a int);
let $datadir= `select @@datadir`;
remove_file $datadir/mysqltest1/t1.MYD;
write_file $datadir/mysqltest1/t1.MYD;
foo
EOF
check table mysqltest1.t1;
--exec $MYSQL_CHECK -A --auto-repair --fast
drop table t2;
drop database mysqltest1;
--echo # --echo #
--echo #MDEV-7384 [PATCH] add PERSISENT FOR ALL option to mysqlanalyze/mysqlcheck --echo #MDEV-7384 [PATCH] add PERSISENT FOR ALL option to mysqlanalyze/mysqlcheck
--echo # --echo #

View File

@ -22,3 +22,12 @@ connect(pipe_con,localhost,root,,,,,PIPE);
connection default; connection default;
disconnect pipe_con; disconnect pipe_con;
# MDEV-10383 : check that other server cannot 'bind' on the same pipe
let $MYSQLD_DATADIR= `select @@datadir`;
--error 1
--exec $MYSQLD_CMD --enable-named-pipe --skip-networking --log-error=second-mysqld.err
let SEARCH_FILE=$MYSQLD_DATADIR/second-mysqld.err;
let SEARCH_RANGE= -50;
let SEARCH_PATTERN=\[ERROR\] Create named pipe failed;
source include/search_pattern_in_file.inc;

View File

@ -1690,6 +1690,35 @@ analyze table t2;
select a, b from t2 where (a, b) in ((0, 0), (1, 1)); select a, b from t2 where (a, b) in ((0, 0), (1, 1));
drop table t2; drop table t2;
--echo #
--echo # MDEV-10228: Delete missing rows with OR conditions
--echo # (The example uses UPDATE, because UPDATE allows to use index hints
--echo # and so it's possible to make an example that works with any storage
--echo # engine)
--echo #
CREATE TABLE t1 (
key1varchar varchar(14) NOT NULL,
key2int int(11) NOT NULL DEFAULT '0',
col1 int,
PRIMARY KEY (key1varchar,key2int),
KEY key1varchar (key1varchar),
KEY key2int (key2int)
) DEFAULT CHARSET=utf8;
insert into t1 values
('value1',0, 0),
('value1',1, 0),
('value1',1000685, 0),
('value1',1003560, 0),
('value1',1004807, 0);
update t1 force index (PRIMARY) set col1=12345
where (key1varchar='value1' AND (key2int <=1 OR key2int > 1));
--echo # The following must show col1=12345 for all rows:
select * from t1;
drop table t1;
--echo # --echo #
--echo # BUG#13731380: RANGE OPTIMIZER CALLS RECORDS_IN_RANGE() FOR OPEN RANGE --echo # BUG#13731380: RANGE OPTIMIZER CALLS RECORDS_IN_RANGE() FOR OPEN RANGE
--echo # --echo #

View File

@ -388,3 +388,29 @@ DROP TABLE t1, t2;
--echo End of 5.0 tests --echo End of 5.0 tests
--echo #
--echo # Bug#21142859: FUNCTION UPDATING A VIEW FAILS TO FIND TABLE THAT ACTUALLY EXISTS
--echo #
CREATE TABLE t1 SELECT 1 AS fld1, 'A' AS fld2;
CREATE TABLE t2 (fld3 INT, fld4 CHAR(1));
CREATE VIEW v1 AS SELECT * FROM t1;
CREATE TRIGGER t1_au AFTER UPDATE ON t1
FOR EACH ROW INSERT INTO t2 VALUES (new.fld1, new.fld2);
DELIMITER !;
CREATE FUNCTION f1() RETURNS INT
BEGIN
UPDATE v1 SET fld2='B' WHERE fld1=1;
RETURN row_count();
END !
DELIMITER ;!
--echo # Without the patch, an error was getting reported.
SELECT f1();
DROP FUNCTION f1;
DROP VIEW v1;
DROP TABLE t1,t2;

View File

@ -169,18 +169,8 @@ DROP TABLE t1;
# #
CREATE TABLE t1 (a DATE, b INT, PRIMARY KEY (a,b)); CREATE TABLE t1 (a DATE, b INT, PRIMARY KEY (a,b));
## The current sub test could fail (difference to expected result) if we
## have just reached midnight. SET timestamp=UNIX_TIMESTAMP('2016-07-21 14:48:18');
## (Bug#41776 type_date.test may fail if run around midnight)
## Therefore we sleep a bit if we are too close to midnight.
## The complete test itself needs in average less than 1 second.
## Therefore a time_distance to midnight of 5 seconds should be sufficient.
if (`SELECT CURTIME() > SEC_TO_TIME(24 * 3600 - 5)`)
{
# We are here when CURTIME() is between '23:59:56' and '23:59:59'.
# So a sleep time of 5 seconds brings us between '00:00:01' and '00:00:04'.
--real_sleep 5
}
INSERT INTO t1 VALUES (DATE(NOW()), 1); INSERT INTO t1 VALUES (DATE(NOW()), 1);
SELECT COUNT(*) FROM t1 WHERE a = NOW(); SELECT COUNT(*) FROM t1 WHERE a = NOW();
EXPLAIN SELECT COUNT(*) FROM t1 WHERE a = NOW(); EXPLAIN SELECT COUNT(*) FROM t1 WHERE a = NOW();
@ -192,6 +182,7 @@ EXPLAIN SELECT COUNT(*) FROM t1 WHERE a = NOW() AND b = 1;
ALTER TABLE t1 DROP PRIMARY KEY; ALTER TABLE t1 DROP PRIMARY KEY;
SELECT COUNT(*) FROM t1 WHERE a = NOW(); SELECT COUNT(*) FROM t1 WHERE a = NOW();
EXPLAIN SELECT COUNT(*) FROM t1 WHERE a = NOW(); EXPLAIN SELECT COUNT(*) FROM t1 WHERE a = NOW();
SET timestamp=DEFAULT;
DROP TABLE t1; DROP TABLE t1;

View File

@ -5490,6 +5490,21 @@ alter table v1 check partition p1;
drop view v1; drop view v1;
drop table t1; drop table t1;
--echo #
--echo # MDEV-10419: crash in mariadb 10.1.16-MariaDB-1~trusty
--echo #
CREATE TABLE t1 (c1 CHAR(13));
CREATE TABLE t2 (c2 CHAR(13));
CREATE FUNCTION f() RETURNS INT RETURN 0;
CREATE OR REPLACE VIEW v1 AS select f() from t1 where c1 in (select c2 from t2);
DROP FUNCTION f;
SHOW CREATE VIEW v1;
drop view v1;
drop table t1,t2;
--echo # ----------------------------------------------------------------- --echo # -----------------------------------------------------------------
--echo # -- End of 5.5 tests. --echo # -- End of 5.5 tests.
--echo # ----------------------------------------------------------------- --echo # -----------------------------------------------------------------

View File

@ -33,8 +33,8 @@ insert into t2 select
from t1 A, t1 B, t1 C; from t1 A, t1 B, t1 C;
explain explain
select count(length(a) + length(filler)) from t2 where a>='a-1000-a' and a <'a-1001-a'; select count(length(a) + length(filler)) from t2 force index (a) where a>='a-1000-a' and a <'a-1001-a';
select count(length(a) + length(filler)) from t2 where a>='a-1000-a' and a <'a-1001-a'; select count(length(a) + length(filler)) from t2 force index (a) where a>='a-1000-a' and a <'a-1001-a';
drop table t2; drop table t2;
# Try a very big rowid # Try a very big rowid

View File

@ -696,30 +696,27 @@ my_context_destroy(struct my_context *c)
int int
my_context_spawn(struct my_context *c, void (*f)(void *), void *d) my_context_spawn(struct my_context *c, void (*f)(void *), void *d)
{ {
void *current_fiber;
c->user_func= f; c->user_func= f;
c->user_arg= d; c->user_arg= d;
return my_context_continue(c);
}
int
my_context_continue(struct my_context *c)
{
/* /*
This seems to be a common trick to run ConvertThreadToFiber() only on the This seems to be a common trick to run ConvertThreadToFiber() only on the
first occurence in a thread, in a way that works on multiple Windows first occurence in a thread, in a way that works on multiple Windows
versions. versions.
*/ */
current_fiber= GetCurrentFiber(); void *current_fiber= GetCurrentFiber();
if (current_fiber == NULL || current_fiber == (void *)0x1e00) if (current_fiber == NULL || current_fiber == (void *)0x1e00)
current_fiber= ConvertThreadToFiber(c); current_fiber= ConvertThreadToFiber(c);
c->app_fiber= current_fiber; c->app_fiber= current_fiber;
DBUG_SWAP_CODE_STATE(&c->dbug_state); DBUG_SWAP_CODE_STATE(&c->dbug_state);
SwitchToFiber(c->lib_fiber); SwitchToFiber(c->lib_fiber);
DBUG_SWAP_CODE_STATE(&c->dbug_state); DBUG_SWAP_CODE_STATE(&c->dbug_state);
return c->return_value;
}
int
my_context_continue(struct my_context *c)
{
DBUG_SWAP_CODE_STATE(&c->dbug_state);
SwitchToFiber(c->lib_fiber);
DBUG_SWAP_CODE_STATE(&c->dbug_state);
return c->return_value; return c->return_value;
} }

View File

@ -217,7 +217,7 @@ sub remove_remote_root {
sub remove_test_database { sub remove_test_database {
print " - Dropping test database...\n"; print " - Dropping test database...\n";
if (do_query("DROP DATABASE test;")) { if (do_query("DROP DATABASE IF EXISTS test;")) {
print " ... Success!\n"; print " ... Success!\n";
} else { } else {
print " ... Failed! Not critical, keep moving...\n"; print " ... Failed! Not critical, keep moving...\n";

View File

@ -332,7 +332,7 @@ remove_remote_root() {
remove_test_database() { remove_test_database() {
echo " - Dropping test database..." echo " - Dropping test database..."
do_query "DROP DATABASE test;" do_query "DROP DATABASE IF EXISTS test;"
if [ $? -eq 0 ]; then if [ $? -eq 0 ]; then
echo " ... Success!" echo " ... Success!"
else else

View File

@ -1337,7 +1337,8 @@ int ha_commit_trans(THD *thd, bool all)
uint rw_ha_count= ha_check_and_coalesce_trx_read_only(thd, ha_info, all); uint rw_ha_count= ha_check_and_coalesce_trx_read_only(thd, ha_info, all);
/* rw_trans is TRUE when we in a transaction changing data */ /* rw_trans is TRUE when we in a transaction changing data */
bool rw_trans= is_real_trans && (rw_ha_count > 0); bool rw_trans= is_real_trans &&
(rw_ha_count > !thd->is_current_stmt_binlog_disabled());
MDL_request mdl_request; MDL_request mdl_request;
DBUG_PRINT("info", ("is_real_trans: %d rw_trans: %d rw_ha_count: %d", DBUG_PRINT("info", ("is_real_trans: %d rw_trans: %d rw_ha_count: %d",
is_real_trans, rw_trans, rw_ha_count)); is_real_trans, rw_trans, rw_ha_count));

View File

@ -3763,7 +3763,7 @@ int subselect_uniquesubquery_engine::scan_table()
} }
table->file->extra_opt(HA_EXTRA_CACHE, table->file->extra_opt(HA_EXTRA_CACHE,
current_thd->variables.read_buff_size); get_thd()->variables.read_buff_size);
table->null_row= 0; table->null_row= 0;
for (;;) for (;;)
{ {
@ -4201,7 +4201,7 @@ table_map subselect_union_engine::upper_select_const_tables()
void subselect_single_select_engine::print(String *str, void subselect_single_select_engine::print(String *str,
enum_query_type query_type) enum_query_type query_type)
{ {
select_lex->print(thd, str, query_type); select_lex->print(get_thd(), str, query_type);
} }
@ -4732,6 +4732,7 @@ my_bitmap_init_memroot(MY_BITMAP *map, uint n_bits, MEM_ROOT *mem_root)
bool subselect_hash_sj_engine::init(List<Item> *tmp_columns, uint subquery_id) bool subselect_hash_sj_engine::init(List<Item> *tmp_columns, uint subquery_id)
{ {
THD *thd= get_thd();
select_union *result_sink; select_union *result_sink;
/* Options to create_tmp_table. */ /* Options to create_tmp_table. */
ulonglong tmp_create_options= thd->variables.option_bits | TMP_TABLE_ALL_COLUMNS; ulonglong tmp_create_options= thd->variables.option_bits | TMP_TABLE_ALL_COLUMNS;
@ -5959,6 +5960,7 @@ bool
subselect_rowid_merge_engine::init(MY_BITMAP *non_null_key_parts, subselect_rowid_merge_engine::init(MY_BITMAP *non_null_key_parts,
MY_BITMAP *partial_match_key_parts) MY_BITMAP *partial_match_key_parts)
{ {
THD *thd= get_thd();
/* The length in bytes of the rowids (positions) of tmp_table. */ /* The length in bytes of the rowids (positions) of tmp_table. */
uint rowid_length= tmp_table->file->ref_length; uint rowid_length= tmp_table->file->ref_length;
ha_rows row_count= tmp_table->file->stats.records; ha_rows row_count= tmp_table->file->stats.records;
@ -6497,7 +6499,7 @@ bool subselect_table_scan_engine::partial_match()
} }
tmp_table->file->extra_opt(HA_EXTRA_CACHE, tmp_table->file->extra_opt(HA_EXTRA_CACHE,
current_thd->variables.read_buff_size); get_thd()->variables.read_buff_size);
for (;;) for (;;)
{ {
error= tmp_table->file->ha_rnd_next(tmp_table->record[0]); error= tmp_table->file->ha_rnd_next(tmp_table->record[0]);

View File

@ -751,7 +751,8 @@ public:
ROWID_MERGE_ENGINE, TABLE_SCAN_ENGINE}; ROWID_MERGE_ENGINE, TABLE_SCAN_ENGINE};
subselect_engine(Item_subselect *si, subselect_engine(Item_subselect *si,
select_result_interceptor *res) select_result_interceptor *res):
thd(NULL)
{ {
result= res; result= res;
item= si; item= si;
@ -767,7 +768,7 @@ public:
Should be called before prepare(). Should be called before prepare().
*/ */
void set_thd(THD *thd_arg); void set_thd(THD *thd_arg);
THD * get_thd() { return thd; } THD * get_thd() { return thd ? thd : current_thd; }
virtual int prepare(THD *)= 0; virtual int prepare(THD *)= 0;
virtual void fix_length_and_dec(Item_cache** row)= 0; virtual void fix_length_and_dec(Item_cache** row)= 0;
/* /*

View File

@ -1479,7 +1479,7 @@ my_decimal *Item_sum_sum::val_decimal(my_decimal *val)
if (aggr) if (aggr)
aggr->endup(); aggr->endup();
if (hybrid_type == DECIMAL_RESULT) if (hybrid_type == DECIMAL_RESULT)
return (dec_buffs + curr_dec_buff); return null_value ? NULL : (dec_buffs + curr_dec_buff);
return val_decimal_from_real(val); return val_decimal_from_real(val);
} }
@ -1779,6 +1779,8 @@ double Item_sum_std::val_real()
{ {
DBUG_ASSERT(fixed == 1); DBUG_ASSERT(fixed == 1);
double nr= Item_sum_variance::val_real(); double nr= Item_sum_variance::val_real();
if (my_isinf(nr))
return DBL_MAX;
DBUG_ASSERT(nr >= 0.0); DBUG_ASSERT(nr >= 0.0);
return sqrt(nr); return sqrt(nr);
} }

View File

@ -2563,26 +2563,17 @@ static void network_init(void)
saPipeSecurity.lpSecurityDescriptor = &sdPipeDescriptor; saPipeSecurity.lpSecurityDescriptor = &sdPipeDescriptor;
saPipeSecurity.bInheritHandle = FALSE; saPipeSecurity.bInheritHandle = FALSE;
if ((hPipe= CreateNamedPipe(pipe_name, if ((hPipe= CreateNamedPipe(pipe_name,
PIPE_ACCESS_DUPLEX|FILE_FLAG_OVERLAPPED, PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED | FILE_FLAG_FIRST_PIPE_INSTANCE,
PIPE_TYPE_BYTE | PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT,
PIPE_READMODE_BYTE | PIPE_UNLIMITED_INSTANCES,
PIPE_WAIT, (int) global_system_variables.net_buffer_length,
PIPE_UNLIMITED_INSTANCES, (int) global_system_variables.net_buffer_length,
(int) global_system_variables.net_buffer_length, NMPWAIT_USE_DEFAULT_WAIT,
(int) global_system_variables.net_buffer_length, &saPipeSecurity)) == INVALID_HANDLE_VALUE)
NMPWAIT_USE_DEFAULT_WAIT, {
&saPipeSecurity)) == INVALID_HANDLE_VALUE) sql_perror("Create named pipe failed");
{ unireg_abort(1);
LPVOID lpMsgBuf; }
int error=GetLastError();
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM,
NULL, error, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &lpMsgBuf, 0, NULL );
sql_perror((char *)lpMsgBuf);
LocalFree(lpMsgBuf);
unireg_abort(1);
}
} }
#endif #endif

View File

@ -10999,8 +10999,10 @@ get_quick_keys(PARAM *param,QUICK_RANGE_SELECT *quick,KEY_PART *key,
KEY *table_key=quick->head->key_info+quick->index; KEY *table_key=quick->head->key_info+quick->index;
flag=EQ_RANGE; flag=EQ_RANGE;
if ((table_key->flags & HA_NOSAME) && if ((table_key->flags & HA_NOSAME) &&
min_part == key_tree->part &&
key_tree->part == table_key->user_defined_key_parts-1) key_tree->part == table_key->user_defined_key_parts-1)
{ {
DBUG_ASSERT(min_part == max_part);
if ((table_key->flags & HA_NULL_PART_KEY) && if ((table_key->flags & HA_NULL_PART_KEY) &&
null_part_in_key(key, null_part_in_key(key,
param->min_key, param->min_key,

View File

@ -1,4 +1,4 @@
/* Copyright (c) 2000, 2015, Oracle and/or its affiliates. /* Copyright (c) 2000, 2016, Oracle and/or its affiliates.
Copyright (c) 2010, 2016, MariaDB Copyright (c) 2010, 2016, MariaDB
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
@ -4862,6 +4862,15 @@ handle_view(THD *thd, Query_tables_list *prelocking_ctx,
&table_list->view->sroutines_list, &table_list->view->sroutines_list,
table_list->top_table()); table_list->top_table());
} }
/*
If a trigger was defined on one of the associated tables then assign the
'trg_event_map' value of the view to the next table in table_list. When a
Stored function is invoked, all the associated tables including the tables
associated with the trigger are prelocked.
*/
if (table_list->trg_event_map && table_list->next_global)
table_list->next_global->trg_event_map= table_list->trg_event_map;
return FALSE; return FALSE;
} }

View File

@ -3281,6 +3281,7 @@ bool Delayed_insert::handle_inserts(void)
max_rows= 0; // For DBUG output max_rows= 0; // For DBUG output
#endif #endif
/* Remove all not used rows */ /* Remove all not used rows */
mysql_mutex_lock(&mutex);
while ((row=rows.get())) while ((row=rows.get()))
{ {
if (table->s->blob_fields) if (table->s->blob_fields)
@ -3297,7 +3298,6 @@ bool Delayed_insert::handle_inserts(void)
} }
DBUG_PRINT("error", ("dropped %lu rows after an error", max_rows)); DBUG_PRINT("error", ("dropped %lu rows after an error", max_rows));
thread_safe_increment(delayed_insert_errors, &LOCK_delayed_status); thread_safe_increment(delayed_insert_errors, &LOCK_delayed_status);
mysql_mutex_lock(&mutex);
DBUG_RETURN(1); DBUG_RETURN(1);
} }
#endif /* EMBEDDED_LIBRARY */ #endif /* EMBEDDED_LIBRARY */

View File

@ -1405,7 +1405,7 @@ READ_INFO::READ_INFO(File file_par, uint tot_length, CHARSET_INFO *cs,
set_if_bigger(length,line_start.length()); set_if_bigger(length,line_start.length());
stack=stack_pos=(int*) sql_alloc(sizeof(int)*length); stack=stack_pos=(int*) sql_alloc(sizeof(int)*length);
if (!(buffer=(uchar*) my_malloc(buff_length+1,MYF(MY_THREAD_SPECIFIC)))) if (!(buffer=(uchar*) my_malloc(buff_length+1,MYF(MY_WME | MY_THREAD_SPECIFIC))))
error=1; /* purecov: inspected */ error=1; /* purecov: inspected */
else else
{ {
@ -1597,37 +1597,50 @@ int READ_INFO::read_field()
} }
} }
#ifdef USE_MB #ifdef USE_MB
if (my_mbcharlen(read_charset, chr) > 1 && uint ml= my_mbcharlen(read_charset, chr);
to + my_mbcharlen(read_charset, chr) <= end_of_buff) if (ml == 0)
{
uchar* p= to;
int ml, i;
*to++ = chr;
ml= my_mbcharlen(read_charset, chr);
for (i= 1; i < ml; i++)
{ {
chr= GET; *to= '\0';
if (chr == my_b_EOF) my_error(ER_INVALID_CHARACTER_STRING, MYF(0),
{ read_charset->csname, buffer);
/* error= true;
Need to back up the bytes already ready from illformed return 1;
multi-byte char
*/
to-= i;
goto found_eof;
}
*to++ = chr;
} }
if (my_ismbchar(read_charset,
if (ml > 1 &&
to + ml <= end_of_buff)
{
uchar* p= to;
*to++ = chr;
for (uint i= 1; i < ml; i++)
{
chr= GET;
if (chr == my_b_EOF)
{
/*
Need to back up the bytes already ready from illformed
multi-byte char
*/
to-= i;
goto found_eof;
}
*to++ = chr;
}
if (my_ismbchar(read_charset,
(const char *)p, (const char *)p,
(const char *)to)) (const char *)to))
continue; continue;
for (i= 0; i < ml; i++) for (uint i= 0; i < ml; i++)
PUSH(*--to); PUSH(*--to);
chr= GET; chr= GET;
} }
else if (ml > 1)
{
// Buffer is too small, exit while loop, and reallocate.
PUSH(chr);
break;
}
#endif #endif
*to++ = (uchar) chr; *to++ = (uchar) chr;
} }
@ -1871,7 +1884,15 @@ int READ_INFO::read_value(int delim, String *val)
for (chr= GET; my_tospace(chr) != delim && chr != my_b_EOF;) for (chr= GET; my_tospace(chr) != delim && chr != my_b_EOF;)
{ {
#ifdef USE_MB #ifdef USE_MB
if (my_mbcharlen(read_charset, chr) > 1) uint ml= my_mbcharlen(read_charset, chr);
if (ml == 0)
{
chr= my_b_EOF;
val->length(0);
return chr;
}
if (ml > 1)
{ {
DBUG_PRINT("read_xml",("multi byte")); DBUG_PRINT("read_xml",("multi byte"));
int i, ml= my_mbcharlen(read_charset, chr); int i, ml= my_mbcharlen(read_charset, chr);

View File

@ -2937,68 +2937,8 @@ static uchar *intern_sys_var_ptr(THD* thd, int offset, bool global_lock)
if (!thd->variables.dynamic_variables_ptr || if (!thd->variables.dynamic_variables_ptr ||
(uint)offset > thd->variables.dynamic_variables_head) (uint)offset > thd->variables.dynamic_variables_head)
{ {
uint idx;
mysql_rwlock_rdlock(&LOCK_system_variables_hash); mysql_rwlock_rdlock(&LOCK_system_variables_hash);
sync_dynamic_session_variables(thd, global_lock);
thd->variables.dynamic_variables_ptr= (char*)
my_realloc(thd->variables.dynamic_variables_ptr,
global_variables_dynamic_size,
MYF(MY_WME | MY_FAE | MY_ALLOW_ZERO_PTR));
if (global_lock)
mysql_mutex_lock(&LOCK_global_system_variables);
mysql_mutex_assert_owner(&LOCK_global_system_variables);
memcpy(thd->variables.dynamic_variables_ptr +
thd->variables.dynamic_variables_size,
global_system_variables.dynamic_variables_ptr +
thd->variables.dynamic_variables_size,
global_system_variables.dynamic_variables_size -
thd->variables.dynamic_variables_size);
/*
now we need to iterate through any newly copied 'defaults'
and if it is a string type with MEMALLOC flag, we need to strdup
*/
for (idx= 0; idx < bookmark_hash.records; idx++)
{
sys_var_pluginvar *pi;
sys_var *var;
st_bookmark *v= (st_bookmark*) my_hash_element(&bookmark_hash,idx);
if (v->version <= thd->variables.dynamic_variables_version)
continue; /* already in thd->variables */
if (!(var= intern_find_sys_var(v->key + 1, v->name_len)) ||
!(pi= var->cast_pluginvar()) ||
v->key[0] != plugin_var_bookmark_key(pi->plugin_var->flags))
continue;
/* Here we do anything special that may be required of the data types */
if ((pi->plugin_var->flags & PLUGIN_VAR_TYPEMASK) == PLUGIN_VAR_STR &&
pi->plugin_var->flags & PLUGIN_VAR_MEMALLOC)
{
char **pp= (char**) (thd->variables.dynamic_variables_ptr +
*(int*)(pi->plugin_var + 1));
if ((*pp= *(char**) (global_system_variables.dynamic_variables_ptr +
*(int*)(pi->plugin_var + 1))))
*pp= my_strdup(*pp, MYF(MY_WME|MY_FAE));
}
}
if (global_lock)
mysql_mutex_unlock(&LOCK_global_system_variables);
thd->variables.dynamic_variables_version=
global_system_variables.dynamic_variables_version;
thd->variables.dynamic_variables_head=
global_system_variables.dynamic_variables_head;
thd->variables.dynamic_variables_size=
global_system_variables.dynamic_variables_size;
mysql_rwlock_unlock(&LOCK_system_variables_hash); mysql_rwlock_unlock(&LOCK_system_variables_hash);
} }
DBUG_RETURN((uchar*)thd->variables.dynamic_variables_ptr + offset); DBUG_RETURN((uchar*)thd->variables.dynamic_variables_ptr + offset);
@ -3078,6 +3018,70 @@ void plugin_thdvar_init(THD *thd)
} }
void sync_dynamic_session_variables(THD* thd, bool global_lock)
{
uint idx;
thd->variables.dynamic_variables_ptr= (char*)
my_realloc(thd->variables.dynamic_variables_ptr,
global_variables_dynamic_size,
MYF(MY_WME | MY_FAE | MY_ALLOW_ZERO_PTR));
if (global_lock)
mysql_mutex_lock(&LOCK_global_system_variables);
mysql_mutex_assert_owner(&LOCK_global_system_variables);
memcpy(thd->variables.dynamic_variables_ptr +
thd->variables.dynamic_variables_size,
global_system_variables.dynamic_variables_ptr +
thd->variables.dynamic_variables_size,
global_system_variables.dynamic_variables_size -
thd->variables.dynamic_variables_size);
/*
now we need to iterate through any newly copied 'defaults'
and if it is a string type with MEMALLOC flag, we need to strdup
*/
for (idx= 0; idx < bookmark_hash.records; idx++)
{
sys_var_pluginvar *pi;
sys_var *var;
st_bookmark *v= (st_bookmark*) my_hash_element(&bookmark_hash,idx);
if (v->version <= thd->variables.dynamic_variables_version)
continue; /* already in thd->variables */
if (!(var= intern_find_sys_var(v->key + 1, v->name_len)) ||
!(pi= var->cast_pluginvar()) ||
v->key[0] != plugin_var_bookmark_key(pi->plugin_var->flags))
continue;
/* Here we do anything special that may be required of the data types */
if ((pi->plugin_var->flags & PLUGIN_VAR_TYPEMASK) == PLUGIN_VAR_STR &&
pi->plugin_var->flags & PLUGIN_VAR_MEMALLOC)
{
int offset= ((thdvar_str_t *)(pi->plugin_var))->offset;
char **pp= (char**) (thd->variables.dynamic_variables_ptr + offset);
if (*pp)
*pp= my_strdup(*pp, MYF(MY_WME|MY_FAE));
}
}
if (global_lock)
mysql_mutex_unlock(&LOCK_global_system_variables);
thd->variables.dynamic_variables_version=
global_system_variables.dynamic_variables_version;
thd->variables.dynamic_variables_head=
global_system_variables.dynamic_variables_head;
thd->variables.dynamic_variables_size=
global_system_variables.dynamic_variables_size;
}
/* /*
Unlocks all system variables which hold a reference Unlocks all system variables which hold a reference
*/ */

View File

@ -188,6 +188,8 @@ typedef my_bool (plugin_foreach_func)(THD *thd,
#define plugin_foreach(A,B,C,D) plugin_foreach_with_mask(A,B,C,PLUGIN_IS_READY,D) #define plugin_foreach(A,B,C,D) plugin_foreach_with_mask(A,B,C,PLUGIN_IS_READY,D)
extern bool plugin_foreach_with_mask(THD *thd, plugin_foreach_func *func, extern bool plugin_foreach_with_mask(THD *thd, plugin_foreach_func *func,
int type, uint state_mask, void *arg); int type, uint state_mask, void *arg);
extern void sync_dynamic_session_variables(THD* thd, bool global_lock);
extern bool plugin_dl_foreach(THD *thd, const LEX_STRING *dl, extern bool plugin_dl_foreach(THD *thd, const LEX_STRING *dl,
plugin_foreach_func *func, void *arg); plugin_foreach_func *func, void *arg);
#endif #endif

View File

@ -7409,19 +7409,30 @@ int fill_variables(THD *thd, TABLE_LIST *tables, COND *cond)
const char *wild= lex->wild ? lex->wild->ptr() : NullS; const char *wild= lex->wild ? lex->wild->ptr() : NullS;
enum enum_schema_tables schema_table_idx= enum enum_schema_tables schema_table_idx=
get_schema_table_idx(tables->schema_table); get_schema_table_idx(tables->schema_table);
enum enum_var_type option_type= OPT_SESSION; enum enum_var_type scope= OPT_SESSION;
bool upper_case_names= (schema_table_idx != SCH_VARIABLES); bool upper_case_names= (schema_table_idx != SCH_VARIABLES);
bool sorted_vars= (schema_table_idx == SCH_VARIABLES); bool sorted_vars= (schema_table_idx == SCH_VARIABLES);
if ((sorted_vars && lex->option_type == OPT_GLOBAL) || if ((sorted_vars && lex->option_type == OPT_GLOBAL) ||
schema_table_idx == SCH_GLOBAL_VARIABLES) schema_table_idx == SCH_GLOBAL_VARIABLES)
option_type= OPT_GLOBAL; scope= OPT_GLOBAL;
COND *partial_cond= make_cond_for_info_schema(cond, tables); COND *partial_cond= make_cond_for_info_schema(cond, tables);
mysql_rwlock_rdlock(&LOCK_system_variables_hash); mysql_rwlock_rdlock(&LOCK_system_variables_hash);
res= show_status_array(thd, wild, enumerate_sys_vars(thd, sorted_vars, option_type),
option_type, NULL, "", tables->table, /*
Avoid recursive LOCK_system_variables_hash acquisition in
intern_sys_var_ptr() by pre-syncing dynamic session variables.
*/
if (scope == OPT_SESSION &&
(!thd->variables.dynamic_variables_ptr ||
global_system_variables.dynamic_variables_head >
thd->variables.dynamic_variables_head))
sync_dynamic_session_variables(thd, true);
res= show_status_array(thd, wild, enumerate_sys_vars(thd, sorted_vars, scope),
scope, NULL, "", tables->table,
upper_case_names, partial_cond); upper_case_names, partial_cond);
mysql_rwlock_unlock(&LOCK_system_variables_hash); mysql_rwlock_unlock(&LOCK_system_variables_hash);
DBUG_RETURN(res); DBUG_RETURN(res);

View File

@ -893,6 +893,12 @@ bool st_select_lex_unit::cleanup()
join->tables_list= 0; join->tables_list= 0;
join->table_count= 0; join->table_count= 0;
join->top_join_tab_count= 0; join->top_join_tab_count= 0;
if (join->tmp_join && join->tmp_join != join)
{
join->tmp_join->tables_list= 0;
join->tmp_join->table_count= 0;
join->tmp_join->top_join_tab_count= 0;
}
} }
error|= fake_select_lex->cleanup(); error|= fake_select_lex->cleanup();
/* /*

View File

@ -3832,14 +3832,16 @@ static bool check_log_path(sys_var *self, THD *thd, set_var *var)
if (!var->save_result.string_value.str) if (!var->save_result.string_value.str)
return true; return true;
if (var->save_result.string_value.length > FN_REFLEN) LEX_STRING *val= &var->save_result.string_value;
if (val->length > FN_REFLEN)
{ // path is too long { // path is too long
my_error(ER_PATH_LENGTH, MYF(0), self->name.str); my_error(ER_PATH_LENGTH, MYF(0), self->name.str);
return true; return true;
} }
char path[FN_REFLEN]; char path[FN_REFLEN];
size_t path_length= unpack_filename(path, var->save_result.string_value.str); size_t path_length= unpack_filename(path, val->str);
if (!path_length) if (!path_length)
return true; return true;
@ -3852,6 +3854,17 @@ static bool check_log_path(sys_var *self, THD *thd, set_var *var)
return true; return true;
} }
static const LEX_CSTRING my_cnf= { STRING_WITH_LEN("my.cnf") };
static const LEX_CSTRING my_ini= { STRING_WITH_LEN("my.ini") };
if (path_length >= my_cnf.length)
{
if (strcasecmp(path + path_length - my_cnf.length, my_cnf.str) == 0)
return true; // log file name ends with "my.cnf"
DBUG_ASSERT(my_cnf.length == my_ini.length);
if (strcasecmp(path + path_length - my_ini.length, my_ini.str) == 0)
return true; // log file name ends with "my.ini"
}
MY_STAT f_stat; MY_STAT f_stat;
if (my_stat(path, &f_stat, MYF(0))) if (my_stat(path, &f_stat, MYF(0)))
@ -3861,9 +3874,9 @@ static bool check_log_path(sys_var *self, THD *thd, set_var *var)
return false; return false;
} }
(void) dirname_part(path, var->save_result.string_value.str, &path_length); (void) dirname_part(path, val->str, &path_length);
if (var->save_result.string_value.length - path_length >= FN_LEN) if (val->length - path_length >= FN_LEN)
{ // filename is too long { // filename is too long
my_error(ER_PATH_LENGTH, MYF(0), self->name.str); my_error(ER_PATH_LENGTH, MYF(0), self->name.str);
return true; return true;

View File

@ -479,20 +479,13 @@ os_atomic_test_and_set(volatile lock_word_t* ptr)
} }
/** Do an atomic release. /** Do an atomic release.
In theory __sync_lock_release should be used to release the lock.
Unfortunately, it does not work properly alone. The workaround is
that more conservative __sync_lock_test_and_set is used instead.
Performance regression was observed at some conditions for Intel
architecture. Disable release barrier on Intel architecture for now.
@param[in,out] ptr Memory location to write to @param[in,out] ptr Memory location to write to
@return the previous value */ @return the previous value */
inline inline
lock_word_t void
os_atomic_clear(volatile lock_word_t* ptr) os_atomic_clear(volatile lock_word_t* ptr)
{ {
return(__sync_lock_test_and_set(ptr, 0)); __sync_lock_release(ptr);
} }
# elif defined(HAVE_IB_GCC_ATOMIC_TEST_AND_SET) # elif defined(HAVE_IB_GCC_ATOMIC_TEST_AND_SET)
@ -861,7 +854,7 @@ for synchronization */
architecture. Disable memory barrier for Intel architecture for now. */ architecture. Disable memory barrier for Intel architecture for now. */
# define os_rmb do { } while(0) # define os_rmb do { } while(0)
# define os_wmb do { } while(0) # define os_wmb do { } while(0)
# define os_isync do { } while(0) # define os_mb do { } while(0)
# define IB_MEMORY_BARRIER_STARTUP_MSG \ # define IB_MEMORY_BARRIER_STARTUP_MSG \
"Memory barrier is not used" "Memory barrier is not used"
#elif defined(HAVE_IB_GCC_ATOMIC_THREAD_FENCE) #elif defined(HAVE_IB_GCC_ATOMIC_THREAD_FENCE)

View File

@ -178,6 +178,11 @@ mutex_exit_func(
to wake up possible hanging threads if to wake up possible hanging threads if
they are missed in mutex_signal_object. */ they are missed in mutex_signal_object. */
/* We add a memory barrier to prevent reading of the
number of waiters before releasing the lock. */
os_mb;
if (mutex_get_waiters(mutex) != 0) { if (mutex_get_waiters(mutex) != 0) {
mutex_signal_object(mutex); mutex_signal_object(mutex);

View File

@ -1055,6 +1055,26 @@ use_heap:
insert_rec = rec_copy(insert_buf, rec, offsets); insert_rec = rec_copy(insert_buf, rec, offsets);
rec_offs_make_valid(insert_rec, index, offsets); rec_offs_make_valid(insert_rec, index, offsets);
/* This is because assertion below is debug assertion */
#ifdef UNIV_DEBUG
if (UNIV_UNLIKELY(current_rec == insert_rec)) {
ulint extra_len, data_len;
extra_len = rec_offs_extra_size(offsets);
data_len = rec_offs_data_size(offsets);
fprintf(stderr, "InnoDB: Error: current_rec == insert_rec "
" extra_len %lu data_len %lu insert_buf %p rec %p\n",
extra_len, data_len, insert_buf, rec);
fprintf(stderr, "InnoDB; Physical record: \n");
rec_print(stderr, rec, index);
fprintf(stderr, "InnoDB: Inserted record: \n");
rec_print(stderr, insert_rec, index);
fprintf(stderr, "InnoDB: Current record: \n");
rec_print(stderr, current_rec, index);
ut_a(current_rec != insert_rec);
}
#endif /* UNIV_DEBUG */
/* 4. Insert the record in the linked list of records */ /* 4. Insert the record in the linked list of records */
ut_ad(current_rec != insert_rec); ut_ad(current_rec != insert_rec);

View File

@ -1454,6 +1454,7 @@ int ha_myisam::enable_indexes(uint mode)
else if (mode == HA_KEY_SWITCH_NONUNIQ_SAVE) else if (mode == HA_KEY_SWITCH_NONUNIQ_SAVE)
{ {
THD *thd= table->in_use; THD *thd= table->in_use;
int was_error= thd->is_error();
HA_CHECK &param= *(HA_CHECK*) thd->alloc(sizeof(param)); HA_CHECK &param= *(HA_CHECK*) thd->alloc(sizeof(param));
const char *save_proc_info=thd->proc_info; const char *save_proc_info=thd->proc_info;
@ -1499,7 +1500,7 @@ int ha_myisam::enable_indexes(uint mode)
might have been set by the first repair. They can still be seen might have been set by the first repair. They can still be seen
with SHOW WARNINGS then. with SHOW WARNINGS then.
*/ */
if (! error) if (! error && ! was_error)
thd->clear_error(); thd->clear_error();
} }
info(HA_STATUS_CONST); info(HA_STATUS_CONST);

View File

@ -11,8 +11,8 @@ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with You should have received a copy of the GNU General Public License along with
this program; if not, write to the Free Software Foundation, Inc., 59 Temple this program; if not, write to the Free Software Foundation, Inc., 51 Franklin
Place, Suite 330, Boston, MA 02111-1307 USA Street, Fifth Floor, Boston, MA 02110-1301, USA
*****************************************************************************/ *****************************************************************************/

View File

@ -530,20 +530,13 @@ os_atomic_test_and_set(volatile lock_word_t* ptr)
} }
/** Do an atomic release. /** Do an atomic release.
In theory __sync_lock_release should be used to release the lock.
Unfortunately, it does not work properly alone. The workaround is
that more conservative __sync_lock_test_and_set is used instead.
Performance regression was observed at some conditions for Intel
architecture. Disable release barrier on Intel architecture for now.
@param[in,out] ptr Memory location to write to @param[in,out] ptr Memory location to write to
@return the previous value */ @return the previous value */
inline inline
lock_word_t void
os_atomic_clear(volatile lock_word_t* ptr) os_atomic_clear(volatile lock_word_t* ptr)
{ {
return(__sync_lock_test_and_set(ptr, 0)); __sync_lock_release(ptr);
} }
# elif defined(HAVE_IB_GCC_ATOMIC_TEST_AND_SET) # elif defined(HAVE_IB_GCC_ATOMIC_TEST_AND_SET)
@ -912,7 +905,7 @@ for synchronization */
architecture. Disable memory barrier for Intel architecture for now. */ architecture. Disable memory barrier for Intel architecture for now. */
# define os_rmb do { } while(0) # define os_rmb do { } while(0)
# define os_wmb do { } while(0) # define os_wmb do { } while(0)
# define os_isync do { } while(0) # define os_mb do { } while(0)
# define IB_MEMORY_BARRIER_STARTUP_MSG \ # define IB_MEMORY_BARRIER_STARTUP_MSG \
"Memory barrier is not used" "Memory barrier is not used"
#elif defined(HAVE_IB_GCC_ATOMIC_THREAD_FENCE) #elif defined(HAVE_IB_GCC_ATOMIC_THREAD_FENCE)

View File

@ -181,6 +181,11 @@ mutex_exit_func(
to wake up possible hanging threads if to wake up possible hanging threads if
they are missed in mutex_signal_object. */ they are missed in mutex_signal_object. */
/* We add a memory barrier to prevent reading of the
number of waiters before releasing the lock. */
os_mb;
if (mutex_get_waiters(mutex) != 0) { if (mutex_get_waiters(mutex) != 0) {
mutex_signal_object(mutex); mutex_signal_object(mutex);

View File

@ -11,8 +11,8 @@ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with You should have received a copy of the GNU General Public License along with
this program; if not, write to the Free Software Foundation, Inc., 59 Temple this program; if not, write to the Free Software Foundation, Inc., 51 Franklin
Place, Suite 330, Boston, MA 02111-1307 USA Street, Fifth Floor, Boston, MA 02110-1301, USA
*****************************************************************************/ *****************************************************************************/

View File

@ -1055,6 +1055,26 @@ use_heap:
insert_rec = rec_copy(insert_buf, rec, offsets); insert_rec = rec_copy(insert_buf, rec, offsets);
rec_offs_make_valid(insert_rec, index, offsets); rec_offs_make_valid(insert_rec, index, offsets);
/* This is because assertion below is debug assertion */
#ifdef UNIV_DEBUG
if (UNIV_UNLIKELY(current_rec == insert_rec)) {
ulint extra_len, data_len;
extra_len = rec_offs_extra_size(offsets);
data_len = rec_offs_data_size(offsets);
fprintf(stderr, "InnoDB: Error: current_rec == insert_rec "
" extra_len %lu data_len %lu insert_buf %p rec %p\n",
extra_len, data_len, insert_buf, rec);
fprintf(stderr, "InnoDB; Physical record: \n");
rec_print(stderr, rec, index);
fprintf(stderr, "InnoDB: Inserted record: \n");
rec_print(stderr, insert_rec, index);
fprintf(stderr, "InnoDB: Current record: \n");
rec_print(stderr, current_rec, index);
ut_a(current_rec != insert_rec);
}
#endif /* UNIV_DEBUG */
/* 4. Insert the record in the linked list of records */ /* 4. Insert the record in the linked list of records */
ut_ad(current_rec != insert_rec); ut_ad(current_rec != insert_rec);