[freetds] Row-wise parameter array binding bug in 0.64

ZIGLIO, Frediano, VF-IT Frediano.Ziglio at vodafone.com
Fri Sep 8 04:57:03 EDT 2006


> 
> Dear All,
> 
> I have found a bug concerning row-wise parameter array 
> binding in the ODBC interface of freetds 0.64. When trying to 
> insert multiple rows with row-wise binding (using the 
> SQL_ATTR_PARAMSET_SIZE and SQL_ATTR_PARAM_BIND_TYPE statement 
> attributes), I found that the first two rows are inserted 
> correctly; however, instead of the rest of the rows in the 
> batch, the second line is inserted over and over. Upon 
> inspecting the problem, I have found that the error is in 
> odbc/sql2tds.c, near line 207:
> 
> <snip>
>  	src = drec_apd->sql_desc_data_ptr;
>  	if (src && stmt->curr_param_row) {
>  		if (stmt->apd->header.sql_desc_bind_type != 
> SQL_BIND_BY_COLUMN) {
> 			src += stmt->apd->header.sql_desc_bind_type;
>  			if (stmt->apd->header.sql_desc_bind_offset_ptr)
>  				src += 
> *stmt->apd->header.sql_desc_bind_offset_ptr;
>  		} else {
> </snip>
> 
> It can be seen that the address of the parameter value is 
> calculated by adding the row size to the start address for 
> all rows except for the first one. Thus, the code gives the 
> correct address for only the first two rows. Fix:
> 
> <snip>
>  	src = drec_apd->sql_desc_data_ptr;
>  	if (src && stmt->curr_param_row) {
>  		if (stmt->apd->header.sql_desc_bind_type != 
> SQL_BIND_BY_COLUMN) {						
> src += stmt->curr_param_row * stmt->apd->header.sql_desc_bind_type;
>  			if (stmt->apd->header.sql_desc_bind_offset_ptr)
>  				src += 
> *stmt->apd->header.sql_desc_bind_offset_ptr;
>  		} else {
> </snip>
> 
> This calculates the correct address for all rows.
> 
> Cheers,
> Levi
> 

Hi Levi,
  fixed in CVS (both 0.64 and HEAD). It was clearly a bug. As usual you
can find patch at http://freetds.sourceforge.net/

Regards,
  Frediano Ziglio




More information about the FreeTDS mailing list