powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Derived tables: BLR at offset 7352 -context already in use при вложенности 86 и выше
12 сообщений из 12, страница 1 из 1
Derived tables: BLR at offset 7352 -context already in use при вложенности 86 и выше
    #38492282
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Derived tables: BLR at offset 7352 -context already in use при вложенности 86 и выше
    #38492288
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
число контекстов ограничено 255, в каждом твоем подзапросе 3 контекста. В чем вопрос-то?
...
Рейтинг: 0 / 0
Derived tables: BLR at offset 7352 -context already in use при вложенности 86 и выше
    #38492298
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrВ чем вопрос-то?
Почему "context already in use" вместо обычного "too many contexts". Попахивает BOF.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Derived tables: BLR at offset 7352 -context already in use при вложенности 86 и выше
    #38492302
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrчисло контекстов ограничено 255, в каждом твоем подзапросе 3 контекста. В чем вопрос-то?что такое "контекст" ? число полей в одной DT ?
...
Рейтинг: 0 / 0
Derived tables: BLR at offset 7352 -context already in use при вложенности 86 и выше
    #38492303
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

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

Tabloidчто такое "контекст" ? число полей в одной DT ?
затрудняюсь на пальцах объяснить, что-то типа материализованной в некий момент времени таблицы или ее части. Каждая таблица/процедура - контекст, каждый group by - контекст, каждый union - контекст, каждое окно (хоть order, хоть partition) - тоже контекст.
...
Рейтинг: 0 / 0
Derived tables: BLR at offset 7352 -context already in use при вложенности 86 и выше
    #38492320
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоидчто такое "контекст" ?Во время выполнения запрос вычисляет и хранит состояние каждого потока данных (таблицы в простейшем случае).
Грубо говоря - текущую запись из каждого потока.
Операторы BLR принимают номера потоков (контекстов) как параметры.
Номер контекста кодируется 1 байтом, отсюда ограничение.
...
Рейтинг: 0 / 0
Derived tables: BLR at offset 7352 -context already in use при вложенности 86 и выше
    #38492326
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Derived tables: BLR at offset 7352 -context already in use при вложенности 86 и выше
    #38492335
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

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

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




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


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