Thread: ODBC - Retrieving info messages - RAISE NOTICE

ODBC - Retrieving info messages - RAISE NOTICE

From
"Wolfgang Apolinarski"
Date:
Hi,

When executing a PL/pgsql query using powershell with ODBC (yes, a somehow special setup), it is possible to register
tothe event "InfoMessage" (with Register-ObjectEvent) to retrieve all messages that are created for example by using
"RAISENOTICE". 
While this works fine when using MS SQL and the SqlConnection (all print statements are retrieved), it does not work
withPostgres and the OdbcConnection, here, only the last message ("3") is retrieved, when a statement like 
DO $$
RAISE NOTICE '1';
RAISE NOTICE '2';
RAISE NOTICE '3';
END$$;
is executed.

Maybe this is a general constraint when using ODBC, but maybe I am doing something terribly wrong (other than using
powershellwith Postgresql). 

Best regards,
Wolfgang



Re: ODBC - Retrieving info messages - RAISE NOTICE

From
Clemens Ladisch
Date:
Wolfgang Apolinarski wrote:
> only the last message ("3") is retrieved, when a statement like
> DO $$
> RAISE NOTICE '1';
> RAISE NOTICE '2';
> RAISE NOTICE '3';
> END$$;
> is executed.

When receiving a notice from libpq, the driver calls QR_set_notice(),
which replaces any previous notice.  To get all notices separated with
a semicolon, try using QR_add_notice() instead (see the patch below).

> Maybe this is a general constraint when using ODBC

In theory, the ODBC API (SQLGetDiagRec) would allow any number of
messages.


Regards,
Clemens


--- psqlodbc.orig/connection.c
+++ psqlodbc/connection.c
@@ -894,7 +894,7 @@ handle_pgres_error(ConnectionClass *self
         {
             if (QR_command_successful(res))
                 QR_set_rstatus(res, PORES_NONFATAL_ERROR); /* notice or warning */
-            QR_set_notice(res, errmsg);  /* will dup this string */
+            QR_add_notice(res, errmsg);  /* will dup this string */
         }
         goto cleanup;
     }


Re: ODBC - Retrieving info messages - RAISE NOTICE

From
"Inoue, Hiroshi"
Date:
Hi,

On 2018/02/10 19:18, Clemens Ladisch wrote:
> Wolfgang Apolinarski wrote:
>> only the last message ("3") is retrieved, when a statement like
>> DO $$
>> RAISE NOTICE '1';
>> RAISE NOTICE '2';
>> RAISE NOTICE '3';
>> END$$;
>> is executed.
> When receiving a notice from libpq, the driver calls QR_set_notice(),
> which replaces any previous notice.  To get all notices separated with
> a semicolon, try using QR_add_notice() instead (see the patch below).

I would take care of the patch.

Thanks.
Hiroshi Inoue

>
>> Maybe this is a general constraint when using ODBC
> In theory, the ODBC API (SQLGetDiagRec) would allow any number of
> messages.
>
>
> Regards,
> Clemens
>
>
> --- psqlodbc.orig/connection.c
> +++ psqlodbc/connection.c
> @@ -894,7 +894,7 @@ handle_pgres_error(ConnectionClass *self
>           {
>               if (QR_command_successful(res))
>                   QR_set_rstatus(res, PORES_NONFATAL_ERROR); /* notice or warning */
> -            QR_set_notice(res, errmsg);  /* will dup this string */
> +            QR_add_notice(res, errmsg);  /* will dup this string */
>           }
>           goto cleanup;
>       }