Summary: | Вылетает при загрузке обновления (УРБД) | ||
---|---|---|---|
Product: | SELTA@Etersoft | Reporter: | Станислав Коробейников <stas> |
Component: | selta.dll | Assignee: | Станислав Коробейников <stas> |
Status: | CLOSED FIXED | QA Contact: | |
Severity: | critical | ||
Priority: | P4 | CC: | goga, lav, shan |
Version: | 1.0.5 | ||
Target Milestone: | версия 1.0.4 | ||
Hardware: | PC | ||
OS: | All | ||
Whiteboard: | |||
Заявки RT: | Связано с: | ||
Дата напоминания: | |||
Bug Depends on: | |||
Bug Blocks: | 3166 |
Description
Станислав Коробейников
2009-02-25 17:21:58 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'овские, и я думаю их менять не надо. Баги 3601, 3560 закрывать не стал. Так как надо будет сделать более нормальное решение. Т.е. исправить пачи от 1с. Пока будет так. Просто будут создаваться функции для привидения типов при сравнении mchar и mvarchar |