Bug 7311

Summary: ODBC escape convert error
Product: SELTA@Etersoft Reporter: Станислав Коробейников <stas>
Component: ПарсерAssignee: Калюхович Юрий <goga>
Status: CLOSED FIXED QA Contact:
Severity: minor    
Priority: P4 CC: goga, lav
Version: 1.1.0   
Target Milestone: версия 1.0.4   
Hardware: PC   
OS: All   
Whiteboard:
Заявки RT: Связано с:
Дата напоминания:
Bug Depends on:    
Bug Blocks: 6158    

Description Станислав Коробейников 2011-05-19 16:15:37 MSK
В нашей базе. Воспроизводится 
Отчеты -> Специализированные -> Акт сверки. Контрагент. Там набираем символы для поиска, потом из удаляем
Есть только лог ODBC:


1cv7s           40-41   EXIT  SQLExecDirect  with return code -1 (SQL_ERROR)                                                                                               
                HSTMT               0B4B15B8                                                                                                                               
                UCHAR *             0x00FD5648 [      -3] "set rowcount 1 select * from SC133(NOLOCK INDEX=PDESCR) where PARENTID=? and DESCR>='\ 8' and substring(DESCR,1,
1)='\ 8' order by PARENTID,ISFOLDER, DESCR,ROW_ID set rowcount 0\ 0"                                                                                                       
                SDWORD                    -3                                                                                                                               
                                                                                                                                                                           
                DIAG [HY000] ODBC escape convert error (1)
Comment 1 Калюхович Юрий 2011-05-19 17:29:21 MSK
(В ответ на comment #0)
> Есть только лог ODBC:
>                 UCHAR *             0x00FD5648 [      -3] "set rowcount 1
> select * from SC133(NOLOCK INDEX=PDESCR) where PARENTID=? and DESCR>='\ 8' and
> substring(DESCR,1,
> 1)='\ 8' order by PARENTID,ISFOLDER, DESCR,ROW_ID set rowcount 0\ 0"            

подозреваю, что из-за бэкслэша. надо еще посмотреть что в логе сельты
Comment 2 Станислав Коробейников 2011-05-19 17:44:36 MSK
К сожалению не делал для другой баги и не логов SELTA нет.
Comment 3 Калюхович Юрий 2011-05-19 18:47:21 MSK
(В ответ на comment #1)
> >                 UCHAR *             0x00FD5648 [      -3] "set rowcount 1
> > select * from SC133(NOLOCK INDEX=PDESCR) where PARENTID=? and DESCR>='\ 8' and
> > substring(DESCR,1,
> > 1)='\ 8' order by PARENTID,ISFOLDER, DESCR,ROW_ID set rowcount 0\ 

написал тест для odbc, но воспроизвести пока не смог.
Comment 4 Калюхович Юрий 2011-05-19 22:38:46 MSK
воспроизвел ошибку. нужно Отчеты -> Специализированные -> Акт сверки, Контрагент - набрать один символ, затем backspace, и получается ошибка

только не очень понятно почему. в логах сельты - символ "точка" (.) и ошибка трансляции
в трассировке - вообще '\ 8'
Comment 5 Калюхович Юрий 2011-05-19 23:52:48 MSK
кажется, что нажатие backspace передается как символ, а не затирает последний символ в строке поиска - даже простое нажатие backspace ведет к падению 1С. это объясняет и ошибку в парсере - он ругается на кавычку, 

посмотрел в hex: действительно, там символ 0x08, а это и есть backspace в ascii;
непонятно только, как такое возможно... надо посмотреть в mssql и виндовом odbc
Comment 6 Калюхович Юрий 2011-05-20 12:41:06 MSK
(В ответ на comment #5)
> посмотрел в hex: действительно, там символ 0x08

wine(cellar) + mssql(win2008-mssql2005, virtualbox) не воспроизвелось. ошибка где-то в odbc? т.к. в сельту уже приходит неправильный запрос
Comment 7 Калюхович Юрий 2011-05-20 14:57:02 MSK
можно решить, если добавить в грамматику ''{&0008}'' в определение строки. но это будет хак.
истинной причины я не понял, почему в парсер попадает символ 0x08. проверил, это не SQLBindParameter(). и не понятно, почему mssql-odbc нормально отрабатывает
Comment 8 Станислав Коробейников 2011-05-20 15:09:08 MSK
(В ответ на comment #7)
> можно решить, если добавить в грамматику ''{&0008}'' в определение строки. но
> это будет хак.

Мне не кажется, что это хак, если MS SQL считает, что 0x08 символ это символ строки, то SELTA тоже может так считать. 

> истинной причины я не понял, почему в парсер попадает символ 0x08. проверил,
> это не SQLBindParameter(). и не понятно, почему mssql-odbc нормально
> отрабатывает
Мне показалось, что попадает через SQLExecDirect напрямую от 1с (DESCR>='\ 8')
Comment 9 Калюхович Юрий 2011-05-20 16:22:32 MSK
(В ответ на comment #8)
> Мне не кажется, что это хак, если MS SQL считает, что 0x08 символ это символ
> строки, то SELTA тоже может так считать. 

Действительно, в трассировке (wine+mssql) тот же символ - '\ 8' , т.е. для odbc и mssql это нормально, получать backspace как строку
Comment 10 Калюхович Юрий 2011-05-20 16:36:51 MSK
закоммитил, сделал revision 9, выложил на ftp. в 1С больше не воспроизводится.
Comment 11 Vitaly Lipatov 2014-09-11 18:44:03 MSK
Для тех, кто не пользуется багзиллой или не умеет пользоваться групповым редактированием при поиске, закрываем задачи, которые они должны были принять.