Thread: ODBC - Retrieving info messages - RAISE NOTICE
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
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; }
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; > }