Commit e77860b7 authored by unknown's avatar unknown

Merge rurik.mysql.com:/home/igor/mysql-5.0

into rurik.mysql.com:/home/igor/dev/mysql-5.0-0


sql/item.h:
  Auto merged
sql/sql_select.cc:
  Auto merged
parents 88538066 d85fdc1b
...@@ -2746,3 +2746,38 @@ NULL ...@@ -2746,3 +2746,38 @@ NULL
2.00 2.00
4.00 4.00
drop table t1; drop table t1;
CREATE table t1 ( c1 integer );
INSERT INTO t1 VALUES ( 1 );
INSERT INTO t1 VALUES ( 2 );
INSERT INTO t1 VALUES ( 3 );
CREATE TABLE t2 ( c2 integer );
INSERT INTO t2 VALUES ( 1 );
INSERT INTO t2 VALUES ( 4 );
INSERT INTO t2 VALUES ( 5 );
SELECT * FROM t1 LEFT JOIN t2 ON c1 = c2 WHERE c2 IN (1);
c1 c2
1 1
SELECT * FROM t1 LEFT JOIN t2 ON c1 = c2
WHERE c2 IN ( SELECT c2 FROM t2 WHERE c2 IN ( 1 ) );
c1 c2
1 1
DROP TABLE t1,t2;
CREATE TABLE t1 ( c1 integer );
INSERT INTO t1 VALUES ( 1 );
INSERT INTO t1 VALUES ( 2 );
INSERT INTO t1 VALUES ( 3 );
INSERT INTO t1 VALUES ( 6 );
CREATE TABLE t2 ( c2 integer );
INSERT INTO t2 VALUES ( 1 );
INSERT INTO t2 VALUES ( 4 );
INSERT INTO t2 VALUES ( 5 );
INSERT INTO t2 VALUES ( 6 );
CREATE TABLE t3 ( c3 integer );
INSERT INTO t3 VALUES ( 7 );
INSERT INTO t3 VALUES ( 8 );
SELECT c1,c2 FROM t1 LEFT JOIN t2 ON c1 = c2
WHERE EXISTS (SELECT c3 FROM t3 WHERE c2 IS NULL );
c1 c2
2 NULL
3 NULL
DROP TABLE t1,t2,t3;
...@@ -1752,3 +1752,50 @@ insert into t1 values (1, 1), (2, 2), (2, 3), (3, 4), (3, 5), (3, 6), (NULL, NUL ...@@ -1752,3 +1752,50 @@ insert into t1 values (1, 1), (2, 2), (2, 3), (3, 4), (3, 5), (3, 6), (NULL, NUL
select * from t1; select * from t1;
select min(a) from t1 group by grp; select min(a) from t1 group by grp;
drop table t1; drop table t1;
#
# Test for bug #9338: lame substitution of c1 instead of c2
#
CREATE table t1 ( c1 integer );
INSERT INTO t1 VALUES ( 1 );
INSERT INTO t1 VALUES ( 2 );
INSERT INTO t1 VALUES ( 3 );
CREATE TABLE t2 ( c2 integer );
INSERT INTO t2 VALUES ( 1 );
INSERT INTO t2 VALUES ( 4 );
INSERT INTO t2 VALUES ( 5 );
SELECT * FROM t1 LEFT JOIN t2 ON c1 = c2 WHERE c2 IN (1);
SELECT * FROM t1 LEFT JOIN t2 ON c1 = c2
WHERE c2 IN ( SELECT c2 FROM t2 WHERE c2 IN ( 1 ) );
DROP TABLE t1,t2;
#
# Test for bug #9516: wrong evaluation of not_null_tables attribute in SQ
#
CREATE TABLE t1 ( c1 integer );
INSERT INTO t1 VALUES ( 1 );
INSERT INTO t1 VALUES ( 2 );
INSERT INTO t1 VALUES ( 3 );
INSERT INTO t1 VALUES ( 6 );
CREATE TABLE t2 ( c2 integer );
INSERT INTO t2 VALUES ( 1 );
INSERT INTO t2 VALUES ( 4 );
INSERT INTO t2 VALUES ( 5 );
INSERT INTO t2 VALUES ( 6 );
CREATE TABLE t3 ( c3 integer );
INSERT INTO t3 VALUES ( 7 );
INSERT INTO t3 VALUES ( 8 );
SELECT c1,c2 FROM t1 LEFT JOIN t2 ON c1 = c2
WHERE EXISTS (SELECT c3 FROM t3 WHERE c2 IS NULL );
DROP TABLE t1,t2,t3;
...@@ -2978,41 +2978,38 @@ Item *Item_field::set_no_const_sub(byte *arg) ...@@ -2978,41 +2978,38 @@ Item *Item_field::set_no_const_sub(byte *arg)
/* /*
Set a pointer to the multiple equality the field reference belongs to Replace an Item_field for an equal Item_field that evaluated earlier
(if any) (if any)
SYNOPSIS SYNOPSIS
replace_equal_field_processor() replace_equal_field_()
arg - a dummy parameter, is not used here arg - a dummy parameter, is not used here
DESCRIPTION DESCRIPTION
The function replaces a pointer to a field in the Item_field object The function returns a pointer to an item that is taken from
by a pointer to another field. the very beginning of the item_equal list which the Item_field
The replacement field is taken from the very beginning of object refers to (belongs to).
the item_equal list which the Item_field object refers to (belongs to) If the Item_field object does not refer any Item_equal object
If the Item_field object does not refer any Item_equal object, 'this' is returned
nothing is done.
NOTES NOTES
This function is supposed to be called as a callback parameter in calls This function is supposed to be called as a callback parameter in calls
of the walk method. of the thransformer method.
RETURN VALUES RETURN VALUES
0 pointer to a replacement Item_field if there is a better equal item;
this - otherwise.
*/ */
bool Item_field::replace_equal_field_processor(byte *arg) Item *Item_field::replace_equal_field(byte *arg)
{ {
if (item_equal) if (item_equal)
{ {
Item_field *subst= item_equal->get_first(); Item_field *subst= item_equal->get_first();
if (!field->eq(subst->field)) if (!field->eq(subst->field))
{ return subst;
field= subst->field;
return 0;
}
} }
return 0; return this;
} }
......
...@@ -520,7 +520,7 @@ class Item { ...@@ -520,7 +520,7 @@ class Item {
virtual bool collect_item_field_processor(byte * arg) { return 0; } virtual bool collect_item_field_processor(byte * arg) { return 0; }
virtual Item *equal_fields_propagator(byte * arg) { return this; } virtual Item *equal_fields_propagator(byte * arg) { return this; }
virtual Item *set_no_const_sub(byte *arg) { return this; } virtual Item *set_no_const_sub(byte *arg) { return this; }
virtual bool replace_equal_field_processor(byte * arg) { return 0; } virtual Item *replace_equal_field(byte * arg) { return this; }
virtual Item *this_item() { return this; } /* For SPs mostly. */ virtual Item *this_item() { return this; } /* For SPs mostly. */
virtual Item *this_const_item() const { return const_cast<Item*>(this); } /* For SPs mostly. */ virtual Item *this_const_item() const { return const_cast<Item*>(this); } /* For SPs mostly. */
...@@ -754,7 +754,7 @@ class Item_field :public Item_ident ...@@ -754,7 +754,7 @@ class Item_field :public Item_ident
Item_equal *find_item_equal(COND_EQUAL *cond_equal); Item_equal *find_item_equal(COND_EQUAL *cond_equal);
Item *equal_fields_propagator(byte *arg); Item *equal_fields_propagator(byte *arg);
Item *set_no_const_sub(byte *arg); Item *set_no_const_sub(byte *arg);
bool replace_equal_field_processor(byte *arg); Item *replace_equal_field(byte *arg);
inline uint32 max_disp_length() { return field->max_length(); } inline uint32 max_disp_length() { return field->max_length(); }
Item_field *filed_for_view_update() { return this; } Item_field *filed_for_view_update() { return this; }
Item *safe_charset_converter(CHARSET_INFO *tocs); Item *safe_charset_converter(CHARSET_INFO *tocs);
......
...@@ -96,6 +96,7 @@ class Item_subselect :public Item_result_field ...@@ -96,6 +96,7 @@ class Item_subselect :public Item_result_field
virtual bool exec(); virtual bool exec();
virtual void fix_length_and_dec(); virtual void fix_length_and_dec();
table_map used_tables() const; table_map used_tables() const;
table_map not_null_tables() const { return 0; }
bool const_item() const; bool const_item() const;
inline table_map get_used_tables_cache() { return used_tables_cache; } inline table_map get_used_tables_cache() { return used_tables_cache; }
inline bool get_const_item_cache() { return const_item_cache; } inline bool get_const_item_cache() { return const_item_cache; }
......
...@@ -7054,7 +7054,7 @@ static COND* substitute_for_best_equal_field(COND *cond, ...@@ -7054,7 +7054,7 @@ static COND* substitute_for_best_equal_field(COND *cond,
return eliminate_item_equal(0, cond_equal, item_equal); return eliminate_item_equal(0, cond_equal, item_equal);
} }
else else
cond->walk(&Item::replace_equal_field_processor, 0); cond->transform(&Item::replace_equal_field, 0);
return cond; return cond;
} }
......
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