Skip to Content.
Sympa Menu

freetds - [freetds] Read UNIVARCHAR field from Sybase 12.5.1

freetds AT lists.ibiblio.org

Subject: FreeTDS Development Group

List archive

Chronological Thread  
  • From: Alex Kiesel <kiesel AT schlund.de>
  • To: freetds AT lists.ibiblio.org
  • Subject: [freetds] Read UNIVARCHAR field from Sybase 12.5.1
  • Date: Thu, 20 Nov 2003 16:15:42 +0100

Hi,

I am trying to read a column of type UNIVARCHAR with current FreeTDS
from CVS (TDS version is set to 50), with patch 20031120 from Frediano
(without it did not work at all).

The UNIVARCHAR is being transmitted as TDS_LONGBINARY (0xE1), the
columns column_varint_size is 4 (which is correct, I think) but this
leads to:

token.c, line 1519 ff.:
switch (curcol->column_varint_size) {
case 4:
curcol->column_size = tds_get_int(tds);
curcol->table_namelen =
tds_get_string(tds, tds_get_smallint(tds), curcol->table_name,
sizeof(curcol->table_name) - 1);
break;

This seems incorrect as this calls tds_get_string() which then fails
on the assertion in read.c, line 264:

assertion "string_len >= 0 && dest_size >= 0" failed: file "read.c", line 264
Abort trap (core dumped)

Not reading the table_namelen from the wire in token.c seems to fix this
problem - though I think that generally removing this may be the wrong
thing; I don't know tds good enough.

So my questing is: what is that piece of code used for? What is
curcol->table_name?

Additionally, as I am trying to get this working, should a
TDS_LONGBINARY be handled like a varchar or like a blob? There are
several occurances where this is being distinguished (within
eg. tds_get_data()).

Btw: the conversion seems to work correctly and convert the UTF-16 into
my charset (iso-8859-1).

Greetings from Karlsruhe,
Alex



Archive powered by MHonArc 2.6.24.

Top of Page