Чудеса MySQL
От: Somescout  
Дата: 28.07.15 02:54
Оценка:
Здравствуйте.

Чёрт когда-то дёрнул связаться с MySQL (5.5.41-MariaDB), теперь пожинаю последствия. Есть такой запрос, он был сгенерирован провайдером MySQL EF, и упрощён мной для лучшей демонстрации:
select
  k.c1 as c2,
  k.c2 as c1
  from (
    select users.user_id as c1,
    1 as c2
    from users
  ) as k
  order by k.c1 desc

Колонки во внешнем селекте называются также как и во внутреннем, в order by явно указана колонка из внутреннего селекта. Тем не менее сортировка происходит по внешнему, т.е. по c1 = k.c2 = 1.
MS SQL ведёт себя ожидаемо (выводит user_id в обратном порядке), а тут какая-то очередная причуда.

Есть этому какое-то объяснение (с точки зрения MySQL), или это просто очередной баг мускула?

UPD. Вопрос снимается: если колонки переименовать то всё работает как надо, так что однозначно баг MariaDB.
ARI ARI ARI... Arrivederci!
Отредактировано 28.07.2015 16:39 Somescout . Предыдущая версия . Еще …
Отредактировано 28.07.2015 2:57 Somescout . Предыдущая версия .
Re: Чудеса MySQL
От: wildwind Россия  
Дата: 28.07.15 05:30
Оценка: -1
Здравствуйте, Somescout, Вы писали:

S> Колонки во внешнем селекте называются также как и во внутреннем, в order by явно указана колонка из внутреннего селекта.


Это как понимать? Колонка k.c1 — как раз из внешнего, во внутреннем алиас таблицы — "users". Да и нельзя в order by ссылаться на колонки из внутреннего — это синтаксически неверно.

S> Тем не менее сортировка происходит по внешнему, т.е. по c1 = k.c2 = 1.


Как указано, так и происходит.

S> MS SQL ведёт себя ожидаемо (выводит user_id в обратном порядке), а тут какая-то очередная причуда.


Бесполезно ожидать какого-либо порядка, если он не указан явно. По k.c1 набор упорядочен, а дальше сервер выводит так, как ему удобнее. Например, по кластерному индексу.

S> Есть этому какое-то объяснение (с точки зрения MySQL), или это просто очередной баг мускула?


Это баг ожиданий.
Hardware eventually fails. Software eventually works. ::: avalon/1.0.442
Re[2]: Чудеса MySQL
От: night beast СССР  
Дата: 28.07.15 06:09
Оценка:
Здравствуйте, wildwind, Вы писали:


S>> MS SQL ведёт себя ожидаемо (выводит user_id в обратном порядке), а тут какая-то очередная причуда.


W>Бесполезно ожидать какого-либо порядка, если он не указан явно. По k.c1 набор упорядочен, а дальше сервер выводит так, как ему удобнее. Например, по кластерному индексу.


так k.c1 как раз и есть user_id. или я чего-то недопонимаю?
Re: Чудеса MySQL
От: wildwind Россия  
Дата: 28.07.15 06:21
Оценка:
Здравствуйте, Somescout, Вы писали:

S> Есть этому какое-то объяснение (с точки зрения MySQL), или это просто очередной баг мускула?


У меня не воспроизводится. http://sqlfiddle.com/#!2/0256f/1

    | c1 | c2 |
    |----|----|
    |  3 |  1 |
    |  2 |  1 |
    |  1 |  1 |


P.S. На предыдущее сообщение прошу не обращать внимания.
Hardware eventually fails. Software eventually works. ::: avalon/1.0.442
Re[3]: Чудеса MySQL
От: wildwind Россия  
Дата: 28.07.15 06:21
Оценка:
Здравствуйте, night beast, Вы писали:

n> так k.c1 как раз и есть user_id. или я чего-то недопонимаю?


Да, это я сам себя запутал. Прошу прощения.
Hardware eventually fails. Software eventually works. ::: avalon/1.0.442
Re[3]: Чудеса MySQL
От: Somescout  
Дата: 28.07.15 06:22
Оценка:
Здравствуйте, night beast, Вы писали:

NB>Здравствуйте, wildwind, Вы писали:



S>>> MS SQL ведёт себя ожидаемо (выводит user_id в обратном порядке), а тут какая-то очередная причуда.


W>>Бесполезно ожидать какого-либо порядка, если он не указан явно. По k.c1 набор упорядочен, а дальше сервер выводит так, как ему удобнее. Например, по кластерному индексу.


NB>так k.c1 как раз и есть user_id. или я чего-то недопонимаю?


Всё верно. Имелось в веду, конечно же (и это следует из sql) что ссылается на результирующую колонку внутреннего селекта.
ARI ARI ARI... Arrivederci!
Re[2]: Чудеса MySQL
От: _ABC_  
Дата: 28.07.15 06:25
Оценка:
Здравствуйте, wildwind, Вы писали:

W>P.S. На предыдущее сообщение прошу не обращать внимания.

Вовремя ты, а то я уж телегу накатал разгромную. Удивился дико, прочитав подобное от тебя.
Re[2]: Чудеса MySQL
От: Somescout  
Дата: 28.07.15 07:39
Оценка:
Здравствуйте, wildwind, Вы писали:

W>Здравствуйте, Somescout, Вы писали:


S>> Есть этому какое-то объяснение (с точки зрения MySQL), или это просто очередной баг мускула?


W>У меня не воспроизводится. http://sqlfiddle.com/#!2/0256f/1


W>
    | c1 | c2 |
W>    |----|----|
W>    |  3 |  1 |
W>    |  2 |  1 |
W>    |  1 |  1 |


W>P.S. На предыдущее сообщение прошу не обращать внимания.


Протестил на MySQL 5.5.44 и 5.1.61 — не воспроизвёлся.
Похоже баг именно MariaDB.
ARI ARI ARI... Arrivederci!
Отредактировано 28.07.2015 7:40 Somescout . Предыдущая версия .
Re[3]: Чудеса MySQL
От: artelk  
Дата: 28.07.15 14:29
Оценка: +1
Здравствуйте, Somescout, Вы писали:

S>Протестил на MySQL 5.5.44 и 5.1.61 — не воспроизвёлся.

S>Похоже баг именно MariaDB.

Подтверждаю:
MariaDB [test]> CREATE TABLE users
    ->     (`user_id` int, `user_name` varchar(50))
    -> ;
Query OK, 0 rows affected (0.36 sec)

MariaDB [test]> INSERT INTO users
    ->     (`user_id`, `user_name`)
    -> VALUES
    ->     (1, '"John"'),
    ->     (2, '"Mike"'),
    ->     (3, '"Helen"')
    -> ;
Query OK, 3 rows affected (0.07 sec)
Records: 3  Duplicates: 0  Warnings: 0

MariaDB [test]> select
    ->   k.c1 as c2,
    ->   k.c2 as c1
    ->   from (
    ->     select users.user_id as c1,
    ->     1 as c2
    ->     from users
    ->   ) as k
    ->   order by k.c1 desc;
+------+----+
| c2   | c1 |
+------+----+
|    1 |  1 |
|    2 |  1 |
|    3 |  1 |
+------+----+
3 rows in set (0.00 sec)

Server version: 10.0.19-MariaDB MariaDB Server
Re[2]: Чудеса MySQL
От: artelk  
Дата: 28.07.15 14:35
Оценка:
Здравствуйте, wildwind, Вы писали:

W>У меня не воспроизводится. http://sqlfiddle.com/#!2/0256f/1


W>
W>    | c1 | c2 |
W>    |----|----|
W>    |  3 |  1 |
W>    |  2 |  1 |
W>    |  1 |  1 |


Хмм.. а почему порядок колонок c1, c2?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.