Skip to Content.
Sympa Menu

freetds - Re: [freetds] Assertin failed: unknown bindtype with unknown varlen

freetds AT lists.ibiblio.org

Subject: FreeTDS Development Group

List archive

Chronological Thread  
  • From: Frediano Ziglio <freddy77 AT gmail.com>
  • To: FreeTDS Development Group <freetds AT lists.ibiblio.org>
  • Subject: Re: [freetds] Assertin failed: unknown bindtype with unknown varlen
  • Date: Tue, 7 Apr 2015 11:31:12 +0100

2015-04-07 5:55 GMT+01:00 LacaK <lacak AT zoznam.sk>:
>> I don't know... dbgetnull is a function which is declared only on our
>> public headers but is exported by our library. I would prefer if
>> dbgetnull does not throw an exception for invalid types/varlen
>
>
> I do not know also ;-)
>
> But my patch (attached also in previous email) patches dbconvert() as there
> is not handled correctly situation when converting from :
> srctype=SQLBINARY, srclen=0
> to:
> desttype=SQLBINARY, destlen > 0
> If this patch will be applied then I do not need touch dbgetnull()
>

I think we could add some checks to t0019 test.

I was wondering if your patch cover all cases. Probably would be
better to test for bind == BINARYBIND (which catches all binaries like
VARBINARY or IMAGE).

> I will be happy if this will be fixed before new release of FreeTDS ;-)

Added as a TODO in https://trello.com/b/bk0UZNRJ/freetds-todo-list.

> Thanks
> -Laco.
> P.S. Sorry for previous empty email :-)
>
>

Frediano

>>
>>>> Hi,
>>>> I get this error "unknown bindtype with unknown varlen" when calling
>>>> dbconvert() in dblib.
>>>> This is my situation:
>>>> I have table with VARBINARY column with value which is empty not null
>>>> (dbdatlen() = 0)
>>>> Then I call dbconvert with srctype=SQLBINARY, srclen=0,
>>>> desttype=SQLBINARY, destlen > 0 and I get above mentioned assertion.
>>>>
>>>> Looking into dbconvert there is in the begining (note condition:
>>>> srclen==0):
>>>>
>>>> if (src == NULL || srclen == 0) {
>>>> int bind = dbbindtype(desttype);
>>>> int size = tds_get_size_by_type(desttype);
>>>>
>>>> if (SYBCHAR == desttype) {
>>>> if (destlen > 0) {
>>>> size = destlen;
>>>> bind = CHARBIND;
>>>> } else {
>>>> size = 1;
>>>> bind = NTBSTRINGBIND;
>>>> }
>>>> }
>>>>
>>>> dbgetnull(dbproc, bind, size, dest); // <--- HERE OCCURS
>>>> ASSERTION
>>>> return size;
>>>> }
>>>>
>>>> Next look into dbgetnull():
>>>>
>>>> /*
>>>> * For variable-length types, nonpositive varlen indicates
>>>> * buffer is "big enough" but also not to pad.
>>>> * Apply terminator (if applicable) and go home.
>>>> */
>>>> if (varlen <= 0) {
>>>> switch (bindtype) {
>>>> case STRINGBIND:
>>>> case NTBSTRINGBIND:
>>>> varaddr[pnullrep->len] = '\0';
>>>> /* fall thru */
>>>> case CHARBIND:
>>>> case VARYCHARBIND:
>>>> + case BINARYBIND: // <--- MISSING HERE ?
>>>> + case VARYBINBIND: // <--- MISSING HERE ?
>>>> break;
>>>>
>>>> As BINARYBIND is not handled ATM default is executed:
>>>> default:
>>>> assert(!"unknown bindtype with unknown varlen");
>>>>
>>>> Can you please fix it ?
>>>> Thanks
>>>> -Laco.




Archive powered by MHonArc 2.6.24.

Top of Page