Jason Southern ([EMAIL PROTECTED]) reports a bug with a severity of 2 The lower the number the more severe it is. Short Description JDBC PreparedStatement.setMaxRows() affects other objects intantiated from this class and it's parent class Long Description ============================================================================ POSTGRESQL BUG REPORT TEMPLATE ============================================================================ Your name : Jason Southern Your email address : [EMAIL PROTECTED] System Configuration ---------------------- Architecture (example: Intel Pentium) : 600MHz Intel Pentium III, 256MB RAM Operating System (example: Linux 2.0.26 ELF) : Linux 2.2.16 RedHat 6.2 PostgreSQL version (example: PostgreSQL-6.3) : PostgreSQL-7.0.2 Compiler used (example: gcc 2.7.2) : gcc 2.96 JDBC Driver Version: 7.0.x (jdbc7.0-1.2.jar) JVM: Sun JVM 1.3 Short Description ------------------------------------------------- The PreparedStatement.setMaxRows() method affects the max row property of other objects instantiated from the statement class and it's subclasses. Please describe a way to repeat the problem. Please try to provide a concise reproducible example, if at all possible: ----------------------------------------------------------------------- You can reproduce this behavior by loading a PostgreSQL instance with the DDL/DML script below and then compiling and running the class file below. I would have expected the setMaxRows method to only affect the object on which executed not an entire family of objects. Table for reproducing bug ----------------------------------------------------------------------- CREATE TABLE FRUIT ( id_fruit INTEGER, name VARCHAR(15) ); INSERT INTO FRUIT VALUES (1, 'apple'); INSERT INTO FRUIT VALUES (2, 'banana'); INSERT INTO FRUIT VALUES (3, 'orange'); INSERT INTO FRUIT VALUES (4, 'kumquat'); INSERT INTO FRUIT VALUES (5, 'nectarine'); INSERT INTO FRUIT VALUES (6, 'pear'); INSERT INTO FRUIT VALUES (7, 'peach'); INSERT INTO FRUIT VALUES (8, 'cantaloupe'); INSERT INTO FRUIT VALUES (9, 'grape'); INSERT INTO FRUIT VALUES (10, 'grapefruit'); INSERT INTO FRUIT VALUES (11, 'avacado'); INSERT INTO FRUIT VALUES (12, 'tomato'); INSERT INTO FRUIT VALUES (13, 'kiwi'); INSERT INTO FRUIT VALUES (14, 'watermelon'); INSERT INTO FRUIT VALUES (15, 'guava'); Sample Code import java.sql.*; public class MaxRowTest { private static Connection conn; private static final String DB_INSTANCE = ""; private static final String DB_USERNAME = ""; private static final String DB_PASSWORD = ""; public static void main(String[] a) throws Exception { String sqlStmt; ResultSet rst; int rowCount = 0; Statement stmt = null; Statement stmt2 = null; PreparedStatement preStmt = null; PreparedStatement preStmt2 = null; System.out.println("About to connect to database..."); connectToDatabase(); System.out.println("Connected to database..."); stmt = conn.createStatement(); stmt2 = conn.createStatement(); System.out.println("Creating prepared statement..."); sqlStmt = "SELECT id_fruit, name FROM FRUIT WHERE id_fruit < ? ORDER BY name"; preStmt = conn.prepareStatement(sqlStmt); preStmt2 = conn.prepareStatement(sqlStmt); System.out.println("Setting max rows to 5 on this prepared statement..."); preStmt.setMaxRows(5); System.out.println("Setting argument on prepared statement to return all"); System.out.println("fruit whose id is less than 10..."); preStmt.setInt(1, 10); System.out.println("About to execute statement."); System.out.println("Expecting 5 rows..."); rst = preStmt.executeQuery(); rowCount = 0; while (rst.next()) { rowCount++; } System.out.println("Prepared statement returned ResultSet with " + rowCount + " fruit in it"); System.out.println("\nUsing second prepared statement object..."); System.out.println("Setting argument on prepared statement to return all"); System.out.println("fruit whose id is less than 10..."); preStmt.setInt(1, 10); System.out.println("About to execute statement."); System.out.println("Expecting 9 rows..."); rst = preStmt.executeQuery(); rowCount = 0; while (rst.next()) { rowCount++; } System.out.println("Prepared statement 2 returned " + rowCount + " fruit"); System.out.println("\nAbout to run query to select all fruit from table."); System.out.println("Expecting 15 rows..."); sqlStmt = "SELECT id_fruit, name FROM FRUIT ORDER BY name"; rst = stmt.executeQuery(sqlStmt); rowCount = 0; while (rst.next()) { rowCount++; } System.out.println("Statement returned ResultSet with " + rowCount + " fruit in it"); System.out.println("\nAbout to run query to select all fruit using second statement object."); System.out.println("Expecting 15 rows..."); sqlStmt = "SELECT id_fruit,name FROM FRUIT ORDER BY name"; rst = stmt2.executeQuery(sqlStmt); rowCount = 0; while (rst.next()) { rowCount++; } System.out.println("Statement 2 returned " + rowCount + " fruit"); System.out.println("\nSetting max rows to 0 on statement object...\n"); stmt.setMaxRows(0); System.out.println("About to run query to select all fruit from table."); System.out.println("Expecting 15 rows..."); sqlStmt = "SELECT id_fruit, name FROM FRUIT ORDER BY name"; rst = stmt.executeQuery(sqlStmt); rowCount = 0; while (rst.next()) { rowCount++; } System.out.println("Statement returned ResultSet with " + rowCount + " fruit in it"); System.out.println("\nAbout to run query to select all fruit using second statement object."); System.out.println("Expecting 15 rows..."); sqlStmt = "SELECT id_fruit, name FROM FRUIT ORDER BY name"; rst = stmt2.executeQuery(sqlStmt); rowCount = 0; while (rst.next()) { rowCount++; } System.out.println("Statement 2 returned " + rowCount + " fruit"); System.out.println("\nSetting argument on prepared statement to return all"); System.out.println("fruit whose id is less than 12..."); preStmt.setInt(1, 12); System.out.println("About to execute statement."); System.out.println("Expecting 5 rows..."); rst = preStmt.executeQuery(); rowCount = 0; while (rst.next()) { rowCount++; } System.out.println("Prepared statement returned ResultSet with " + rowCount + " fruit in it"); System.out.println("\nUsing second prepared statement object..."); System.out.println("Setting argument on prepared statement to return all"); System.out.println("fruit whose id is less than 10..."); preStmt.setInt(1, 10); System.out.println("About to execute statement."); System.out.println("Expecting 9 rows..."); rst = preStmt.executeQuery(); rowCount = 0; while (rst.next()) { rowCount++; } System.out.println("Prepared statement 2 returned " + rowCount + " fruit"); // Close statement objects if (preStmt != null) { preStmt.close(); } if (stmt != null) { stmt.close(); } } private static void connectToDatabase() throws Exception { try { try { Class.forName("org.postgresql.Driver"); } catch (ClassNotFoundException e) { throw new Exception("Unable to locate PostgreSQL driver. Make sure the driver is installed and and appears in CLASSPATH."); } conn = DriverManager.getConnection(DB_INSTANCE, DB_USERNAME, DB_PASSWORD); conn.setAutoCommit(false); conn.setTransactionIsolation(conn.TRANSACTION_READ_COMMITTED); } catch (SQLException e) { throw new Exception("connectToDatabase(): [SQLException] " + e); } } protected void finalize() { if (conn != null) { try { conn.close(); } catch (SQLException e) {} } } } No file was uploaded with this report