Bug 2489

Summary: не транслируются запросы с апострофами в значениях полей
Product: SELTA@Etersoft Reporter: Калюхович Юрий <goga>
Component: selta.dllAssignee: Станислав Коробейников <stas>
Status: CLOSED FIXED QA Contact:
Severity: normal    
Priority: P4 CC: lav, mk, stas
Version: 1.0.4   
Target Milestone: версия 1.0.4   
Hardware: PC   
OS: All   
Whiteboard:
Заявки RT: Связано с:
Дата напоминания:
Bug Depends on:    
Bug Blocks: 2637    

Description Калюхович Юрий 2008-09-22 16:56:54 MSD
"Не работает метод справочника "НайтиПоНаименованию"

Кусок кода:
Наименование = "L'Oreal";
СпрПроизводители = СоздатьОбъект("Справочник.Производители");
Если СпрПроизводители.НайтиПоНаименованию(Наименование) = 1 Тогда
...
КонецЕсли;

Метод "НайтиПоНаименованию()" выдает ошибку, характерную для запросов,
невозможных к выполнени, затем "Невосстановимую ошибку базы данных".
1С не выдерживает такого издевательства и сразу после этого молча
выгружается из памяти."
Comment 1 Калюхович Юрий 2008-10-09 16:50:30 MSD
(In reply to comment #0)
> "Не работает метод справочника
> "НайтиПоНаименованию"
> 
> Кусок кода:
> Наименование = "L'Oreal";
> СпрПроизводители =
> СоздатьОбъект("Справочник.Производители");
> Если
> СпрПроизводители.НайтиПоНаименованию(Наименование)
> = 1 Тогда
> ...
> КонецЕсли;
> 
> Метод "НайтиПоНаименованию()" выдает
> ошибку, характерную для запросов,
> невозможных к выполнени, затем
> "Невосстановимую ошибку базы данных".
> 1С не выдерживает такого издевательства и
> сразу после этого молча
> выгружается из памяти."
> 

не воспроизвелась, метод работает корректно
1С7.7 конф. Бухгалтерия, сельта последней сборки
Comment 2 Калюхович Юрий 2008-11-10 16:13:29 MSK
проблема не в методе, а в имени L'Oreal - тут есть апостроф, а после, вследствие его удвоения, транслятор неправильно воспринимает транслируемую строку и получаем ошибку.

исходный запрос:
set rowcount 1 select * from SC8193(NOLOCK INDEX=DESCR) where DESCR>='L''Oreal' and substring(DESCR,1,7)='L''Oreal' order by DESCR,ROW_ID set rowcount 0

необходимый результат:
SELECT * FROM SC8193 WHERE DESCR>='L''Oreal' AND SUBSTR (DESCR, 1, 7)='L''Oreal' ORDER BY DESCR, ROW_ID LIMIT 1
Comment 3 Vitaly Lipatov 2008-11-11 08:41:39 MSK
Не забудьте вставить в тест запросов. Стас в курсе.
Comment 4 Станислав Коробейников 2009-01-28 17:52:10 MSK
Есть подозрение, что по этой заявке -- http://rt.etersoft.ru/Ticket/Display.html?id=9426 падает по этой баге. 
По крайней мере я увидел у него в logах:
set rowcount 1 select * from SC172(NOLOCK INDEX=PDESCR) where PARENTID=E'     2   ' and DESCR>='''' and substring(DESCR,1,1)='''' order by PARENTID,ISFOLDER, DESCR,ROW_ID set rowcount 0


Итак 
='L''Oreal'
Парсер интерпретирует как expr expr , где первый expr='L' второй 'Oreal'
Попробывал сделать '' как токен
Получилось, что
'LOreal''' преобразовывается а 'LOreal' || mchar('')
'''LOreal' преобразовывается а mchar('') || 'LOreal'  
Но в 'L''Oreal' он видит все равно два expr, и соответственно не видит токен ''
такое выражение преобразует в 'L''''Oreal' в   'L' || mchar('') || 'Oreal'
Может из двух апострофов делать четыре. Как бы с этим разобраться пока не знаю. 
Comment 5 Станислав Коробейников 2009-01-29 13:57:16 MSK
Для 'L''Oreal'
попробывал сделать 
WORDS WORDS 
получилось ('L'||mchar('''')||'Oreal')
Но сломалось 
>>>>>>SELECT A b
<<<<<<SELECT A||mchar('''')||b
Должно быть SELECT A AS b;

Вообще-то не писать AS не очень хорошо, но в bol написано [ [ AS ] column_alias ]. 
И похоже кто-то так и делает, потому что такой запрос есть в test.sql

Comment 6 Станислав Коробейников 2009-01-29 16:25:53 MSK
Можно в начале при разборе строки менять '' двойной апостроф на другие символы. 

В трансляторе используется кодировка cp1251.
Можно использовать символы 0x89 (Процент с двумя кружками) и 0x9A (ЛЬ вместе)
Comment 7 Станислав Коробейников 2009-01-30 13:59:31 MSK
Сделал две функции
Одна до парсинга меняет '' на 0x89 (Процент с двумя кружками) и 0x9A (ЛЬ вместе).  Вторая после парсинга возвращает все обратно. 

Сделал, протестировал.