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 rh...@apache.org on 2006/09/22 23:01:09 UTC
svn commit: r449086 -
/db/derby/code/branches/10.2/java/engine/org/apache/derby/impl/jdbc/EmbedResultSet.java
Author: rhillegas
Date: Fri Sep 22 14:01:08 2006
New Revision: 449086
URL: http://svn.apache.org/viewvc?view=rev&rev=449086
Log:
DERBY-1725: Merge the following patches from the trunk to the 10.2 branch: No JIRA (448948), DERBY-1862 (448949).
Modified:
db/derby/code/branches/10.2/java/engine/org/apache/derby/impl/jdbc/EmbedResultSet.java
Modified: db/derby/code/branches/10.2/java/engine/org/apache/derby/impl/jdbc/EmbedResultSet.java
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.2/java/engine/org/apache/derby/impl/jdbc/EmbedResultSet.java?view=diff&rev=449086&r1=449085&r2=449086
==============================================================================
--- db/derby/code/branches/10.2/java/engine/org/apache/derby/impl/jdbc/EmbedResultSet.java (original)
+++ db/derby/code/branches/10.2/java/engine/org/apache/derby/impl/jdbc/EmbedResultSet.java Fri Sep 22 14:01:08 2006
@@ -57,6 +57,7 @@
import org.apache.derby.iapi.reference.JDBC30Translation;
import org.apache.derby.iapi.reference.SQLState;
import org.apache.derby.iapi.util.StringUtil;
+import org.apache.derby.iapi.util.ReuseFactory;
/* can't import these due to name overlap:
import java.sql.ResultSet;
@@ -77,6 +78,8 @@
import java.io.IOException;
import java.net.URL;
+import java.util.Map;
+import java.util.HashMap;
import java.util.Arrays;
import java.util.Calendar;
@@ -145,6 +148,12 @@
private final ResultDescription resultDescription;
+
+ /**
+ * A map which maps a column name to a column number.
+ * Entries only added when accessing columns with the name.
+ */
+ private Map columnNameMap;
// max rows limit for this result set
private int maxRows;
@@ -249,10 +258,7 @@
if (!isForUpdate()) { //language resultset not updatable
concurrencyOfThisResultSet = JDBC20Translation.CONCUR_READ_ONLY;
SQLWarning w = StandardException.newWarning(SQLState.QUERY_NOT_QUALIFIED_FOR_UPDATABLE_RESULTSET);
- if (topWarning == null)
- topWarning = w;
- else
- topWarning.setNextWarning(w);
+ addWarning(w);
} else
concurrencyOfThisResultSet = JDBC20Translation.CONCUR_UPDATABLE;
}
@@ -263,6 +269,7 @@
getLanguageConnectionFactory().getExecutionFactory();
final int columnCount = getMetaData().getColumnCount();
this.currentRow = factory.getValueRow(columnCount);
+ this.columnNameMap = null;
currentRow.setRowArray(null);
// Only incur the cost of allocating and maintaining
@@ -4228,29 +4235,41 @@
// n.b. if we went through the JDBC interface,
// there is a caching implementation in the JDBC doc
// (appendix C). But we go through our own info, for now.
- // REVISIT: we might want to cache our own info...
-
if (columnName == null)
throw newSQLException(SQLState.NULL_COLUMN_NAME);
-
- ResultDescription rd = resultDescription;
-
- // 1 or 0 based? assume 1 (probably wrong)
- // Changing the order in which columns are found from 1 till column count.
- // This is necessary in cases where the column names are the same but are in different cases.
- // This is because in updateXXX and getXXX methods column names are case insensitive
- // and in that case the first column should be returned.
-
- int columnCount = rd.getColumnCount();
-
- for(int i = 1 ; i<= columnCount;i++) {
- String name = rd.getColumnDescriptor(i).getName();
- if (StringUtil.SQLEqualsIgnoreCase(columnName, name)) {
- return i;
- }
- }
- throw newSQLException(SQLState.COLUMN_NOT_FOUND, columnName);
+
+ final Map workMap;
+
+ synchronized (this) {
+ if (columnNameMap==null) {
+ // updateXXX and getXXX methods are case insensitive and the
+ // first column should be returned. The loop goes backward to
+ // create a map which preserves this property.
+ columnNameMap = new HashMap();
+ for (int i = resultDescription.getColumnCount(); i>=1; i--) {
+
+ final String key = StringUtil.
+ SQLToUpperCase(resultDescription.
+ getColumnDescriptor(i).getName());
+
+ final Integer value = ReuseFactory.getInteger(i);
+
+ columnNameMap.put(key, value);
+ }
+ }
+ workMap = columnNameMap;
+ }
+
+ Integer val = (Integer) workMap.get(columnName);
+ if (val==null) {
+ val = (Integer) workMap.get(StringUtil.SQLToUpperCase(columnName));
+ }
+ if (val==null) {
+ throw newSQLException(SQLState.COLUMN_NOT_FOUND, columnName);
+ } else {
+ return val.intValue();
+ }
}