Thread: Bug in ODBC driver doing UPDATES and DELETES

Bug in ODBC driver doing UPDATES and DELETES

From
Tim Woodall
Date:
When doing an UPDATE or DELETE via ODBC, if no records are affected then
SQLExecute should return SQL_NO_DATA_FOUND and not SQL_SUCCESS.

The following patch fixes this problem.

Regards,

Tim.

diff -ur postgresql-7.1.3/src/interfaces/odbc/statement.c postgresql-7.1.3-patched/src/interfaces/odbc/statement.c
--- postgresql-7.1.3/src/interfaces/odbc/statement.c    Mon Apr 23 02:00:49 2001
+++ postgresql-7.1.3-patched/src/interfaces/odbc/statement.c    Thu May 15 16:30:46 2003
@@ -864,6 +864,13 @@   Int2    oldstatus,    numcols;   QueryInfo    qi;
+   char    was_rows_affected = 1;
+   /* was_rows_affected is set to 0 iff an UPDATE or DELETE affects 
+    * no rows. In this instance the driver should return
+    * SQL_NO_DATA_FOUND and not SQL_SUCCESS.
+    * I'm not sure about the use of char rather than int but this is
+    * consistent with the other was_* variables above.
+    */   conn = SC_get_conn(self);
@@ -998,6 +1005,13 @@was_ok = QR_command_successful(self->result);was_nonfatal = QR_command_nonfatal(self->result);
+    if(self->result->command &&
+        (strncmp(self->result->command, "UPDATE", 6) == 0 ||
+        strncmp(self->result->command, "DELETE", 6) == 0) &&
+        strtoul(self->result->command + 7, NULL, 0) == 0)
+    {
+        was_rows_affected = 0;
+    }if (was_ok)    self->errornumber = STMT_OK;
@@ -1055,7 +1069,10 @@   }   if (self->errornumber == STMT_OK)
-    return SQL_SUCCESS;
+    if(was_rows_affected)
+        return SQL_SUCCESS;
+    else
+        return SQL_NO_DATA_FOUND;   else   {

-- 
God said, "div D = rho, div B = 0, curl E = - @B/@t, curl H = J + @D/@t," 
and there was light.
    http://tjw.hn.org/      http://www.locofungus.btinternet.co.uk/



Re: Bug in ODBC driver doing UPDATES and DELETES

From
Bruce Momjian
Date:
Got it and will apply shortly.  Thanks.

---------------------------------------------------------------------------

Tim Woodall wrote:
> When doing an UPDATE or DELETE via ODBC, if no records are affected then
> SQLExecute should return SQL_NO_DATA_FOUND and not SQL_SUCCESS.
> 
> The following patch fixes this problem.
> 
> Regards,
> 
> Tim.
> 
> diff -ur postgresql-7.1.3/src/interfaces/odbc/statement.c postgresql-7.1.3-patched/src/interfaces/odbc/statement.c
> --- postgresql-7.1.3/src/interfaces/odbc/statement.c    Mon Apr 23 02:00:49 2001
> +++ postgresql-7.1.3-patched/src/interfaces/odbc/statement.c    Thu May 15 16:30:46 2003
> @@ -864,6 +864,13 @@
>     Int2    oldstatus,
>         numcols;
>     QueryInfo    qi;
> +   char    was_rows_affected = 1;
> +   /* was_rows_affected is set to 0 iff an UPDATE or DELETE affects 
> +    * no rows. In this instance the driver should return
> +    * SQL_NO_DATA_FOUND and not SQL_SUCCESS.
> +    * I'm not sure about the use of char rather than int but this is
> +    * consistent with the other was_* variables above.
> +    */
>  
>  
>     conn = SC_get_conn(self);
> @@ -998,6 +1005,13 @@
>  
>     was_ok = QR_command_successful(self->result);
>     was_nonfatal = QR_command_nonfatal(self->result);
> +    if(self->result->command &&
> +        (strncmp(self->result->command, "UPDATE", 6) == 0 ||
> +        strncmp(self->result->command, "DELETE", 6) == 0) &&
> +        strtoul(self->result->command + 7, NULL, 0) == 0)
> +    {
> +        was_rows_affected = 0;
> +    }
>  
>     if (was_ok)
>         self->errornumber = STMT_OK;
> @@ -1055,7 +1069,10 @@
>     }
>  
>     if (self->errornumber == STMT_OK)
> -    return SQL_SUCCESS;
> +    if(was_rows_affected)
> +        return SQL_SUCCESS;
> +    else
> +        return SQL_NO_DATA_FOUND;
>  
>     else
>     {
> 
> -- 
> God said, "div D = rho, div B = 0, curl E = - @B/@t, curl H = J + @D/@t," 
> and there was light.
> 
>      http://tjw.hn.org/      http://www.locofungus.btinternet.co.uk/
> 
> 
> ---------------------------(end of broadcast)---------------------------
> TIP 2: you can get off all lists at once with the unregister command
>     (send "unregister YourEmailAddressHere" to majordomo@postgresql.org)
> 

--  Bruce Momjian                        |  http://candle.pha.pa.us pgman@candle.pha.pa.us               |  (610)
359-1001+  If your life is a hard drive,     |  13 Roberts Road +  Christ can be your backup.        |  Newtown Square,
Pennsylvania19073