[ https://issues.apache.org/jira/browse/DERBY-7081?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17149737#comment-17149737 ]
Richard N. Hillegas commented on DERBY-7081: -------------------------------------------- Hm, for some reason, my response disappeared. Trying again: The comment seems appropriate to me. It is explaining why the column is being referenced by position rather than by name. The problem is that two columns could have identical names, once they are uppercased. The comment points to DERBY-1258--that issue has a repro for the problem which is being addressed. > A rotten comment in DataDictionaryImpl.java > ------------------------------------------- > > Key: DERBY-7081 > URL: https://issues.apache.org/jira/browse/DERBY-7081 > Project: Derby > Issue Type: Bug > Reporter: ackelcn > Priority: Major > > When I read the code of DataDictionaryImpl.java, I found a comment: > > {code:java} > private String genColumnReferenceSQL(private String genColumnReferenceSQL( > TableDescriptor td, String colName, String tabName, boolean isOldTable, int > colPositionInRuntimeResultSet ) throws StandardException > { > ColumnDescriptor colDesc = null; > if ((colDesc = td.getColumnDescriptor(colName)) == null) > { > throw StandardException.newException(SQLState.LANG_COLUMN_NOT_FOUND, > tabName+"."+colName); > } > /* ** Generate something like this: ** > ** CAST (org.apache.derby.iapi.db.Factory:: > ** getTriggerExecutionContext().getNewRow(). > ** getObject(<colPosition>) AS DECIMAL(6,2)) > ** > ** Column position is used to avoid the wrong column being > ** selected problem (DERBY-1258) caused by the case insensitive > ** JDBC rules for fetching a column by name. > ... > }{code} > The comment mentions DERBY-1258. I found that DERBY-1258 modified > CreateTriggerNode.java, and the patch is as follows: > > > > {code:java} > @@ -587,7 +587,11 @@@@ -587,7 +587,11 @@ > ** > ** cast (org.apache.derby.iapi.db.Factory:: > ** getTriggerExecutionContext().getNewRow(). > - ** getObject('<colName>') AS DECIMAL(6,2)) > + ** getObject(<colPosition>) AS DECIMAL(6,2)) > + ** > + ** Column position is used to avoid the wrong column being > + ** selected problem (DERBY-1258) caused by the case insensitive > + ** JDBC rules for fetching a column by name. > ** > ** The cast back to the SQL Domain may seem redundant > ** but we need it to make the column reference appear > @@ -599,9 +603,11 @@ > ** CREATE TRIGGER ... INSERT INTO T length(Column), ... > */ StringBuffer methodCall = new StringBuffer(); > - methodCall.append("cast > (org.apache.derby.iapi.db.Factory::getTriggerExecutionContext()."); > + methodCall.append("CAST > (org.apache.derby.iapi.db.Factory::getTriggerExecutionContext()."); > methodCall.append(isOldTable ? "getOldRow()" : "getNewRow()"); > - methodCall.append(".getObject('"+colName+"') AS "); > + methodCall.append(".getObject("); > + methodCall.append(colDesc.getPosition()); > + methodCall.append(") AS "); DataTypeDescriptor dts = > colDesc.getType(); TypeId typeId = dts.getTypeId(); > @@ -611,8 +617,9 @@ > ** case. > */ methodCall.append( > - (typeId.userType() ? typeId.getSQLTypeName() : dts.getSQLstring()) > - + ") "); > + (typeId.userType() ? typeId.getSQLTypeName() : dts.getSQLstring())); > + > + methodCall.append(") "); return methodCall.toString(); } > {code} > The patch modified the genColumnReferenceSQL method. However, the method does > not appear in the latest version of CreateTriggerNode.java. I found that > DERBY-4874 deleted the whole method. > > > I am wondering whether DataDictionaryImpl.java mentions a rotten issue report > (DERBY-1258), in that all the modifications of this issue do not appear in > the latest version. > > Would you please check the problem? If it is, the reference of DERBY-1258 > shall be removed from the comment of DataDictionaryImpl.java. -- This message was sent by Atlassian Jira (v8.3.4#803005)