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 km...@apache.org on 2011/03/31 21:33:57 UTC
svn commit: r1087420 - in /db/derby/code/branches/10.3/java:
engine/org/apache/derby/impl/sql/execute/
testing/org/apache/derbyTesting/functionTests/tests/lang/
Author: kmarsden
Date: Thu Mar 31 19:33:57 2011
New Revision: 1087420
URL: http://svn.apache.org/viewvc?rev=1087420&view=rev
Log:
DERBY-4488 Nullpointer when performing INSERT INTO
merge from 10.4 r1085551
contributed by Knut Anders Hatlen
Modified:
db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/execute/CallStatementResultSet.java
db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/execute/DeleteResultSet.java
db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/execute/DeleteVTIResultSet.java
db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/execute/InsertResultSet.java
db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/execute/InsertVTIResultSet.java
db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/execute/MiscResultSet.java
db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/execute/NoRowsResultSetImpl.java
db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/execute/SetTransactionResultSet.java
db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/execute/UpdateResultSet.java
db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/execute/UpdateVTIResultSet.java
db/derby/code/branches/10.3/java/testing/org/apache/derbyTesting/functionTests/tests/lang/ResultSetsFromPreparedStatementTest.java
Modified: db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/execute/CallStatementResultSet.java
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/execute/CallStatementResultSet.java?rev=1087420&r1=1087419&r2=1087420&view=diff
==============================================================================
--- db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/execute/CallStatementResultSet.java (original)
+++ db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/execute/CallStatementResultSet.java Thu Mar 31 19:33:57 2011
@@ -58,7 +58,6 @@ class CallStatementResultSet extends NoR
CallStatementResultSet(
GeneratedMethod methodCall,
Activation a)
- throws StandardException
{
super(a);
this.methodCall = methodCall;
Modified: db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/execute/DeleteResultSet.java
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/execute/DeleteResultSet.java?rev=1087420&r1=1087419&r2=1087420&view=diff
==============================================================================
--- db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/execute/DeleteResultSet.java (original)
+++ db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/execute/DeleteResultSet.java Thu Mar 31 19:33:57 2011
@@ -209,9 +209,6 @@ class DeleteResultSet extends DMLWriteRe
activation.checkStatementValidity();
/* Get or re-use the row changer.
- * NOTE: We need to set ourself as the top result set
- * if this is not the 1st execution. (Done in constructor
- * for 1st execution.)
*/
if (firstExecute)
{
@@ -232,10 +229,7 @@ class DeleteResultSet extends DMLWriteRe
constants.getStreamStorableHeapColIds(),
activation);
}
- else
- {
- lcc.getStatementContext().setTopResultSet(this, subqueryTrackingArray);
- }
+
/* decode the lock mode for the execution isolation level */
lockMode = decodeLockMode(constants.lockMode);
Modified: db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/execute/DeleteVTIResultSet.java
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/execute/DeleteVTIResultSet.java?rev=1087420&r1=1087419&r2=1087420&view=diff
==============================================================================
--- db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/execute/DeleteVTIResultSet.java (original)
+++ db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/execute/DeleteVTIResultSet.java Thu Mar 31 19:33:57 2011
@@ -75,8 +75,6 @@ class DeleteVTIResultSet extends DMLVTIR
*/
protected void openCore() throws StandardException
{
- lcc.getStatementContext().setTopResultSet(this, subqueryTrackingArray);
-
ExecRow row = getNextRowCore(sourceResultSet);
if (row != null)
Modified: db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/execute/InsertResultSet.java
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/execute/InsertResultSet.java?rev=1087420&r1=1087419&r2=1087420&view=diff
==============================================================================
--- db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/execute/InsertResultSet.java (original)
+++ db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/execute/InsertResultSet.java Thu Mar 31 19:33:57 2011
@@ -887,9 +887,6 @@ class InsertResultSet extends DMLWriteRe
long user_autoinc=0;
/* Get or re-use the row changer.
- * NOTE: We need to set ourself as the top result set
- * if this is not the 1st execution. (Done in constructor
- * for 1st execution.)
*/
if (firstExecute)
{
@@ -910,10 +907,6 @@ class InsertResultSet extends DMLWriteRe
);
rowChanger.setIndexNames(constants.indexNames);
}
- else
- {
- lcc.getStatementContext().setTopResultSet(this, subqueryTrackingArray);
- }
/* decode lock mode for the execution isolation level */
int lockMode = decodeLockMode(constants.lockMode);
Modified: db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/execute/InsertVTIResultSet.java
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/execute/InsertVTIResultSet.java?rev=1087420&r1=1087419&r2=1087420&view=diff
==============================================================================
--- db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/execute/InsertVTIResultSet.java (original)
+++ db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/execute/InsertVTIResultSet.java Thu Mar 31 19:33:57 2011
@@ -107,16 +107,6 @@ class InsertVTIResultSet extends DMLVTIR
throw StandardException.unexpectedUserException(t);
}
- /* Get or re-use the row changer.
- * NOTE: We need to set ourself as the top result set
- * if this is not the 1st execution. (Done in constructor
- * for 1st execution.)
- */
- if (! firstExecute)
- {
- lcc.getStatementContext().setTopResultSet(this, subqueryTrackingArray);
- }
-
/* The source does not know whether or not we are doing a
* deferred mode insert. If we are, then we must clear the
* index scan info from the activation so that the row changer
Modified: db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/execute/MiscResultSet.java
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/execute/MiscResultSet.java?rev=1087420&r1=1087419&r2=1087420&view=diff
==============================================================================
--- db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/execute/MiscResultSet.java (original)
+++ db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/execute/MiscResultSet.java Thu Mar 31 19:33:57 2011
@@ -43,11 +43,8 @@ class MiscResultSet extends NoRowsResult
* Construct a MiscResultSet
*
* @param activation Describes run-time environment.
- *
- * @exception StandardException Standard Derby error policy.
*/
MiscResultSet(Activation activation)
- throws StandardException
{
super(activation);
}
Modified: db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/execute/NoRowsResultSetImpl.java
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/execute/NoRowsResultSetImpl.java?rev=1087420&r1=1087419&r2=1087420&view=diff
==============================================================================
--- db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/execute/NoRowsResultSetImpl.java (original)
+++ db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/execute/NoRowsResultSetImpl.java Thu Mar 31 19:33:57 2011
@@ -67,7 +67,7 @@ abstract class NoRowsResultSetImpl imple
{
final Activation activation;
private boolean dumpedStats;
- NoPutResultSet[] subqueryTrackingArray;
+ private NoPutResultSet[] subqueryTrackingArray;
private final boolean statisticsTimingOn;
/** True if the result set has been opened, and not yet closed. */
@@ -86,7 +86,6 @@ abstract class NoRowsResultSetImpl imple
protected long endExecutionTime;
NoRowsResultSetImpl(Activation activation)
- throws StandardException
{
this.activation = activation;
@@ -105,14 +104,6 @@ abstract class NoRowsResultSetImpl imple
beginTime = getCurrentTimeMillis();
beginExecutionTime = beginTime;
- StatementContext sc = lcc.getStatementContext();
- sc.setTopResultSet(this, (NoPutResultSet[]) null);
-
- // Pick up any materialized subqueries
- if (subqueryTrackingArray == null)
- {
- subqueryTrackingArray = sc.getSubqueryTrackingArray();
- }
}
/**
@@ -123,6 +114,14 @@ abstract class NoRowsResultSetImpl imple
*/
void setup() throws StandardException {
isOpen = true;
+
+ StatementContext sc = lcc.getStatementContext();
+ sc.setTopResultSet(this, subqueryTrackingArray);
+
+ // Pick up any materialized subqueries
+ if (subqueryTrackingArray == null) {
+ subqueryTrackingArray = sc.getSubqueryTrackingArray();
+ }
}
/**
Modified: db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/execute/SetTransactionResultSet.java
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/execute/SetTransactionResultSet.java?rev=1087420&r1=1087419&r2=1087420&view=diff
==============================================================================
--- db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/execute/SetTransactionResultSet.java (original)
+++ db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/execute/SetTransactionResultSet.java Thu Mar 31 19:33:57 2011
@@ -40,11 +40,8 @@ class SetTransactionResultSet extends Mi
* Construct a SetTransactionResultSet
*
* @param activation Describes run-time environment.
- *
- * @exception StandardException Standard Derby error policy.
*/
SetTransactionResultSet(Activation activation)
- throws StandardException
{
super(activation);
}
Modified: db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/execute/UpdateResultSet.java
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/execute/UpdateResultSet.java?rev=1087420&r1=1087419&r2=1087420&view=diff
==============================================================================
--- db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/execute/UpdateResultSet.java (original)
+++ db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/execute/UpdateResultSet.java Thu Mar 31 19:33:57 2011
@@ -303,9 +303,6 @@ class UpdateResultSet extends DMLWriteRe
}
/* Get or re-use the row changer.
- * NOTE: We need to set ourself as the top result set
- * if this is not the 1st execution. (Done in constructor
- * for 1st execution.)
*/
if (firstOpen)
{
@@ -326,10 +323,6 @@ class UpdateResultSet extends DMLWriteRe
activation);
rowChanger.setIndexNames(constants.indexNames);
}
- else
- {
- lcc.getStatementContext().setTopResultSet(this, subqueryTrackingArray);
- }
/* Open the RowChanger before the source ResultSet so that
Modified: db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/execute/UpdateVTIResultSet.java
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/execute/UpdateVTIResultSet.java?rev=1087420&r1=1087419&r2=1087420&view=diff
==============================================================================
--- db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/execute/UpdateVTIResultSet.java (original)
+++ db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/sql/execute/UpdateVTIResultSet.java Thu Mar 31 19:33:57 2011
@@ -76,8 +76,6 @@ class UpdateVTIResultSet extends DMLVTIR
if( null != row)
rowLocationColumn = row.nColumns();
- if (!firstExecute)
- lcc.getStatementContext().setTopResultSet(this, subqueryTrackingArray);
/* The source does not know whether or not we are doing a
* deferred mode insert. If we are, then we must clear the
Modified: db/derby/code/branches/10.3/java/testing/org/apache/derbyTesting/functionTests/tests/lang/ResultSetsFromPreparedStatementTest.java
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.3/java/testing/org/apache/derbyTesting/functionTests/tests/lang/ResultSetsFromPreparedStatementTest.java?rev=1087420&r1=1087419&r2=1087420&view=diff
==============================================================================
--- db/derby/code/branches/10.3/java/testing/org/apache/derbyTesting/functionTests/tests/lang/ResultSetsFromPreparedStatementTest.java (original)
+++ db/derby/code/branches/10.3/java/testing/org/apache/derbyTesting/functionTests/tests/lang/ResultSetsFromPreparedStatementTest.java Thu Mar 31 19:33:57 2011
@@ -172,6 +172,8 @@ public class ResultSetsFromPreparedState
private static final long DERBY_DEFAULT_TIMEOUT = 60;
+ private static final String SQLSTATE_NULL_INTO_NON_NULL = "23502";
+
/**
* Creates a String containing an insert statement for the
* specified table containing the specified number of '?'
@@ -2485,4 +2487,30 @@ public class ResultSetsFromPreparedState
stm.execute("SET SCHEMA " + schema);
stm.close();
}
+
+ /**
+ * Test case for DERBY-4488, where the third execution of a statement
+ * that attempted to insert a NULL into a non-nullable column failed with
+ * a NullPointerException.
+ */
+ public void testInsertNullIntoNonNullableColumn() throws SQLException {
+ setAutoCommit(false);
+
+ Statement s = createStatement();
+ s.execute("create table d4488_t1 (pk int primary key)");
+ s.execute("insert into d4488_t1 values 1");
+ s.execute("create table d4488_t2 (c1 int, c2 int not null)");
+ commit();
+
+ PreparedStatement ps = prepareStatement(
+ "insert into d4488_t2(c1) select 1 from d4488_t1");
+ for (int i = 0; i < 5; i++) {
+ // Expect this to fail, but not with NullPointerException.
+ assertStatementError(SQLSTATE_NULL_INTO_NON_NULL, ps);
+ // Need a rollback here in order to close the index scan on
+ // D4488_T1, otherwise the NPE won't reproduce. Alternatively,
+ // run with auto-commit enabled.
+ rollback();
+ }
+ }
}