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

Отработанное время:
Продуктивное время:
Bug 2489 - не транслируются запросы с апострофами в значениях полей   Make a simular bug
Summary: не транслируются запросы с апострофами в значениях полей
Status: CLOSED FIXED
Alias: None
Product: SELTA@Etersoft
Classification: Продукты (Products)
Component: selta.dll (show other bugs)
Version: 1.0.4
Hardware: PC All
: P4 normal
Target Milestone: версия 1.0.4
Assignee: Станислав Коробейников
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks: 2637
  Show dependency treegraph
 
In work:
Reported: 2008-09-22 16:56 MSD by Калюхович Юрий
Modified: 2009-02-19 10:34 MSK (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 Калюхович Юрий 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 (ЛЬ вместе).  Вторая после парсинга возвращает все обратно. 

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