Commit caa535eb authored by unknown's avatar unknown

Merge from 5.3

parents 6c3a756d e44a800d
...@@ -227,3 +227,7 @@ case t1.f1 when '00:00:00' then 1 end ...@@ -227,3 +227,7 @@ case t1.f1 when '00:00:00' then 1 end
1 1
NULL NULL
drop table t1; drop table t1;
CREATE TABLE t1(a YEAR);
SELECT 1 FROM t1 WHERE a=1 AND CASE 1 WHEN a THEN 1 ELSE 1 END;
1
DROP TABLE t1;
...@@ -96,3 +96,7 @@ SELECT * FROM t1 WHERE a > '2008-01-01' AND a = '0000-00-00'; ...@@ -96,3 +96,7 @@ SELECT * FROM t1 WHERE a > '2008-01-01' AND a = '0000-00-00';
a a
DROP TABLE t1; DROP TABLE t1;
End of 5.0 tests End of 5.0 tests
CREATE TABLE t1(a INT ZEROFILL);
SELECT 1 FROM t1 WHERE t1.a IN (1, t1.a) AND t1.a=2;
1
DROP TABLE t1;
...@@ -1813,3 +1813,135 @@ Warnings: ...@@ -1813,3 +1813,135 @@ Warnings:
Note 1003 select `test`.`t2`.`b` AS `b` from `test`.`t1` join `test`.`t2` where (`test`.`t2`.`a` = `test`.`t1`.`b`) group by `test`.`t2`.`b` order by `test`.`t1`.`b` Note 1003 select `test`.`t2`.`b` AS `b` from `test`.`t1` join `test`.`t2` where (`test`.`t2`.`a` = `test`.`t1`.`b`) group by `test`.`t2`.`b` order by `test`.`t1`.`b`
drop table t1,t2; drop table t1,t2;
End of 5.2 tests End of 5.2 tests
#
# Bug mdev-449: ORDER BY with small sort_buffer_size
#
CREATE TABLE t1(f0 int auto_increment primary key, f1 int, f2 varchar(200));
INSERT INTO t1(f1, f2) VALUES
(0,"0"),(1,"1"),(2,"2"),(3,"3"),(4,"4"),(5,"5"),
(6,"6"),(7,"7"),(8,"8"),(9,"9"),(10,"10"),
(11,"11"),(12,"12"),(13,"13"),(14,"14"),(15,"15"),
(16,"16"),(17,"17"),(18,"18"),(19,"19"),(20,"20"),
(21,"21"),(22,"22"),(23,"23"),(24,"24"),(25,"25"),
(26,"26"),(27,"27"),(28,"28"),(29,"29"),(30,"30"),
(31,"31"),(32,"32"),(33,"33"),(34,"34"),(35,"35"),
(36,"36"),(37,"37"),(38,"38"),(39,"39"),(40,"40"),
(41,"41"),(42,"42"),(43,"43"),(44,"44"),(45,"45"),
(46,"46"),(47,"47"),(48,"48"),(49,"49"),(50,"50"),
(51,"51"),(52,"52"),(53,"53"),(54,"54"),(55,"55"),
(56,"56"),(57,"57"),(58,"58"),(59,"59"),(60,"60"),
(61,"61"),(62,"62"),(63,"63"),(64,"64"),(65,"65"),
(66,"66"),(67,"67"),(68,"68"),(69,"69"),(70,"70"),
(71,"71"),(72,"72"),(73,"73"),(74,"74"),(75,"75"),
(76,"76"),(77,"77"),(78,"78"),(79,"79"),(80,"80"),
(81,"81"),(82,"82"),(83,"83"),(84,"84"),(85,"85"),
(86,"86"),(87,"87"),(88,"88"),(89,"89"),(90,"90"),
(91,"91"),(92,"92"),(93,"93"),(94,"94"),(95,"95"),
(96,"96"),(97,"97"),(98,"98"),(99,"99");
set @save_sort_buffer_size= @@sort_buffer_size;
set sort_buffer_size= 2000;
SELECT * FROM t1 ORDER BY f1 DESC, f0;
f0 f1 f2
100 99 99
99 98 98
98 97 97
97 96 96
96 95 95
95 94 94
94 93 93
93 92 92
92 91 91
91 90 90
90 89 89
89 88 88
88 87 87
87 86 86
86 85 85
85 84 84
84 83 83
83 82 82
82 81 81
81 80 80
80 79 79
79 78 78
78 77 77
77 76 76
76 75 75
75 74 74
74 73 73
73 72 72
72 71 71
71 70 70
70 69 69
69 68 68
68 67 67
67 66 66
66 65 65
65 64 64
64 63 63
63 62 62
62 61 61
61 60 60
60 59 59
59 58 58
58 57 57
57 56 56
56 55 55
55 54 54
54 53 53
53 52 52
52 51 51
51 50 50
50 49 49
49 48 48
48 47 47
47 46 46
46 45 45
45 44 44
44 43 43
43 42 42
42 41 41
41 40 40
40 39 39
39 38 38
38 37 37
37 36 36
36 35 35
35 34 34
34 33 33
33 32 32
32 31 31
31 30 30
30 29 29
29 28 28
28 27 27
27 26 26
26 25 25
25 24 24
24 23 23
23 22 22
22 21 21
21 20 20
20 19 19
19 18 18
18 17 17
17 16 16
16 15 15
15 14 14
14 13 13
13 12 12
12 11 11
11 10 10
10 9 9
9 8 8
8 7 7
7 6 6
6 5 5
5 4 4
4 3 3
3 2 2
2 1 1
1 0 0
set sort_buffer_size= @save_sort_buffer_size;
DROP TABLE t1;
End of 5.3 tests
...@@ -182,3 +182,13 @@ create table t1 (f1 time); ...@@ -182,3 +182,13 @@ create table t1 (f1 time);
insert t1 values ('00:00:00'),('00:01:00'); insert t1 values ('00:00:00'),('00:01:00');
select case t1.f1 when '00:00:00' then 1 end from t1; select case t1.f1 when '00:00:00' then 1 end from t1;
drop table t1; drop table t1;
#
# LP BUG#1001510
# Bug #11764313 57135: CRASH IN ITEM_FUNC_CASE::FIND_ITEM WITH CASE WHEN
# ELSE CLAUSE
#
CREATE TABLE t1(a YEAR);
SELECT 1 FROM t1 WHERE a=1 AND CASE 1 WHEN a THEN 1 ELSE 1 END;
DROP TABLE t1;
...@@ -86,3 +86,11 @@ SELECT * FROM t1 WHERE a > '2008-01-01' AND a = '0000-00-00'; ...@@ -86,3 +86,11 @@ SELECT * FROM t1 WHERE a > '2008-01-01' AND a = '0000-00-00';
DROP TABLE t1; DROP TABLE t1;
--echo End of 5.0 tests --echo End of 5.0 tests
#
# Bug #11764818 57692: Crash in item_func_in::val_int() with ZEROFILL
#
CREATE TABLE t1(a INT ZEROFILL);
SELECT 1 FROM t1 WHERE t1.a IN (1, t1.a) AND t1.a=2;
DROP TABLE t1;
...@@ -1613,3 +1613,42 @@ SELECT t2.b FROM t1, t2 WHERE t1.b = t2.a GROUP BY t2.b ORDER BY t1.b; ...@@ -1613,3 +1613,42 @@ SELECT t2.b FROM t1, t2 WHERE t1.b = t2.a GROUP BY t2.b ORDER BY t1.b;
drop table t1,t2; drop table t1,t2;
--echo End of 5.2 tests --echo End of 5.2 tests
--echo #
--echo # Bug mdev-449: ORDER BY with small sort_buffer_size
--echo #
CREATE TABLE t1(f0 int auto_increment primary key, f1 int, f2 varchar(200));
INSERT INTO t1(f1, f2) VALUES
(0,"0"),(1,"1"),(2,"2"),(3,"3"),(4,"4"),(5,"5"),
(6,"6"),(7,"7"),(8,"8"),(9,"9"),(10,"10"),
(11,"11"),(12,"12"),(13,"13"),(14,"14"),(15,"15"),
(16,"16"),(17,"17"),(18,"18"),(19,"19"),(20,"20"),
(21,"21"),(22,"22"),(23,"23"),(24,"24"),(25,"25"),
(26,"26"),(27,"27"),(28,"28"),(29,"29"),(30,"30"),
(31,"31"),(32,"32"),(33,"33"),(34,"34"),(35,"35"),
(36,"36"),(37,"37"),(38,"38"),(39,"39"),(40,"40"),
(41,"41"),(42,"42"),(43,"43"),(44,"44"),(45,"45"),
(46,"46"),(47,"47"),(48,"48"),(49,"49"),(50,"50"),
(51,"51"),(52,"52"),(53,"53"),(54,"54"),(55,"55"),
(56,"56"),(57,"57"),(58,"58"),(59,"59"),(60,"60"),
(61,"61"),(62,"62"),(63,"63"),(64,"64"),(65,"65"),
(66,"66"),(67,"67"),(68,"68"),(69,"69"),(70,"70"),
(71,"71"),(72,"72"),(73,"73"),(74,"74"),(75,"75"),
(76,"76"),(77,"77"),(78,"78"),(79,"79"),(80,"80"),
(81,"81"),(82,"82"),(83,"83"),(84,"84"),(85,"85"),
(86,"86"),(87,"87"),(88,"88"),(89,"89"),(90,"90"),
(91,"91"),(92,"92"),(93,"93"),(94,"94"),(95,"95"),
(96,"96"),(97,"97"),(98,"98"),(99,"99");
set @save_sort_buffer_size= @@sort_buffer_size;
set sort_buffer_size= 2000;
SELECT * FROM t1 ORDER BY f1 DESC, f0;
set sort_buffer_size= @save_sort_buffer_size;
DROP TABLE t1;
--echo End of 5.3 tests
...@@ -103,6 +103,7 @@ ha_rows filesort(THD *thd, TABLE *table, SORT_FIELD *sortorder, uint s_length, ...@@ -103,6 +103,7 @@ ha_rows filesort(THD *thd, TABLE *table, SORT_FIELD *sortorder, uint s_length,
int error; int error;
ulong memory_available= thd->variables.sortbuff_size; ulong memory_available= thd->variables.sortbuff_size;
ulong min_sort_memory; ulong min_sort_memory;
ulong sort_buff_sz;
uint maxbuffer; uint maxbuffer;
BUFFPEK *buffpek; BUFFPEK *buffpek;
ha_rows num_rows= HA_POS_ERROR; ha_rows num_rows= HA_POS_ERROR;
...@@ -193,19 +194,21 @@ ha_rows filesort(THD *thd, TABLE *table, SORT_FIELD *sortorder, uint s_length, ...@@ -193,19 +194,21 @@ ha_rows filesort(THD *thd, TABLE *table, SORT_FIELD *sortorder, uint s_length,
goto err; goto err;
min_sort_memory= max(MIN_SORT_MEMORY, param.sort_length * MERGEBUFF2); min_sort_memory= max(MIN_SORT_MEMORY, param.sort_length * MERGEBUFF2);
set_if_bigger(min_sort_memory, sizeof(BUFFPEK*)*MERGEBUFF2);
if (!table_sort.sort_keys) if (!table_sort.sort_keys)
{ {
while (memory_available >= min_sort_memory) while (memory_available >= min_sort_memory)
{ {
ulong keys= memory_available / (param.rec_length + sizeof(char*)); ulong keys= memory_available / (param.rec_length + sizeof(char*));
table_sort.keys= (uint) min(num_rows, keys); table_sort.keys= (uint) min(num_rows, keys);
sort_buff_sz= table_sort.keys*(param.rec_length+sizeof(char*));
set_if_bigger(sort_buff_sz, param.rec_length * MERGEBUFF2);
DBUG_EXECUTE_IF("make_sort_keys_alloc_fail", DBUG_EXECUTE_IF("make_sort_keys_alloc_fail",
DBUG_SET("+d,simulate_out_of_memory");); DBUG_SET("+d,simulate_out_of_memory"););
if ((table_sort.sort_keys= if ((table_sort.sort_keys=
(uchar**) my_malloc(table_sort.keys*(param.rec_length+sizeof(char*)), (uchar**) my_malloc(sort_buff_sz, MYF(0))))
MYF(0))))
break; break;
ulong old_memory_available= memory_available; ulong old_memory_available= memory_available;
memory_available= memory_available/4*3; memory_available= memory_available/4*3;
...@@ -1260,8 +1263,7 @@ int merge_buffers(SORTPARAM *param, IO_CACHE *from_file, ...@@ -1260,8 +1263,7 @@ int merge_buffers(SORTPARAM *param, IO_CACHE *from_file,
strpos= sort_buffer; strpos= sort_buffer;
org_max_rows=max_rows= param->max_rows; org_max_rows=max_rows= param->max_rows;
/* The following will fire if there is not enough space in sort_buffer */ set_if_bigger(maxcount, 1);
DBUG_ASSERT(maxcount!=0);
if (unique_buff) if (unique_buff)
{ {
......
...@@ -3089,6 +3089,15 @@ void Item_func_case::fix_length_and_dec() ...@@ -3089,6 +3089,15 @@ void Item_func_case::fix_length_and_dec()
return; return;
} }
} }
/*
Set cmp_context of all WHEN arguments. This prevents
Item_field::equal_fields_propagator() from transforming a
zerofill argument into a string constant. Such a change would
require rebuilding cmp_items.
*/
for (i= 0; i < ncases; i+= 2)
args[i]->cmp_context= item_cmp_type(left_result_type,
args[i]->result_type());
} }
if (else_expr_num == -1 || args[else_expr_num]->maybe_null) if (else_expr_num == -1 || args[else_expr_num]->maybe_null)
...@@ -4069,6 +4078,16 @@ void Item_func_in::fix_length_and_dec() ...@@ -4069,6 +4078,16 @@ void Item_func_in::fix_length_and_dec()
} }
} }
} }
/*
Set cmp_context of all arguments. This prevents
Item_field::equal_fields_propagator() from transforming a zerofill integer
argument into a string constant. Such a change would require rebuilding
cmp_itmes.
*/
for (arg= args + 1, arg_end= args + arg_count; arg != arg_end ; arg++)
{
arg[0]->cmp_context= item_cmp_type(left_result_type, arg[0]->result_type());
}
max_length= 1; max_length= 1;
} }
......
...@@ -160,18 +160,18 @@ ...@@ -160,18 +160,18 @@
3.2.1 Non-merged semi-joins and join optimization 3.2.1 Non-merged semi-joins and join optimization
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
For join optimization purposes, non-merged semi-join nests are similar to For join optimization purposes, non-merged semi-join nests are similar to
base tables - they've got one JOIN_TAB, which can be accessed with one of base tables. Each such nest is represented by one one JOIN_TAB, which has
two methods: two possible access strategies:
- full table scan (representing SJ-Materialization-Scan strategy) - full table scan (representing SJ-Materialization-Scan strategy)
- eq_ref-like table lookup (representing SJ-Materialization-Lookup) - eq_ref-like table lookup (representing SJ-Materialization-Lookup)
Unlike regular base tables, non-merged semi-joins have: Unlike regular base tables, non-merged semi-joins have:
- non-zero JOIN_TAB::startup_cost, and - non-zero JOIN_TAB::startup_cost, and
- join_tab->table->is_filled_at_execution()==TRUE, which means one - join_tab->table->is_filled_at_execution()==TRUE, which means one
cannot do const table detection or range analysis or other table data- cannot do const table detection, range analysis or other dataset-dependent
dependent inferences optimizations.
// instead, get_delayed_table_estimates() runs optimization on the nest so that Instead, get_delayed_table_estimates() will run optimization for the
// we get an idea about temptable size subquery and produce an E(materialized table size).
3.2.2 Merged semi-joins and join optimization 3.2.2 Merged semi-joins and join optimization
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment