powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Результат count( F1 )over() в процессе update set F1=null: cursor stability ?
16 сообщений из 16, страница 1 из 1
Результат count( F1 )over() в процессе update set F1=null: cursor stability ?
    #38516514
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hi all

DDL:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
recreate table t(x int, y int); 
commit;
insert into t values(1, 1);
insert into t values(2, 2);
insert into t values(3, 3);
insert into t values(4, 4);
insert into t values(5, 5);
commit;

DML:
Код: sql
1.
2.
update t set x=null, y=(select c from (select count(x)over() c from t) rows 1);
select * from t; 

Result:
Код: plaintext
1.
2.
3.
4.
5.
6.
      X            Y
======= ============
 <null>            5
 <null>            4
 <null>            3
 <null>            2
 <null>            1

PS-1. в Oracle :
Код: sql
1.
2.
3.
set null '<null>'
update t set x=null, y=( select c from (select count(x)over() c from t) where rownum=1 );
select * from t;

Код: plaintext
1.
2.
3.
4.
5.
6.
         X          Y
---------- ----------
<null>              5
<null>              5
<null>              5
<null>              5
<null>              5

PS-2. в m$ sql :
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
create table t(x int, y int)
go
insert into t values(1,1)
insert into t values(2,2)
insert into t values(3,3)
insert into t values(4,4)
insert into t values(5,5)
go

update t set x=null, y=( select top 1 c from (select count(x)over() c from t) t );
select * from t


xyNULL5NULL5NULL5NULL5NULL5

Any comments ?
...
Рейтинг: 0 / 0
Результат count( F1 )over() в процессе update set F1=null: cursor stability ?
    #38516519
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот если так его:
Код: sql
1.
insert into t(x, y) select row_number()over(), (select c from (select count(x)over() c from t) rows 1) from rdb$types rows 5;

- то показывает всё ОК:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
 select * from t;

       X            Y
======== ============
       1       <null>
       2       <null>
       3       <null>
       4       <null>
       5       <null>
...
Рейтинг: 0 / 0
Результат count( F1 )over() в процессе update set F1=null: cursor stability ?
    #38516554
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И ещё один этюд-изврат на тему апдейта и стабильности курсора. На этот раз без оконных функций:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
recreate table t(x int, y int); 
commit;
insert into t values(1, 1);
insert into t values(2, 2);
insert into t values(3, 3);
insert into t values(4, 4);
insert into t values(5, 5);
commit;

Firebird :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
update t 
    set y=(select (select sum(x) from t tx where tx.x<=tt.x) 
             from t tt 
             order by y desc rows 1
          );
select * from t;
  X            Y
=== ============
  1           15
  2            1
  3            1
  4            1
  5            1

Oracle:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
update t 
   set y=(select s from (
                          select (select sum(x) from t tx where tx.x<=tt.x) s 
                          from t tt order by y desc
                        ) 
             where rownum<2
         );
select * from t;

         X          Y
---------- ----------
         1         15
         2         15
         3         15
         4         15
         5         15
...
Рейтинг: 0 / 0
Результат count( F1 )over() в процессе update set F1=null: cursor stability ?
    #38516626
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

похоже на cursor stability. Если Влад подтвердит, что это именно оно, то добавь коммент в CORE-3362
...
Рейтинг: 0 / 0
Результат count( F1 )over() в процессе update set F1=null: cursor stability ?
    #38516642
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А по-моему это скорее некэширование результатов некореллированного подзапроса.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Результат count( F1 )over() в процессе update set F1=null: cursor stability ?
    #38517443
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Затолкал я в тот тикет эти примеры. И еще один тоже, посерьёзней слегка.
И пусть меня побьют ногами все три Источника Света и Шон вместе с ними, но нутром чую: надо будет еще не раз это всё проверять, в т.ч. апдейты с диктуемым порядком обхода строк (update t set ... order by ... ).
...
Рейтинг: 0 / 0
Результат count( F1 )over() в процессе update set F1=null: cursor stability ?
    #38517447
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

про FK это наверное зря. Тут стабильность курсора уже не причём, там другая проблема и следовательно тикет другой надо было создавать.
...
Рейтинг: 0 / 0
Результат count( F1 )over() в процессе update set F1=null: cursor stability ?
    #38517480
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисТут стабильность курсора уже не причём, там другая проблема и следовательно тикет другой надо было создавать.мну кажется, что это всё одного поля ягоды. Если там задать update t set x=y+1 order by x [или y] [а также поиграться c descend], то будет уже другой результат. Опять каким-то боком порядок обработки влияет.
...
Рейтинг: 0 / 0
Результат count( F1 )over() в процессе update set F1=null: cursor stability ?
    #38517496
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

там нарушение FK. Это вообще должно работать независимо от стабильности курсора. Ну к тому же ты запудрил мозги серверу каскадным обновлением.
...
Рейтинг: 0 / 0
Результат count( F1 )over() в процессе update set F1=null: cursor stability ?
    #38517501
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денистам нарушение FK. Это вообще должно работать независимо от стабильности курсора. Ну к тому же ты запудрил мозги серверу каскадным обновлением.Этого нарушения FK *нет*, когда порядок обхода записей задан явно (кляузой order by), можешь проверить.
Сиё означает, что требование тикета: "Cursors should ignore changes made by the same statement" - НЕ выполнено, т.е. курсокр таки УЧИТЫВАЕТ изменения "своего" стейтмента. Вот только эффект от этого учёта сейчас положительный, т.к. не появляется висячих строк. В отличие от других примеров (типа insert into t select * from t).
...
Рейтинг: 0 / 0
Результат count( F1 )over() в процессе update set F1=null: cursor stability ?
    #38517506
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

про порядок я ничего и не говорю. Этот тикет ещё не отмечен как решённый. А про порядок говориться вот здесь CORE-2799 . Но всё же моё мнение что FK не должен нарушаться при любых условиях и всё равно стабилен или нет курсор.
...
Рейтинг: 0 / 0
Результат count( F1 )over() в процессе update set F1=null: cursor stability ?
    #38517939
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
 DDL :
recreate table tm(x int primary key, y int);
insert into tm values(5,5);
insert into tm values(4,5);
insert into tm values(3,2);
insert into tm values(2,2);
insert into tm values(1,0);
commit;
Задача: удалить все строки, в которых для некоторого кортежа {x, y} есть другой кортеж с таким же `y`.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
 QUERY-1: 
SQL> select * from tm; delete from tm m where (select count(*) from tm x where x.y=m.y)>1; select * from tm; rollback;  
RESULT-1:
           X            Y
============ ============
           5            5
           4            5
           3            2
           2            2
           1            0


           X            Y
============ ============
           1            0
 -- OK -- 


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
 QUERY-2: 
SQL> select * from tm; delete from tm m where (select count(*) over()  from tm x where x.y=m.y  rows 1 )>1; select * from tm; rollback;

RESULT-2:
           X            Y
============ ============
           5            5
           4            5
           3            2
           2            2
           1            0


           X            Y
============ ============
           4            5
           2            2
           1            0

Не уверен, относится ли это к стабильности курсора или нет, но вижу, что во WHERE-предикате результат OVER()-функции перевычисляется на каждой обрабатываемой строке. Вместо однократного вычисления на старте стейтмента.
...
Рейтинг: 0 / 0
Результат count( F1 )over() в процессе update set F1=null: cursor stability ?
    #38517951
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Стабильность курсора была слегка сломана одним патчем летом. Не трогай её пока не починим.
Ибо сейчас результаты всех твои тесты не имеют ценности. Разве что ради того, чтобы потом их повторить...

2. FK c ON UPDATE CASCADE (уже сам по себе изврат редкостный, но это не отменяет сути проблемы) да ещё и со ссылкой на самого себя никогда не работал на 100% правильно.
В своё время в IB сделали простейшую реализацию каскадных FK, работающую в большинстве простых случаев, но не на 100% корректную.
Стабильный курсор здесь несколько влияет на картину, но он не виноват в не правильной реализации каскадных действий.

3. За постоянное тыкание в одно и тоже место (отсутствие материализации результатов подзапросов) да ещё и где попало,
да ещё и после 100500 кратных объяснений - уйдёшь таки в игнор, сколько можно уже ?
...
Рейтинг: 0 / 0
Результат count( F1 )over() в процессе update set F1=null: cursor stability ?
    #38517954
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvlad1. Стабильность курсора была слегка сломана одним патчем летом. Не трогай её пока не починим.
Ибо сейчас результаты всех твои тесты не имеют ценности. Разве что ради того, чтобы потом их повторить...Это ты СЕЙЧАС выяснил, что она сломана, или еще летом знал, но "тихо об лёд" ? :-)
hvlad3. За постоянное тыкание в одно и тоже место (отсутствие материализации результатов подзапросов) да ещё и где попало, да ещё и после 100500 кратных объяснений - уйдёшь таки в игнор, сколько можно уже ?я не знаю, ЧТО там сейчас в трёшке: материализуются подзапросы или нет, и в каких случаях... Еще летом я видел, что в каких-то случаях ФБ-3 рвёт как тузик грелку запрос с подзапросом, где 2.5 тихо помирает. Если сейчас опять поломато - ну значит, подождём, не гордые.
В любом случае, тесты приведены, перепроверить теперь можно в любой момент.
...
Рейтинг: 0 / 0
Результат count( F1 )over() в процессе update set F1=null: cursor stability ?
    #38517968
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидЭто ты СЕЙЧАС выяснил, что она сломана, или еще летом знал, но "тихо об лёд" ? :-)Сейчас. Так что польза от тебя таки есть :)
...
Рейтинг: 0 / 0
Результат count( F1 )over() в процессе update set F1=null: cursor stability ?
    #38520513
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvlad1. Стабильность курсора была слегка сломана одним патчем летом.Исправил
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Результат count( F1 )over() в процессе update set F1=null: cursor stability ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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