Новый триал. Сборка 12799.
Привет всем.
Работа над новым выпуском провайдера (v3.9) практически завершена. В текущей сборке исправлены алгоритмы перерасчета размера больших текстовых данных (CHAR/VARCHAR/CSTRING длиной свыше 8K) для учета кодовой страницы подключения в схемах метаданных — теперь они полностью синхронизированы с алгоритмами FB2+. Всем, кто использует провайдер в качестве связанного сервера MSSQL, рекомендуется обратить внимание на эти исправления и, после официального выпуска, обновиться до версии 3.9.
К сожалению, для абсолютно корректной работы требуется еще исправление ошибки на уровне сервера (FB2-FB3). Исправление там элементарное, поэтому будем надеяться что оно попадет в FB2.5.1.
Ошибка связана с функцией UTLD_char_length_to_byte_length, которая (в FB2.5.1) вызывается из двух точек. Код в этих точках так и шепчет — унифицируйте меня.
Навеяло. Я тут недавно был в книжных магазинах. Не в виртуальных, а в настоящих — в которые ходят ногами и руками щупают листают книги. Сто лет в них не шатался. По ходу, тема безопасного программирования сейчас настойчиво вбивается в моски умы кодописателей. Вот вам пример из кода FB:
int diff = 0; switch (in_node->nod_desc.dsc_dtype) { case dtype_varying: diff = sizeof(USHORT); break; case dtype_cstring: diff = 1; break; }
Это не наш метод. В нашем будет еще
case dtype_text: diff = 0; break; default: fb_assert(false); //а лучше какое-нибудь BUG-CHECK исключение
Кстати, никак не могу привыкнуть к тому, что в коде FB начал достаточно регулярно натыкаться на const в реализациях методов. По привычке проскакивает мысль «ой, ну надо же! кто это у них там так отличился?» и появляется 🙂 до ушей.
FB2+ и CSTRING
Текущие версии FB и IB позволяют определять CSTRING-параметры UDF длиной до 32767 символов. Однако FB2+ приводит CSTRING к VARCHAR и ограничивает их длину до 32765 символов. Что приводит к рассогласованности данных в системных таблицах БД и в XSQLVAR. Наверное, было бы разумно запретить определять CSTRING-параметры длиной больше чем 32765 символа.
Вообще по поводу CSTRING. Не понятно — зачем резервируют место под нулевой символ? Строка же сидит в буфере фиксированного размера. И её длина определяется поиском первого нуля от начала до конца буфера.