Commit graph

344 commits

Author SHA1 Message Date
evgen@moonbone.local
363d14569e Merge epotemkin@bk-internal.mysql.com:/home/bk/mysql-4.1-opt
into  moonbone.local:/work/16302-bug-4.1-opt-mysql
2006-07-12 06:12:59 +04:00
evgen@moonbone.local
8ffda481c9 Fixed bug#18503: Queries with a quantified subquery returning empty set
may return a wrong result.

An Item_sum_hybrid object has the was_values flag which indicates whether any
values were added to the sum function. By default it is set to true and reset
to false on any no_rows_in_result() call. This method is called only in
return_zero_rows() function. An ALL/ANY subquery can be optimized by MIN/MAX
optimization. The was_values flag is used to indicate whether the subquery
has returned at least one row. This bug occurs because return_zero_rows() is
called only when we know that the select will return zero rows before
starting any scans but often such information is not known.
In the reported case the return_zero_rows() function is not called and
the was_values flag is not reset to false and yet the subquery return no rows
Item_func_not_all and Item_func_nop_all functions return a wrong
comparison result.

The end_send_group() function now calls no_rows_in_result() for each item
in the fields_list if there is no rows were found for the (sub)query.
2006-07-12 01:52:18 +04:00
evgen@moonbone.local
d34189715e Fixed bug#16302: Quantified subquery without any tables gives wrong results
The ALL/ANY subqueries are the subject of MIN/MAX optimization. The matter
of this optimization is to embed MIN() or MAX() function into the subquery
in order to get only one row by which we can tell whether the expression
with ALL/ANY subquery is true or false.
But when it is applied to a subquery like 'select a_constant' the reported bug
occurs. As no tables are specified in the subquery the do_select() function 
isn't called for the optimized subquery and thus no values have been added 
to a MIN()/MAX() function and it returns NULL instead of a_constant.
This leads to a wrong query result.

For the subquery like 'select a_constant' there is no reason to apply
MIN/MAX optimization because the subquery anyway will return at most one row.
Thus the Item_maxmin_subselect class is more appropriate for handling such
subqueries.

The Item_in_subselect::single_value_transformer() function now checks
whether tables are specified for the subquery. If no then this subselect is
handled like a UNION using an Item_maxmin_subselect object.
2006-07-11 00:34:37 +04:00
gkodinov@lsmy3.wdf.sap.corp
ca79343359 BUG#18492: mysqld reports ER_ILLEGAL_REFERENCE in --ps-protocol
In the code that converts IN predicates to EXISTS predicates it is changing
the select list elements to constant 1. Example :
SELECT ... FROM ...  WHERE a IN (SELECT c FROM ...)
is transformed to :
SELECT ... FROM ... WHERE EXISTS (SELECT 1 FROM ...  HAVING a = c)
However there can be no FROM clause in the IN subquery and it may not be
a simple select : SELECT ... FROM ... WHERE a IN (SELECT f(..) AS
c UNION SELECT ...) This query is transformed to : SELECT ... FROM ...
WHERE EXISTS (SELECT 1 FROM (SELECT f(..) AS c UNION SELECT ...)
x HAVING a = c) In the above query c in the HAVING clause is made to be
an Item_null_helper (a subclass of Item_ref) pointing to the real
Item_field (which is not referenced anywhere else in the query anymore).
This is done because Item_ref_null_helper collects information whether
there are NULL values in the result.  This is OK for directly executed
statements, because the Item_field pointed by the Item_null_helper is
already fixed when the transformation is done.  But when executed as
a prepared statement all the Item instances are "un-fixed" before the
recompilation of the prepared statement. So when the Item_null_helper
gets fixed it discovers that the Item_field it points to is not fixed
and issues an error.  The remedy is to keep the original select list
references when there are no tables in the FROM clause. So the above
becomes : SELECT ... FROM ...  WHERE EXISTS (SELECT c FROM (SELECT f(..)
AS c UNION SELECT ...) x HAVING a = c) In this way c is referenced
directly in the select list as well as by reference in the HAVING
clause. So it gets correctly fixed even with prepared statements.  And
since the Item_null_helper subclass of Item_ref_null_helper is not used
anywhere else it's taken out.
2006-04-28 11:23:31 +02:00
hf@deer.(none)
ba82a6a759 Fix for bug #9855 (Inconsistend column type in create select) 2005-10-15 19:47:23 +05:00
grog@mysql.com
c248a36e30 sql_yacc.yy:
Bug #10308: Parse 'purge master logs' with subselect correctly.
subselect.test:
  Bug #10308: Test for 'purge master logs' with subselect.
subselect.result:
  Bug #10308: Test result for 'purge master logs' with subselect.
2005-10-12 09:47:59 +02:00
igor@rurik.mysql.com
d553e16518 subselect.result:
Added missing drop statement
subselect.test:
  Added missing drop statement.
2005-08-15 21:43:46 -07:00
igor@rurik.mysql.com
9693dc6a6b sql_select.cc:
Fixed bug #11479.
  The JOIN::reinit method cannot call setup_tables
  after the optimization phase since this function
  removes some optimization settings for joined
  tables. E.g. it resets values of the null_row flag to 0.
subselect.result, subselect.test:
  Added a test case for bug #11479.
2005-08-15 21:33:58 -07:00
bell@50.0.168.192.in-addr.arpa
1e248ceaf1 fixed convertion and handling IN subqueries with rows (BUG#11867) 2005-08-13 07:45:14 +03:00
igor@rurik.mysql.com
253883803b Merge rurik.mysql.com:/home/igor/mysql-4.1
into rurik.mysql.com:/home/igor/dev/mysql-4.1-0
2005-08-08 16:55:29 -07:00
igor@rurik.mysql.com
73be194f96 subselect.test, subselect.result:
Added a test case for bug #12392.
item_cmpfunc.cc:
  Fixed bug #12392.
  Missing handling of rows containing NULL components
  when evaluating IN predicates caused a crash.
2005-08-08 16:51:12 -07:00
monty@mysql.com
99cb083549 Review of new pushed code
- Fixed some error condtion when handling dates with 'T'
- Added extra test for bug #11867 (Wrong result with "... WHERE ROW( a, b ) IN ( SELECT DISTINCT a, b WHERE ...)" to show it's not yet fixed
- Safety fixes and cleanups
2005-08-09 00:13:49 +03:00
igor@rurik.mysql.com
b2a189ab07 subselect.result:
Added test case for bug #11867.
  Fixed results for two existing test cases.
subselect.test:
  Added test case for bug #11867.
item_subselect.cc:
  Fixed bug #11867.
  Added missing code in Item_in_subselect::row_value_transformer
  that caused problems for queries with
  ROW(elems) IN (SELECT DISTINCT cols FROM ...).
2005-08-07 14:03:46 -07:00
sergefp@mysql.com
55e70fd1f6 Fix for BUG#11821: Make Item_type_holder be able to work with MIN(field),
MAX(field).
2005-07-12 16:30:45 +00:00
bell@book.sanja.is.com.ua
1ff9f55920 relaxed DBUG_ASSERT in Item_int_with_ref::new_item() to "any constant" (BUG#10020) 2005-05-16 12:19:10 +03:00
bell@sanja.is.com.ua
4fdb0f48e7 postreview changes
fixed bug in IN/ALL/ANY subqeries with HAVING clause (BUG#9350)
2005-03-30 10:07:08 +03:00
bell@sanja.is.com.ua
056d5a3934 fixed left expression of IN/ALL/ANY subquery transformation support (BUG#8888) 2005-03-10 14:01:22 +02:00
sergefp@mysql.com
c30f7feba1 Merge spetrunia@bk-internal.mysql.com:/home/bk/mysql-4.1
into mysql.com:/home/psergey/mysql-4.1-bug8218
2005-02-14 23:49:01 +03:00
sergefp@mysql.com
021f9849ef Remove redundant DROP TABLE from test case 2005-02-14 23:45:48 +03:00
sergefp@mysql.com
c0c50efdef Fix for BUG#8218:
Remove TMP_TABLE_PARAM::copy_funcs_it. TMP_TABLE_PARAM is a member of JOIN which is 
copied via memcpy, and List_iterator_fast TMP_TABLE_PARAM::copy_funcs_it ends up 
pointing to the wrong List.
2005-02-12 22:58:54 +03:00
bell@sanja.is.com.ua
90c0024217 reverted patch for BUG#7351 (because of performance ussie) 2005-02-09 21:08:08 +02:00
bell@sanja.is.com.ua
1853c2fe89 fixed test 'subselect' in case when innodb is not compiled in (thanks HF who niticed it) 2005-02-06 13:06:12 +02:00
bell@sanja.is.com.ua
0bf6e3aefc fixed cleanup of result object of subqueries. (BUG#8125) 2005-01-26 15:27:45 +02:00
bell@sanja.is.com.ua
6d71acf01e fixed way of forward reference detection to support literal constant (BUG#8025) 2005-01-24 17:17:19 +02:00
bell@sanja.is.com.ua
2371c992de check that row elements have the same dimention that SELECT list elements in comporison between rows and subqueries added (BUG#8022) 2005-01-24 15:56:57 +02:00
bell@sanja.is.com.ua
76ae5caca0 fixed column number fetchinmg for subqueries. (BUG#8020)
fixed cols() method call (it have to be called only after fix_fields())
2005-01-24 14:25:44 +02:00
sergefp@mysql.com
b1d55200b1 Fix for BUG#7885 2005-01-18 17:26:05 +03:00
igor@rurik.mysql.com
04974868a1 subselect.result, subselect.test:
Added a couple of new test cases for bug #7351.
2004-12-26 02:04:40 -08:00
igor@rurik.mysql.com
d3fa245363 subselect.result, subselect.test:
Added test cases for bug #7351.
item_cmpfunc.cc:
  Fixed bug #7351: incorrect result for a query with a
  subquery returning empty set.
  If in the predicate v IN (SELECT a FROM t WHERE cond)
  v is null, then the result of the predicate is either
  INKNOWN or FALSE. It is FALSE if the subquery returns
  an empty set.
item_subselect.cc:
  Fixed bug #7351: incorrect result for a query with a
  subquery returning empty set.
  The problem was due to not a quite legal transformation
  for 'IN' subqueries. A subquery containing a predicate
  of the form
  v IN (SELECT a FROM t WHERE cond)
  was transformed into
  EXISTS(SELECT a FROM t WHERE cond AND (a=v OR a IS NULL)).
  Yet, this transformation is valid only if v is not null.
  If v is null, then, in the case when
  (SELECT a FROM t WHERE cond) returns an empty set the value
  of the predicate is FALSE, otherwise the result of the
  predicate is INKNOWN.
  The fix resolves this problem by changing the result
  of the transformation to
  EXISTS(SELECT a FROM t WHERE cond AND (v IS NULL OR (a=v OR a IS NULL)))
  in the case when v is nullable.
  The new transformation prevents applying the lookup
  optimization for IN subqueries. To make it still
  applicable we have to introduce guarded access methods.
2004-12-25 19:17:57 -08:00
ram@gw.mysql.r18.ru
d599808fbc Clean-up.
TYPE=MyISAM replaced with ENGINE=MyISAM.
2004-12-14 18:47:34 +04:00
bell@sanja.is.com.ua
f65403cd75 fixed optimized SOME subquery 2004-12-13 01:21:14 +02:00
bell@sanja.is.com.ua
b9abf25a55 new reference which refer to current value not to result used for resolving outer
refernces if subqueri is not in HAVING clause (BUG#7079)
  and the same used for subquery transformetion
2004-12-11 17:13:19 +02:00
bell@sanja.is.com.ua
b218560604 merge 2004-12-07 09:07:37 +02:00
bell@sanja.is.com.ua
a3ad1765a8 merge 2004-12-03 23:24:41 +02:00
bell@sanja.is.com.ua
4c017d18e2 Merge 2004-12-01 10:25:11 +02:00
bell@sanja.is.com.ua
3c108b2a84 init values to avoid junk returning in case of null value asking without assigning value (BUG#6806) 2004-11-25 22:54:49 +02:00
dlenev@brandersnatch.localdomain
c37977c87d Fix for bug #6462 "Same request on same data returns different
results." a.k.a. "Proper cleanup of subqueries is missing for SET and DO
statements". (Version #2 with after-review fixes).

To perform proper cleanup for statements that can contain subqueries 
but don't have main select we must call free_undelaid_joins().
2004-11-22 13:05:10 +03:00
bell@sanja.is.com.ua
f5e253dc2f reporting empty result added in case of max/min optimisation of ALL/ANY/SOME subqueries
fixed null processing in NOT operation used in ALL subquery (Bug #6247)
2004-11-18 18:10:07 +02:00
bell@sanja.is.com.ua
bc5a9111d7 backport Serg's fix of FT interface (BUG#6523) 2004-11-16 22:58:02 +02:00
bell@sanja.is.com.ua
27395a2fb1 fixed joincleunup to avoid double deletin tables, and too earlyfull cleanup in case of EXPLAIN
fixed cleunup of TMP_TABLE_PARAM
(BUG#6406)
2004-11-16 00:16:04 +02:00
bell@sanja.is.com.ua
77540c8996 moved procedure list initialization (BUG#6517) 2004-11-15 14:37:40 +02:00
bell@sanja.is.com.ua
3ae044c24f removed incorrect error message about aggregate functions
improved mechanisn of detection posibility to be NULL for single row queries
switched off substitution optimisation for single row subqueries in PS due to problem in resolving substituted expressions
(changes to make subselects test working with PS protocol)
2004-10-27 21:11:06 +03:00
konstantin@mysql.com
e3abcb6b53 A fix and test case for Bug#6088 "FOUND_ROWS returns wrong values for
prepared statements when LIMIT is used" and post-review comments.
The fix changes the approach we calculate the need for ORDER BY 
in UNION: the previous was not PS friendly, as it damaged SELECT_LEX 
options in case of single select.
2004-10-22 22:51:16 +04:00
bell@sanja.is.com.ua
f11bcefae1 fixed error handling if creating derived table failed
single row subquery always can return NULL (no rows found) (BUG#5590)
2004-09-17 19:08:46 +03:00
bell@sanja.is.com.ua
5d42c492d6 fixed temporary table processing expresions of subqueries and removed wrong restrictions of field resolving (BUG#5326) 2004-09-06 13:00:24 +03:00
hf@deer.(none)
cce03195dc Merging fix 2004-08-24 15:03:44 +05:00
hf@deer.(none)
43a853dd4d Merging 2004-08-24 12:58:21 +05:00
bell@sanja.is.com.ua
9d71f85121 subselect test split on two tests because gis extention can be absent 2004-08-24 10:15:39 +03:00
bell@sanja.is.com.ua
6fcd27e9cd after review fixes:
allowed parsing of table fields inside aggregate functions
 added new tests of fields resolving in grouping
2004-08-23 22:31:01 +03:00
bell@sanja.is.com.ua
3ca433e332 merge 2004-08-23 15:50:59 +03:00