Bug 3564

Summary: SUBSTR и тип возвращаемого значения.
Product: SELTA@Etersoft Reporter: Станислав Коробейников <stas>
Component: ОбщееAssignee: Станислав Коробейников <stas>
Status: CLOSED LATER QA Contact:
Severity: major    
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: 3247    

Description Станислав Коробейников 2009-02-26 17:55:33 MSK
1. Проблема 1. (бага 2231)
CAST('aaa' AS nchar(10)) + CAST('aaa' AS nchar(10)) = "aaa       aaa       "
2. Проблема 2. (бага 3560)
...
WHERE DELREC.TYPE=SUBSTR (CAST((DT.SP2156) as mvarchar), 1, 2)
DELREC.TYPE и DT.SP2156 mchar
ERROR: could not find member 1(298099,298099) of opfamily 298262

Надо разобраться как работает SUBSTR от 1с в Postgres и substring в MSSQL. И подумать как изменить сложившуюся ситуацию.
Comment 1 Станислав Коробейников 2009-02-26 17:59:16 MSK
Тест:
Складываем две строки:  


postgres:
SELECT CAST('aaa' as mchar(10)) + CAST('aaa' as mchar(10)) as plus_mchar_10 ,
CAST('aaa' as mvarchar(10)) + CAST('aaa' as mvarchar(10)) as plus_mvarchar_10

mchar(10)    "aaa       aaa       ",
mvarchar(10) "aaaaaa"

MSSQL
SELECT     CAST('aaa' AS nchar(10)) + CAST('aaa' AS nchar(10)) AS plus_nchar_10, CAST('aaa' AS char(10)) + CAST('aaa' AS char(10)) AS plus_char_10, CAST('aaa' AS nvarchar(10)) + CAST('aaa' AS nvarchar(10)) AS plus_nvarchar_10

nchar(10)    "aaa       aaa       "
char(10)     "aaa       aaa       "
nvarchar(10) "aaaaaa"

Получили одинаковые результаты. 

Тест 2:
Складываем две строки:  после substr

postgres:
SELECT substr(CAST('aaa' AS mchar(10)),1,2) + substr(CAST('aaa' AS mchar(10)),1,2) as plus_substr_mchar_10,
substr(CAST('aaa' AS mvarchar(10)),1,2) + substr(CAST('aaa' AS mvarchar(10)),1,2) as plus_substr_mvarchar_10


substr(,1,2) mchar(10)    "aa        aa        " 
substr(,1,2) mvarchar(10) "aaaa"

MSSQL
SELECT SUBSTRING(CAST('aaa' AS nchar(10)), 1, 2) + SUBSTRING(CAST('aaa' AS nchar(10)), 1, 2) AS plus_substr_nchar_10, 
SUBSTRING(CAST('aaa' AS char(10)), 1, 2) + SUBSTRING(CAST('aaa' AS char(10)), 1, 2) AS plus_substr_char_10, 
SUBSTRING(CAST('aaa' AS nvarchar(10)), 1, 2) + SUBSTRING(CAST('aaa' AS nvarchar(10)), 1, 2) AS plus_substr_nvarchar_10
со всеми тремя типами результат один "aaaa"

вовращаемые типы:
plus_substr_nchar_10    nvarchar(4)
plus_substr_char_10	varchar(4)
plus_substr_nvarchar_10	nvarchar(4)

т.е. от преобразует все в var

Итак по разному работает SUBSTRING и SUBSTR.


Надо заметить, что в selta тоже преобразовывалось но вызвало багу , но путем лишниго преобразования уже после самого парсинья

Итого: MSSQL возвращает (n)varchar(число символов на выходе)
postgres тоже самое, что на входе. 
Comment 2 Станислав Коробейников 2010-10-22 19:32:51 MSD
Пока отложим. Это не существенная бага. 
Comment 3 Vitaly Lipatov 2014-09-11 18:51:07 MSK
Для тех, кто не пользуется багзиллой или не умеет пользоваться групповым редактированием при поиске, закрываем задачи, которые они должны были принять.