SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 13.09.2016 10:19:27

klow
Завсегдатай
Зарегистрирован: 06.12.2014
Сообщений: 78

Functions ELT and NULL

Прошу помощи с функцией ELT. Не могу понять суть ее работы если используются пустые значения.
Пример:

SELECT ELT(1, 'str1', t1.id, t2.id) = 'str1' ttt
FROM tabl t1
  left JOIN tabl t2 ON 1=0;
Конструкция "ON 1=0" сделана чтобы из t2 не возвращались записи.
Запрос возвращает все строки таблицы со значением ttt=1.
Все логично и правильно.

Теперь немного изменяем запрос
SELECT ELT(1, 'str1', t1.id, t2.id) = 'str1' ttt
FROM tabl t1
  left JOIN tabl t2 ON 1=0
WHERE ELT(1, 'str1', t1.id, t2.id) = 'str1';
Вроде ничего принципиально не поменялось, результат должен быть тот же, но реально возвращает 0 строк!

Снова меняем.
SELECT ELT(1, 'str1', t1.id, t2.id) = 'str1' ttt
FROM tabl t1
  left JOIN tabl t2 ON 1=0
WHERE ELT(1, 'str1', t1.id, NULL) = 'str1';
Ожидаемый результат как в первом случае.
Почему такое странное поведение ELT в конструкции  WHERE?
Версия MySql 5.5.50

Отредактированно klow (13.09.2016 10:21:00)

Неактивен

 

#2 13.09.2016 12:43:32

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 4947

Re: Functions ELT and NULL

Оптимизатор считает, что условие заведомо невыполнимо

mysql> explain select elt(1, 'st',c.name,cc.code)='st' from city c left join cou
ntry cc on 1=0 where elt(1, 'st',c.name,null)='st' limit 1\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: c
   partitions: NULL
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 4188
     filtered: 100.00
        Extra: Using where
*************************** 2. row ***************************
           id: 1
  select_type: SIMPLE
        table: cc
   partitions: NULL
         type: index
possible_keys: NULL
          key: PRIMARY
      key_len: 3
          ref: NULL
         rows: 239
     filtered: 100.00
        Extra: Using where; Using index; Using join buffer (Block Nested Loop)
2 rows in set, 1 warning (0.03 sec)

mysql> explain select elt(1, 'st',c.name,cc.code)='st' from city c left join cou
ntry cc on 1=0 where elt(1, 'st',c.name,cc.code)='st' limit 1\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: NULL
   partitions: NULL
         type: NULL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: NULL
     filtered: NULL
        Extra: Impossible WHERE
1 row in set, 1 warning (0.00 sec)

mysql> select version();
+-----------+
| version() |
+-----------+
| 5.7.9-log |
+-----------+
 

Неактивен

 

#3 13.09.2016 16:17:48

klow
Завсегдатай
Зарегистрирован: 06.12.2014
Сообщений: 78

Re: Functions ELT and NULL

Почему? Ведь для поля в SELECT дает истину? Баг?

Неактивен

 

#4 13.09.2016 16:58:52

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3721

Re: Functions ELT and NULL

Пишите на bugs.mysql.com
Очевидно, что оптимизатор влез внутрь ELT, хотя корректно делать этого не умеет.

Неактивен

 

#5 13.09.2016 17:01:01

klow
Завсегдатай
Зарегистрирован: 06.12.2014
Сообщений: 78

Re: Functions ELT and NULL

roll
К сожалению не дружу с английским, могу неточно выразиться. Можете помочь?

Неактивен

 

#6 13.09.2016 17:02:41

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3721

Re: Functions ELT and NULL

Приведите тогда полный пример с воспроизведением баги, включая CREATE TABLE и INSERT.

Неактивен

 

#7 13.09.2016 17:08:42

klow
Завсегдатай
Зарегистрирован: 06.12.2014
Сообщений: 78

Re: Functions ELT and NULL

Думаю можно обойтись без CREATE TABLE
Запрос должен возвратить 1, а возвращает 0.

SELECT
  COUNT(*) Cnt
FROM (SELECT 1 ID) t1
  LEFT JOIN (SELECT 2 ID) t2 ON t1.ID = t2.ID
WHERE ELT(1, t1.ID, t2.ID) = 1;

Аналогичный но без указания ссылки на вторую таблицу отрабатывает корректно
SELECT
  COUNT(*) Cnt
FROM (SELECT 1 ID) t1
  LEFT JOIN (SELECT 2 ID) t2 ON t1.ID = t2.ID
WHERE ELT(1, t1.ID, NULL) = 1;

Отредактированно klow (14.09.2016 12:21:59)

Неактивен

 

#8 15.09.2016 10:51:48

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3721

Re: Functions ELT and NULL

Без таблиц описание будет короче, но сам запрос сложнее, так как содержит еще и подзапросы. Разместил в багтрекере:
http://bugs.mysql.com/bug.php?id=83006

Неактивен

 

#9 15.09.2016 11:31:13

klow
Завсегдатай
Зарегистрирован: 06.12.2014
Сообщений: 78

Re: Functions ELT and NULL

Спасибо!

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson