Merge branch '10.4' into 10.5

This commit is contained in:
Oleksandr Byelkin 2020-11-01 14:26:15 +01:00
commit 8e1e2856f2
61 changed files with 1124 additions and 154 deletions

View file

@ -18,7 +18,7 @@
#include "client_priv.h" #include "client_priv.h"
#include <sslopt-vars.h> #include <sslopt-vars.h>
#include "../scripts/mysql_fix_privilege_tables_sql.c" #include <../scripts/mysql_fix_privilege_tables_sql.c>
#include <welcome_copyright_notice.h> /* ORACLE_WELCOME_COPYRIGHT_NOTICE */ #include <welcome_copyright_notice.h> /* ORACLE_WELCOME_COPYRIGHT_NOTICE */

View file

@ -1443,7 +1443,7 @@ out:
void backup_fix_ddl(void); void backup_fix_ddl(void);
static lsn_t get_current_lsn(MYSQL *connection) lsn_t get_current_lsn(MYSQL *connection)
{ {
static const char lsn_prefix[] = "\nLog sequence number "; static const char lsn_prefix[] = "\nLog sequence number ";
lsn_t lsn = 0; lsn_t lsn = 0;

View file

@ -3,6 +3,7 @@
#define XTRABACKUP_BACKUP_COPY_H #define XTRABACKUP_BACKUP_COPY_H
#include <my_global.h> #include <my_global.h>
#include <mysql.h>
#include "datasink.h" #include "datasink.h"
/* special files */ /* special files */
@ -48,4 +49,7 @@ is_path_separator(char);
bool bool
directory_exists(const char *dir, bool create); directory_exists(const char *dir, bool create);
lsn_t
get_current_lsn(MYSQL *connection);
#endif #endif

View file

@ -2502,6 +2502,8 @@ static my_bool xtrabackup_copy_datafile(fil_node_t *node, uint thread_n,
return(FALSE); return(FALSE);
} }
memset(&write_filt_ctxt, 0, sizeof(xb_write_filt_ctxt_t));
bool was_dropped; bool was_dropped;
pthread_mutex_lock(&backup_mutex); pthread_mutex_lock(&backup_mutex);
was_dropped = (ddl_tracker.drops.find(node->space->id) != ddl_tracker.drops.end()); was_dropped = (ddl_tracker.drops.find(node->space->id) != ddl_tracker.drops.end());
@ -2533,7 +2535,6 @@ static my_bool xtrabackup_copy_datafile(fil_node_t *node, uint thread_n,
sizeof dst_name - 1); sizeof dst_name - 1);
dst_name[sizeof dst_name - 1] = '\0'; dst_name[sizeof dst_name - 1] = '\0';
memset(&write_filt_ctxt, 0, sizeof(xb_write_filt_ctxt_t));
ut_a(write_filter.process != NULL); ut_a(write_filter.process != NULL);
if (write_filter.init != NULL && if (write_filter.init != NULL &&
@ -2867,8 +2868,14 @@ static void dbug_mariabackup_event(const char *event,const char *key)
} }
#define DBUG_MARIABACKUP_EVENT(A, B) DBUG_EXECUTE_IF("mariabackup_events", dbug_mariabackup_event(A,B);); #define DBUG_MARIABACKUP_EVENT(A, B) DBUG_EXECUTE_IF("mariabackup_events", dbug_mariabackup_event(A,B););
#define DBUG_MB_INJECT_CODE(EVENT, KEY, CODE) \
DBUG_EXECUTE_IF("mariabackup_inject_code", {\
char *env = getenv(EVENT); \
if (env && !strcmp(env, KEY)) { CODE } \
})
#else #else
#define DBUG_MARIABACKUP_EVENT(A,B) #define DBUG_MARIABACKUP_EVENT(A,B)
#define DBUG_MB_INJECT_CODE(EVENT, KEY, CODE)
#endif #endif
/************************************************************************** /**************************************************************************
@ -2893,6 +2900,8 @@ DECLARE_THREAD(data_copy_thread_func)(
while ((node = datafiles_iter_next(ctxt->it)) != NULL) { while ((node = datafiles_iter_next(ctxt->it)) != NULL) {
DBUG_MARIABACKUP_EVENT("before_copy", node->space->name); DBUG_MARIABACKUP_EVENT("before_copy", node->space->name);
DBUG_MB_INJECT_CODE("wait_innodb_redo_before_copy", node->space->name,
backup_wait_for_lsn(get_current_lsn(mysql_connection)););
/* copy the datafile */ /* copy the datafile */
if (xtrabackup_copy_datafile(node, num, NULL, if (xtrabackup_copy_datafile(node, num, NULL,
xtrabackup_incremental ? wf_incremental : wf_write_through)) xtrabackup_incremental ? wf_incremental : wf_write_through))

View file

@ -333,7 +333,7 @@ static my_bool emb_read_query_result(MYSQL *mysql)
static int emb_stmt_execute(MYSQL_STMT *stmt) static int emb_stmt_execute(MYSQL_STMT *stmt)
{ {
DBUG_ENTER("emb_stmt_execute"); DBUG_ENTER("emb_stmt_execute");
uchar header[5]; uchar header[9];
THD *thd; THD *thd;
my_bool res; my_bool res;
@ -345,6 +345,7 @@ static int emb_stmt_execute(MYSQL_STMT *stmt)
int4store(header, stmt->stmt_id); int4store(header, stmt->stmt_id);
header[4]= (uchar) stmt->flags; header[4]= (uchar) stmt->flags;
header[5]= header[6]= header[7]= header[8]= 0; // safety
thd= (THD*)stmt->mysql->thd; thd= (THD*)stmt->mysql->thd;
thd->client_param_count= stmt->param_count; thd->client_param_count= stmt->param_count;
thd->client_params= stmt->params; thd->client_params= stmt->params;

View file

@ -0,0 +1,7 @@
source include/have_innodb.inc;
if (!`select count(*) from information_schema.plugins
where plugin_name = 'innodb' and plugin_status = 'active' and
plugin_library is null`) {
skip Need compiled-in InnoDB;
}

View file

@ -1,2 +0,0 @@
TRUE
NULL

View file

@ -24,3 +24,9 @@ SELECT 0 FROM t1 FORCE INDEX FOR GROUP BY(a) WHERE a = 0 OR b = 0 AND c = 0;
0 0
DROP TABLE t1; DROP TABLE t1;
End of 5.6 tests End of 5.6 tests
CREATE TABLE `t` (
`a` varchar(3000) NOT NULL default '',
PRIMARY KEY (`a`)
) ENGINE=BLACKHOLE;
DROP TABLE `t`;
End of 10.1 tests

View file

@ -38,3 +38,19 @@ SELECT 0 FROM t1 FORCE INDEX FOR GROUP BY(a) WHERE a = 0 OR b = 0 AND c = 0;
DROP TABLE t1; DROP TABLE t1;
--echo End of 5.6 tests --echo End of 5.6 tests
#
# MDEV-24017 / bug 53588 test case.
#
# Create long enough index (between 1000 and 3500). 1000 is the old value,
# 3500 is innodb value (see ha_innobase::max_supported_key_length()). Without
# the fix the test will fail with "Specified key was too long" error.
#
CREATE TABLE `t` (
`a` varchar(3000) NOT NULL default '',
PRIMARY KEY (`a`)
) ENGINE=BLACKHOLE;
DROP TABLE `t`;
--echo End of 10.1 tests

View file

@ -0,0 +1,8 @@
create table t1(a int) engine=innodb;
# restart
select * from t1;
a
1
2
5
drop table t1;

View file

@ -0,0 +1,27 @@
source include/have_static_innodb.inc;
source include/not_embedded.inc;
let $datadir= `select @@datadir`;
create table t1(a int) engine=innodb;
source include/shutdown_mysqld.inc;
write_file $MYSQLTEST_VARDIR/tmp/bootstrap_test.sql;
use test;
insert t1 values (1);
start transaction;
insert t1 values (2);
savepoint s1;
insert t1 values (3);
savepoint s2;
insert t1 values (4);
rollback to savepoint s1;
insert t1 values (5);
commit;
EOF
exec $MYSQLD_BOOTSTRAP_CMD --datadir=$datadir --innodb < $MYSQLTEST_VARDIR/tmp/bootstrap_test.sql >> $MYSQLTEST_VARDIR/tmp/bootstrap.log 2>&1;
remove_file $MYSQLTEST_VARDIR/tmp/bootstrap_test.sql;
source include/start_mysqld.inc;
select * from t1;
drop table t1;

View file

@ -1186,13 +1186,13 @@ i count(*) std(e1/e2)
3 4 0.00000000 3 4 0.00000000
select std(s1/s2) from bug22555; select std(s1/s2) from bug22555;
std(s1/s2) std(s1/s2)
0.21328517 0.21325764
select std(o1/o2) from bug22555; select std(o1/o2) from bug22555;
std(o1/o2) std(o1/o2)
0.2132576358664934 0.2132576358664934
select std(e1/e2) from bug22555; select std(e1/e2) from bug22555;
std(e1/e2) std(e1/e2)
0.21328517 0.21325764
set @saved_div_precision_increment=@@div_precision_increment; set @saved_div_precision_increment=@@div_precision_increment;
set div_precision_increment=19; set div_precision_increment=19;
select i, count(*), std(s1/s2) from bug22555 group by i order by i; select i, count(*), std(s1/s2) from bug22555 group by i order by i;

View file

@ -375,8 +375,7 @@ SELECT SLEEP(1000);
connection con1; connection con1;
KILL QUERY ID @id; KILL QUERY ID @id;
connection default; connection default;
SLEEP(1000) ERROR 70100: Query execution was interrupted
1
KILL QUERY ID 0; KILL QUERY ID 0;
ERROR HY000: Unknown query id: 0 ERROR HY000: Unknown query id: 0
# #
@ -392,8 +391,7 @@ ERROR HY000: You are not owner of query ID
connection con1; connection con1;
KILL QUERY ID @id; KILL QUERY ID @id;
connection default; connection default;
SLEEP(1000) ERROR 70100: Query execution was interrupted
1
disconnect con5; disconnect con5;
DROP USER u1@localhost; DROP USER u1@localhost;
SET DEBUG_SYNC = 'RESET'; SET DEBUG_SYNC = 'RESET';

View file

@ -606,6 +606,7 @@ let $wait_condition= SELECT @id:=QUERY_ID FROM INFORMATION_SCHEMA.PROCESSLIST WH
source include/wait_condition.inc; source include/wait_condition.inc;
KILL QUERY ID @id; KILL QUERY ID @id;
connection default; connection default;
--error ER_QUERY_INTERRUPTED
reap; reap;
--error ER_NO_SUCH_QUERY --error ER_NO_SUCH_QUERY
@ -632,6 +633,7 @@ connection con1;
KILL QUERY ID @id; KILL QUERY ID @id;
connection default; connection default;
--error ER_QUERY_INTERRUPTED
reap; reap;
disconnect con5; disconnect con5;
DROP USER u1@localhost; DROP USER u1@localhost;

View file

@ -0,0 +1,231 @@
create database mysqltest1;
create database mysqltest2;
create database mysqltest3;
create user invoker@localhost;
create user definer@localhost;
grant select,show view on mysqltest1.* to invoker@localhost;
grant select,show view on mysqltest1.* to definer@localhost;
grant select,show view on mysqltest2.* to invoker@localhost;
grant select,show view on mysqltest2.* to definer@localhost;
grant select,show view on mysqltest3.* to invoker@localhost;
grant select on performance_schema.* to definer@localhost;
create table mysqltest1.t1 (a int);
create definer=definer@localhost view mysqltest2.v2 as select * from mysqltest1.t1;
create definer=definer@localhost view mysqltest3.v3 as select * from mysqltest2.v2;
create definer=definer@localhost view mysqltest3.v3is as select schema_name from information_schema.schemata order by schema_name;
create definer=definer@localhost view mysqltest3.v3ps as select user from performance_schema.users where current_connections>0 order by user;
create definer=definer@localhost view mysqltest3.v3nt as select 1;
create definer=definer@localhost sql security invoker view mysqltest3.v3i as select * from mysqltest1.t1;
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqltest1` /*!40100 DEFAULT CHARACTER SET latin1 */;
USE `mysqltest1`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t1` (
`a` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqltest2` /*!40100 DEFAULT CHARACTER SET latin1 */;
USE `mysqltest2`;
SET @saved_cs_client = @@character_set_client;
SET character_set_client = utf8;
/*!50001 CREATE TABLE `v2` (
`a` tinyint NOT NULL
) ENGINE=MyISAM */;
SET character_set_client = @saved_cs_client;
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqltest3` /*!40100 DEFAULT CHARACTER SET latin1 */;
USE `mysqltest3`;
SET @saved_cs_client = @@character_set_client;
SET character_set_client = utf8;
/*!50001 CREATE TABLE `v3` (
`a` tinyint NOT NULL
) ENGINE=MyISAM */;
SET character_set_client = @saved_cs_client;
SET @saved_cs_client = @@character_set_client;
SET character_set_client = utf8;
/*!50001 CREATE TABLE `v3i` (
`a` tinyint NOT NULL
) ENGINE=MyISAM */;
SET character_set_client = @saved_cs_client;
SET @saved_cs_client = @@character_set_client;
SET character_set_client = utf8;
/*!50001 CREATE TABLE `v3is` (
`schema_name` tinyint NOT NULL
) ENGINE=MyISAM */;
SET character_set_client = @saved_cs_client;
SET @saved_cs_client = @@character_set_client;
SET character_set_client = utf8;
/*!50001 CREATE TABLE `v3nt` (
`1` tinyint NOT NULL
) ENGINE=MyISAM */;
SET character_set_client = @saved_cs_client;
SET @saved_cs_client = @@character_set_client;
SET character_set_client = utf8;
/*!50001 CREATE TABLE `v3ps` (
`user` tinyint NOT NULL
) ENGINE=MyISAM */;
SET character_set_client = @saved_cs_client;
USE `mysqltest1`;
USE `mysqltest2`;
/*!50001 DROP TABLE IF EXISTS `v2`*/;
/*!50001 SET @saved_cs_client = @@character_set_client */;
/*!50001 SET @saved_cs_results = @@character_set_results */;
/*!50001 SET @saved_col_connection = @@collation_connection */;
/*!50001 SET character_set_client = latin1 */;
/*!50001 SET character_set_results = latin1 */;
/*!50001 SET collation_connection = latin1_swedish_ci */;
/*!50001 CREATE ALGORITHM=UNDEFINED */
/*!50013 DEFINER=`definer`@`localhost` SQL SECURITY DEFINER */
/*!50001 VIEW `v2` AS select `mysqltest1`.`t1`.`a` AS `a` from `mysqltest1`.`t1` */;
/*!50001 SET character_set_client = @saved_cs_client */;
/*!50001 SET character_set_results = @saved_cs_results */;
/*!50001 SET collation_connection = @saved_col_connection */;
USE `mysqltest3`;
/*!50001 DROP TABLE IF EXISTS `v3`*/;
/*!50001 SET @saved_cs_client = @@character_set_client */;
/*!50001 SET @saved_cs_results = @@character_set_results */;
/*!50001 SET @saved_col_connection = @@collation_connection */;
/*!50001 SET character_set_client = latin1 */;
/*!50001 SET character_set_results = latin1 */;
/*!50001 SET collation_connection = latin1_swedish_ci */;
/*!50001 CREATE ALGORITHM=UNDEFINED */
/*!50013 DEFINER=`definer`@`localhost` SQL SECURITY DEFINER */
/*!50001 VIEW `v3` AS select `v2`.`a` AS `a` from `mysqltest2`.`v2` */;
/*!50001 SET character_set_client = @saved_cs_client */;
/*!50001 SET character_set_results = @saved_cs_results */;
/*!50001 SET collation_connection = @saved_col_connection */;
/*!50001 DROP TABLE IF EXISTS `v3i`*/;
/*!50001 SET @saved_cs_client = @@character_set_client */;
/*!50001 SET @saved_cs_results = @@character_set_results */;
/*!50001 SET @saved_col_connection = @@collation_connection */;
/*!50001 SET character_set_client = latin1 */;
/*!50001 SET character_set_results = latin1 */;
/*!50001 SET collation_connection = latin1_swedish_ci */;
/*!50001 CREATE ALGORITHM=UNDEFINED */
/*!50013 DEFINER=`definer`@`localhost` SQL SECURITY INVOKER */
/*!50001 VIEW `v3i` AS select `mysqltest1`.`t1`.`a` AS `a` from `mysqltest1`.`t1` */;
/*!50001 SET character_set_client = @saved_cs_client */;
/*!50001 SET character_set_results = @saved_cs_results */;
/*!50001 SET collation_connection = @saved_col_connection */;
/*!50001 DROP TABLE IF EXISTS `v3is`*/;
/*!50001 SET @saved_cs_client = @@character_set_client */;
/*!50001 SET @saved_cs_results = @@character_set_results */;
/*!50001 SET @saved_col_connection = @@collation_connection */;
/*!50001 SET character_set_client = latin1 */;
/*!50001 SET character_set_results = latin1 */;
/*!50001 SET collation_connection = latin1_swedish_ci */;
/*!50001 CREATE ALGORITHM=UNDEFINED */
/*!50013 DEFINER=`definer`@`localhost` SQL SECURITY DEFINER */
/*!50001 VIEW `v3is` AS select `information_schema`.`schemata`.`SCHEMA_NAME` AS `schema_name` from `information_schema`.`schemata` order by `information_schema`.`schemata`.`SCHEMA_NAME` */;
/*!50001 SET character_set_client = @saved_cs_client */;
/*!50001 SET character_set_results = @saved_cs_results */;
/*!50001 SET collation_connection = @saved_col_connection */;
/*!50001 DROP TABLE IF EXISTS `v3nt`*/;
/*!50001 SET @saved_cs_client = @@character_set_client */;
/*!50001 SET @saved_cs_results = @@character_set_results */;
/*!50001 SET @saved_col_connection = @@collation_connection */;
/*!50001 SET character_set_client = latin1 */;
/*!50001 SET character_set_results = latin1 */;
/*!50001 SET collation_connection = latin1_swedish_ci */;
/*!50001 CREATE ALGORITHM=UNDEFINED */
/*!50013 DEFINER=`definer`@`localhost` SQL SECURITY DEFINER */
/*!50001 VIEW `v3nt` AS select 1 AS `1` */;
/*!50001 SET character_set_client = @saved_cs_client */;
/*!50001 SET character_set_results = @saved_cs_results */;
/*!50001 SET collation_connection = @saved_col_connection */;
/*!50001 DROP TABLE IF EXISTS `v3ps`*/;
/*!50001 SET @saved_cs_client = @@character_set_client */;
/*!50001 SET @saved_cs_results = @@character_set_results */;
/*!50001 SET @saved_col_connection = @@collation_connection */;
/*!50001 SET character_set_client = latin1 */;
/*!50001 SET character_set_results = latin1 */;
/*!50001 SET collation_connection = latin1_swedish_ci */;
/*!50001 CREATE ALGORITHM=UNDEFINED */
/*!50013 DEFINER=`definer`@`localhost` SQL SECURITY DEFINER */
/*!50001 VIEW `v3ps` AS select `performance_schema`.`users`.`USER` AS `user` from `performance_schema`.`users` where `performance_schema`.`users`.`CURRENT_CONNECTIONS` > 0 order by `performance_schema`.`users`.`USER` */;
/*!50001 SET character_set_client = @saved_cs_client */;
/*!50001 SET character_set_results = @saved_cs_results */;
/*!50001 SET collation_connection = @saved_col_connection */;
connect inv,localhost,invoker;
lock table mysqltest3.v3 write;
ERROR 42000: Access denied for user 'invoker'@'localhost' to database 'mysqltest3'
disconnect inv;
connection default;
grant lock tables on mysqltest3.* to invoker@localhost;
connect inv,localhost,invoker;
show create view mysqltest3.v3;
View Create View character_set_client collation_connection
v3 CREATE ALGORITHM=UNDEFINED DEFINER=`definer`@`localhost` SQL SECURITY DEFINER VIEW `mysqltest3`.`v3` AS select `v2`.`a` AS `a` from `mysqltest2`.`v2` latin1 latin1_swedish_ci
show create view mysqltest3.v3is;
View Create View character_set_client collation_connection
v3is CREATE ALGORITHM=UNDEFINED DEFINER=`definer`@`localhost` SQL SECURITY DEFINER VIEW `mysqltest3`.`v3is` AS select `information_schema`.`schemata`.`SCHEMA_NAME` AS `schema_name` from `information_schema`.`schemata` order by `information_schema`.`schemata`.`SCHEMA_NAME` latin1 latin1_swedish_ci
show create view mysqltest3.v3ps;
View Create View character_set_client collation_connection
v3ps CREATE ALGORITHM=UNDEFINED DEFINER=`definer`@`localhost` SQL SECURITY DEFINER VIEW `mysqltest3`.`v3ps` AS select `performance_schema`.`users`.`USER` AS `user` from `performance_schema`.`users` where `performance_schema`.`users`.`CURRENT_CONNECTIONS` > 0 order by `performance_schema`.`users`.`USER` latin1 latin1_swedish_ci
show create view mysqltest3.v3nt;
View Create View character_set_client collation_connection
v3nt CREATE ALGORITHM=UNDEFINED DEFINER=`definer`@`localhost` SQL SECURITY DEFINER VIEW `mysqltest3`.`v3nt` AS select 1 AS `1` latin1 latin1_swedish_ci
show create view mysqltest3.v3i;
View Create View character_set_client collation_connection
v3i CREATE ALGORITHM=UNDEFINED DEFINER=`definer`@`localhost` SQL SECURITY INVOKER VIEW `mysqltest3`.`v3i` AS select `mysqltest1`.`t1`.`a` AS `a` from `mysqltest1`.`t1` latin1 latin1_swedish_ci
lock table mysqltest3.v3 write;
ERROR HY000: View 'mysqltest3.v3' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them
lock table mysqltest3.v3i write;
ERROR HY000: View 'mysqltest3.v3i' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them
lock table mysqltest3.v3is write;
select * from mysqltest3.v3is;
schema_name
information_schema
mysqltest1
mysqltest2
performance_schema
test
lock table mysqltest3.v3ps write;
select * from mysqltest3.v3ps;
user
NULL
invoker
root
lock table mysqltest3.v3nt write;
select * from mysqltest3.v3nt;
1
1
disconnect inv;
connection default;
grant lock tables on mysqltest2.* to invoker@localhost;
connect inv,localhost,invoker;
lock table mysqltest3.v3 write;
ERROR HY000: View 'mysqltest3.v3' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them
lock table mysqltest3.v3i write;
ERROR HY000: View 'mysqltest3.v3i' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them
disconnect inv;
connection default;
grant lock tables on mysqltest1.* to definer@localhost;
connect inv,localhost,invoker;
lock table mysqltest3.v3 write;
select * from mysqltest3.v3;
a
lock table mysqltest3.v3i write;
ERROR HY000: View 'mysqltest3.v3i' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them
disconnect inv;
connection default;
grant lock tables on mysqltest1.* to invoker@localhost;
connect inv,localhost,invoker;
lock table mysqltest3.v3i write;
select * from mysqltest3.v3i;
a
disconnect inv;
connection default;
drop user invoker@localhost;
drop user definer@localhost;
drop database mysqltest1;
drop database mysqltest2;
drop database mysqltest3;

View file

@ -0,0 +1,76 @@
source include/not_embedded.inc;
#
# LOCK TABLES and privileges on views
#
create database mysqltest1;
create database mysqltest2;
create database mysqltest3;
create user invoker@localhost;
create user definer@localhost;
grant select,show view on mysqltest1.* to invoker@localhost;
grant select,show view on mysqltest1.* to definer@localhost;
grant select,show view on mysqltest2.* to invoker@localhost;
grant select,show view on mysqltest2.* to definer@localhost;
grant select,show view on mysqltest3.* to invoker@localhost;
grant select on performance_schema.* to definer@localhost;
create table mysqltest1.t1 (a int);
create definer=definer@localhost view mysqltest2.v2 as select * from mysqltest1.t1;
create definer=definer@localhost view mysqltest3.v3 as select * from mysqltest2.v2;
create definer=definer@localhost view mysqltest3.v3is as select schema_name from information_schema.schemata order by schema_name;
create definer=definer@localhost view mysqltest3.v3ps as select user from performance_schema.users where current_connections>0 order by user;
create definer=definer@localhost view mysqltest3.v3nt as select 1;
create definer=definer@localhost sql security invoker view mysqltest3.v3i as select * from mysqltest1.t1;
exec $MYSQL_DUMP --compact -B mysqltest1 mysqltest2 mysqltest3;
connect inv,localhost,invoker;
error ER_DBACCESS_DENIED_ERROR;
lock table mysqltest3.v3 write;
disconnect inv;
connection default;
grant lock tables on mysqltest3.* to invoker@localhost;
connect inv,localhost,invoker;
show create view mysqltest3.v3;
show create view mysqltest3.v3is;
show create view mysqltest3.v3ps;
show create view mysqltest3.v3nt;
show create view mysqltest3.v3i;
error ER_VIEW_INVALID;
lock table mysqltest3.v3 write;
error ER_VIEW_INVALID;
lock table mysqltest3.v3i write;
lock table mysqltest3.v3is write; select * from mysqltest3.v3is;
lock table mysqltest3.v3ps write; select * from mysqltest3.v3ps;
lock table mysqltest3.v3nt write; select * from mysqltest3.v3nt;
disconnect inv;
connection default;
grant lock tables on mysqltest2.* to invoker@localhost;
connect inv,localhost,invoker;
error ER_VIEW_INVALID;
lock table mysqltest3.v3 write;
error ER_VIEW_INVALID;
lock table mysqltest3.v3i write;
disconnect inv;
connection default;
grant lock tables on mysqltest1.* to definer@localhost;
connect inv,localhost,invoker;
lock table mysqltest3.v3 write; select * from mysqltest3.v3;
error ER_VIEW_INVALID;
lock table mysqltest3.v3i write;
disconnect inv;
connection default;
grant lock tables on mysqltest1.* to invoker@localhost;
connect inv,localhost,invoker;
lock table mysqltest3.v3i write; select * from mysqltest3.v3i;
disconnect inv;
connection default;
drop user invoker@localhost;
drop user definer@localhost;
drop database mysqltest1;
drop database mysqltest2;
drop database mysqltest3;

View file

@ -3509,6 +3509,26 @@ NULLIF(GROUP_CONCAT(v1), null)
C C
B B
DROP TABLE t1; DROP TABLE t1;
#
# MDEV-24033: SIGSEGV in __memcmp_avx2_movbe from queue_insert | SIGSEGV in __memcmp_avx2_movbe from native_compare
#
SET @save_max_length_for_sort_data=@@max_length_for_sort_data;
SET @save_max_sort_length= @@max_sort_length;
SET @save_sql_select_limit= @@sql_select_limit;
CREATE TABLE t1 (a DECIMAL(64,0), b INT);
INSERT INTO t1 VALUES (1,1), (2,2), (3,3), (4,4);
SET max_length_for_sort_data= 30;
SET sql_select_limit = 3;
SET max_sort_length=8;
SELECT * FROM t1 ORDER BY a+1;
a b
1 1
2 2
3 3
SET max_length_for_sort_data=@save_max_length_for_sort_data;
SET max_sort_length= @save_max_sort_length;
SET sql_select_limit= @save_sql_select_limit;
DROP TABLE t1;
# End of 10.2 tests # End of 10.2 tests
# #
# MDEV-16214: Incorrect plan taken by the optimizer , uses INDEX instead of ref access with ORDER BY # MDEV-16214: Incorrect plan taken by the optimizer , uses INDEX instead of ref access with ORDER BY

View file

@ -2274,6 +2274,27 @@ ORDER BY id+1 DESC;
DROP TABLE t1; DROP TABLE t1;
--echo #
--echo # MDEV-24033: SIGSEGV in __memcmp_avx2_movbe from queue_insert | SIGSEGV in __memcmp_avx2_movbe from native_compare
--echo #
SET @save_max_length_for_sort_data=@@max_length_for_sort_data;
SET @save_max_sort_length= @@max_sort_length;
SET @save_sql_select_limit= @@sql_select_limit;
CREATE TABLE t1 (a DECIMAL(64,0), b INT);
INSERT INTO t1 VALUES (1,1), (2,2), (3,3), (4,4);
SET max_length_for_sort_data= 30;
SET sql_select_limit = 3;
SET max_sort_length=8;
SELECT * FROM t1 ORDER BY a+1;
SET max_length_for_sort_data=@save_max_length_for_sort_data;
SET max_sort_length= @save_max_sort_length;
SET sql_select_limit= @save_sql_select_limit;
DROP TABLE t1;
--echo # End of 10.2 tests --echo # End of 10.2 tests
--echo # --echo #

View file

@ -1,13 +1,6 @@
--source include/not_embedded.inc --source include/not_embedded.inc
--source include/have_example_plugin.inc --source include/have_example_plugin.inc
--source include/have_innodb.inc --source include/have_static_innodb.inc
if (!`select count(*) from information_schema.plugins
where plugin_name = 'innodb' and plugin_status = 'active' and
plugin_library is null`) {
skip Need compiled-in InnoDB;
}
install plugin example soname 'ha_example'; install plugin example soname 'ha_example';
create table t1(a int) engine=example; create table t1(a int) engine=example;

View file

@ -2180,11 +2180,9 @@ connection extracon2;
KILL QUERY <default_connection_ID>; KILL QUERY <default_connection_ID>;
KILL QUERY <con2_connection_ID>; KILL QUERY <con2_connection_ID>;
connection default; connection default;
sleep(50) ERROR 70100: Query execution was interrupted
1
connection con2; connection con2;
sleep(50) ERROR 70100: Query execution was interrupted
1
connection extracon; connection extracon;
sleep(5.5) sleep(5.5)
0 0

View file

@ -86,8 +86,10 @@ eval KILL QUERY $con1_id;
eval KILL QUERY $con2_id; eval KILL QUERY $con2_id;
connection default; connection default;
--error ER_QUERY_INTERRUPTED
--reap --reap
connection con2; connection con2;
--error ER_QUERY_INTERRUPTED
--reap --reap
connection extracon; connection extracon;

View file

@ -5919,14 +5919,14 @@ view_definition
select 2 / 3 * 3 AS `2 / 3 * 3`,2 / (3 * 3) AS `2 / (3 * 3)`,2 / 3 * 3 AS `(2 / 3) * 3` select 2 / 3 * 3 AS `2 / 3 * 3`,2 / (3 * 3) AS `2 / (3 * 3)`,2 / 3 * 3 AS `(2 / 3) * 3`
select 2 / 3 * 3, 2 / (3 * 3), (2 / 3) * 3 union select * from v1; select 2 / 3 * 3, 2 / (3 * 3), (2 / 3) * 3 union select * from v1;
2 / 3 * 3 2 / (3 * 3) (2 / 3) * 3 2 / 3 * 3 2 / (3 * 3) (2 / 3) * 3
2.0001 0.2222 2.0001 2.0000 0.2222 2.0000
create or replace view v1 as select 2 / 3 / 3, 2 / (3 / 3), (2 / 3) / 3; create or replace view v1 as select 2 / 3 / 3, 2 / (3 / 3), (2 / 3) / 3;
Select view_definition from information_schema.views where table_schema='test' and table_name='v1'; Select view_definition from information_schema.views where table_schema='test' and table_name='v1';
view_definition view_definition
select 2 / 3 / 3 AS `2 / 3 / 3`,2 / (3 / 3) AS `2 / (3 / 3)`,2 / 3 / 3 AS `(2 / 3) / 3` select 2 / 3 / 3 AS `2 / 3 / 3`,2 / (3 / 3) AS `2 / (3 / 3)`,2 / 3 / 3 AS `(2 / 3) / 3`
select 2 / 3 / 3, 2 / (3 / 3), (2 / 3) / 3 union select * from v1; select 2 / 3 / 3, 2 / (3 / 3), (2 / 3) / 3 union select * from v1;
2 / 3 / 3 2 / (3 / 3) (2 / 3) / 3 2 / 3 / 3 2 / (3 / 3) (2 / 3) / 3
0.22223333 2.0000 0.22223333 0.22222222 2.0000 0.22222222
create or replace view v1 as select 2 / 3 DIV 3, 2 / (3 DIV 3), (2 / 3) DIV 3; create or replace view v1 as select 2 / 3 DIV 3, 2 / (3 DIV 3), (2 / 3) DIV 3;
Select view_definition from information_schema.views where table_schema='test' and table_name='v1'; Select view_definition from information_schema.views where table_schema='test' and table_name='v1';
view_definition view_definition

View file

@ -14,3 +14,16 @@ disconnect con1;
connection default; connection default;
SET DEBUG_SYNC = 'RESET'; SET DEBUG_SYNC = 'RESET';
End of 5.5 tests End of 5.5 tests
#
# MDEV-23752: SHOW EXPLAIN FOR thd waits for sleep
#
connect con1,localhost,root,,;
select sleep(100000);;
connection default;
SHOW EXPLAIN FOR con_id;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL No tables used
Warnings:
Note 1003 select sleep(100000)
KILL QUERY con_id;
# End of 10.2 tests

View file

@ -40,3 +40,21 @@ SET DEBUG_SYNC = 'RESET';
source include/wait_until_count_sessions.inc; source include/wait_until_count_sessions.inc;
--echo End of 5.5 tests --echo End of 5.5 tests
--echo #
--echo # MDEV-23752: SHOW EXPLAIN FOR thd waits for sleep
--echo #
--connect (con1,localhost,root,,)
--let $con_id = `SELECT CONNECTION_ID()`
--send select sleep(100000);
--connection default
--replace_result $con_id con_id
eval SHOW EXPLAIN FOR $con_id;
--replace_result $con_id con_id
eval KILL QUERY $con_id;
--echo # End of 10.2 tests

View file

@ -7,9 +7,8 @@ SLEEP(1)
SHOW STATUS LIKE "max_statement_time_exceeded"; SHOW STATUS LIKE "max_statement_time_exceeded";
Variable_name Value Variable_name Value
Max_statement_time_exceeded 0 Max_statement_time_exceeded 0
SET STATEMENT MAX_STATEMENT_TIME=1 FOR SELECT SLEEP(3); SET STATEMENT MAX_STATEMENT_TIME=1 FOR SELECT SLEEP(10);
SLEEP(3) ERROR 70100: Query execution was interrupted (max_statement_time exceeded)
1
SHOW STATUS LIKE "max_statement_time_exceeded"; SHOW STATUS LIKE "max_statement_time_exceeded";
Variable_name Value Variable_name Value
Max_statement_time_exceeded 1 Max_statement_time_exceeded 1

View file

@ -6,7 +6,8 @@
SELECT @@MAX_STATEMENT_TIME; SELECT @@MAX_STATEMENT_TIME;
SET STATEMENT MAX_STATEMENT_TIME=3 FOR SELECT SLEEP(1); SET STATEMENT MAX_STATEMENT_TIME=3 FOR SELECT SLEEP(1);
SHOW STATUS LIKE "max_statement_time_exceeded"; SHOW STATUS LIKE "max_statement_time_exceeded";
SET STATEMENT MAX_STATEMENT_TIME=1 FOR SELECT SLEEP(3); --error ER_STATEMENT_TIMEOUT
SET STATEMENT MAX_STATEMENT_TIME=1 FOR SELECT SLEEP(10);
SHOW STATUS LIKE "max_statement_time_exceeded"; SHOW STATUS LIKE "max_statement_time_exceeded";
SELECT @@MAX_STATEMENT_TIME; SELECT @@MAX_STATEMENT_TIME;

View file

@ -2596,7 +2596,7 @@ SELECT
population, area, population/area, population, area, population/area,
cast(population/area as DECIMAL(20,9)) FROM t1 LIMIT 1; cast(population/area as DECIMAL(20,9)) FROM t1 LIMIT 1;
population area population/area cast(population/area as DECIMAL(20,9)) population area population/area cast(population/area as DECIMAL(20,9))
11797 91 129.6374 129.637400000 11797 91 129.6374 129.637362637
SELECT * FROM t1 A SELECT * FROM t1 A
WHERE population/area = (SELECT MAX(population/area) from t1 B where A.region = B.region); WHERE population/area = (SELECT MAX(population/area) from t1 B where A.region = B.region);
region area population region area population

View file

@ -1532,8 +1532,11 @@ select (1.20396873 * 0.89550000 * 0.68000000 * 1.08721696 * 0.99500000 *
1.01500000 * 1.01500000 * 0.99500000) 1.01500000 * 1.01500000 * 0.99500000)
0.81298807395367312459230693948000000000 0.81298807395367312459230693948000000000
create table t1 as select 5.05 / 0.014; create table t1 as select 5.05 / 0.014;
Warnings:
Note 1265 Data truncated for column '5.05 / 0.014' at row 1
show warnings; show warnings;
Level Code Message Level Code Message
Note 1265 Data truncated for column '5.05 / 0.014' at row 1
show create table t1; show create table t1;
Table Create Table Table Create Table
t1 CREATE TABLE `t1` ( t1 CREATE TABLE `t1` (
@ -1648,6 +1651,8 @@ my_col
0.12345678912345678912345678912345678912 0.12345678912345678912345678912345678912
DROP TABLE t1; DROP TABLE t1;
CREATE TABLE t1 SELECT 1 / .123456789123456789123456789123456789123456789123456789123456789123456789123456789 AS my_col; CREATE TABLE t1 SELECT 1 / .123456789123456789123456789123456789123456789123456789123456789123456789123456789 AS my_col;
Warnings:
Note 1265 Data truncated for column 'my_col' at row 1
DESCRIBE t1; DESCRIBE t1;
Field Type Null Key Default Extra Field Type Null Key Default Extra
my_col decimal(65,4) YES NULL my_col decimal(65,4) YES NULL

View file

@ -91,6 +91,8 @@ DROP INDEX test ON t1;
insert into t1 values (10, 1,1,1,1,1,1,1,1,1,1,1,1,1,NULL,0,0,0,1,1,1,1,'one','one'); insert into t1 values (10, 1,1,1,1,1,1,1,1,1,1,1,1,1,NULL,0,0,0,1,1,1,1,'one','one');
insert into t1 values (NULL,2,2,2,2,2,2,2,2,2,2,2,2,2,NULL,NULL,NULL,NULL,NULL,NULL,2,2,'two','two,one'); insert into t1 values (NULL,2,2,2,2,2,2,2,2,2,2,2,2,2,NULL,NULL,NULL,NULL,NULL,NULL,2,2,'two','two,one');
insert ignore into t1 values (0,1/3,3,3,3,3,3,3,3,3,3,3,3,3,NULL,'19970303','10:10:10','19970303101010','','','','3',3,3); insert ignore into t1 values (0,1/3,3,3,3,3,3,3,3,3,3,3,3,3,NULL,'19970303','10:10:10','19970303101010','','','','3',3,3);
Warnings:
Warning 1265 Data truncated for column 'string' at row 1
insert ignore into t1 values (0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,NULL,19970807,080706,19970403090807,-1,-1,-1,'-1',-1,-1); insert ignore into t1 values (0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,NULL,19970807,080706,19970403090807,-1,-1,-1,'-1',-1,-1);
Warnings: Warnings:
Warning 1264 Out of range value for column 'utiny' at row 1 Warning 1264 Out of range value for column 'utiny' at row 1
@ -128,7 +130,7 @@ select auto,string,tiny,short,medium,long_int,longlong,real_float,real_double,ut
auto string tiny short medium long_int longlong real_float real_double utiny ushort umedium ulong ulonglong mod(floor(time_stamp/1000000),1000000)-mod(curdate(),1000000) date_field time_field date_time blob_col tinyblob_col mediumblob_col longblob_col auto string tiny short medium long_int longlong real_float real_double utiny ushort umedium ulong ulonglong mod(floor(time_stamp/1000000),1000000)-mod(curdate(),1000000) date_field time_field date_time blob_col tinyblob_col mediumblob_col longblob_col
10 1 1 1 1 1 1 1.0 1.0000 1 00001 1 1 1 0 0000-00-00 00:00:00 0000-00-00 00:00:00 1 1 1 1 10 1 1 1 1 1 1 1.0 1.0000 1 00001 1 1 1 0 0000-00-00 00:00:00 0000-00-00 00:00:00 1 1 1 1
11 2 2 2 2 2 2 2.0 2.0000 2 00002 2 2 2 0 NULL NULL NULL NULL NULL 2 2 11 2 2 2 2 2 2 2.0 2.0000 2 00002 2 2 2 0 NULL NULL NULL NULL NULL 2 2
12 0.3333 3 3 3 3 3 3.0 3.0000 3 00003 3 3 3 0 1997-03-03 10:10:10 1997-03-03 10:10:10 3 12 0.33333333 3 3 3 3 3 3.0 3.0000 3 00003 3 3 3 0 1997-03-03 10:10:10 1997-03-03 10:10:10 3
13 -1 -1 -1 -1 -1 -1 -1.0 -1.0000 0 00000 0 0 0 0 1997-08-07 08:07:06 1997-04-03 09:08:07 -1 -1 -1 -1 13 -1 -1 -1 -1 -1 -1 -1.0 -1.0000 0 00000 0 0 0 0 1997-08-07 08:07:06 1997-04-03 09:08:07 -1 -1 -1 -1
14 -429496729 -128 -32768 -8388608 -2147483648 -4294967295 -4294967296.0 -4294967295.0000 0 00000 0 0 0 0 0000-00-00 00:00:00 0000-00-00 00:00:00 -4294967295 -4294967295 -4294967295 -4294967295 14 -429496729 -128 -32768 -8388608 -2147483648 -4294967295 -4294967296.0 -4294967295.0000 0 00000 0 0 0 0 0000-00-00 00:00:00 0000-00-00 00:00:00 -4294967295 -4294967295 -4294967295 -4294967295
15 4294967295 127 32767 8388607 2147483647 4294967295 4294967296.0 4294967295.0000 255 65535 16777215 4294967295 4294967295 0 0000-00-00 00:00:00 0000-00-00 00:00:00 4294967295 4294967295 4294967295 4294967295 15 4294967295 127 32767 8388607 2147483647 4294967295 4294967296.0 4294967295.0000 255 65535 16777215 4294967295 4294967295 0 0000-00-00 00:00:00 0000-00-00 00:00:00 4294967295 4294967295 4294967295 4294967295
@ -180,7 +182,7 @@ Warning 1265 Data truncated for column 'new_field' at row 7
select * from t2; select * from t2;
auto string mediumblob_col new_field auto string mediumblob_col new_field
1 2 2 ne 1 2 2 ne
2 0.3333 ne 2 0.33333333 ne
3 -1 -1 ne 3 -1 -1 ne
4 -429496729 -4294967295 ne 4 -429496729 -4294967295 ne
5 4294967295 4294967295 ne 5 4294967295 4294967295 ne

View file

@ -9,10 +9,16 @@ UPDATE t1 SET f1 = f1 + 10;;
connection node_2; connection node_2;
UPDATE t1 SET f1 = f1 + 100;; UPDATE t1 SET f1 = f1 + 100;;
connection node_1; connection node_1;
SELECT COUNT(*) FROM t1;
COUNT(*)
1
connection node_2; connection node_2;
SELECT COUNT(*) FROM t1;
COUNT(*)
1
connection node_3; connection node_3;
SELECT f1 = 111 FROM t1; SELECT COUNT(*) FROM t1;
f1 = 111 COUNT(*)
1 1
SELECT COUNT(*) IN (1, 2) FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user' AND STATE LIKE '%committed%'; SELECT COUNT(*) IN (1, 2) FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user' AND STATE LIKE '%committed%';
COUNT(*) IN (1, 2) COUNT(*) IN (1, 2)

View file

@ -24,13 +24,25 @@ SET GLOBAL wsrep_slave_threads = 2;
--send UPDATE t1 SET f1 = f1 + 100; --send UPDATE t1 SET f1 = f1 + 100;
--connection node_1 --connection node_1
#
# Note that test is not deterministic. We have following cases possible
# (1) Both updates are certified locally and then executed by the applier
# (2) Certification of update in node_1 fails because applier has started
# update from node_2
# (3) Certification of update in node_2 fails because applier has started
# update from node_1
#
--error 0,ER_LOCK_DEADLOCK
--reap --reap
SELECT COUNT(*) FROM t1;
--connection node_2 --connection node_2
--error 0,ER_LOCK_DEADLOCK
--reap --reap
SELECT COUNT(*) FROM t1;
--connection node_3 --connection node_3
SELECT f1 = 111 FROM t1; SELECT COUNT(*) FROM t1;
SELECT COUNT(*) IN (1, 2) FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user' AND STATE LIKE '%committed%'; SELECT COUNT(*) IN (1, 2) FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'system user' AND STATE LIKE '%committed%';
--eval SET GLOBAL wsrep_slave_threads = $wsrep_slave_threads_orig; --eval SET GLOBAL wsrep_slave_threads = $wsrep_slave_threads_orig;

View file

@ -31,6 +31,50 @@ select * from t2;
f1 f2 f1 f2
3 qux 3 qux
DROP TABLE t1, t2; DROP TABLE t1, t2;
#
# MDEV-23159 Assertion `table_share->tmp_table != NO_TMP_TABLE ||
# m_lock_type != 2' + SIGSEGV in trnman_can_read_from
# (on optimized builds)
#
SET @org_sql_mode=@@SQL_MODE;
CREATE TABLE t1 (a INT PRIMARY KEY) ENGINE=Aria ROW_FORMAT=COMPRESSED;
INSERT INTO t1 VALUES(1);
CREATE TEMPORARY TABLE t2(b INT);
EXPLAIN SELECT * FROM t1 WHERE a IN (SELECT MAX(a) FROM t2);
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY t1 system NULL NULL NULL NULL 1 Using index
2 DEPENDENT SUBQUERY NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
DROP TABLE t1,t2;
SET SQL_MODE='';
CREATE TABLE t1 (c INT PRIMARY KEY) ENGINE=Aria;
CREATE TABLE t2 (d INT);
INSERT INTO t1 VALUES (1);
SELECT c FROM t1 WHERE (c) IN (SELECT MIN(c) FROM t2);
c
DROP TABLE t1,t2;
USE test;
SET SQL_MODE='ONLY_FULL_GROUP_BY';
CREATE TABLE t3 (c1 DECIMAL(1,1) PRIMARY KEY,c2 DATE,c3 NUMERIC(10) UNSIGNED) ENGINE=Aria;
CREATE TABLE t2 (f1 INTEGER ) ENGINE=Aria;
INSERT INTO t3 VALUES (0,0,0);
SELECT c1 FROM t3 WHERE (c1) IN (SELECT MIN(DISTINCT c1) FROM t2);
c1
DROP TABLE t2,t3;
SET @@SQL_MODE=@org_sql_mode;
#
# MDEV-23222 SIGSEGV in maria_status | Assertion `(longlong)
# thd->status_var.local_memory_used >= 0
#
CREATE TABLE t1 (a INT);
INSERT INTO t1 VALUES (1);
CREATE TABLE MDEV_23222 (i INT) DATA DIRECTORY = 'MYSQL_TMP_DIR', ENGINE=Aria TRANSACTIONAL=1;;
flush tables;
CREATE TABLE MDEV_23222 (i INT) DATA DIRECTORY = 'MYSQL_TMP_DIR', ENGINE=Aria TRANSACTIONAL=1;;
Got one of the listed errors
DROP TABLE t1;
#
# End of 10.3 tests
#
CREATE TABLE t1 (a INT) ENGINE=Aria; CREATE TABLE t1 (a INT) ENGINE=Aria;
INSERT INTO t1 VALUES (1); INSERT INTO t1 VALUES (1);
CREATE TABLE t2 (b INT); CREATE TABLE t2 (b INT);

View file

@ -41,6 +41,61 @@ CREATE OR REPLACE TABLE t2 ENGINE=Aria AS SELECT SUM(a) AS f1, IFNULL( 'qux', Ex
select * from t2; select * from t2;
DROP TABLE t1, t2; DROP TABLE t1, t2;
--echo #
--echo # MDEV-23159 Assertion `table_share->tmp_table != NO_TMP_TABLE ||
--echo # m_lock_type != 2' + SIGSEGV in trnman_can_read_from
--echo # (on optimized builds)
--echo #
SET @org_sql_mode=@@SQL_MODE;
CREATE TABLE t1 (a INT PRIMARY KEY) ENGINE=Aria ROW_FORMAT=COMPRESSED;
INSERT INTO t1 VALUES(1);
CREATE TEMPORARY TABLE t2(b INT);
EXPLAIN SELECT * FROM t1 WHERE a IN (SELECT MAX(a) FROM t2);
DROP TABLE t1,t2;
SET SQL_MODE='';
CREATE TABLE t1 (c INT PRIMARY KEY) ENGINE=Aria;
CREATE TABLE t2 (d INT);
INSERT INTO t1 VALUES (1);
SELECT c FROM t1 WHERE (c) IN (SELECT MIN(c) FROM t2);
DROP TABLE t1,t2;
USE test;
SET SQL_MODE='ONLY_FULL_GROUP_BY';
CREATE TABLE t3 (c1 DECIMAL(1,1) PRIMARY KEY,c2 DATE,c3 NUMERIC(10) UNSIGNED) ENGINE=Aria;
CREATE TABLE t2 (f1 INTEGER ) ENGINE=Aria;
INSERT INTO t3 VALUES (0,0,0);
SELECT c1 FROM t3 WHERE (c1) IN (SELECT MIN(DISTINCT c1) FROM t2);
DROP TABLE t2,t3;
SET @@SQL_MODE=@org_sql_mode;
--echo #
--echo # MDEV-23222 SIGSEGV in maria_status | Assertion `(longlong)
--echo # thd->status_var.local_memory_used >= 0
--echo #
let $mysqld_datadir= `select @@datadir`;
CREATE TABLE t1 (a INT);
INSERT INTO t1 VALUES (1);
--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
--eval CREATE TABLE MDEV_23222 (i INT) DATA DIRECTORY = '$MYSQL_TMP_DIR', ENGINE=Aria TRANSACTIONAL=1;
flush tables;
--remove_file $mysqld_datadir/test/MDEV_23222.frm
--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
--error 1,ER_TABLE_EXISTS_ERROR
--eval CREATE TABLE MDEV_23222 (i INT) DATA DIRECTORY = '$MYSQL_TMP_DIR', ENGINE=Aria TRANSACTIONAL=1;
DROP TABLE t1;
--disable_warnings
--remove_file $mysqld_datadir/test/MDEV_23222.MAD
--replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
--remove_file $MYSQL_TMP_DIR/MDEV_23222.MAD
--enable_warnings
--echo #
--echo # End of 10.3 tests
--echo #
# #
# MDEV-22686 # Assertion `trn' failed in ha_maria::start_stmt # MDEV-22686 # Assertion `trn' failed in ha_maria::start_stmt
# ASAN heap-after-free in maria_status # ASAN heap-after-free in maria_status

View file

@ -2,6 +2,7 @@ call mtr.add_suppression("InnoDB: New log files created");
CREATE TABLE t1(i INT PRIMARY KEY) ENGINE INNODB; CREATE TABLE t1(i INT PRIMARY KEY) ENGINE INNODB;
CREATE TABLE t2(i INT PRIMARY KEY) ENGINE INNODB; CREATE TABLE t2(i INT PRIMARY KEY) ENGINE INNODB;
CREATE TABLE t3(i INT) ENGINE INNODB; CREATE TABLE t3(i INT) ENGINE INNODB;
CREATE TABLE t10(i INT PRIMARY KEY) ENGINE INNODB;
# Create full backup , modify table, then create incremental/differential backup # Create full backup , modify table, then create incremental/differential backup
INSERT into t1 values(1); INSERT into t1 values(1);
# Prepare full backup, apply incremental one # Prepare full backup, apply incremental one

View file

@ -8,6 +8,7 @@ let $incremental_dir=$MYSQLTEST_VARDIR/tmp/backup_inc1;
CREATE TABLE t1(i INT PRIMARY KEY) ENGINE INNODB; CREATE TABLE t1(i INT PRIMARY KEY) ENGINE INNODB;
CREATE TABLE t2(i INT PRIMARY KEY) ENGINE INNODB; CREATE TABLE t2(i INT PRIMARY KEY) ENGINE INNODB;
CREATE TABLE t3(i INT) ENGINE INNODB; CREATE TABLE t3(i INT) ENGINE INNODB;
CREATE TABLE t10(i INT PRIMARY KEY) ENGINE INNODB;
echo # Create full backup , modify table, then create incremental/differential backup; echo # Create full backup , modify table, then create incremental/differential backup;
--disable_result_log --disable_result_log
@ -20,8 +21,11 @@ INSERT into t1 values(1);
--let after_copy_test_t1=RENAME TABLE test.t1 TO test.t1_renamed --let after_copy_test_t1=RENAME TABLE test.t1 TO test.t1_renamed
--let after_copy_test_t2=DROP TABLE test.t2 --let after_copy_test_t2=DROP TABLE test.t2
--let after_copy_test_t3=CREATE INDEX a_i ON test.t3(i); --let after_copy_test_t3=CREATE INDEX a_i ON test.t3(i);
--let before_copy_test_t10=DROP TABLE test.t10
--let wait_innodb_redo_before_copy=test/t10
exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$incremental_dir --incremental-basedir=$basedir --dbug=+d,mariabackup_events; # mariabackup should crash with assertion if MDEV-24026 is not fixed
exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$incremental_dir --incremental-basedir=$basedir --dbug=+d,mariabackup_events,mariabackup_inject_code;
--let after_load_tablespaces= --let after_load_tablespaces=
--disable_result_log --disable_result_log
echo # Prepare full backup, apply incremental one; echo # Prepare full backup, apply incremental one;

View file

@ -102,8 +102,7 @@ ALTER TABLE t1 ADD PRIMARY KEY (a);
ALTER TABLE t2 ADD PRIMARY KEY (a); ALTER TABLE t2 ADD PRIMARY KEY (a);
ALTER TABLE t3 ADD PRIMARY KEY (a); ALTER TABLE t3 ADD PRIMARY KEY (a);
#--sync_slave_with_master --sync_slave_with_master
--connection slave
RENAME TABLE t3 TO t3_bak; RENAME TABLE t3 TO t3_bak;
--connection master --connection master

View file

@ -51,9 +51,9 @@ INSERT into t1(name, salary, income_tax) values('Record_2', 501, 501*2.5/1000);
INSERT into t1(name, salary, income_tax) values('Record_3', 210, 210*2.5/1000); INSERT into t1(name, salary, income_tax) values('Record_3', 210, 210*2.5/1000);
SELECT * from t1; SELECT * from t1;
id name salary income_tax id name salary income_tax
1 Record_1 100011 250.03 1 Record_1 100011 250.027
2 Record_2 501 1.25 2 Record_2 501 1.2525
3 Record_3 210 0.53 3 Record_3 210 0.525
connect test_con2, localhost, root,,; connect test_con2, localhost, root,,;
connection test_con2; connection test_con2;
## Verifying session & global value of variable ## ## Verifying session & global value of variable ##
@ -69,11 +69,11 @@ INSERT into t1(name, salary, income_tax) values('Record_5', 501, 501*2.5/1000);
INSERT into t1(name, salary, income_tax) values('Record_6', 210, 210*2.5/1000); INSERT into t1(name, salary, income_tax) values('Record_6', 210, 210*2.5/1000);
SELECT * from t1; SELECT * from t1;
id name salary income_tax id name salary income_tax
1 Record_1 100011 250.03 1 Record_1 100011 250.027
2 Record_2 501 1.25 2 Record_2 501 1.2525
3 Record_3 210 0.53 3 Record_3 210 0.525
4 Record_4 100011 250.028 4 Record_4 100011 250.027
5 Record_5 501 1.253 5 Record_5 501 1.2525
6 Record_6 210 0.525 6 Record_6 210 0.525
## Dropping table t1 ## ## Dropping table t1 ##
drop table t1; drop table t1;

View file

@ -37,5 +37,9 @@ SET @@GLOBAL.replicate_do_db=null;
SELECT @@GLOBAL.replicate_do_db; SELECT @@GLOBAL.replicate_do_db;
@@GLOBAL.replicate_do_db @@GLOBAL.replicate_do_db
SET @@GLOBAL.replicate_do_db=DEFAULT;
SELECT @@GLOBAL.replicate_do_db;
@@GLOBAL.replicate_do_db
# Cleanup. # Cleanup.
SET @@GLOBAL.replicate_do_db = @save_replicate_do_db; SET @@GLOBAL.replicate_do_db = @save_replicate_do_db;

View file

@ -1,6 +1,6 @@
include/master-slave.inc include/master-slave.inc
[connection master] [connection master]
connection slave; include/sync_slave_sql_with_master.inc
SET @start_max_connections= @@global.max_connections; SET @start_max_connections= @@global.max_connections;
SET @start_init_slave= @@global.init_slave; SET @start_init_slave= @@global.init_slave;
SET NAMES utf8; SET NAMES utf8;
@ -19,18 +19,12 @@ SELECT @@global.init_slave = 'SET @@global.max_connections = @@global.max_connec
1 1
Expect 1 Expect 1
include/assert.inc [@@global.max_connections = @start_max_connections] include/assert.inc [@@global.max_connections = @start_max_connections]
STOP SLAVE; include/restart_slave.inc
RESET MASTER; connection master;
RESET SLAVE; include/sync_slave_sql_with_master.inc
START SLAVE;
include/wait_for_slave_to_start.inc
include/assert.inc [@@global.max_connections = @start_max_connections + 1] include/assert.inc [@@global.max_connections = @start_max_connections + 1]
SET @@global.init_slave = "SET @a=5"; SET @@global.init_slave = "SET @a=5";
STOP SLAVE; include/restart_slave.inc
RESET MASTER;
RESET SLAVE;
START SLAVE;
include/wait_for_slave_to_start.inc
SHOW VARIABLES LIKE 'init_slave'; SHOW VARIABLES LIKE 'init_slave';
Variable_name Value Variable_name Value
init_slave SET @a=5 init_slave SET @a=5

View file

@ -38,5 +38,8 @@ SELECT @@GLOBAL.replicate_do_db;
SET @@GLOBAL.replicate_do_db=null; SET @@GLOBAL.replicate_do_db=null;
SELECT @@GLOBAL.replicate_do_db; SELECT @@GLOBAL.replicate_do_db;
SET @@GLOBAL.replicate_do_db=DEFAULT;
SELECT @@GLOBAL.replicate_do_db;
--echo # Cleanup. --echo # Cleanup.
SET @@GLOBAL.replicate_do_db = @save_replicate_do_db; SET @@GLOBAL.replicate_do_db = @save_replicate_do_db;

View file

@ -29,7 +29,13 @@
############################################################################### ###############################################################################
source include/master-slave.inc; source include/master-slave.inc;
connection slave;
# Since a part of slave SQL thread initialisation happens after Slave_SQL_Running
# has been set to Yes, there is a race condition between initialisation above and
# init_slave setting given below. Synchronise slave applier with master to ensure
# init_slave is complete and applier had processed few events like FD.
--source include/sync_slave_sql_with_master.inc
--disable_query_log --disable_query_log
call mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT"); call mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT");
--enable_query_log --enable_query_log
@ -66,14 +72,15 @@ let $wait_condition= SELECT @@global.max_connections = @start_max_connections;
--let $assert_text= @@global.max_connections = @start_max_connections --let $assert_text= @@global.max_connections = @start_max_connections
--let $assert_cond= @@global.max_connections = @start_max_connections --let $assert_cond= @@global.max_connections = @start_max_connections
--source include/assert.inc --source include/assert.inc
#
# reset of the server --source include/restart_slave_sql.inc
STOP SLAVE;
--wait_for_slave_to_stop # Upon slave start, sync the applier with master, to ensure slave has
RESET MASTER; # completed init_slave command execution and processed FD event from the
RESET SLAVE; # master.
START SLAVE; --connection master
source include/wait_for_slave_to_start.inc; --source include/sync_slave_sql_with_master.inc
# #
# wait for the slave threads have set the global variable. # wait for the slave threads have set the global variable.
let $wait_timeout= 90; let $wait_timeout= 90;
@ -87,12 +94,7 @@ let $wait_condition= SELECT @@global.max_connections = @start_max_connections +
# Setting a variable(which is local to a session) and must not be visible # Setting a variable(which is local to a session) and must not be visible
SET @@global.init_slave = "SET @a=5"; SET @@global.init_slave = "SET @a=5";
# #
STOP SLAVE; --source include/restart_slave_sql.inc
--wait_for_slave_to_stop
RESET MASTER;
RESET SLAVE;
START SLAVE;
source include/wait_for_slave_to_start.inc;
# #
SHOW VARIABLES LIKE 'init_slave'; SHOW VARIABLES LIKE 'init_slave';
# expect NULL # expect NULL

View file

@ -29,7 +29,7 @@ set time_zone='+1:00';
flush tables; flush tables;
select * from t1; select * from t1;
a b v a b v
1 2 0.3333000000000000000 1 2 0.3333333330000000000
select * from t8; select * from t8;
a b v a b v
1234567890 2 2009-02-14 00:31:30 1234567890 2 2009-02-14 00:31:30

View file

@ -159,10 +159,18 @@ err:
#include <ctype.h> #include <ctype.h>
#include <sys/wait.h> #include <sys/wait.h>
#if defined(HAVE_POLL_H)
#include <poll.h>
#elif defined(HAVE_SYS_POLL_H)
#include <sys/poll.h>
#endif /* defined(HAVE_POLL_H) */
static int in[2], out[2]; static int in[2], out[2];
static pid_t pid; static pid_t pid;
static char addr2line_binary[1024]; static char addr2line_binary[1024];
static char output[1024]; static char output[1024];
static struct pollfd poll_fds;
Dl_info info;
int start_addr2line_fork(const char *binary_path) int start_addr2line_fork(const char *binary_path)
{ {
@ -214,12 +222,14 @@ static int addr_resolve(void *ptr, my_addr_loc *loc)
ssize_t extra_bytes_read = 0; ssize_t extra_bytes_read = 0;
ssize_t parsed = 0; ssize_t parsed = 0;
fd_set set; int ret;
struct timeval timeout;
int filename_start = -1; int filename_start = -1;
int line_number_start = -1; int line_number_start = -1;
poll_fds.fd = out[0];
poll_fds.events = POLLIN | POLLRDBAND;
len= my_snprintf(input, sizeof(input), "%p\n", ptr); len= my_snprintf(input, sizeof(input), "%p\n", ptr);
if (write(in[1], input, len) <= 0) if (write(in[1], input, len) <= 0)
{ {
@ -228,16 +238,16 @@ static int addr_resolve(void *ptr, my_addr_loc *loc)
return 3; return 3;
} }
FD_ZERO(&set);
FD_SET(out[0], &set);
/* 100 ms should be plenty of time for addr2line to issue a response. */ /* 500 ms should be plenty of time for addr2line to issue a response. */
timeout.tv_sec = 0;
timeout.tv_usec = 100000;
/* Read in a loop till all the output from addr2line is complete. */ /* Read in a loop till all the output from addr2line is complete. */
while (parsed == total_bytes_read && while (parsed == total_bytes_read &&
select(out[0] + 1, &set, NULL, NULL, &timeout) > 0) (ret= poll(&poll_fds, 1, 500)))
{ {
/* error during poll */
if (ret < 0)
return 1;
extra_bytes_read= read(out[0], output + total_bytes_read, extra_bytes_read= read(out[0], output + total_bytes_read,
sizeof(output) - total_bytes_read); sizeof(output) - total_bytes_read);
if (extra_bytes_read < 0) if (extra_bytes_read < 0)

View file

@ -112,9 +112,6 @@ void my_error(uint nr, myf MyFlags, ...)
char ebuff[ERRMSGSIZE]; char ebuff[ERRMSGSIZE];
DBUG_ENTER("my_error"); DBUG_ENTER("my_error");
DBUG_PRINT("my", ("nr: %d MyFlags: %lu errno: %d", nr, MyFlags, errno)); DBUG_PRINT("my", ("nr: %d MyFlags: %lu errno: %d", nr, MyFlags, errno));
DBUG_ASSERT(errno != 1213);
if (!(format = my_get_err_msg(nr))) if (!(format = my_get_err_msg(nr)))
(void) my_snprintf(ebuff, sizeof(ebuff), "Unknown error %d", nr); (void) my_snprintf(ebuff, sizeof(ebuff), "Unknown error %d", nr);
else else

View file

@ -14,8 +14,8 @@ CHECK_C_SOURCE_COMPILES(
#include <grp.h> #include <grp.h>
#include <unistd.h> #include <unistd.h>
int main() { int main() {
char *arg_1; char *arg_1= 0;
gid_t arg_2, arg_3; gid_t arg_2=0, arg_3;
int arg_4; int arg_4;
(void)getgrouplist(arg_1,arg_2,&arg_3,&arg_4); (void)getgrouplist(arg_1,arg_2,&arg_3,&arg_4);
return 0; return 0;

View file

@ -2215,12 +2215,11 @@ sortlength(THD *thd, Sort_keys *sort_keys, bool *allow_packing_for_sortkeys)
{ {
Field *field= sortorder->field; Field *field= sortorder->field;
CHARSET_INFO *cs= sortorder->field->sort_charset(); CHARSET_INFO *cs= sortorder->field->sort_charset();
sortorder->set_length_and_original_length(thd, field->sort_length());
sortorder->suffix_length= sortorder->field->sort_suffix_length();
sortorder->type= field->is_packable() ? sortorder->type= field->is_packable() ?
SORT_FIELD_ATTR::VARIABLE_SIZE : SORT_FIELD_ATTR::VARIABLE_SIZE :
SORT_FIELD_ATTR::FIXED_SIZE; SORT_FIELD_ATTR::FIXED_SIZE;
sortorder->set_length_and_original_length(thd, field->sort_length());
sortorder->suffix_length= sortorder->field->sort_suffix_length();
sortorder->cs= cs; sortorder->cs= cs;
if (use_strnxfrm((cs=sortorder->field->sort_charset()))) if (use_strnxfrm((cs=sortorder->field->sort_charset())))
@ -2239,11 +2238,11 @@ sortlength(THD *thd, Sort_keys *sort_keys, bool *allow_packing_for_sortkeys)
} }
else else
{ {
sortorder->item->type_handler()->sort_length(thd, sortorder->item,
sortorder);
sortorder->type= sortorder->item->type_handler()->is_packable() ? sortorder->type= sortorder->item->type_handler()->is_packable() ?
SORT_FIELD_ATTR::VARIABLE_SIZE : SORT_FIELD_ATTR::VARIABLE_SIZE :
SORT_FIELD_ATTR::FIXED_SIZE; SORT_FIELD_ATTR::FIXED_SIZE;
sortorder->item->type_handler()->sort_length(thd, sortorder->item,
sortorder);
sortorder->cs= sortorder->item->collation.collation; sortorder->cs= sortorder->item->collation.collation;
if (sortorder->is_variable_sized() && allow_packing_for_keys) if (sortorder->is_variable_sized() && allow_packing_for_keys)
{ {
@ -2256,8 +2255,11 @@ sortlength(THD *thd, Sort_keys *sort_keys, bool *allow_packing_for_sortkeys)
if ((sortorder->maybe_null= sortorder->item->maybe_null)) if ((sortorder->maybe_null= sortorder->item->maybe_null))
nullable_cols++; // Place for NULL marker nullable_cols++; // Place for NULL marker
} }
set_if_smaller(sortorder->length, thd->variables.max_sort_length); if (sortorder->is_variable_sized())
set_if_smaller(sortorder->original_length, thd->variables.max_sort_length); {
set_if_smaller(sortorder->length, thd->variables.max_sort_length);
set_if_smaller(sortorder->original_length, thd->variables.max_sort_length);
}
length+=sortorder->length; length+=sortorder->length;
sort_keys->increment_size_of_packable_fields(sortorder->length_bytes); sort_keys->increment_size_of_packable_fields(sortorder->length_bytes);
@ -2758,7 +2760,8 @@ bool SORT_FIELD_ATTR::check_if_packing_possible(THD *thd) const
void SORT_FIELD_ATTR::set_length_and_original_length(THD *thd, uint length_arg) void SORT_FIELD_ATTR::set_length_and_original_length(THD *thd, uint length_arg)
{ {
length= length_arg; length= length_arg;
set_if_smaller(length, thd->variables.max_sort_length); if (is_variable_sized())
set_if_smaller(length, thd->variables.max_sort_length);
original_length= length_arg; original_length= length_arg;
} }

View file

@ -868,6 +868,8 @@ int Arg_comparator::compare_decimal()
{ {
if (set_null) if (set_null)
owner->null_value= 0; owner->null_value= 0;
val1.round_self_if_needed((*a)->decimals, HALF_UP);
val2.round_self_if_needed((*b)->decimals, HALF_UP);
return val1.cmp(val2); return val1.cmp(val2);
} }
} }
@ -890,6 +892,8 @@ int Arg_comparator::compare_e_decimal()
VDec val1(*a), val2(*b); VDec val1(*a), val2(*b);
if (val1.is_null() || val2.is_null()) if (val1.is_null() || val2.is_null())
return MY_TEST(val1.is_null() && val2.is_null()); return MY_TEST(val1.is_null() && val2.is_null());
val1.round_self_if_needed((*a)->decimals, HALF_UP);
val2.round_self_if_needed((*b)->decimals, HALF_UP);
return MY_TEST(val1.cmp(val2) == 0); return MY_TEST(val1.cmp(val2) == 0);
} }

View file

@ -1492,14 +1492,13 @@ double Item_func_div::real_op()
my_decimal *Item_func_div::decimal_op(my_decimal *decimal_value) my_decimal *Item_func_div::decimal_op(my_decimal *decimal_value)
{ {
int err; int err;
my_decimal tmp;
VDec2_lazy val(args[0], args[1]); VDec2_lazy val(args[0], args[1]);
if ((null_value= val.has_null())) if ((null_value= val.has_null()))
return 0; return 0;
if ((err= check_decimal_overflow(my_decimal_div(E_DEC_FATAL_ERROR & if ((err= check_decimal_overflow(my_decimal_div(E_DEC_FATAL_ERROR &
~E_DEC_OVERFLOW & ~E_DEC_OVERFLOW &
~E_DEC_DIV_ZERO, ~E_DEC_DIV_ZERO,
&tmp, decimal_value,
val.m_a.ptr(), val.m_b.ptr(), val.m_a.ptr(), val.m_b.ptr(),
prec_increment))) > 3) prec_increment))) > 3)
{ {
@ -1508,7 +1507,6 @@ my_decimal *Item_func_div::decimal_op(my_decimal *decimal_value)
null_value= 1; null_value= 1;
return 0; return 0;
} }
tmp.round_to(decimal_value, decimals, HALF_UP);
return decimal_value; return decimal_value;
} }
@ -4016,6 +4014,8 @@ int Interruptible_wait::wait(mysql_cond_t *cond, mysql_mutex_t *mutex)
timeout= m_abs_timeout; timeout= m_abs_timeout;
error= mysql_cond_timedwait(cond, mutex, &timeout); error= mysql_cond_timedwait(cond, mutex, &timeout);
if (m_thd->check_killed())
break;
if (error == ETIMEDOUT || error == ETIME) if (error == ETIMEDOUT || error == ETIME)
{ {
/* Return error if timed out or connection is broken. */ /* Return error if timed out or connection is broken. */

View file

@ -217,15 +217,15 @@ public:
{ {
return to_string(to, 0, 0, 0); return to_string(to, 0, 0, 0);
} }
String *to_string_round(String *to, uint scale, my_decimal *round_buff) const String *to_string_round(String *to, int scale, my_decimal *round_buff) const
{ {
(void) round_to(round_buff, scale, HALF_UP); // QQ: check result? (void) round_to(round_buff, scale, HALF_UP); // QQ: check result?
return round_buff->to_string(to); return round_buff->to_string(to);
} }
int round_to(my_decimal *to, uint scale, decimal_round_mode mode, int round_to(my_decimal *to, int scale, decimal_round_mode mode,
int mask= E_DEC_FATAL_ERROR) const int mask= E_DEC_FATAL_ERROR) const
{ {
return check_result(mask, decimal_round(this, to, (int) scale, mode)); return check_result(mask, decimal_round(this, to, scale, mode));
} }
int to_binary(uchar *bin, int prec, int scale, int to_binary(uchar *bin, int prec, int scale,
uint mask= E_DEC_FATAL_ERROR) const; uint mask= E_DEC_FATAL_ERROR) const;

View file

@ -399,20 +399,28 @@ int opt_sum_query(THD *thd,
break; break;
} }
longlong info_limit= 1; longlong info_limit= 1;
table->file->info_push(INFO_KIND_FORCE_LIMIT_BEGIN, &info_limit); error= 0;
if (likely(!(error= table->file->ha_index_init((uint) ref.key, 1))))
error= (is_max ?
get_index_max_value(table, &ref, range_fl) :
get_index_min_value(table, &ref, item_field, range_fl,
prefix_len));
table->file->info_push(INFO_KIND_FORCE_LIMIT_BEGIN, &info_limit);
if (!table->const_table)
{
if (likely(!(error= table->file->ha_index_init((uint) ref.key,
1))))
error= (is_max ?
get_index_max_value(table, &ref, range_fl) :
get_index_min_value(table, &ref, item_field, range_fl,
prefix_len));
}
/* Verify that the read tuple indeed matches the search key */ /* Verify that the read tuple indeed matches the search key */
if (!error && if (!error &&
reckey_in_range(is_max, &ref, item_field->field, reckey_in_range(is_max, &ref, item_field->field,
conds, range_fl, prefix_len)) conds, range_fl, prefix_len))
error= HA_ERR_KEY_NOT_FOUND; error= HA_ERR_KEY_NOT_FOUND;
table->file->ha_end_keyread(); if (!table->const_table)
table->file->ha_index_end(); {
table->file->ha_end_keyread();
table->file->ha_index_end();
}
table->file->info_push(INFO_KIND_FORCE_LIMIT_END, NULL); table->file->info_push(INFO_KIND_FORCE_LIMIT_END, NULL);
if (error) if (error)
{ {

View file

@ -1920,7 +1920,7 @@ retry_share:
#ifdef WITH_WSREP #ifdef WITH_WSREP
if (!((flags & MYSQL_OPEN_IGNORE_FLUSH) || if (!((flags & MYSQL_OPEN_IGNORE_FLUSH) ||
(wsrep_on(thd) && thd->wsrep_applier))) (thd->wsrep_applier)))
#else #else
if (!(flags & MYSQL_OPEN_IGNORE_FLUSH)) if (!(flags & MYSQL_OPEN_IGNORE_FLUSH))
#endif #endif

View file

@ -98,6 +98,8 @@
#include "my_json_writer.h" #include "my_json_writer.h"
#define PRIV_LOCK_TABLES (SELECT_ACL | LOCK_TABLES_ACL)
#define FLAGSTR(V,F) ((V)&(F)?#F" ":"") #define FLAGSTR(V,F) ((V)&(F)?#F" ":"")
#ifdef WITH_ARIA_STORAGE_ENGINE #ifdef WITH_ARIA_STORAGE_ENGINE
@ -1097,7 +1099,6 @@ int bootstrap(MYSQL_FILE *file)
thd->reset_kill_query(); /* Ensure that killed_errmsg is released */ thd->reset_kill_query(); /* Ensure that killed_errmsg is released */
free_root(thd->mem_root,MYF(MY_KEEP_PREALLOC)); free_root(thd->mem_root,MYF(MY_KEEP_PREALLOC));
thd->transaction->free();
thd->lex->restore_set_statement_var(); thd->lex->restore_set_statement_var();
} }
delete thd; delete thd;
@ -2977,6 +2978,36 @@ retry:
goto err; goto err;
} }
} }
/*
Check privileges of view tables here, after views were opened.
Either definer or invoker has to have PRIV_LOCK_TABLES to be able
to lock view and its tables. For mysqldump (that locks views
before dumping their structures) compatibility we allow locking
views that select from I_S or P_S tables, but downrade the lock
to TL_READ
*/
if (table->belong_to_view &&
check_single_table_access(thd, PRIV_LOCK_TABLES, table, 1))
{
if (table->grant.m_internal.m_schema_access)
table->lock_type= TL_READ;
else
{
bool error= true;
if (Security_context *sctx= table->security_ctx)
{
table->security_ctx= 0;
error= check_single_table_access(thd, PRIV_LOCK_TABLES, table, 1);
table->security_ctx= sctx;
}
if (error)
{
my_error(ER_VIEW_INVALID, MYF(0), table->belong_to_view->view_db.str,
table->belong_to_view->view_name.str);
goto err;
}
}
}
} }
if (lock_tables(thd, tables, counter, 0) || if (lock_tables(thd, tables, counter, 0) ||
@ -5390,7 +5421,7 @@ mysql_execute_command(THD *thd)
if (first_table && lex->type & (REFRESH_READ_LOCK|REFRESH_FOR_EXPORT)) if (first_table && lex->type & (REFRESH_READ_LOCK|REFRESH_FOR_EXPORT))
{ {
/* Check table-level privileges. */ /* Check table-level privileges. */
if (check_table_access(thd, LOCK_TABLES_ACL | SELECT_ACL, all_tables, if (check_table_access(thd, PRIV_LOCK_TABLES, all_tables,
FALSE, UINT_MAX, FALSE)) FALSE, UINT_MAX, FALSE))
goto error; goto error;
@ -6851,7 +6882,7 @@ check_access(THD *thd, privilege_t want_access,
@param thd Thread handler @param thd Thread handler
@param privilege requested privilege @param privilege requested privilege
@param all_tables global table list of query @param tables global table list of query
@param no_errors FALSE/TRUE - report/don't report error to @param no_errors FALSE/TRUE - report/don't report error to
the client (using my_error() call). the client (using my_error() call).
@ -6861,28 +6892,25 @@ check_access(THD *thd, privilege_t want_access,
1 access denied, error is sent to client 1 access denied, error is sent to client
*/ */
bool check_single_table_access(THD *thd, privilege_t privilege, bool check_single_table_access(THD *thd, privilege_t privilege,
TABLE_LIST *all_tables, bool no_errors) TABLE_LIST *tables, bool no_errors)
{ {
Switch_to_definer_security_ctx backup_sctx(thd, all_tables); Switch_to_definer_security_ctx backup_sctx(thd, tables);
const char *db_name; const char *db_name;
if ((all_tables->view || all_tables->field_translation) && if ((tables->view || tables->field_translation) && !tables->schema_table)
!all_tables->schema_table) db_name= tables->view_db.str;
db_name= all_tables->view_db.str;
else else
db_name= all_tables->db.str; db_name= tables->db.str;
if (check_access(thd, privilege, db_name, if (check_access(thd, privilege, db_name, &tables->grant.privilege,
&all_tables->grant.privilege, &tables->grant.m_internal, 0, no_errors))
&all_tables->grant.m_internal,
0, no_errors))
return 1; return 1;
/* Show only 1 table for check_grant */ /* Show only 1 table for check_grant */
if (!(all_tables->belong_to_view && if (!(tables->belong_to_view &&
(thd->lex->sql_command == SQLCOM_SHOW_FIELDS)) && (thd->lex->sql_command == SQLCOM_SHOW_FIELDS)) &&
check_grant(thd, privilege, all_tables, FALSE, 1, no_errors)) check_grant(thd, privilege, tables, FALSE, 1, no_errors))
return 1; return 1;
return 0; return 0;
@ -9976,7 +10004,7 @@ static bool lock_tables_precheck(THD *thd, TABLE_LIST *tables)
if (is_temporary_table(table)) if (is_temporary_table(table))
continue; continue;
if (check_table_access(thd, LOCK_TABLES_ACL | SELECT_ACL, table, if (check_table_access(thd, PRIV_LOCK_TABLES, table,
FALSE, 1, FALSE)) FALSE, 1, FALSE))
return TRUE; return TRUE;
} }

View file

@ -124,6 +124,9 @@ When one supplies long data for a placeholder:
#include "mysql/psi/mysql_ps.h" // MYSQL_EXECUTE_PS #include "mysql/psi/mysql_ps.h" // MYSQL_EXECUTE_PS
#include "wsrep_mysqld.h" #include "wsrep_mysqld.h"
/* Constants defining bits in parameter type flags. Flags are read from high byte of short value */
static const uint PARAMETER_FLAG_UNSIGNED = 128U << 8;
/** /**
A result class used to send cursor rows using the binary protocol. A result class used to send cursor rows using the binary protocol.
*/ */
@ -897,11 +900,73 @@ static bool insert_bulk_params(Prepared_statement *stmt,
DBUG_RETURN(0); DBUG_RETURN(0);
} }
static bool set_conversion_functions(Prepared_statement *stmt,
uchar **data, uchar *data_end) /**
Checking if parameter type and flags are valid
@param typecode ushort value with type in low byte, and flags in high byte
@retval true this parameter is wrong
@retval false this parameter is OK
*/
static bool
parameter_type_sanity_check(ushort typecode)
{
/* Checking if type in lower byte is valid */
switch (typecode & 0xff) {
case MYSQL_TYPE_DECIMAL:
case MYSQL_TYPE_NEWDECIMAL:
case MYSQL_TYPE_TINY:
case MYSQL_TYPE_SHORT:
case MYSQL_TYPE_LONG:
case MYSQL_TYPE_LONGLONG:
case MYSQL_TYPE_INT24:
case MYSQL_TYPE_YEAR:
case MYSQL_TYPE_BIT:
case MYSQL_TYPE_FLOAT:
case MYSQL_TYPE_DOUBLE:
case MYSQL_TYPE_NULL:
case MYSQL_TYPE_VARCHAR:
case MYSQL_TYPE_TINY_BLOB:
case MYSQL_TYPE_MEDIUM_BLOB:
case MYSQL_TYPE_LONG_BLOB:
case MYSQL_TYPE_BLOB:
case MYSQL_TYPE_VAR_STRING:
case MYSQL_TYPE_STRING:
case MYSQL_TYPE_ENUM:
case MYSQL_TYPE_SET:
case MYSQL_TYPE_GEOMETRY:
case MYSQL_TYPE_TIMESTAMP:
case MYSQL_TYPE_DATE:
case MYSQL_TYPE_TIME:
case MYSQL_TYPE_DATETIME:
case MYSQL_TYPE_NEWDATE:
break;
/*
This types normally cannot be sent by client, so maybe it'd be
better to treat them like an error here.
*/
case MYSQL_TYPE_TIMESTAMP2:
case MYSQL_TYPE_TIME2:
case MYSQL_TYPE_DATETIME2:
default:
return true;
};
// In Flags in high byte only unsigned bit may be set
if (typecode & ((~PARAMETER_FLAG_UNSIGNED) & 0x0000ff00))
{
return true;
}
return false;
}
static bool
set_conversion_functions(Prepared_statement *stmt, uchar **data)
{ {
uchar *read_pos= *data; uchar *read_pos= *data;
const uint signed_bit= 1 << 15;
DBUG_ENTER("set_conversion_functions"); DBUG_ENTER("set_conversion_functions");
/* /*
First execute or types altered by the client, setup the First execute or types altered by the client, setup the
@ -914,12 +979,17 @@ static bool set_conversion_functions(Prepared_statement *stmt,
{ {
ushort typecode; ushort typecode;
if (read_pos >= data_end) /*
DBUG_RETURN(1); stmt_execute_packet_sanity_check has already verified, that there
are enough data in the packet for data types
*/
typecode= sint2korr(read_pos); typecode= sint2korr(read_pos);
read_pos+= 2; read_pos+= 2;
(**it).unsigned_flag= MY_TEST(typecode & signed_bit); if (parameter_type_sanity_check(typecode))
{
DBUG_RETURN(1);
}
(**it).unsigned_flag= MY_TEST(typecode & PARAMETER_FLAG_UNSIGNED);
(*it)->setup_conversion(thd, (uchar) (typecode & 0xff)); (*it)->setup_conversion(thd, (uchar) (typecode & 0xff));
(*it)->sync_clones(); (*it)->sync_clones();
} }
@ -929,7 +999,7 @@ static bool set_conversion_functions(Prepared_statement *stmt,
static bool setup_conversion_functions(Prepared_statement *stmt, static bool setup_conversion_functions(Prepared_statement *stmt,
uchar **data, uchar *data_end, uchar **data,
bool bulk_protocol= 0) bool bulk_protocol= 0)
{ {
/* skip null bits */ /* skip null bits */
@ -942,7 +1012,7 @@ static bool setup_conversion_functions(Prepared_statement *stmt,
if (*read_pos++) //types supplied / first execute if (*read_pos++) //types supplied / first execute
{ {
*data= read_pos; *data= read_pos;
bool res= set_conversion_functions(stmt, data, data_end); bool res= set_conversion_functions(stmt, data);
DBUG_RETURN(res); DBUG_RETURN(res);
} }
*data= read_pos; *data= read_pos;
@ -3137,11 +3207,19 @@ static void mysql_stmt_execute_common(THD *thd,
void mysqld_stmt_execute(THD *thd, char *packet_arg, uint packet_length) void mysqld_stmt_execute(THD *thd, char *packet_arg, uint packet_length)
{ {
const uint packet_min_lenght= 9;
uchar *packet= (uchar*)packet_arg; // GCC 4.0.1 workaround uchar *packet= (uchar*)packet_arg; // GCC 4.0.1 workaround
DBUG_ENTER("mysqld_stmt_execute");
if (packet_length < packet_min_lenght)
{
my_error(ER_MALFORMED_PACKET, MYF(0));
DBUG_VOID_RETURN;
}
ulong stmt_id= uint4korr(packet); ulong stmt_id= uint4korr(packet);
ulong flags= (ulong) packet[4]; ulong flags= (ulong) packet[4];
uchar *packet_end= packet + packet_length; uchar *packet_end= packet + packet_length;
DBUG_ENTER("mysqld_stmt_execute");
packet+= 9; /* stmt_id + 5 bytes of flags */ packet+= 9; /* stmt_id + 5 bytes of flags */
@ -3197,6 +3275,84 @@ void mysqld_stmt_bulk_execute(THD *thd, char *packet_arg, uint packet_length)
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
/**
Additional packet checks for direct execution
@param thd THD handle
@param stmt prepared statement being directly executed
@param paket packet with parameters to bind
@param packet_end pointer to the byte after parameters end
@param bulk_op is it bulk operation
@param direct_exec is it direct execution
@param read_bytes need to read types (only with bulk_op)
@retval true this parameter is wrong
@retval false this parameter is OK
*/
static bool
stmt_execute_packet_sanity_check(Prepared_statement *stmt,
uchar *packet, uchar *packet_end,
bool bulk_op, bool direct_exec,
bool read_types)
{
DBUG_ASSERT((!read_types) || (read_types && bulk_op));
if (stmt->param_count > 0)
{
uint packet_length= static_cast<uint>(packet_end - packet);
uint null_bitmap_bytes= (bulk_op ? 0 : (stmt->param_count + 7)/8);
uint min_len_for_param_count = null_bitmap_bytes
+ (bulk_op ? 0 : 1); /* sent types byte */
if (!bulk_op && packet_length >= min_len_for_param_count)
{
if ((read_types= packet[null_bitmap_bytes]))
{
/*
Should be 0 or 1. If the byte is not 1, that could mean,
e.g. that we read incorrect byte due to incorrect number
of sent parameters for direct execution (i.e. null bitmap
is shorter or longer, than it should be)
*/
if (packet[null_bitmap_bytes] != '\1')
{
return true;
}
}
}
if (read_types)
{
/* 2 bytes per parameter of the type and flags */
min_len_for_param_count+= 2*stmt->param_count;
}
else
{
/*
If types are not sent, there is nothing to do here.
But for direct execution types should always be sent
*/
return direct_exec;
}
/*
If true, the packet is guaranteed too short for the number of
parameters in the PS
*/
return (packet_length < min_len_for_param_count);
}
else
{
/*
If there is no parameters, this should be normally already end
of the packet. If it's not - then error
*/
return (packet_end > packet);
}
return false;
}
/** /**
Common part of prepared statement execution Common part of prepared statement execution
@ -3243,6 +3399,22 @@ static void mysql_stmt_execute_common(THD *thd,
llstr(stmt_id, llbuf), "mysqld_stmt_execute"); llstr(stmt_id, llbuf), "mysqld_stmt_execute");
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
/*
In case of direct execution application decides how many parameters
to send.
Thus extra checks are required to prevent crashes caused by incorrect
interpretation of the packet data. Plus there can be always a broken
evil client.
*/
if (stmt_execute_packet_sanity_check(stmt, packet, packet_end, bulk_op,
stmt_id == LAST_STMT_ID, read_types))
{
my_error(ER_MALFORMED_PACKET, MYF(0));
DBUG_VOID_RETURN;
}
stmt->read_types= read_types; stmt->read_types= read_types;
#if defined(ENABLED_PROFILING) #if defined(ENABLED_PROFILING)
@ -4178,7 +4350,7 @@ Prepared_statement::set_parameters(String *expanded_query,
{ {
#ifndef EMBEDDED_LIBRARY #ifndef EMBEDDED_LIBRARY
uchar *null_array= packet; uchar *null_array= packet;
res= (setup_conversion_functions(this, &packet, packet_end) || res= (setup_conversion_functions(this, &packet) ||
set_params(this, null_array, packet, packet_end, expanded_query)); set_params(this, null_array, packet, packet_end, expanded_query));
#else #else
/* /*
@ -4378,7 +4550,7 @@ Prepared_statement::execute_bulk_loop(String *expanded_query,
#ifndef EMBEDDED_LIBRARY #ifndef EMBEDDED_LIBRARY
if (read_types && if (read_types &&
set_conversion_functions(this, &packet, packet_end)) set_conversion_functions(this, &packet))
#else #else
// bulk parameters are not supported for embedded, so it will an error // bulk parameters are not supported for embedded, so it will an error
#endif #endif

View file

@ -374,7 +374,7 @@ class Dec_ptr_and_buffer: public Dec_ptr
protected: protected:
my_decimal m_buffer; my_decimal m_buffer;
public: public:
int round_to(my_decimal *to, uint scale, decimal_round_mode mode) int round_to(my_decimal *to, int scale, decimal_round_mode mode)
{ {
DBUG_ASSERT(m_ptr); DBUG_ASSERT(m_ptr);
return m_ptr->round_to(to, scale, mode); return m_ptr->round_to(to, scale, mode);
@ -383,6 +383,14 @@ public:
{ {
return round_to(&m_buffer, scale, mode); return round_to(&m_buffer, scale, mode);
} }
int round_self_if_needed(int scale, decimal_round_mode mode)
{
if (scale >= m_ptr->frac)
return E_DEC_OK;
int res= m_ptr->round_to(&m_buffer, scale, mode);
m_ptr= &m_buffer;
return res;
}
String *to_string_round(String *to, uint dec) String *to_string_round(String *to, uint dec)
{ {
/* /*
@ -3979,7 +3987,6 @@ public:
SORT_FIELD_ATTR *attr) const= 0; SORT_FIELD_ATTR *attr) const= 0;
virtual bool is_packable() const { return false; } virtual bool is_packable() const { return false; }
virtual uint32 max_display_length(const Item *item) const= 0; virtual uint32 max_display_length(const Item *item) const= 0;
virtual uint32 Item_decimal_notation_int_digits(const Item *item) const { return 0; } virtual uint32 Item_decimal_notation_int_digits(const Item *item) const { return 0; }
virtual uint32 calc_pack_length(uint32 length) const= 0; virtual uint32 calc_pack_length(uint32 length) const= 0;
@ -5284,7 +5291,7 @@ public:
void sort_length(THD *thd, void sort_length(THD *thd,
const Type_std_attributes *item, const Type_std_attributes *item,
SORT_FIELD_ATTR *attr) const override; SORT_FIELD_ATTR *attr) const override;
bool is_packable()const override { return true; } bool is_packable() const override { return true; }
bool union_element_finalize(const Item * item) const override; bool union_element_finalize(const Item * item) const override;
uint calc_key_length(const Column_definition &def) const override; uint calc_key_length(const Column_definition &def) const override;
bool Column_definition_prepare_stage1(THD *thd, bool Column_definition_prepare_stage1(THD *thd,

View file

@ -769,8 +769,12 @@ public:
void session_save_default(THD *, set_var *) override void session_save_default(THD *, set_var *) override
{ DBUG_ASSERT(FALSE); } { DBUG_ASSERT(FALSE); }
void global_save_default(THD *, set_var *) override void global_save_default(THD *thd, set_var *var) override
{ DBUG_ASSERT(FALSE); } {
char *ptr= (char*)(intptr)option.def_value;
var->save_result.string_value.str= ptr;
var->save_result.string_value.length= ptr ? strlen(ptr) : 0;
}
bool session_update(THD *, set_var *) override bool session_update(THD *, set_var *) override
{ {

View file

@ -20,6 +20,7 @@
#include "thr_lock.h" /* THR_LOCK */ #include "thr_lock.h" /* THR_LOCK */
#include "handler.h" /* handler */ #include "handler.h" /* handler */
#include "table.h" /* TABLE_SHARE */ #include "table.h" /* TABLE_SHARE */
#include "sql_const.h" /* MAX_KEY */
/* /*
Shared structure for correct LOCK operation Shared structure for correct LOCK operation
@ -65,9 +66,9 @@ public:
HA_READ_ORDER | HA_KEYREAD_ONLY); HA_READ_ORDER | HA_KEYREAD_ONLY);
} }
/* The following defines can be increased if necessary */ /* The following defines can be increased if necessary */
#define BLACKHOLE_MAX_KEY 64 /* Max allowed keys */ #define BLACKHOLE_MAX_KEY MAX_KEY /* Max allowed keys */
#define BLACKHOLE_MAX_KEY_SEG 16 /* Max segments for key */ #define BLACKHOLE_MAX_KEY_SEG 16 /* Max segments for key */
#define BLACKHOLE_MAX_KEY_LENGTH 1000 #define BLACKHOLE_MAX_KEY_LENGTH 3500 /* Like in InnoDB */
uint max_supported_keys() const { return BLACKHOLE_MAX_KEY; } uint max_supported_keys() const { return BLACKHOLE_MAX_KEY; }
uint max_supported_key_length() const { return BLACKHOLE_MAX_KEY_LENGTH; } uint max_supported_key_length() const { return BLACKHOLE_MAX_KEY_LENGTH; }
uint max_supported_key_part_length() const { return BLACKHOLE_MAX_KEY_LENGTH; } uint max_supported_key_part_length() const { return BLACKHOLE_MAX_KEY_LENGTH; }

View file

@ -4531,14 +4531,13 @@ bool ha_connect::check_privileges(THD *thd, PTOS options, const char *dbn, bool
case TAB_DIR: case TAB_DIR:
case TAB_ZIP: case TAB_ZIP:
case TAB_OEM: case TAB_OEM:
if (table && table->pos_in_table_list) // if SELECT if (table && table->pos_in_table_list) { // if SELECT
{
#if MYSQL_VERSION_ID > 100200 #if MYSQL_VERSION_ID > 100200
Switch_to_definer_security_ctx backup_ctx(thd, table->pos_in_table_list); Switch_to_definer_security_ctx backup_ctx(thd, table->pos_in_table_list);
#endif // VERSION_ID > 100200 #endif // VERSION_ID > 100200
return check_global_access(thd, FILE_ACL); return check_global_access(thd, FILE_ACL);
} } else
else
return check_global_access(thd, FILE_ACL); return check_global_access(thd, FILE_ACL);
case TAB_ODBC: case TAB_ODBC:
case TAB_JDBC: case TAB_JDBC:
@ -4554,7 +4553,7 @@ bool ha_connect::check_privileges(THD *thd, PTOS options, const char *dbn, bool
case TAB_VIR: case TAB_VIR:
// This is temporary until a solution is found // This is temporary until a solution is found
return false; return false;
} // endswitch type } // endswitch type
my_printf_error(ER_UNKNOWN_ERROR, "check_privileges failed", MYF(0)); my_printf_error(ER_UNKNOWN_ERROR, "check_privileges failed", MYF(0));
return true; return true;

View file

@ -1174,6 +1174,7 @@ int maria_create(const char *name, enum data_file_type datafile_type,
FALSE, TRUE)) FALSE, TRUE))
goto err; goto err;
my_free(log_data); my_free(log_data);
log_data= 0;
} }
if (!(flags & HA_DONT_TOUCH_DATA)) if (!(flags & HA_DONT_TOUCH_DATA))

View file

@ -1533,8 +1533,11 @@ select (1.20396873 * 0.89550000 * 0.68000000 * 1.08721696 * 0.99500000 *
1.01500000 * 1.01500000 * 0.99500000) 1.01500000 * 1.01500000 * 0.99500000)
0.81298807395367312459230693948000000000 0.81298807395367312459230693948000000000
create table t1 as select 5.05 / 0.014; create table t1 as select 5.05 / 0.014;
Warnings:
Note 1265 Data truncated for column '5.05 / 0.014' at row 1
show warnings; show warnings;
Level Code Message Level Code Message
Note 1265 Data truncated for column '5.05 / 0.014' at row 1
show create table t1; show create table t1;
Table Create Table Table Create Table
t1 CREATE TABLE `t1` ( t1 CREATE TABLE `t1` (
@ -1649,6 +1652,8 @@ my_col
0.12345678912345678912345678912345678912 0.12345678912345678912345678912345678912
DROP TABLE t1; DROP TABLE t1;
CREATE TABLE t1 SELECT 1 / .123456789123456789123456789123456789123456789123456789123456789123456789123456789 AS my_col; CREATE TABLE t1 SELECT 1 / .123456789123456789123456789123456789123456789123456789123456789123456789123456789 AS my_col;
Warnings:
Note 1265 Data truncated for column 'my_col' at row 1
DESCRIBE t1; DESCRIBE t1;
Field Type Null Key Default Extra Field Type Null Key Default Extra
my_col decimal(65,4) YES NULL my_col decimal(65,4) YES NULL

View file

@ -92,6 +92,8 @@ DROP INDEX test ON t1;
insert into t1 values (10, 1,1,1,1,1,1,1,1,1,1,1,1,1,NULL,0,0,0,1,1,1,1,'one','one'); insert into t1 values (10, 1,1,1,1,1,1,1,1,1,1,1,1,1,NULL,0,0,0,1,1,1,1,'one','one');
insert into t1 values (NULL,2,2,2,2,2,2,2,2,2,2,2,2,2,NULL,NULL,NULL,NULL,NULL,NULL,2,2,'two','two,one'); insert into t1 values (NULL,2,2,2,2,2,2,2,2,2,2,2,2,2,NULL,NULL,NULL,NULL,NULL,NULL,2,2,'two','two,one');
insert into t1 values (0,1/3,3,3,3,3,3,3,3,3,3,3,3,3,NULL,'19970303','10:10:10','19970303101010','','','','3',3,3); insert into t1 values (0,1/3,3,3,3,3,3,3,3,3,3,3,3,3,NULL,'19970303','10:10:10','19970303101010','','','','3',3,3);
Warnings:
Warning 1265 Data truncated for column 'string' at row 1
insert into t1 values (0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,NULL,19970807,080706,19970403090807,-1,-1,-1,'-1',-1,-1); insert into t1 values (0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,NULL,19970807,080706,19970403090807,-1,-1,-1,'-1',-1,-1);
Warnings: Warnings:
Warning 1264 Out of range value for column 'utiny' at row 1 Warning 1264 Out of range value for column 'utiny' at row 1
@ -129,7 +131,7 @@ select auto,string,tiny,short,medium,long_int,longlong,real_float,real_double,ut
auto string tiny short medium long_int longlong real_float real_double utiny ushort umedium ulong ulonglong mod(floor(time_stamp/1000000),1000000)-mod(curdate(),1000000) date_field time_field date_time blob_col tinyblob_col mediumblob_col longblob_col auto string tiny short medium long_int longlong real_float real_double utiny ushort umedium ulong ulonglong mod(floor(time_stamp/1000000),1000000)-mod(curdate(),1000000) date_field time_field date_time blob_col tinyblob_col mediumblob_col longblob_col
10 1 1 1 1 1 1 1.0 1.0000 1 00001 1 1 1 0 0000-00-00 00:00:00 0000-00-00 00:00:00 1 1 1 1 10 1 1 1 1 1 1 1.0 1.0000 1 00001 1 1 1 0 0000-00-00 00:00:00 0000-00-00 00:00:00 1 1 1 1
11 2 2 2 2 2 2 2.0 2.0000 2 00002 2 2 2 0 NULL NULL NULL NULL NULL 2 2 11 2 2 2 2 2 2 2.0 2.0000 2 00002 2 2 2 0 NULL NULL NULL NULL NULL 2 2
12 0.3333 3 3 3 3 3 3.0 3.0000 3 00003 3 3 3 0 1997-03-03 10:10:10 1997-03-03 10:10:10 3 12 0.33333333 3 3 3 3 3 3.0 3.0000 3 00003 3 3 3 0 1997-03-03 10:10:10 1997-03-03 10:10:10 3
13 -1 -1 -1 -1 -1 -1 -1.0 -1.0000 0 00000 0 0 0 0 1997-08-07 08:07:06 1997-04-03 09:08:07 -1 -1 -1 -1 13 -1 -1 -1 -1 -1 -1 -1.0 -1.0000 0 00000 0 0 0 0 1997-08-07 08:07:06 1997-04-03 09:08:07 -1 -1 -1 -1
14 -429496729 -128 -32768 -8388608 -2147483648 -4294967295 -4294967296.0 -4294967295.0000 0 00000 0 0 0 0 0000-00-00 00:00:00 0000-00-00 00:00:00 -4294967295 -4294967295 -4294967295 -4294967295 14 -429496729 -128 -32768 -8388608 -2147483648 -4294967295 -4294967296.0 -4294967295.0000 0 00000 0 0 0 0 0000-00-00 00:00:00 0000-00-00 00:00:00 -4294967295 -4294967295 -4294967295 -4294967295
15 4294967295 127 32767 8388607 2147483647 4294967295 4294967296.0 4294967295.0000 255 65535 16777215 4294967295 4294967295 0 0000-00-00 00:00:00 0000-00-00 00:00:00 4294967295 4294967295 4294967295 4294967295 15 4294967295 127 32767 8388607 2147483647 4294967295 4294967296.0 4294967295.0000 255 65535 16777215 4294967295 4294967295 0 0000-00-00 00:00:00 0000-00-00 00:00:00 4294967295 4294967295 4294967295 4294967295
@ -181,7 +183,7 @@ Warning 1265 Data truncated for column 'new_field' at row 7
select * from t2; select * from t2;
auto string mediumblob_col new_field auto string mediumblob_col new_field
1 2 2 ne 1 2 2 ne
2 0.3333 ne 2 0.33333333 ne
3 -1 -1 ne 3 -1 -1 ne
4 -429496729 -4294967295 ne 4 -429496729 -4294967295 ne
5 4294967295 4294967295 ne 5 4294967295 4294967295 ne

View file

@ -20941,6 +20941,153 @@ static void test_explain_meta()
} }
#ifndef EMBEDDED_LIBRARY
#define MDEV19838_MAX_PARAM_COUNT 32
#define MDEV19838_FIELDS_COUNT 17
static void test_mdev19838()
{
int rc;
MYSQL_BIND bind[MDEV19838_MAX_PARAM_COUNT];
unsigned int i, paramCount = 1;
char charvalue[] = "012345678901234567890123456789012345";
MYSQL_STMT *stmt;
myheader("test_mdev19838");
rc = mysql_query(mysql, "CREATE TABLE mdev19838("
"f1 char(36),"
"f2 char(36),"
"f3 char(36),"
"f4 char(36),"
"f5 char(36),"
"f6 char(36),"
"f7 char(36),"
"f8 char(36),"
"f9 char(36),"
"f10 char(36),"
"f11 char(36),"
"f12 char(36),"
"f13 char(36),"
"f14 char(36),"
"f15 char(36),"
"f16 char(36),"
"f17 char(36)"
")");
myquery(rc);
stmt = mysql_stmt_init(mysql);
check_stmt(stmt);
memset(bind, 0, sizeof(bind));
for (i = 0; i < MDEV19838_MAX_PARAM_COUNT; ++i)
{
bind[i].buffer = charvalue;
bind[i].buffer_type = MYSQL_TYPE_STRING;
bind[i].buffer_length = strlen(charvalue) + 1;
bind[i].length = &bind[i].length_value;
bind[i].length_value = bind[i].buffer_length - 1;
}
for (paramCount = 1; paramCount < MDEV19838_FIELDS_COUNT; ++paramCount)
{
mysql_stmt_attr_set(stmt, STMT_ATTR_PREBIND_PARAMS, &paramCount);
rc = mysql_stmt_bind_param(stmt, bind);
check_execute(stmt, rc);
rc = mariadb_stmt_execute_direct(stmt, "INSERT INTO mdev19838"
"(f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, f16, f17)"
" VALUES "
"(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", -1);
/* Expecting an error */
DIE_UNLESS(rc != 0);
mysql_stmt_close(stmt);
stmt = mysql_stmt_init(mysql);
check_stmt(stmt);
}
paramCount = 0;
mysql_stmt_attr_set(stmt, STMT_ATTR_PREBIND_PARAMS, &paramCount);
rc = mariadb_stmt_execute_direct(stmt, "INSERT INTO mdev19838(f1)"
" VALUES (?)", -1);
/* Expecting an error */
DIE_UNLESS(rc != 0);
mysql_stmt_close(stmt);
stmt = mysql_stmt_init(mysql);
check_stmt(stmt);
/* Correct number of parameters */
paramCount = MDEV19838_FIELDS_COUNT;
mysql_stmt_attr_set(stmt, STMT_ATTR_PREBIND_PARAMS, &paramCount);
mysql_stmt_bind_param(stmt, bind);
rc = mariadb_stmt_execute_direct(stmt, "INSERT INTO mdev19838"
"(f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15, f16, f17)"
" VALUES "
"(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", -1);
check_execute(stmt, rc);
/* MYSQL_TYPE_TINY = 1. This parameter byte can be read as "parameters send" flag byte.
Checking that wrong packet is still detected */
bind[0].buffer_type = MYSQL_TYPE_TINY;
bind[0].length_value = 1;
bind[0].buffer_length = 1;
for (paramCount = 8; paramCount > 0; --paramCount)
{
mysql_stmt_close(stmt);
stmt = mysql_stmt_init(mysql);
check_stmt(stmt);
mysql_stmt_attr_set(stmt, STMT_ATTR_PREBIND_PARAMS, &paramCount);
rc = mysql_stmt_bind_param(stmt, bind);
check_execute(stmt, rc);
rc = mariadb_stmt_execute_direct(stmt, "INSERT INTO mdev19838"
"(f1, f2, f3, f4, f5, f6, f7, f8, f9)"
" VALUES "
"(?, ?, ?, ?, ?, ?, ?, ?, ?)", -1);
/* Expecting an error */
DIE_UNLESS(rc != 0);
}
/* Test of query w/out parameters, with parameter sent and not sent */
for (paramCount = MDEV19838_MAX_PARAM_COUNT; paramCount != (unsigned int)-1; --paramCount)
{
mysql_stmt_close(stmt);
stmt = mysql_stmt_init(mysql);
check_stmt(stmt);
mysql_stmt_attr_set(stmt, STMT_ATTR_PREBIND_PARAMS, &paramCount);
if (paramCount > 0)
{
rc = mysql_stmt_bind_param(stmt, bind);
check_execute(stmt, rc);
}
rc = mariadb_stmt_execute_direct(stmt, "INSERT INTO mdev19838"
"(f1)"
" VALUES "
"(0x1111111111111111)", -1);
/* Expecting an error if parameters are sent */
DIE_UNLESS(rc != 0 || paramCount == 0);
}
mysql_stmt_close(stmt);
rc = mysql_query(mysql, "drop table mdev19838");
myquery(rc);
}
#endif // EMBEDDED_LIBRARY
/* /*
MDEV-20261 NULL passed to String::eq, SEGV, server crash, regression in 10.4 MDEV-20261 NULL passed to String::eq, SEGV, server crash, regression in 10.4
*/ */
@ -21280,6 +21427,9 @@ static struct my_tests_st my_tests[]= {
#endif #endif
{ "test_ps_params_in_ctes", test_ps_params_in_ctes }, { "test_ps_params_in_ctes", test_ps_params_in_ctes },
{ "test_explain_meta", test_explain_meta }, { "test_explain_meta", test_explain_meta },
#ifndef EMBEDDED_LIBRARY
{ "test_mdev19838", test_mdev19838 },
#endif
{ "test_mdev18408", test_mdev18408 }, { "test_mdev18408", test_mdev18408 },
{ "test_mdev20261", test_mdev20261 }, { "test_mdev20261", test_mdev20261 },
{ 0, 0 } { 0, 0 }