Summary: | не транслируются запросы с апострофами в значениях полей | ||
---|---|---|---|
Product: | SELTA@Etersoft | Reporter: | Калюхович Юрий <goga> |
Component: | selta.dll | Assignee: | Станислав Коробейников <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
(In reply to comment #0) > "Не работает метод справочника > "НайтиПоНаименованию" > > Кусок кода: > Наименование = "L'Oreal"; > СпрПроизводители = > СоздатьОбъект("Справочник.Производители"); > Если > СпрПроизводители.НайтиПоНаименованию(Наименование) > = 1 Тогда > ... > КонецЕсли; > > Метод "НайтиПоНаименованию()" выдает > ошибку, характерную для запросов, > невозможных к выполнени, затем > "Невосстановимую ошибку базы данных". > 1С не выдерживает такого издевательства и > сразу после этого молча > выгружается из памяти." > не воспроизвелась, метод работает корректно 1С7.7 конф. Бухгалтерия, сельта последней сборки проблема не в методе, а в имени 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 Не забудьте вставить в тест запросов. Стас в курсе. Есть подозрение, что по этой заявке -- 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' Может из двух апострофов делать четыре. Как бы с этим разобраться пока не знаю. Для '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
Можно в начале при разборе строки менять '' двойной апостроф на другие символы. В трансляторе используется кодировка cp1251. Можно использовать символы 0x89 (Процент с двумя кружками) и 0x9A (ЛЬ вместе) Сделал две функции Одна до парсинга меняет '' на 0x89 (Процент с двумя кружками) и 0x9A (ЛЬ вместе). Вторая после парсинга возвращает все обратно. Сделал, протестировал. |