powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / СTE. Разъясните результат запроса.
24 сообщений из 49, страница 2 из 2
СTE. Разъясните результат запроса.
    #38999158
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-> Т.е. оно так не потому что так типа правильно

А как правильно и где это написано?

> то мы бы получали то что ожидаем.

Так ожидалку нужно починить, делов-то.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
СTE. Разъясните результат запроса.
    #38999165
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ваня Сусанинчто они перевычисляются при каждом упоминании
откуда это понеслось, что "они" не должны перевычисляться при каждом упоминании?
...
Рейтинг: 0 / 0
СTE. Разъясните результат запроса.
    #38999176
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv"они" не должны перевычисляться
пофиг на перевычисление, это действительно особенность реализации. А вот неожиданный порядок сортировки в выводе результата очень даже можно посчитать багом. Ибо запрос не делает то, о чем его явно попросили.
...
Рейтинг: 0 / 0
СTE. Разъясните результат запроса.
    #38999186
-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
-
Гость
Гаджимурадов Рустам-> Т.е. оно так не потому что так типа правильно

А как правильно и где это написано?

> то мы бы получали то что ожидаем.

Так ожидалку нужно починить, делов-то.

dimitrkdv"они" не должны перевычисляться
пофиг на перевычисление, это действительно особенность реализации. А вот неожиданный порядок сортировки в выводе результата очень даже можно посчитать багом. Ибо запрос не делает то, о чем его явно попросили.

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

Кто вопиёт, где вопиёт, какая истина? :)
Если истина это ДЕ, то "перевычисление,
это особенность реализации". Если про
сортировку (не по перевычислению),
которая не работает - баг, конечно, хотя
я не знаю о каком посте он говорит.

Если же "не работает" сортировка по
перевычислению - то лично я бы не
согласился с ним, что это баг. Более того,
лет эдак несколько назад он сам с собой
тоже был несогласен, IIRC. :)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
СTE. Разъясните результат запроса.
    #38999221
Симонов ДенисВаня Сусанин, есть это тамКак-то не очень сильно бросилось в глаза - см аттач.
...
Рейтинг: 0 / 0
СTE. Разъясните результат запроса.
    #38999223
Энди Таккер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисэто тебе так кажется
Сам вижу)
Симонов Денисgen_uuid() не детерминирована.
Симонов ДенисВычисляемый столбец здесь по сути это ссылка на его выражение не более того. Избежать этого можно только для детерминированных функций.
Проверил тезис про детерминированность.
Взял пример функции из новой документации и просто подставил его вместо gen_uuid() в запрос.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE FUNCTION FN_T
RETURNS DOUBLE PRECISION DETERMINISTIC
AS
BEGIN
RETURN rand();
END;

with t1(f) as(
SELECT fn_t() FROM rdb$database)
select f, f, f from t1;


fn_t() отработал при каждом появлении f в запросе.
Так что в данном случае дело не в детерминированности, а в "особенностях реализации"
...
Рейтинг: 0 / 0
СTE. Разъясните результат запроса.
    #38999227
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ваня Сусанин,

не там ищешь. См. в CREATE FUNCTION заметку про DETERMINISTIC
...
Рейтинг: 0 / 0
СTE. Разъясните результат запроса.
    #38999238
Энди Таккер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

Там не сказано, что из себя представляют, в плане детерминированности, существующие встроенные функции.
...
Рейтинг: 0 / 0
СTE. Разъясните результат запроса.
    #38999240
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамЕсли же "не работает" сортировка по перевычислению - то лично я бы не согласился с ним, что это баг. Более того, лет эдак несколько назад он сам с собой тоже был несогласен, IIRC. :)
ну, это не ужас-ужас, конечно. Примерно на том же уровне безобразия, что и пресловутый "стабильный курсор". То, что 30 лет назад было "as designed", сейчас уже несколько по-другому выглядит.
...
Рейтинг: 0 / 0
СTE. Разъясните результат запроса.
    #38999264
Симонов Денисне там ищешь. См. в CREATE FUNCTION заметку про DETERMINISTICИз вот этого текста:Необязательное предложение DETERMINISTIC указывает, что функция
детерминированная. Детерминированные функции каждый раз возвращают один и
тот же результат <. . .>
Примечание
На самом деле в текущей версии Firebird, не существует кэша хранимых
функций с маппингом входных аргументов на выходные значения.
Указание инструкции "deterministic" на самом деле нечто вроде
«обещания», что код функции будет возвращать одно и то же. В данный
момент детерминистическая функция считается инвариантом и работает
по тем же принципам, что и другие инварианты. Т.е. вычисляется и
кэшируется на уровне текущего выполнения данного запроса.-- логически не получается вывести то поведение rand() & gen_uuid(), о котором говорится в данном топеге.
...
Рейтинг: 0 / 0
СTE. Разъясните результат запроса.
    #38999365
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitr> ну, это не ужас-ужас, конечно. Примерно на том же уровне безобразия

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

> что и пресловутый "стабильный курсор"

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

если нарушаются декларативные правила языка, то это однозначный баг. Какие бы аргументы мы себе не придумывали на этот счет.
...
Рейтинг: 0 / 0
СTE. Разъясните результат запроса.
    #38999415
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ваня Сусанин,

мало ли недетерминированных функций можно придумать. Не ужели под каждую примечание нужно писать? Проще уж в одном месте описать. Если не согласен как в этом месте описано предложи как лучше.

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

Это ты про select rand() order by rand() ?

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

в это виде однозначно ничего не нарушается. А вот так
Код: sql
1.
select rand() order by 1


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

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

это проще описать в операторе SELECT.
...
Рейтинг: 0 / 0
СTE. Разъясните результат запроса.
    #38999545
-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
-
Гость
Гаджимурадов Рустамdimitr> если нарушаются декларативные правила языка, то это однозначный баг.

Это ты про select rand() order by rand() ?

Ну хозяин барин, чё, не смею спорить.

Говорю серверу:
дай мне 10 GEN_ID(G,1) и посортируй в обратном порядке:
Код: sql
1.
SELECT first 10 GEN_ID(G,1) from rdb$types order by 1 desc

...получаю не в том порядке что просил и с пропуском 10-ти значений, что я тоже не просил.

Говорю серверу:
дай мне 10 чётных GEN_ID(G,1):
Код: sql
1.
select first 10 GEN_ID(G, 1) as A from rdb$types where A / 2 * 2 = A

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

А вот этот запрос что должен вернуть исходя из ваших знаний SQL?
Код: sql
1.
select GEN_ID(G, 1) from rdb$types group by 1

Результат начинается не с 1, а с 231, и с инкрементом 3 для похоже всех значений кроме последнего. Для последнего инкремент 2: (..., 900, 903, 906, 909, 911). Итого 4 вызова на запись вместо одного.
Инкремент в 3 говорит что внутри движка где-то кроме сортировки (которая дала начало с 231) сработало ещё что-то, что дало ещё +2 лишних GEN_ID(G,1) на каждую запись.

GEN_ID(G,1) - вообще удобная штука оказалась чтобы смотреть сколько сейчас лишних вызовов делается, не гадая.

CAST наверняка тоже перевычисляется при сортировках и при группировках по полю с ним.
...
Рейтинг: 0 / 0
СTE. Разъясните результат запроса.
    #38999547
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-Говорю серверу:
дай мне 10 GEN_ID(G,1) и посортируй в обратном порядке:
Код: sql
1.
SELECT first 10 GEN_ID(G,1) from rdb$types order by 1 desc

...получаю не в том порядке что просил и с пропуском 10-ти значений, что я тоже не просил.


С натяжкой можно и багом назвать. Я уже говорил в текущей реализации
Код: sql
1.
SELECT first 10 GEN_ID(G,1) from rdb$types order by 1 desc


преобразуется в
Код: sql
1.
SELECT first 10 GEN_ID(G,1) from rdb$types order by GEN_ID(G,1) desc




-Говорю серверу:
дай мне 10 чётных GEN_ID(G,1):
Код: sql
1.
select first 10 GEN_ID(G, 1) as A from rdb$types where A / 2 * 2 = A

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

А это уже незнание языка SQL.

-А вот этот запрос что должен вернуть исходя из ваших знаний SQL?[src sql]
select GEN_ID(G, 1) from rdb$types group by 1

этот запрос глуп по определению

-GEN_ID(G,1) - вообще удобная штука оказалась чтобы смотреть сколько сейчас лишних вызовов делается, не гадая.

это да Таблоид с помощью этого много чего в работе оптимизатора постигает.
...
Рейтинг: 0 / 0
СTE. Разъясните результат запроса.
    #38999553
-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
-
Гость
Симонов Денис-Говорю серверу:
дай мне 10 чётных GEN_ID(G,1):
Код: sql
1.
select first 10 GEN_ID(G, 1) as A from rdb$types where A / 2 * 2 = A

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

А это уже незнание языка SQL.
А как на языке SQL будет "дай 100 GEN_ID(G,1), где значения не кратны 5" ?
Хочется написать:
Код: sql
1.
select first 100 GEN_ID(G,1) F from T where F / 5 * 5 <> F

но стандарт не велит (хотя возможно у него на это есть причины, я не знаю). Можно EXECUTE BLOCK использовать, и там отфильтровать вручную, но это как-то...
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
execute block returns (V bigint) as
  declare variable Cnt integer;
begin
  Cnt = 0;
  while (Cnt <> 100) do
  begin
    V = GEN_ID(G, 1);
    if (V / 5 * 5 <> V) then
    begin
      Cnt = Cnt + 1;
      suspend;
    end
  end
end


А если нужен order by desc?

Отвлечённый вопрос: как снаружи посортировать результат EXECUTE BLOCK? Или как WHERE к нему приписать?
Ну т.е. как это у хранимок происходит я знаю, а вот у анонимных блоков как?
Напрашивается:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
select * from (
  execute block returns (V bigint) as
    declare variable Cnt integer;
  begin
    Cnt = 0;
    while (Cnt <> 100) do
    begin
      V = GEN_ID(G, 1);
      if (V / 5 * 5 <> V) then
      begin
        Cnt = Cnt + 1;
        suspend;
      end
    end
  end
) (VV)
where VV > 30
order by VV desc

Но что-то не работает.
...
Рейтинг: 0 / 0
СTE. Разъясните результат запроса.
    #38999555
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-А как на языке SQL будет "дай 100 GEN_ID(G,1), где значения не кратны 5" ?

обычно для этого не надо более 100 раз дёргать генератор.

А если нужен order by desc?

> Отвлечённый вопрос: как снаружи посортировать результат EXECUTE BLOCK?

вот так

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
execute block returns (V bigint) as
  declare procedure p returns(out bigint)
  as
    declare variable Cnt integer;
  begin
    Cnt = 0;
    while (Cnt <> 100) do
    begin
      out = GEN_ID(G, 1);
      if (out / 5 * 5 <> out) then
      begin
        Cnt = Cnt + 1;
        suspend;
      end
    end
  end
begin
  for select out
      from p
      order by out desc
      into v
  do
    suspend;
end



> Или как WHERE к нему приписать?
Никак. Если надо вписывай внутрь EB

P.S. Вопросы у тебя какие-то дурацкие. К практике отношения не имеют
...
Рейтинг: 0 / 0
СTE. Разъясните результат запроса.
    #38999700
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис> в это виде однозначно ничего не нарушается.
Симонов Денис> А вот так уже спорный вопрос

Я об этом и говорил, это одно и то же.
Кому спорный, кому нет - я же говорю
ДЕ - хозяин барин, с текущим вектором
развития я ничему не удивлюсь. :)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
24 сообщений из 49, страница 2 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / СTE. Разъясните результат запроса.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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