You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-dev@db.apache.org by "Richard N. Hillegas (Jira)" <ji...@apache.org> on 2020/07/01 23:00:00 UTC

[jira] [Commented] (DERBY-7081) A rotten comment in DataDictionaryImpl.java

    [ https://issues.apache.org/jira/browse/DERBY-7081?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17149730#comment-17149730 ] 

Richard N. Hillegas commented on DERBY-7081:
--------------------------------------------

The comment seems appropriate to me. It explains why the column is being identified by position rather than by name. The reason is that two columns can have identical names when they are uppercased but they will always have unique positions. The problem case being addressed is the repro attached to DERBY-1258.

> 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)