[ 
https://issues.apache.org/jira/browse/DERBY-5531?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Mamta A. Satoor updated DERBY-5531:
-----------------------------------

    Attachment: DERBY5531_proposal2_diff.txt
                DERBY5531_proposal1_diff.txt

I went through the code and have following 2 proposals.
a)ResultColumnList.java's method columnTypesAndLengthMatch returns false if it 
finds a mismatch between column types and lengths.Based on this return value, 
the calling method InsertNode.bind determines if it needs a Normalize 
ResultSet. If the column has null value as it can be in the following example, 
the method columnTypesAndLengthMatch returns true even though the column length 
is not really the size of the underlying table's column. 
insert into t values null;
We can change columnTypesAndLengthMatch to return false(as shown below) if the 
insert value is null but it will add additional runtime processing because of 
the Normalize ResultSet(I am attaching DERBY5531_proposal1_diff.txt which shows 
the proposed changes for this proposal).
  if((otherResultColumn.getExpression() instanceof ConstantNode) &&
         ((ConstantNode) otherResultColumn.getExpression()).isNull()) {
        ConstantNode otherResultColumnConstNode = 
(ConstantNode)otherResultColumn.getExpression();
        if (otherResultColumnConstNode.isNull())
                return false;
        }
I don't know the history behind why we have chosen not to have a normalize 
resultset if the values being inserted are null.This existing behavior of not 
having a normalize resultset for null values has not resulted in any bugs and 
hence I would prefer us not going with this proposal of adding normalize 
resultset on top of null insert values. I would prefer the 2nd proposal which 
is as follows.
2)As per this proposal, we should change OpenBTree.isIndexableRowConsistent  to 
not throw an assert failure if dealing with null values. If the value is null, 
then we should not assert the column datatypes. As it is, this method is 
meaningful only in sane mode. As we have seen in this jira, insane jars do not 
give any error for the test case provided in the jira. I am attaching 
DERBY5531_proposal2_diff.txt which shows the proposed changes for this proposal.

I have added test cases in CollationTest.

I have run derbyall and junit suite with both the proposals and there were no 
issues with the tests.

                
> Assert failure when inserting NULL into indexed column with territory-based 
> collation
> -------------------------------------------------------------------------------------
>
>                 Key: DERBY-5531
>                 URL: https://issues.apache.org/jira/browse/DERBY-5531
>             Project: Derby
>          Issue Type: Bug
>          Components: SQL
>    Affects Versions: 10.8.2.2
>            Reporter: Knut Anders Hatlen
>            Assignee: Mamta A. Satoor
>              Labels: derby_triage10_9
>         Attachments: DERBY5531_proposal1_diff.txt, 
> DERBY5531_proposal2_diff.txt
>
>
> ij> connect 
> 'jdbc:derby:colldb;territory=en;collation=TERRITORY_BASED;create=true';
> ij> create table t(x varchar(10) unique);
> 0 rows inserted/updated/deleted
> ij> insert into t values null;
> ERROR XJ001: Java exception: 'ASSERT FAILED type of inserted column[0] = 
> org.apache.derby.iapi.types.SQLVarchartype of template column[0] = 
> org.apache.derby.iapi.types.CollatorSQLVarchar: 
> org.apache.derby.shared.common.sanity.AssertFailure'.
> java.sql.SQLException: Java exception: 'ASSERT FAILED type of inserted 
> column[0] = org.apache.derby.iapi.types.SQLVarchartype of template column[0] 
> = org.apache.derby.iapi.types.CollatorSQLVarchar: 
> org.apache.derby.shared.common.sanity.AssertFailure'.
>       at 
> org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(SQLExceptionFactory40.java:98)
>       at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Util.java:142)
>       at org.apache.derby.impl.jdbc.Util.javaException(Util.java:299)
>       at 
> org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(TransactionResourceImpl.java:436)
>       at 
> org.apache.derby.impl.jdbc.TransactionResourceImpl.handleException(TransactionResourceImpl.java:353)
>       at 
> org.apache.derby.impl.jdbc.EmbedConnection.handleException(EmbedConnection.java:2288)
>       at 
> org.apache.derby.impl.jdbc.ConnectionChild.handleException(ConnectionChild.java:82)
>       at 
> org.apache.derby.impl.jdbc.EmbedStatement.executeStatement(EmbedStatement.java:1334)
>       at 
> org.apache.derby.impl.jdbc.EmbedStatement.execute(EmbedStatement.java:630)
>       at 
> org.apache.derby.impl.jdbc.EmbedStatement.execute(EmbedStatement.java:559)
>       at org.apache.derby.impl.tools.ij.ij.executeImmediate(ij.java:367)
>       at org.apache.derby.impl.tools.ij.utilMain.doCatch(utilMain.java:527)
>       at 
> org.apache.derby.impl.tools.ij.utilMain.runScriptGuts(utilMain.java:369)
>       at org.apache.derby.impl.tools.ij.utilMain.go(utilMain.java:245)
>       at org.apache.derby.impl.tools.ij.Main.go(Main.java:229)
>       at org.apache.derby.impl.tools.ij.Main.mainCore(Main.java:184)
>       at org.apache.derby.impl.tools.ij.Main.main(Main.java:75)
>       at org.apache.derby.tools.ij.main(ij.java:59)
>       at org.apache.derby.iapi.tools.run.main(run.java:53)
> Caused by: java.sql.SQLException: Java exception: 'ASSERT FAILED type of 
> inserted column[0] = org.apache.derby.iapi.types.SQLVarchartype of template 
> column[0] = org.apache.derby.iapi.types.CollatorSQLVarchar: 
> org.apache.derby.shared.common.sanity.AssertFailure'.
>       at 
> org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(SQLExceptionFactory.java:42)
>       at 
> org.apache.derby.impl.jdbc.SQLExceptionFactory40.wrapArgsForTransportAcrossDRDA(SQLExceptionFactory40.java:122)
>       at 
> org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(SQLExceptionFactory40.java:71)
>       ... 18 more
> Caused by: org.apache.derby.shared.common.sanity.AssertFailure: ASSERT FAILED 
> type of inserted column[0] = org.apache.derby.iapi.types.SQLVarchartype of 
> template column[0] = org.apache.derby.iapi.types.CollatorSQLVarchar
>       at 
> org.apache.derby.shared.common.sanity.SanityManager.THROWASSERT(SanityManager.java:162)
>       at 
> org.apache.derby.shared.common.sanity.SanityManager.THROWASSERT(SanityManager.java:147)
>       at 
> org.apache.derby.impl.store.access.btree.OpenBTree.isIndexableRowConsistent(OpenBTree.java:515)
>       at 
> org.apache.derby.impl.store.access.btree.BTreeController.doIns(BTreeController.java:679)
>       at 
> org.apache.derby.impl.store.access.btree.BTreeController.insert(BTreeController.java:1374)
>       at 
> org.apache.derby.impl.store.access.btree.index.B2IController.insert(B2IController.java:210)
>       at 
> org.apache.derby.impl.sql.execute.IndexChanger.insertAndCheckDups(IndexChanger.java:440)
>       at 
> org.apache.derby.impl.sql.execute.IndexChanger.doInsert(IndexChanger.java:383)
>       at 
> org.apache.derby.impl.sql.execute.IndexChanger.insert(IndexChanger.java:590)
>       at 
> org.apache.derby.impl.sql.execute.IndexSetChanger.insert(IndexSetChanger.java:268)
>       at 
> org.apache.derby.impl.sql.execute.RowChangerImpl.insertRow(RowChangerImpl.java:453)
>       at 
> org.apache.derby.impl.sql.execute.InsertResultSet.normalInsertCore(InsertResultSet.java:999)
>       at 
> org.apache.derby.impl.sql.execute.InsertResultSet.open(InsertResultSet.java:519)
>       at 
> org.apache.derby.impl.sql.GenericPreparedStatement.executeStmt(GenericPreparedStatement.java:443)
>       at 
> org.apache.derby.impl.sql.GenericPreparedStatement.execute(GenericPreparedStatement.java:324)
>       at 
> org.apache.derby.impl.jdbc.EmbedStatement.executeStatement(EmbedStatement.java:1242)
>       ... 11 more

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to