Re: Assertin failed: unknown bindtype with unknown varlen

Frediano Ziglio <[email protected]>
Newsgroups gmane.comp.db.tds.freetds
Message-ID <CAHt6W4d-q=BrPcrXMkMJAWeSONw2xnu5d+FPNOxm_SB8a4F08g@mail.gmail.com>
2015-04-07 12:52 GMT+01:00 LacaK <[email protected]>:
>
>> I think we could add some checks to t0019 test.
>
>
> Yes good idea! may be add line:
>   TEST((SYBBINARY, "", 0, SYBBINARY, 8), "len=8 00 00 00 00 00 00 00 00 2A
> 2A");
>
>>
>> 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).
>
>
> May be. I used it as there was already: if (SYBCHAR == desttype)
> Do you think, that this condition should be changed as well: if (bind ==
> NTBSTRINGBIND) ?
> I leave decision up to you.
> For me are okay both alternatives.
>
>
>>> 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.
>

How does it sound this patch?

https://github.com/freddy77/freetds/commit/40968645d10ea32455806a1068c4f63ab0fb6f5e

Is it ok the signed off line ?

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.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.