On Thu, 11 Dec 2003, PostgreSQL Bugs List wrote:
> Description: JDBC cancelRowUpdates() sets column values to null
>
> this sequence sets all but "plz" and "kategorie" to null, "kategorie"
> is changed to 0
>
> rs.first();
> rs.updateInt( "plz", 99999 );
> rs.cancelRowUpdates();
> rs.updateInt( "plz", 66666 );
> rs.updateRow();
> rs.beforeFirst();
>
> Output before update:
>
> Kunde Lars Tetzlaff
> PLZ/Ort 51702 Bergneustadt
> Straße Bahnhofstr. 32 E
> Kategorie 1
>
>
> Output after Update
>
> Kunde null
> PLZ/Ort 66666 null
> Straße null
> Kategorie 0
>
Here's a patch to fix this.
Kris Jurka
? src/interfaces/jdbc/org/postgresql/copy
? src/interfaces/jdbc/org/postgresql/jdbc2/.AbstractJdbc2ResultSet.java.swp
? src/interfaces/jdbc/org/postgresql/test/jdbc2/.UpdateableResultTest.java.swp
? src/interfaces/jdbc/org/postgresql/test/jdbc2/CopyTest.notjava
? src/interfaces/jdbc/org/postgresql/test/jdbc2/ResultSetMetaDataTest.java
Index: src/interfaces/jdbc/org/postgresql/jdbc2/AbstractJdbc2ResultSet.java
===================================================================
RCS file:
/projects/cvsroot/pgsql-server/src/interfaces/jdbc/org/postgresql/jdbc2/AbstractJdbc2ResultSet.java,v
retrieving revision 1.27
diff -c -r1.27 AbstractJdbc2ResultSet.java
*** src/interfaces/jdbc/org/postgresql/jdbc2/AbstractJdbc2ResultSet.java 29 Nov
2003 19:52:10 -0000 1.27
--- src/interfaces/jdbc/org/postgresql/jdbc2/AbstractJdbc2ResultSet.java 11 Dec
2003 22:26:02 -0000
***************
*** 519,525 ****
{
doingUpdates = false;
! clearRowBuffer();
}
}
--- 519,525 ----
{
doingUpdates = false;
! clearRowBuffer(true);
}
}
***************
*** 662,668 ****
this_row = rowBuffer;
// need to clear this in case of another insert
! clearRowBuffer();
}
--- 662,668 ----
this_row = rowBuffer;
// need to clear this in case of another insert
! clearRowBuffer(false);
}
***************
*** 707,713 ****
// make sure the underlying data is null
! clearRowBuffer();
onInsertRow = true;
doingUpdates = false;
--- 707,713 ----
// make sure the underlying data is null
! clearRowBuffer(false);
onInsertRow = true;
doingUpdates = false;
***************
*** 715,725 ****
}
! private synchronized void clearRowBuffer()
throws SQLException
{
// rowBuffer is the temporary storage for the row
rowBuffer = new byte[fields.length][];
// clear the updateValues hashTable for the next set of updates
updateValues.clear();
--- 715,730 ----
}
! 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();
Index: src/interfaces/jdbc/org/postgresql/test/jdbc2/UpdateableResultTest.java
===================================================================
RCS file:
/projects/cvsroot/pgsql-server/src/interfaces/jdbc/org/postgresql/test/jdbc2/UpdateableResultTest.java,v
retrieving revision 1.7
diff -c -r1.7 UpdateableResultTest.java
*** src/interfaces/jdbc/org/postgresql/test/jdbc2/UpdateableResultTest.java 11 Sep
2002 05:38:45 -0000 1.7
--- src/interfaces/jdbc/org/postgresql/test/jdbc2/UpdateableResultTest.java 11 Dec
2003 22:26:02 -0000
***************
*** 15,39 ****
public class UpdateableResultTest extends TestCase
{
public UpdateableResultTest( String name )
{
super( name );
}
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 );
--- 15,93 ----
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
{
Statement st = con.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE );
ResultSet rs = st.executeQuery( "select * from updateable");
assertNotNull( rs );
***************
*** 123,134 ****
st.close();
- TestUtil.dropTable( con, "updateable" );
- TestUtil.dropTable( con, "second" );
- TestUtil.closeDB( con );
}
catch (Exception ex)
{
fail(ex.getMessage());
}
}
--- 177,186 ----
st.close();
}
catch (Exception ex)
{
+ ex.printStackTrace();
fail(ex.getMessage());
}
}
---------------------------(end of broadcast)---------------------------
TIP 7: don't forget to increase your free space map settings