Новый триал. Сборка 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. Не понятно — зачем резервируют место под нулевой символ? Строка же сидит в буфере фиксированного размера. И её длина определяется поиском первого нуля от начала до конца буфера.

Leave a Comment