Укажите отработанное время

Отработанное время:
Продуктивное время:
Bug 3560 - Вылетает при загрузке обновления (УРБД)   Make a simular bug
Summary: Вылетает при загрузке обновления (УРБД)
Status: CLOSED FIXED
Alias: None
Product: SELTA@Etersoft
Classification: Продукты (Products)
Component: selta.dll (show other bugs)
Version: 1.0.5
Hardware: PC All
: P4 critical
Target Milestone: версия 1.0.4
Assignee: Станислав Коробейников
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks: 3166
  Show dependency treegraph
 
In work:
Reported: 2009-02-25 17:21 MSK by Станислав Коробейников
Modified: 2010-04-15 13:06 MSD (History)
3 users (show)

See Also:
Заявки RT:
Связано с:
Дата напоминания:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Станислав Коробейников 2009-02-25 17:21:58 MSK
в баге 3448 об этом написано. Но это не важно
при загрузке
обновления (УРБД) из центра (он пока на dbf)
ош:

CB  SQL State: XX000 Native: 7 Message: ERROR: could not find member
1(32914956,32914956) of opfamily 32915119; Error while executing the quer
Загрузка не выполнена!
Comment 1 Станислав Коробейников 2009-02-25 17:38:03 MSK
Можно повторить таким образом в базе ЗИК выполняем следующее:
CREATE TEMPORARY TABLE TMPDELREC (TYPE MCHAR(2) NOT NULL, MDID MCHAR(4) NOT NULL, OBJID MCHAR(9) NOT NULL);
SELECT * FROM TMPDELREC WHERE 0=1
INSERT INTO TMPDELREC VALUES (E'E1', E'  65', E'    O9   ')
INSERT INTO TMPDELREC VALUES (E'E1', E'  65', E'    YA   ')
INSERT INTO TMPDELREC VALUES (E'E1', E'  65', E'    YB   ')
ALTER TABLE TMPDELREC ADD PRIMARY KEY (TYPE, MDID, OBJID); ALTER TABLE TMPDELREC CLUSTER ON TMPDELREC_pkey

затем делаем запрос
SELECT *
FROM DT2162 DT, TMPDELREC DELREC 
WHERE DELREC.TYPE=SUBSTR (CAST((DT.SP2156) as mvarchar), 1, 2)

получам ошибку:
ERROR: could not find member 1(298099,298099) of opfamily 298262
SQL state: XX000

Ошибка происходит в сравнении DELREC.TYPE=SUBSTR (CAST((DT.SP2156) as mvarchar), 1, 2) т.е. mchar с mvarchar. Это корректное сравнение и для него есть соответствующая функция. Тоже самое сравнение, но с заменой на значения работает нормально. 

SUBSTR (CAST((DT.SP2156) as mvarchar), 1, 2) это selta заменяет substring(DT.SP2156, 1, 2) DT.SP2156 -- это mchar. 

Тоже самое, но без CAST'а работает нормально, но тогда рушится:
SUBSTR ('postadsfjklj'::mchar(10) , 1, 4) ||SUBSTR ('gresssasd'::mchar(10) , 1, 4) выдает 'post      gres      ' а это не правильно.

Назад в парсере не получится конвертировать т.к. неизвестно изначальный тип. 

Придумал сделать функцию: 
-- Function: substrcut(mchar, integer, integer)

-- DROP FUNCTION substrcut(mchar, integer, integer);

CREATE OR REPLACE FUNCTION substrcut(str mchar, pos integer, len integer)
  RETURNS mchar AS
$BODY$
declare
begin
return substr(str::mvarchar,pos,len)::mchar;
end
$BODY$
  LANGUAGE 'plpgsql' IMMUTABLE
  COST 100;
ALTER FUNCTION substrcut(mchar, integer, integer) OWNER TO postgres;

И такую же для mvarchar, только без преобразований. Будет работать. Но два преобразования.

Можно еще заменить сами функции mchar_substring в postgres'e. Но они 1c'овские, и я думаю их менять не надо. 
Comment 2 Станислав Коробейников 2009-03-27 12:33:28 MSK
Баги 3601, 3560 закрывать не стал. Так как надо будет сделать более нормальное решение. Т.е. исправить пачи от 1с. Пока будет так. Просто будут создаваться функции для привидения типов при сравнении mchar и mvarchar