persistence@glassfish.java.net

Re: Some tests in JUnitEJBQLDateTimeTestSuite failed on Oracle

From: Michael Bouschen <Michael.Bouschen_at_Sun.COM>
Date: Mon, 18 Dec 2006 12:08:46 +0100

Hi Wonseok,

I tried to reproduce the error, but the date tests succeed on my side.

However, the specific version of the oracle database server and the jdbc
driver matters! I see two ddl test errors
(testDDLUniqueKeysAsJoinColumns and
testDDLSubclassEmbeddedIdPkColumnsInJoinedStrategy) when running on an
oracle database 9.2.0.7.0 and an oracle JDBC driver 9.0.2.0.0. A SQL
INSERT statement on table DDL_CKENTB fails: ORA-01438: value larger than
specified precision allows for this column.

I also tried different combinations of oracle database server and jdbc
driver, but they all succeed:
- 9.2.0.7.0 database server with 10.2.0.1.0XE jdbc driver
- 10XE (10.2.0.1.0) database server and 9.0.2.0.0 jdbc driver
- 10XE (10.2.0.1.0) database server and 10.2.0.1.0XE jdbc driver

In case you are interested, you find the output of the failing ddl tests
below.

Regards Michael

> Hi All,
> When I try to run entity-persistence-tests on Oracle (9i, 10XE with
> 10.1.0.2.0 driver), some tests related to Date type failed as follows.
> Select query doesn't fetch the expected row.
>
> [TEST LOGS]
> Testcase: testSqlDate took 0.004 sec
> FAILED
> There should be one result
> junit.framework.AssertionFailedError: There should be one result
> at
> oracle.toplink.essentials.testing.tests.ejb.ejbqltesting.JUnitEJBQLDateTimeTestSuite.testSqlDate
> (JUnitEJBQLDateTimeTestSuite.java:50)
> at junit.extensions.TestDecorator.basicRun(TestDecorator.java:22)
> at junit.extensions.TestSetup$1.protect(TestSetup.java:19)
> at junit.extensions.TestSetup.run(TestSetup.java :23)
>
> Testcase: testSqlDateToTS took 0.003 sec
> FAILED
> There should be one result
> junit.framework.AssertionFailedError: There should be one result
> at
> oracle.toplink.essentials.testing.tests.ejb.ejbqltesting.JUnitEJBQLDateTimeTestSuite.testSqlDateToTS
> (JUnitEJBQLDateTimeTestSuite.java:62)
> at junit.extensions.TestDecorator.basicRun(TestDecorator.java:22)
> at junit.extensions.TestSetup$1.protect(TestSetup.java:19)
> at junit.extensions.TestSetup.run(TestSetup.java :23)
>
> Testcase: testSqlDateWithCal took 0.005 sec
> FAILED
> There should be one result
> junit.framework.AssertionFailedError: There should be one result
> at
> oracle.toplink.essentials.testing.tests.ejb.ejbqltesting.JUnitEJBQLDateTimeTestSuite.testSqlDateWithCal
> (JUnitEJBQLDateTimeTestSuite.java:158)
> at junit.extensions.TestDecorator.basicRun(TestDecorator.java:22)
> at junit.extensions.TestSetup$1.protect(TestSetup.java:19)
> at junit.extensions.TestSetup.run(TestSetup.java :23)
>
> [TOPLINK LOGS]
> [TopLink Fine]:
> ClientSession(11555382)--Connection(14898956)--Thread(Thread[main,5,main])--INSERT
> INTO CMP3_DATE_TIME (DT_ID, SQL_DATE, SQL_TIME, SQL_TS, UTIL_DATE,
> CAL) VALUES (?, ?, ?, ?, ?, ?)
> bind => [304, 1901-12-31, 23:59:59, 1901-12-31 23:59:59.999,
> 1901-12-31 23:59:59.999, 1901-12-31 23:59:59.999]
> ...
> [TopLink Fine]:
> ServerSession(22971385)--Connection(18388366)--Thread(Thread[main,5,main])--SELECT
> DT_ID, SQL_DATE, SQL_TIME, SQL_TS, UTIL_DATE, CAL FROM CMP3_DATE_TIME
> WHERE (SQL_DATE = ?)
> bind => [1901-12-31]
>
> [DATABASE ROW]
> DT_ID SQL_DATE SQL_TIME SQL_TS UTIL_DATE CAL
> ---------------------------------------------------------------------------
>
> 304 01-JAN-02 01-JAN-70 11.59.59.000000
> <http://11.59.59.000000> PM 01-JAN-02 12.00.00.999000 AM
> 01-JAN-02 12.00.00.999000 AM 01-JAN-02 12.00.00.999000 AM
>
> I'm curious why '1902-01-01' is inserted instead of '1901-12-31' in
> columns (rounding off?).
> Is this known issue?
>
> Cheers,
> -Wonseok
>




Testcase: testDDLUniqueKeysAsJoinColumns took 0,015 sec
        Caused an ERROR
Exception [TOPLINK-4002] (Oracle TopLink Essentials - 9.1 (Build local)): oracle.toplink.essentials.exceptions.DatabaseException
Internal Exception: java.sql.SQLException: ORA-01438: value larger than specified precision allows for this column
Error Code: 1438
Call:INSERT INTO DDL_CKENTB (UNQ2, UNQ1, SEQ, CODE, DTYPE) VALUES (?, ?, ?, ?, ?)
        bind => [u0002, u0001, 1166437453906, B1209, CKeyEntityB]
Query:InsertObjectQuery(oracle.toplink.essentials.testing.models.cmp3.ddlgeneration.CKeyEntityB_at_903e)
javax.persistence.RollbackException: Exception [TOPLINK-4002] (Oracle TopLink Essentials - 9.1 (Build local)): oracle.toplink.essentials.exceptions.DatabaseException
Internal Exception: java.sql.SQLException: ORA-01438: value larger than specified precision allows for this column
Error Code: 1438
Call:INSERT INTO DDL_CKENTB (UNQ2, UNQ1, SEQ, CODE, DTYPE) VALUES (?, ?, ?, ?, ?)
        bind => [u0002, u0001, 1166437453906, B1209, CKeyEntityB]
Query:InsertObjectQuery(oracle.toplink.essentials.testing.models.cmp3.ddlgeneration.CKeyEntityB_at_903e)
        at oracle.toplink.essentials.internal.ejb.cmp3.transaction.base.EntityTransactionImpl.commit(EntityTransactionImpl.java:106)
        at oracle.toplink.essentials.internal.ejb.cmp3.transaction.EntityTransactionImpl.commit(EntityTransactionImpl.java:45)
        at oracle.toplink.essentials.testing.tests.cmp3.ddlgeneration.DDLGenerationJUnitTestSuite.testDDLUniqueKeysAsJoinColumns(DDLGenerationJUnitTestSuite.java:108)
        at junit.extensions.TestDecorator.basicRun(TestDecorator.java:22)
        at junit.extensions.TestSetup$1.protect(TestSetup.java:19)
        at junit.extensions.TestSetup.run(TestSetup.java:23)
Caused by: Exception [TOPLINK-4002] (Oracle TopLink Essentials - 9.1 (Build local)): oracle.toplink.essentials.exceptions.DatabaseException
Internal Exception: java.sql.SQLException: ORA-01438: value larger than specified precision allows for this column
Error Code: 1438
Call:INSERT INTO DDL_CKENTB (UNQ2, UNQ1, SEQ, CODE, DTYPE) VALUES (?, ?, ?, ?, ?)
        bind => [u0002, u0001, 1166437453906, B1209, CKeyEntityB]
Query:InsertObjectQuery(oracle.toplink.essentials.testing.models.cmp3.ddlgeneration.CKeyEntityB_at_903e)
        at oracle.toplink.essentials.exceptions.DatabaseException.sqlException(DatabaseException.java:295)
        at oracle.toplink.essentials.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java:639)
        at oracle.toplink.essentials.internal.databaseaccess.DatabaseAccessor.executeNoSelect(DatabaseAccessor.java:688)
        at oracle.toplink.essentials.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:477)
        at oracle.toplink.essentials.internal.databaseaccess.DatabaseAccessor.executeCall(DatabaseAccessor.java:437)
        at oracle.toplink.essentials.internal.sessions.AbstractSession.executeCall(AbstractSession.java:675)
        at oracle.toplink.essentials.internal.queryframework.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:213)
        at oracle.toplink.essentials.internal.queryframework.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:199)
        at oracle.toplink.essentials.internal.queryframework.DatasourceCallQueryMechanism.insertObject(DatasourceCallQueryMechanism.java:331)
        at oracle.toplink.essentials.internal.queryframework.StatementQueryMechanism.insertObject(StatementQueryMechanism.java:176)
        at oracle.toplink.essentials.internal.queryframework.StatementQueryMechanism.insertObject(StatementQueryMechanism.java:190)
        at oracle.toplink.essentials.internal.queryframework.DatabaseQueryMechanism.insertObjectForWrite(DatabaseQueryMechanism.java:457)
        at oracle.toplink.essentials.queryframework.InsertObjectQuery.executeCommit(InsertObjectQuery.java:74)
        at oracle.toplink.essentials.internal.queryframework.DatabaseQueryMechanism.performUserDefinedWrite(DatabaseQueryMechanism.java:635)
        at oracle.toplink.essentials.internal.queryframework.DatabaseQueryMechanism.performUserDefinedInsert(DatabaseQueryMechanism.java:599)
        at oracle.toplink.essentials.internal.queryframework.DatabaseQueryMechanism.insertObjectForWriteWithChangeSet(DatabaseQueryMechanism.java:495)
        at oracle.toplink.essentials.queryframework.WriteObjectQuery.executeCommitWithChangeSet(WriteObjectQuery.java:130)
        at oracle.toplink.essentials.internal.queryframework.DatabaseQueryMechanism.executeWriteWithChangeSet(DatabaseQueryMechanism.java:283)
        at oracle.toplink.essentials.queryframework.WriteObjectQuery.executeDatabaseQuery(WriteObjectQuery.java:67)
        at oracle.toplink.essentials.queryframework.DatabaseQuery.execute(DatabaseQuery.java:609)
        at oracle.toplink.essentials.queryframework.DatabaseQuery.executeInUnitOfWork(DatabaseQuery.java:536)
        at oracle.toplink.essentials.queryframework.ObjectLevelModifyQuery.executeInUnitOfWorkObjectLevelModifyQuery(ObjectLevelModifyQuery.java:123)
        at oracle.toplink.essentials.queryframework.ObjectLevelModifyQuery.executeInUnitOfWork(ObjectLevelModifyQuery.java:95)
        at oracle.toplink.essentials.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2219)
        at oracle.toplink.essentials.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:937)
        at oracle.toplink.essentials.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:894)
        at oracle.toplink.essentials.internal.sessions.CommitManager.commitNewObjectsForClassWithChangeSet(CommitManager.java:254)
        at oracle.toplink.essentials.internal.sessions.CommitManager.commitAllObjectsForClassWithChangeSet(CommitManager.java:231)
        at oracle.toplink.essentials.internal.sessions.CommitManager.commitAllObjectsWithChangeSet(CommitManager.java:187)
        at oracle.toplink.essentials.internal.sessions.AbstractSession.writeAllObjectsWithChangeSet(AbstractSession.java:2638)
        at oracle.toplink.essentials.internal.sessions.UnitOfWorkImpl.commitToDatabase(UnitOfWorkImpl.java:1030)
        at oracle.toplink.essentials.internal.ejb.cmp3.base.RepeatableWriteUnitOfWork.commitToDatabase(RepeatableWriteUnitOfWork.java:357)
        at oracle.toplink.essentials.internal.sessions.UnitOfWorkImpl.commitToDatabaseWithChangeSet(UnitOfWorkImpl.java:1112)
        at oracle.toplink.essentials.internal.ejb.cmp3.base.RepeatableWriteUnitOfWork.commitRootUnitOfWork(RepeatableWriteUnitOfWork.java:82)
        at oracle.toplink.essentials.internal.sessions.UnitOfWorkImpl.commitAndResume(UnitOfWorkImpl.java:842)
        at oracle.toplink.essentials.internal.ejb.cmp3.transaction.base.EntityTransactionImpl.commit(EntityTransactionImpl.java:87)
        ... 23 more
Caused by: java.sql.SQLException: ORA-01438: value larger than specified precision allows for this column

        at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
        at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:289)
        at oracle.jdbc.ttc7.Oall7.receive(Oall7.java:582)
        at oracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7Protocol.java:1983)
        at oracle.jdbc.ttc7.TTC7Protocol.parseExecuteFetch(TTC7Protocol.java:1141)
        at oracle.jdbc.driver.OracleStatement.executeNonQuery(OracleStatement.java:2149)
        at oracle.jdbc.driver.OracleStatement.doExecuteOther(OracleStatement.java:2032)
        at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:2894)
        at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:608)
        at oracle.toplink.essentials.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java:632)
        ... 57 more



Testcase: testDDLSubclassEmbeddedIdPkColumnsInJoinedStrategy took 0 sec
        Caused an ERROR
Exception [TOPLINK-4002] (Oracle TopLink Essentials - 9.1 (Build local)): oracle.toplink.essentials.exceptions.DatabaseException
Internal Exception: java.sql.SQLException: ORA-01438: value larger than specified precision allows for this column
Error Code: 1438
Call:INSERT INTO DDL_CKENTB (UNQ2, UNQ1, SEQ, CODE, DTYPE) VALUES (?, ?, ?, ?, ?)
        bind => [1166437453984, 1166437453984, 1166437453984, B1215, CKeyEntityB2]
Query:InsertObjectQuery(oracle.toplink.essentials.testing.models.cmp3.ddlgeneration.CKeyEntityB2_at_ae5)
javax.persistence.PersistenceException: Exception [TOPLINK-4002] (Oracle TopLink Essentials - 9.1 (Build local)): oracle.toplink.essentials.exceptions.DatabaseException
Internal Exception: java.sql.SQLException: ORA-01438: value larger than specified precision allows for this column
Error Code: 1438
Call:INSERT INTO DDL_CKENTB (UNQ2, UNQ1, SEQ, CODE, DTYPE) VALUES (?, ?, ?, ?, ?)
        bind => [1166437453984, 1166437453984, 1166437453984, B1215, CKeyEntityB2]
Query:InsertObjectQuery(oracle.toplink.essentials.testing.models.cmp3.ddlgeneration.CKeyEntityB2_at_ae5)
        at oracle.toplink.essentials.internal.ejb.cmp3.base.EntityManagerImpl.flush(EntityManagerImpl.java:340)
        at oracle.toplink.essentials.testing.tests.cmp3.ddlgeneration.DDLGenerationJUnitTestSuite.testDDLSubclassEmbeddedIdPkColumnsInJoinedStrategy(DDLGenerationJUnitTestSuite.java:361)
        at junit.extensions.TestDecorator.basicRun(TestDecorator.java:22)
        at junit.extensions.TestSetup$1.protect(TestSetup.java:19)
        at junit.extensions.TestSetup.run(TestSetup.java:23)
Caused by: Exception [TOPLINK-4002] (Oracle TopLink Essentials - 9.1 (Build local)): oracle.toplink.essentials.exceptions.DatabaseException
Internal Exception: java.sql.SQLException: ORA-01438: value larger than specified precision allows for this column
Error Code: 1438
Call:INSERT INTO DDL_CKENTB (UNQ2, UNQ1, SEQ, CODE, DTYPE) VALUES (?, ?, ?, ?, ?)
        bind => [1166437453984, 1166437453984, 1166437453984, B1215, CKeyEntityB2]
Query:InsertObjectQuery(oracle.toplink.essentials.testing.models.cmp3.ddlgeneration.CKeyEntityB2_at_ae5)
        at oracle.toplink.essentials.exceptions.DatabaseException.sqlException(DatabaseException.java:295)
        at oracle.toplink.essentials.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java:639)
        at oracle.toplink.essentials.internal.databaseaccess.DatabaseAccessor.executeNoSelect(DatabaseAccessor.java:688)
        at oracle.toplink.essentials.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:477)
        at oracle.toplink.essentials.internal.databaseaccess.DatabaseAccessor.executeCall(DatabaseAccessor.java:437)
        at oracle.toplink.essentials.internal.sessions.AbstractSession.executeCall(AbstractSession.java:675)
        at oracle.toplink.essentials.internal.queryframework.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:213)
        at oracle.toplink.essentials.internal.queryframework.DatasourceCallQueryMechanism.insertObject(DatasourceCallQueryMechanism.java:322)
        at oracle.toplink.essentials.internal.queryframework.StatementQueryMechanism.insertObject(StatementQueryMechanism.java:176)
        at oracle.toplink.essentials.internal.queryframework.StatementQueryMechanism.insertObject(StatementQueryMechanism.java:190)
        at oracle.toplink.essentials.internal.queryframework.DatabaseQueryMechanism.insertObjectForWrite(DatabaseQueryMechanism.java:457)
        at oracle.toplink.essentials.queryframework.InsertObjectQuery.executeCommit(InsertObjectQuery.java:74)
        at oracle.toplink.essentials.internal.queryframework.DatabaseQueryMechanism.performUserDefinedWrite(DatabaseQueryMechanism.java:635)
        at oracle.toplink.essentials.internal.queryframework.DatabaseQueryMechanism.performUserDefinedInsert(DatabaseQueryMechanism.java:599)
        at oracle.toplink.essentials.internal.queryframework.DatabaseQueryMechanism.insertObjectForWriteWithChangeSet(DatabaseQueryMechanism.java:495)
        at oracle.toplink.essentials.queryframework.WriteObjectQuery.executeCommitWithChangeSet(WriteObjectQuery.java:130)
        at oracle.toplink.essentials.internal.queryframework.DatabaseQueryMechanism.executeWriteWithChangeSet(DatabaseQueryMechanism.java:283)
        at oracle.toplink.essentials.queryframework.WriteObjectQuery.executeDatabaseQuery(WriteObjectQuery.java:67)
        at oracle.toplink.essentials.queryframework.DatabaseQuery.execute(DatabaseQuery.java:609)
        at oracle.toplink.essentials.queryframework.DatabaseQuery.executeInUnitOfWork(DatabaseQuery.java:536)
        at oracle.toplink.essentials.queryframework.ObjectLevelModifyQuery.executeInUnitOfWorkObjectLevelModifyQuery(ObjectLevelModifyQuery.java:123)
        at oracle.toplink.essentials.queryframework.ObjectLevelModifyQuery.executeInUnitOfWork(ObjectLevelModifyQuery.java:95)
        at oracle.toplink.essentials.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2219)
        at oracle.toplink.essentials.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:937)
        at oracle.toplink.essentials.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:894)
        at oracle.toplink.essentials.internal.sessions.CommitManager.commitNewObjectsForClassWithChangeSet(CommitManager.java:254)
        at oracle.toplink.essentials.internal.sessions.CommitManager.commitAllObjectsWithChangeSet(CommitManager.java:175)
        at oracle.toplink.essentials.internal.sessions.AbstractSession.writeAllObjectsWithChangeSet(AbstractSession.java:2638)
        at oracle.toplink.essentials.internal.sessions.UnitOfWorkImpl.commitToDatabase(UnitOfWorkImpl.java:1030)
        at oracle.toplink.essentials.internal.ejb.cmp3.base.RepeatableWriteUnitOfWork.commitToDatabase(RepeatableWriteUnitOfWork.java:357)
        at oracle.toplink.essentials.internal.sessions.UnitOfWorkImpl.commitToDatabaseWithPreBuiltChangeSet(UnitOfWorkImpl.java:1146)
        at oracle.toplink.essentials.internal.ejb.cmp3.base.RepeatableWriteUnitOfWork.writeChanges(RepeatableWriteUnitOfWork.java:235)
        at oracle.toplink.essentials.internal.ejb.cmp3.base.EntityManagerImpl.flush(EntityManagerImpl.java:337)
        ... 22 more
Caused by: java.sql.SQLException: ORA-01438: value larger than specified precision allows for this column

        at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
        at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:289)
        at oracle.jdbc.ttc7.Oall7.receive(Oall7.java:582)
        at oracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7Protocol.java:1983)
        at oracle.jdbc.ttc7.TTC7Protocol.parseExecuteFetch(TTC7Protocol.java:1141)
        at oracle.jdbc.driver.OracleStatement.executeNonQuery(OracleStatement.java:2149)
        at oracle.jdbc.driver.OracleStatement.doExecuteOther(OracleStatement.java:2032)
        at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:2894)
        at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:608)
        at oracle.toplink.essentials.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java:632)
        ... 53 more