mirror of
https://github.com/MariaDB/server.git
synced 2025-02-01 03:21:53 +01:00
Merge bk-internal.mysql.com:/home/bk/mysql-5.0
into mishka.local:/home/my/mysql-5.0
This commit is contained in:
commit
571ee3c8f0
6 changed files with 99 additions and 19 deletions
|
@ -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
|
||||||
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;
|
||||||
|
|
||||||
|
|
29
sql/item.cc
29
sql/item.cc
|
@ -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 this;
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -520,7 +520,7 @@ public:
|
||||||
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 @@ public:
|
||||||
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 @@ public:
|
||||||
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,
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue