mirror of
https://github.com/MariaDB/server.git
synced 2025-01-30 10:31:54 +01:00
Merge from 5.3
This commit is contained in:
commit
caa535eb9f
9 changed files with 229 additions and 11 deletions
|
@ -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';
|
||||||
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:
|
||||||
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);
|
||||||
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';
|
||||||
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;
|
||||||
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,
|
||||||
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,
|
||||||
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,
|
||||||
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()
|
||||||
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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
|
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 @@
|
||||||
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
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
Loading…
Add table
Reference in a new issue