Commit graph

124 commits

Author SHA1 Message Date
Gleb Shchepa
3ca98f7669 Bug #38745: MySQL 5.1 optimizer uses filesort for ORDER BY
when it should use index

Sometimes the LEFT/RIGHT JOIN with an empty table caused an
unnecessary filesort.

Sample query, where t1.i1 is indexed and t3 is empty:

  SELECT t1.*, t2.* FROM t1 JOIN t2 ON t1.i1 = t2.i2
                       LEFT JOIN t3 ON t2.i2 = t3.i3
    ORDER BY t1.i1 LIMIT 5;

The server erroneously used an item of empty outer-joined
table as a common constant of a Item_equal (multi-equivalence
expression).
By the fix for the bug 16590 the constant status of such
an item has been propagated to st_table::const_key_parts
map bits related to other Item_equal argument-related
key parts (those are obviously not constant in our case).
As far as test_if_skip_sort_order function skips constant
prefixes of testing keys, this caused an ignorance of
available indices, since some prefixes were marked as
constant by mistake.
2010-05-31 16:52:19 +04:00
Georgi Kodinov
772aa6951f merge 2009-12-10 17:38:01 +02:00
Georgi Kodinov
3c434c93d0 Bug #42760: Select doesn't return desired results when we have null values
Part 2 : 
There was a special optimization on the ref access method for 
ORDER BY ... DESC that was set without actually looking on the type of the 
selected index for ORDER BY.
Fixed the SELECT ... ORDER BY .. DESC (it uses a different code path compared
to the ASC that has been fixed with the previous fix).
2009-12-07 16:38:56 +02:00
Georgi Kodinov
154c348031 Bug #42760: Select doesn't return desired results when we have null
values
 
 We should re-set the access method functions when changing the access
 method when switching to another index to avoid sorting.
 
 Fixed by doing a little re-engineering : encapsulating all the function
 assignment into a special function and calling it when flipping the 
 indexes.
2009-11-10 10:21:41 +02:00
Georgi Kodinov
bb6b57043f merge 2009-11-10 10:58:43 +02:00
Georgi Kodinov
5faf23bf55 Bug #43029: FORCE INDEX FOR ORDER BY is ignored when join
buffering is used

FORCE INDEX FOR ORDER BY now prevents the optimizer from 
using join buffering. As a result the optimizer can use
indexed access on the first table and doesn't need to 
sort the complete resultset at the end of the statement.
2009-10-07 18:03:42 +03:00
Martin Hansson
5421a8e858 Bug#46454: MySQL wrong index optimisation leads to incorrect result & crashes
Problem 1:
When the 'Using index' optimization is used, the optimizer may still - after
cost-based optimization - decide to use another index in order to avoid using
a temporary table. But when this happens, the flag to the storage engine to 
read index only (not table) was still set. Fixed by resetting the flag in the 
storage engine and TABLE structure in the above scenario, unless the new index
allows for the same optimization.
Problem 2:
When a 'ref' access method was employed by cost-based optimizer, (when the column
is non-NULLable), it was assumed that it needed no initialization if 'quick' access
methods (since they are based on range scan). When ORDER BY optimization overrides 
the decision, however, it expects to have this initialized and hence crashes. 
Fixed in 5.1 (was fixed in 6.0 already) by initializing 'quick' even when there's 
'ref' access.
2009-08-07 13:51:40 +02:00
Gleb Shchepa
56aa88b346 merge 5.0-bugteam --> 5.1-bugteam (bug 39844) 2008-10-16 23:04:31 +05:00
Gleb Shchepa
c411a11e5c Bug #39844: Query Crash Mysql Server 5.0.67
Server crashed during a sort order optimization
of a dependent subquery:

SELECT
    (SELECT t1.a FROM t1, t2
      WHERE t1.a = t2.b AND t2.a = t3.c
      ORDER BY t1.a)
  FROM t3;


Bitmap of tables, that the reference to outer table
column uses, in addition to the regular table bit
has the OUTER_REF_TABLE_BIT bit set.
The only_eq_ref_tables function traverses this map
bit by bit simultaneously with join->map2table list.
Obviously join->map2table never contains an entry
for the OUTER_REF_TABLE_BIT pseudo-table, so the
server crashed there.


The only_eq_ref_tables function has been modified
to traverse regular table bits only like the
update_depend_map function (resetting of the
OUTER_REF_TABLE_BIT there is enough, but
resetting of the whole set of PSEUDO_TABLE_BITS
is used there for sure).
2008-10-16 21:37:17 +05:00
igor@olga.mysql.com
b210e5df6d Fixed bug#35844.
The function test_if_skip_sort_order ignored any covering index used for ref
access of a table in a query with ORDER BY if this index was incompatible 
with the ORDER BY list and there was another covering index compatible with
this list. 
As a result sub-optimal execution plans were chosen for some queries with
ORDER BY clause.
2008-04-22 21:49:39 -07:00
gkodinov/kgeorge@magare.gmz
cde380ea50 Bug #35206: select query result different if the key is indexed or not
The code for executing indexed ORDER BY was not setting all the 
internal fields correctly when selecting to execute ORDER BY over
and index.
Fixed by change the access method to one that will use the 
quick indexed access if one is selected while selecting indexed
ORDER BY.
2008-03-27 19:39:21 +02:00
kaa@kaamos.(none)
eeab00e3d0 Merge kaamos.(none):/data/src/opt/mysql-5.0-opt
into  kaamos.(none):/data/src/opt/mysql-5.1-opt
2008-02-14 12:54:23 +03:00
evgen@sunlight.local
a927bdbe3e Bug#31590: Wrong error message on sort buffer being too small.
The out of memory error was thrown when the sort buffer size were too small.
This led to a user confusion.

Now filesort throws the error message about sort buffer being too small.
2008-02-08 13:35:00 +03:00
mhansson/martin@linux-st28.site
ab73b25d5b Bug#30665: Inconsistent optimization of IGNORE INDEX FOR {ORDER BY|GROUP BY}
The optimizer takes different execution paths during EXPLAIN than SELECT,
this fix relates only to EXPLAIN, hence no behavior changes.
The test of sort keys for ORDER BY was prohibited from considering keys
that were mentioned in IGNORE KEYS FOR ORDER BY. This led to two 
inconsistencies: One was that IGNORE INDEX FOR GROUP BY and 
IGNORE INDEX FOR ORDER BY gave apparently different EXPLAINs; the latter 
erroneously claimed to do filesort. The second inconsistency 
is that the test of sort keys is called twice, finding a sort key the first
time but not the second time, leading to the mentioned filesort.

Fixed by making the test of sort keys consider all enabled 
keys on the table. This test rejects keys that are not covering, and for 
covering keys the hint should be ignored anyway.
2007-09-28 09:36:05 +02:00
igor@olga.mysql.com
e39d06e7d3 Made the test case for bug 28404 platform independent. 2007-08-04 17:15:33 -07:00
igor@olga.mysql.com
3b1dd15e0d Made sure that the test case for bug 28404 use the correct statistics. 2007-08-04 13:41:01 -07:00
igor@olga.mysql.com
cf39429295 Fixed bug#28404.
This patch adds cost estimation for the queries with ORDER BY / GROUP BY
and LIMIT. 
If there was a ref/range access to the table whose rows were required
to be ordered in the result set the optimizer always employed this access
though a scan by a different index that was compatible with the required 
order could be cheaper to produce the first L rows of the result set.
Now for such queries the optimizer makes a choice between the cheapest
ref/range accesses not compatible with the given order and index scans
compatible with it.
2007-08-02 12:45:56 -07:00
holyfoot/hf@hfmain.(none)
d08216f1b7 Merge mysql.com:/d2/hf/mrg/mysql-5.0-opt
into  mysql.com:/d2/hf/mrg/mysql-5.1-opt
2007-04-06 12:45:07 +05:00
igor@olga.mysql.com
38cf7dee4c Merge olga.mysql.com:/home/igor/mysql-4.1-opt
into  olga.mysql.com:/home/igor/mysql-5.0-opt
2007-04-03 22:24:57 -07:00
igor@olga.mysql.com
0e14d4c7ed Improved coverage for the code added to fix bug 27532. 2007-04-03 19:45:37 -07:00
igor@olga.mysql.com
a87e5ac3d5 Fix after manual merge 2007-04-03 17:09:41 -07:00
igor@olga.mysql.com
6aa599fc31 Merge olga.mysql.com:/home/igor/mysql-4.1-opt
into  olga.mysql.com:/home/igor/mysql-5.0-opt
2007-04-03 16:11:27 -07:00
igor@olga.mysql.com
90aa05d276 Fixed bug #27532: wrong results with ORDER/GROUP BY queries containing
IN/BETWEEN predicates in sorting expressions.
Wrong results may occur when the select list contains an expression
with IN/BETWEEN predicate that differs from a sorting expression by
an additional NOT only.
 
Added the method Item_func_opt_neg::eq to compare correctly expressions
containing [NOT] IN/BETWEEN.
The eq method inherited from the Item_func returns TRUE when comparing
'a IN (1,2)' with 'a NOT IN (1,2)' that is not, of course, correct.
2007-04-03 14:32:16 -07:00
gkodinov/kgeorge@magare.gmz
2fd1bd92a3 Merge magare.gmz:/home/kgeorge/mysql/autopush/B26794-5.0-opt
into  magare.gmz:/home/kgeorge/mysql/autopush/B26794-merge-5.1-opt
2007-03-14 17:04:45 +02:00
gkodinov/kgeorge@magare.gmz
96629f2c99 Merge gkodinov@bk-internal.mysql.com:/home/bk/mysql-5.0-opt
into  magare.gmz:/home/kgeorge/mysql/autopush/B26672-5.0-opt
2007-03-13 18:46:46 +02:00
holyfoot/hf@hfmain.(none)
cdcf3ec097 Merge bk@192.168.21.1:mysql-5.1
into  mysql.com:/home/hf/work/mrg/mysql-5.1-opt
2007-03-08 22:04:17 +04:00
holyfoot/hf@mysql.com/hfmain.(none)
11dd0fa326 Merge bk@192.168.21.1:mysql-5.0
into  mysql.com:/home/hf/work/mrg/mysql-5.0-opt
2007-03-08 21:42:41 +04:00
holyfoot/hf@hfmain.(none)
75be7cd1ae Merge mysql.com:/home/hf/work/mrg/mysql-5.0-opt
into  mysql.com:/home/hf/work/mrg/mysql-5.1-opt
2007-03-08 19:08:28 +04:00
gkodinov/kgeorge@macbook.gmz
d2c977a935 Bug #26672:
DATE/DATETIME values are out of the currently supported
 4 basic value types (INT,STRING,REAL and DECIMAL).
 So expressions (not fields) of compile type DATE/DATETIME are 
 generally considered as STRING values. This is not so
 when they are compared : then they are compared as 
 INTEGER values.
 But the rule for comparison as INTEGERS must be checked
 explicitly each time when a comparison is to be performed.
 filesort is one such place. However there the check was 
 not done and hence the expressions (not fields) of type 
 DATE/DATETIME were sorted by their string representation.
 Fixed to compare them as INTEGER values for filesort.
2007-03-07 14:51:45 +02:00
evgen@moonbone.local
6552d3064d Bug#25376: Incomplete setup of ORDER BY clause results in a wrong result.
Functions over sum functions wasn't set up correctly for the ORDER BY clause
which leads to a wrong order of the result set.

The split_sum_func() function is called now for each ORDER BY item that
contains a sum function to set it up correctly.
2007-03-06 23:58:10 +03:00
cmiller@calliope.local.cmiller/calliope.local
80a35bfd39 Merge calliope.local.cmiller:/Volumes/Source/src/mysql-4.1-maint--bug25126
into  calliope.local.cmiller:/Volumes/Source/src/mysql-4.1-maint
2007-02-14 12:24:11 -05:00
cmiller@calliope.local
81a46371a9 Merge calliope.local.cmiller:/Volumes/Source/src/mysql-5.0-maint
into  calliope.local.cmiller:/Volumes/Source/src/mysql-5.1-maint
2007-02-14 11:38:39 -05:00
cmiller@calliope.local.cmiller/calliope.local
cbdaf5b641 Merge calliope.local.cmiller:/Volumes/Source/src/mysql-4.1-maint--bug25126
into  calliope.local.cmiller:/Volumes/Source/src/mysql-5.0-maint
2007-02-14 11:27:37 -05:00
cmiller@calliope.local.cmiller/calliope.local
0733ea7462 Bug#25126: Reference to non-existant column in UPDATE...ORDER BY... crashes server
"update existingtable set anycolumn=nonexisting order by nonexisting" would crash
the server.

Though we would find the reference to a field, that doesn't mean we can then use
it to set some values.  It could be a reference to another field.  If it is NULL, 
don't try to use it to set values in the Item_field and instead return an error.

Over the previous patch, this signals an error at the location of the error, rather
than letting the subsequent deref signal it.
2007-02-09 11:05:36 +01:00
gkodinov/kgeorge@rakia.gmz
c9df1caac8 Merge gkodinov@bk-internal.mysql.com:/home/bk/mysql-5.1-opt
into  rakia.gmz:/home/kgeorge/mysql/autopush/B16590-5.1-opt
2007-01-22 12:58:14 +02:00
gkodinov/kgeorge@macbook.gmz
9ea140d13e BUG#16590: Optimized does not do right "const" table pre-read
st_table::const_key_parts member is used in determining if
 certain key has a prefix that is compared to constant(s) in
 the query predicates.
 If there's such prefix the index can be used to get the data
 from the remaining suffix columns in sorted order.
 However if a field is compared to another field from a "const"
 table the const_key_parts is not amended.
 This makes the optimizer unable to detect that the key can be 
 used for sorting and adds an extra filesort.
 Fixed by updating const_key_parts after reading in the "const"
 table.
2007-01-22 12:51:21 +02:00
gluh@eagle.(none)
5c5edbdd82 Merge mysql.com:/home/gluh/MySQL/Merge/5.0-opt
into  mysql.com:/home/gluh/MySQL/Merge/5.1-opt
2007-01-12 14:48:59 +04:00
igor@olga.mysql.com
61cd864bc0 Merge olga.mysql.com:/home/igor/mysql-4.1-opt
into  olga.mysql.com:/home/igor/mysql-5.0-opt
2007-01-10 08:55:55 -08:00
igor@olga.mysql.com
578fae9dc8 Fixed bug #25427.
In the method Item_field::fix_fields we try to resolve the name of
the field against the names of the aliases that occur in the select
list. This is done by a call of the function find_item_in_list.
When this function finds several occurrences of the field name
it sends an error message to the error queue and returns 0.
Yet the code did not take into account that find_item_in_list
could return 0 and tried to dereference the returned value.
2007-01-10 00:27:11 -08:00
holyfoot/hf@deer.(none)
989117071a Merge mysql.com:/home/hf/work/mysql-5.0-0mrg
into  mysql.com:/home/hf/work/mysql-5.1-mrg
2006-11-19 22:26:36 +04:00
holyfoot/hf@deer.(none)
dd0b81885d Merge mysql.com:/home/hf/work/mysql-5.0-mrg
into  mysql.com:/home/hf/work/mysql-5.1-mrg
2006-11-17 18:27:28 +04:00
holyfoot/hf@mysql.com/deer.(none)
dac2d0fcba merging 2006-11-17 12:02:36 +04:00
holyfoot/hf@mysql.com/deer.(none)
497ccd6b87 Merge mysql.com:/home/hf/work/mysql-4.1-mrg
into  mysql.com:/home/hf/work/mysql-5.0-mrg
2006-11-16 23:16:44 +04:00
gkodinov/kgeorge@macbook.gmz
77acba320d Bug #22457: Column alias in ORDER BY works, but not if in an expression
The parser is allocating Item_field for references by name in ORDER BY
 expressions. Such expressions however may point not only to Item_field 
 in the select list (or to a table column) but also to an arbitrary Item. 
 This causes Item_field::fix_fields to throw an error about missing 
 column.
 The fix substitutes Item_field for the reference with an Item_ref when 
 not pointing to Item_field.
2006-11-03 18:48:16 +02:00
sergefp@mysql.com
cd094b71af BUG#14940: Update test results 2006-09-29 20:42:37 +04:00
gkodinov/kgeorge@macbook.gmz
b5f814abed Bug #21302: Result not properly sorted when using an ORDER BY on a second table in a join
- undeterminstic tests fixed
2006-08-15 15:48:49 +03:00
gkodinov/kgeorge@rakia.(none)
eabc7662e6 Bug #21302: Result not properly sorted when using an ORDER BY
on a second table in a join
- undeterministic output of the test case removed.
2006-08-15 13:01:04 +03:00
gkodinov/kgeorge@rakia.(none)
04d86b3fe9 Merge gkodinov@bk-internal.mysql.com:/home/bk/mysql-5.0-opt
into  rakia.(none):/home/kgeorge/mysql/autopush/B21302-5.0-opt
2006-08-14 15:58:01 +03:00
gkodinov/kgeorge@macbook.gmz
2d9aa1e61e Bug #21302: Result not properly sorted when using an ORDER BY on a second
table in a join
 The optimizer removes redundant columns in ORDER BY. It is considering 
redundant every reference to const table column, e.g b in :
create table t1 (a int, b int, primary key(a)); 
select 1 from t1 order by b where a = 1

But it must not remove references to const table columns if the 
const table is an outer table because there still can be 2 values :
the const value and NULL. e.g.:
create table t1 (a int, b int, primary key(a));
select t2.b c from t1 left join t1 t2 on (t1.a = t2.a and t2.a = 5) 
  order by c;
2006-08-14 15:45:48 +03:00
jimw@rama.(none)
d18eacc71d Bug #19498: Inconsistent support for DEFAULT in TEXT columns
When a default of '' was specified for TEXT/BLOB columns, the specification
  was silently ignored. This is presumably to be nice to applications (or
  people) who generate their column definitions in a not-very-clever fashion.

  For clarity, doing this now results in a warning, or an error in strict
  mode.
2006-07-18 16:04:18 -07:00