diff --git a/src/interfaces/jdbc/org/postgresql/jdbc2/AbstractJdbc2ResultSet.java b/src/interfaces/jdbc/org/postgresql/jdbc2/AbstractJdbc2ResultSet.java index 817b5d0f182..37d7f9cf072 100644 --- a/src/interfaces/jdbc/org/postgresql/jdbc2/AbstractJdbc2ResultSet.java +++ b/src/interfaces/jdbc/org/postgresql/jdbc2/AbstractJdbc2ResultSet.java @@ -9,7 +9,7 @@ * Copyright (c) 2003, PostgreSQL Global Development Group * * IDENTIFICATION - * $PostgreSQL: pgsql/src/interfaces/jdbc/org/postgresql/jdbc2/AbstractJdbc2ResultSet.java,v 1.27 2003/11/29 19:52:10 pgsql Exp $ + * $PostgreSQL: pgsql/src/interfaces/jdbc/org/postgresql/jdbc2/AbstractJdbc2ResultSet.java,v 1.28 2003/12/12 18:34:14 davec Exp $ * *------------------------------------------------------------------------- */ @@ -519,7 +519,7 @@ public abstract class AbstractJdbc2ResultSet extends org.postgresql.jdbc1.Abstra { doingUpdates = false; - clearRowBuffer(); + clearRowBuffer(true); } } @@ -662,7 +662,7 @@ public abstract class AbstractJdbc2ResultSet extends org.postgresql.jdbc1.Abstra this_row = rowBuffer; // need to clear this in case of another insert - clearRowBuffer(); + clearRowBuffer(false); } @@ -707,7 +707,7 @@ public abstract class AbstractJdbc2ResultSet extends org.postgresql.jdbc1.Abstra // make sure the underlying data is null - clearRowBuffer(); + clearRowBuffer(false); onInsertRow = true; doingUpdates = false; @@ -715,12 +715,17 @@ public abstract class AbstractJdbc2ResultSet extends org.postgresql.jdbc1.Abstra } - private synchronized void clearRowBuffer() + private synchronized void clearRowBuffer(boolean copyCurrentRow) throws SQLException { // rowBuffer is the temporary storage for the row rowBuffer = new byte[fields.length][]; + // inserts want an empty array while updates want a copy of the current row + if (copyCurrentRow) { + System.arraycopy(this_row, 0, rowBuffer, 0, this_row.length); + } + // clear the updateValues hashTable for the next set of updates updateValues.clear(); diff --git a/src/interfaces/jdbc/org/postgresql/test/jdbc2/UpdateableResultTest.java b/src/interfaces/jdbc/org/postgresql/test/jdbc2/UpdateableResultTest.java index fcd6321803f..362f3ace63b 100644 --- a/src/interfaces/jdbc/org/postgresql/test/jdbc2/UpdateableResultTest.java +++ b/src/interfaces/jdbc/org/postgresql/test/jdbc2/UpdateableResultTest.java @@ -15,25 +15,79 @@ import org.postgresql.test.TestUtil; public class UpdateableResultTest extends TestCase { + private Connection con; public UpdateableResultTest( String name ) { super( name ); } + protected void setUp() throws Exception + { + con = TestUtil.openDB(); + TestUtil.createTable(con, "updateable", "id int primary key, name text, notselected text"); + TestUtil.createTable(con, "second", "id1 int primary key, name1 text"); + + // put some dummy data into second + Statement st2 = con.createStatement(); + st2.execute( "insert into second values (1,'anyvalue' )"); + st2.close(); + + } + + protected void tearDown() throws Exception + { + TestUtil.dropTable(con, "updateable"); + TestUtil.dropTable(con, "second"); + TestUtil.closeDB(con); + } + + public void testCancelRowUpdates() throws Exception + { + Statement st = con.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE ); + ResultSet rs = st.executeQuery( "select * from second"); + + // make sure we're dealing with the correct row. + rs.first(); + assertEquals(1,rs.getInt(1)); + assertEquals("anyvalue",rs.getString(2)); + + // update, cancel and make sure nothings changed. + rs.updateInt(1,99); + rs.cancelRowUpdates(); + assertEquals(1,rs.getInt(1)); + assertEquals("anyvalue",rs.getString(2)); + + // real update + rs.updateInt(1,999); + rs.updateRow(); + assertEquals(999,rs.getInt(1)); + assertEquals("anyvalue",rs.getString(2)); + + // scroll some and make sure the update is still there + rs.beforeFirst(); + rs.next(); + assertEquals(999,rs.getInt(1)); + assertEquals("anyvalue",rs.getString(2)); + + + // make sure the update got to the db and the driver isn't lying to us. + rs.close(); + rs = st.executeQuery( "select * from second"); + rs.first(); + assertEquals(999,rs.getInt(1)); + assertEquals("anyvalue",rs.getString(2)); + + rs.close(); + st.close(); + } + + + public void testUpdateable() { try { - Connection con = TestUtil.openDB(); - TestUtil.createTable(con, "updateable", "id int primary key, name text, notselected text"); - TestUtil.createTable(con, "second", "id1 int primary key, name1 text"); - - // put some dummy data into second - Statement st2 = con.createStatement(); - st2.execute( "insert into second values (1,'anyvalue' )"); - st2.close(); - Statement st = con.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE ); ResultSet rs = st.executeQuery( "select * from updateable"); assertNotNull( rs ); @@ -123,12 +177,10 @@ public class UpdateableResultTest extends TestCase st.close(); - TestUtil.dropTable( con, "updateable" ); - TestUtil.dropTable( con, "second" ); - TestUtil.closeDB( con ); } catch (Exception ex) { + ex.printStackTrace(); fail(ex.getMessage()); } }