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 2007/10/19 17:42:05 UTC
svn commit: r586505 - in
/db/derby/code/branches/10.1/java/engine/org/apache/derby/impl:
sql/GenericParameter.java sql/execute/DistinctScalarAggregateResultSet.java
store/access/RAMTransaction.java
Author: kmarsden
Date: Fri Oct 19 08:42:04 2007
New Revision: 586505
URL: http://svn.apache.org/viewvc?rev=586505&view=rev
Log:
DERBY-756 OutOfMemory Error on continous execution of select statement using COUNT() and DISTINCT on same connection
merge from trunk
Modified:
db/derby/code/branches/10.1/java/engine/org/apache/derby/impl/sql/GenericParameter.java
db/derby/code/branches/10.1/java/engine/org/apache/derby/impl/sql/execute/DistinctScalarAggregateResultSet.java
db/derby/code/branches/10.1/java/engine/org/apache/derby/impl/store/access/RAMTransaction.java
Modified: db/derby/code/branches/10.1/java/engine/org/apache/derby/impl/sql/GenericParameter.java
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.1/java/engine/org/apache/derby/impl/sql/GenericParameter.java?rev=586505&r1=586504&r2=586505&view=diff
==============================================================================
--- db/derby/code/branches/10.1/java/engine/org/apache/derby/impl/sql/GenericParameter.java (original)
+++ db/derby/code/branches/10.1/java/engine/org/apache/derby/impl/sql/GenericParameter.java Fri Oct 19 08:42:04 2007
@@ -352,11 +352,11 @@
{
try
{
- return value.getString();
+ return value.getTraceString();
}
catch (StandardException se)
{
- return "unexpected exception from getString() - " + se;
+ return "unexpected exception from getTraceString() - " + se;
}
}
}
Modified: db/derby/code/branches/10.1/java/engine/org/apache/derby/impl/sql/execute/DistinctScalarAggregateResultSet.java
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.1/java/engine/org/apache/derby/impl/sql/execute/DistinctScalarAggregateResultSet.java?rev=586505&r1=586504&r2=586505&view=diff
==============================================================================
--- db/derby/code/branches/10.1/java/engine/org/apache/derby/impl/sql/execute/DistinctScalarAggregateResultSet.java (original)
+++ db/derby/code/branches/10.1/java/engine/org/apache/derby/impl/sql/execute/DistinctScalarAggregateResultSet.java Fri Oct 19 08:42:04 2007
@@ -20,17 +20,8 @@
package org.apache.derby.impl.sql.execute;
-import org.apache.derby.iapi.services.monitor.Monitor;
-
import org.apache.derby.iapi.services.sanity.SanityManager;
-import org.apache.derby.iapi.services.stream.HeaderPrintWriter;
-import org.apache.derby.iapi.services.stream.InfoStreams;
-
-import org.apache.derby.iapi.services.io.Formatable;
-
-import org.apache.derby.iapi.sql.execute.CursorResultSet;
-import org.apache.derby.iapi.sql.ResultSet;
import org.apache.derby.iapi.sql.execute.ExecRow;
import org.apache.derby.iapi.sql.execute.ExecIndexRow;
import org.apache.derby.iapi.sql.execute.NoPutResultSet;
@@ -45,19 +36,13 @@
import org.apache.derby.iapi.services.loader.GeneratedMethod;
-import org.apache.derby.iapi.sql.execute.ExecutionFactory;
-import org.apache.derby.iapi.sql.execute.ExecutionContext;
-import org.apache.derby.iapi.sql.conn.LanguageConnectionContext;
-
-import org.apache.derby.iapi.types.RowLocation;
import org.apache.derby.iapi.error.StandardException;
import org.apache.derby.iapi.services.io.FormatableArrayHolder;
import java.util.Properties;
-import java.util.Vector;
-import java.util.Enumeration;
+
/**
* This ResultSet evaluates scalar aggregates where
@@ -272,6 +257,14 @@
openTime += getElapsedMillis(beginTime);
}
+ /**
+ * @inheritDoc
+ */
+ public void close() throws StandardException
+ {
+ super.close();
+ closeSource();
+ }
///////////////////////////////////////////////////////////////////////////////
//
// SCAN ABSTRACTION UTILITIES
Modified: db/derby/code/branches/10.1/java/engine/org/apache/derby/impl/store/access/RAMTransaction.java
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.1/java/engine/org/apache/derby/impl/store/access/RAMTransaction.java?rev=586505&r1=586504&r2=586505&view=diff
==============================================================================
--- db/derby/code/branches/10.1/java/engine/org/apache/derby/impl/store/access/RAMTransaction.java (original)
+++ db/derby/code/branches/10.1/java/engine/org/apache/derby/impl/store/access/RAMTransaction.java Fri Oct 19 08:42:04 2007
@@ -20,12 +20,14 @@
package org.apache.derby.impl.store.access;
+import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Properties;
import java.util.Vector;
import org.apache.derby.iapi.reference.SQLState;
+import org.apache.derby.iapi.util.ReuseFactory;
import org.apache.derby.iapi.services.context.ContextManager;
@@ -119,6 +121,11 @@
private Vector sorts;
private Vector sortControllers;
+ /** List of sort identifiers (represented as <code>Integer</code> objects)
+ * which can be reused. Since sort identifiers are used as array indexes,
+ * we need to reuse them to avoid leaking memory (DERBY-912). */
+ private ArrayList freeSortIds;
+
/**
Where to look for temporary conglomerates.
**/
@@ -162,6 +169,7 @@
conglomerateControllers = new Vector();
sorts = null; // allocated on demand.
+ freeSortIds = null; // allocated on demand.
sortControllers = null; // allocated on demand
if (parent_tran != null)
@@ -313,6 +321,7 @@
sort.drop(this);
}
sorts.removeAllElements();
+ freeSortIds.clear();
}
}
}
@@ -1716,10 +1725,22 @@
estimatedRowSize);
// Add the sort to the sorts vector
- if (sorts == null)
+ if (sorts == null) {
sorts = new Vector();
- long sortid = sorts.size();
- sorts.addElement(sort);
+ freeSortIds = new ArrayList();
+ }
+
+ int sortid;
+ if (freeSortIds.isEmpty()) {
+ // no free identifiers, add sort at the end
+ sortid = sorts.size();
+ sorts.addElement(sort);
+ } else {
+ // reuse a sort identifier
+ sortid = ((Integer) freeSortIds.remove(freeSortIds.size() - 1))
+ .intValue();
+ sorts.setElementAt(sort, sortid);
+ }
return sortid;
}
@@ -1747,6 +1768,7 @@
{
sort.drop(this);
sorts.setElementAt(null, (int) sortid);
+ freeSortIds.add(ReuseFactory.getInteger((int) sortid));
}
}