Есть "деревянная" таблица id-parent_id из которой, приведенным ниже
запросом выгребается кусочек дерева с украшательствами.
В какой-то момент захотелось добавить позициям дерева коментарии -
обычный alter table с полем varchar(500), и казалось все проблемы. Но
теперь, тот же самый запрос(если в нем оставить вызовы u/sdf) роняет
сервер без каких-либо записей в логе. Что примечательно, после апдейта
поля item_name падения прекращаются, как впрочем и после b/r.
Падение обнаружить получилось только на рекурсивном запросе с вызовами
функций, в других комбинациях все ок.
По причине требований конфиденциальности выслать базу не могу, а в
порезанной эффект пропадает.
Судя по признакам, причина в побившихся, каким-то образом, данных, и,
в принципе, для себя проблему решили.
Но молчаливое падение сервера все же смущает.
Можно чем-то помочь в нахождении бага? Отладочный билд и т.п.?
-- перечень групп
with recursive
tree_root as
(
SELECT ti.id_item, ti.id_parent_item, 0 as tree_level, ti.item_name
FROM dict_item ti
WHERE ti.id_parent_item IS NULL and ti.is_group=1
order by ti.item_order,ti.item_name
),
-- рекурсивно выбираем непустые группы
dict_item_tree AS
(
SELECT ti.id_item, ti.id_parent_item, ti.tree_level, ti.item_name
FROM tree_root ti
UNION ALL
SELECT i.id_item, i.id_parent_item, dt.tree_level+1 as tree_level,
i.item_name
FROM dict_item i
join dict_item_tree dt on i.id_parent_item=dt.id_item and
i.is_group=1
and exists(select 1 from dict_item ci where
ci.id_parent_item=i.id_item)
)
select t.id_item
,LPAD(t.item_name, strlen(t.item_name)+t.tree_level*5)-- делаем
отступы по уровням
from dict_item_tree t
CREATE TABLE DICT_ITEM (
ID_ITEM ID_DMN NOT NULL /* ID_DMN = INTEGER */,
ITEM_NAME CAPTION_DMN /* CAPTION_DMN = VARCHAR(100) */,
ID_PARENT_ITEM ID_DMN DEFAULT 90000 /* ID_DMN = INTEGER */,
IS_GROUP BOOLEAN_DMN DEFAULT 0 /* BOOLEAN_DMN = INTEGER
DEFAULT 0 NOT NULL */,
DELETE_TIME TIMESTAMP DEFAULT '01.01.3000' NOT NULL,
ITEM_KIND KIND_DMN DEFAULT 0 NOT NULL /* KIND_DMN = INTEGER
*/,
ITEM_ORDER INTEGER DEFAULT 0,
ID_C1_COST C1_ID_DMN /* C1_ID_DMN = VARCHAR(13) */,
ID_C1_CLIENT C1_ID_DMN /* C1_ID_DMN = VARCHAR(13) */,
NOTES VARCHAR(500),
ITEM_NAME_1C CAPTION_DMN /* CAPTION_DMN = VARCHAR(100) */
);
PS после очередного альтера этой злосчастной таблицы - вновь таже
проблема :-/
--
С уважением, Nikolay Ponomarenko