[freetds] SQLExec still succeeds too much

Peter Deacon peterd at iea-software.com
Tue Apr 1 13:09:05 EST 2003


On Tue, 1 Apr 2003, ZIGLIO Frediano wrote:

> Some about the patch
> diff -ur \freetds_bak\src/tds/token.c ./tds/token.c
> --- \freetds_bak\src/tds/token.c	Sun Mar 30 20:52:39 2003
> +++ ./tds/token.c	Tue Apr  1 01:35:03 2003
> @@ -424,7 +424,12 @@
>  	for (;;) {
>
>  		marker = tds_get_byte(tds);
> 		tdsdump_log(TDS_DBG_INFO1, "%L processing result tokens.
> marker is  %x(%s)\n", marker, _tds_token_name(marker));
> +
> +		if (IS_TDSDEAD(tds)) {
> +			*result_type = TDS_CMD_FAIL;
> +			return TDS_FAIL;
> +		}
>
>  		switch (marker) {
>  		case TDS7_RESULT_TOKEN:
> @@ -509,7 +514,8 @@
>  			return TDS_SUCCEED;
>  			break;
>  		default:
> 			if (tds_process_default_tokens(tds, marker) ==
> TDS_FAIL) {
> +				*result_type = TDS_CMD_FAIL;
>  				return TDS_FAIL;
>  			}
>  			break;
> @@ -559,8 +565,11 @@
>  	while (1) {
>
>  		marker = tds_get_byte(tds);
> 		tdsdump_log(TDS_DBG_INFO1, "%L processing row tokens.
> marker is  %x(%s)\n", marker, _tds_token_name(marker));
>
> +		if (IS_TDSDEAD(tds))
> +			return TDS_FAIL;
> +
>  		switch (marker) {
>  		case TDS_RESULT_TOKEN:
>  		case TDS7_RESULT_TOKEN:
> @@ -645,7 +654,11 @@
>  	while(tds->state != TDS_COMPLETED) {
>
>  		marker = tds_get_byte(tds);
> 		tdsdump_log(TDS_DBG_INFO1, "%L processing trailing tokens.
> marker is  %x(%s)\n", marker, _tds_token_name(marker));
> +
> +		if (IS_TDSDEAD(tds))
> +			return TDS_FAIL;
> +
>  		switch (marker) {
>  			case TDS_DONE_TOKEN:
>  			case TDS_DONEPROC_TOKEN:

> Setting result_type before sending TDS_FAIL is not useful. Returning
> TDS_FAIL mean a conversation error or a packet error (garbage from server)
> while result_type == TDS_CMD_FAIL and TDS_SUCCEED mean last command fail.

Your right...  I remember result_type being garbage inside the
select somehow so I just added result to the default... Don't see how
that could have been.

All of this IS_TDSDEAD checking was to get around a problem where
tds_process_result_tokens would loop forever on TDS_ROW_TOKEN, but that
was just something I caused while playing around.

The real problem is pretty simple in _SQLExecute the final else should
return SQL_ERROR instead of result (SQL_SUCCESS by default)

	} else {
		tdsdump_log(TDS_DBG_INFO1, "SQLExecute: bad results\n");

- return result;
+ return SQL_ERROR;

:)

Have Fun!
Peter



More information about the FreeTDS mailing list