You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-commits@db.apache.org by ka...@apache.org on 2006/06/03 15:00:51 UTC

svn commit: r411428 - in /db/derby/code/trunk/java: engine/org/apache/derby/impl/sql/execute/ testing/org/apache/derbyTesting/functionTests/master/ testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/ testing/org/apache/derbyTesting/fun...

Author: kahatlen
Date: Sat Jun  3 06:00:50 2006
New Revision: 411428

URL: http://svn.apache.org/viewvc?rev=411428&view=rev
Log:
DERBY-1356: Positioned update/delete when positioned after last or
before first causes NullPointerException

Patch contributed by Fernanda Pizzorno <Fe...@Sun.COM>.

Added:
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/SURTest_ij.out   (with props)
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/SURTest_ij.out   (with props)
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/SURTest_ij.sql   (with props)
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/SURTest_ij_app.properties   (with props)
Modified:
    db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/ScrollInsensitiveResultSet.java
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/DerbyNet.exclude
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/jdbcapi.runall

Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/ScrollInsensitiveResultSet.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/ScrollInsensitiveResultSet.java?rev=411428&r1=411427&r2=411428&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/ScrollInsensitiveResultSet.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/ScrollInsensitiveResultSet.java Sat Jun  3 06:00:50 2006
@@ -1124,10 +1124,13 @@
 	 * @exception StandardException on error
 	 */
 	public boolean isDeleted() throws StandardException  {
-		positionInHashTable.setValue(currentPosition);
-		DataValueDescriptor[] hashRowArray = (DataValueDescriptor[]) 
-				ht.get(positionInHashTable);
-		return hashRowArray[POS_ROWDELETED].getBoolean();
+		if (currentPosition <= positionInSource && currentPosition > 0) {
+			positionInHashTable.setValue(currentPosition);
+			DataValueDescriptor[] hashRowArray = (DataValueDescriptor[]) 
+					ht.get(positionInHashTable);
+			return hashRowArray[POS_ROWDELETED].getBoolean();
+		}
+		return false;
 	}
 
 	/**
@@ -1139,10 +1142,13 @@
 	 * @exception StandardException on error
 	 */
 	public boolean isUpdated() throws StandardException {
-		positionInHashTable.setValue(currentPosition);
-		DataValueDescriptor[] hashRowArray = (DataValueDescriptor[]) 
-				ht.get(positionInHashTable);
-		return hashRowArray[POS_ROWUPDATED].getBoolean();			
+		if (currentPosition <= positionInSource && currentPosition > 0) {
+			positionInHashTable.setValue(currentPosition);
+			DataValueDescriptor[] hashRowArray = (DataValueDescriptor[]) 
+					ht.get(positionInHashTable);
+			return hashRowArray[POS_ROWUPDATED].getBoolean();
+		}
+		return false;
 	}
 
 	public boolean isForUpdate() {

Added: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/SURTest_ij.out
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/SURTest_ij.out?rev=411428&view=auto
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/SURTest_ij.out (added)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/SURTest_ij.out Sat Jun  3 06:00:50 2006
@@ -0,0 +1,161 @@
+CONNECTION0* - 	jdbc:derby://xxxFILTERED_HOSTNAMExxx:1527/SURTest;create=true
+* = current connection
+ij> connect 'SURTest;create=true;';
+ij(CONNECTION1)> autocommit off;
+ij(CONNECTION1)> create table t1 (c1 int primary key, c2 int);
+0 rows inserted/updated/deleted
+ij(CONNECTION1)> insert into t1 values 
+    (1, 1), (2, 2), (3, 3), (4, 4), (5, 5), 
+    (6, 6), (7, 7), (8, 8), (9, 9), (10, 10);
+10 rows inserted/updated/deleted
+ij(CONNECTION1)> get scroll insensitive cursor sc1 as 'SELECT * FROM t1 FOR UPDATE';
+ij(CONNECTION1)> next sc1;
+C1 |C2         
+-----
+1 |1          
+ij(CONNECTION1)> next sc1;
+C1 |C2         
+-----
+2 |2          
+ij(CONNECTION1)> -- update row nr. 2 after positioning with next
+update t1 set c2 = c1 + 20 where current of sc1;
+1 row inserted/updated/deleted
+ij(CONNECTION1)> absolute 5 sc1;
+C1 |C2         
+-----
+5 |5          
+ij(CONNECTION1)> -- update row nr. 5 after positioning with absolute
+update t1 set c2 = c1 + 20 where current of sc1;
+1 row inserted/updated/deleted
+ij(CONNECTION1)> relative 2 sc1;
+C1 |C2         
+-----
+7 |7          
+ij(CONNECTION1)> -- update row nr. 7 after positioning with relative
+update t1 set c2 = c1 + 20 where current of sc1;
+1 row inserted/updated/deleted
+ij(CONNECTION1)> previous sc1;
+C1 |C2         
+-----
+6 |6          
+ij(CONNECTION1)> -- update row nr. 6 after positioning with previous
+update t1 set c2 = c1 + 20 where current of sc1;
+1 row inserted/updated/deleted
+ij(CONNECTION1)> relative -1 sc1;
+C1 |C2         
+-----
+5 |25         
+ij(CONNECTION1)> last sc1;
+C1 |C2         
+-----
+10 |10         
+ij(CONNECTION1)> -- update row nr. 10 after positioning with last
+update t1 set c2 = c1 + 20 where current of sc1;
+1 row inserted/updated/deleted
+ij(CONNECTION1)> after last sc1;
+No current row
+ij(CONNECTION1)> -- update when positioned after last should cause an error
+update t1 set c2 = c1 + 20 where current of sc1;
+ERROR XCL08: Cursor 'SQL_CURLH000C1' is not on a row.
+ij(CONNECTION1)> first sc1;
+C1 |C2         
+-----
+1 |1          
+ij(CONNECTION1)> -- update row nr. 1 after positioning with first
+update t1 set c2 = c1 + 20 where current of sc1;
+1 row inserted/updated/deleted
+ij(CONNECTION1)> before first sc1;
+No current row
+ij(CONNECTION1)> -- update when positioned before first should cause an error
+update t1 set c2 = c1 + 20 where current of sc1;
+ERROR XCL08: Cursor 'SQL_CURLH000C1' is not on a row.
+ij(CONNECTION1)> close sc1;
+ij(CONNECTION1)> commit;
+ij(CONNECTION1)> -- check that row where correctly updated
+select * from t1;
+C1 |C2         
+-----
+1 |21         
+2 |22         
+3 |3          
+4 |4          
+5 |25         
+6 |26         
+7 |27         
+8 |8          
+9 |9          
+10 |30         
+10 rows selected
+ij(CONNECTION1)> get scroll insensitive cursor sc1 as 'SELECT * FROM t1 FOR UPDATE';
+ij(CONNECTION1)> next sc1;
+C1 |C2         
+-----
+1 |21         
+ij(CONNECTION1)> next sc1;
+C1 |C2         
+-----
+2 |22         
+ij(CONNECTION1)> -- delete row nr. 2 after positioning with next
+delete from t1 where current of sc1;
+1 row inserted/updated/deleted
+ij(CONNECTION1)> absolute 5 sc1;
+C1 |C2         
+-----
+5 |25         
+ij(CONNECTION1)> -- delete row nr. 5 after positioning with absolute
+delete from t1 where current of sc1;
+1 row inserted/updated/deleted
+ij(CONNECTION1)> relative 2 sc1;
+C1 |C2         
+-----
+7 |27         
+ij(CONNECTION1)> -- delete row nr. 7 after positioning with relative
+delete from t1 where current of sc1;
+1 row inserted/updated/deleted
+ij(CONNECTION1)> previous sc1;
+C1 |C2         
+-----
+6 |26         
+ij(CONNECTION1)> -- delete row nr. 6 after positioning with previous
+delete from t1 where current of sc1;
+1 row inserted/updated/deleted
+ij(CONNECTION1)> relative -1 sc1;
+C1 |C2         
+-----
+NULL |NULL       
+ij(CONNECTION1)> last sc1;
+C1 |C2         
+-----
+10 |30         
+ij(CONNECTION1)> -- delete row nr. 10 after positioning with last
+delete from t1 where current of sc1;
+1 row inserted/updated/deleted
+ij(CONNECTION1)> after last sc1;
+No current row
+ij(CONNECTION1)> -- delete when positioned after last should cause an error
+delete from t1 where current of sc1;
+ERROR XCL08: Cursor 'SQL_CURLH000C1' is not on a row.
+ij(CONNECTION1)> first sc1;
+C1 |C2         
+-----
+1 |21         
+ij(CONNECTION1)> -- delete row nr. 1 after positioning with first
+delete from t1 where current of sc1;
+1 row inserted/updated/deleted
+ij(CONNECTION1)> before first sc1;
+No current row
+ij(CONNECTION1)> -- delete when positioned before first should cause an error
+delete from t1 where current of sc1;
+ERROR XCL08: Cursor 'SQL_CURLH000C1' is not on a row.
+ij(CONNECTION1)> close sc1;
+ij(CONNECTION1)> commit;
+ij(CONNECTION1)> -- check that row where correctly updated
+select * from t1;
+C1 |C2         
+-----
+3 |3          
+4 |4          
+8 |8          
+9 |9          
+4 rows selected
+ij(CONNECTION1)> 

Propchange: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/SURTest_ij.out
------------------------------------------------------------------------------
    svn:eol-style = native

Added: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/SURTest_ij.out
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/SURTest_ij.out?rev=411428&view=auto
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/SURTest_ij.out (added)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/SURTest_ij.out Sat Jun  3 06:00:50 2006
@@ -0,0 +1,162 @@
+CONNECTION0* - 	jdbc:derby:SURTest
+* = current connection
+ij> connect 'SURTest;create=true;';
+WARNING 01J01: Database 'SURTest' not created, connection made to existing database instead.
+ij(CONNECTION1)> autocommit off;
+ij(CONNECTION1)> create table t1 (c1 int primary key, c2 int);
+0 rows inserted/updated/deleted
+ij(CONNECTION1)> insert into t1 values 
+    (1, 1), (2, 2), (3, 3), (4, 4), (5, 5), 
+    (6, 6), (7, 7), (8, 8), (9, 9), (10, 10);
+10 rows inserted/updated/deleted
+ij(CONNECTION1)> get scroll insensitive cursor sc1 as 'SELECT * FROM t1 FOR UPDATE';
+ij(CONNECTION1)> next sc1;
+C1         |C2         
+-----------------------
+1          |1          
+ij(CONNECTION1)> next sc1;
+C1         |C2         
+-----------------------
+2          |2          
+ij(CONNECTION1)> -- update row nr. 2 after positioning with next
+update t1 set c2 = c1 + 20 where current of sc1;
+1 row inserted/updated/deleted
+ij(CONNECTION1)> absolute 5 sc1;
+C1         |C2         
+-----------------------
+5          |5          
+ij(CONNECTION1)> -- update row nr. 5 after positioning with absolute
+update t1 set c2 = c1 + 20 where current of sc1;
+1 row inserted/updated/deleted
+ij(CONNECTION1)> relative 2 sc1;
+C1         |C2         
+-----------------------
+7          |7          
+ij(CONNECTION1)> -- update row nr. 7 after positioning with relative
+update t1 set c2 = c1 + 20 where current of sc1;
+1 row inserted/updated/deleted
+ij(CONNECTION1)> previous sc1;
+C1         |C2         
+-----------------------
+6          |6          
+ij(CONNECTION1)> -- update row nr. 6 after positioning with previous
+update t1 set c2 = c1 + 20 where current of sc1;
+1 row inserted/updated/deleted
+ij(CONNECTION1)> relative -1 sc1;
+C1         |C2         
+-----------------------
+5          |25         
+ij(CONNECTION1)> last sc1;
+C1         |C2         
+-----------------------
+10         |10         
+ij(CONNECTION1)> -- update row nr. 10 after positioning with last
+update t1 set c2 = c1 + 20 where current of sc1;
+1 row inserted/updated/deleted
+ij(CONNECTION1)> after last sc1;
+No current row
+ij(CONNECTION1)> -- update when positioned after last should cause an error
+update t1 set c2 = c1 + 20 where current of sc1;
+ERROR XCL08: Cursor 'SC1' is not on a row.
+ij(CONNECTION1)> first sc1;
+C1         |C2         
+-----------------------
+1          |1          
+ij(CONNECTION1)> -- update row nr. 1 after positioning with first
+update t1 set c2 = c1 + 20 where current of sc1;
+1 row inserted/updated/deleted
+ij(CONNECTION1)> before first sc1;
+No current row
+ij(CONNECTION1)> -- update when positioned before first should cause an error
+update t1 set c2 = c1 + 20 where current of sc1;
+ERROR XCL08: Cursor 'SC1' is not on a row.
+ij(CONNECTION1)> close sc1;
+ij(CONNECTION1)> commit;
+ij(CONNECTION1)> -- check that row where correctly updated
+select * from t1;
+C1         |C2         
+-----------------------
+1          |21         
+2          |22         
+3          |3          
+4          |4          
+5          |25         
+6          |26         
+7          |27         
+8          |8          
+9          |9          
+10         |30         
+10 rows selected
+ij(CONNECTION1)> get scroll insensitive cursor sc1 as 'SELECT * FROM t1 FOR UPDATE';
+ij(CONNECTION1)> next sc1;
+C1         |C2         
+-----------------------
+1          |21         
+ij(CONNECTION1)> next sc1;
+C1         |C2         
+-----------------------
+2          |22         
+ij(CONNECTION1)> -- delete row nr. 2 after positioning with next
+delete from t1 where current of sc1;
+1 row inserted/updated/deleted
+ij(CONNECTION1)> absolute 5 sc1;
+C1         |C2         
+-----------------------
+5          |25         
+ij(CONNECTION1)> -- delete row nr. 5 after positioning with absolute
+delete from t1 where current of sc1;
+1 row inserted/updated/deleted
+ij(CONNECTION1)> relative 2 sc1;
+C1         |C2         
+-----------------------
+7          |27         
+ij(CONNECTION1)> -- delete row nr. 7 after positioning with relative
+delete from t1 where current of sc1;
+1 row inserted/updated/deleted
+ij(CONNECTION1)> previous sc1;
+C1         |C2         
+-----------------------
+6          |26         
+ij(CONNECTION1)> -- delete row nr. 6 after positioning with previous
+delete from t1 where current of sc1;
+1 row inserted/updated/deleted
+ij(CONNECTION1)> relative -1 sc1;
+C1         |C2         
+-----------------------
+NULL       |NULL       
+ij(CONNECTION1)> last sc1;
+C1         |C2         
+-----------------------
+10         |30         
+ij(CONNECTION1)> -- delete row nr. 10 after positioning with last
+delete from t1 where current of sc1;
+1 row inserted/updated/deleted
+ij(CONNECTION1)> after last sc1;
+No current row
+ij(CONNECTION1)> -- delete when positioned after last should cause an error
+delete from t1 where current of sc1;
+ERROR XCL08: Cursor 'SC1' is not on a row.
+ij(CONNECTION1)> first sc1;
+C1         |C2         
+-----------------------
+1          |21         
+ij(CONNECTION1)> -- delete row nr. 1 after positioning with first
+delete from t1 where current of sc1;
+1 row inserted/updated/deleted
+ij(CONNECTION1)> before first sc1;
+No current row
+ij(CONNECTION1)> -- delete when positioned before first should cause an error
+delete from t1 where current of sc1;
+ERROR XCL08: Cursor 'SC1' is not on a row.
+ij(CONNECTION1)> close sc1;
+ij(CONNECTION1)> commit;
+ij(CONNECTION1)> -- check that row where correctly updated
+select * from t1;
+C1         |C2         
+-----------------------
+3          |3          
+4          |4          
+8          |8          
+9          |9          
+4 rows selected
+ij(CONNECTION1)> 

Propchange: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/SURTest_ij.out
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/DerbyNet.exclude
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/DerbyNet.exclude?rev=411428&r1=411427&r2=411428&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/DerbyNet.exclude (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/DerbyNet.exclude Sat Jun  3 06:00:50 2006
@@ -46,3 +46,4 @@
 # Excluding checkDataSource and checkDataSource30 because JCC has no XA
 jdbcapi/checkDataSource30.java
 jdbcapi/checkDataSource.java
+jdbcapi/SURTest_ij.sql

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/jdbcapi.runall
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/jdbcapi.runall?rev=411428&r1=411427&r2=411428&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/jdbcapi.runall (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/suites/jdbcapi.runall Sat Jun  3 06:00:50 2006
@@ -25,3 +25,4 @@
 jdbcapi/SURQueryMixTest.junit
 jdbcapi/SURTest.junit
 jdbcapi/URCoveringIndexTest.junit
+jdbcapi/SURTest_ij.sql

Added: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/SURTest_ij.sql
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/SURTest_ij.sql?rev=411428&view=auto
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/SURTest_ij.sql (added)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/SURTest_ij.sql Sat Jun  3 06:00:50 2006
@@ -0,0 +1,68 @@
+connect 'SURTest;create=true;';
+autocommit off;
+create table t1 (c1 int primary key, c2 int);
+insert into t1 values 
+    (1, 1), (2, 2), (3, 3), (4, 4), (5, 5), 
+    (6, 6), (7, 7), (8, 8), (9, 9), (10, 10);
+get scroll insensitive cursor sc1 as 'SELECT * FROM t1 FOR UPDATE';
+next sc1;
+next sc1;
+-- update row nr. 2 after positioning with next
+update t1 set c2 = c1 + 20 where current of sc1;
+absolute 5 sc1;
+-- update row nr. 5 after positioning with absolute
+update t1 set c2 = c1 + 20 where current of sc1;
+relative 2 sc1;
+-- update row nr. 7 after positioning with relative
+update t1 set c2 = c1 + 20 where current of sc1;
+previous sc1;
+-- update row nr. 6 after positioning with previous
+update t1 set c2 = c1 + 20 where current of sc1;
+relative -1 sc1;
+last sc1;
+-- update row nr. 10 after positioning with last
+update t1 set c2 = c1 + 20 where current of sc1;
+after last sc1;
+-- update when positioned after last should cause an error
+update t1 set c2 = c1 + 20 where current of sc1;
+first sc1;
+-- update row nr. 1 after positioning with first
+update t1 set c2 = c1 + 20 where current of sc1;
+before first sc1;
+-- update when positioned before first should cause an error
+update t1 set c2 = c1 + 20 where current of sc1;
+close sc1;
+commit;
+-- check that row where correctly updated
+select * from t1;
+get scroll insensitive cursor sc1 as 'SELECT * FROM t1 FOR UPDATE';
+next sc1;
+next sc1;
+-- delete row nr. 2 after positioning with next
+delete from t1 where current of sc1;
+absolute 5 sc1;
+-- delete row nr. 5 after positioning with absolute
+delete from t1 where current of sc1;
+relative 2 sc1;
+-- delete row nr. 7 after positioning with relative
+delete from t1 where current of sc1;
+previous sc1;
+-- delete row nr. 6 after positioning with previous
+delete from t1 where current of sc1;
+relative -1 sc1;
+last sc1;
+-- delete row nr. 10 after positioning with last
+delete from t1 where current of sc1;
+after last sc1;
+-- delete when positioned after last should cause an error
+delete from t1 where current of sc1;
+first sc1;
+-- delete row nr. 1 after positioning with first
+delete from t1 where current of sc1;
+before first sc1;
+-- delete when positioned before first should cause an error
+delete from t1 where current of sc1;
+close sc1;
+commit;
+-- check that row where correctly updated
+select * from t1;

Propchange: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/SURTest_ij.sql
------------------------------------------------------------------------------
    svn:eol-style = native

Added: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/SURTest_ij_app.properties
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/SURTest_ij_app.properties?rev=411428&view=auto
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/SURTest_ij_app.properties (added)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/SURTest_ij_app.properties Sat Jun  3 06:00:50 2006
@@ -0,0 +1,2 @@
+ij.protocol=jdbc:derby:
+ij.database=SURTest;create=true;

Propchange: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/SURTest_ij_app.properties
------------------------------------------------------------------------------
    svn:eol-style = native