[ https://issues.apache.org/jira/browse/DERBY-2352?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12534932 ]
Bryan Pendleton commented on DERBY-2352: ---------------------------------------- Seems like there are 3 alternatives worth pursuing: 1) Turn the SQLVarchar into a SQLChar 2) Turn the SQLChar into a SQLVarchar 3) Teach the sorter that it should tolerate a mixture of SQLVarchar/SQLChar The first alternative involves modifying SQLChar.substring() so that instead of returning a Varchar, it returns a Char. Perhaps the algorithm could be something like: substring of a Char returns a Char; substring of a Varchar returns a Varchar. The second alternative involves modifying the code that generates the projection and rowAllocator methods so that the code can more accurately track the datatype of the ResultColumn in the presence of expression such as substring, and ensure that the proper actual data type (Varchar in this case) is used when generating the template row in the rowAllocator method. It looks like TernaryNode.substrBind() makes some attempts to compute the resulting data type; perhaps this data type computation just isn't making it properly into the REsultColumn's data type ID. The third alternative involves figuring out why MergeSort is complaining when SQLVarchar != SQLChar, and whether MergeSort could be enhanced to be more tolerant of mismatching types. As a start, I could try removing the sanity assertion and see what problems occur farther down the road. I don't immediately see any reason to prefer one of these solutions over any other; if anybody has any suggestions about which course of action seems best, please let me know. Otherwise I'll probably try them each and see how much progress I make. > Assertion Failure with order by and group by expression > ------------------------------------------------------- > > Key: DERBY-2352 > URL: https://issues.apache.org/jira/browse/DERBY-2352 > Project: Derby > Issue Type: Bug > Components: SQL > Affects Versions: 10.2.2.0, 10.3.1.4 > Environment: Any > Reporter: Yip Ng > Assignee: Bryan Pendleton > > Assertion failure with order by expression: > ij> select substr('abc', 1) from t1 order by substr('abc', 1); > ERROR XJ001: Java exception: 'ASSERT FAILED col1.getClass() (class > org.apache.derby.iapi.types.SQLVarchar) expected to be the same as > col2.getClass() (class org.apache.derby.iapi.types.SQLChar): > org.apache.derby.shared.common.sanity.AssertFailure'. > Stacktrace: > org.apache.derby.shared.common.sanity.AssertFailure: ASSERT FAILED > col1.getClass() (class org.apache.derby.iapi.types.SQLVarchar) expected to be > the same as col2.getClass() (class org.apache.derby.iapi.types.SQLChar) > at > org.apache.derby.shared.common.sanity.SanityManager.THROWASSERT(SanityManager.java:149) > at > org.apache.derby.impl.store.access.sort.MergeSort.checkColumnTypes(MergeSort.java:472) > at > org.apache.derby.impl.store.access.sort.MergeInserter.insert(MergeInserter.java:106) > at > org.apache.derby.impl.sql.execute.SortResultSet.loadSorter(SortResultSet.java:318) > at > org.apache.derby.impl.sql.execute.SortResultSet.openCore(SortResultSet.java:269) > at > org.apache.derby.impl.sql.execute.ProjectRestrictResultSet.openCore(ProjectRestrictResultSet.java:169) > at > org.apache.derby.impl.sql.execute.BasicNoPutResultSetImpl.open(BasicNoPutResultSetImpl.java:260) > at > org.apache.derby.impl.sql.GenericPreparedStatement.execute(GenericPreparedStatement.java:358) > at > org.apache.derby.impl.jdbc.EmbedStatement.executeStatement(EmbedStatement.java:1182) > at > org.apache.derby.impl.jdbc.EmbedStatement.execute(EmbedStatement.java:585) > at > org.apache.derby.impl.jdbc.EmbedStatement.execute(EmbedStatement.java:517) > at org.apache.derby.impl.tools.ij.ij.executeImmediate(ij.java:321) > at org.apache.derby.impl.tools.ij.utilMain.doCatch(utilMain.java:517) > at > org.apache.derby.impl.tools.ij.utilMain.runScriptGuts(utilMain.java:370) > at org.apache.derby.impl.tools.ij.utilMain.go(utilMain.java:268) > at org.apache.derby.impl.tools.ij.Main.go(Main.java:204) > at org.apache.derby.impl.tools.ij.Main.mainCore(Main.java:170) > at org.apache.derby.impl.tools.ij.Main14.main(Main14.java:56) > at org.apache.derby.tools.ij.main(ij.java:71) -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.