From: | Laurenz Albe <laurenz(dot)albe(at)cybertec(dot)at> |
---|---|
To: | Andrew Dunstan <andrew(at)dunslane(dot)net>, PostgreSQL Hackers <pgsql-hackers(at)lists(dot)postgresql(dot)org> |
Subject: | Re: cursor use vs pg_stat_statements |
Date: | 2021-10-20 13:02:16 |
Message-ID: | e8fb1cdb3c82d6004ccf4c8ab4d06f2eca8b8834.camel@cybertec.at |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | 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
From | Date | Subject | |
---|---|---|---|
Next Message | Robert Haas | 2021-10-20 13:08:57 | Re: ThisTimeLineID can be used uninitialized |
Previous Message | Ronan Dunklau | 2021-10-20 12:58:26 | Re: pg_receivewal starting position |