[
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