Commit 2911bcd8 authored by unknown's avatar unknown
Browse files

Merge bk@192.168.21.1:mysql-4.1

into  mysql.com:/d2/hf/mrg/mysql-4.1-opt

parents 96d879cb e488e6f2
Loading
Loading
Loading
Loading
+84 −0
Original line number Diff line number Diff line
@@ -879,3 +879,87 @@ ERROR 23000: Column 'val' in order clause is ambiguous
SELECT p.a AS val, q.a AS val FROM t1 p, t1 q ORDER BY val > 1;
ERROR 23000: Column 'val' in order clause is ambiguous
DROP TABLE t1;
CREATE TABLE t1 (a int);
INSERT INTO t1 VALUES (3), (2), (4), (1);
SELECT a, IF(a IN (2,3), a, a+10) FROM t1
ORDER BY IF(a IN (2,3), a, a+10);
a	IF(a IN (2,3), a, a+10)
2	2
3	3
1	11
4	14
SELECT a, IF(a NOT IN (2,3), a, a+10) FROM t1 
ORDER BY IF(a NOT IN (2,3), a, a+10);
a	IF(a NOT IN (2,3), a, a+10)
1	1
4	4
2	12
3	13
SELECT a, IF(a IN (2,3), a, a+10) FROM t1 
ORDER BY IF(a NOT IN (2,3), a, a+10);
a	IF(a IN (2,3), a, a+10)
1	11
4	14
2	2
3	3
SELECT a, IF(a BETWEEN 2 AND 3, a, a+10) FROM t1
ORDER BY IF(a BETWEEN 2 AND 3, a, a+10);
a	IF(a BETWEEN 2 AND 3, a, a+10)
2	2
3	3
1	11
4	14
SELECT a, IF(a NOT BETWEEN 2 AND 3, a, a+10) FROM t1 
ORDER BY IF(a NOT BETWEEN 2 AND 3, a, a+10);
a	IF(a NOT BETWEEN 2 AND 3, a, a+10)
1	1
4	4
2	12
3	13
SELECT a, IF(a BETWEEN 2 AND 3, a, a+10) FROM t1 
ORDER BY IF(a NOT BETWEEN 2 AND 3, a, a+10);
a	IF(a BETWEEN 2 AND 3, a, a+10)
1	11
4	14
2	2
3	3
SELECT IF(a IN (1,2), a, '') as x1, IF(a NOT IN (1,2), a, '') as x2
FROM t1 GROUP BY x1, x2;
x1	x2
	3
	4
1	
2	
SELECT IF(a IN (1,2), a, '') as x1, IF(a NOT IN (1,2), a, '') as x2
FROM t1 GROUP BY x1, IF(a NOT IN (1,2), a, '');
x1	x2
	3
	4
1	
2	
SELECT a, a IN (1,2) FROM t1 ORDER BY a IN (1,2);
a	a IN (1,2)
3	0
4	0
2	1
1	1
SELECT a FROM t1 ORDER BY a IN (1,2);
a
3
4
2
1
SELECT a+10 FROM t1 ORDER BY a IN (1,2);
a+10
13
14
12
11
SELECT a, IF(a IN (1,2), a, a+10) FROM t1
ORDER BY IF(a IN (3,4), a, a+10);
a	IF(a IN (1,2), a, a+10)
3	13
4	14
1	1
2	2
DROP TABLE t1;
+35 −0
Original line number Diff line number Diff line
@@ -619,4 +619,39 @@ SELECT p.a AS val, q.a AS val FROM t1 p, t1 q ORDER BY val > 1;

DROP TABLE t1;

#
# Bug #27532: ORDER/GROUP BY expressions with IN/BETWEEN and NOT IN/BETWEEN
#                          

CREATE TABLE t1 (a int);
INSERT INTO t1 VALUES (3), (2), (4), (1);

SELECT a, IF(a IN (2,3), a, a+10) FROM t1
  ORDER BY IF(a IN (2,3), a, a+10);
SELECT a, IF(a NOT IN (2,3), a, a+10) FROM t1 
  ORDER BY IF(a NOT IN (2,3), a, a+10);
SELECT a, IF(a IN (2,3), a, a+10) FROM t1 
  ORDER BY IF(a NOT IN (2,3), a, a+10);

SELECT a, IF(a BETWEEN 2 AND 3, a, a+10) FROM t1
  ORDER BY IF(a BETWEEN 2 AND 3, a, a+10);
SELECT a, IF(a NOT BETWEEN 2 AND 3, a, a+10) FROM t1 
  ORDER BY IF(a NOT BETWEEN 2 AND 3, a, a+10);
SELECT a, IF(a BETWEEN 2 AND 3, a, a+10) FROM t1 
  ORDER BY IF(a NOT BETWEEN 2 AND 3, a, a+10);

SELECT IF(a IN (1,2), a, '') as x1, IF(a NOT IN (1,2), a, '') as x2
  FROM t1 GROUP BY x1, x2;
SELECT IF(a IN (1,2), a, '') as x1, IF(a NOT IN (1,2), a, '') as x2
  FROM t1 GROUP BY x1, IF(a NOT IN (1,2), a, '');

# The remaining queries are for better coverage
SELECT a, a IN (1,2) FROM t1 ORDER BY a IN (1,2);
SELECT a FROM t1 ORDER BY a IN (1,2);
SELECT a+10 FROM t1 ORDER BY a IN (1,2);
SELECT a, IF(a IN (1,2), a, a+10) FROM t1
  ORDER BY IF(a IN (3,4), a, a+10);   

DROP TABLE t1;

# End of 4.1 tests
+20 −0
Original line number Diff line number Diff line
@@ -838,6 +838,26 @@ longlong Item_func_strcmp::val_int()
}


bool Item_func_opt_neg::eq(const Item *item, bool binary_cmp) const
{
  /* Assume we don't have rtti */
  if (this == item)
    return 1;
  if (item->type() != FUNC_ITEM)
    return 0;
  Item_func *item_func=(Item_func*) item;
  if (arg_count != item_func->arg_count ||
      functype() != item_func->functype())
    return 0;
  if (negated != ((Item_func_opt_neg *) item_func)->negated)
    return 0;
  for (uint i=0; i < arg_count ; i++)
    if (!args[i]->eq(item_func->arguments()[i], binary_cmp))
      return 0;
  return 1;
}


void Item_func_interval::fix_length_and_dec()
{
  if (row->cols() > 8)
+1 −0
Original line number Diff line number Diff line
@@ -405,6 +405,7 @@ class Item_func_opt_neg :public Item_int_func
    negated= !negated;
    return this;
  }
  bool eq(const Item *item, bool binary_cmp) const;
};