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.