Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Derived tables: BLR at offset 7352 -context already in use при вложенности 86 и выше / 12 сообщений из 12, страница 1 из 1
06.12.2013, 18:44:00
    #38492282
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Derived tables: BLR at offset 7352 -context already in use при вложенности 86 и выше
hi all

Имеется батник, который генерит запрос вида:
Код: sql
1.
2.
3.
4.
5.
6.
7.
. . .
select x,lag(x)over(order by x) x2,max(x)over(partition by x) mx from(   
  select x,lag(x)over(order by x) x2,max(x)over(partition by x) mx from(   
    select x from t0
  )z 
)z 
. . .

- и вложенность этого запроса может быть любой, т.к. определяется входным аргументом батника.
Текст батника ( внимание! пересоздаст базу с именем ` foo.fdb `):
gendt.bat
Код: 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.
@echo off
@if .%1.==.. goto syntax
 del foo.fdb  2>nul
del getdt.log 2>nul

set sql=gendt.sql
echo create database ' foo.fdb ' user 'sysdba' password 'masterke'; commit;>%sql%
@rem echo connect 'localhost:%~dp0foo.fdb' user 'sysdba' password 'masterke';>>%sql%
echo recreate table t0(x int); commit;>>%sql%
echo create index t_x on t0(x); commit;>>%sql%
echo insert into t0(x) values(1); commit;>>%sql%
echo insert into t0(x) values(2); commit;>>%sql%
echo select * from t0; commit;>>%sql%
echo connect 'foo.fdb' user 'sysdba' password 'masterke'; commit;>>%sql%
echo show version;>>%sql%
echo set stat on;>>%sql%
echo set list on;>>%sql%
echo set plan on;>>%sql%
echo -----------;>>%sql%

for /L %%i in (1, 1, %1) do ( echo select x,lag^(x^)over^(order by x^) x2,max^(x^)over^(partition by x^) mx from^(  >>%sql% )

echo select x from t0>>%sql%

for /L %%i in (1, 1, %1) do echo )z >>%sql%%

echo ;>>%sql%

echo set stat off;>>%sql%
echo out;>>%sql%

@rem isql -i %sql% -m -o getwid.log
@rem type getwid.log 2>nul
  goto end
:syntax
  @echo off
  cls
  echo use 1st arg as limit of derived tables depth
  pause>nul
  goto end
:end
Пример создаваемого .sql-скрипта при вызове gendt.bat 5:
Код: 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.
create database 'foo.fdb' user 'sysdba' password 'masterke'; commit;
recreate table t0(x int); commit;
create index t_x on t0(x); commit;
insert into t0(x) values(1); commit;
insert into t0(x) values(2); commit;
select * from t0; commit;
connect 'foo.fdb' user 'sysdba' password 'masterke'; commit;
show version;
set stat on;
set list on;
set plan on;
-----------;
select x,lag(x)over(order by x) x2,max(x)over(partition by x) mx from(   
select x,lag(x)over(order by x) x2,max(x)over(partition by x) mx from(   
select x,lag(x)over(order by x) x2,max(x)over(partition by x) mx from(   
select x,lag(x)over(order by x) x2,max(x)over(partition by x) mx from(   
select x,lag(x)over(order by x) x2,max(x)over(partition by x) mx from(   
select x from t0
)z 
)z 
)z 
)z 
)z 
;
set stat off;
out;


Ну-с, а теперь начинаем издевацца над ФБ.
Если запустить аргументом = 85, а затем натравить на скрипт isql, то получим последний адекватный результат:
Код: 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.
C:\1Install\fb30>isql -q -i gendt.sql

           X
============
           1
           2

ISQL Version: WI-T3.0.0.30663 Firebird 3.0 Alpha 1
Server version:
Firebird/Windows/Intel/i386 (access method), version "WI-T3.0.0.30663 Firebird 3.0 Alpha 1"
on disk structure version 12.0

PLAN (Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z
 Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z T0 NATURAL)

X                               1
X2                              <null>
MX                              1

X                               2
X2                              1
MX                              2


Current memory = 596668424
Delta memory = 13472488
Max memory = 620464336
Elapsed time= 0.12 sec
Buffers = 131072
Reads = 28
Writes 0
Fetches = 195

Если же увеличить вложенность на 1, то есть до 86, то получаем по лбу:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
           X
============
           1
           2

ISQL Version: WI-T3.0.0.30663 Firebird 3.0 Alpha 1
Server version:
Firebird/Windows/Intel/i386 (access method), version "WI-T3.0.0.30663 Firebird 3.0 Alpha 1"
on disk structure version 12.0
Statement failed, SQLSTATE = HY000
invalid request BLR at offset 7352
-context already in use (BLR error)
After line 11 in file genwid.sql

В аттаче - скрипт с глубиной 86.

ЗЫ. То же самое в
Код: plaintext
1.
2.
3.
ISQL Version: LI-T3.0.0.30780 Firebird 3.0 Alpha 1
Server version:
Firebird/Linux/AMD/Intel/x64 (access method), version "LI-T3.0.0.30780 Firebird 3.0 Alpha 1"
on disk structure version 12.0

ЗЫ-2. Вопрос на самом деле продиктован более еще интересным "артефактом", но о нём в другом топеге.
...
Рейтинг: 0 / 0
06.12.2013, 18:50:44
    #38492288
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Derived tables: BLR at offset 7352 -context already in use при вложенности 86 и выше
число контекстов ограничено 255, в каждом твоем подзапросе 3 контекста. В чем вопрос-то?
...
Рейтинг: 0 / 0
06.12.2013, 19:04:29
    #38492298
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Derived tables: BLR at offset 7352 -context already in use при вложенности 86 и выше
dimitrВ чем вопрос-то?
Почему "context already in use" вместо обычного "too many contexts". Попахивает BOF.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
06.12.2013, 19:07:03
    #38492302
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Derived tables: BLR at offset 7352 -context already in use при вложенности 86 и выше
dimitrчисло контекстов ограничено 255, в каждом твоем подзапросе 3 контекста. В чем вопрос-то?что такое "контекст" ? число полей в одной DT ?
...
Рейтинг: 0 / 0
06.12.2013, 19:11:19
    #38492303
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Derived tables: BLR at offset 7352 -context already in use при вложенности 86 и выше
Dimitry Sibiryakov,

BOF-а там нет, но счетчик похоже завернулся раньше проверки. Впрочем, это давний боян.

Tabloidчто такое "контекст" ? число полей в одной DT ?
затрудняюсь на пальцах объяснить, что-то типа материализованной в некий момент времени таблицы или ее части. Каждая таблица/процедура - контекст, каждый group by - контекст, каждый union - контекст, каждое окно (хоть order, хоть partition) - тоже контекст.
...
Рейтинг: 0 / 0
06.12.2013, 19:26:39
    #38492320
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Derived tables: BLR at offset 7352 -context already in use при вложенности 86 и выше
Таблоидчто такое "контекст" ?Во время выполнения запрос вычисляет и хранит состояние каждого потока данных (таблицы в простейшем случае).
Грубо говоря - текущую запись из каждого потока.
Операторы BLR принимают номера потоков (контекстов) как параметры.
Номер контекста кодируется 1 байтом, отсюда ограничение.
...
Рейтинг: 0 / 0
06.12.2013, 19:32:48
    #38492326
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Derived tables: BLR at offset 7352 -context already in use при вложенности 86 и выше
hvladзапрос вычисляет и хранит состояние каждого потока данных (таблицы в простейшем случае).
Грубо говоря - текущую запись из каждого потока.
Операторы BLR принимают номера потоков (контекстов) как параметры.
Номер контекста кодируется 1 байтом, отсюда ограничение.Сорри, но ЯНХНП. Потоки и контексты - это одно и тоже (здесь) или нет ?
И еще:
Код: sql
1.
2.
3.
select x,lag(x)over(order by x) x2,max(x)over(partition by x) mx from(   
select x from t0
)z

-- сколько тут потоков/контекстов ? Можно как-то их в этом фрагменте выделить ?
...
Рейтинг: 0 / 0
06.12.2013, 19:42:31
    #38492335
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Derived tables: BLR at offset 7352 -context already in use при вложенности 86 и выше
Таблоид,

должно быть три - t0, первый over, второй over. Но может оказаться, что на самом деле четыре, ХЗ как там ремаппятся оригинальные поля в оконных выражениях (mx.x может иметь свой контекст).
...
Рейтинг: 0 / 0
06.12.2013, 21:27:20
    #38492419
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Derived tables: BLR at offset 7352 -context already in use при вложенности 86 и выше
ТаблоидПотоки и контексты - это одно и тожеДа
...
Рейтинг: 0 / 0
06.12.2013, 21:51:17
    #38492429
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Derived tables: BLR at offset 7352 -context already in use при вложенности 86 и выше
dimitrmx.x может иметь свой контекст
тьфу, имелся ввиду "наружный" x, который на одном уровне с оконными функциями
...
Рейтинг: 0 / 0
06.12.2013, 23:40:41
    #38492490
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Derived tables: BLR at offset 7352 -context already in use при вложенности 86 и выше
Симонов Денисинтересно а вот в таком запросе

Код: sql
1.
select * from sp_myproc(1) 




количество контекстов будет равно 1Да
...
Рейтинг: 0 / 0
15.12.2013, 12:31:37
    #38501297
Ivan_Pisarevsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Derived tables: BLR at offset 7352 -context already in use при вложенности 86 и выше
оффтоп вынесен в отдельный топик, в силу того, что функционал новый я выносил все довольно долго, если что-то потерял при переносе, значит потерял.
500 джойнов и IN
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Derived tables: BLR at offset 7352 -context already in use при вложенности 86 и выше / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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