freetds AT lists.ibiblio.org
Subject: FreeTDS Development Group
List archive
Re: [freetds] FreeTDS always setting empty VARCHAR's to NULL
- From: Andrew Victor <avictor.za AT gmail.com>
- To: FreeTDS Development Group <freetds AT lists.ibiblio.org>
- Subject: Re: [freetds] FreeTDS always setting empty VARCHAR's to NULL
- Date: Tue, 23 Jun 2009 20:08:00 +0200
hi,
> It seems that calling ct_param() with an empty string (ie, data !=
> NULL and datalen = 0), a NULL gets passed to the database rather than
> an empty string.
>
> According to the Sybase documentation for ct_param:
>
> "There are two ways to indicate a parameter with a null value:
> - Pass indicator as -1. In this case, data and datalen are ignored.
> - Pass data as NULL and datalen as 0 or CS_UNUSED"
Attached is a patch (against 0.82) which should fix this.
Regards,
Andrew Victor
diff -urN freetds-0.82.orig/src/ctlib/ct.c freetds-0.82/src/ctlib/ct.c --- freetds-0.82.orig/src/ctlib/ct.c 2008-05-06 05:23:45.000000000 +0200 +++ freetds-0.82/src/ctlib/ct.c 2009-06-23 20:02:27.000000000 +0200 @@ -4082,12 +4082,15 @@ if (!row) return NULL; - if (size > 0 && value) { + if (value) { /* TODO check for BLOB and numeric */ if (size > curcol->column_size) size = curcol->column_size; /* TODO blobs */ - if (!is_blob_type(curcol->column_type)) + if (size == 0) { + /* data field is empty */ + } + else if (!is_blob_type(curcol->column_type)) memcpy(curcol->column_data, value, size); curcol->column_cur_size = size; } else { @@ -4375,23 +4378,24 @@ *(param->datalen) = (*datalen == CS_UNUSED) ? 0 : *datalen; } - if (*(param->datalen) && data) { + if (data) { if (*(param->datalen) == CS_NULLTERM) { tdsdump_log(TDS_DBG_INFO1, " _ct_fill_param() about to strdup string %u bytes long\n", (unsigned int) strlen(data)); *(param->datalen) = strlen(data); } else if (*(param->datalen) < 0) { return CS_FAIL; + } else if (*(param)->datalen) { + param->value = malloc(*(param->datalen)); + if (param->value == NULL) + return CS_FAIL; + memcpy(param->value, data, *(param->datalen)); + } else { /* data is empty */ + param->value = malloc(1); /* allocate dummy value */ + if (param->value == NULL) + return CS_FAIL; } - param->value = malloc(*(param->datalen)); - if (param->value == NULL) - return CS_FAIL; - memcpy(param->value, data, *(param->datalen)); param->param_by_value = 1; - } else { - param->value = NULL; - *(param->datalen) = 0; - param_is_null = 1; } } }
-
Re: [freetds] FreeTDS always setting empty VARCHAR's to NULL,
Andrew Victor, 06/23/2009
- Re: [freetds] FreeTDS always setting empty VARCHAR's to NULL, Frediano Ziglio, 06/26/2009
Archive powered by MHonArc 2.6.24.