Commit graph

97 commits

Author SHA1 Message Date
Sergey Petrunia
5249c0493e BUG#38072: Wrong result: HAVING not observed in a query with aggregate
- Make send_row_on_empty_set() return FALSE when simplify_cond() has found out
  that HAVING is always FALSE
re-committing to put the fix into 5.0 and 5.1
2008-10-24 06:16:22 +04:00
evgen@moonbone.local
21c6145a6e Bug#27219: Aggregate functions in ORDER BY.
Mixing aggregate functions and non-grouping columns is not allowed in the
ONLY_FULL_GROUP_BY mode. However in some cases the error wasn't thrown because
of insufficient check.

In order to check more thoroughly the new algorithm employs a list of outer
fields used in a sum function and a SELECT_LEX::full_group_by_flag.
Each non-outer field checked to find out whether it's aggregated or not and
the current select is marked accordingly.
All outer fields that are used under an aggregate function are added to the
Item_sum::outer_fields list and later checked by the Item_sum::check_sum_func
function.
2008-03-27 19:49:32 +03:00
mhansson/martin@linux-st28.site
e24109c6d1 Merge mhansson@bk-internal:/home/bk/mysql-5.0-opt
into  linux-st28.site:/home/martin/mysql/src/bug31797/my50-bug31797-pushee
2008-01-11 19:00:26 +01:00
mhansson/martin@linux-st28.site
199a167246 Bug#31797: error while parsing subqueries -- WHERE is parsed as HAVING
The name resolution for correlated subqueries and HAVING clauses
failed to distinguish which of two was being performed when there 
was a reference to an outer aliased field.
Fixed by adding the condition that HAVING clause name resulotion
is being performed.
2008-01-11 18:50:54 +01:00
kaa@polly.(none)
8c19367881 Fix for bug #32202: ORDER BY not working with GROUP BY
The bug is a regression introduced by the fix for bug30596. The problem
was that in cases when groups in GROUP BY correspond to only one row,
and there is ORDER BY, the GROUP BY was removed and the ORDER BY
rewritten to ORDER BY <group_by_columns> without checking if the
columns in GROUP BY and ORDER BY are compatible. This led to
incorrect ordering of the result set as it was sorted using the
GROUP BY columns. Additionaly, the code discarded ASC/DESC modifiers
from ORDER BY even if its columns were compatible with the GROUP BY
ones.

This patch fixes the regression by checking if ORDER BY columns form a
prefix of the GROUP BY ones, and rewriting ORDER BY only in that case,
preserving the ASC/DESC modifiers. That check is sufficient, since the
GROUP BY columns contain a unique index.
2007-11-09 19:12:12 +03:00
mhansson/martin@linux-st28.site
a4d5d9204d Bug #30596 GROUP BY optimization gives wrong result order
The optimization that uses a unique index to remove GROUP BY, did not 
ensure that the index was actually used, thus violating the ORDER BY
that is impled by GROUP BY.
Fixed by replacing GROUP BY with ORDER BY if the GROUP BY clause contains
a unique index. In case GROUP BY ... ORDER BY null is used, GROUP BY is
simply removed.
2007-08-27 17:33:41 +02:00
holyfoot/hf@hfmain.(none)
0ff0ed2732 Merge mysql.com:/home/hf/work/29717/my41-29717
into  mysql.com:/home/hf/work/29717/my50-29717
2007-07-31 11:03:31 +05:00
holyfoot/hf@mysql.com/hfmain.(none)
f1ee2d0687 Bug #29717 INSERT INTO SELECT inserts values even if
SELECT statement itself returns empty.

As a result of this bug 'SELECT AGGREGATE_FUNCTION(fld) ... GROUP BY'
can return one row instead of an empty result set.

When GROUP BY only has fields of constant tables
(with a single row), the optimizer deletes the group_list.
After that we lose the information about whether we had an
GROUP BY statement. Though it's important
as SELECT min(x) from empty_table; and
   SELECT min(x) from empty_table GROUP BY y; have to return
different results - the first query should return one row,
second - an empty result set.
So here we add the 'group_optimized_away' flag to remember this case
when GROUP BY exists in the query and is removed
by the optimizer, and check this flag in end_send_group()
2007-07-31 10:46:04 +05:00
evgen@moonbone.local
5cd1f992ce Bug#27874: Non-grouped columns are allowed by * in ONLY_FULL_GROUP_BY mode.
When fields are inserted instead of * in the select list they were not marked
for check for the ONLY_FULL_GROUP_BY mode.

The Field_iterator_table::create_item() function now marks newly created
items for check when in the ONLY_FULL_GROUP_BY mode.
The setup_wild() and the insert_fields() functions now maintain the
cur_pos_in_select_list counter for the ONLY_FULL_GROUP_BY mode.
2007-04-24 22:35:57 +04:00
evgen@moonbone.local
19ee0a94fe Bug#23417: Too strict checks against GROUP BY in the ONLY_FULL_GROUP_BY mode.
Currently in the ONLY_FULL_GROUP_BY mode no hidden fields are allowed in the
select list. To ensure this each expression in the select list is checked
to be a constant, an aggregate function or to occur in the GROUP BY list.
The last two requirements are wrong and doesn't allow valid expressions like
"MAX(b) - MIN(b)" or "a + 1" in a query with grouping by a.

The correct check implemented by the patch will ensure that:
any field reference in the [sub]expressions of the select list 
  is under an aggregate function or
  is mentioned as member of the group list or
  is an outer reference or
  is part of the select list element that coincide with a grouping element.

The Item_field objects now can contain the position of the select list
expression which they belong to. The position is saved during the
field's Item_field::fix_fields() call.

The non_agg_fields list for non-aggregated fields is added to the SELECT_LEX
class. The SELECT_LEX::cur_pos_in_select_list now contains the position in the
select list of the expression being currently fixed.
2007-01-11 23:18:01 +03:00
gkodinov/kgeorge@macbook.gmz
dff0a1ac7c Merge macbook.gmz:/Users/kgeorge/mysql/work/B14019-4.1-opt
into  macbook.gmz:/Users/kgeorge/mysql/work/B14019-5.0-opt
2006-10-16 13:24:54 +03:00
gkodinov/kgeorge@macbook.gmz
115616381d BUG#14019 : group by converts literal string to column name
When resolving unqualified name references MySQL was not
   checking what is the item type for the reference. Thus
   e.g a string literal item that has by convention a name
   equal to its string value will also work as a reference to 
   a SELECT list item or a table field.
   Fixed by allowing only Item_ref or Item_field to referenced by
   (unqualified) name.
2006-10-16 13:10:25 +03:00
gkodinov/kgeorge@macbook.local
13633864bb Bug #22781: SQL_BIG_RESULT fails to influence sort plan
Currently SQL_BIG_RESULT is checked only at compile time.
 However, additional optimizations may take place after
 this check that change the sort method from 'filesort'
 to sorting via index. As a result the actual plan
 executed is not the one specified by the SQL_BIG_RESULT
 hint. Similarly, there is no such test when executing
 EXPLAIN, resulting in incorrect output.
 The patch corrects the problem by testing for
 SQL_BIG_RESULT both during the explain and execution
 phases.
2006-10-09 19:51:41 +04:00
gkodinov/kgeorge@macbook.gmz
903387afc0 Bug #21174: Index degrades sort performance and optimizer does not honor IGNORE INDEX
- reversed the patch for 5.0 and moved to 5.1
2006-09-27 12:53:53 +03:00
gkodinov/kgeorge@macbook.gmz
25eaa521bf Bug #21174: Index degrades sort performance and
optimizer does not honor IGNORE INDEX
 - Allow an index to be used for sorting the table 
   instead of filesort only if it is not disabled by
   IGNORE INDEX.
2006-08-14 18:19:29 +03:00
gkodinov/kgeorge@macbook.mshome.net
0282028292 Bug #20466: a view is mixing data when there's a trigger on the table
When making a place to store field values at the start of each group
  the real item (not the reference) must be used when deciding which column
  to copy.
2006-07-21 20:44:35 +03:00
msvensson@neptunus.(none)
e5eb7cbf29 WL#2930 Adding view and cursor 'protocols' to mysqltest
- Cleanup of mysqltest.c before extending it
2005-10-31 12:25:08 +01:00
serg@serg.mylan
3d7844ca89 merged 2005-09-09 12:43:25 +02:00
serg@serg.mylan
f16bb5da7e aftermerge 2005-09-09 12:15:25 +02:00
sergefp@mysql.com
98fee7f289 Merge spetrunia@bk-internal.mysql.com:/home/bk/mysql-5.0
into mysql.com:/home/psergey/mysql-5.0-merge
2005-09-09 12:57:41 +04:00
sergefp@mysql.com
cd813a0911 Post-merge fixes 2005-09-09 12:57:00 +04:00
serg@serg.mylan
b69f49c0d5 Merge bk-internal.mysql.com:/home/bk/mysql-5.0
into serg.mylan:/usr/home/serg/Abk/mysql-5.0
2005-09-09 10:49:09 +02:00
serg@serg.mylan
c7eaac52b3 merged 2005-09-09 09:44:58 +02:00
sergefp@mysql.com
3d6759d190 Merge 4.1->5.0 2005-09-09 10:54:59 +04:00
serg@serg.mylan
a7f2179c29 BUG#12695: Item_func_isnull::update_used_tables did not update const_item_cache 2005-09-08 22:57:27 +02:00
sergefp@mysql.com
e554e61734 Post-merge fixes 2005-08-07 22:10:05 +00:00
sergefp@mysql.com
0dba629a5e Manual merge 2005-08-07 21:30:46 +00:00
evgen@moonbone.local
697836c77f Fix bug#12266 GROUP BY DATE(LEFT(column,8)) returns result strings with reduced
length.

When temporary field created for DATE(LEFT(column,8)) expression, max_length
value is taken from Item_date_typecast, and it is getting it from underlaid
Item_func_left and it's max_length is 8 in given expression. And all this
results in stripping last 2 digits.

To Item_date_typecast class added its own fix_length_and_dec() function 
that sets max_length value to 10, which is proper for DATE field.
2005-08-04 18:05:33 +04:00
monty@mysql.com
15d48525af Merge mysql.com:/home/my/mysql-4.1
into  mysql.com:/home/my/mysql-5.0
2005-07-28 17:09:54 +03:00
monty@mysql.com
3c12d0ae54 Added end marker for tests to make future merges easier 2005-07-28 03:22:47 +03:00
monty@mysql.com
5b8683db74 After merge fixes 2005-07-04 16:01:04 +03:00
monty@mysql.com
fe30ec9032 manual merge 2005-07-04 03:50:04 +03:00
monty@mysql.com
ec420bfb43 Fixes during review of new code
- Mostly indentation fixes
- Added missing test
- Ensure that Item_func_case() checks for stack overruns
- Use real_item() instead of (Item_ref*) item
- Fixed wrong error handling
2005-07-04 03:42:33 +03:00
monty@mysql.com
75ff7d8085 After merge fixes
Better fix for ON DUPLICATE KEY UPDATE
2005-07-04 03:24:25 +03:00
monty@mysql.com
86d7b02199 Merge with 4.1 2005-07-03 14:17:52 +03:00
igor@rurik.mysql.com
be1478f6f9 group_by.result, group_by.test:
Added a test case for bug #11414.
sql_select.cc:
  Fixed bug #11414: crash on Windows with some simple
  GROUP BY queries.
  It happened to an allocation of an array containing
  0 Copy_field elements in setup_copy_fields.
  The bug had been already fixed in 5.0.
2005-06-28 03:18:37 -07:00
msvensson@neptunus.(none)
88c96026af Merge neptunus.(none):/home/msvensson/mysql/mysql-5.0
into neptunus.(none):/home/msvensson/mysql/bug10466
2005-06-27 13:12:10 +02:00
igor@rurik.mysql.com
6a721d03d6 group_by.result, group_by.test:
Correction for the test case of bug #11295 to remove
  warning.
2005-06-21 08:15:49 -07:00
igor@rurik.mysql.com
2104e9e668 group_by.result, group_by.test:
Added a test case for bug #11295.
item_buff.cc:
  Fixed bug #11295.
  This a correction for the patch of bug #11088 that takes into
  account a possible NULL values of the BLOB column.
2005-06-21 04:24:21 -07:00
igor@rurik.mysql.com
acc6651d24 group_by.result:
Added  a test case for bug #11385.
group_by.test:
  Added  a test case for bug #11385.
field.h:
  Fixed bug #11385.
  The bug was due to not defined method decimals for the class
  Field_datetime.
2005-06-20 10:49:04 -07:00
msvensson@neptunus.(none)
6282d89b0a bug#10466: Datatype "timestamp" displays "YYYYMMDDHHMMSS" irrespective of display sizes.
- Print warning that says display width is not supported for datatype TIMESTAMP, if user tries to create a TIMESTAMP column with display width.
 - Use display width for TIMESTAMP only in type_timestamp test to make sure warning is displayed correctly.
2005-06-20 12:09:00 +02:00
igor@rurik.mysql.com
2095758a9d group_by.result, group_by.test:
Added a test case for bug #8614.
sql_select.cc:
  Fixed bug #8614.
  SELECT DISTINCT ... GROUP BY 'const' must be equivalent to
  SELECT ... GROUP BY 'const'.
2005-06-16 09:45:41 -07:00
igor@rurik.mysql.com
90dd86907e sql_select.cc, item_buff.cc, item.h:
Fixed bug #11088: a crash for queries with GROUP BY a BLOB column
  + COUNT(DISTINCT...) due to an attempt to allocate a too large
  buffer for the BLOB field.
  Now the size of the buffer is limited by max_sort_length.
group_by.test, group_by.result:
  Added a test case for bug #11088.
2005-06-07 03:05:57 -07:00
sergefp@mysql.com
9fbdd4e03f Fix for BUG#9298: Make int->string conversion sign-aware in Protocol_simple::store_long 2005-04-18 07:26:23 +04:00
sergefp@mysql.com
70e677bd0f Make the tests deterministic: change DELETE ... LIMIT to DELETE ... ORDER BY ... LIMIT 2005-03-31 20:23:10 +04:00
sergefp@mysql.com
86e3a378ea Fix for BUG#9213: GROUP BY returns wrong query results:
Make test_if_skip_sort_order() rebuild tab->ref if it decides to use an index
different from the index join optimizer has choosen.
2005-03-30 15:57:42 +04:00
monty@mysql.com
79ec81071a Better bugfix for "HAVING when refering to RAND()" (Bug #8216)
Ensure that references in HAVING, ORDER BY or GROUP BY are calculated after fields in SELECT.
This will ensure that any reference to these has a valid value.
Generalized the code for split_sum_func()
2005-02-08 14:41:09 +02:00
monty@mysql.com
32f91f48e8 Fixed bug in HAVING when refering to RAND() through alias
(BUG 8216)
2005-02-07 18:13:57 +02:00
sergefp@mysql.com
2d9fae642c Merge fix for BUG#6976 from 4.0 2004-12-11 20:13:43 +03:00
sergefp@mysql.com
f78a60593a Fix for BUG#6976:
In Item_ref::Item_ref set maybe_null (and other fields fix_fields sets) to be the 
same as in (*ref), because Item_ref::fix_fields() will not be called.  Previously 
maybe_null was 0 always and this produced a bogus state where 
maybe_null==0 && is_null() == true 
which broke evaluation for some upper-level Items, like AND and OR.
2004-12-11 19:59:09 +03:00