powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Сообщение об ошибке из-за рекурсии
13 сообщений из 13, страница 1 из 1
Сообщение об ошибке из-за рекурсии
    #38635346
Сисдба Мастеркеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Firebird server version
WI-V2.5.3.26758 Firebird 2.5

Скрипт
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
recreate table ttt (id varchar(1000) NOT NULL primary key);
SET TERM ^ ;
CREATE OR ALTER PROCEDURE P0 RETURNS ( V blob sub_type text) AS BEGIN SUSPEND; END^
CREATE OR ALTER PROCEDURE P1 RETURNS ( V blob sub_type text) AS BEGIN SUSPEND; END^
CREATE OR ALTER PROCEDURE P2 RETURNS ( V blob sub_type text) AS BEGIN SUSPEND; END^
CREATE OR ALTER PROCEDURE P3 RETURNS ( V blob sub_type text) AS BEGIN SUSPEND; END^
CREATE OR ALTER PROCEDURE P4 RETURNS ( V blob sub_type text) AS BEGIN SUSPEND; END^
CREATE OR ALTER PROCEDURE P5 RETURNS ( V blob sub_type text) AS BEGIN SUSPEND; END^
CREATE OR ALTER PROCEDURE P6 RETURNS ( V blob sub_type text) AS BEGIN SUSPEND; END^
CREATE OR ALTER PROCEDURE P7 RETURNS ( V blob sub_type text) AS BEGIN SUSPEND; END^
CREATE OR ALTER PROCEDURE P8 RETURNS ( V blob sub_type text) AS BEGIN SUSPEND; END^
CREATE OR ALTER PROCEDURE P9 RETURNS ( V blob sub_type text) AS BEGIN SUSPEND; END^

CREATE OR ALTER PROCEDURE P0 RETURNS ( V blob sub_type text) AS begin insert into ttt values (uuid_to_char(gen_uuid())); for select '123'||V from P1 into V do suspend; end^
CREATE OR ALTER PROCEDURE P1 RETURNS ( V blob sub_type text) AS begin insert into ttt values (uuid_to_char(gen_uuid())); for select '123'||V from P2 into V do suspend; end^
CREATE OR ALTER PROCEDURE P2 RETURNS ( V blob sub_type text) AS begin insert into ttt values (uuid_to_char(gen_uuid())); for select '123'||V from P3 into V do suspend; end^
CREATE OR ALTER PROCEDURE P3 RETURNS ( V blob sub_type text) AS begin insert into ttt values (uuid_to_char(gen_uuid())); for select '123'||V from P4 into V do suspend; end^
CREATE OR ALTER PROCEDURE P4 RETURNS ( V blob sub_type text) AS begin insert into ttt values (uuid_to_char(gen_uuid())); for select '123'||V from P5 into V do suspend; end^
CREATE OR ALTER PROCEDURE P5 RETURNS ( V blob sub_type text) AS begin insert into ttt values (uuid_to_char(gen_uuid())); for select '123'||V from P6 into V do suspend; end^
CREATE OR ALTER PROCEDURE P6 RETURNS ( V blob sub_type text) AS begin insert into ttt values (uuid_to_char(gen_uuid())); for select '123'||V from P7 into V do suspend; end^
CREATE OR ALTER PROCEDURE P7 RETURNS ( V blob sub_type text) AS begin insert into ttt values (uuid_to_char(gen_uuid())); for select '123'||V from P8 into V do suspend; end^
CREATE OR ALTER PROCEDURE P8 RETURNS ( V blob sub_type text) AS begin insert into ttt values (uuid_to_char(gen_uuid())); for select '123'||V from P9 into V do suspend; end^
CREATE OR ALTER PROCEDURE P9 RETURNS ( V blob sub_type text) AS begin insert into ttt values (uuid_to_char(gen_uuid())); for select '123'||V from P0 into V do suspend; end^
SET TERM ; ^



Теперь при попытке выполнить селект из процедуры FB вылетает:
Код: plaintext
1.
2.
3.
4.
5.
6.
SQL> select * from P1;

                V
=================
Statement failed, SQLSTATE = 08006
Unable to complete network request to host "localhost".
-Error reading data from the connection.
В firebird.log вот это:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SERVER	Wed May 07 13:25:06 2014
	 Access violation.
		The code attempted to access a virtual
		address without privilege to do so.
	This exception will cause the Firebird server
	to terminate abnormally.


SERVER (Client)	Wed May 07 13:25:07 2014
	INET/inet_error: read errno = 10054


SERVER (Client)	Wed May 07 13:25:10 2014
	REMOTE INTERFACE/gds__detach: Unsuccesful detach from database. 
	Uncommitted work may have been lost
Вылетает не всегда, иногда пишет более вменяемое сообщение о переполнении стека.

Увы, из-за сообщения про AV пришлось целый день убить на поиск реальной причины :)
...
Рейтинг: 0 / 0
Сообщение об ошибке из-за рекурсии
    #38635375
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сисдба Мастеркеевич,

1. Использование селективных процедур вместе с DML (INSERT/UPDATE/DELETE) операторами зло
2. Тут память кончилась, хотя странно что так быстро. По идее предел рекурсии процедур должен был наступить раньше
...
Рейтинг: 0 / 0
Сообщение об ошибке из-за рекурсии
    #38635388
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис> 1. Использование селективных процедур вместе с
Симонов Денис> DML (INSERT/UPDATE/DELETE) операторами зло

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

это так называемый побочный эффект. Ты хочешь получить набор записей, а он там чего то добавляет. Результаты порой могут быть непредсказуемыми. Недавнее обсуждение это ещё раз доказывает
http://www.sql.ru/forum/1080099/dvoynoy-update-bug?hl=???????? ??????
...
Рейтинг: 0 / 0
Сообщение об ошибке из-за рекурсии
    #38635619
Сисдба Мастеркеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисСисдба Мастеркеевич,

1. Использование селективных процедур вместе с DML (INSERT/UPDATE/DELETE) операторами зло
....
это так называемый побочный эффект. Ты хочешь получить набор записей, а он там чего то добавляет. Результаты порой могут быть непредсказуемыми. Недавнее обсуждение это ещё раз доказывает
http://www.sql.ru/forum/1080099/dvoynoy-update-bug?hl=???????? ??????

1. Что не запрещено, то разрешено.
2. Я знаю, что именно делаю. Мне нужны именно селективные процедуры. Если в процедуре есть suspend и я делаю из нее select, это не означает, что она всенепременно должна быть read-only. К тому же, к ошибке это не имеет отношения.


Симонов Денис2. Тут память кончилась, хотя странно что так быстро. По идее предел рекурсии процедур должен был наступить раньше
Дак и надо выдавать сообщение о кончившейся памяти. В других случаях сервер ведь умеет это делать. ИМХО, тут где-то недопредусмотрена какая-то ситуация. А падать сервер не должен никогда.
...
Рейтинг: 0 / 0
Сообщение об ошибке из-за рекурсии
    #38635623
Сисдба Мастеркеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я так понимаю, раз воспроизводится, надо товарищу трекеру писать. Беда - я буржуинским не владею :(
...
Рейтинг: 0 / 0
Сообщение об ошибке из-за рекурсии
    #38635640
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сисдба Мастеркеевич,

Что падать не должен согласен.
Переведи через google translate фиг с ним что коряво будет, но там поймут. К тому же много слов там и не надо писать
...
Рейтинг: 0 / 0
Сообщение об ошибке из-за рекурсии
    #38635741
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисЧто падать не должен согласен.
а что должен делать?
...
Рейтинг: 0 / 0
Сообщение об ошибке из-за рекурсии
    #38635760
Сисдба Мастеркеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitr,

Например, вывести что-то типа такого. (если оставить только 2 процедуры в рекурсии)

Код: 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.
SQL> select * from P1;

                V
=================
Statement failed, SQLSTATE = 54001
Too many concurrent executions of the same request
-At procedure 'P0' line: 1, col: 122
At procedure 'P1' line: 1, col: 122
At procedure 'P0' line: 1, col: 122
At procedure 'P1' line: 1, col: 122
At procedure 'P0' line: 1, col: 122
At procedure 'P1' line: 1, col: 122
At procedure 'P0' line: 1, col: 122
At procedure 'P1' line: 1, col: 122
At procedure 'P0' line: 1, col: 122
At procedure 'P1' line: 1, col: 122
At procedure 'P0' line: 1, col: 122
At procedure 'P1' line: 1, col: 122
At procedure 'P0' line: 1, col: 122
At procedure 'P1' line: 1, col: 122
At procedure 'P0' line: 1, col: 122
At procedure 'P1' line: 1, col: 122
At procedure 'P0' line: 1, col: 122
At procedure 'P1' line: 1, col: 122
At procedure 'P0' line: 1, col: 122
At procedure 'P1' line: 1, col: 122
At procedure 'P0' line: 1, col: 122
At procedure 'P1' line: 1, col: 122
At procedure 'P0' line: 1, col: 122
At procedure 'P1' line: 1, col: 122
At procedure 'P0' line: 1, col: 122
At procedure 'P1' line: 1, col: 122
At procedure 'P0' line: 1, col: 122
At procedure 'P1' line: 1, col: 122
At procedur...
SQL>
...
Рейтинг: 0 / 0
Сообщение об ошибке из-за рекурсии
    #38635854
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сисдба Мастеркеевич,

там кстати ещё предел для BLOB в 2G мог быть преодолён
...
Рейтинг: 0 / 0
Сообщение об ошибке из-за рекурсии
    #38635961
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сисдба Мастеркеевич,

а если процедур 100000? Рекурсии вообще не будет, а стек все равно кончится.
...
Рейтинг: 0 / 0
Сообщение об ошибке из-за рекурсии
    #38635977
Сисдба Мастеркеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> а если процедур 100000? Рекурсии вообще не будет, а стек все равно кончится.


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

научи как. На всех платформах.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Сообщение об ошибке из-за рекурсии
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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