FreeTDS SYBUNIQUE Bug / Patch

Willi Langenberger <[email protected]>
Newsgroups gmane.comp.db.tds.freetds
Message-ID <[email protected]>
Hi!


I think there is a bug in FreeTDS regarding SYBUNIQUE column type...

I'm accessing a MS SQLServer 2008 using freetds-0.91/ctlib. The server
table has "uniqueidentifier" columns (which correspond to SYBUNIQUE /
CS_UNIQUE_TYPE).

With "ct_bind" i set the datatype to CS_UNIQUE_TYPE. However,
"ct_fetch" doesnt return any data (copied=0) :-(

Using "tdsdump", i see the following lines in the tracefile:

  01:19:57.072719 7027 (ct.c:1736):_ct_bind_data(): column 25 is type 36 and has length 16
  01:19:57.072725 7027 (ct.c:1907):_ct_get_client_type(type 36, user 0, size 16)
  01:19:57.072730 7027 (cs.c:523):cs_convert(0x8d8d2e0, 0xbfc76fcc, 0xb74a1bc4, 0xbfc76f20, 0x8e85438, 0x8e85450)
  01:19:57.072735 7027 (ct.c:2018):_ct_get_server_type(40)
  01:19:57.072740 7027 (ct.c:2018):_ct_get_server_type(40)
  01:19:57.072745 7027 (cs.c:569):converting type 36 (16 bytes) to type = 36 (16 bytes)
  01:19:57.072750 7027 (cs.c:583):cs_convert() srctype == desttype
  01:19:57.072755 7027 (cs.c:697):error: unrecognized type
                                  ^^^^^^^^^^^^^^^^^^^^^^^^
  01:19:57.072760 7027 (cs.c:66):cs_prretcode(0)
  01:19:57.072764 7027 (cs.c:702):cs_convert() returning  CS_FAIL
  01:19:57.072769 7027 (ct.c:1779):cs_convert-result = 1
  01:19:57.072774 7027 (ct.c:1781):error: converted only 0 bytes for type 40 


Where:
  client type 40: CS_UNIQUE_TYPE
  server type 36: SYBUNIQUE

Ie, while trying to "cs_convert(SYBUNIQUE -> SYBUNIQUE)" we come to:

freetds-0.91/src/ctlib/cs.c
...
convert()
{
  ...
  /* many times we are asked to convert a data type to itself */
  if (src_type == desttype) {
    tdsdump_log(TDS_DBG_FUNC, "cs_convert() srctype == desttype\n");
    switch (desttype) {
      case SYBLONGBINARY:
      case SYBBINARY:
      ...
      default:
      ^^^^^^^^
        tdsdump_log(TDS_DBG_FUNC, "error: unrecognized type\n");
        ret = CS_FAIL;
        break;
    }


So it seems, that the SYBUNIQUE case is missing...

Anyway, here is my patch:

--- freetds-0.91/src/ctlib/cs.c.ori   2010-10-05 10:36:36.000000000 +0200
+++ freetds-0.91/src/ctlib/cs.c         2012-05-16 02:09:42.000000000 +0200
@@ -682,6 +682,7 @@
       case SYBDECIMAL:
           src_len = tds_numeric_bytes_per_prec[
             ((TDS_NUMERIC *) srcdata)->precision] + 2;
       case SYBBITN:
+      case SYBUNIQUE:
            memcpy(dest, srcdata, minlen);
           *resultlen = minlen;

At least, that seems to solve my problem ;-)


\wlang{}

-- 
[email protected]            Fax: +43/1/31336/39207
IT-Services,     WU Wirtschaftsuniversitaet Wien,     Austria
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.