powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Результаты после merge + rollback'a... отличаются от первоначальных (2.5 & 3.0). Why ??
24 сообщений из 24, страница 1 из 1
Результаты после merge + rollback'a... отличаются от первоначальных (2.5 & 3.0). Why ??
    #38813987
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hi all

DDL + test
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
show version;

set term ^;
execute block as begin
  begin execute statement 'create sequence g'; when any do begin end end
end
^ set term ;^
commit;
alter sequence g restart with 0;
commit;
recreate table t(id int, x int, y int);
commit;
insert into t(id) select gen_id(g,1) from rdb$types rows 10;
update t set x=mod(id,2), y=mod(id,3);
commit;

------------------------------------------------------------------------------

set echo on;

select 'before_merge' msg, t.* from t;

merge into t
using t s
on t.x=s.x
when matched then update set t.x=t.x+s.y;

select 'after_merge' msg, t.* from t;

 rollback; 

select 'after_rollback' msg, t.* from t;
Результатики.

1. Для 2.5.3:
Код: plaintext
.\isql 192.168.43.62/3252:c:\temp\tmpmerge25.fdb -i merge-test.sql 1>merge-test-25.log 2>&1
merge-test-25.log
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
ISQL Version: WI-V2.5.3.26790 Firebird 2.5
Server version:
Firebird/x86/Windows NT (access method), version "WI-V2.5.3.26778 Firebird 2.5"
Firebird/x86/Windows NT (remote server), version "WI-V2.5.3.26778 Firebird 2.5/tcp (IT_test)/P12"
Firebird/x86/Windows NT (remote interface), version "WI-V2.5.3.26790 Firebird 2.5/tcp (tlprg)/P12"
on disk structure version 11.2

select 'before_merge' msg, t.* from t;

MSG                    ID            X            Y 
============ ============ ============ ============ 
before_merge            1            1            1 
before_merge            2            0            2 
before_merge            3            1            0 
before_merge            4            0            1 
before_merge            5            1            2 
before_merge            6            0            0 
before_merge            7            1            1 
before_merge            8            0            2 
before_merge            9            1            0 
before_merge           10            0            1 


merge into t
using t s
on t.x=s.x
when matched then update set t.x=t.x+s.y;

select 'after_merge' msg, t.* from t;

MSG                   ID            X            Y 
=========== ============ ============ ============ 
after_merge            1            2            1 
after_merge            2            1            2 
after_merge            3            2            0 
after_merge            4            1            1 
after_merge            5            2            2 
after_merge            6            1            0 
after_merge            7            2            1 
after_merge            8            1            2 
after_merge            9            2            0 
after_merge           10            1            1 


 rollback; 

select 'after_rollback' msg, t.* from t;

MSG                      ID            X            Y 
============== ============ ============ ============ 
after_rollback            1            1            1 
after_rollback            2            1            2 
after_rollback            3            1            0 
after_rollback            4            1            1 
after_rollback            5            1            2 
after_rollback            6            1            0 
after_rollback            7            1            1 
after_rollback            8            1            2 
after_rollback            9            1            0 
after_rollback           10            1            1 
2. Для 3.0:
Код: plaintext
.\isql 192.168.43.62/3333:c:\temp\tmpmerge.fdb -i merge-test.sql 1>merge-test30.log 2>&1
merge-test30.log
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
ISQL Version: WI-T3.0.0.31353 Firebird 3.0 Alpha 2
Server version:
Firebird/Windows/Intel/i386 (access method), version "WI-T3.0.0.31395 Firebird 3.0 Beta 1"
Firebird/Windows/Intel/i386 (remote server), version "WI-T3.0.0.31395 Firebird 3.0 Beta 1/tcp (IT_test)/P13:C"
Firebird/Windows/Intel/i386 (remote interface), version "WI-T3.0.0.31353 Firebird 3.0 Alpha 2/tcp (tlprg)/P13:C"
on disk structure version 12.0

select 'before_merge' msg, t.* from t;

MSG                    ID            X            Y 
============ ============ ============ ============ 
before_merge            1            1            1 
before_merge            2            0            2 
before_merge            3            1            0 
before_merge            4            0            1 
before_merge            5            1            2 
before_merge            6            0            0 
before_merge            7            1            1 
before_merge            8            0            2 
before_merge            9            1            0 
before_merge           10            0            1 


merge into t
using t s
on t.x=s.x
when matched then update set t.x=t.x+s.y;

select 'after_merge' msg, t.* from t;

MSG                   ID            X            Y 
=========== ============ ============ ============ 
after_merge            1            3            1 
after_merge            2            1            2 
after_merge            3            3            0 
after_merge            4            1            1 
after_merge            5            3            2 
after_merge            6            1            0 
after_merge            7            3            1 
after_merge            8            1            2 
after_merge            9            3            0 
after_merge           10            1            1 


 rollback; 

select 'after_rollback' msg, t.* from t;

MSG                      ID            X            Y 
============== ============ ============ ============ 
after_rollback            1            3            1 
after_rollback            2            0            2 
after_rollback            3            3            0 
after_rollback            4            0            1 
after_rollback            5            3            2 
after_rollback            6            0            0 
after_rollback            7            3            1 
after_rollback            8            0            2 
after_rollback            9            3            0 
after_rollback           10            0            1 

То, что мёрдж дэбильный:
Код: sql
1.
2.
3.
4.
merge into t
using t s
on t.x=s.x -- тут хотелось вписать 'id', но второпях получилось только 'x' :-D
when matched then update set t.x=t.x+s.y;

- это понятно.

А что там с роллбаком произошло ? Причём, в давно уже апробированном 2.5 тоже "не айс" как-то!
...
Рейтинг: 0 / 0
Результаты после merge + rollback'a... отличаются от первоначальных (2.5 & 3.0). Why ??
    #38813998
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоидэто понятно.
Тебе ещё повезло, что http://tracker.firebirdsql.org/browse/CORE-4369 не сломал тебе базу
полностью, только поцарапал.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Результаты после merge + rollback'a... отличаются от первоначальных (2.5 & 3.0). Why ??
    #38814000
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

да, похоже. При insert into t select ... from ... rows 3 еще воспроизводится, при rows 2 - уже нет.
...
Рейтинг: 0 / 0
Результаты после merge + rollback'a... отличаются от первоначальных (2.5 & 3.0). Why ??
    #38814086
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

это потому что merge не даёт ошибки при повторном обновлении одной и той же строки, чего требует стандарт + то о чём говорит Дмитрий
...
Рейтинг: 0 / 0
Результаты после merge + rollback'a... отличаются от первоначальных (2.5 & 3.0). Why ??
    #38814095
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

да хрен с ней, ошибкой повторного обновления...
Глянь на данные после роллбака, плз. И сравни их с исходными.
...
Рейтинг: 0 / 0
Результаты после merge + rollback'a... отличаются от первоначальных (2.5 & 3.0). Why ??
    #38814099
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидГлянь на данные после роллбака, плз. И сравни их с исходными.(я к тому, что хотя бы в 2.5.х надо бы законопатить это...)
...
Рейтинг: 0 / 0
Результаты после merge + rollback'a... отличаются от первоначальных (2.5 & 3.0). Why ??
    #38814112
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

в ФБ есть некоторое ограничение на кол-во обновлений одной и той же записи в одной транзакции после которого невозможно отменить обновление (update_in_place или что-то типа того), Dimitry Sibiryakov вроде даже выкладывал патч, который снимает это ограничение, но его ещё не проверили, чтобы закомитить.
...
Рейтинг: 0 / 0
Результаты после merge + rollback'a... отличаются от первоначальных (2.5 & 3.0). Why ??
    #38814123
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во-первых, баг выше на 2.5 распространяться не должен: он появился как побочный эффект
стабильности курсора.
Во-вторых, я такого патча не делал.
В-третьих, попробуй уже в 2.5 с NO AUTO UNDO.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Результаты после merge + rollback'a... отличаются от первоначальных (2.5 & 3.0). Why ??
    #38814128
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovВо-первых, баг выше на 2.5 распространяться не должен : он появился как побочный эффект стабильности курсора.Однако же, роллбак в 2.5.х упрям как боран и почему-то не хочет откатывать изменения.
Dimitry SibiryakovВ-третьих, попробуй уже в 2.5 с NO AUTO UNDO.Попробовал. Всё то же самое.

Минимально воспроизводимый скрипт:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
show version;

set term ^;
execute block as begin
  begin execute statement 'create sequence g'; when any do begin end end
end
^ set term ;^
commit;
alter sequence g restart with 0;
commit;
recreate table t(id int, x int, y int);
commit;
insert into t(id) select gen_id(g,1) from rdb$types rows 3;
update t set x=mod(id,2), y=mod(id,3);
commit;

------------------------------------------------------------------------------

set echo on;

set transaction no auto undo;

select 'before_merge' msg, t.* from t;

merge into t
using t s
on t.x=s.x
when matched then update set t.x=t.x+s.y;

select 'after_merge' msg, t.* from t;
 
rollback; 

select 'after_rollback' msg, t.* from t;
Output:

1. Firebird 3.0.x :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
ISQL Version: WI-T3.0.0.31353 Firebird 3.0 Alpha 2
Server version:
Firebird/Windows/Intel/i386 (access method), version "WI-T3.0.0.31395 Firebird 3.0 Beta 1"
Firebird/Windows/Intel/i386 (remote server), version "WI-T3.0.0.31395 Firebird 3.0 Beta 1/tcp (IT_test)/P13:C"
Firebird/Windows/Intel/i386 (remote interface), version "WI-T3.0.0.31353 Firebird 3.0 Alpha 2/tcp (tlprg)/P13:C"
on disk structure version 12.0

set transaction no auto undo;

select 'before_merge' msg, t.* from t;

MSG                    ID            X            Y 
============ ============ ============ ============ 
before_merge            1            1            1 
before_merge            2            0            2 
before_merge            3            1            0 


merge into t
using t s
on t.x=s.x
when matched then update set t.x=t.x+s.y;

select 'after_merge' msg, t.* from t;

MSG                   ID            X            Y 
=========== ============ ============ ============ 
after_merge            1            2            1 
after_merge            2            2            2 
after_merge            3            2            0 


rollback;

select 'after_rollback' msg, t.* from t;

MSG                      ID            X            Y 
============== ============ ============ ============ 
after_rollback            1            2            1 
after_rollback            2            0            2 
after_rollback            3            2            0 

2. Firebird 2.5.3 :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
ISQL Version: WI-V2.5.3.26790 Firebird 2.5
Server version:
Firebird/x86/Windows NT (access method), version "WI-V2.5.3.26778 Firebird 2.5"
Firebird/x86/Windows NT (remote server), version "WI-V2.5.3.26778 Firebird 2.5/tcp (IT_test)/P12"
Firebird/x86/Windows NT (remote interface), version "WI-V2.5.3.26790 Firebird 2.5/tcp (tlprg)/P12"
on disk structure version 11.2

set transaction no auto undo;

select 'before_merge' msg, t.* from t;

MSG                    ID            X            Y 
============ ============ ============ ============ 
before_merge            1            1            1 
before_merge            2            0            2 
before_merge            3            1            0 


merge into t
using t s
on t.x=s.x
when matched then update set t.x=t.x+s.y;

select 'after_merge' msg, t.* from t;

MSG                   ID            X            Y 
=========== ============ ============ ============ 
after_merge            1            2            1 
after_merge            2            2            2 
after_merge            3            2            0 


rollback;

select 'after_rollback' msg, t.* from t;

MSG                      ID            X            Y 
============== ============ ============ ============ 
after_rollback            1            2            1 
after_rollback            2            0            2 
after_rollback            3            2            0 
...
Рейтинг: 0 / 0
Результаты после merge + rollback'a... отличаются от первоначальных (2.5 & 3.0). Why ??
    #38814134
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисв ФБ есть некоторое ограничение на кол-во обновлений одной и той же записи в одной транзакции после которого невозможно отменить обновлениеНет и не может быть таких ограничений
...
Рейтинг: 0 / 0
Результаты после merge + rollback'a... отличаются от первоначальных (2.5 & 3.0). Why ??
    #38814157
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvlad,

упс. Перечитал про тот патч. В общем совсем не то он исправляет. И про ограничения я наврал.
Извиняюсь.
...
Рейтинг: 0 / 0
Результаты после merge + rollback'a... отличаются от первоначальных (2.5 & 3.0). Why ??
    #38814279
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нарыл я один топег , в котором Влад показал "блок-схему" того, во что преобразуется merge.
Попытался применить тамошнюю "блок-схему" в данном примере:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
execute block as
  declare v_k char(8) character set octets;
  declare v_y int;
begin
  for
    select t.rdb$db_key, s.y
    from t
    right join t s on t.x = s.x
    into v_k, v_y
  do
    if (v_k is not null) then
      update t set t.x = t.x + :v_y
      where t.rdb$db_key = :v_k;
end

- однако при роллбаке тут всё восстанавливается.

В общем, там, внутри мёрджа, есть ещё "что-то", нехорошее.
...
Рейтинг: 0 / 0
Результаты после merge + rollback'a... отличаются от первоначальных (2.5 & 3.0). Why ??
    #38814281
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вижу причину, пока не решил как лечить.
Проблема действительно в MERGE.
...
Рейтинг: 0 / 0
Результаты после merge + rollback'a... отличаются от первоначальных (2.5 & 3.0). Why ??
    #38814346
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добавь индекс на поле джойна (x) и удивись :)
...
Рейтинг: 0 / 0
Результаты после merge + rollback'a... отличаются от первоначальных (2.5 & 3.0). Why ??
    #38814359
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladДобавь индекс на поле джойна (x) и удивись :)С индексом rollback отрабатывает нормально, без него - нет :-)
...
Рейтинг: 0 / 0
Результаты после merge + rollback'a... отличаются от первоначальных (2.5 & 3.0). Why ??
    #38814365
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще один перл (тоже без индекса):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
set term ^;
execute block as begin
  begin execute statement 'create sequence g'; when any do begin end end
end
^ set term ;^
commit;
alter sequence g restart with 0;
commit;
recreate table t(id int, x int, y int);
commit;
insert into t(id) select gen_id(g,1) from rdb$types rows 3;
update t set x=mod(id,2), y=mod(id,3);
commit;

set echo on;

set transaction no auto undo;

select 'before_merge' msg, t.* from t;

set plan on;
merge into t
using t s
on t.x=s.x
when matched then update set t.x = t.x+s.y,  t.y = t.y - s.x ;
set plan off;

select 'after_merge' msg, t.* from t;

rollback;

select 'after_rollback' msg, t.* from t;

Result:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
select 'before_merge' msg, t.* from t;

MSG                    ID            X            Y
============ ============ ============ ============
before_merge            1            1            1
before_merge            2            0            2
before_merge            3            1            0


set plan on;
merge into t
using t s
on t.x=s.x
when matched then update set t.x = t.x+s.y, t.y = t.y - s.x;

PLAN MERGE (SORT (T NATURAL), SORT (S NATURAL))
set plan off;

select 'after_merge' msg, t.* from t;

MSG                   ID            X            Y
=========== ============ ============ ============
after_merge            1            2           -1
after_merge            2            2            2
after_merge            3            2           -2


rollback;

select 'after_rollback' msg, t.* from t;

MSG                      ID            X            Y
============== ============ ============ ============
after_rollback            1            2          -255 
after_rollback            2            0            2
after_rollback            3            2            0

Трейс гласит, что при этом было всего 5 (пять) апдейтов строк:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
merge into t
using t s
on t.x=s.x
when matched then update set t.x = t.x+s.y, t.y = t.y - s.x
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
PLAN MERGE (SORT (T NATURAL), SORT (S NATURAL))
0 records fetched
      0 ms, 69 fetch(es), 12 mark(s)
Table                             Natural     Index    Update
***************************************************************
T                                       6                   5
Это что же надо было такое вычитать, чтобы получить в итоге -255 ?
...
Рейтинг: 0 / 0
Результаты после merge + rollback'a... отличаются от первоначальных (2.5 & 3.0). Why ??
    #38814372
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЗЫ.
Проблема возникает только на таком плане: PLAN MERGE (SORT (T NATURAL), SORT (S NATURAL))
Если поменять условие соединения с равенства на такой вот изврат:
Код: plaintext
1.
2.
3.
4.
merge into t
using t s
 on t.x - s.x = 0  -- вместо "on t.x = s.x"
when matched then update set t.x = t.x+s.y, t.y = t.y - s.x;
- то план будет PLAN JOIN (S NATURAL, T NATURAL) и роллбак отрабатывает ОК.
...
Рейтинг: 0 / 0
Результаты после merge + rollback'a... отличаются от первоначальных (2.5 & 3.0). Why ??
    #38814405
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

пиши трекеру, будем исправлять
...
Рейтинг: 0 / 0
Результаты после merge + rollback'a... отличаются от первоначальных (2.5 & 3.0). Why ??
    #38814406
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
насколько я понимаю, проблема только в случае:
1) стейтмента MERGE с джойном и многократным обновлением одних и тех же записей (что, грубо говоря, запрещено стандартом)
2) плана MERGE (и наверное HASH тоже)
...
Рейтинг: 0 / 0
Результаты после merge + rollback'a... отличаются от первоначальных (2.5 & 3.0). Why ??
    #38814409
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitr,

откуда вообще для оператора MERGE план MERGE/HASH? Насколько я помню оператор MERGE делает right outer join, а FB даже в тройке вроде как не умеет HASH/MERGE для outer join
...
Рейтинг: 0 / 0
Результаты после merge + rollback'a... отличаются от первоначальных (2.5 & 3.0). Why ??
    #38814411
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrпиши трекеруНаписал, CORE-4618 . Пусть читает :-)
...
Рейтинг: 0 / 0
Результаты после merge + rollback'a... отличаются от первоначальных (2.5 & 3.0). Why ??
    #38814413
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrмногократным обновлением одних и тех же записей (что, грубо говоря, запрещено стандартом)Почему нельзя хотя бы в 3.0 ввести это требование стандарта и вываливать исключение при таком "странном" обновлении данных ?
Ну всё равно же полной совместимости с 2.5 по SQL/PSQL коду не будет, хотя бы из-за стабильности курсора.
...
Рейтинг: 0 / 0
Результаты после merge + rollback'a... отличаются от первоначальных (2.5 & 3.0). Why ??
    #38814417
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидПочему нельзя хотя бы в 3.0 ввести это требование стандарта и вываливать
исключение при таком "странном" обновлении данных ?
Можно, но бага всё равно придётся фиксить, поскольку рекурсивными триггерами он, скорее
всего, тоже может воспроизводиться.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Результаты после merge + rollback'a... отличаются от первоначальных (2.5 & 3.0). Why ??
    #38814442
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovрекурсивными триггерами он, скорее всего, тоже может воспроизводиться
это наврядли. Но можешь попробовать воспроизвести.
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Результаты после merge + rollback'a... отличаются от первоначальных (2.5 & 3.0). Why ??
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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