Есть "деревянная" таблица 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

Ответить