Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / СTE. Разъясните результат запроса. / 25 сообщений из 49, страница 1 из 2
03.07.2015, 14:26
    #38998992
Энди Таккер
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
СTE. Разъясните результат запроса.
FB 3.0.0.31898

Запросы
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
select 
  uuid,
  uuid,
  uuid,
  uuid
from
  (select gen_uuid() from rdb$database) (UUID);

-- или такой

with t
as (select
      gen_uuid() as UUID
    from
      rdb$database)
select
  t.uuid,
  t.uuid,
  t.uuid,
  t.uuid
from
  t;


выдают во всех полях разные значения.
Т.е. функция вычисляется при каждом обращении к полю.
Так и должно быть?
...
Рейтинг: 0 / 0
03.07.2015, 14:34
    #38999011
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
СTE. Разъясните результат запроса.
Энди Таккер,

ну а как? функция всегда должна возвращать одно значение? или как current_timestamp, получать значение при первом обращении в запросе или psql, и при любых повторах выдавать полученное значение?
...
Рейтинг: 0 / 0
03.07.2015, 14:38
    #38999015
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
СTE. Разъясните результат запроса.
Энди Таккер,

на 2.5 тоже самое.

gen_uuid() не детерминирована.

Сделай вот так и будет тебе счастье.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
with t
as (select
      (select gen_uuid() from rdb$database) as UUID
    from
      rdb$database)
select
  t.uuid,
  t.uuid,
  t.uuid,
  t.uuid
from
  t;



ну или вот так обверни MAX(gen_uuid())
...
Рейтинг: 0 / 0
03.07.2015, 14:46
    #38999030
Энди Таккер
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
СTE. Разъясните результат запроса.
kdvфункция всегда должна возвращать одно значение?
Так я к функции вроде бы только один раз обращаюсь.
...
Рейтинг: 0 / 0
03.07.2015, 14:51
    #38999034
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
СTE. Разъясните результат запроса.
Энди ТаккерТак я к функции вроде бы только один раз обращаюсь.
ну да, ну да. такая же херня и с UDF.
...
Рейтинг: 0 / 0
03.07.2015, 14:52
    #38999035
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
СTE. Разъясните результат запроса.
Энди Таккер,

это тебе так кажется. В данном случае gen_uuid() as UUID в CTE работает как вычисляемый столбец в таблице
...
Рейтинг: 0 / 0
03.07.2015, 15:02
    #38999050
-
-
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
СTE. Разъясните результат запроса.
Код: sql
1.
2.
3.
4.
5.
6.
7.
select 
  uuid,
  uuid,
  uuid,
  uuid
from
  (select GEN_ID(G, 1) from rdb$database) (UUID)

Выдаёт первый раз 4, 3, 2, 1 и при каждом выполнении увеличивает значение G на 4.


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
select 
  uuid,
  uuid,
  uuid,
  uuid
from
  (select GEN_ID(G, 1) from rdb$database) (UUID)
order by 1

Выдаёт первый раз 5, 4, 3, 2
Увеличивает значение G на 5.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
select 
  uuid,
  uuid,
  uuid,
  uuid
from
  (select GEN_ID(G, 1) from rdb$database) (UUID)
group by 1, 2, 3, 4

выдаёт: 9, 9, 9, 9
следующий запуск: 18, 18, 18, 18

Каждый раз высчитывается значение функции, которое по смылу должно быть посчитано лишь раз.
...
Рейтинг: 0 / 0
03.07.2015, 15:05
    #38999054
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
СTE. Разъясните результат запроса.
-,

поздравляю. вы открыли для себя, как вычисляются функции и значения столбцов в sql.
...
Рейтинг: 0 / 0
03.07.2015, 15:17
    #38999068
-
-
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
СTE. Разъясните результат запроса.
И естественное следствие:
Код: sql
1.
2.
select GEN_ID(G, 1) from rdb$types
order by 1 desc


При G = 0 выдаёт значения "почему-то" в порядке возрастания и "почему-то" начиная с числа 229:
229, 230, 231, ...

Неожиданно.
...
Рейтинг: 0 / 0
03.07.2015, 15:18
    #38999070
-
-
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
СTE. Разъясните результат запроса.
kdvпоздравляю. вы открыли для себя, как вычисляются функции и значения столбцов в sql.
Я просто искренне удивлён что это не баг.
...
Рейтинг: 0 / 0
03.07.2015, 15:28
    #38999077
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
СTE. Разъясните результат запроса.
-,

вы еще кэширование для себя откройте. ну там размер пакета tcp, plan sort, select for update, и так далее. Там числа будут другие.
Развлекайтесь, в общем.
...
Рейтинг: 0 / 0
03.07.2015, 15:28
    #38999079
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
СTE. Разъясните результат запроса.
кловун снова на арене...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
03.07.2015, 15:30
    #38999086
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
СTE. Разъясните результат запроса.
Мимопроходящий,

YouTube Video
...
Рейтинг: 0 / 0
03.07.2015, 15:30
    #38999088
СTE. Разъясните результат запроса.
-Я просто искренне удивлён что это не баг.я тоже удивлялся , но потом привык )
...
Рейтинг: 0 / 0
03.07.2015, 15:31
    #38999089
-
-
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
СTE. Разъясните результат запроса.
Оказывается если создать вычисляемое поле в таблице и селектнуть его так:
Код: sql
1.
select C from T order by C desc

,
то C тоже будет вычислено по 2 раза на запись, а результат выведен не в том порядке.

Это SQL-стандарт сказал что так правильно?
...
Рейтинг: 0 / 0
03.07.2015, 15:36
    #38999093
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
СTE. Разъясните результат запроса.
-,

implementation details.
...
Рейтинг: 0 / 0
03.07.2015, 16:05
    #38999121
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
СTE. Разъясните результат запроса.
-,

не ищи бага там где его нет
...
Рейтинг: 0 / 0
03.07.2015, 16:06
    #38999124
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
СTE. Разъясните результат запроса.
Ваня Сусанин> я тоже

Я сначала было думал, что это ты, прикалываешься.
Потом пригляделся - нет, подумал, что Вовчик, гад.
Потом ещё пригляделся - нет, это вообще кто-то новый.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
03.07.2015, 16:06
    #38999125
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
СTE. Разъясните результат запроса.
Симонов Денис> не ищи бага там где его нет

Пусть, пусть ищет. Только пусть ищет в каком-нибудь одном топике, а-то утомил.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
03.07.2015, 16:11
    #38999133
-
-
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
СTE. Разъясните результат запроса.
Ваня Сусанин-Я просто искренне удивлён что это не баг.я тоже удивлялся , но потом привык )
Дай бог чтобы когда-нибудь это было исправлено. И когда исправивших спросят, почему они это исправили, то чтобы они искренне ответили: "потому что пользователи нам указали что им так не логично, и мы, встав на их место и посмотрев их глазами, увидели что оно на самом деле не логично, и решили исправить".
...
Рейтинг: 0 / 0
03.07.2015, 16:12
    #38999134
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
СTE. Разъясните результат запроса.
-,

у тебя какое-то неверное представление о вычисляемых столбцах. Он не материализуется во время выборки. Вычисляемый столбец здесь по сути это ссылка на его выражение не более того. Избежать этого можно только для детерминированных функций. Но существуют они только в Fb3 и только как PSQL функции. Да ещё там детерминированность работает (возможно пока) только если эта функция без параметра.
...
Рейтинг: 0 / 0
03.07.2015, 16:14
    #38999137
СTE. Разъясните результат запроса.
Гаджимурадов РустамЯ сначала было думал, что это ты, прикалываешься.гы... делать мне нечего, что ле ? тем более по теме, которую "проходил" несколько лет взад... :-)

BTW, 2 Денис : а чего ты не добавил замечания про rand() & gen_uuid() в доку (что они перевычисляются при каждом упоминании, а также выносятся из сортировки) ? Этот вопрос вспыхивает тут (хотя и нечасто), может есть смысл в доку вставить сиё ?
...
Рейтинг: 0 / 0
03.07.2015, 16:19
    #38999145
СTE. Разъясните результат запроса.
- НЕ Дай бог чтобы когда-нибудь это было исправлено.Поправел. Нельзя это исправлять, ибо наверняка уже полно прикладного кода, который опирается как раз на такое поведение!
...
Рейтинг: 0 / 0
03.07.2015, 16:31
    #38999156
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
СTE. Разъясните результат запроса.
Ваня Сусанин> гы... делать мне нечего, что ле ?

Так ты горазд. Как в прибаутке.

Ваня Сусанин> тем более по теме, которую "проходил" несколько лет взад... :-)

Я ж не про эту тему. Минус-то уже несколько месяцев мельтешит.

Ваня Сусанин> наверняка уже полно прикладного кода, который опирается как раз на такое поведение!

Едва ли, на это хрен заложишься и оперешься, потому что все
подобные поведения нефиксированы и нерегламентированы*
(а большинство даже и недокументированы, IIRC). Разве что
на какие-то конкретные частные случаи, но я щас даже с ходу
не вспомню на какие именно и как они могут быть полезны.
Но что не надо трогать карточный домик - согласен.

P.S. * помню, один и тот же запрос "легким мановением руки"
сжирал то 2 вызова за итерацию, то 3, то 4.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
03.07.2015, 16:31
    #38999157
-
-
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
СTE. Разъясните результат запроса.
Симонов Денису тебя какое-то неверное представление о вычисляемых столбцах. Он не материализуется во время выборки.Так kdv же объяснил, что это потому что такая реализация.
Т.е. оно так не потому что так типа правильно, а потому что так реализовано.
Если бы реализация не вычисляла лишнего, то мы бы получали то что ожидаем.
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / СTE. Разъясните результат запроса. / 25 сообщений из 49, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]