This commit is contained in:
Igor Babaev 2012-03-15 21:40:15 -07:00
commit 7b845f551b
43 changed files with 670 additions and 156 deletions

View File

@ -12801,3 +12801,14 @@ OPTIMIZE TABLE t1;
Table Op Msg_type Msg_text
test.t1 optimize status OK
DROP TABLE t1;
#
# BUG#917689 Using wrong archive table causes crash
#
create table t1 (a int, b char(50)) engine=archive;
select * from t1;
ERROR HY000: Table 't1' is marked as crashed and should be repaired
show warnings;
Level Code Message
Error 127 Got error 127 when reading table `test`.`t1`
Error 1194 Table 't1' is marked as crashed and should be repaired
drop table t1;

View File

@ -1960,6 +1960,42 @@ ON ( COLUMNS.TABLE_SCHEMA = UNIQUES.TABLE_SCHEMA);
COUNT(*) > 0
1
DROP TABLE t1;
set SESSION optimizer_switch= @save_optimizer_switch;
SET SESSION optimizer_switch= @save_optimizer_switch;
#
# LP BUG#953649: crash when estimating the cost of a look-up
# into a derived table to be materialized
#
CREATE TABLE t1 (a int);
INSERT INTO t1 VALUES (132);
CREATE TABLE t2 (b int, c varchar(256));
INSERT INTO t2 VALUES (132,'test1'), (120,'text2'), (132,'text3');
CREATE VIEW v AS
SELECT b, GROUP_CONCAT(c) AS gc FROM t2 GROUP BY b;
SET @save_optimizer_switch=@@optimizer_switch;
SET SESSION optimizer_switch='derived_merge=off';
SET SESSION optimizer_switch='derived_with_keys=off';
EXPLAIN
SELECT * FROM t1, v WHERE a = b;
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY t1 system NULL NULL NULL NULL 1
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 3 Using where
2 DERIVED t2 ALL NULL NULL NULL NULL 3 Using filesort
SELECT * FROM t1, v WHERE a = b;
a b gc
132 132 test1,text3
SET SESSION optimizer_switch='derived_merge=on';
SET SESSION optimizer_switch='derived_with_keys=on';
EXPLAIN
SELECT * FROM t1, v WHERE a = b;
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY t1 system NULL NULL NULL NULL 1
1 PRIMARY <derived2> ref key0 key0 5 const 0
2 DERIVED t2 ALL NULL NULL NULL NULL 3 Using filesort
SELECT * FROM t1, v WHERE a = b;
a b gc
132 132 test1,text3
SET SESSION optimizer_switch= @save_optimizer_switch;
DROP VIEW v;
DROP TABLE t1,t2;
set optimizer_switch=@exit_optimizer_switch;
set join_cache_level=@exit_join_cache_level;

View File

@ -1887,6 +1887,53 @@ NULL
NULL
DROP TABLE t1,t2,t3;
#
# Bug #884175: MIN/MAX for short varchar = long const
#
CREATE TABLE t1 (f1 varchar(1), f2 varchar(1), KEY (f2));
INSERT INTO t1 VALUES ('b', 'b'), ('a','a');
EXPLAIN
SELECT MAX(f1) FROM t1 WHERE f1 = 'abc';
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 ALL NULL NULL NULL NULL 2 Using where
SELECT MAX(f1) FROM t1 WHERE f1 = 'abc';
MAX(f1)
NULL
EXPLAIN
SELECT MAX(f2) FROM t1 WHERE f2 = 'abc';
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 ref f2 f2 4 const 1 Using where; Using index
SELECT MAX(f2) FROM t1 WHERE f2 = 'abc';
MAX(f2)
NULL
EXPLAIN
SELECT MIN(f1) FROM t1 WHERE f1 >= 'abc';
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 ALL NULL NULL NULL NULL 2 Using where
SELECT MIN(f1) FROM t1 WHERE f1 >= 'abc';
MIN(f1)
b
EXPLAIN
SELECT MIN(f2) FROM t1 WHERE f2 >= 'abc';
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 index f2 f2 4 NULL 2 Using where; Using index
SELECT MIN(f2) FROM t1 WHERE f2 >= 'abc';
MIN(f2)
b
EXPLAIN
SELECT MIN(f1) FROM t1 WHERE f1 BETWEEN 'abc' AND 'b' ;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 ALL NULL NULL NULL NULL 2 Using where
SELECT MIN(f1) FROM t1 WHERE f1 BETWEEN 'abc' AND 'b' ;
MIN(f1)
b
EXPLAIN
SELECT MIN(f2) FROM t1 WHERE f2 BETWEEN 'abc' AND 'b' ;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 index f2 f2 4 NULL 2 Using where; Using index
SELECT MIN(f2) FROM t1 WHERE f2 BETWEEN 'abc' AND 'b' ;
MIN(f2)
b
DROP TABLE t1;
End of 5.2 tests
#
# BUG#46680 - Assertion failed in file item_subselect.cc,

View File

@ -1952,6 +1952,24 @@ DROP TABLE t1;
SET SQL_BIG_TABLES=0;
# End of 5.1 tests
#
# LP bug#694450 Wrong result with non-standard GROUP BY + ORDER BY
#
SET SESSION SQL_MODE='ONLY_FULL_GROUP_BY';
CREATE TABLE t1 (
f1 int(11), f2 int(11), f3 datetime, f4 varchar(1), PRIMARY KEY (f1)) ;
INSERT IGNORE INTO t1 VALUES ('1','9','2004-10-11 18:13','x'),('2','5','2004-03-07 14:02','g'),('3','1','2004-04-09 09:38','o'),('4','0','1900-01-01 00:00','g'),('5','1','2009-02-19 02:05','v');
SELECT alias2.f3 AS field1 , alias2.f1 AS field2 FROM t1 AS alias1 JOIN t1 AS alias2 ON alias2.f1 = alias1.f2 AND alias2.f1 != alias1.f4 GROUP BY field1 , field2 ORDER BY alias1.f2 , field2;
field1 field2
2004-10-11 18:13:00 1
2009-02-19 02:05:00 5
SELECT alias2.f3 AS field1 , alias2.f1 AS field2 FROM t1 AS alias1 JOIN t1 AS alias2 ON alias2.f1 = alias1.f2 AND alias2.f1 != alias1.f4 GROUP BY field1 , field2 ;
field1 field2
2004-10-11 18:13:00 1
2009-02-19 02:05:00 5
SET SESSION SQL_MODE=default;
drop table t1;
# End of 5.2 tests
#
# BUG#872702: Crash in add_ref_to_table_cond() when grouping by a PK
#
CREATE TABLE t1 (a int, PRIMARY KEY (a)) ;
@ -1966,3 +1984,4 @@ FROM t2
GROUP BY 1;
a
DROP TABLE t1, t2;
# End of 5.3 tests

View File

@ -1964,6 +1964,28 @@ a c
SET optimizer_switch=@save_optimizer_switch;
SET join_cache_level=@save_join_cache_level;
DROP TABLE t1,t2;
#
# BUG#952297: Server crashes on 2nd execution of PS in Field::is_null with semijoin+materialization
#
CREATE TABLE t1 ( a VARCHAR(1) );
INSERT INTO t1 VALUES ('y'),('z');
CREATE TABLE t2 ( b VARCHAR(1), c VARCHAR(1) );
INSERT INTO t2 VALUES ('v','v'),('v','v');
CREATE VIEW v2 AS SELECT * FROM t2;
PREPARE ps FROM '
SELECT a FROM t1, v2
WHERE ( c, b ) IN ( SELECT b, b FROM t2 )
GROUP BY a ';
EXECUTE ps;
a
y
z
EXECUTE ps;
a
y
z
DROP VIEW v2;
DROP TABLE t1, t2;
# This must be at the end:
set optimizer_switch=@subselect_sj_mat_tmp;
set join_cache_level=@save_join_cache_level;

View File

@ -2004,6 +2004,28 @@ a c
SET optimizer_switch=@save_optimizer_switch;
SET join_cache_level=@save_join_cache_level;
DROP TABLE t1,t2;
#
# BUG#952297: Server crashes on 2nd execution of PS in Field::is_null with semijoin+materialization
#
CREATE TABLE t1 ( a VARCHAR(1) );
INSERT INTO t1 VALUES ('y'),('z');
CREATE TABLE t2 ( b VARCHAR(1), c VARCHAR(1) );
INSERT INTO t2 VALUES ('v','v'),('v','v');
CREATE VIEW v2 AS SELECT * FROM t2;
PREPARE ps FROM '
SELECT a FROM t1, v2
WHERE ( c, b ) IN ( SELECT b, b FROM t2 )
GROUP BY a ';
EXECUTE ps;
a
y
z
EXECUTE ps;
a
y
z
DROP VIEW v2;
DROP TABLE t1, t2;
# This must be at the end:
set optimizer_switch=@subselect_sj_mat_tmp;
set join_cache_level=@save_join_cache_level;

Binary file not shown.

View File

@ -0,0 +1,39 @@
select * from INFORMATION_SCHEMA.ENGINES where ENGINE="ARIA";
ENGINE SUPPORT COMMENT TRANSACTIONS XA SAVEPOINTS
Aria YES Crash-safe tables with MyISAM heritage NO NO NO
set global storage_engine=aria;
set session storage_engine=aria;
drop table if exists t1;
SET SQL_WARNINGS=1;
CREATE TABLE t1 ( a VARCHAR(800),KEY(a) )
ENGINE=Aria DEFAULT CHARACTER SET latin1;
INSERT INTO t1 VALUES
(REPEAT('abc ',200)), (REPEAT('def ',200)),
(REPEAT('ghi ',200)), (REPEAT('jkl ',200));
INSERT INTO t1 SELECT * FROM t1;
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
ALTER TABLE t1 MODIFY a VARCHAR(800) CHARSET `ucs2`;
Warnings:
Warning 1071 Specified key was too long; max key length is 1000 bytes
Warning 1071 Specified key was too long; max key length is 1000 bytes
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SHOW CREATE table t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` varchar(800) CHARACTER SET ucs2 DEFAULT NULL,
KEY `a` (`a`(500))
) ENGINE=Aria DEFAULT CHARSET=latin1 PAGE_CHECKSUM=1
DROP TABLE t1;
CREATE TABLE t1 (a VARCHAR(800),KEY(a)) ENGINE=Aria CHARACTER SET ucs2;
Warnings:
Warning 1071 Specified key was too long; max key length is 1000 bytes
INSERT INTO t1 VALUES (REPEAT('abc ',200));
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
DROP TABLE t1;
# End of 5.2 tests

View File

@ -393,6 +393,7 @@ Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) DEFAULT NULL
) ENGINE=Aria DEFAULT CHARSET=latin1 PAGE_CHECKSUM=1
set global aria_page_checksum=0;
drop table t1;
set global aria_log_file_size=4294967296;
Warnings:
@ -509,7 +510,7 @@ Table Create Table
t1 CREATE TABLE `t1` (
`n` int(11) NOT NULL,
`c` char(1) DEFAULT NULL
) ENGINE=Aria DEFAULT CHARSET=latin1 PAGE_CHECKSUM=1
) ENGINE=Aria DEFAULT CHARSET=latin1 PAGE_CHECKSUM=0
drop table t1;
create table t1 (n int not null, c char(1)) engine=aria transactional=1;
alter table t1 engine=myisam;
@ -521,7 +522,7 @@ Table Create Table
t1 CREATE TABLE `t1` (
`n` int(11) NOT NULL,
`c` char(1) DEFAULT NULL
) ENGINE=Aria DEFAULT CHARSET=latin1 PAGE_CHECKSUM=1 TRANSACTIONAL=1
) ENGINE=Aria DEFAULT CHARSET=latin1 PAGE_CHECKSUM=0 TRANSACTIONAL=1
drop table t1;
create table t1 (n int not null, c char(1)) engine=myisam transactional=1;
Warnings:
@ -532,7 +533,7 @@ Table Create Table
t1 CREATE TABLE `t1` (
`n` int(11) NOT NULL,
`c` char(1) DEFAULT NULL
) ENGINE=Aria DEFAULT CHARSET=latin1 PAGE_CHECKSUM=1 TRANSACTIONAL=1
) ENGINE=Aria DEFAULT CHARSET=latin1 PAGE_CHECKSUM=0 TRANSACTIONAL=1
drop table t1;
create table t1 (a int, key(a)) transactional=0;
insert into t1 values (0),(1),(2),(3),(4);
@ -645,26 +646,4 @@ a b c d e f g h i j
1 A B C D 1 M H
2 Abcdefghi E F G 2 N H
drop table t1,t2;
CREATE TABLE t1 ( a VARCHAR(800),KEY(a) )
ENGINE=Aria DEFAULT CHARACTER SET latin1;
INSERT INTO t1 VALUES
(REPEAT('abc ',200)), (REPEAT('def ',200)),
(REPEAT('ghi ',200)), (REPEAT('jkl ',200));
INSERT INTO t1 SELECT * FROM t1;
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
ALTER TABLE t1 MODIFY a VARCHAR(800) CHARSET `ucs2`;
Warnings:
Warning 1071 Specified key was too long; max key length is 1000 bytes
Warning 1071 Specified key was too long; max key length is 1000 bytes
CHECK TABLE t1;
Table Op Msg_type Msg_text
test.t1 check status OK
SHOW CREATE table t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` varchar(800) CHARACTER SET ucs2 DEFAULT NULL,
KEY `a` (`a`(500))
) ENGINE=Aria DEFAULT CHARSET=latin1 PAGE_CHECKSUM=1
DROP TABLE t1;
# End of 5.1 tests

View File

@ -0,0 +1,51 @@
-- source include/have_maria.inc
-- source include/have_ucs2.inc
select * from INFORMATION_SCHEMA.ENGINES where ENGINE="ARIA";
let $default_engine=`select @@global.storage_engine`;
set global storage_engine=aria;
set session storage_engine=aria;
# Initialise
--disable_warnings
drop table if exists t1;
--enable_warnings
SET SQL_WARNINGS=1;
#
# bug#905716: Assertion `page->size <= share->max_index_block_size'
#
CREATE TABLE t1 ( a VARCHAR(800),KEY(a) )
ENGINE=Aria DEFAULT CHARACTER SET latin1;
INSERT INTO t1 VALUES
(REPEAT('abc ',200)), (REPEAT('def ',200)),
(REPEAT('ghi ',200)), (REPEAT('jkl ',200));
INSERT INTO t1 SELECT * FROM t1;
# check table is not needed to reproduce the problem,
# but shows that by this time the table appears to be okay.
CHECK TABLE t1;
ALTER TABLE t1 MODIFY a VARCHAR(800) CHARSET `ucs2`;
CHECK TABLE t1;
SHOW CREATE table t1;
DROP TABLE t1;
#
# BUG#905782 Assertion `pageno < ((1ULL) << 40)' failed at ma_pagecache.c
# Issue was too long key
#
CREATE TABLE t1 (a VARCHAR(800),KEY(a)) ENGINE=Aria CHARACTER SET ucs2;
INSERT INTO t1 VALUES (REPEAT('abc ',200));
CHECK TABLE t1;
DROP TABLE t1;
--echo # End of 5.2 tests
--disable_result_log
--disable_query_log
eval set global storage_engine=$default_engine;
--enable_result_log
--enable_query_log

View File

@ -305,6 +305,7 @@ drop table t1;
set global aria_page_checksum=1;
create table t1 (a int);
show create table t1;
set global aria_page_checksum=0;
drop table t1;
#
@ -554,27 +555,7 @@ INSERT INTO t2 VALUES (1,'M','','H'),
SELECT * FROM t1, t2 WHERE a = g ORDER BY b;
drop table t1,t2;
# End of 5.1 tests
#
# bug#905716: Assertion `page->size <= share->max_index_block_size'
#
CREATE TABLE t1 ( a VARCHAR(800),KEY(a) )
ENGINE=Aria DEFAULT CHARACTER SET latin1;
INSERT INTO t1 VALUES
(REPEAT('abc ',200)), (REPEAT('def ',200)),
(REPEAT('ghi ',200)), (REPEAT('jkl ',200));
INSERT INTO t1 SELECT * FROM t1;
# check table is not needed to reproduce the problem,
# but shows that by this time the table appears to be okay.
CHECK TABLE t1;
ALTER TABLE t1 MODIFY a VARCHAR(800) CHARSET `ucs2`;
CHECK TABLE t1;
SHOW CREATE table t1;
DROP TABLE t1;
# End of 5.2 tests
--echo # End of 5.1 tests
--disable_result_log
--disable_query_log

View File

@ -133,6 +133,19 @@ t1 CREATE TABLE `t1` (
`v` char(32) CHARACTER SET ucs2 AS (a) VIRTUAL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
DROP TABLE t1;
CREATE TABLE t1 (a int, b int);
CREATE TABLE t2 (a int, b int as (a+1) VIRTUAL);
SELECT table_schema, table_name, column_name, column_type, extra
FROM information_schema.columns WHERE table_name = 't1';
table_schema table_name column_name column_type extra
test t1 a int(11)
test t1 b int(11)
SELECT table_schema, table_name, column_name, column_type, extra
FROM information_schema.columns WHERE table_name = 't2';
table_schema table_name column_name column_type extra
test t2 a int(11)
test t2 b int(11) VIRTUAL
DROP TABLE t1,t2;
create table t1 (a int, b int);
insert into t1 values (3, 30), (4, 20), (1, 20);
create table t2 (c int, d int, v int as (d+1), index idx(c));

View File

@ -141,6 +141,20 @@ SHOW CREATE TABLE t1;
DROP TABLE t1;
#
# Bug#930814: no info in information schema for tables with virtual columns
#
CREATE TABLE t1 (a int, b int);
CREATE TABLE t2 (a int, b int as (a+1) VIRTUAL);
SELECT table_schema, table_name, column_name, column_type, extra
FROM information_schema.columns WHERE table_name = 't1';
SELECT table_schema, table_name, column_name, column_type, extra
FROM information_schema.columns WHERE table_name = 't2';
DROP TABLE t1,t2;
#
# SELECT that uses a virtual column and executed with BKA
#

View File

@ -1727,3 +1727,14 @@ CHECKSUM TABLE t1 EXTENDED;
FLUSH TABLE t1;
OPTIMIZE TABLE t1;
DROP TABLE t1;
--echo #
--echo # BUG#917689 Using wrong archive table causes crash
--echo #
create table t1 (a int, b char(50)) engine=archive;
--remove_file $MYSQLD_DATADIR/test/t1.ARZ
copy_file std_data/t917689.ARZ $MYSQLD_DATADIR/test/t1.ARZ;
--error 1194
select * from t1;
show warnings;
drop table t1;

View File

@ -1345,7 +1345,40 @@ SELECT COUNT(*) > 0
DROP TABLE t1;
set SESSION optimizer_switch= @save_optimizer_switch;
SET SESSION optimizer_switch= @save_optimizer_switch;
--echo #
--echo # LP BUG#953649: crash when estimating the cost of a look-up
--echo # into a derived table to be materialized
--echo #
CREATE TABLE t1 (a int);
INSERT INTO t1 VALUES (132);
CREATE TABLE t2 (b int, c varchar(256));
INSERT INTO t2 VALUES (132,'test1'), (120,'text2'), (132,'text3');
CREATE VIEW v AS
SELECT b, GROUP_CONCAT(c) AS gc FROM t2 GROUP BY b;
SET @save_optimizer_switch=@@optimizer_switch;
SET SESSION optimizer_switch='derived_merge=off';
SET SESSION optimizer_switch='derived_with_keys=off';
EXPLAIN
SELECT * FROM t1, v WHERE a = b;
SELECT * FROM t1, v WHERE a = b;
SET SESSION optimizer_switch='derived_merge=on';
SET SESSION optimizer_switch='derived_with_keys=on';
EXPLAIN
SELECT * FROM t1, v WHERE a = b;
SELECT * FROM t1, v WHERE a = b;
SET SESSION optimizer_switch= @save_optimizer_switch;
DROP VIEW v;
DROP TABLE t1,t2;
# The following command must be the last one the file
set optimizer_switch=@exit_optimizer_switch;

View File

@ -1198,6 +1198,39 @@ SELECT (SELECT MIN(t1.a) FROM t1,t2 WHERE t2.a = t3.b) FROM t3;
DROP TABLE t1,t2,t3;
--echo #
--echo # Bug #884175: MIN/MAX for short varchar = long const
--echo #
CREATE TABLE t1 (f1 varchar(1), f2 varchar(1), KEY (f2));
INSERT INTO t1 VALUES ('b', 'b'), ('a','a');
EXPLAIN
SELECT MAX(f1) FROM t1 WHERE f1 = 'abc';
SELECT MAX(f1) FROM t1 WHERE f1 = 'abc';
EXPLAIN
SELECT MAX(f2) FROM t1 WHERE f2 = 'abc';
SELECT MAX(f2) FROM t1 WHERE f2 = 'abc';
EXPLAIN
SELECT MIN(f1) FROM t1 WHERE f1 >= 'abc';
SELECT MIN(f1) FROM t1 WHERE f1 >= 'abc';
EXPLAIN
SELECT MIN(f2) FROM t1 WHERE f2 >= 'abc';
SELECT MIN(f2) FROM t1 WHERE f2 >= 'abc';
EXPLAIN
SELECT MIN(f1) FROM t1 WHERE f1 BETWEEN 'abc' AND 'b' ;
SELECT MIN(f1) FROM t1 WHERE f1 BETWEEN 'abc' AND 'b' ;
EXPLAIN
SELECT MIN(f2) FROM t1 WHERE f2 BETWEEN 'abc' AND 'b' ;
SELECT MIN(f2) FROM t1 WHERE f2 BETWEEN 'abc' AND 'b' ;
DROP TABLE t1;
--echo End of 5.2 tests
--echo #

View File

@ -1326,6 +1326,24 @@ SET SQL_BIG_TABLES=0;
--echo # End of 5.1 tests
--echo #
--echo # LP bug#694450 Wrong result with non-standard GROUP BY + ORDER BY
--echo #
SET SESSION SQL_MODE='ONLY_FULL_GROUP_BY';
CREATE TABLE t1 (
f1 int(11), f2 int(11), f3 datetime, f4 varchar(1), PRIMARY KEY (f1)) ;
INSERT IGNORE INTO t1 VALUES ('1','9','2004-10-11 18:13','x'),('2','5','2004-03-07 14:02','g'),('3','1','2004-04-09 09:38','o'),('4','0','1900-01-01 00:00','g'),('5','1','2009-02-19 02:05','v');
# This must return an error, but instead returns 1 row
SELECT alias2.f3 AS field1 , alias2.f1 AS field2 FROM t1 AS alias1 JOIN t1 AS alias2 ON alias2.f1 = alias1.f2 AND alias2.f1 != alias1.f4 GROUP BY field1 , field2 ORDER BY alias1.f2 , field2;
# This returns several rows
SELECT alias2.f3 AS field1 , alias2.f1 AS field2 FROM t1 AS alias1 JOIN t1 AS alias2 ON alias2.f1 = alias1.f2 AND alias2.f1 != alias1.f4 GROUP BY field1 , field2 ;
SET SESSION SQL_MODE=default;
drop table t1;
--echo # End of 5.2 tests
--echo #
--echo # BUG#872702: Crash in add_ref_to_table_cond() when grouping by a PK
--echo #
@ -1343,3 +1361,5 @@ WHERE a = (
GROUP BY 1;
DROP TABLE t1, t2;
--echo # End of 5.3 tests

View File

@ -194,12 +194,15 @@ begin
insert into test.t1 values (x, z);
end|
let $start_value= `SELECT @@max_join_size`|
call mixset("mixset", 19)|
show variables like 'max_join_size'|
select id,data,@z from t1|
delete from t1|
drop procedure mixset|
--disable_query_log
eval SET @@max_join_size= $start_value|
--enable_query_log
# Multiple CALL statements, one with OUT parameter.
--disable_warnings

View File

@ -1642,6 +1642,28 @@ SET join_cache_level=@save_join_cache_level;
DROP TABLE t1,t2;
--echo #
--echo # BUG#952297: Server crashes on 2nd execution of PS in Field::is_null with semijoin+materialization
--echo #
CREATE TABLE t1 ( a VARCHAR(1) );
INSERT INTO t1 VALUES ('y'),('z');
CREATE TABLE t2 ( b VARCHAR(1), c VARCHAR(1) );
INSERT INTO t2 VALUES ('v','v'),('v','v');
CREATE VIEW v2 AS SELECT * FROM t2;
PREPARE ps FROM '
SELECT a FROM t1, v2
WHERE ( c, b ) IN ( SELECT b, b FROM t2 )
GROUP BY a ';
EXECUTE ps;
EXECUTE ps;
DROP VIEW v2;
DROP TABLE t1, t2;
--echo # This must be at the end:
set optimizer_switch=@subselect_sj_mat_tmp;
set join_cache_level=@save_join_cache_level;

View File

@ -685,7 +685,7 @@ void my_print_stacktrace(uchar* unused1, ulong unused2)
&(package.sym));
have_source= pSymGetLineFromAddr64(hProcess, addr, &line_offset, &line);
my_safe_printf_stderr("%p ", addr);
fprintf(stderr,"%p ", addr);
if(have_module)
{
char *base_image_name= strrchr(module.ImageName, '\\');
@ -693,13 +693,12 @@ void my_print_stacktrace(uchar* unused1, ulong unused2)
base_image_name++;
else
base_image_name= module.ImageName;
my_safe_printf_stderr("%s!", base_image_name);
fprintf(stderr,"%s!", base_image_name);
}
if(have_symbol)
my_safe_printf_stderr("%s()", package.sym.Name);
fprintf(stderr, "%s()", package.sym.Name);
else if(have_module)
my_safe_printf_stderr("%s", "???");
fprintf(stderr,"%s", "???");
if(have_source)
{
@ -708,10 +707,10 @@ void my_print_stacktrace(uchar* unused1, ulong unused2)
base_file_name++;
else
base_file_name= line.FileName;
my_safe_printf_stderr("[%s:%u]",
fprintf(stderr, "[%s:%u]",
base_file_name, line.LineNumber);
}
my_safe_printf_stderr("%s", "\n");
fprintf(stderr,"%s", "\n");
}
}
@ -785,10 +784,7 @@ void my_safe_print_str(const char *val, int len)
#ifdef __WIN__
size_t my_write_stderr(const void *buf, size_t count)
{
DWORD bytes_written;
SetFilePointer(GetStdHandle(STD_ERROR_HANDLE), 0, NULL, FILE_END);
WriteFile(GetStdHandle(STD_ERROR_HANDLE), buf, count, &bytes_written, NULL);
return bytes_written;
return fwrite(buf, 1, count, stderr);
}
#else
size_t my_write_stderr(const void *buf, size_t count)

View File

@ -1473,11 +1473,13 @@ Field::pack(uchar *to, const uchar *from, uint max_length)
data
@return New pointer into memory based on from + length of the data
@return 0 if wrong data
*/
const uchar *
Field::unpack(uchar* to, const uchar *from, uint param_data)
Field::unpack(uchar* to, const uchar *from, const uchar *from_end,
uint param_data)
{
uint length=pack_length();
uint length=pack_length(), len;
int from_type= 0;
/*
If from length is > 255, it has encoded data in the upper bits. Need
@ -1493,14 +1495,19 @@ Field::unpack(uchar* to, const uchar *from, uint param_data)
(length == param_data) ||
(from_type != real_type()))
{
if (from + length > from_end)
return 0; // Error in data
memcpy(to, from, length);
return from+length;
}
uint len= (param_data && (param_data < length)) ?
param_data : length;
len= (param_data && (param_data < length)) ? param_data : length;
memcpy(to, from, param_data > length ? length : len);
if (from + len > from_end)
return 0; // Error in data
memcpy(to, from, len);
return from+len;
}
@ -2932,10 +2939,11 @@ uint Field_new_decimal::is_equal(Create_field *new_field)
@return New pointer into memory based on from + length of the data
*/
const uchar *
Field_new_decimal::unpack(uchar* to, const uchar *from, uint param_data)
Field_new_decimal::unpack(uchar* to, const uchar *from, const uchar *from_end,
uint param_data)
{
if (param_data == 0)
return Field::unpack(to, from, param_data);
return Field::unpack(to, from, from_end, param_data);
uint from_precision= (param_data & 0xff00) >> 8U;
uint from_decimal= param_data & 0x00ff;
@ -2965,7 +2973,11 @@ Field_new_decimal::unpack(uchar* to, const uchar *from, uint param_data)
decimal2bin(&dec_val, to, precision, decimals());
}
else
{
if (from + len > from_end)
return 0; // Wrong data
memcpy(to, from, len); // Sizes are the same, just copy the data.
}
return from+len;
}
@ -6558,7 +6570,8 @@ uchar *Field_string::pack(uchar *to, const uchar *from, uint max_length)
@return New pointer into memory based on from + length of the data
*/
const uchar *
Field_string::unpack(uchar *to, const uchar *from, uint param_data)
Field_string::unpack(uchar *to, const uchar *from, const uchar *from_end,
uint param_data)
{
uint from_length, length;
@ -6580,11 +6593,19 @@ Field_string::unpack(uchar *to, const uchar *from, uint param_data)
*/
if (from_length > 255)
{
if (from + 2 > from_end)
return 0;
length= uint2korr(from);
from+= 2;
}
else
{
if (from + 1 > from_end)
return 0;
length= (uint) *from++;
}
if (from + length > from_end || length > field_length)
return 0;
memcpy(to, from, length);
// Pad the string with the pad character of the fields charset
@ -7076,6 +7097,7 @@ Field_varstring::pack_key(uchar *to, const uchar *key, uint max_length)
Pointer to end of 'key' (To the next key part if multi-segment key)
*/
#ifdef NOT_USED
const uchar *
Field_varstring::unpack_key(uchar *to, const uchar *key, uint max_length)
{
@ -7092,6 +7114,7 @@ Field_varstring::unpack_key(uchar *to, const uchar *key, uint max_length)
memcpy(ptr + length_bytes, key, length);
return key + length;
}
#endif
/**
Create a packed key that will be used for storage in the index tree.
@ -7136,11 +7159,16 @@ uchar * Field_varstring::pack_key_from_key_image(uchar *to, const uchar *from,
@return New pointer into memory based on from + length of the data
*/
const uchar *
Field_varstring::unpack(uchar *to, const uchar *from, uint param_data)
Field_varstring::unpack(uchar *to, const uchar *from, const uchar *from_end,
uint param_data)
{
uint length;
uint l_bytes= (param_data && (param_data < field_length)) ?
(param_data <= 255) ? 1 : 2 : length_bytes;
if (from + l_bytes > from_end)
return 0; // Error in data
if (l_bytes == 1)
{
to[0]= *from++;
@ -7155,7 +7183,11 @@ Field_varstring::unpack(uchar *to, const uchar *from, uint param_data)
to[1]= *from++;
}
if (length)
{
if (from + length > from_end || length > field_length)
return 0; // Error in data
memcpy(to+ length_bytes, from, length);
}
return from+length;
}
@ -7787,16 +7819,21 @@ uchar *Field_blob::pack(uchar *to, const uchar *from, uint max_length)
@return New pointer into memory based on from + length of the data
*/
const uchar *Field_blob::unpack(uchar *to, const uchar *from, uint param_data)
const uchar *Field_blob::unpack(uchar *to, const uchar *from,
const uchar *from_end, uint param_data)
{
DBUG_ENTER("Field_blob::unpack");
DBUG_PRINT("enter", ("to: 0x%lx; from: 0x%lx; param_data: %u",
(ulong) to, (ulong) from, param_data));
uint const master_packlength=
param_data > 0 ? param_data & 0xFF : packlength;
if (from + master_packlength > from_end)
DBUG_RETURN(0); // Error in data
uint32 const length= get_length(from, master_packlength);
DBUG_DUMP("packed", from, length + master_packlength);
bitmap_set_bit(table->write_set, field_index);
if (from + master_packlength + length > from_end)
DBUG_RETURN(0);
store(reinterpret_cast<const char*>(from) + master_packlength,
length, field_charset);
DBUG_DUMP("record", to, table->s->reclength);
@ -7894,6 +7931,7 @@ Field_blob::pack_key(uchar *to, const uchar *from, uint max_length)
Pointer into 'from' past the last byte copied from packed key.
*/
#ifdef NOT_USED
const uchar *
Field_blob::unpack_key(uchar *to, const uchar *from, uint max_length)
{
@ -7914,7 +7952,7 @@ Field_blob::unpack_key(uchar *to, const uchar *from, uint max_length)
/* point to first byte of next field in 'from' */
return from + length;
}
#endif
/** Create a packed key that will be used for storage from a MySQL key. */
@ -8956,7 +8994,8 @@ Field_bit::pack(uchar *to, const uchar *from, uint max_length)
@return New pointer into memory based on from + length of the data
*/
const uchar *
Field_bit::unpack(uchar *to, const uchar *from, uint param_data)
Field_bit::unpack(uchar *to, const uchar *from, const uchar *from_end,
uint param_data)
{
uint const from_len= (param_data >> 8U) & 0x00ff;
uint const from_bit_len= param_data & 0x00ff;
@ -8967,6 +9006,9 @@ Field_bit::unpack(uchar *to, const uchar *from, uint param_data)
if (param_data == 0 ||
((from_bit_len == bit_len) && (from_len == bytes_in_rec)))
{
if (from + bytes_in_rec + test(bit_len) > from_end)
return 0; // Error in data
if (bit_len > 0)
{
/*
@ -8991,10 +9033,16 @@ Field_bit::unpack(uchar *to, const uchar *from, uint param_data)
Lastly the odd bits need to be masked out if the bytes_in_rec > 0.
Otherwise stray bits can cause spurious values.
*/
uint len= from_len + ((from_bit_len > 0) ? 1 : 0);
uint new_len= (field_length + 7) / 8;
if (from + len > from_end || new_len < len)
return 0; // Error in data
char *value= (char *)my_alloca(new_len);
bzero(value, new_len);
uint len= from_len + ((from_bit_len > 0) ? 1 : 0);
memcpy(value + (new_len - len), from, len);
/*
Mask out the unused bits in the partial byte.

View File

@ -587,17 +587,8 @@ public:
DBUG_RETURN(result);
}
virtual const uchar *unpack(uchar* to, const uchar *from, uint param_data);
/**
@overload Field::unpack(uchar*, const uchar*, uint, bool)
*/
const uchar *unpack(uchar* to, const uchar *from)
{
DBUG_ENTER("Field::unpack");
const uchar *result= unpack(to, from, 0);
DBUG_RETURN(result);
}
virtual const uchar *unpack(uchar* to, const uchar *from,
const uchar *from_end, uint param_data=0);
virtual uchar *pack_key(uchar* to, const uchar *from, uint max_length)
{
return pack(to, from, max_length);
@ -606,10 +597,12 @@ public:
{
return pack(to, from, max_length);
}
#ifdef NOT_USED
virtual const uchar *unpack_key(uchar* to, const uchar *from, uint max_length)
{
return unpack(to, from, max_length);
return unpack(to, from, from + max_length+2, max_length);
}
#endif
virtual uint packed_col_length(const uchar *to, uint length)
{ return length;}
virtual uint max_packed_col_length(uint max_length)
@ -890,10 +883,6 @@ public:
void overflow(bool negative);
bool zero_pack() const { return 0; }
void sql_type(String &str) const;
virtual const uchar *unpack(uchar* to, const uchar *from, uint param_data)
{
return Field::unpack(to, from, param_data);
}
virtual uchar *pack(uchar* to, const uchar *from, uint max_length)
{
return Field::pack(to, from, max_length);
@ -949,7 +938,7 @@ public:
int compatible_field_size(uint field_metadata,
const Relay_log_info *rli, uint16 mflags);
uint is_equal(Create_field *new_field);
virtual const uchar *unpack(uchar* to, const uchar *from, uint param_data);
virtual const uchar *unpack(uchar* to, const uchar *from, const uchar *from_end, uint param_data);
static Field *create_from_item (Item *);
};
@ -987,8 +976,11 @@ public:
return to + 1;
}
virtual const uchar *unpack(uchar* to, const uchar *from, uint param_data)
virtual const uchar *unpack(uchar* to, const uchar *from,
const uchar *from_end, uint param_data)
{
if (from == from_end)
return 0;
*to= *from;
return from + 1;
}
@ -1032,15 +1024,19 @@ public:
int16 val;
val = sint2korr(from);
int2store(to, val);
return to + sizeof(val);
return to + 2;
}
virtual const uchar *unpack(uchar* to, const uchar *from, uint param_data)
virtual const uchar *unpack(uchar* to, const uchar *from,
const uchar *from_end, uint param_data)
{
int16 val;
if (from +2 > from_end)
return 0;
val = sint2korr(from);
int2store(to, val);
return from + sizeof(val);
return from + 2;
}
};
@ -1075,11 +1071,6 @@ public:
{
return Field::pack(to, from, max_length);
}
virtual const uchar *unpack(uchar* to, const uchar *from, uint param_data)
{
return Field::unpack(to, from, param_data);
}
};
@ -1120,8 +1111,11 @@ public:
return pack_int32(to, from);
}
virtual const uchar *unpack(uchar* to, const uchar *from,
const uchar *from_end,
uint param_data __attribute__((unused)))
{
if (from + 4 > from_end)
return 0;
return unpack_int32(to, from);
}
};
@ -1168,9 +1162,11 @@ public:
{
return pack_int64(to, from);
}
virtual const uchar *unpack(uchar* to, const uchar *from,
uint param_data __attribute__((unused)))
const uchar *unpack(uchar* to, const uchar *from, const uchar *from_end,
uint param_data __attribute__((unused)))
{
if (from + 8 > from_end)
return 0;
return unpack_int64(to, from);
}
};
@ -1334,9 +1330,11 @@ public:
{
return pack_int32(to, from);
}
const uchar *unpack(uchar* to, const uchar *from,
const uchar *unpack(uchar* to, const uchar *from, const uchar *from_end,
uint param_data __attribute__((unused)))
{
if (from + 4 > from_end)
return 0;
return unpack_int32(to, from);
}
};
@ -1373,8 +1371,9 @@ public:
uint32 pack_length() const;
uchar *pack(uchar *to, const uchar *from, uint max_length)
{ return Field::pack(to, from, max_length); }
const uchar *unpack(uchar* to, const uchar *from, uint param_data)
{ return Field::unpack(to, from, param_data); }
const uchar *unpack(uchar* to, const uchar *from, const uchar *from_end,
uint param_data)
{ return Field::unpack(to, from, from_end, param_data); }
uint size_of() const { return sizeof(*this); }
bool eq_def(Field *field)
{ return Field_str::eq_def(field) && dec == field->decimals(); }
@ -1457,9 +1456,11 @@ public:
{
return pack_int32(to, from);
}
const uchar *unpack(uchar* to, const uchar *from,
const uchar *unpack(uchar* to, const uchar *from, const uchar *from_end,
uint param_data __attribute__((unused)))
{
if (from + 4 > from_end)
return 0;
return unpack_int32(to, from);
}
};
@ -1586,9 +1587,11 @@ public:
{
return pack_int64(to, from);
}
const uchar *unpack(uchar* to, const uchar *from,
const uchar *unpack(uchar* to, const uchar *from, const uchar *from_end,
uint param_data __attribute__((unused)))
{
if (from + 8 > from_end)
return 0;
return unpack_int64(to, from);
}
};
@ -1624,8 +1627,9 @@ public:
bool get_date(MYSQL_TIME *ltime,uint fuzzydate);
uchar *pack(uchar *to, const uchar *from, uint max_length)
{ return Field::pack(to, from, max_length); }
const uchar *unpack(uchar* to, const uchar *from, uint param_data)
{ return Field::unpack(to, from, param_data); }
const uchar *unpack(uchar* to, const uchar *from, const uchar *from_end,
uint param_data)
{ return Field::unpack(to, from, from_end, param_data); }
uint size_of() const { return sizeof(*this); }
};
@ -1716,7 +1720,8 @@ public:
void sql_type(String &str) const;
virtual uchar *pack(uchar *to, const uchar *from,
uint max_length);
virtual const uchar *unpack(uchar* to, const uchar *from, uint param_data);
virtual const uchar *unpack(uchar* to, const uchar *from,
const uchar *from_end,uint param_data);
uint pack_length_from_metadata(uint field_metadata)
{
DBUG_PRINT("debug", ("field_metadata: 0x%04x", field_metadata));
@ -1804,8 +1809,11 @@ public:
virtual uchar *pack(uchar *to, const uchar *from, uint max_length);
uchar *pack_key(uchar *to, const uchar *from, uint max_length);
uchar *pack_key_from_key_image(uchar* to, const uchar *from, uint max_length);
virtual const uchar *unpack(uchar* to, const uchar *from, uint param_data);
virtual const uchar *unpack(uchar* to, const uchar *from,
const uchar *from_end, uint param_data);
#ifdef NOT_USED
const uchar *unpack_key(uchar* to, const uchar *from, uint max_length);
#endif
int pack_cmp(const uchar *a, const uchar *b, uint key_length,
bool insert_or_update);
int pack_cmp(const uchar *b, uint key_length,bool insert_or_update);
@ -1982,8 +1990,11 @@ public:
virtual uchar *pack(uchar *to, const uchar *from, uint max_length);
uchar *pack_key(uchar *to, const uchar *from, uint max_length);
uchar *pack_key_from_key_image(uchar* to, const uchar *from, uint max_length);
virtual const uchar *unpack(uchar *to, const uchar *from, uint param_data);
virtual const uchar *unpack(uchar *to, const uchar *from,
const uchar *from_end, uint param_data);
#ifdef NOT_USED
const uchar *unpack_key(uchar* to, const uchar *from, uint max_length);
#endif
int pack_cmp(const uchar *a, const uchar *b, uint key_length,
bool insert_or_update);
int pack_cmp(const uchar *b, uint key_length,bool insert_or_update);
@ -2208,7 +2219,8 @@ public:
const Relay_log_info *rli, uint16 mflags);
void sql_type(String &str) const;
virtual uchar *pack(uchar *to, const uchar *from, uint max_length);
virtual const uchar *unpack(uchar *to, const uchar *from, uint param_data);
virtual const uchar *unpack(uchar *to, const uchar *from,
const uchar *from_end, uint param_data);
virtual void set_default();
Field *new_key_field(MEM_ROOT *root, struct st_table *new_table,

View File

@ -60,7 +60,7 @@ static uint sortlength(THD *thd, SORT_FIELD *sortorder, uint s_length,
static SORT_ADDON_FIELD *get_addon_fields(THD *thd, Field **ptabfield,
uint sortlength, uint *plength);
static void unpack_addon_fields(struct st_sort_addon_field *addon_field,
uchar *buff);
uchar *buff, uchar *buff_end);
/**
Sort a table.
Creates a set of pointers that can be used to read the rows
@ -1732,7 +1732,8 @@ get_addon_fields(THD *thd, Field **ptabfield, uint sortlength, uint *plength)
*/
static void
unpack_addon_fields(struct st_sort_addon_field *addon_field, uchar *buff)
unpack_addon_fields(struct st_sort_addon_field *addon_field, uchar *buff,
uchar *buff_end)
{
Field *field;
SORT_ADDON_FIELD *addonf= addon_field;
@ -1745,7 +1746,7 @@ unpack_addon_fields(struct st_sort_addon_field *addon_field, uchar *buff)
continue;
}
field->set_notnull();
field->unpack(field->ptr, buff + addonf->offset);
field->unpack(field->ptr, buff + addonf->offset, buff_end, 0);
}
}

View File

@ -2377,7 +2377,8 @@ Item_in_subselect::select_in_like_transformer(JOIN *join)
object, but we can't know it here, but here we need address correct
reference on left expresion.
//psergey: he means degenerate cases like "... IN (SELECT 1)"
note: we won't need Item_in_optimizer when handling degenerate cases
like "... IN (SELECT 1)"
*/
if (!optimizer)
{

View File

@ -3752,7 +3752,8 @@ protected:
DBUG_ASSERT(m_table);
ASSERT_OR_RETURN_ERROR(m_curr_row < m_rows_end, HA_ERR_CORRUPT_EVENT);
int const result= ::unpack_row(rli, m_table, m_width, m_curr_row, &m_cols,
int const result= ::unpack_row(rli, m_table, m_width, m_curr_row,
m_rows_end, &m_cols,
&m_curr_row_end, &m_master_reclength);
if (m_curr_row_end > m_rows_end)
my_error(ER_SLAVE_CORRUPT_EVENT, MYF(0));

View File

@ -998,7 +998,8 @@ Write_rows_log_event_old::do_prepare_row(THD *thd_arg,
int error;
error= unpack_row_old(const_cast<Relay_log_info*>(rli),
table, m_width, table->record[0],
row_start, &m_cols, row_end, &m_master_reclength,
row_start, m_rows_end,
&m_cols, row_end, &m_master_reclength,
table->write_set, PRE_GA_WRITE_ROWS_EVENT);
bitmap_copy(table->read_set, table->write_set);
return error;
@ -1085,7 +1086,8 @@ Delete_rows_log_event_old::do_prepare_row(THD *thd_arg,
error= unpack_row_old(const_cast<Relay_log_info*>(rli),
table, m_width, table->record[0],
row_start, &m_cols, row_end, &m_master_reclength,
row_start, m_rows_end,
&m_cols, row_end, &m_master_reclength,
table->read_set, PRE_GA_DELETE_ROWS_EVENT);
/*
If we will access rows using the random access method, m_key will
@ -1184,13 +1186,15 @@ int Update_rows_log_event_old::do_prepare_row(THD *thd_arg,
/* record[0] is the before image for the update */
error= unpack_row_old(const_cast<Relay_log_info*>(rli),
table, m_width, table->record[0],
row_start, &m_cols, row_end, &m_master_reclength,
row_start, m_rows_end,
&m_cols, row_end, &m_master_reclength,
table->read_set, PRE_GA_UPDATE_ROWS_EVENT);
row_start = *row_end;
/* m_after_image is the after image for the update */
error= unpack_row_old(const_cast<Relay_log_info*>(rli),
table, m_width, m_after_image,
row_start, &m_cols, row_end, &m_master_reclength,
row_start, m_rows_end,
&m_cols, row_end, &m_master_reclength,
table->write_set, PRE_GA_UPDATE_ROWS_EVENT);
DBUG_DUMP("record[0]", table->record[0], table->s->reclength);

View File

@ -203,7 +203,8 @@ protected:
{
DBUG_ASSERT(m_table);
ASSERT_OR_RETURN_ERROR(m_curr_row < m_rows_end, HA_ERR_CORRUPT_EVENT);
int const result= ::unpack_row(rli, m_table, m_width, m_curr_row, &m_cols,
int const result= ::unpack_row(rli, m_table, m_width, m_curr_row,
m_rows_end, &m_cols,
&m_curr_row_end, &m_master_reclength);
ASSERT_OR_RETURN_ERROR(m_curr_row_end <= m_rows_end, HA_ERR_CORRUPT_EVENT);
return result;

View File

@ -482,8 +482,8 @@ int opt_sum_query(THD *thd,
'const op field'
@retval
0 func_item is a simple predicate: a field is compared with
constants
0 func_item is a simple predicate: a field is compared with a constant
whose length does not exceed the max length of the field values
@retval
1 Otherwise
*/
@ -503,6 +503,8 @@ bool simple_pred(Item_func *func_item, Item **args, bool *inv_order)
if (!(item= it++))
return 0;
args[0]= item->real_item();
if (args[0]->max_length < args[1]->max_length)
return 0;
if (it++)
return 0;
}
@ -536,6 +538,8 @@ bool simple_pred(Item_func *func_item, Item **args, bool *inv_order)
}
else
return 0;
if (args[0]->max_length < args[1]->max_length)
return 0;
break;
case 3:
/* field BETWEEN const AND const */
@ -549,6 +553,8 @@ bool simple_pred(Item_func *func_item, Item **args, bool *inv_order)
if (!item->const_item())
return 0;
args[i]= item;
if (args[0]->max_length < args[i]->max_length)
return 0;
}
}
else

View File

@ -447,7 +447,8 @@ static int rr_unpack_from_tempfile(READ_RECORD *info)
if (my_b_read(info->io_cache, info->rec_buf, info->ref_length))
return -1;
TABLE *table= info->table;
(*table->sort.unpack)(table->sort.addon_field, info->rec_buf);
(*table->sort.unpack)(table->sort.addon_field, info->rec_buf,
info->rec_buf + info->ref_length);
return 0;
}
@ -498,7 +499,8 @@ static int rr_unpack_from_buffer(READ_RECORD *info)
if (info->cache_pos == info->cache_end)
return -1; /* End of buffer */
TABLE *table= info->table;
(*table->sort.unpack)(table->sort.addon_field, info->cache_pos);
(*table->sort.unpack)(table->sort.addon_field, info->cache_pos,
info->cache_end);
info->cache_pos+= info->ref_length;
return 0;

View File

@ -176,13 +176,15 @@ pack_row(TABLE *table, MY_BITMAP const* cols,
@retval ER_NO_DEFAULT_FOR_FIELD
Returned if one of the fields existing on the slave but not on the
master does not have a default value (and isn't nullable)
@retval ER_SLAVE_CORRUPT_EVENT
Found error when trying to unpack fields.
*/
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
int
unpack_row(Relay_log_info const *rli,
TABLE *table, uint const colcnt,
uchar const *const row_data, MY_BITMAP const *cols,
uchar const *const row_data, uchar const *const row_buffer_end,
MY_BITMAP const *cols,
uchar const **const row_end, ulong *const master_reclength)
{
DBUG_ENTER("unpack_row");
@ -224,9 +226,6 @@ unpack_row(Relay_log_info const *rli,
DBUG_ASSERT(null_mask & 0xFF); // One of the 8 LSB should be set
/* Field...::unpack() cannot return 0 */
DBUG_ASSERT(pack_ptr != NULL);
if (null_bits & null_mask)
{
if (f->maybe_null())
@ -272,14 +271,21 @@ unpack_row(Relay_log_info const *rli,
#ifndef DBUG_OFF
uchar const *const old_pack_ptr= pack_ptr;
#endif
pack_ptr= f->unpack(f->ptr, pack_ptr, metadata);
pack_ptr= f->unpack(f->ptr, pack_ptr, row_buffer_end, metadata);
DBUG_PRINT("debug", ("field: %s; metadata: 0x%x;"
" pack_ptr: 0x%lx; pack_ptr': 0x%lx; bytes: %d",
f->field_name, metadata,
(ulong) old_pack_ptr, (ulong) pack_ptr,
(int) (pack_ptr - old_pack_ptr)));
if (!pack_ptr)
{
rli->report(ERROR_LEVEL, ER_SLAVE_CORRUPT_EVENT,
"Could not read field `%s` of table `%s`.`%s`",
f->field_name, table->s->db.str,
table->s->table_name.str);
DBUG_RETURN(ER_SLAVE_CORRUPT_EVENT);
}
}
null_mask <<= 1;
}
i++;

View File

@ -29,7 +29,8 @@ size_t pack_row(TABLE* table, MY_BITMAP const* cols,
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
int unpack_row(Relay_log_info const *rli,
TABLE *table, uint const colcnt,
uchar const *const row_data, MY_BITMAP const *cols,
uchar const *const row_data, uchar const *row_buffer_end,
MY_BITMAP const *cols,
uchar const **const row_end, ulong *const master_reclength);
// Fill table's record[0] with default values.

View File

@ -82,12 +82,15 @@ pack_row_old(TABLE *table, MY_BITMAP const* cols,
ER_NO_DEFAULT_FOR_FIELD
Returned if one of the fields existing on the slave but not on
the master does not have a default value (and isn't nullable)
ER_SLAVE_CORRUPT_EVENT
Wrong data for field found.
*/
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
int
unpack_row_old(Relay_log_info *rli,
TABLE *table, uint const colcnt, uchar *record,
uchar const *row, MY_BITMAP const *cols,
uchar const *row, const uchar *row_buffer_end,
MY_BITMAP const *cols,
uchar const **row_end, ulong *master_reclength,
MY_BITMAP* const rw_set, Log_event_type const event_type)
{
@ -133,10 +136,16 @@ unpack_row_old(Relay_log_info *rli,
if (bitmap_is_set(cols, field_ptr - begin_ptr))
{
f->move_field_offset(offset);
ptr= f->unpack(f->ptr, ptr);
ptr= f->unpack(f->ptr, ptr, row_buffer_end, 0);
f->move_field_offset(-offset);
/* Field...::unpack() cannot return 0 */
DBUG_ASSERT(ptr != NULL);
if (!ptr)
{
rli->report(ERROR_LEVEL, ER_SLAVE_CORRUPT_EVENT,
"Could not read field `%s` of table `%s`.`%s`",
f->field_name, table->s->db.str,
table->s->table_name.str);
return(ER_SLAVE_CORRUPT_EVENT);
}
}
else
bitmap_clear_bit(rw_set, field_ptr - begin_ptr);

View File

@ -23,7 +23,8 @@ size_t pack_row_old(TABLE *table, MY_BITMAP const* cols,
#ifdef HAVE_REPLICATION
int unpack_row_old(Relay_log_info *rli,
TABLE *table, uint const colcnt, uchar *record,
uchar const *row, MY_BITMAP const *cols,
uchar const *row, uchar const *row_buffer_end,
MY_BITMAP const *cols,
uchar const **row_end, ulong *master_reclength,
MY_BITMAP* const rw_set,
Log_event_type const event_type);

View File

@ -72,7 +72,7 @@ extern "C" sig_handler handle_fatal_signal(int sig)
curr_time= my_time(0);
localtime_r(&curr_time, &tm);
my_safe_printf_stderr("%02d%02d%02d %2d:%02d:%02d ",
fprintf(stderr, "%02d%02d%02d %2d:%02d:%02d ",
tm.tm_year % 100, tm.tm_mon+1, tm.tm_mday,
tm.tm_hour, tm.tm_min, tm.tm_sec);
if (opt_expect_abort

View File

@ -8513,6 +8513,17 @@ int setup_conds(THD *thd, TABLE_LIST *tables, List<TABLE_LIST> &leaves,
goto err_no_arena;
select_lex->cond_count++;
}
/*
If it's a semi-join nest, fix its "left expression", as it is used by
the SJ-Materialization
*/
if (embedded->sj_subq_pred)
{
Item **left_expr= &embedded->sj_subq_pred->left_expr;
if (!(*left_expr)->fixed && (*left_expr)->fix_fields(thd, left_expr))
goto err_no_arena;
}
embedding= embedded->embedding;
}
while (embedding &&

View File

@ -811,6 +811,7 @@ bool mysql_derived_create(THD *thd, LEX *lex, TABLE_LIST *derived)
select_union *result= (select_union*)unit->result;
if (table->s->db_type() == TMP_ENGINE_HTON)
{
result->tmp_table_param.keyinfo= table->s->key_info;
if (create_internal_tmp_table(table, result->tmp_table_param.keyinfo,
result->tmp_table_param.start_recinfo,
&result->tmp_table_param.recinfo,

View File

@ -3513,12 +3513,16 @@ make_join_statistics(JOIN *join, List<TABLE_LIST> &tables_list,
Perform range analysis if there are keys it could use (1).
Don't do range analysis if we're on the inner side of an outer join (2).
Do range analysis if we're on the inner side of a semi-join (3).
Don't do range analysis for materialized subqueries (4).
Don't do range analysis for materialized derived tables (5)
*/
if (!s->const_keys.is_clear_all() && // (1)
(!s->table->pos_in_table_list->embedding || // (2)
(s->table->pos_in_table_list->embedding && // (3)
s->table->pos_in_table_list->embedding->sj_on_expr)) && // (3)
!s->table->is_filled_at_execution())
if (!s->const_keys.is_clear_all() && // (1)
(!s->table->pos_in_table_list->embedding || // (2)
(s->table->pos_in_table_list->embedding && // (3)
s->table->pos_in_table_list->embedding->sj_on_expr)) && // (3)
!s->table->is_filled_at_execution() && // (4)
!(s->table->pos_in_table_list->derived && // (5)
s->table->pos_in_table_list->is_materialized_derived())) // (5)
{
ha_rows records;
SQL_SELECT *select;
@ -15763,8 +15767,13 @@ int report_error(TABLE *table, int error)
print them to the .err log
*/
if (error != HA_ERR_LOCK_DEADLOCK && error != HA_ERR_LOCK_WAIT_TIMEOUT)
{
push_warning_printf(table->in_use, MYSQL_ERROR::WARN_LEVEL_ERROR, error,
"Got error %d when reading table `%s`.`%s`",
error, table->s->db.str, table->s->table_name.str);
sql_print_error("Got error %d when reading table '%s'",
error, table->s->path.str);
}
table->file->print_error(error,MYF(0));
return 1;
}

View File

@ -2353,8 +2353,8 @@ partititon_err:
/* Check virtual columns against table's storage engine. */
if (share->vfields &&
!(outparam->file &&
(outparam->file->ha_table_flags() & HA_CAN_VIRTUAL_COLUMNS)))
(outparam->file &&
!(outparam->file->ha_table_flags() & HA_CAN_VIRTUAL_COLUMNS)))
{
my_error(ER_UNSUPPORTED_ENGINE_FOR_VIRTUAL_COLUMNS, MYF(0),
plugin_name(share->db_plugin)->str);

View File

@ -166,7 +166,7 @@ typedef struct st_filesort_info
uchar *addon_buf; /* Pointer to a buffer if sorted with fields */
size_t addon_length; /* Length of the buffer */
struct st_sort_addon_field *addon_field; /* Pointer to the fields info */
void (*unpack)(struct st_sort_addon_field *, uchar *); /* To unpack back */
void (*unpack)(struct st_sort_addon_field *, uchar *, uchar *); /* To unpack back */
uchar *record_pointers; /* If sorted in memory */
ha_rows found_records; /* How many records in sort */
} FILESORT_INFO;

View File

@ -58,6 +58,41 @@ void normalize_path(char *path, size_t size)
strcpy_s(path, size, buf);
}
/*
Exclusion rules.
Some hardware manufacturers deliver systems with own preinstalled MySQL copy
and services. We do not want to mess up with these installations. We will
just ignore such services, pretending it is not MySQL.
´@return
TRUE, if this service should be excluded from UI lists etc (OEM install)
FALSE otherwise.
*/
BOOL exclude_service(mysqld_service_properties *props)
{
static const char* exclude_patterns[] =
{
"common files\\dell\\mysql\\bin\\", /* Dell's private installation */
NULL
};
int i;
char buf[MAX_PATH];
/* Convert mysqld path to lower case, rules for paths are case-insensitive. */
memcpy(buf, props->mysqld_exe, sizeof(props->mysqld_exe));
_strlwr(buf);
for(i= 0; exclude_patterns[i]; i++)
{
if (strstr(buf, exclude_patterns[i]))
return TRUE;
}
return FALSE;
}
/*
Retrieve some properties from windows mysqld service binary path.
We're interested in ini file location and datadir, and also in version of
@ -240,7 +275,9 @@ int get_mysql_service_properties(const wchar_t *bin_path,
}
}
}
retval = 0;
if (!exclude_service(props))
retval = 0;
end:
LocalFree((HLOCAL)args);
return retval;

View File

@ -1120,20 +1120,26 @@ int ha_archive::unpack_row(azio_stream *file_to_read, uchar *record)
if (read != row_len || error)
{
DBUG_RETURN(HA_ERR_CRASHED_ON_USAGE);
DBUG_RETURN(error ? HA_ERR_CRASHED_ON_USAGE : HA_ERR_WRONG_IN_RECORD);
}
/* Copy null bits */
const uchar *ptr= record_buffer->buffer;
const uchar *ptr= record_buffer->buffer, *end= ptr+ row_len;
memcpy(record, ptr, table->s->null_bytes);
ptr+= table->s->null_bytes;
if (ptr > end)
DBUG_RETURN(HA_ERR_WRONG_IN_RECORD);
for (Field **field=table->field ; *field ; field++)
{
if (!((*field)->is_null_in_record(record)))
{
ptr= (*field)->unpack(record + (*field)->offset(table->record[0]), ptr);
if (!(ptr= (*field)->unpack(record + (*field)->offset(table->record[0]),
ptr, end)))
DBUG_RETURN(HA_ERR_WRONG_IN_RECORD);
}
}
if (ptr != end)
DBUG_RETURN(HA_ERR_WRONG_IN_RECORD);
DBUG_RETURN(0);
}

View File

@ -3,7 +3,7 @@
<RegistrySearch Id="HeidiSQL"
Root="HKLM"
Key="SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\HeidiSQL_is1"
Name="Install"
Name="UninstallString"
Type="raw"
Win64="no"
/>
@ -30,11 +30,15 @@
<Component Id="component.HeidiSQL_MenuShortcut" Guid="*" Win64="no">
<RegistryValue Root="HKCU" Key="Software\@CPACK_WIX_PACKAGE_NAME@\Uninstall" Name="shortcuts.heidisql" Value="1" Type="string" KeyPath="yes" />
<Shortcut Id="startmenuHeidiSQL" Directory="ShortcutFolder" Name="HeidiSQL" Target="[D.HeidiSQL]\heidisql.exe"/>
<RemoveRegistryKey Id="HeidiSQL_RegistryCleanup" Root="HKCU" Key="SOFTWARE\HeidiSQL" Action="removeOnUninstall" />
</Component>
<Component Id="component.HeidiSQL_libmysql.dll" Guid="*" Win64="no">
<File Id="heidisql.libmysql.dll" Name="libmysql.dll" Source="${HEIDISQL_DOWNLOAD_DIR}\libmysql.dll" />
</Component>
<Component Id="component.HeidiSQL_CleanupSettings" Guid="*" Win64="no">
<Condition>HEIDISQLINSTALLED</Condition>
<RegistryValue Root="HKCU" Key="Software\@CPACK_WIX_PACKAGE_NAME@\UninstallCleanupHeidiSQLSettings" Name="cleanup.heidisql" Value="1" Type="string" KeyPath="yes" />
<RemoveRegistryKey Id="HeidiSQL_RegistryCleanup" Root="HKCU" Key="SOFTWARE\HeidiSQL" Action="removeOnUninstall" />
</Component>
</Directory>
</DirectoryRef>
@ -42,5 +46,6 @@
<ComponentRef Id="component.HeidiSQL"/>
<ComponentRef Id="component.HeidiSQL_MenuShortcut"/>
<ComponentRef Id="component.HeidiSQL_libmysql.dll"/>
<ComponentRef Id="component.HeidiSQL_CleanupSettings"/>
</ComponentGroup>
</Include>

View File

@ -4,7 +4,7 @@
Description= 'Powerful, easy and free MySQL/MariaDB GUI client by Ansgar Becker'
AllowAdvertise='no'
Level='1'>
<Condition Level="0">HEIDISQLINSTALLED</Condition>
<Condition Level="0">HEIDISQLINSTALLED AND NOT REMOVE ~= ALL</Condition>
<ComponentGroupRef Id='HeidiSQL'/>
</Feature>
</Include>