1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-17 12:02:09 +03:00

Merge tulin@bk-internal.mysql.com:/home/bk/mysql-5.0

into dl145b.mysql.com:/home/ndbdev/tomas/mysql-5.1
This commit is contained in:
ndbdev@dl145b.mysql.com
2005-06-10 07:22:27 +02:00
46 changed files with 687 additions and 220 deletions

View File

@ -443,33 +443,33 @@ PS=$ac_cv_path_PS
# Linux style # Linux style
if $PS p $$ 2> /dev/null | grep $0 > /dev/null if $PS p $$ 2> /dev/null | grep $0 > /dev/null
then then
FIND_PROC="$PS p \$\$PID | grep \$\$MYSQLD > /dev/null" FIND_PROC="$PS p \$\$PID | grep -v grep | grep \$\$MYSQLD > /dev/null"
# Solaris # Solaris
elif $PS -fp $$ 2> /dev/null | grep $0 > /dev/null elif $PS -fp $$ 2> /dev/null | grep $0 > /dev/null
then then
FIND_PROC="$PS -p \$\$PID | grep \$\$MYSQLD > /dev/null" FIND_PROC="$PS -p \$\$PID | grep -v grep | grep \$\$MYSQLD > /dev/null"
# BSD style # BSD style
elif $PS -uaxww 2> /dev/null | grep $0 > /dev/null elif $PS -uaxww 2> /dev/null | grep $0 > /dev/null
then then
FIND_PROC="$PS -uaxww | grep \$\$MYSQLD | grep \" \$\$PID \" > /dev/null" FIND_PROC="$PS -uaxww | grep -v grep | grep \$\$MYSQLD | grep \" \$\$PID \" > /dev/null"
# SysV style # SysV style
elif $PS -ef 2> /dev/null | grep $0 > /dev/null elif $PS -ef 2> /dev/null | grep $0 > /dev/null
then then
FIND_PROC="$PS -ef | grep \$\$MYSQLD | grep \" \$\$PID \" > /dev/null" FIND_PROC="$PS -ef | grep -v grep | grep \$\$MYSQLD | grep \" \$\$PID \" > /dev/null"
# Do anybody use this? # Do anybody use this?
elif $PS $$ 2> /dev/null | grep $0 > /dev/null elif $PS $$ 2> /dev/null | grep $0 > /dev/null
then then
FIND_PROC="$PS \$\$PID | grep \$\$MYSQLD > /dev/null" FIND_PROC="$PS \$\$PID | grep -v grep | grep \$\$MYSQLD > /dev/null"
else else
case $SYSTEM_TYPE in case $SYSTEM_TYPE in
*freebsd*) *freebsd*)
FIND_PROC="$PS p \$\$PID | grep \$\$MYSQLD > /dev/null" FIND_PROC="$PS p \$\$PID | grep -v grep | grep \$\$MYSQLD > /dev/null"
;; ;;
*darwin*) *darwin*)
FIND_PROC="$PS -uaxww | grep \$\$MYSQLD | grep \" \$\$PID \" > /dev/null" FIND_PROC="$PS -uaxww | grep -v grep | grep \$\$MYSQLD | grep \" \$\$PID \" > /dev/null"
;; ;;
*cygwin*) *cygwin*)
FIND_PROC="$PS -e | grep \$\$MYSQLD | grep \" \$\$PID \" > /dev/null" FIND_PROC="$PS -e | grep -v grep | grep \$\$MYSQLD | grep \" \$\$PID \" > /dev/null"
;; ;;
*netware*) *netware*)
FIND_PROC= FIND_PROC=

View File

@ -68,8 +68,9 @@ typedef unsigned int word32;
// TODO: FIXME, add asm multiply for x86_64 on Solaris and remove !__sun // TODO: FIXME, add asm multiply for x86_64 on Solaris and remove !__sun
#if defined(__alpha__) || defined(__ia64__) || defined(_ARCH_PPC64) || \ #if defined(__alpha__) || (defined(__ia64__) && !defined(__INTEL_COMPILER)) || \
defined(__mips64) || (defined(__x86_64__) && !defined(__sun)) defined(_ARCH_PPC64) || defined(__mips64) || \
(defined(__x86_64__) && !defined(__sun))
// These platforms have 64-bit CPU registers. Unfortunately most C++ compilers // These platforms have 64-bit CPU registers. Unfortunately most C++ compilers
// don't allow any way to access the 64-bit by 64-bit multiply instruction // don't allow any way to access the 64-bit by 64-bit multiply instruction
// without using assembly, so in order to use word64 as word, the assembly // without using assembly, so in order to use word64 as word, the assembly

View File

@ -285,13 +285,7 @@ C_MODE_END
# endif # endif
#endif /* TIME_WITH_SYS_TIME */ #endif /* TIME_WITH_SYS_TIME */
#ifdef HAVE_UNISTD_H #ifdef HAVE_UNISTD_H
#if defined(HAVE_OPENSSL) && !defined(__FreeBSD__) && !defined(NeXT) && !defined(__OpenBSD__) && !defined(__APPLE__)
#define crypt unistd_crypt
#endif
#include <unistd.h> #include <unistd.h>
#ifdef HAVE_OPENSSL
#undef crypt
#endif
#endif #endif
#if defined(__cplusplus) && defined(NO_CPLUSPLUS_ALLOCA) #if defined(__cplusplus) && defined(NO_CPLUSPLUS_ALLOCA)
#undef HAVE_ALLOCA #undef HAVE_ALLOCA

View File

@ -0,0 +1,32 @@
create table t1 (a bigint);
lock tables t1 write;
insert into t1 values(0);
analyze table t1;
Table Op Msg_type Msg_text
test.t1 analyze status OK
unlock tables;
check table t1;
Table Op Msg_type Msg_text
test.t1 check status OK
drop table t1;
create table t1 (a bigint);
insert into t1 values(0);
lock tables t1 write;
delete from t1;
analyze table t1;
Table Op Msg_type Msg_text
test.t1 analyze status OK
unlock tables;
check table t1;
Table Op Msg_type Msg_text
test.t1 check status OK
drop table t1;
create table t1 (a bigint);
insert into t1 values(0);
analyze table t1;
Table Op Msg_type Msg_text
test.t1 analyze status OK
check table t1;
Table Op Msg_type Msg_text
test.t1 check status OK
drop table t1;

View File

@ -596,3 +596,9 @@ ERROR 42000: Incorrect database name 'xyz'
create table t1(t1.name int); create table t1(t1.name int);
create table t2(test.t2.name int); create table t2(test.t2.name int);
drop table t1,t2; drop table t1,t2;
create database mysqltest;
use mysqltest;
drop database mysqltest;
create table test.t1 like x;
ERROR 42000: Incorrect database name 'NULL'
drop table if exists test.t1;

View File

@ -143,3 +143,6 @@ select format(col2,6) from t1 where col1=7;
format(col2,6) format(col2,6)
1,234,567,890,123,456.123450 1,234,567,890,123,456.123450
drop table t1; drop table t1;
select round(150, 2);
round(150, 2)
150.00

View File

@ -696,3 +696,8 @@ drop table t1;
create table t1 (a int not null, b int not null auto_increment, create table t1 (a int not null, b int not null auto_increment,
primary key(a, b)) engine=heap; primary key(a, b)) engine=heap;
ERROR 42000: Incorrect table definition; there can be only one auto column and it must be defined as a key ERROR 42000: Incorrect table definition; there can be only one auto column and it must be defined as a key
create table t1 (c char(255), primary key(c(90)));
insert into t1 values ("abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz");
insert into t1 values ("abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz");
ERROR 23000: Duplicate entry 'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijkl' for key 1
drop table t1;

View File

@ -132,6 +132,22 @@ a b
handler t2 read last; handler t2 read last;
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1 ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
handler t2 close; handler t2 close;
handler t1 open;
handler t1 read a next;
a b
14 aaa
handler t1 read a next;
a b
15 bbb
handler t1 close;
handler t1 open;
handler t1 read a prev;
a b
22 iii
handler t1 read a prev;
a b
21 hhh
handler t1 close;
handler t1 open as t2; handler t1 open as t2;
handler t2 read first; handler t2 read first;
a b a b

View File

@ -329,3 +329,28 @@ ERROR 42S21: Duplicate column name 'c1'
alter table t1 add key (c1,c1,c2); alter table t1 add key (c1,c1,c2);
ERROR 42S21: Duplicate column name 'c1' ERROR 42S21: Duplicate column name 'c1'
drop table t1; drop table t1;
create table t1 (a varchar(10), b varchar(10), key(a(10),b(10)));
show create table t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` varchar(10) default NULL,
`b` varchar(10) default NULL,
KEY `a` (`a`,`b`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
alter table t1 modify b varchar(20);
show create table t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` varchar(10) default NULL,
`b` varchar(20) default NULL,
KEY `a` (`a`,`b`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
alter table t1 modify a varchar(20);
show create table t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` varchar(20) default NULL,
`b` varchar(20) default NULL,
KEY `a` (`a`,`b`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop table t1;

View File

@ -2682,3 +2682,20 @@ AND FK_firma_id = 2;
COUNT(*) COUNT(*)
0 0
drop table t1; drop table t1;
CREATE TABLE t1 (a int);
CREATE TABLE t2 (a int);
INSERT INTO t1 VALUES (1), (2), (3), (4), (5);
INSERT INTO t2 VALUES (2), (4), (6);
SELECT t1.a FROM t1 STRAIGHT_JOIN t2 ON t1.a=t2.a;
a
2
4
EXPLAIN SELECT t1.a FROM t1 STRAIGHT_JOIN t2 ON t1.a=t2.a;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 ALL NULL NULL NULL NULL 5
1 SIMPLE t2 ALL NULL NULL NULL NULL 3 Using where
EXPLAIN SELECT t1.a FROM t1 INNER JOIN t2 ON t1.a=t2.a;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t2 ALL NULL NULL NULL NULL 3
1 SIMPLE t1 ALL NULL NULL NULL NULL 5 Using where
DROP TABLE t1,t2;

View File

@ -138,6 +138,8 @@ t1 CREATE TABLE `t1` (
`min_num` decimal(7,6) default '0.000001' `min_num` decimal(7,6) default '0.000001'
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop table t1 ; drop table t1 ;
set @@SQL_MODE=NULL;
ERROR 42000: Variable 'sql_mode' can't be set to the value of 'NULL'
SET @OLD_SQL_MODE=@@SQL_MODE, @@SQL_MODE=''; SET @OLD_SQL_MODE=@@SQL_MODE, @@SQL_MODE='';
show local variables like 'SQL_MODE'; show local variables like 'SQL_MODE';
Variable_name Value Variable_name Value

View File

@ -896,6 +896,14 @@ create table t1( d1 decimal(18) unsigned, d2 decimal(20) unsigned, d3 decimal (2
insert into t1 values(1,-1,-1); insert into t1 values(1,-1,-1);
ERROR 22003: Out of range value adjusted for column 'd2' at row 1 ERROR 22003: Out of range value adjusted for column 'd2' at row 1
drop table t1; drop table t1;
create table t1 (col1 decimal(5,2), col2 numeric(5,2));
insert into t1 values (999.999,999.999);
ERROR 22003: Out of range value adjusted for column 'col1' at row 1
insert into t1 values (-999.999,-999.999);
ERROR 22003: Out of range value adjusted for column 'col1' at row 1
select * from t1;
col1 col2
drop table t1;
set sql_mode=''; set sql_mode='';
set @sav_dpi= @@div_precision_increment; set @sav_dpi= @@div_precision_increment;
set @@div_precision_increment=15; set @@div_precision_increment=15;

View File

@ -126,13 +126,13 @@ Some sample data
Some samples Some samples
explain select * from t1 where v like 'This is a test' order by v; explain select * from t1 where v like 'This is a test' order by v;
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 range v v 257 NULL 3 Using where; Using filesort 1 SIMPLE t1 range v v 258 NULL 3 Using where; Using index
explain select * from t1 where v='This is a test' order by v; explain select * from t1 where v='This is a test' order by v;
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 ref v v 257 const 3 Using where 1 SIMPLE t1 ref v v 258 const 3 Using where; Using index
explain select * from t1 where v like 'S%' order by v; explain select * from t1 where v like 'S%' order by v;
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 range v v 257 NULL 2 Using where; Using filesort 1 SIMPLE t1 range v v 258 NULL 2 Using where; Using index
alter table t1 change v v varchar(256); alter table t1 change v v varchar(256);
select * from t1 where v like 'This is a test' order by v; select * from t1 where v like 'This is a test' order by v;
v v
@ -150,13 +150,13 @@ Some sample data
Some samples Some samples
explain select * from t1 where v like 'This is a test' order by v; explain select * from t1 where v like 'This is a test' order by v;
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 range v v 257 NULL 3 Using where; Using filesort 1 SIMPLE t1 range v v 259 NULL 3 Using where; Using index
explain select * from t1 where v='This is a test' order by v; explain select * from t1 where v='This is a test' order by v;
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 ref v v 257 const 3 Using where 1 SIMPLE t1 ref v v 259 const 3 Using where; Using index
explain select * from t1 where v like 'S%' order by v; explain select * from t1 where v like 'S%' order by v;
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 range v v 257 NULL 2 Using where; Using filesort 1 SIMPLE t1 range v v 259 NULL 2 Using where; Using index
alter table t1 change v v varchar(257); alter table t1 change v v varchar(257);
select * from t1 where v like 'This is a test' order by v; select * from t1 where v like 'This is a test' order by v;
v v
@ -174,13 +174,13 @@ Some sample data
Some samples Some samples
explain select * from t1 where v like 'This is a test' order by v; explain select * from t1 where v like 'This is a test' order by v;
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 range v v 257 NULL 3 Using where; Using filesort 1 SIMPLE t1 range v v 260 NULL 3 Using where; Using index
explain select * from t1 where v='This is a test' order by v; explain select * from t1 where v='This is a test' order by v;
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 ref v v 257 const 3 Using where 1 SIMPLE t1 ref v v 260 const 3 Using where; Using index
explain select * from t1 where v like 'S%' order by v; explain select * from t1 where v like 'S%' order by v;
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 range v v 257 NULL 2 Using where; Using filesort 1 SIMPLE t1 range v v 260 NULL 2 Using where; Using index
alter table t1 change v v varchar(258); alter table t1 change v v varchar(258);
select * from t1 where v like 'This is a test' order by v; select * from t1 where v like 'This is a test' order by v;
v v
@ -198,13 +198,13 @@ Some sample data
Some samples Some samples
explain select * from t1 where v like 'This is a test' order by v; explain select * from t1 where v like 'This is a test' order by v;
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 range v v 257 NULL 3 Using where; Using filesort 1 SIMPLE t1 range v v 261 NULL 3 Using where; Using index
explain select * from t1 where v='This is a test' order by v; explain select * from t1 where v='This is a test' order by v;
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 ref v v 257 const 3 Using where 1 SIMPLE t1 ref v v 261 const 3 Using where; Using index
explain select * from t1 where v like 'S%' order by v; explain select * from t1 where v like 'S%' order by v;
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 range v v 257 NULL 2 Using where; Using filesort 1 SIMPLE t1 range v v 261 NULL 2 Using where; Using index
alter table t1 change v v varchar(259); alter table t1 change v v varchar(259);
select * from t1 where v like 'This is a test' order by v; select * from t1 where v like 'This is a test' order by v;
v v
@ -222,13 +222,13 @@ Some sample data
Some samples Some samples
explain select * from t1 where v like 'This is a test' order by v; explain select * from t1 where v like 'This is a test' order by v;
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 range v v 257 NULL 3 Using where; Using filesort 1 SIMPLE t1 range v v 262 NULL 3 Using where; Using index
explain select * from t1 where v='This is a test' order by v; explain select * from t1 where v='This is a test' order by v;
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 ref v v 257 const 3 Using where 1 SIMPLE t1 ref v v 262 const 3 Using where; Using index
explain select * from t1 where v like 'S%' order by v; explain select * from t1 where v like 'S%' order by v;
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 range v v 257 NULL 2 Using where; Using filesort 1 SIMPLE t1 range v v 262 NULL 2 Using where; Using index
alter table t1 change v v varchar(258); alter table t1 change v v varchar(258);
select * from t1 where v like 'This is a test' order by v; select * from t1 where v like 'This is a test' order by v;
v v
@ -246,13 +246,13 @@ Some sample data
Some samples Some samples
explain select * from t1 where v like 'This is a test' order by v; explain select * from t1 where v like 'This is a test' order by v;
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 range v v 257 NULL 3 Using where; Using filesort 1 SIMPLE t1 range v v 261 NULL 3 Using where; Using index
explain select * from t1 where v='This is a test' order by v; explain select * from t1 where v='This is a test' order by v;
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 ref v v 257 const 3 Using where 1 SIMPLE t1 ref v v 261 const 3 Using where; Using index
explain select * from t1 where v like 'S%' order by v; explain select * from t1 where v like 'S%' order by v;
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 range v v 257 NULL 2 Using where; Using filesort 1 SIMPLE t1 range v v 261 NULL 2 Using where; Using index
alter table t1 change v v varchar(257); alter table t1 change v v varchar(257);
select * from t1 where v like 'This is a test' order by v; select * from t1 where v like 'This is a test' order by v;
v v
@ -270,13 +270,13 @@ Some sample data
Some samples Some samples
explain select * from t1 where v like 'This is a test' order by v; explain select * from t1 where v like 'This is a test' order by v;
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 range v v 257 NULL 3 Using where; Using filesort 1 SIMPLE t1 range v v 260 NULL 3 Using where; Using index
explain select * from t1 where v='This is a test' order by v; explain select * from t1 where v='This is a test' order by v;
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 ref v v 257 const 3 Using where 1 SIMPLE t1 ref v v 260 const 3 Using where; Using index
explain select * from t1 where v like 'S%' order by v; explain select * from t1 where v like 'S%' order by v;
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 range v v 257 NULL 2 Using where; Using filesort 1 SIMPLE t1 range v v 260 NULL 2 Using where; Using index
alter table t1 change v v varchar(256); alter table t1 change v v varchar(256);
select * from t1 where v like 'This is a test' order by v; select * from t1 where v like 'This is a test' order by v;
v v
@ -294,13 +294,13 @@ Some sample data
Some samples Some samples
explain select * from t1 where v like 'This is a test' order by v; explain select * from t1 where v like 'This is a test' order by v;
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 range v v 257 NULL 3 Using where; Using filesort 1 SIMPLE t1 range v v 259 NULL 3 Using where; Using index
explain select * from t1 where v='This is a test' order by v; explain select * from t1 where v='This is a test' order by v;
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 ref v v 257 const 3 Using where 1 SIMPLE t1 ref v v 259 const 3 Using where; Using index
explain select * from t1 where v like 'S%' order by v; explain select * from t1 where v like 'S%' order by v;
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 range v v 257 NULL 2 Using where; Using filesort 1 SIMPLE t1 range v v 259 NULL 2 Using where; Using index
alter table t1 change v v varchar(255); alter table t1 change v v varchar(255);
select * from t1 where v like 'This is a test' order by v; select * from t1 where v like 'This is a test' order by v;
v v
@ -318,13 +318,13 @@ Some sample data
Some samples Some samples
explain select * from t1 where v like 'This is a test' order by v; explain select * from t1 where v like 'This is a test' order by v;
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 range v v 257 NULL 3 Using where; Using filesort 1 SIMPLE t1 range v v 258 NULL 3 Using where; Using index
explain select * from t1 where v='This is a test' order by v; explain select * from t1 where v='This is a test' order by v;
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 ref v v 257 const 3 Using where 1 SIMPLE t1 ref v v 258 const 3 Using where; Using index
explain select * from t1 where v like 'S%' order by v; explain select * from t1 where v like 'S%' order by v;
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 range v v 257 NULL 2 Using where; Using filesort 1 SIMPLE t1 range v v 258 NULL 2 Using where; Using index
alter table t1 change v v varchar(254); alter table t1 change v v varchar(254);
select * from t1 where v like 'This is a test' order by v; select * from t1 where v like 'This is a test' order by v;
v v
@ -392,3 +392,26 @@ group by t1.b, t1.a;
a b min(t1.b) a b min(t1.b)
22 NULL NULL 22 NULL NULL
drop table t1, t2; drop table t1, t2;
create table t1 (f1 varchar(65500));
create index index1 on t1(f1(10));
show create table t1;
Table Create Table
t1 CREATE TABLE `t1` (
`f1` varchar(65500) default NULL,
KEY `index1` (`f1`(10))
) ENGINE=MyISAM DEFAULT CHARSET=latin1
alter table t1 modify f1 varchar(255);
show create table t1;
Table Create Table
t1 CREATE TABLE `t1` (
`f1` varchar(255) default NULL,
KEY `index1` (`f1`(10))
) ENGINE=MyISAM DEFAULT CHARSET=latin1
alter table t1 modify f1 tinytext;
show create table t1;
Table Create Table
t1 CREATE TABLE `t1` (
`f1` tinytext,
KEY `index1` (`f1`(10))
) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop table t1;

39
mysql-test/t/analyze.test Normal file
View File

@ -0,0 +1,39 @@
#
# Bug #10901 Analyze Table on new table destroys table
# This is minimal test case to get error
# The problem was that analyze table wrote the shared state to the file and this
# didn't include the inserts while locked. A check was needed to ensure that
# state information was not updated when executing analyze table for a locked table.
# The analyze table had to be within locks and check table had to be after unlocking
# since then it brings the wrong state from disk rather than from the currently
# correct internal state. The insert is needed since it changes the file state,
# number of records.
# The fix is to synchronise the state of the shared state and the current state before
# calling mi_state_info_write
#
create table t1 (a bigint);
lock tables t1 write;
insert into t1 values(0);
analyze table t1;
unlock tables;
check table t1;
drop table t1;
create table t1 (a bigint);
insert into t1 values(0);
lock tables t1 write;
delete from t1;
analyze table t1;
unlock tables;
check table t1;
drop table t1;
create table t1 (a bigint);
insert into t1 values(0);
analyze table t1;
check table t1;
drop table t1;

View File

@ -503,3 +503,14 @@ create table t1(t1.name int);
create table t2(test.t2.name int); create table t2(test.t2.name int);
drop table t1,t2; drop table t1,t2;
#
# Bug#11028: Crash on create table like
#
create database mysqltest;
use mysqltest;
drop database mysqltest;
--error 1102
create table test.t1 like x;
--disable_warnings
drop table if exists test.t1;
--enable_warnings

View File

@ -79,3 +79,8 @@ insert into t1 values(7,1234567890123456.12345);
select format(col2,6) from t1 where col1=7; select format(col2,6) from t1 where col1=7;
drop table t1; drop table t1;
#
# Bug #10083 (round doesn't increase decimals)
#
select round(150, 2);

View File

@ -426,3 +426,12 @@ drop table t1;
--error 1075 --error 1075
create table t1 (a int not null, b int not null auto_increment, create table t1 (a int not null, b int not null auto_increment,
primary key(a, b)) engine=heap; primary key(a, b)) engine=heap;
#
# Bug #10566: Verify that we can create a prefixed key with length > 255
#
create table t1 (c char(255), primary key(c(90)));
insert into t1 values ("abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz");
--error 1062
insert into t1 values ("abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz");
drop table t1;

View File

@ -69,6 +69,16 @@ handler t2 read next;
handler t2 read last; handler t2 read last;
handler t2 close; handler t2 close;
handler t1 open;
handler t1 read a next; # this used to crash as a bug#5373
handler t1 read a next;
handler t1 close;
handler t1 open;
handler t1 read a prev; # this used to crash as a bug#5373
handler t1 read a prev;
handler t1 close;
handler t1 open as t2; handler t1 open as t2;
handler t2 read first; handler t2 read first;
alter table t1 engine=innodb; alter table t1 engine=innodb;

View File

@ -324,3 +324,16 @@ alter table t1 add key (c1,c2,c1);
--error 1060 --error 1060
alter table t1 add key (c1,c1,c2); alter table t1 add key (c1,c1,c2);
drop table t1; drop table t1;
#
# If we use a partial field for a key that is actually the length of the
# field, and we extend the field, we end up with a key that includes the
# whole new length of the field.
#
create table t1 (a varchar(10), b varchar(10), key(a(10),b(10)));
show create table t1;
alter table t1 modify b varchar(20);
show create table t1;
alter table t1 modify a varchar(20);
show create table t1;
drop table t1;

View File

@ -2255,3 +2255,19 @@ AND FK_firma_id = 2;
drop table t1; drop table t1;
#
# Test for bug #10084: STRAIGHT_JOIN with ON expression
#
CREATE TABLE t1 (a int);
CREATE TABLE t2 (a int);
INSERT INTO t1 VALUES (1), (2), (3), (4), (5);
INSERT INTO t2 VALUES (2), (4), (6);
SELECT t1.a FROM t1 STRAIGHT_JOIN t2 ON t1.a=t2.a;
EXPLAIN SELECT t1.a FROM t1 STRAIGHT_JOIN t2 ON t1.a=t2.a;
EXPLAIN SELECT t1.a FROM t1 INNER JOIN t2 ON t1.a=t2.a;
DROP TABLE t1,t2;

View File

@ -80,6 +80,11 @@ create table t1 ( min_num dec(6,6) default .000001);
show create table t1; show create table t1;
drop table t1 ; drop table t1 ;
#
# Bug #10732: Set SQL_MODE to NULL gives garbled error message
#
--error 1231
set @@SQL_MODE=NULL;
# #
# test for # test for

View File

@ -934,6 +934,13 @@ create table t1( d1 decimal(18) unsigned, d2 decimal(20) unsigned, d3 decimal (2
--error 1264 --error 1264
insert into t1 values(1,-1,-1); insert into t1 values(1,-1,-1);
drop table t1; drop table t1;
create table t1 (col1 decimal(5,2), col2 numeric(5,2));
--error 1264
insert into t1 values (999.999,999.999);
--error 1264
insert into t1 values (-999.999,-999.999);
select * from t1;
drop table t1;
set sql_mode=''; set sql_mode='';
# #

View File

@ -118,3 +118,15 @@ insert into t2 values (22), (22);
select t1.a, t1.b, min(t1.b) from t1 inner join t2 ON t2.a = t1.a select t1.a, t1.b, min(t1.b) from t1 inner join t2 ON t2.a = t1.a
group by t1.b, t1.a; group by t1.b, t1.a;
drop table t1, t2; drop table t1, t2;
#
# Bug #10543: convert varchar with index to text
#
create table t1 (f1 varchar(65500));
create index index1 on t1(f1(10));
show create table t1;
alter table t1 modify f1 varchar(255);
show create table t1;
alter table t1 modify f1 tinytext;
show create table t1;
drop table t1;

View File

@ -37,22 +37,20 @@
#define NEWLINE_LEN 1 #define NEWLINE_LEN 1
#endif #endif
static char *add_option(char *dst, const char *option_value,
const char *option, int remove_option);
int modify_defaults_file(const char *file_location, const char *option, int modify_defaults_file(const char *file_location, const char *option,
const char *option_value, const char *option_value,
const char *section_name, int remove_option) const char *section_name, int remove_option)
{ {
FILE *cnf_file; FILE *cnf_file;
MY_STAT file_stat; MY_STAT file_stat;
char linebuff[BUFF_SIZE], tmp[BUFF_SIZE], *tmp_ptr, *src_ptr, *dst_ptr, char linebuff[BUFF_SIZE], *src_ptr, *dst_ptr, *file_buffer;
*file_buffer; uint optlen, optval_len, sect_len, nr_newlines= 0;
uint optlen, optval_len, sect_len; my_bool in_section= FALSE, opt_applied= 0;
my_bool in_section= FALSE;
DBUG_ENTER("modify_defaults_file"); DBUG_ENTER("modify_defaults_file");
optlen= strlen(option);
optval_len= strlen(option_value);
sect_len= strlen(section_name);
if (!(cnf_file= my_fopen(file_location, O_RDWR | O_BINARY, MYF(0)))) if (!(cnf_file= my_fopen(file_location, O_RDWR | O_BINARY, MYF(0))))
DBUG_RETURN(2); DBUG_RETURN(2);
@ -60,6 +58,9 @@ int modify_defaults_file(const char *file_location, const char *option,
if (my_fstat(fileno(cnf_file), &file_stat, MYF(0))) if (my_fstat(fileno(cnf_file), &file_stat, MYF(0)))
goto err; goto err;
optlen= strlen(option);
optval_len= strlen(option_value);
/* /*
Reserve space to read the contents of the file and some more Reserve space to read the contents of the file and some more
for the option we want to add. for the option we want to add.
@ -73,35 +74,44 @@ int modify_defaults_file(const char *file_location, const char *option,
/* reserve for '=' char */ /* reserve for '=' char */
1 + 1 +
/* option value len */ /* option value len */
optval_len), MYF(MY_WME)))) optval_len +
/* The ending zero plus some safety */
FN_REFLEN), MYF(MY_WME))))
goto malloc_err; goto malloc_err;
for (dst_ptr= file_buffer, tmp_ptr= 0; sect_len= strlen(section_name);
fgets(linebuff, BUFF_SIZE, cnf_file); )
for (dst_ptr= file_buffer; fgets(linebuff, BUFF_SIZE, cnf_file); )
{ {
/* Skip over whitespaces */ /* Skip over whitespaces */
for (src_ptr= linebuff; my_isspace(&my_charset_latin1, *src_ptr); for (src_ptr= linebuff; my_isspace(&my_charset_latin1, *src_ptr);
src_ptr++) src_ptr++)
{} {}
if (in_section && !strncmp(src_ptr, option, optlen) && if (!*src_ptr) /* Empty line */
{
nr_newlines++;
continue;
}
if (!opt_applied && in_section && !strncmp(src_ptr, option, optlen) &&
(*(src_ptr + optlen) == '=' || (*(src_ptr + optlen) == '=' ||
my_isspace(&my_charset_latin1, *(src_ptr + optlen)) || my_isspace(&my_charset_latin1, *(src_ptr + optlen)) ||
*(src_ptr + optlen) == '\0')) *(src_ptr + optlen) == '\0'))
{ {
/* The option under modifying was found in this section. Apply new. */ dst_ptr= add_option(dst_ptr, option_value, option, remove_option);
if (!remove_option) opt_applied= 1;
dst_ptr= strmov(dst_ptr, tmp);
tmp_ptr= 0; /* To mark that we have already applied this */
} }
else else
{ {
/* If going to new group and we have option to apply, do it now */ /* If going to new group and we have option to apply, do it now */
if (tmp_ptr && *src_ptr == '[') if (in_section && !opt_applied && *src_ptr == '[')
{ {
dst_ptr= strmov(dst_ptr, tmp); dst_ptr= add_option(dst_ptr, option_value, option, remove_option);
tmp_ptr= 0;
} }
for (; nr_newlines; nr_newlines--)
dst_ptr= strmov(dst_ptr, NEWLINE);
dst_ptr= strmov(dst_ptr, linebuff); dst_ptr= strmov(dst_ptr, linebuff);
} }
/* Look for a section */ /* Look for a section */
@ -117,43 +127,38 @@ int modify_defaults_file(const char *file_location, const char *option,
if (*src_ptr != ']') if (*src_ptr != ']')
continue; /* Missing closing parenthesis. Assume this was no group */ continue; /* Missing closing parenthesis. Assume this was no group */
in_section= TRUE; in_section= TRUE;
/* add option */
if (!remove_option)
{
tmp_ptr= strmov(tmp, option);
if (*option_value)
{
*tmp_ptr++= '=';
tmp_ptr= strmov(tmp_ptr, option_value);
}
/* add a newline */
strmov(tmp_ptr, NEWLINE);
}
} }
else else
in_section= FALSE; /* mark that this section is of no interest to us */ in_section= FALSE; /* mark that this section is of no interest to us */
} }
} }
/* File ended. New option still remains to apply at the end */ /* File ended. */
if (tmp_ptr) if (!opt_applied && !remove_option && in_section)
{ {
/* New option still remains to apply at the end */
if (*(dst_ptr - 1) != '\n') if (*(dst_ptr - 1) != '\n')
*dst_ptr++= '\n'; dst_ptr= strmov(dst_ptr, NEWLINE);
dst_ptr= strmov(dst_ptr, tmp); dst_ptr= add_option(dst_ptr, option_value, option, remove_option);
opt_applied= 1;
} }
for (; nr_newlines; nr_newlines--)
dst_ptr= strmov(dst_ptr, NEWLINE);
if (opt_applied)
{
/* Don't write the file if there are no changes to be made */
if (my_chsize(fileno(cnf_file), (my_off_t) (dst_ptr - file_buffer), 0, if (my_chsize(fileno(cnf_file), (my_off_t) (dst_ptr - file_buffer), 0,
MYF(MY_WME)) || MYF(MY_WME)) ||
my_fseek(cnf_file, 0, MY_SEEK_SET, MYF(0)) || my_fseek(cnf_file, 0, MY_SEEK_SET, MYF(0)) ||
my_fwrite(cnf_file, file_buffer, (uint) (dst_ptr - file_buffer), my_fwrite(cnf_file, file_buffer, (uint) (dst_ptr - file_buffer),
MYF(MY_NABP)) || MYF(MY_NABP)))
my_fclose(cnf_file, MYF(MY_WME))) goto err;
}
if (my_fclose(cnf_file, MYF(MY_WME)))
goto err; goto err;
my_free(file_buffer, MYF(0)); my_free(file_buffer, MYF(0));
DBUG_RETURN(0); DBUG_RETURN(0);
err: err:
@ -162,3 +167,21 @@ malloc_err:
my_fclose(cnf_file, MYF(0)); my_fclose(cnf_file, MYF(0));
DBUG_RETURN(1); /* out of resources */ DBUG_RETURN(1); /* out of resources */
} }
static char *add_option(char *dst, const char *option_value,
const char *option, int remove_option)
{
if (!remove_option)
{
dst= strmov(dst, option);
if (*option_value)
{
*dst++= '=';
dst= strmov(dst, option_value);
}
/* add a newline */
dst= strmov(dst, NEWLINE);
}
return dst;
}

View File

@ -262,7 +262,25 @@ static void movelink(HASH_LINK *array,uint find,uint next_link,uint newlink)
return; return;
} }
/* Compare a key in a record to a whole key. Return 0 if identical */ /*
Compare a key in a record to a whole key. Return 0 if identical
SYNOPSIS
hashcmp()
hash hash table
pos position of hash record to use in comparison
key key for comparison
length length of key
NOTES:
If length is 0, comparison is done using the length of the
record being compared against.
RETURN
< 0 key of record < key
= 0 key of record == key
> 0 key of record > key
*/
static int hashcmp(HASH *hash,HASH_LINK *pos,const byte *key,uint length) static int hashcmp(HASH *hash,HASH_LINK *pos,const byte *key,uint length)
{ {
@ -270,7 +288,7 @@ static int hashcmp(HASH *hash,HASH_LINK *pos,const byte *key,uint length)
byte *rec_key= (byte*) hash_key(hash,pos->data,&rec_keylength,1); byte *rec_key= (byte*) hash_key(hash,pos->data,&rec_keylength,1);
return ((length && length != rec_keylength) || return ((length && length != rec_keylength) ||
my_strnncoll(hash->charset, (uchar*) rec_key, rec_keylength, my_strnncoll(hash->charset, (uchar*) rec_key, rec_keylength,
(uchar*) key, length)); (uchar*) key, rec_keylength));
} }

View File

@ -158,32 +158,52 @@ FILE *my_fdopen(File Filedes, const char *name, int Flags, myf MyFlags)
DBUG_RETURN(fd); DBUG_RETURN(fd);
} /* my_fdopen */ } /* my_fdopen */
/*
make_ftype
Make a filehandler-open-typestring from ordinary inputflags
/* Make a filehandler-open-typestring from ordinary inputflags */ Note: This routine attempts to find the best possible match
between a numeric option and a string option that could be
fed to fopen. There is not a 1 to 1 mapping between the two.
r == O_RDONLY
w == O_WRONLY|O_TRUNC|O_CREAT
a == O_WRONLY|O_APPEND|O_CREAT
r+ == O_RDWR
w+ == O_RDWR|O_TRUNC|O_CREAT
a+ == O_RDWR|O_APPEND|O_CREAT
*/
static void make_ftype(register my_string to, register int flag) static void make_ftype(register my_string to, register int flag)
{ {
#if FILE_BINARY /* If we have binary-files */ #if FILE_BINARY
/* If we have binary-files */
reg3 int org_flag=flag; reg3 int org_flag=flag;
#endif #endif
flag&= ~FILE_BINARY; /* remove binary bit */ flag&= ~FILE_BINARY; /* remove binary bit */
if (flag == O_RDONLY)
*to++= 'r'; /* check some possible invalid combinations */
else if (flag == O_WRONLY) DBUG_ASSERT(flag & (O_TRUNC|O_APPEND) != O_TRUNC|O_APPEND);
if (flag & (O_RDONLY|O_WRONLY) == O_WRONLY)
*to++= (flag & O_APPEND) ? 'a' : 'w';
else if (flag & O_RDWR)
{
/* Add '+' after theese */
if (flag & (O_TRUNC | O_CREAT))
*to++= 'w'; *to++= 'w';
else
{ /* Add '+' after theese */
if (flag == O_RDWR)
*to++= 'r';
else if (flag & O_APPEND) else if (flag & O_APPEND)
*to++= 'a'; *to++= 'a';
else else
*to++= 'w'; /* Create file */ *to++= 'r';
*to++= '+'; *to++= '+';
} }
else
*to++= 'r';
#if FILE_BINARY /* If we have binary-files */ #if FILE_BINARY /* If we have binary-files */
if (org_flag & FILE_BINARY) if (org_flag & FILE_BINARY)
*to++='b'; *to++='b';
#endif #endif
*to='\0'; *to='\0';
} /* make_ftype */ } /* make_ftype */

View File

@ -982,6 +982,39 @@ Item_result Field::result_merge_type(enum_field_types field_type)
Static help functions Static help functions
*****************************************************************************/ *****************************************************************************/
/*
Check whether a field type can be partially indexed by a key
This is a static method, rather than a virtual function, because we need
to check the type of a non-Field in mysql_alter_table().
SYNOPSIS
type_can_have_key_part()
type field type
RETURN
TRUE Type can have a prefixed key
FALSE Type can not have a prefixed key
*/
bool Field::type_can_have_key_part(enum enum_field_types type)
{
switch (type) {
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:
return TRUE;
default:
return FALSE;
}
}
/* /*
Numeric fields base class constructor Numeric fields base class constructor
*/ */

View File

@ -123,6 +123,7 @@ public:
virtual Item_result result_type () const=0; virtual Item_result result_type () const=0;
virtual Item_result cmp_type () const { return result_type(); } virtual Item_result cmp_type () const { return result_type(); }
virtual Item_result cast_to_int_type () const { return result_type(); } virtual Item_result cast_to_int_type () const { return result_type(); }
static bool type_can_have_key_part(enum_field_types);
static enum_field_types field_type_merge(enum_field_types, enum_field_types); static enum_field_types field_type_merge(enum_field_types, enum_field_types);
static Item_result result_merge_type(enum_field_types); static Item_result result_merge_type(enum_field_types);
bool eq(Field *field) bool eq(Field *field)

View File

@ -57,6 +57,7 @@ public:
} }
const key_map *keys_to_use_for_scanning() { return &btree_keys; } const key_map *keys_to_use_for_scanning() { return &btree_keys; }
uint max_supported_keys() const { return MAX_KEY; } uint max_supported_keys() const { return MAX_KEY; }
uint max_supported_key_part_length() const { return MAX_KEY_LENGTH; }
double scan_time() { return (double) (records+deleted) / 20.0+10; } double scan_time() { return (double) (records+deleted) / 20.0+10; }
double read_time(uint index, uint ranges, ha_rows rows) double read_time(uint index, uint ranges, ha_rows rows)
{ return (double) rows / 20.0+1; } { return (double) rows / 20.0+1; }

View File

@ -1876,7 +1876,8 @@ void Item_func_round::fix_length_and_dec()
max_length= float_length(decimals); max_length= float_length(decimals);
break; break;
case INT_RESULT: case INT_RESULT:
if (truncate || (args[0]->decimal_precision() < DECIMAL_LONGLONG_DIGITS)) if ((decimals_to_set==0) &&
(truncate || (args[0]->decimal_precision() < DECIMAL_LONGLONG_DIGITS)))
{ {
/* Here we can keep INT_RESULT */ /* Here we can keep INT_RESULT */
hybrid_type= INT_RESULT; hybrid_type= INT_RESULT;
@ -1890,16 +1891,10 @@ void Item_func_round::fix_length_and_dec()
hybrid_type= DECIMAL_RESULT; hybrid_type= DECIMAL_RESULT;
int decimals_delta= args[0]->decimals - decimals_to_set; int decimals_delta= args[0]->decimals - decimals_to_set;
int precision= args[0]->decimal_precision(); int precision= args[0]->decimal_precision();
if (decimals_delta > 0) int length_increase= ((decimals_delta <= 0) || truncate) ? 0:1;
{
int length_increase= truncate ? 0:1;
precision-= decimals_delta - length_increase; precision-= decimals_delta - length_increase;
decimals= decimals_to_set; decimals= decimals_to_set;
}
else
/* Decimals to set is bigger that the original scale */
/* we keep original decimals value */
decimals= args[0]->decimals;
max_length= my_decimal_precision_to_length(precision, decimals, max_length= my_decimal_precision_to_length(precision, decimals,
unsigned_flag); unsigned_flag);
break; break;

View File

@ -708,7 +708,7 @@ failed my_b_read"));
Log_event *res= 0; Log_event *res= 0;
#ifndef max_allowed_packet #ifndef max_allowed_packet
THD *thd=current_thd; THD *thd=current_thd;
uint max_allowed_packet= thd ? thd->variables.max_allowed_packet : ~0; uint max_allowed_packet= thd ? thd->variables.max_allowed_packet : ~(ulong)0;
#endif #endif
if (data_len > max_allowed_packet) if (data_len > max_allowed_packet)

View File

@ -838,7 +838,7 @@ void mysql_stmt_fetch(THD *thd, char *packet, uint packet_length);
void mysql_stmt_free(THD *thd, char *packet); void mysql_stmt_free(THD *thd, char *packet);
void mysql_stmt_reset(THD *thd, char *packet); void mysql_stmt_reset(THD *thd, char *packet);
void mysql_stmt_get_longdata(THD *thd, char *pos, ulong packet_length); void mysql_stmt_get_longdata(THD *thd, char *pos, ulong packet_length);
void reset_stmt_for_execute(THD *thd, LEX *lex); void reinit_stmt_before_use(THD *thd, LEX *lex);
void init_stmt_after_parse(THD*, LEX*); void init_stmt_after_parse(THD*, LEX*);
/* sql_handler.cc */ /* sql_handler.cc */

View File

@ -1616,7 +1616,10 @@ bool sys_var::check_set(THD *thd, set_var *var, TYPELIB *enum_names)
if (var->value->result_type() == STRING_RESULT) if (var->value->result_type() == STRING_RESULT)
{ {
if (!(res= var->value->val_str(&str))) if (!(res= var->value->val_str(&str)))
{
strmake(buff, "NULL", 4);
goto err; goto err;
}
var->save_result.ulong_value= ((ulong) var->save_result.ulong_value= ((ulong)
find_set(enum_names, res->c_ptr(), find_set(enum_names, res->c_ptr(),
res->length(), res->length(),

View File

@ -1355,7 +1355,7 @@ sp_lex_keeper::reset_lex_and_exec_core(THD *thd, uint *nextp,
implemented at the same time as ability not to store LEX for implemented at the same time as ability not to store LEX for
instruction if it is not really used. instruction if it is not really used.
*/ */
reset_stmt_for_execute(thd, m_lex); reinit_stmt_before_use(thd, m_lex);
/* /*
If requested check whenever we have access to tables in LEX's table list If requested check whenever we have access to tables in LEX's table list

View File

@ -187,7 +187,7 @@ my_bool acl_init(THD *org_thd, bool dont_read_acl_tables)
ACL_HOST host; ACL_HOST host;
update_hostname(&host.host,get_field(&mem, table->field[0])); update_hostname(&host.host,get_field(&mem, table->field[0]));
host.db= get_field(&mem, table->field[1]); host.db= get_field(&mem, table->field[1]);
if (lower_case_table_names) if (lower_case_table_names && host.db)
{ {
/* /*
convert db to lower case and give a warning if the db wasn't convert db to lower case and give a warning if the db wasn't
@ -209,7 +209,7 @@ my_bool acl_init(THD *org_thd, bool dont_read_acl_tables)
{ {
sql_print_warning("'host' entry '%s|%s' " sql_print_warning("'host' entry '%s|%s' "
"ignored in --skip-name-resolve mode.", "ignored in --skip-name-resolve mode.",
host.host.hostname, host.db, host.host.hostname); host.host.hostname, host.db?host.db:"");
continue; continue;
} }
#ifndef TO_BE_REMOVED #ifndef TO_BE_REMOVED
@ -277,7 +277,7 @@ my_bool acl_init(THD *org_thd, bool dont_read_acl_tables)
{ {
sql_print_warning("'user' entry '%s@%s' " sql_print_warning("'user' entry '%s@%s' "
"ignored in --skip-name-resolve mode.", "ignored in --skip-name-resolve mode.",
user.user, user.host.hostname, user.host.hostname); user.user, user.host.hostname);
continue; continue;
} }
@ -413,7 +413,7 @@ my_bool acl_init(THD *org_thd, bool dont_read_acl_tables)
{ {
sql_print_warning("'db' entry '%s %s@%s' " sql_print_warning("'db' entry '%s %s@%s' "
"ignored in --skip-name-resolve mode.", "ignored in --skip-name-resolve mode.",
db.db, db.user, db.host.hostname, db.host.hostname); db.db, db.user, db.host.hostname);
continue; continue;
} }
db.access=get_access(table,3); db.access=get_access(table,3);
@ -3232,7 +3232,7 @@ my_bool grant_init(THD *org_thd)
sql_print_warning("'procs_priv' entry '%s %s@%s' " sql_print_warning("'procs_priv' entry '%s %s@%s' "
"ignored in --skip-name-resolve mode.", "ignored in --skip-name-resolve mode.",
mem_check->tname, mem_check->user, mem_check->tname, mem_check->user,
mem_check->host, mem_check->host); mem_check->host);
continue; continue;
} }
} }
@ -5172,7 +5172,7 @@ bool mysql_revoke_all(THD *thd, List <LEX_USER> &list)
grant_proc->db, grant_proc->db,
grant_proc->tname, grant_proc->tname,
is_proc, is_proc,
~0, 1)) ~(ulong)0, 1))
{ {
revoked= 1; revoked= 1;
continue; continue;
@ -5240,7 +5240,7 @@ bool sp_revoke_privileges(THD *thd, const char *sp_db, const char *sp_name,
lex_user.host.length= strlen(grant_proc->host.hostname); lex_user.host.length= strlen(grant_proc->host.hostname);
if (!replace_routine_table(thd,grant_proc,tables[4].table,lex_user, if (!replace_routine_table(thd,grant_proc,tables[4].table,lex_user,
grant_proc->db, grant_proc->tname, grant_proc->db, grant_proc->tname,
is_proc, ~0, 1)) is_proc, ~(ulong)0, 1))
{ {
revoked= 1; revoked= 1;
continue; continue;

View File

@ -413,8 +413,6 @@ bool mysql_ha_read(THD *thd, TABLE_LIST *tables,
cond->fix_fields(thd, tables, &cond)) || cond->check_cols(1))) cond->fix_fields(thd, tables, &cond)) || cond->check_cols(1)))
goto err0; goto err0;
table->file->init_table_handle_for_HANDLER(); // Only InnoDB requires it
if (keyname) if (keyname)
{ {
if ((keyno=find_type(keyname, &table->s->keynames, 1+2)-1)<0) if ((keyno=find_type(keyname, &table->s->keynames, 1+2)-1)<0)
@ -422,8 +420,6 @@ bool mysql_ha_read(THD *thd, TABLE_LIST *tables,
my_error(ER_KEY_DOES_NOT_EXITS, MYF(0), keyname, tables->alias); my_error(ER_KEY_DOES_NOT_EXITS, MYF(0), keyname, tables->alias);
goto err0; goto err0;
} }
table->file->ha_index_or_rnd_end();
table->file->ha_index_init(keyno);
} }
if (insert_fields(thd, tables, tables->db, tables->alias, &it, 0, 0)) if (insert_fields(thd, tables, tables->db, tables->alias, &it, 0, 0))
@ -449,9 +445,22 @@ bool mysql_ha_read(THD *thd, TABLE_LIST *tables,
for (num_rows=0; num_rows < select_limit_cnt; ) for (num_rows=0; num_rows < select_limit_cnt; )
{ {
switch (mode) { switch (mode) {
case RNEXT:
if (table->file->inited != handler::NONE)
{
error=keyname ?
table->file->index_next(table->record[0]) :
table->file->rnd_next(table->record[0]);
break;
}
/* else fall through */
case RFIRST: case RFIRST:
if (keyname) if (keyname)
{
table->file->ha_index_or_rnd_end();
table->file->ha_index_init(keyno);
error= table->file->index_first(table->record[0]); error= table->file->index_first(table->record[0]);
}
else else
{ {
table->file->ha_index_or_rnd_end(); table->file->ha_index_or_rnd_end();
@ -460,20 +469,21 @@ bool mysql_ha_read(THD *thd, TABLE_LIST *tables,
} }
mode=RNEXT; mode=RNEXT;
break; break;
case RLAST:
DBUG_ASSERT(keyname != 0);
error= table->file->index_last(table->record[0]);
mode=RPREV;
break;
case RNEXT:
error= (keyname ?
table->file->index_next(table->record[0]) :
table->file->rnd_next(table->record[0]));
break;
case RPREV: case RPREV:
DBUG_ASSERT(keyname != 0); DBUG_ASSERT(keyname != 0);
if (table->file->inited != handler::NONE)
{
error=table->file->index_prev(table->record[0]); error=table->file->index_prev(table->record[0]);
break; break;
}
/* else fall through */
case RLAST:
DBUG_ASSERT(keyname != 0);
table->file->ha_index_or_rnd_end();
table->file->ha_index_init(keyno);
error= table->file->index_last(table->record[0]);
mode=RPREV;
break;
case RNEXT_SAME: case RNEXT_SAME:
/* Continue scan on "(keypart1,keypart2,...)=(c1, c2, ...) */ /* Continue scan on "(keypart1,keypart2,...)=(c1, c2, ...) */
DBUG_ASSERT(keyname != 0); DBUG_ASSERT(keyname != 0);
@ -508,6 +518,8 @@ bool mysql_ha_read(THD *thd, TABLE_LIST *tables,
} }
if (!(key= (byte*) thd->calloc(ALIGN_SIZE(key_len)))) if (!(key= (byte*) thd->calloc(ALIGN_SIZE(key_len))))
goto err; goto err;
table->file->ha_index_or_rnd_end();
table->file->ha_index_init(keyno);
key_copy(key, table->record[0], table->key_info + keyno, key_len); key_copy(key, table->record[0], table->key_info + keyno, key_len);
error= table->file->index_read(table->record[0], error= table->file->index_read(table->record[0],
key,key_len,ha_rkey_mode); key,key_len,ha_rkey_mode);

View File

@ -1656,6 +1656,17 @@ static bool init_param_array(Prepared_statement *stmt)
return FALSE; return FALSE;
} }
/* Cleanup PS after execute/prepare and restore THD state */
static void cleanup_stmt_and_thd_after_use(Statement *stmt, THD *thd)
{
stmt->lex->unit.cleanup();
cleanup_items(stmt->free_list);
thd->rollback_item_tree_changes();
thd->cleanup_after_query();
}
/* /*
Given a query string with parameter markers, create a Prepared Statement Given a query string with parameter markers, create a Prepared Statement
from it and send PS info back to the client. from it and send PS info back to the client.
@ -1760,12 +1771,9 @@ bool mysql_stmt_prepare(THD *thd, char *packet, uint packet_length,
thd->lex->sphead= NULL; thd->lex->sphead= NULL;
} }
lex_end(lex); lex_end(lex);
lex->unit.cleanup();
close_thread_tables(thd); close_thread_tables(thd);
cleanup_stmt_and_thd_after_use(stmt, thd);
thd->restore_backup_statement(stmt, &thd->stmt_backup); thd->restore_backup_statement(stmt, &thd->stmt_backup);
cleanup_items(stmt->free_list);
thd->rollback_item_tree_changes();
thd->cleanup_after_query();
thd->current_arena= thd; thd->current_arena= thd;
if (error) if (error)
@ -1808,10 +1816,10 @@ void init_stmt_after_parse(THD *thd, LEX *lex)
/* Reinit prepared statement/stored procedure before execution */ /* Reinit prepared statement/stored procedure before execution */
void reset_stmt_for_execute(THD *thd, LEX *lex) void reinit_stmt_before_use(THD *thd, LEX *lex)
{ {
SELECT_LEX *sl= lex->all_selects_list; SELECT_LEX *sl= lex->all_selects_list;
DBUG_ENTER("reset_stmt_for_execute"); DBUG_ENTER("reinit_stmt_before_use");
if (lex->empty_field_list_on_rset) if (lex->empty_field_list_on_rset)
{ {
@ -2007,7 +2015,7 @@ void mysql_stmt_execute(THD *thd, char *packet, uint packet_length)
thd->stmt_backup.set_statement(thd); thd->stmt_backup.set_statement(thd);
thd->set_statement(stmt); thd->set_statement(stmt);
thd->current_arena= stmt; thd->current_arena= stmt;
reset_stmt_for_execute(thd, stmt->lex); reinit_stmt_before_use(thd, stmt->lex);
/* From now cursors assume that thd->mem_root is clean */ /* From now cursors assume that thd->mem_root is clean */
if (expanded_query.length() && if (expanded_query.length() &&
alloc_query(thd, (char *)expanded_query.ptr(), alloc_query(thd, (char *)expanded_query.ptr(),
@ -2031,17 +2039,18 @@ void mysql_stmt_execute(THD *thd, char *packet, uint packet_length)
if (cursor && cursor->is_open()) if (cursor && cursor->is_open())
{ {
/*
It's safer if we grab THD state after mysql_execute_command is
finished and not in Cursor::open(), because currently the call to
Cursor::open is buried deep in JOIN::exec of the top level join.
*/
cursor->init_from_thd(thd); cursor->init_from_thd(thd);
cursor->state= stmt->state;
} }
else else
{ {
thd->lex->unit.cleanup(); close_thread_tables(thd);
cleanup_items(stmt->free_list); cleanup_stmt_and_thd_after_use(stmt, thd);
reset_stmt_params(stmt); reset_stmt_params(stmt);
close_thread_tables(thd); /* to close derived tables */
thd->rollback_item_tree_changes();
thd->cleanup_after_query();
} }
thd->set_statement(&thd->stmt_backup); thd->set_statement(&thd->stmt_backup);
@ -2119,7 +2128,7 @@ static void execute_stmt(THD *thd, Prepared_statement *stmt,
{ {
DBUG_ENTER("execute_stmt"); DBUG_ENTER("execute_stmt");
reset_stmt_for_execute(thd, stmt->lex); reinit_stmt_before_use(thd, stmt->lex);
if (expanded_query->length() && if (expanded_query->length() &&
alloc_query(thd, (char *)expanded_query->ptr(), alloc_query(thd, (char *)expanded_query->ptr(),
@ -2141,14 +2150,11 @@ static void execute_stmt(THD *thd, Prepared_statement *stmt,
if (!(specialflag & SPECIAL_NO_PRIOR)) if (!(specialflag & SPECIAL_NO_PRIOR))
my_pthread_setprio(pthread_self(), WAIT_PRIOR); my_pthread_setprio(pthread_self(), WAIT_PRIOR);
thd->lex->unit.cleanup();
thd->current_arena= thd;
cleanup_items(stmt->free_list);
thd->rollback_item_tree_changes();
reset_stmt_params(stmt);
close_thread_tables(thd); // to close derived tables close_thread_tables(thd); // to close derived tables
cleanup_stmt_and_thd_after_use(stmt, thd);
reset_stmt_params(stmt);
thd->set_statement(&thd->stmt_backup); thd->set_statement(&thd->stmt_backup);
thd->cleanup_after_query(); thd->current_arena= thd;
if (stmt->state == Item_arena::PREPARED) if (stmt->state == Item_arena::PREPARED)
stmt->state= Item_arena::EXECUTED; stmt->state= Item_arena::EXECUTED;
@ -2171,7 +2177,7 @@ void mysql_stmt_fetch(THD *thd, char *packet, uint packet_length)
/* assume there is always place for 8-16 bytes */ /* assume there is always place for 8-16 bytes */
ulong stmt_id= uint4korr(packet); ulong stmt_id= uint4korr(packet);
ulong num_rows= uint4korr(packet+4); ulong num_rows= uint4korr(packet+4);
Statement *stmt; Prepared_statement *stmt;
DBUG_ENTER("mysql_stmt_fetch"); DBUG_ENTER("mysql_stmt_fetch");
if (!(stmt= find_prepared_statement(thd, stmt_id, "mysql_stmt_fetch"))) if (!(stmt= find_prepared_statement(thd, stmt_id, "mysql_stmt_fetch")))
@ -2185,7 +2191,6 @@ void mysql_stmt_fetch(THD *thd, char *packet, uint packet_length)
thd->current_arena= stmt; thd->current_arena= stmt;
thd->set_n_backup_statement(stmt, &thd->stmt_backup); thd->set_n_backup_statement(stmt, &thd->stmt_backup);
stmt->cursor->init_thd(thd);
if (!(specialflag & SPECIAL_NO_PRIOR)) if (!(specialflag & SPECIAL_NO_PRIOR))
my_pthread_setprio(pthread_self(), QUERY_PRIOR); my_pthread_setprio(pthread_self(), QUERY_PRIOR);
@ -2197,11 +2202,16 @@ void mysql_stmt_fetch(THD *thd, char *packet, uint packet_length)
if (!(specialflag & SPECIAL_NO_PRIOR)) if (!(specialflag & SPECIAL_NO_PRIOR))
my_pthread_setprio(pthread_self(), WAIT_PRIOR); my_pthread_setprio(pthread_self(), WAIT_PRIOR);
/* Restore THD state */
stmt->cursor->reset_thd(thd);
thd->restore_backup_statement(stmt, &thd->stmt_backup); thd->restore_backup_statement(stmt, &thd->stmt_backup);
thd->current_arena= thd; thd->current_arena= thd;
if (!stmt->cursor->is_open())
{
/* We're done with the fetch: reset PS for next execution */
cleanup_stmt_and_thd_after_use(stmt, thd);
reset_stmt_params(stmt);
}
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }

View File

@ -1705,10 +1705,11 @@ Cursor::init_from_thd(THD *thd)
We need to save and reset thd->mem_root, otherwise it'll be freed We need to save and reset thd->mem_root, otherwise it'll be freed
later in mysql_parse. later in mysql_parse.
We can't just change the thd->mem_root here as we want to keep the things We can't just change the thd->mem_root here as we want to keep the
that is already allocated in thd->mem_root for Cursor::fetch() things that are already allocated in thd->mem_root for Cursor::fetch()
*/ */
main_mem_root= *thd->mem_root; main_mem_root= *thd->mem_root;
state= thd->current_arena->state;
/* Allocate new memory root for thd */ /* Allocate new memory root for thd */
init_sql_alloc(thd->mem_root, init_sql_alloc(thd->mem_root,
thd->variables.query_alloc_block_size, thd->variables.query_alloc_block_size,
@ -1731,24 +1732,6 @@ Cursor::init_from_thd(THD *thd)
What problems can we have with it if cursor is open? What problems can we have with it if cursor is open?
TODO: must be fixed because of the prelocked mode. TODO: must be fixed because of the prelocked mode.
*/ */
/*
TODO: grab thd->free_list here?
*/
}
void
Cursor::init_thd(THD *thd)
{
DBUG_ASSERT(thd->derived_tables == 0);
thd->derived_tables= derived_tables;
DBUG_ASSERT(thd->open_tables == 0);
thd->open_tables= open_tables;
DBUG_ASSERT(thd->lock== 0);
thd->lock= lock;
thd->query_id= query_id;
} }
@ -1824,6 +1807,13 @@ Cursor::fetch(ulong num_rows)
DBUG_ENTER("Cursor::fetch"); DBUG_ENTER("Cursor::fetch");
DBUG_PRINT("enter",("rows: %lu", num_rows)); DBUG_PRINT("enter",("rows: %lu", num_rows));
DBUG_ASSERT(thd->derived_tables == 0 && thd->open_tables == 0 &&
thd->lock == 0);
thd->derived_tables= derived_tables;
thd->open_tables= open_tables;
thd->lock= lock;
thd->query_id= query_id;
/* save references to memory, allocated during fetch */ /* save references to memory, allocated during fetch */
thd->set_n_backup_item_arena(this, &thd->stmt_backup); thd->set_n_backup_item_arena(this, &thd->stmt_backup);
@ -1842,6 +1832,9 @@ Cursor::fetch(ulong num_rows)
#endif #endif
thd->restore_backup_item_arena(this, &thd->stmt_backup); thd->restore_backup_item_arena(this, &thd->stmt_backup);
DBUG_ASSERT(thd->free_list == 0);
reset_thd(thd);
if (error == NESTED_LOOP_CURSOR_LIMIT) if (error == NESTED_LOOP_CURSOR_LIMIT)
{ {
/* Fetch limit worked, possibly more rows are there */ /* Fetch limit worked, possibly more rows are there */
@ -1882,8 +1875,8 @@ Cursor::close()
join->cleanup(); join->cleanup();
delete join; delete join;
} }
/* XXX: Another hack: closing tables used in the cursor */
{ {
/* XXX: Another hack: closing tables used in the cursor */
DBUG_ASSERT(lock || open_tables || derived_tables); DBUG_ASSERT(lock || open_tables || derived_tables);
TABLE *tmp_derived_tables= thd->derived_tables; TABLE *tmp_derived_tables= thd->derived_tables;

View File

@ -386,8 +386,6 @@ public:
/* Temporary implementation as now we replace THD state by value */ /* Temporary implementation as now we replace THD state by value */
/* Save THD state into cursor */ /* Save THD state into cursor */
void init_from_thd(THD *thd); void init_from_thd(THD *thd);
/* Restore THD from cursor to continue cursor execution */
void init_thd(THD *thd);
/* bzero cursor state in THD */ /* bzero cursor state in THD */
void reset_thd(THD *thd); void reset_thd(THD *thd);

View File

@ -2590,28 +2590,33 @@ bool mysql_create_like_table(THD* thd, TABLE_LIST* table,
char src_path[FN_REFLEN], dst_path[FN_REFLEN]; char src_path[FN_REFLEN], dst_path[FN_REFLEN];
char *db= table->db; char *db= table->db;
char *table_name= table->table_name; char *table_name= table->table_name;
char *src_db= thd->db; char *src_db;
char *src_table= table_ident->table.str; char *src_table= table_ident->table.str;
int err; int err;
bool res= TRUE; bool res= TRUE;
TABLE_LIST src_tables_list; TABLE_LIST src_tables_list;
DBUG_ENTER("mysql_create_like_table"); DBUG_ENTER("mysql_create_like_table");
src_db= table_ident->db.str ? table_ident->db.str : thd->db;
/* /*
Validate the source table Validate the source table
*/ */
if (table_ident->table.length > NAME_LEN || if (table_ident->table.length > NAME_LEN ||
(table_ident->table.length && (table_ident->table.length &&
check_table_name(src_table,table_ident->table.length)) || check_table_name(src_table,table_ident->table.length)))
table_ident->db.str && check_db_name((src_db= table_ident->db.str)))
{ {
my_error(ER_WRONG_TABLE_NAME, MYF(0), src_table); my_error(ER_WRONG_TABLE_NAME, MYF(0), src_table);
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
} }
if (!src_db || check_db_name(src_db))
{
my_error(ER_WRONG_DB_NAME, MYF(0), src_db ? src_db : "NULL");
DBUG_RETURN(-1);
}
bzero((gptr)&src_tables_list, sizeof(src_tables_list)); bzero((gptr)&src_tables_list, sizeof(src_tables_list));
src_tables_list.db= table_ident->db.str ? table_ident->db.str : thd->db; src_tables_list.db= src_db;
src_tables_list.table_name= table_ident->table.str; src_tables_list.table_name= src_table;
if (lock_and_wait_for_table_name(thd, &src_tables_list)) if (lock_and_wait_for_table_name(thd, &src_tables_list))
goto err; goto err;
@ -3394,11 +3399,24 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name,
continue; // Field is removed continue; // Field is removed
uint key_part_length=key_part->length; uint key_part_length=key_part->length;
if (cfield->field) // Not new field if (cfield->field) // Not new field
{ // Check if sub key {
if (cfield->field->type() != FIELD_TYPE_BLOB && /*
(cfield->field->pack_length() == key_part_length || If the field can't have only a part used in a key according to its
cfield->length <= key_part_length / new type, or should not be used partially according to its
key_part->field->charset()->mbmaxlen)) previous type, or the field length is less than the key part
length, unset the key part length.
We also unset the key part length if it is the same as the
old field's length, so the whole new field will be used.
BLOBs may have cfield->length == 0, which is why we test it before
checking whether cfield->length < key_part_length (in chars).
*/
if (!Field::type_can_have_key_part(cfield->field->type()) ||
!Field::type_can_have_key_part(cfield->sql_type) ||
cfield->field->field_length == key_part_length ||
(cfield->length && (cfield->length < key_part_length /
key_part->field->charset()->mbmaxlen)))
key_part_length= 0; // Use whole field key_part_length= 0; // Use whole field
} }
key_part_length /= key_part->field->charset()->mbmaxlen; key_part_length /= key_part->field->charset()->mbmaxlen;

View File

@ -5108,10 +5108,12 @@ derived_table_list:
join_table: join_table:
table_ref normal_join table_ref { TEST_ASSERT($1 && ($$=$3)); } table_ref normal_join table_ref { TEST_ASSERT($1 && ($$=$3)); }
| table_ref STRAIGHT_JOIN table_factor | table_ref STRAIGHT_JOIN table_ref
{ TEST_ASSERT($1 && ($$=$3)); $3->straight=1; } { TEST_ASSERT($1 && ($$=$3)); $3->straight=1; }
| table_ref normal_join table_ref ON expr | table_ref normal_join table_ref ON expr
{ TEST_ASSERT($1 && ($$=$3)); add_join_on($3,$5); } { TEST_ASSERT($1 && ($$=$3)); add_join_on($3,$5); }
| table_ref STRAIGHT_JOIN table_ref ON expr
{ TEST_ASSERT($1 && ($$=$3)); $3->straight=1; add_join_on($3,$5); }
| table_ref normal_join table_ref | table_ref normal_join table_ref
USING USING
{ {

View File

@ -3871,6 +3871,14 @@ int update_state_info(MI_CHECK *param, MI_INFO *info,uint update)
if (!share->state.create_time) if (!share->state.create_time)
share->state.create_time=share->state.check_time; share->state.create_time=share->state.check_time;
} }
/*
When tables are locked we haven't synched the share state and the
real state for a while so we better do it here before synching
the share state to disk. Only when table is write locked is it
necessary to perform this synch.
*/
if (info->lock_type == F_WRLCK)
share->state.state= *info->state;
if (mi_state_info_write(share->kfile,&share->state,1+2)) if (mi_state_info_write(share->kfile,&share->state,1+2))
goto err; goto err;
share->changed=0; share->changed=0;

View File

@ -247,10 +247,10 @@ Ndbfs::readWriteRequest(int action, Signal * signal)
AsyncFile* openFile = theOpenFiles.find(filePointer); AsyncFile* openFile = theOpenFiles.find(filePointer);
const NewVARIABLE *myBaseAddrRef = &getBat(blockNumber)[fsRWReq->varIndex]; const NewVARIABLE *myBaseAddrRef = &getBat(blockNumber)[fsRWReq->varIndex];
unsigned int tPageSize; UintPtr tPageSize;
unsigned int tClusterSize; UintPtr tClusterSize;
unsigned int tNRR; UintPtr tNRR;
unsigned int tPageOffset; UintPtr tPageOffset;
char* tWA; char* tWA;
FsRef::NdbfsErrorCodeType errorCode; FsRef::NdbfsErrorCodeType errorCode;
@ -294,8 +294,8 @@ Ndbfs::readWriteRequest(int action, Signal * signal)
jam(); jam();
for (unsigned int i = 0; i < fsRWReq->numberOfPages; i++) { for (unsigned int i = 0; i < fsRWReq->numberOfPages; i++) {
jam(); jam();
const Uint32 varIndex = fsRWReq->data.listOfPair[i].varIndex; const UintPtr varIndex = fsRWReq->data.listOfPair[i].varIndex;
const Uint32 fileOffset = fsRWReq->data.listOfPair[i].fileOffset; const UintPtr fileOffset = fsRWReq->data.listOfPair[i].fileOffset;
if (varIndex >= tNRR) { if (varIndex >= tNRR) {
jam(); jam();
errorCode = FsRef::fsErrInvalidParameters; errorCode = FsRef::fsErrInvalidParameters;
@ -316,8 +316,8 @@ Ndbfs::readWriteRequest(int action, Signal * signal)
errorCode = FsRef::fsErrInvalidParameters; errorCode = FsRef::fsErrInvalidParameters;
goto error; goto error;
}//if }//if
const Uint32 varIndex = fsRWReq->data.arrayOfPages.varIndex; const UintPtr varIndex = fsRWReq->data.arrayOfPages.varIndex;
const Uint32 fileOffset = fsRWReq->data.arrayOfPages.fileOffset; const UintPtr fileOffset = fsRWReq->data.arrayOfPages.fileOffset;
request->par.readWrite.pages[0].offset = fileOffset * tPageSize; request->par.readWrite.pages[0].offset = fileOffset * tPageSize;
request->par.readWrite.pages[0].size = tPageSize * fsRWReq->numberOfPages; request->par.readWrite.pages[0].size = tPageSize * fsRWReq->numberOfPages;
@ -334,7 +334,7 @@ Ndbfs::readWriteRequest(int action, Signal * signal)
for (unsigned int i = 0; i < fsRWReq->numberOfPages; i++) { for (unsigned int i = 0; i < fsRWReq->numberOfPages; i++) {
jam(); jam();
Uint32 varIndex = fsRWReq->data.listOfMemPages.varIndex[i]; UintPtr varIndex = fsRWReq->data.listOfMemPages.varIndex[i];
if (varIndex >= tNRR) { if (varIndex >= tNRR) {
jam(); jam();

View File

@ -13,7 +13,7 @@ save_args=$*
VERSION="ndb-autotest.sh version 1.04" VERSION="ndb-autotest.sh version 1.04"
DATE=`date '+%Y-%m-%d'` DATE=`date '+%Y-%m-%d'`
HOST=`hostname -s` HOST=`hostname`
export DATE HOST export DATE HOST
set -e set -e
@ -330,8 +330,11 @@ start(){
tar cfz /tmp/res.$2.$$.tgz `basename $p2`/$DATE tar cfz /tmp/res.$2.$$.tgz `basename $p2`/$DATE
scp /tmp/res.$2.$$.tgz \ scp /tmp/res.$2.$$.tgz \
$result_host:$result_path/res.$DATE.$HOST.$2.$$.tgz $result_host:$result_path/res.$DATE.$HOST.$2.$$.tgz
if [ $? -eq 0 ]
then
rm -f /tmp/res.$2.$$.tgz rm -f /tmp/res.$2.$$.tgz
fi fi
fi
} }
######################################### #########################################

View File

@ -1546,6 +1546,14 @@ decimal_round(decimal_t *from, decimal_t *to, int scale,
*buf1=1; *buf1=1;
to->intg++; to->intg++;
} }
/* Here we check 999.9 -> 1000 case when we need to increase intg */
else
{
int first_dig= to->intg % DIG_PER_DEC1;
/* first_dig==0 should be handled above in the 'if' */
if (first_dig && (*buf1 >= powers10[first_dig]))
to->intg++;
}
} }
else else
{ {

View File

@ -13145,6 +13145,67 @@ static void test_bug9643()
myquery(rc); myquery(rc);
} }
/*
Check that proper cleanups are done for prepared statement when
fetching thorugh a cursor.
*/
static void test_bug10729()
{
MYSQL_STMT *stmt;
MYSQL_BIND bind[1];
char a[21];
int rc;
const char *stmt_text;
int i= 0;
char *name_array[3]= { "aaa", "bbb", "ccc" };
ulong type;
myheader("test_bug10729");
mysql_query(mysql, "drop table if exists t1");
mysql_query(mysql, "create table t1 (id integer not null primary key,"
"name VARCHAR(20) NOT NULL)");
rc= mysql_query(mysql, "insert into t1 (id, name) values "
"(1, 'aaa'), (2, 'bbb'), (3, 'ccc')");
myquery(rc);
stmt= mysql_stmt_init(mysql);
type= (ulong) CURSOR_TYPE_READ_ONLY;
rc= mysql_stmt_attr_set(stmt, STMT_ATTR_CURSOR_TYPE, (void*) &type);
check_execute(stmt, rc);
stmt_text= "select name from t1";
rc= mysql_stmt_prepare(stmt, stmt_text, strlen(stmt_text));
check_execute(stmt, rc);
bzero(bind, sizeof(bind));
bind[0].buffer_type= MYSQL_TYPE_STRING;
bind[0].buffer= (void*) a;
bind[0].buffer_length= sizeof(a);
mysql_stmt_bind_result(stmt, bind);
for (i= 0; i < 3; i++)
{
int row_no= 0;
rc= mysql_stmt_execute(stmt);
check_execute(stmt, rc);
while ((rc= mysql_stmt_fetch(stmt)) == 0)
{
DIE_UNLESS(strcmp(a, name_array[row_no]) == 0);
if (!opt_silent)
printf("%d: %s\n", row_no, a);
++row_no;
}
DIE_UNLESS(rc == MYSQL_NO_DATA);
}
rc= mysql_stmt_close(stmt);
DIE_UNLESS(rc == 0);
rc= mysql_query(mysql, "drop table t1");
myquery(rc);
}
/* /*
Read and parse arguments and MySQL options from my.cnf Read and parse arguments and MySQL options from my.cnf
*/ */
@ -13377,6 +13438,7 @@ static struct my_tests_st my_tests[]= {
{ "test_bug9520", test_bug9520 }, { "test_bug9520", test_bug9520 },
{ "test_bug9478", test_bug9478 }, { "test_bug9478", test_bug9478 },
{ "test_bug9643", test_bug9643 }, { "test_bug9643", test_bug9643 },
{ "test_bug10729", test_bug10729 },
{ 0, 0 } { 0, 0 }
}; };