Bug 1559

Summary: Selta: трансляция квадратных скобок.
Product: SELTA@Etersoft Reporter: Антон Азанов (Djelf) <aae>
Component: ODBC-драйверAssignee: Andrey Abramov <andrey>
Status: CLOSED FIXED QA Contact:
Severity: normal    
Priority: P5 CC: lav
Version: 1.0.2   
Target Milestone: версия 1.0.3   
Hardware: PC   
OS: Linux   
Whiteboard:
Заявки RT: Связано с:
Дата напоминания:
Bug Depends on:    
Bug Blocks: 2053    

Description Антон Азанов (Djelf) 2008-04-03 10:22:34 MSD
В MS Sql для определения идентификаторов с разделителями используются квадратные скобки: http://msdn2.microsoft.com/ru-ru/library/ms175874.aspx
В Postgres для этих целей используются двойные кавычки: http://resurection.ru/doc/postgres/sql-syntax.html#SQL-SYNTAX-IDENTIFIERS
Поскольку 1С++ для типизации к типам данных 1С активно использует квадратные скобки

Текст = " 
|SELECT  
| Спр.ID as [Элемент $Справочник.Номенклатура] 
|FROM 
| $Справочник.Номенклатура as Спр 
|";

для обеспечения работоспособности запросов 1С++ необходима трансляция кавадратных скобок на двойные кавычки.
Comment 1 Andrey Abramov 2008-04-20 23:30:29 MSD
Обработка добавлена.
Квадратные скобки заменяются на кавычки, все что между ними преобразуется в нижний регистр, поскольку PostgreSQL чувствителен к регистру имен, заключенных в кавычки.
Для проверки скачайте selta.dll с ftp из папки 1.0.3.test
Comment 2 Антон Азанов (Djelf) 2008-04-21 11:19:16 MSD
1. C приведением в нижний регистр типизация в 1C++ не работает

конструкция:
SELECT Конт.ID as [Конт $Справочник.Контрагенты]
FROM sc172 AS Конт
WHERE Конт.ISFOLDER=2

предобазуется в:
SELECT Конт.ID as "конт $справочник.контрагенты"
FROM sc172 AS Конт
WHERE Конт.ISFOLDER=2
отрабатывает, но в выведенной таблице 1С чушь.

запрос:
SELECT Конт.ID as "Конт $Справочник.Контрагенты"
FROM sc172 AS Конт
WHERE Конт.ISFOLDER=2
в Postgres отрабатывает нормально и должен выдавать корректый результат.

2. Не хватает длины идентификатора и postgres его "режет".
В MSSQL, начиная с 7й версии, длина идентификатора увеличена до 128 символов. 
В документации postgres указано что длина идентификатора может быть увеличена при компиляции. http://www.postgresql.org/docs/8.2/static/sql-syntax-lexical.html
Странно только, что сейчас postgres режет до 33 символов, в по-умолчанию должно быть 63. Из за русских букв?
Для более полной поддержки не только 1С++, а вообще эмуляции MSSQL необходима перекомпиляция postgres. (может отдельный баг заведете?).

Comment 3 Антон Азанов (Djelf) 2008-04-21 12:12:30 MSD
по п.1. Виноват, в MSSQL с 1С++ работает и конструкция в нижнем регистре "SELECT Конт.ID as [конт $справочник.контрагенты]. Однако, все равно, много разработок под 1С++ регистрочувствительны, т.е. приведение в нижний регистр в них работать не будет.
Попытаюсь разобраться с типизацией в 1С++, на настоящий момент в выложенном запросе вместо контрагентов почему-то выводятся физ-лица.
Comment 4 Andrey Abramov 2008-04-21 22:09:45 MSD
Я могу убрать приведение к нижнему регистру, но это будет чревато:
записи [Name] и [name] в MS SQL Server равнозначны, а в PostgreSQL - нет, важен регистр, к сожалению.
Если разработчики 1С++ будут соблюдать регистр, то все будет ОК.
Но ошибка, как я предполагаю, вовсе не в этом, а из-за обрезания имен.
33 символа вместо 64 - да, скорее всего из-за русских символов, кодировка UTF-8 всетаки используется.
Сейчас я повешаю багу про увеличение этого параметра и постарась решить.
Данную багу закроем только после того, как проведем тесты с новыми сборками Постгри.
Comment 5 Антон Азанов (Djelf) 2008-04-22 08:33:53 MSD
Бес попутал. Странная вещь: На MSSQL два запроса без сортировки 1С`овский и 1C++ выводят одинаковую последовательность значений. Под postgres последовательности оказались разные и как назло первые записи в выборке postgres были визуально похожи на другой справочник...

Вообщем типизация работает корректно. 
Но приведение в нижний регистр конструкций [Контрагент $Справочник.Контрагенты] будет приводить к ошибкам в универсальных обработках, например при сравнении кода колонки полученного командой 1С ПолучитьПараметрыКолонки с аналогичным полученным через метаданные: "контрагент"<>"Контрагент".
> Если разработчики 1С++ будут соблюдать регистр, то все будет ОК.
В большинстве случаев соблюдают. Кроме того эти конструкции используются для идентификации конечных колонок запроса и не участвуют в фильтрах т.е. проблем быть не должно.
Comment 6 Andrey Abramov 2008-04-27 18:04:58 MSD
Закоментировал пока что преобразование в нижний регистр. Будут проблемы - будем думать.
Новую версию dll выложил на ftp в папку 1.0.3.test