mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 20:12:31 +01:00
Merge rkalimullin@bk-internal.mysql.com:/home/bk/mysql-5.0
into mysql.com:/usr/home/ram/work/5.0.b16511
This commit is contained in:
commit
b2d608cf41
32 changed files with 417 additions and 60 deletions
|
@ -3048,7 +3048,8 @@ static void append_field(DYNAMIC_STRING *ds, uint col_idx, MYSQL_FIELD* field,
|
||||||
len= 4;
|
len= 4;
|
||||||
}
|
}
|
||||||
#ifdef __WIN__
|
#ifdef __WIN__
|
||||||
else if (field->type == MYSQL_TYPE_DOUBLE &&
|
else if ((field->type == MYSQL_TYPE_DOUBLE ||
|
||||||
|
field->type == MYSQL_TYPE_FLOAT ) &&
|
||||||
field->decimals >= 31)
|
field->decimals >= 31)
|
||||||
{
|
{
|
||||||
/* Convert 1.2e+018 to 1.2e+18 and 1.2e-018 to 1.2e-18 */
|
/* Convert 1.2e+018 to 1.2e+18 and 1.2e-018 to 1.2e-18 */
|
||||||
|
|
|
@ -365,7 +365,7 @@ MYSQL_PROG_AR
|
||||||
|
|
||||||
# libmysqlclient versioning when linked with GNU ld.
|
# libmysqlclient versioning when linked with GNU ld.
|
||||||
if $LD --version 2>/dev/null|grep -q GNU; then
|
if $LD --version 2>/dev/null|grep -q GNU; then
|
||||||
LD_VERSION_SCRIPT="-Wl,--version-script=\$(top_srcdir)/libmysql/libmysql.ver"
|
LD_VERSION_SCRIPT="-Wl,--version-script=\$(top_builddir)/libmysql/libmysql.ver"
|
||||||
AC_CONFIG_FILES(libmysql/libmysql.ver)
|
AC_CONFIG_FILES(libmysql/libmysql.ver)
|
||||||
fi
|
fi
|
||||||
AC_SUBST(LD_VERSION_SCRIPT)
|
AC_SUBST(LD_VERSION_SCRIPT)
|
||||||
|
|
|
@ -135,6 +135,7 @@ int heap_create(const char *name, uint keys, HP_KEYDEF *keydef,
|
||||||
DBUG_RETURN(1);
|
DBUG_RETURN(1);
|
||||||
}
|
}
|
||||||
share->keydef= (HP_KEYDEF*) (share + 1);
|
share->keydef= (HP_KEYDEF*) (share + 1);
|
||||||
|
share->key_stat_version= 1;
|
||||||
keyseg= (HA_KEYSEG*) (share->keydef + keys);
|
keyseg= (HA_KEYSEG*) (share->keydef + keys);
|
||||||
init_block(&share->block, reclength + 1, min_records, max_records);
|
init_block(&share->block, reclength + 1, min_records, max_records);
|
||||||
/* Fix keys */
|
/* Fix keys */
|
||||||
|
|
|
@ -136,6 +136,7 @@ typedef struct st_heap_share
|
||||||
HP_KEYDEF *keydef;
|
HP_KEYDEF *keydef;
|
||||||
ulong min_records,max_records; /* Params to open */
|
ulong min_records,max_records; /* Params to open */
|
||||||
ulong data_length,index_length,max_table_size;
|
ulong data_length,index_length,max_table_size;
|
||||||
|
uint key_stat_version; /* version to indicate insert/delete */
|
||||||
uint records; /* records */
|
uint records; /* records */
|
||||||
uint blength; /* records rounded up to 2^n */
|
uint blength; /* records rounded up to 2^n */
|
||||||
uint deleted; /* Deleted records in database */
|
uint deleted; /* Deleted records in database */
|
||||||
|
|
|
@ -5036,6 +5036,12 @@ my_bool STDCALL mysql_stmt_reset(MYSQL_STMT *stmt)
|
||||||
{
|
{
|
||||||
DBUG_ENTER("mysql_stmt_reset");
|
DBUG_ENTER("mysql_stmt_reset");
|
||||||
DBUG_ASSERT(stmt != 0);
|
DBUG_ASSERT(stmt != 0);
|
||||||
|
if (!stmt->mysql)
|
||||||
|
{
|
||||||
|
/* mysql can be reset in mysql_close called from mysql_reconnect */
|
||||||
|
set_stmt_error(stmt, CR_SERVER_LOST, unknown_sqlstate);
|
||||||
|
DBUG_RETURN(1);
|
||||||
|
}
|
||||||
/* Reset the client and server sides of the prepared statement */
|
/* Reset the client and server sides of the prepared statement */
|
||||||
DBUG_RETURN(reset_stmt_handle(stmt, RESET_SERVER_SIDE | RESET_LONG_DATA));
|
DBUG_RETURN(reset_stmt_handle(stmt, RESET_SERVER_SIDE | RESET_LONG_DATA));
|
||||||
}
|
}
|
||||||
|
|
|
@ -503,3 +503,12 @@ d1 d2
|
||||||
02 February
|
02 February
|
||||||
01 January
|
01 January
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
select str_to_date( 1, NULL );
|
||||||
|
str_to_date( 1, NULL )
|
||||||
|
NULL
|
||||||
|
select str_to_date( NULL, 1 );
|
||||||
|
str_to_date( NULL, 1 )
|
||||||
|
NULL
|
||||||
|
select str_to_date( 1, IF(1=1,NULL,NULL) );
|
||||||
|
str_to_date( 1, IF(1=1,NULL,NULL) )
|
||||||
|
NULL
|
||||||
|
|
|
@ -141,6 +141,23 @@ SUM(a)
|
||||||
6
|
6
|
||||||
4
|
4
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
CREATE TABLE t1 (a int);
|
||||||
|
INSERT INTO t1 VALUES (1), (2), (1), (3), (2), (1);
|
||||||
|
SELECT a FROM t1 GROUP BY a HAVING a > 1;
|
||||||
|
a
|
||||||
|
2
|
||||||
|
3
|
||||||
|
SELECT a FROM t1 GROUP BY a HAVING 1 != 1 AND a > 1;
|
||||||
|
a
|
||||||
|
SELECT 0 AS x, a FROM t1 GROUP BY x,a HAVING x=1 AND a > 1;
|
||||||
|
x a
|
||||||
|
EXPLAIN SELECT a FROM t1 GROUP BY a HAVING 1 != 1 AND a > 1;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible HAVING
|
||||||
|
EXPLAIN SELECT 0 AS x, a FROM t1 GROUP BY x,a HAVING x=1 AND a > 1;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible HAVING
|
||||||
|
DROP table t1;
|
||||||
create table t1 (col1 int, col2 varchar(5), col_t1 int);
|
create table t1 (col1 int, col2 varchar(5), col_t1 int);
|
||||||
create table t2 (col1 int, col2 varchar(5), col_t2 int);
|
create table t2 (col1 int, col2 varchar(5), col_t2 int);
|
||||||
create table t3 (col1 int, col2 varchar(5), col_t3 int);
|
create table t3 (col1 int, col2 varchar(5), col_t3 int);
|
||||||
|
|
|
@ -169,7 +169,7 @@ id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 SIMPLE t1 ALL btn NULL NULL NULL 11 Using where
|
1 SIMPLE t1 ALL btn NULL NULL NULL 11 Using where
|
||||||
explain select * from t1 where btn="a" and new_col="a";
|
explain select * from t1 where btn="a" and new_col="a";
|
||||||
id select_type table type possible_keys key key_len ref rows Extra
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 SIMPLE t1 ref btn btn 11 const,const 1 Using where
|
1 SIMPLE t1 ref btn btn 11 const,const 2 Using where
|
||||||
drop table t1;
|
drop table t1;
|
||||||
CREATE TABLE t1 (
|
CREATE TABLE t1 (
|
||||||
a int default NULL,
|
a int default NULL,
|
||||||
|
@ -182,7 +182,7 @@ SELECT * FROM t1 WHERE a=NULL;
|
||||||
a b
|
a b
|
||||||
explain SELECT * FROM t1 WHERE a IS NULL;
|
explain SELECT * FROM t1 WHERE a IS NULL;
|
||||||
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 a a 5 const 1 Using where
|
1 SIMPLE t1 ref a a 5 const 2 Using where
|
||||||
SELECT * FROM t1 WHERE a<=>NULL;
|
SELECT * FROM t1 WHERE a<=>NULL;
|
||||||
a b
|
a b
|
||||||
NULL 99
|
NULL 99
|
||||||
|
@ -701,6 +701,16 @@ insert into t1 values ("abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd
|
||||||
insert into t1 values ("abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz");
|
insert into t1 values ("abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz");
|
||||||
ERROR 23000: Duplicate entry 'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijkl' for key 1
|
ERROR 23000: Duplicate entry 'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijkl' for key 1
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
CREATE TABLE t1 (a int, key(a)) engine=heap;
|
||||||
|
insert delayed into t1 values (0);
|
||||||
|
delete from t1;
|
||||||
|
select * from t1;
|
||||||
|
a
|
||||||
|
insert delayed into t1 values (0), (1);
|
||||||
|
select * from t1 where a = 0;
|
||||||
|
a
|
||||||
|
0
|
||||||
|
drop table t1;
|
||||||
create table t1 (c char(10)) engine=memory;
|
create table t1 (c char(10)) engine=memory;
|
||||||
create table t2 (c varchar(10)) engine=memory;
|
create table t2 (c varchar(10)) engine=memory;
|
||||||
show table status like 't_';
|
show table status like 't_';
|
||||||
|
|
|
@ -169,7 +169,7 @@ id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 SIMPLE t1 ALL btn NULL NULL NULL 11 Using where
|
1 SIMPLE t1 ALL btn NULL NULL NULL 11 Using where
|
||||||
explain select * from t1 where btn="a" and new_col="a";
|
explain select * from t1 where btn="a" and new_col="a";
|
||||||
id select_type table type possible_keys key key_len ref rows Extra
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 SIMPLE t1 ref btn btn 11 const,const 1 Using where
|
1 SIMPLE t1 ref btn btn 11 const,const 2 Using where
|
||||||
drop table t1;
|
drop table t1;
|
||||||
CREATE TABLE t1 (
|
CREATE TABLE t1 (
|
||||||
a int default NULL,
|
a int default NULL,
|
||||||
|
@ -182,7 +182,7 @@ SELECT * FROM t1 WHERE a=NULL;
|
||||||
a b
|
a b
|
||||||
explain SELECT * FROM t1 WHERE a IS NULL;
|
explain SELECT * FROM t1 WHERE a IS NULL;
|
||||||
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 a a 5 const 1 Using where
|
1 SIMPLE t1 ref a a 5 const 2 Using where
|
||||||
SELECT * FROM t1 WHERE a<=>NULL;
|
SELECT * FROM t1 WHERE a<=>NULL;
|
||||||
a b
|
a b
|
||||||
NULL 99
|
NULL 99
|
||||||
|
@ -220,16 +220,16 @@ insert into t1 values ('aaag', 'prefill-hash=3',0);
|
||||||
insert into t1 values ('aaah', 'prefill-hash=6',0);
|
insert into t1 values ('aaah', 'prefill-hash=6',0);
|
||||||
explain select * from t1 where a='aaaa';
|
explain select * from t1 where a='aaaa';
|
||||||
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 a a 8 const 1 Using where
|
1 SIMPLE t1 ref a a 8 const 2 Using where
|
||||||
explain select * from t1 where a='aaab';
|
explain select * from t1 where a='aaab';
|
||||||
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 a a 8 const 1 Using where
|
1 SIMPLE t1 ref a a 8 const 2 Using where
|
||||||
explain select * from t1 where a='aaac';
|
explain select * from t1 where a='aaac';
|
||||||
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 a a 8 const 1 Using where
|
1 SIMPLE t1 ref a a 8 const 2 Using where
|
||||||
explain select * from t1 where a='aaad';
|
explain select * from t1 where a='aaad';
|
||||||
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 a a 8 const 1 Using where
|
1 SIMPLE t1 ref a a 8 const 2 Using where
|
||||||
insert into t1 select * from t1;
|
insert into t1 select * from t1;
|
||||||
flush tables;
|
flush tables;
|
||||||
explain select * from t1 where a='aaaa';
|
explain select * from t1 where a='aaaa';
|
||||||
|
@ -291,25 +291,25 @@ insert into t1 (name) values ('Matt'), ('Lilu'), ('Corbin'), ('Carly'),
|
||||||
insert into t2 select * from t1;
|
insert into t2 select * from t1;
|
||||||
explain select * from t1 where name='matt';
|
explain select * from t1 where name='matt';
|
||||||
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 heap_idx,btree_idx heap_idx 22 const 1 Using where
|
1 SIMPLE t1 ref heap_idx,btree_idx btree_idx 22 const 1 Using where
|
||||||
explain select * from t2 where name='matt';
|
explain select * from t2 where name='matt';
|
||||||
id select_type table type possible_keys key key_len ref rows Extra
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 SIMPLE t2 ref btree_idx,heap_idx btree_idx 22 const 1 Using where
|
1 SIMPLE t2 ref btree_idx,heap_idx btree_idx 22 const 1 Using where
|
||||||
explain select * from t1 where name='Lilu';
|
explain select * from t1 where name='Lilu';
|
||||||
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 heap_idx,btree_idx heap_idx 22 const 1 Using where
|
1 SIMPLE t1 ref heap_idx,btree_idx btree_idx 22 const 1 Using where
|
||||||
explain select * from t2 where name='Lilu';
|
explain select * from t2 where name='Lilu';
|
||||||
id select_type table type possible_keys key key_len ref rows Extra
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 SIMPLE t2 ref btree_idx,heap_idx btree_idx 22 const 1 Using where
|
1 SIMPLE t2 ref btree_idx,heap_idx btree_idx 22 const 1 Using where
|
||||||
explain select * from t1 where name='Phil';
|
explain select * from t1 where name='Phil';
|
||||||
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 heap_idx,btree_idx heap_idx 22 const 1 Using where
|
1 SIMPLE t1 ref heap_idx,btree_idx btree_idx 22 const 1 Using where
|
||||||
explain select * from t2 where name='Phil';
|
explain select * from t2 where name='Phil';
|
||||||
id select_type table type possible_keys key key_len ref rows Extra
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 SIMPLE t2 ref btree_idx,heap_idx btree_idx 22 const 1 Using where
|
1 SIMPLE t2 ref btree_idx,heap_idx btree_idx 22 const 1 Using where
|
||||||
explain select * from t1 where name='Lilu';
|
explain select * from t1 where name='Lilu';
|
||||||
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 heap_idx,btree_idx heap_idx 22 const 1 Using where
|
1 SIMPLE t1 ref heap_idx,btree_idx btree_idx 22 const 1 Using where
|
||||||
explain select * from t2 where name='Lilu';
|
explain select * from t2 where name='Lilu';
|
||||||
id select_type table type possible_keys key key_len ref rows Extra
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 SIMPLE t2 ref btree_idx,heap_idx btree_idx 22 const 1 Using where
|
1 SIMPLE t2 ref btree_idx,heap_idx btree_idx 22 const 1 Using where
|
||||||
|
@ -364,5 +364,5 @@ a
|
||||||
3
|
3
|
||||||
explain select a from t1 where a in (1,3);
|
explain select a from t1 where a in (1,3);
|
||||||
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 a a 5 NULL 2 Using where
|
1 SIMPLE t1 range a a 5 NULL 4 Using where
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
drop table if exists t1;
|
drop table if exists t1, t2, t3;
|
||||||
create table t1 (kill_id int);
|
create table t1 (kill_id int);
|
||||||
insert into t1 values(connection_id());
|
insert into t1 values(connection_id());
|
||||||
select ((@id := kill_id) - kill_id) from t1;
|
select ((@id := kill_id) - kill_id) from t1;
|
||||||
|
@ -15,6 +15,18 @@ select 4;
|
||||||
4
|
4
|
||||||
4
|
4
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
create table t1 (id int primary key);
|
||||||
|
create table t2 (id int unsigned not null);
|
||||||
|
insert into t2 select id from t1;
|
||||||
|
create table t3 (kill_id int);
|
||||||
|
insert into t3 values(connection_id());
|
||||||
|
select id from t1 where id in (select distinct id from t2);
|
||||||
|
select ((@id := kill_id) - kill_id) from t3;
|
||||||
|
((@id := kill_id) - kill_id)
|
||||||
|
0
|
||||||
|
kill @id;
|
||||||
|
ERROR 08S01: Server shutdown in progress
|
||||||
|
drop table t1, t2, t3;
|
||||||
select get_lock("a", 10);
|
select get_lock("a", 10);
|
||||||
get_lock("a", 10)
|
get_lock("a", 10)
|
||||||
1
|
1
|
||||||
|
|
|
@ -567,7 +567,7 @@ Warnings:
|
||||||
Note 1031 Table storage engine for 't1' doesn't have this option
|
Note 1031 Table storage engine for 't1' doesn't have this option
|
||||||
show keys from t1;
|
show keys from t1;
|
||||||
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
|
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
|
||||||
t1 1 a 1 a NULL 1000 NULL NULL YES HASH
|
t1 1 a 1 a NULL 500 NULL NULL YES HASH
|
||||||
drop table t1,t2;
|
drop table t1,t2;
|
||||||
create table t1 ( a tinytext, b char(1), index idx (a(1),b) );
|
create table t1 ( a tinytext, b char(1), index idx (a(1),b) );
|
||||||
insert into t1 values (null,''), (null,'');
|
insert into t1 values (null,''), (null,'');
|
||||||
|
|
|
@ -358,3 +358,22 @@ update t2,t1 set f1=3,f2=3 where f1=f2 and f1=1;
|
||||||
affected rows: 3
|
affected rows: 3
|
||||||
info: Rows matched: 3 Changed: 3 Warnings: 0
|
info: Rows matched: 3 Changed: 3 Warnings: 0
|
||||||
drop table t1,t2;
|
drop table t1,t2;
|
||||||
|
create table t1 (a int);
|
||||||
|
insert into t1 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
||||||
|
create table t2 (a int, filler1 char(200), filler2 char(200), key(a));
|
||||||
|
insert into t2 select A.a + 10*B.a, 'filler','filler' from t1 A, t1 B;
|
||||||
|
flush status;
|
||||||
|
update t2 set a=3 where a=2;
|
||||||
|
show status like 'handler_read%';
|
||||||
|
Variable_name Value
|
||||||
|
Handler_read_first 0
|
||||||
|
Handler_read_key 1
|
||||||
|
Handler_read_next 1
|
||||||
|
Handler_read_prev 0
|
||||||
|
Handler_read_rnd 1
|
||||||
|
Handler_read_rnd_next 0
|
||||||
|
drop table t1, t2;
|
||||||
|
create table t1(f1 int, `*f2` int);
|
||||||
|
insert into t1 values (1,1);
|
||||||
|
update t1 set `*f2`=1;
|
||||||
|
drop table t1;
|
||||||
|
|
|
@ -2504,3 +2504,37 @@ id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
|
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
|
||||||
DROP VIEW v1;
|
DROP VIEW v1;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
CREATE TABLE t1 (x varchar(10));
|
||||||
|
INSERT INTO t1 VALUES (null), ('foo'), ('bar'), (null);
|
||||||
|
CREATE VIEW v1 AS SELECT * FROM t1;
|
||||||
|
SELECT IF(x IS NULL, 'blank', 'not blank') FROM v1 GROUP BY x;
|
||||||
|
IF(x IS NULL, 'blank', 'not blank')
|
||||||
|
blank
|
||||||
|
not blank
|
||||||
|
not blank
|
||||||
|
SELECT IF(x IS NULL, 'blank', 'not blank') AS x FROM t1 GROUP BY x;
|
||||||
|
x
|
||||||
|
blank
|
||||||
|
not blank
|
||||||
|
not blank
|
||||||
|
Warnings:
|
||||||
|
Warning 1052 Column 'x' in group statement is ambiguous
|
||||||
|
SELECT IF(x IS NULL, 'blank', 'not blank') AS x FROM v1;
|
||||||
|
x
|
||||||
|
blank
|
||||||
|
not blank
|
||||||
|
not blank
|
||||||
|
blank
|
||||||
|
SELECT IF(x IS NULL, 'blank', 'not blank') AS y FROM v1 GROUP BY y;
|
||||||
|
y
|
||||||
|
blank
|
||||||
|
not blank
|
||||||
|
SELECT IF(x IS NULL, 'blank', 'not blank') AS x FROM v1 GROUP BY x;
|
||||||
|
x
|
||||||
|
blank
|
||||||
|
not blank
|
||||||
|
not blank
|
||||||
|
Warnings:
|
||||||
|
Warning 1052 Column 'x' in group statement is ambiguous
|
||||||
|
DROP VIEW v1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
|
@ -269,4 +269,11 @@ insert into t1 (f1) values ("2005-01-01");
|
||||||
insert into t1 (f1) values ("2005-02-01");
|
insert into t1 (f1) values ("2005-02-01");
|
||||||
select date_format(f1, "%m") as d1, date_format(f1, "%M") as d2 from t1 order by date_format(f1, "%M");
|
select date_format(f1, "%m") as d1, date_format(f1, "%M") as d2 from t1 order by date_format(f1, "%M");
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug #15828
|
||||||
|
#
|
||||||
|
select str_to_date( 1, NULL );
|
||||||
|
select str_to_date( NULL, 1 );
|
||||||
|
select str_to_date( 1, IF(1=1,NULL,NULL) );
|
||||||
# End of 4.1 tests
|
# End of 4.1 tests
|
||||||
|
|
|
@ -135,6 +135,22 @@ SELECT SUM(a) FROM t1 GROUP BY a HAVING SUM(a);
|
||||||
|
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug #14927: HAVING clause containing constant false conjunct
|
||||||
|
#
|
||||||
|
|
||||||
|
CREATE TABLE t1 (a int);
|
||||||
|
INSERT INTO t1 VALUES (1), (2), (1), (3), (2), (1);
|
||||||
|
|
||||||
|
SELECT a FROM t1 GROUP BY a HAVING a > 1;
|
||||||
|
SELECT a FROM t1 GROUP BY a HAVING 1 != 1 AND a > 1;
|
||||||
|
SELECT 0 AS x, a FROM t1 GROUP BY x,a HAVING x=1 AND a > 1;
|
||||||
|
|
||||||
|
EXPLAIN SELECT a FROM t1 GROUP BY a HAVING 1 != 1 AND a > 1;
|
||||||
|
EXPLAIN SELECT 0 AS x, a FROM t1 GROUP BY x,a HAVING x=1 AND a > 1;
|
||||||
|
|
||||||
|
DROP table t1;
|
||||||
|
|
||||||
# End of 4.1 tests
|
# End of 4.1 tests
|
||||||
|
|
||||||
#
|
#
|
||||||
|
|
|
@ -436,6 +436,17 @@ insert into t1 values ("abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd
|
||||||
insert into t1 values ("abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz");
|
insert into t1 values ("abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz");
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug 12796: Record doesn't show when selecting through index
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (a int, key(a)) engine=heap;
|
||||||
|
insert delayed into t1 values (0);
|
||||||
|
delete from t1;
|
||||||
|
select * from t1;
|
||||||
|
insert delayed into t1 values (0), (1);
|
||||||
|
select * from t1 where a = 0;
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
# End of 4.1 tests
|
# End of 4.1 tests
|
||||||
|
|
||||||
#
|
#
|
||||||
|
|
|
@ -12,7 +12,7 @@ connect (con2, localhost, root,,);
|
||||||
#remember id of con1
|
#remember id of con1
|
||||||
connection con1;
|
connection con1;
|
||||||
--disable_warnings
|
--disable_warnings
|
||||||
drop table if exists t1;
|
drop table if exists t1, t2, t3;
|
||||||
--enable_warnings
|
--enable_warnings
|
||||||
|
|
||||||
--disable_reconnect
|
--disable_reconnect
|
||||||
|
@ -47,6 +47,50 @@ connection con2;
|
||||||
select 4;
|
select 4;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
connection default;
|
||||||
|
#
|
||||||
|
# BUG#14851: killing long running subquery processed via a temporary table.
|
||||||
|
#
|
||||||
|
create table t1 (id int primary key);
|
||||||
|
create table t2 (id int unsigned not null);
|
||||||
|
|
||||||
|
connect (conn1, localhost, root,,);
|
||||||
|
connection conn1;
|
||||||
|
|
||||||
|
-- disable_result_log
|
||||||
|
-- disable_query_log
|
||||||
|
let $1 = 4096;
|
||||||
|
while ($1)
|
||||||
|
{
|
||||||
|
eval insert into t1 values ($1);
|
||||||
|
dec $1;
|
||||||
|
}
|
||||||
|
-- enable_query_log
|
||||||
|
-- enable_result_log
|
||||||
|
|
||||||
|
insert into t2 select id from t1;
|
||||||
|
|
||||||
|
create table t3 (kill_id int);
|
||||||
|
insert into t3 values(connection_id());
|
||||||
|
|
||||||
|
-- disable_result_log
|
||||||
|
send select id from t1 where id in (select distinct id from t2);
|
||||||
|
-- enable_result_log
|
||||||
|
|
||||||
|
connect (conn2, localhost, root,,);
|
||||||
|
connection conn2;
|
||||||
|
select ((@id := kill_id) - kill_id) from t3;
|
||||||
|
-- sleep 1
|
||||||
|
kill @id;
|
||||||
|
|
||||||
|
connection conn1;
|
||||||
|
-- error 1053
|
||||||
|
reap;
|
||||||
|
|
||||||
|
connection default;
|
||||||
|
|
||||||
|
drop table t1, t2, t3;
|
||||||
|
|
||||||
# End of 4.1 tests
|
# End of 4.1 tests
|
||||||
|
|
||||||
#
|
#
|
||||||
|
|
|
@ -287,4 +287,23 @@ update t1 set f1=1 where f1=3;
|
||||||
update t2,t1 set f1=3,f2=3 where f1=f2 and f1=1;
|
update t2,t1 set f1=3,f2=3 where f1=f2 and f1=1;
|
||||||
--disable_info
|
--disable_info
|
||||||
drop table t1,t2;
|
drop table t1,t2;
|
||||||
|
|
||||||
|
|
||||||
|
# BUG#15935
|
||||||
|
create table t1 (a int);
|
||||||
|
insert into t1 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
|
||||||
|
create table t2 (a int, filler1 char(200), filler2 char(200), key(a));
|
||||||
|
insert into t2 select A.a + 10*B.a, 'filler','filler' from t1 A, t1 B;
|
||||||
|
flush status;
|
||||||
|
update t2 set a=3 where a=2;
|
||||||
|
show status like 'handler_read%';
|
||||||
|
drop table t1, t2;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug #16510 Updating field named like '*name' caused server crash
|
||||||
|
#
|
||||||
|
create table t1(f1 int, `*f2` int);
|
||||||
|
insert into t1 values (1,1);
|
||||||
|
update t1 set `*f2`=1;
|
||||||
|
drop table t1;
|
||||||
# End of 4.1 tests
|
# End of 4.1 tests
|
||||||
|
|
|
@ -2363,3 +2363,20 @@ EXPLAIN SELECT MIN(a) FROM v1;
|
||||||
|
|
||||||
DROP VIEW v1;
|
DROP VIEW v1;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug#16382: grouping name is resolved against a view column name
|
||||||
|
# which coincides with a select column name
|
||||||
|
|
||||||
|
CREATE TABLE t1 (x varchar(10));
|
||||||
|
INSERT INTO t1 VALUES (null), ('foo'), ('bar'), (null);
|
||||||
|
CREATE VIEW v1 AS SELECT * FROM t1;
|
||||||
|
|
||||||
|
SELECT IF(x IS NULL, 'blank', 'not blank') FROM v1 GROUP BY x;
|
||||||
|
SELECT IF(x IS NULL, 'blank', 'not blank') AS x FROM t1 GROUP BY x;
|
||||||
|
SELECT IF(x IS NULL, 'blank', 'not blank') AS x FROM v1;
|
||||||
|
SELECT IF(x IS NULL, 'blank', 'not blank') AS y FROM v1 GROUP BY y;
|
||||||
|
SELECT IF(x IS NULL, 'blank', 'not blank') AS x FROM v1 GROUP BY x;
|
||||||
|
|
||||||
|
DROP VIEW v1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
|
@ -85,6 +85,11 @@
|
||||||
#define CFG_DB_BACKUP_DATADIR 158
|
#define CFG_DB_BACKUP_DATADIR 158
|
||||||
|
|
||||||
#define CFG_DB_MAX_OPEN_FILES 159
|
#define CFG_DB_MAX_OPEN_FILES 159
|
||||||
|
#define CFG_DB_DISK_PAGE_BUFFER_MEMORY 160 /* used from 5.1 */
|
||||||
|
#define CFG_DB_STRING_MEMORY 161 /* used from 5.1 */
|
||||||
|
#define CFG_DB_INITIAL_OPEN_FILES 162 /* used from 5.1 */
|
||||||
|
|
||||||
|
#define CFG_DB_DATA_MEM_2 199 /* used in special build in 5.1 */
|
||||||
|
|
||||||
#define CFG_NODE_ARBIT_RANK 200
|
#define CFG_NODE_ARBIT_RANK 200
|
||||||
#define CFG_NODE_ARBIT_DELAY 201
|
#define CFG_NODE_ARBIT_DELAY 201
|
||||||
|
|
|
@ -1483,13 +1483,16 @@ testperf()
|
||||||
// insert char (one trans)
|
// insert char (one trans)
|
||||||
{
|
{
|
||||||
DBG("--- insert char ---");
|
DBG("--- insert char ---");
|
||||||
|
char b[20];
|
||||||
t1.on();
|
t1.on();
|
||||||
CHK((g_con = g_ndb->startTransaction()) != 0);
|
CHK((g_con = g_ndb->startTransaction()) != 0);
|
||||||
for (Uint32 k = 0; k < g_opt.m_rowsperf; k++) {
|
for (Uint32 k = 0; k < g_opt.m_rowsperf; k++) {
|
||||||
CHK((g_opr = g_con->getNdbOperation(tab.getName())) != 0);
|
CHK((g_opr = g_con->getNdbOperation(tab.getName())) != 0);
|
||||||
CHK(g_opr->insertTuple() == 0);
|
CHK(g_opr->insertTuple() == 0);
|
||||||
CHK(g_opr->equal(cA, (char*)&k) == 0);
|
CHK(g_opr->equal(cA, (char*)&k) == 0);
|
||||||
CHK(g_opr->setValue(cB, "b") == 0);
|
memset(b, 0x20, sizeof(b));
|
||||||
|
b[0] = 'b';
|
||||||
|
CHK(g_opr->setValue(cB, b) == 0);
|
||||||
CHK(g_con->execute(NoCommit) == 0);
|
CHK(g_con->execute(NoCommit) == 0);
|
||||||
}
|
}
|
||||||
t1.off(g_opt.m_rowsperf);
|
t1.off(g_opt.m_rowsperf);
|
||||||
|
@ -1526,12 +1529,15 @@ testperf()
|
||||||
{
|
{
|
||||||
DBG("--- insert for read test ---");
|
DBG("--- insert for read test ---");
|
||||||
unsigned n = 0;
|
unsigned n = 0;
|
||||||
|
char b[20];
|
||||||
CHK((g_con = g_ndb->startTransaction()) != 0);
|
CHK((g_con = g_ndb->startTransaction()) != 0);
|
||||||
for (Uint32 k = 0; k < g_opt.m_rowsperf; k++) {
|
for (Uint32 k = 0; k < g_opt.m_rowsperf; k++) {
|
||||||
CHK((g_opr = g_con->getNdbOperation(tab.getName())) != 0);
|
CHK((g_opr = g_con->getNdbOperation(tab.getName())) != 0);
|
||||||
CHK(g_opr->insertTuple() == 0);
|
CHK(g_opr->insertTuple() == 0);
|
||||||
CHK(g_opr->equal(cA, (char*)&k) == 0);
|
CHK(g_opr->equal(cA, (char*)&k) == 0);
|
||||||
CHK(g_opr->setValue(cB, "b") == 0);
|
memset(b, 0x20, sizeof(b));
|
||||||
|
b[0] = 'b';
|
||||||
|
CHK(g_opr->setValue(cB, b) == 0);
|
||||||
CHK((g_bh1 = g_opr->getBlobHandle(cC)) != 0);
|
CHK((g_bh1 = g_opr->getBlobHandle(cC)) != 0);
|
||||||
CHK((g_bh1->setValue("c", 1) == 0));
|
CHK((g_bh1->setValue("c", 1) == 0));
|
||||||
if (++n == g_opt.m_batch) {
|
if (++n == g_opt.m_batch) {
|
||||||
|
@ -1565,7 +1571,7 @@ testperf()
|
||||||
a = (Uint32)-1;
|
a = (Uint32)-1;
|
||||||
b[0] = 0;
|
b[0] = 0;
|
||||||
CHK(g_con->execute(NoCommit) == 0);
|
CHK(g_con->execute(NoCommit) == 0);
|
||||||
CHK(a == k && strcmp(b, "b") == 0);
|
CHK(a == k && b[0] == 'b');
|
||||||
}
|
}
|
||||||
CHK(g_con->execute(Commit) == 0);
|
CHK(g_con->execute(Commit) == 0);
|
||||||
t1.off(g_opt.m_rowsperf);
|
t1.off(g_opt.m_rowsperf);
|
||||||
|
@ -1591,7 +1597,7 @@ testperf()
|
||||||
CHK(g_con->execute(NoCommit) == 0);
|
CHK(g_con->execute(NoCommit) == 0);
|
||||||
Uint32 m = 20;
|
Uint32 m = 20;
|
||||||
CHK(g_bh1->readData(c, m) == 0);
|
CHK(g_bh1->readData(c, m) == 0);
|
||||||
CHK(a == k && m == 1 && strcmp(c, "c") == 0);
|
CHK(a == k && m == 1 && c[0] == 'c');
|
||||||
}
|
}
|
||||||
CHK(g_con->execute(Commit) == 0);
|
CHK(g_con->execute(Commit) == 0);
|
||||||
t2.off(g_opt.m_rowsperf);
|
t2.off(g_opt.m_rowsperf);
|
||||||
|
@ -1623,7 +1629,7 @@ testperf()
|
||||||
CHK((ret = g_ops->nextResult(true)) == 0 || ret == 1);
|
CHK((ret = g_ops->nextResult(true)) == 0 || ret == 1);
|
||||||
if (ret == 1)
|
if (ret == 1)
|
||||||
break;
|
break;
|
||||||
CHK(a < g_opt.m_rowsperf && strcmp(b, "b") == 0);
|
CHK(a < g_opt.m_rowsperf && b[0] == 'b');
|
||||||
n++;
|
n++;
|
||||||
}
|
}
|
||||||
CHK(n == g_opt.m_rowsperf);
|
CHK(n == g_opt.m_rowsperf);
|
||||||
|
@ -1654,7 +1660,7 @@ testperf()
|
||||||
break;
|
break;
|
||||||
Uint32 m = 20;
|
Uint32 m = 20;
|
||||||
CHK(g_bh1->readData(c, m) == 0);
|
CHK(g_bh1->readData(c, m) == 0);
|
||||||
CHK(a < g_opt.m_rowsperf && m == 1 && strcmp(c, "c") == 0);
|
CHK(a < g_opt.m_rowsperf && m == 1 && c[0] == 'c');
|
||||||
n++;
|
n++;
|
||||||
}
|
}
|
||||||
CHK(n == g_opt.m_rowsperf);
|
CHK(n == g_opt.m_rowsperf);
|
||||||
|
|
|
@ -53,7 +53,7 @@ handlerton heap_hton= {
|
||||||
|
|
||||||
ha_heap::ha_heap(TABLE *table_arg)
|
ha_heap::ha_heap(TABLE *table_arg)
|
||||||
:handler(&heap_hton, table_arg), file(0), records_changed(0),
|
:handler(&heap_hton, table_arg), file(0), records_changed(0),
|
||||||
key_stats_ok(0)
|
key_stat_version(0)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
@ -104,7 +104,7 @@ int ha_heap::open(const char *name, int mode, uint test_if_locked)
|
||||||
ha_heap::info(), which is always called before key statistics are
|
ha_heap::info(), which is always called before key statistics are
|
||||||
used.
|
used.
|
||||||
*/
|
*/
|
||||||
key_stats_ok= FALSE;
|
key_stat_version= file->s->key_stat_version-1;
|
||||||
}
|
}
|
||||||
return (file ? 0 : 1);
|
return (file ? 0 : 1);
|
||||||
}
|
}
|
||||||
|
@ -151,14 +151,21 @@ void ha_heap::update_key_stats()
|
||||||
continue;
|
continue;
|
||||||
if (key->algorithm != HA_KEY_ALG_BTREE)
|
if (key->algorithm != HA_KEY_ALG_BTREE)
|
||||||
{
|
{
|
||||||
ha_rows hash_buckets= file->s->keydef[i].hash_buckets;
|
if (key->flags & HA_NOSAME)
|
||||||
key->rec_per_key[key->key_parts-1]=
|
key->rec_per_key[key->key_parts-1]= 1;
|
||||||
hash_buckets ? file->s->records/hash_buckets : 0;
|
else
|
||||||
|
{
|
||||||
|
ha_rows hash_buckets= file->s->keydef[i].hash_buckets;
|
||||||
|
uint no_records= hash_buckets ? file->s->records/hash_buckets : 2;
|
||||||
|
if (no_records < 2)
|
||||||
|
no_records= 2;
|
||||||
|
key->rec_per_key[key->key_parts-1]= no_records;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
records_changed= 0;
|
records_changed= 0;
|
||||||
/* At the end of update_key_stats() we can proudly claim they are OK. */
|
/* At the end of update_key_stats() we can proudly claim they are OK. */
|
||||||
key_stats_ok= TRUE;
|
key_stat_version= file->s->key_stat_version;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -173,7 +180,13 @@ int ha_heap::write_row(byte * buf)
|
||||||
res= heap_write(file,buf);
|
res= heap_write(file,buf);
|
||||||
if (!res && (++records_changed*HEAP_STATS_UPDATE_THRESHOLD >
|
if (!res && (++records_changed*HEAP_STATS_UPDATE_THRESHOLD >
|
||||||
file->s->records))
|
file->s->records))
|
||||||
key_stats_ok= FALSE;
|
{
|
||||||
|
/*
|
||||||
|
We can perform this safely since only one writer at the time is
|
||||||
|
allowed on the table.
|
||||||
|
*/
|
||||||
|
file->s->key_stat_version++;
|
||||||
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -186,7 +199,13 @@ int ha_heap::update_row(const byte * old_data, byte * new_data)
|
||||||
res= heap_update(file,old_data,new_data);
|
res= heap_update(file,old_data,new_data);
|
||||||
if (!res && ++records_changed*HEAP_STATS_UPDATE_THRESHOLD >
|
if (!res && ++records_changed*HEAP_STATS_UPDATE_THRESHOLD >
|
||||||
file->s->records)
|
file->s->records)
|
||||||
key_stats_ok= FALSE;
|
{
|
||||||
|
/*
|
||||||
|
We can perform this safely since only one writer at the time is
|
||||||
|
allowed on the table.
|
||||||
|
*/
|
||||||
|
file->s->key_stat_version++;
|
||||||
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -197,7 +216,13 @@ int ha_heap::delete_row(const byte * buf)
|
||||||
res= heap_delete(file,buf);
|
res= heap_delete(file,buf);
|
||||||
if (!res && table->s->tmp_table == NO_TMP_TABLE &&
|
if (!res && table->s->tmp_table == NO_TMP_TABLE &&
|
||||||
++records_changed*HEAP_STATS_UPDATE_THRESHOLD > file->s->records)
|
++records_changed*HEAP_STATS_UPDATE_THRESHOLD > file->s->records)
|
||||||
key_stats_ok= FALSE;
|
{
|
||||||
|
/*
|
||||||
|
We can perform this safely since only one writer at the time is
|
||||||
|
allowed on the table.
|
||||||
|
*/
|
||||||
|
file->s->key_stat_version++;
|
||||||
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -324,7 +349,7 @@ void ha_heap::info(uint flag)
|
||||||
have to update the key statistics. Hoping that a table lock is now
|
have to update the key statistics. Hoping that a table lock is now
|
||||||
in place.
|
in place.
|
||||||
*/
|
*/
|
||||||
if (! key_stats_ok)
|
if (key_stat_version != file->s->key_stat_version)
|
||||||
update_key_stats();
|
update_key_stats();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -337,7 +362,13 @@ int ha_heap::delete_all_rows()
|
||||||
{
|
{
|
||||||
heap_clear(file);
|
heap_clear(file);
|
||||||
if (table->s->tmp_table == NO_TMP_TABLE)
|
if (table->s->tmp_table == NO_TMP_TABLE)
|
||||||
key_stats_ok= FALSE;
|
{
|
||||||
|
/*
|
||||||
|
We can perform this safely since only one writer at the time is
|
||||||
|
allowed on the table.
|
||||||
|
*/
|
||||||
|
file->s->key_stat_version++;
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -497,8 +528,11 @@ ha_rows ha_heap::records_in_range(uint inx, key_range *min_key,
|
||||||
max_key->flag != HA_READ_AFTER_KEY)
|
max_key->flag != HA_READ_AFTER_KEY)
|
||||||
return HA_POS_ERROR; // Can only use exact keys
|
return HA_POS_ERROR; // Can only use exact keys
|
||||||
|
|
||||||
|
if (records <= 1)
|
||||||
|
return records;
|
||||||
|
|
||||||
/* Assert that info() did run. We need current statistics here. */
|
/* Assert that info() did run. We need current statistics here. */
|
||||||
DBUG_ASSERT(key_stats_ok);
|
DBUG_ASSERT(key_stat_version);
|
||||||
return key->rec_per_key[key->key_parts-1];
|
return key->rec_per_key[key->key_parts-1];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -29,7 +29,7 @@ class ha_heap: public handler
|
||||||
key_map btree_keys;
|
key_map btree_keys;
|
||||||
/* number of records changed since last statistics update */
|
/* number of records changed since last statistics update */
|
||||||
uint records_changed;
|
uint records_changed;
|
||||||
bool key_stats_ok;
|
uint key_stat_version;
|
||||||
public:
|
public:
|
||||||
ha_heap(TABLE *table);
|
ha_heap(TABLE *table);
|
||||||
~ha_heap() {}
|
~ha_heap() {}
|
||||||
|
|
|
@ -3023,9 +3023,9 @@ void Item_func_str_to_date::fix_length_and_dec()
|
||||||
cached_field_type= MYSQL_TYPE_STRING;
|
cached_field_type= MYSQL_TYPE_STRING;
|
||||||
max_length= MAX_DATETIME_FULL_WIDTH*MY_CHARSET_BIN_MB_MAXLEN;
|
max_length= MAX_DATETIME_FULL_WIDTH*MY_CHARSET_BIN_MB_MAXLEN;
|
||||||
cached_timestamp_type= MYSQL_TIMESTAMP_NONE;
|
cached_timestamp_type= MYSQL_TIMESTAMP_NONE;
|
||||||
if ((const_item= args[1]->const_item()))
|
format= args[1]->val_str(&format_str);
|
||||||
|
if (!args[1]->null_value && (const_item= args[1]->const_item()))
|
||||||
{
|
{
|
||||||
format= args[1]->val_str(&format_str);
|
|
||||||
cached_format_type= get_date_time_result_type(format->ptr(),
|
cached_format_type= get_date_time_result_type(format->ptr(),
|
||||||
format->length());
|
format->length());
|
||||||
switch (cached_format_type) {
|
switch (cached_format_type) {
|
||||||
|
|
|
@ -1816,11 +1816,14 @@ bool select_dumpvar::send_eof()
|
||||||
|
|
||||||
void TMP_TABLE_PARAM::init()
|
void TMP_TABLE_PARAM::init()
|
||||||
{
|
{
|
||||||
|
DBUG_ENTER("TMP_TABLE_PARAM::init");
|
||||||
|
DBUG_PRINT("enter", ("this: 0x%lx", (ulong)this));
|
||||||
field_count= sum_func_count= func_count= hidden_field_count= 0;
|
field_count= sum_func_count= func_count= hidden_field_count= 0;
|
||||||
group_parts= group_length= group_null_parts= 0;
|
group_parts= group_length= group_null_parts= 0;
|
||||||
quick_group= 1;
|
quick_group= 1;
|
||||||
table_charset= 0;
|
table_charset= 0;
|
||||||
precomputed_group_by= 0;
|
precomputed_group_by= 0;
|
||||||
|
DBUG_VOID_RETURN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1122,7 +1122,7 @@ void st_select_lex::init_query()
|
||||||
embedding= leaf_tables= 0;
|
embedding= leaf_tables= 0;
|
||||||
item_list.empty();
|
item_list.empty();
|
||||||
join= 0;
|
join= 0;
|
||||||
having= where= prep_where= 0;
|
having= prep_having= where= prep_where= 0;
|
||||||
olap= UNSPECIFIED_OLAP_TYPE;
|
olap= UNSPECIFIED_OLAP_TYPE;
|
||||||
having_fix_field= 0;
|
having_fix_field= 0;
|
||||||
context.select_lex= this;
|
context.select_lex= this;
|
||||||
|
|
|
@ -474,6 +474,7 @@ public:
|
||||||
char *db;
|
char *db;
|
||||||
Item *where, *having; /* WHERE & HAVING clauses */
|
Item *where, *having; /* WHERE & HAVING clauses */
|
||||||
Item *prep_where; /* saved WHERE clause for prepared statement processing */
|
Item *prep_where; /* saved WHERE clause for prepared statement processing */
|
||||||
|
Item *prep_having;/* saved HAVING clause for prepared statement processing */
|
||||||
/* point on lex in which it was created, used in view subquery detection */
|
/* point on lex in which it was created, used in view subquery detection */
|
||||||
st_lex *parent_lex;
|
st_lex *parent_lex;
|
||||||
enum olap_type olap;
|
enum olap_type olap;
|
||||||
|
|
|
@ -2066,14 +2066,19 @@ void reinit_stmt_before_use(THD *thd, LEX *lex)
|
||||||
sl->exclude_from_table_unique_test= FALSE;
|
sl->exclude_from_table_unique_test= FALSE;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Copy WHERE clause pointers to avoid damaging they by optimisation
|
Copy WHERE, HAVING clause pointers to avoid damaging them by optimisation
|
||||||
*/
|
*/
|
||||||
if (sl->prep_where)
|
if (sl->prep_where)
|
||||||
{
|
{
|
||||||
sl->where= sl->prep_where->copy_andor_structure(thd);
|
sl->where= sl->prep_where->copy_andor_structure(thd);
|
||||||
sl->where->cleanup();
|
sl->where->cleanup();
|
||||||
}
|
}
|
||||||
DBUG_ASSERT(sl->join == 0);
|
if (sl->prep_having)
|
||||||
|
{
|
||||||
|
sl->having= sl->prep_having->copy_andor_structure(thd);
|
||||||
|
sl->having->cleanup();
|
||||||
|
}
|
||||||
|
DBUG_ASSERT(sl->join == 0);
|
||||||
ORDER *order;
|
ORDER *order;
|
||||||
/* Fix GROUP list */
|
/* Fix GROUP list */
|
||||||
for (order= (ORDER *)sl->group_list.first; order; order= order->next)
|
for (order= (ORDER *)sl->group_list.first; order; order= order->next)
|
||||||
|
|
|
@ -612,6 +612,7 @@ JOIN::optimize()
|
||||||
build_bitmap_for_nested_joins(join_list, 0);
|
build_bitmap_for_nested_joins(join_list, 0);
|
||||||
|
|
||||||
sel->prep_where= conds ? conds->copy_andor_structure(thd) : 0;
|
sel->prep_where= conds ? conds->copy_andor_structure(thd) : 0;
|
||||||
|
sel->prep_having= having ? having->copy_andor_structure(thd) : 0;
|
||||||
|
|
||||||
if (arena)
|
if (arena)
|
||||||
thd->restore_active_arena(arena, &backup);
|
thd->restore_active_arena(arena, &backup);
|
||||||
|
@ -625,13 +626,26 @@ JOIN::optimize()
|
||||||
DBUG_RETURN(1);
|
DBUG_RETURN(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cond_value == Item::COND_FALSE ||
|
{
|
||||||
(!unit->select_limit_cnt && !(select_options & OPTION_FOUND_ROWS)))
|
Item::cond_result having_value;
|
||||||
{ /* Impossible cond */
|
having= optimize_cond(this, having, join_list, &having_value);
|
||||||
DBUG_PRINT("info", ("Impossible WHERE"));
|
if (thd->net.report_error)
|
||||||
zero_result_cause= "Impossible WHERE";
|
{
|
||||||
error= 0;
|
error= 1;
|
||||||
DBUG_RETURN(0);
|
DBUG_PRINT("error",("Error from optimize_cond"));
|
||||||
|
DBUG_RETURN(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cond_value == Item::COND_FALSE || having_value == Item::COND_FALSE ||
|
||||||
|
(!unit->select_limit_cnt && !(select_options & OPTION_FOUND_ROWS)))
|
||||||
|
{ /* Impossible cond */
|
||||||
|
DBUG_PRINT("info", (having_value == Item::COND_FALSE ?
|
||||||
|
"Impossible HAVING" : "Impossible WHERE"));
|
||||||
|
zero_result_cause= having_value == Item::COND_FALSE ?
|
||||||
|
"Impossible HAVING" : "Impossible WHERE";
|
||||||
|
error= 0;
|
||||||
|
DBUG_RETURN(0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Optimize count(*), min() and max() */
|
/* Optimize count(*), min() and max() */
|
||||||
|
@ -6016,6 +6030,20 @@ void JOIN::cleanup(bool full)
|
||||||
problems in free_elements() as some of the elements are then deleted.
|
problems in free_elements() as some of the elements are then deleted.
|
||||||
*/
|
*/
|
||||||
tmp_table_param.copy_funcs.empty();
|
tmp_table_param.copy_funcs.empty();
|
||||||
|
/*
|
||||||
|
If we have tmp_join and 'this' JOIN is not tmp_join and
|
||||||
|
tmp_table_param.copy_field's of them are equal then we have to remove
|
||||||
|
pointer to tmp_table_param.copy_field from tmp_join, because it qill
|
||||||
|
be removed in tmp_table_param.cleanup().
|
||||||
|
*/
|
||||||
|
if (tmp_join &&
|
||||||
|
tmp_join != this &&
|
||||||
|
tmp_join->tmp_table_param.copy_field ==
|
||||||
|
tmp_table_param.copy_field)
|
||||||
|
{
|
||||||
|
tmp_join->tmp_table_param.copy_field=
|
||||||
|
tmp_join->tmp_table_param.save_copy_field= 0;
|
||||||
|
}
|
||||||
tmp_table_param.cleanup();
|
tmp_table_param.cleanup();
|
||||||
}
|
}
|
||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
|
@ -12381,7 +12409,8 @@ find_order_in_list(THD *thd, Item **ref_pointer_array, TABLE_LIST *tables,
|
||||||
overshadows the column reference from the SELECT list.
|
overshadows the column reference from the SELECT list.
|
||||||
*/
|
*/
|
||||||
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN, ER_NON_UNIQ_ERROR,
|
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN, ER_NON_UNIQ_ERROR,
|
||||||
ER(ER_NON_UNIQ_ERROR), from_field->field_name,
|
ER(ER_NON_UNIQ_ERROR),
|
||||||
|
((Item_ident*) order_item)->field_name,
|
||||||
current_thd->where);
|
current_thd->where);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -285,7 +285,14 @@ class JOIN :public Sql_alloc
|
||||||
{
|
{
|
||||||
init(thd_arg, fields_arg, select_options_arg, result_arg);
|
init(thd_arg, fields_arg, select_options_arg, result_arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
JOIN(JOIN &join)
|
||||||
|
:fields_list(join.fields_list)
|
||||||
|
{
|
||||||
|
init(join.thd, join.fields_list, join.select_options,
|
||||||
|
join.result);
|
||||||
|
}
|
||||||
|
|
||||||
void init(THD *thd_arg, List<Item> &fields_arg, ulonglong select_options_arg,
|
void init(THD *thd_arg, List<Item> &fields_arg, ulonglong select_options_arg,
|
||||||
select_result *result_arg)
|
select_result *result_arg)
|
||||||
{
|
{
|
||||||
|
@ -332,7 +339,7 @@ class JOIN :public Sql_alloc
|
||||||
all_fields= fields_arg;
|
all_fields= fields_arg;
|
||||||
fields_list= fields_arg;
|
fields_list= fields_arg;
|
||||||
bzero((char*) &keyuse,sizeof(keyuse));
|
bzero((char*) &keyuse,sizeof(keyuse));
|
||||||
tmp_table_param.copy_field=0;
|
tmp_table_param.init();
|
||||||
tmp_table_param.end_write_records= HA_POS_ERROR;
|
tmp_table_param.end_write_records= HA_POS_ERROR;
|
||||||
rollup.state= ROLLUP::STATE_NONE;
|
rollup.state= ROLLUP::STATE_NONE;
|
||||||
}
|
}
|
||||||
|
|
|
@ -308,7 +308,6 @@ int mysql_update(THD *thd,
|
||||||
SORT_FIELD *sortorder;
|
SORT_FIELD *sortorder;
|
||||||
ha_rows examined_rows;
|
ha_rows examined_rows;
|
||||||
|
|
||||||
used_index= MAX_KEY; // For call to init_read_record()
|
|
||||||
table->sort.io_cache = (IO_CACHE *) my_malloc(sizeof(IO_CACHE),
|
table->sort.io_cache = (IO_CACHE *) my_malloc(sizeof(IO_CACHE),
|
||||||
MYF(MY_FAE | MY_ZEROFILL));
|
MYF(MY_FAE | MY_ZEROFILL));
|
||||||
if (!(sortorder=make_unireg_sortorder(order, &length)) ||
|
if (!(sortorder=make_unireg_sortorder(order, &length)) ||
|
||||||
|
@ -339,10 +338,21 @@ int mysql_update(THD *thd,
|
||||||
if (open_cached_file(&tempfile, mysql_tmpdir,TEMP_PREFIX,
|
if (open_cached_file(&tempfile, mysql_tmpdir,TEMP_PREFIX,
|
||||||
DISK_BUFFER_SIZE, MYF(MY_WME)))
|
DISK_BUFFER_SIZE, MYF(MY_WME)))
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
/* If quick select is used, initialize it before retrieving rows. */
|
/* If quick select is used, initialize it before retrieving rows. */
|
||||||
if (select && select->quick && select->quick->reset())
|
if (select && select->quick && select->quick->reset())
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
|
/*
|
||||||
|
When we get here, we have one of the following options:
|
||||||
|
A. used_index == MAX_KEY
|
||||||
|
This means we should use full table scan, and start it with
|
||||||
|
init_read_record call
|
||||||
|
B. used_index != MAX_KEY
|
||||||
|
B.1 quick select is used, start the scan with init_read_record
|
||||||
|
B.2 quick select is not used, this is full index scan (with LIMIT)
|
||||||
|
Full index scan must be started with init_read_record_idx
|
||||||
|
*/
|
||||||
if (used_index == MAX_KEY || (select && select->quick))
|
if (used_index == MAX_KEY || (select && select->quick))
|
||||||
init_read_record(&info,thd,table,select,0,1);
|
init_read_record(&info,thd,table,select,0,1);
|
||||||
else
|
else
|
||||||
|
|
|
@ -14697,6 +14697,38 @@ static void test_opt_reconnect()
|
||||||
mysql_close(lmysql);
|
mysql_close(lmysql);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void test_bug12744()
|
||||||
|
{
|
||||||
|
MYSQL_STMT *prep_stmt = NULL;
|
||||||
|
int rc;
|
||||||
|
myheader("test_bug12744");
|
||||||
|
|
||||||
|
prep_stmt= mysql_stmt_init(mysql);
|
||||||
|
rc= mysql_stmt_prepare(prep_stmt, "SELECT 1", 8);
|
||||||
|
DIE_UNLESS(rc==0);
|
||||||
|
|
||||||
|
rc= mysql_kill(mysql, mysql_thread_id(mysql));
|
||||||
|
DIE_UNLESS(rc==0);
|
||||||
|
|
||||||
|
if (rc= mysql_stmt_execute(prep_stmt))
|
||||||
|
{
|
||||||
|
if (rc= mysql_stmt_reset(prep_stmt))
|
||||||
|
printf("OK!\n");
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf("Error!");
|
||||||
|
DIE_UNLESS(1==0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fprintf(stderr, "expected error but no error occured\n");
|
||||||
|
DIE_UNLESS(1==0);
|
||||||
|
}
|
||||||
|
rc= mysql_stmt_close(prep_stmt);
|
||||||
|
}
|
||||||
|
|
||||||
/* Bug #16144: mysql_stmt_attr_get type error */
|
/* Bug #16144: mysql_stmt_attr_get type error */
|
||||||
|
|
||||||
static void test_bug16144()
|
static void test_bug16144()
|
||||||
|
@ -14711,6 +14743,7 @@ static void test_bug16144()
|
||||||
mysql_stmt_attr_set(stmt, STMT_ATTR_UPDATE_MAX_LENGTH, (const void*) &flag);
|
mysql_stmt_attr_set(stmt, STMT_ATTR_UPDATE_MAX_LENGTH, (const void*) &flag);
|
||||||
mysql_stmt_attr_get(stmt, STMT_ATTR_UPDATE_MAX_LENGTH, (void*) &flag);
|
mysql_stmt_attr_get(stmt, STMT_ATTR_UPDATE_MAX_LENGTH, (void*) &flag);
|
||||||
DIE_UNLESS(flag == flag_orig);
|
DIE_UNLESS(flag == flag_orig);
|
||||||
|
|
||||||
mysql_stmt_close(stmt);
|
mysql_stmt_close(stmt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -15039,7 +15072,7 @@ static struct my_tests_st my_tests[]= {
|
||||||
{ "test_bug14845", test_bug14845 },
|
{ "test_bug14845", test_bug14845 },
|
||||||
{ "test_bug15510", test_bug15510 },
|
{ "test_bug15510", test_bug15510 },
|
||||||
{ "test_opt_reconnect", test_opt_reconnect },
|
{ "test_opt_reconnect", test_opt_reconnect },
|
||||||
|
{ "test_bug12744", test_bug12744 },
|
||||||
{ "test_bug16144", test_bug16144 },
|
{ "test_bug16144", test_bug16144 },
|
||||||
{ "test_bug15613", test_bug15613 },
|
{ "test_bug15613", test_bug15613 },
|
||||||
{ 0, 0 }
|
{ 0, 0 }
|
||||||
|
|
Loading…
Reference in a new issue