[freetds] Assertin failed: unknown bindtype with unknown varlen

Frediano Ziglio freddy77 at gmail.com
Tue Apr 7 06:31:12 EDT 2015


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.


More information about the FreeTDS mailing list