Commit c74c8195 authored by unknown's avatar unknown
Browse files

Bug #16255: Subquery in WHERE (the cset by Georgi Kodinov)

 Must not use Item_direct_ref in HAVING because it points to
 the new value (witch is not yet calculated for the first row).


mysql-test/r/subselect.result:
  Bug #16255: Subquery in where
   - test case
mysql-test/t/subselect.test:
  Bug #16255: Subquery in where
   - test case
sql/item_subselect.cc:
  Bug #16255: Subquery in where
   Must not use Item_direct_ref in HAVING because it points to
   the new value (witch is not yet calculated for the first row).
parent 9907e970
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -2895,3 +2895,14 @@ select * from t1 where NOT(s1 = ALL (select s1/s1 from t1));
s1
2
drop table t1;
CREATE TABLE t1 (a INT, b INT, PRIMARY KEY (a,b));
INSERT INTO t1 VALUES(26, 1), (48, 2);
SELECT * FROM t1 r WHERE (r.a,r.b) IN (SELECT a,MAX(b) FROM t1 GROUP BY a);
a	b
26	1
48	2
SELECT * FROM t1 r WHERE (r.a,r.b) IN (SELECT a + 0,MAX(b) FROM t1 GROUP BY a);
a	b
26	1
48	2
DROP TABLE t1;
+12 −0
Original line number Diff line number Diff line
@@ -1861,4 +1861,16 @@ select * from t1 where NOT(s1+1 = ANY (select s1 from t1));
select * from t1 where (s1 = ALL (select s1/s1 from t1));
select * from t1 where NOT(s1 = ALL (select s1/s1 from t1));
drop table t1;

#
# Bug #16255: Subquery in where
#
CREATE TABLE t1 (a INT, b INT, PRIMARY KEY (a,b));

INSERT INTO t1 VALUES(26, 1), (48, 2);

SELECT * FROM t1 r WHERE (r.a,r.b) IN (SELECT a,MAX(b) FROM t1 GROUP BY a);
SELECT * FROM t1 r WHERE (r.a,r.b) IN (SELECT a + 0,MAX(b) FROM t1 GROUP BY a);

DROP TABLE t1;
# End of 4.1 tests
+5 −5
Original line number Diff line number Diff line
@@ -976,18 +976,18 @@ Item_in_subselect::row_value_transformer(JOIN *join)
        DBUG_RETURN(RES_ERROR);
      Item *item_eq=
        new Item_func_eq(new
                         Item_direct_ref((*optimizer->get_cache())->
                         Item_ref((*optimizer->get_cache())->
                                         addr(i),
                                         (char *)"<no matter>",
                                         (char *)in_left_expr_name),
                         new
                         Item_direct_ref(select_lex->ref_pointer_array + i,
                         Item_ref(select_lex->ref_pointer_array + i,
                                         (char *)"<no matter>",
                                         (char *)"<list ref>")
                        );
      Item *item_isnull=
        new Item_func_isnull(new
                             Item_direct_ref( select_lex->
                             Item_ref( select_lex->
                                              ref_pointer_array+i,
                                              (char *)"<no matter>",
                                              (char *)"<list ref>")
@@ -1000,7 +1000,7 @@ Item_in_subselect::row_value_transformer(JOIN *join)
                  new
                  Item_is_not_null_test(this,
                                        new
                                        Item_direct_ref(select_lex->
                                        Item_ref(select_lex->
                                                        ref_pointer_array + i,
                                                        (char *)"<no matter>",
                                                        (char *)"<list ref>")
@@ -1057,7 +1057,7 @@ Item_in_subselect::row_value_transformer(JOIN *join)
                    new
                    Item_is_not_null_test(this,
                                          new
                                          Item_direct_ref(select_lex->
                                          Item_ref(select_lex->
                                                          ref_pointer_array + i,
                                                          (char *)"<no matter>",
                                                          (char *)"<list ref>")