Re: Assertin failed: unknown bindtype with unknown varlen

LacaK <[email protected]>
Newsgroups gmane.comp.db.tds.freetds
Message-ID <[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 will be happy if this will be fixed before new release of FreeTDS ;-)
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.
>>> _______________________________________________
>>> FreeTDS mailing list
>>> [email protected]
>>> http://lists.ibiblio.org/mailman/listinfo/freetds
>>>
>> _______________________________________________
>> FreeTDS mailing list
>> [email protected]
>> http://lists.ibiblio.org/mailman/listinfo/freetds
>>
> _______________________________________________
> FreeTDS mailing list
> [email protected]
> http://lists.ibiblio.org/mailman/listinfo/freetds
>

_______________________________________________
FreeTDS mailing list
[email protected]
http://lists.ibiblio.org/mailman/listinfo/freetds
dblib.c.diff (text/plain, 255 B)
--- dblib.c.orig	Fri Mar 27 07:13:04 2015
+++ dblib.c	Wed Apr 01 10:01:10 2015
@@ -2245,6 +2245,8 @@
 				size = 1;
 				bind = NTBSTRINGBIND;
 			}
+		} else if (SYBBINARY == desttype) {
+			size = destlen;
 		}
 
 		dbgetnull(dbproc, bind, size, dest);
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.