Re: FreeTDS SYBUNIQUE Bug / Patch

Frediano Ziglio <[email protected]>
Newsgroups gmane.comp.db.tds.freetds
Message-ID <CAHt6W4dmjeadWxFu1pnJLK84ok+k5Y+H9_hN_wyEcB6uGnZKfw@mail.gmail.com>
Applied!

Added support if srctype != desttype

Frediano

2012/5/16 Willi Langenberger <[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
> _______________________________________________
> FreeTDS mailing list
> [email protected]
> http://lists.ibiblio.org/mailman/listinfo/freetds
_______________________________________________
FreeTDS mailing list
[email protected]
http://lists.ibiblio.org/mailman/listinfo/freetds
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.