Re: cursor use vs pg_stat_statements - Mailing list pgsql-hackers

From Laurenz Albe
Subject Re: cursor use vs pg_stat_statements
Date
Msg-id e8fb1cdb3c82d6004ccf4c8ab4d06f2eca8b8834.camel@cybertec.at
Whole thread Raw
In response to cursor use vs pg_stat_statements  (Andrew Dunstan <andrew@dunslane.net>)
Responses Re: cursor use vs pg_stat_statements
List pgsql-hackers
On Tue, 2021-10-19 at 15:24 -0400, Andrew Dunstan wrote:
> 
> The problem I'm writing about (h/t Simon Riggs for finding it) is
> illustrated by the following snippet of java:
> 
>       public static void runtest(Connection conn) throws Exception {
>         Statement stmt = conn.createStatement();
>         stmt.setFetchSize(10);
>         ResultSet rs = stmt.executeQuery("select oid, relfileid, relname from pg_class");
>         int count = 100;
>         while (rs.next() && count-- > 0) {
>           System.out.print(".");
>         }
>         rs.close();
>         stmt.commit();
>         stmt.close();
>         System.out.println("");
>       }
> 
> When called, this prints out a line with 100 dots showing 100 lines were
> fetched, but pg_stat_statements shows this:
> 
>     query | select oid, relfilenode, relname from pg_class
>     calls | 1
>     rows  | 10
> 
> 
> suggesting only 10 rows were returned. It appears that only the first
> "EXECUTE 10" command against the portal is counted. At the very least
> this is a POLA violation, and it seems to be a bug. Maybe it's
> documented somewhere but if so it's not obvious to me.

I can't reproduce this on 14.1, after fixing the errors in your code:

test=# SELECT query, calls, rows FROM pg_stat_statements WHERE queryid = '3485361931104084405' \gx
─[ RECORD 1 ]─────────────────────────────────────────
query │ select oid, relfilenode, relname from pg_class
calls │ 1
rows  │ 424

The code I used was:

public class x {
    public static void main(String[] args) throws ClassNotFoundException, java.sql.SQLException {
        Class.forName("org.postgresql.Driver");

        java.sql.Connection conn = java.sql.DriverManager.getConnection("jdbc:postgresql:test?user=laurenz");

        java.sql.Statement stmt = conn.createStatement();
        stmt.setFetchSize(10);
        java.sql.ResultSet rs = stmt.executeQuery("select oid, relfilenode, relname from pg_class");
        int count = 100;
        while (rs.next() && count-- > 0) {
            System.out.print(".");
        }
        rs.close();
        stmt.close();
        System.out.println("");
        conn.close();
    }
}

Yours,
Laurenz Albe




pgsql-hackers by date:

Previous
From: Ronan Dunklau
Date:
Subject: Re: pg_receivewal starting position
Next
From: Robert Haas
Date:
Subject: Re: ThisTimeLineID can be used uninitialized