Re: Assertin failed: unknown bindtype with unknown varlen

Frediano Ziglio <[email protected]>
Newsgroups gmane.comp.db.tds.freetds
Message-ID <CAHt6W4fJFUNKuKQR=JmCqccZR8eD+L2YzVge0U9sbpzsbxaa2w@mail.gmail.com>
2015-04-07 5:55 GMT+01:00 LacaK <[email protected]>:
>> 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.
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.