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