Про обрезания
Сегодня один наш турецкий друг прислал замечательную ошибку, полученную при работе через собственный FB-клиент провайдера (dbclient_type=fb.direct).
Bug check at [RemoteFB__P12__XSQLDA_Utilities::Helper__ReadString] [#003]: the size [33] of the resulting data [tag: isc_info_sql_alias] is larger than the buffer size [32]. [Subsystem: remote_fb.p12] XSQLVAR information raw-data processing error. Index: 8. Failed to build the definition of statement result. Failed to obtain descriptions of the columns.
Говорит — с gds32.dll такой проблемы нет.
Связанный кусок SQL запроса:
STOKMIKTAR1.ASGARININALTINDA "İ.Stok Asgari Miktarın Altında",
Ответил, что gds32.dll обрезает строки, а провайдер обрабатывает строки (которые не влазят в XSQLVAR) как ошибки. И сообщил о своих мыслях избавиться в собственном клиенте от XSQLDA/XSQLVAR.
Связанный кусок кода из исходников 2.5:
//Тут помимо обрезания - есть еще пара проблем.
static SSHORT get_string_info(const SCHAR** ptr, SCHAR* buffer, int buffer_len)
{
const SCHAR* p = *ptr;
SSHORT len = static_cast<SSHORT>(gds__vax_integer(reinterpret_cast<const UCHAR*>(p), 2));
// CVC: What else can we do here?
if (len < 0)
len = 0;
*ptr += len + 2;
p += 2;
if (len >= buffer_len)
len = buffer_len - 1;
if (len)
memcpy(buffer, p, len);
buffer[len] = 0;
return len;
}
Правда сначала я начал искать в FB3 и нашел там такой замечательный код:
TEXT aliasbuffer[100] = "";
const TEXT* aliasname = aliasbuffer;
if (alias.hasData())
{
int length = alias.length(); //ну что это за херня, Карл?
if (length > 99)
{
length = 99;
memcpy(aliasbuffer, alias.c_str(), length);
aliasbuffer[length] = 0;
}
else
aliasname = alias.c_str();
}
else
aliasname = "<unnamed>";
Самое грустное — в IBProvider до сих пор присутствует подобный код. Хотя я последние несколько лет веду упорную борьбу с этими багами.
Вот кто бы лет двадцать назад сразу объяснил что так делать нельзя 🙁
Новый триал IBProvider [сборка 25055] on 15 февраля, 2017
[…] в XSQLVAR (relname_length, sqlname_length, aliasname_length). До этого было обрезание при превышении максимального значения (32 или 68 байт) и […]