I will try to get a tcpdump file. Doing this in libpq seems challenging as I'm not aware of how to create a portal in psql.
Chap
The only difference is one instance uses a portal to fetch the results, the other (correct one) is a normal insert where all of the rows are returned immediately
this is a reproducer in Java
conn.prepareStatement("DROP TABLE IF EXISTS test_table").execute();
conn.prepareStatement("CREATE TABLE IF NOT EXISTS test_table (id SERIAL PRIMARY KEY, cnt INT NOT NULL)").execute();
for (var fetchSize : List.of(0, 1, 2, 3)) { System.out.println("FetchSize=" + fetchSize);
try (var stmt = conn.prepareStatement("INSERT INTO test_table (cnt) VALUES (1), (2) RETURNING id", RETURN_GENERATED_KEYS)) { stmt.setFetchSize(fetchSize);
var ret = stmt.executeUpdate(); System.out.println("executeUpdate result: " + ret);
var rs = stmt.getGeneratedKeys(); System.out.print("ids: "); while (rs.next()) { System.out.print(rs.getInt(1) + " "); } System.out.print("\n\n"); }
}
On 2023-07-12 20:57, Dave Cramer wrote: > Without a cursor it returns right away as all of the results are > returned > by the server. However with cursor you have to wait until you fetch the > rows before you can get the CommandComplete message which btw is wrong > as > it returns INSERT 0 0 instead of INSERT 2 0
To make sure I am following, was this describing a comparison of two different ways in Java, using JDBC, to perform the same operation, one of which behaves as desired while the other doesn't? If so, for my curiosity, what do both ways look like in Java?
Or was it a comparison of two different operations, say one an INSERT RETURNING and the other something else?