Loading mysql-test/r/order_by.result +84 −0 Original line number Diff line number Diff line Loading @@ -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; mysql-test/t/order_by.test +35 −0 Original line number Diff line number Diff line Loading @@ -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 sql/item_cmpfunc.cc +20 −0 Original line number Diff line number Diff line Loading @@ -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) Loading sql/item_cmpfunc.h +1 −0 Original line number Diff line number Diff line Loading @@ -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; }; Loading Loading
mysql-test/r/order_by.result +84 −0 Original line number Diff line number Diff line Loading @@ -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;
mysql-test/t/order_by.test +35 −0 Original line number Diff line number Diff line Loading @@ -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
sql/item_cmpfunc.cc +20 −0 Original line number Diff line number Diff line Loading @@ -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) Loading
sql/item_cmpfunc.h +1 −0 Original line number Diff line number Diff line Loading @@ -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; }; Loading