powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / СTE. Разъясните результат запроса.
25 сообщений из 49, страница 1 из 2
СTE. Разъясните результат запроса.
    #38998992
Энди Таккер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
СTE. Разъясните результат запроса.
    #38999011
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Энди Таккер,

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

на 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
СTE. Разъясните результат запроса.
    #38999030
Энди Таккер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvфункция всегда должна возвращать одно значение?
Так я к функции вроде бы только один раз обращаюсь.
...
Рейтинг: 0 / 0
СTE. Разъясните результат запроса.
    #38999034
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Энди ТаккерТак я к функции вроде бы только один раз обращаюсь.
ну да, ну да. такая же херня и с UDF.
...
Рейтинг: 0 / 0
СTE. Разъясните результат запроса.
    #38999035
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Энди Таккер,

это тебе так кажется. В данном случае gen_uuid() as UUID в CTE работает как вычисляемый столбец в таблице
...
Рейтинг: 0 / 0
СTE. Разъясните результат запроса.
    #38999050
-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
-
Гость
Код: 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
СTE. Разъясните результат запроса.
    #38999054
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-,

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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