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

Richard Zowalla resolved OPENJPA-608.
-------------------------------------
    Resolution: Won't Fix

Closing as obsolete during backlog cleanup: SQLFactoryImpl.newUnion always 
returns LogicalUnion, whose isUnion() is false (LogicalUnion.java:113), and 
DBDictionary.getPlaceholderValueString has no callers left. The only UNION SQL 
on master comes from user-written JPQL set operators 
(SelectImpl.addSetOperatorSQL). Please reopen if this still happens with 
OpenJPA 4.x.

> Select Union queries generated to fetch data from all subclasses fails if 
> there is a CLOB field defined in a descending class on Oracle and Sybase
> --------------------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: OPENJPA-608
>                 URL: https://issues.apache.org/jira/browse/OPENJPA-608
>             Project: OpenJPA
>          Issue Type: Bug
>          Components: jdbc
>    Affects Versions: 1.1.0
>         Environment: $ java org.apache.openjpa.conf.OpenJPAVersion
> OpenJPA 1.1.0
> version id: openjpa-1.1.0-r422266:656510
> Apache svn revision: 422266:656510
> os.name: Windows XP
> os.version: 5.1
> os.arch: x86
> java.version: 1.6.0_05
> java.vendor: BEA Systems, Inc.
>            Reporter: Sandeep Shrivastava
>            Priority: Major
>         Attachments: OPENJPA-608.patch
>
>   Original Estimate: 24h
>  Remaining Estimate: 24h
>
> Consiider the following entity classes with the given fields. 
> public class PlaceholderTypesA {
>     private int intA;
> }
> public class PlaceholderTypesB extends PlaceholderTypesA {
>     private boolean booleanB;
>     private byte byteB;
>     private char charB;
>     private float floatB;
>     private int intB;
>     private String stringB;
>     private String clobB;
>     private Object blobB;
> }
> The following code:
>             org.apache.openjpa.kernel.Extent extent = 
> broker.newExtent(PlaceholderTypesA.class,  true);
>             List list = extent.list();
> generates a SELECT UNION query like:
> SELECT 0, t0.ID, t0.TYP, t0.VERSN, t0.INTA, NULL, 0, 0, 0, '', 0.0, 0, '' 
> FROM PLACEHOLDERTYPESA t0 
> UNION ALL 
> SELECT 1, t0.ID, '', t0.VERSN, t0.INTA, t0.BLOBB, t0.BOOLEANB, t0.BYTEB, 
> t0.CHARB, t0.CLOBB, t0.FLOATB, t0.INTB, t0.STRINGB 
> FROM PLACEHOLDERTYPESB t0 
> Notice that the placeholder value for the CLOBB field is an empty string ''
> This fails on both Oracle and Sybase as the jdbc drivers for these databases 
> do not do any implicit conversion but instead throw an exception.
> testlogic] java.sql.SQLSyntaxErrorException: ORA-01790: expression must have 
> same datatype as corresponding expression
> [testlogic]   at 
> oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:91)
> [testlogic]   at 
> oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:112)
> [testlogic]   at 
> oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:173)
> [testlogic]   at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:455)
> [testlogic]   at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:413)
> [testlogic]   at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:1030)
> [testlogic]   at 
> oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:194)
> [testlogic]   at 
> oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:785)
> [testlogic]   at 
> oracle.jdbc.driver.T4CPreparedStatement.executeMaybeDescribe(T4CPreparedStatement.java:860)
> [testlogic]   at 
> oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1186)
> [testlogic]   at 
> oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3381)
> [testlogic]   at 
> oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3425)
> [testlogic]   at 
> oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1490)
> [testlogic]   at 
> org.apache.openjpa.lib.jdbc.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:264)
> [testlogic]   at 
> org.apache.openjpa.lib.jdbc.JDBCEventConnectionDecorator$EventPreparedStatement.executeQuery(JDBCEventConnectionDecorator.java:237)
> [testlogic]   at 
> org.apache.openjpa.lib.jdbc.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:262)
> [testlogic]   at 
> org.apache.openjpa.jdbc.kernel.JDBCStoreManager$CancelPreparedStatement.executeQuery(JDBCStoreManager.java:1407)
> [testlogic]   at 
> org.apache.openjpa.lib.jdbc.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:252)
> [testlogic]   at kodo.jdbc.sql.TrueUnion.execute(TrueUnion.java:193)
> [testlogic]   at kodo.jdbc.sql.TrueUnion.execute(TrueUnion.java:170)
> [testlogic]   at 
> org.apache.openjpa.jdbc.sql.LogicalUnion.execute(LogicalUnion.java:208)
> [testlogic]   at 
> org.apache.openjpa.jdbc.kernel.SelectResultObjectProvider.open(SelectResultObjectProvider.java:94)
> [testlogic]   at 
> org.apache.openjpa.lib.rop.ResultObjectProviderIterator.hasNext(ResultObjectProviderIterator.java:69)
> [testlogic]   at 
> org.apache.commons.collections.iterators.IteratorChain.updateCurrentIterator(IteratorChain.java:233)
> [testlogic]   at 
> org.apache.commons.collections.iterators.IteratorChain.hasNext(IteratorChain.java:247)
> [testlogic]   at 
> org.apache.openjpa.kernel.ExtentImpl$CloseableIteratorChain.hasNext(ExtentImpl.java:238)
> [testlogic]   at 
> org.apache.commons.collections.iterators.FilterIterator.setNextObject(FilterIterator.java:182)
> [testlogic]   at 
> org.apache.commons.collections.iterators.FilterIterator.hasNext(FilterIterator.java:93)
> [testlogic]   at 
> org.apache.openjpa.kernel.ExtentImpl$FilterDeletedIterator.hasNext(ExtentImpl.java:288)
> [testlogic]   at 
> org.apache.openjpa.kernel.ExtentImpl.list(ExtentImpl.java:102)
> [testlogic]   at kodo.test.KodoTestCase.deleteAll(KodoTestCase.java:441)
> [testlogic]   at kodo.test.KodoTestCase.deleteAll(KodoTestCase.java:397)
> [testlogic]   at 
> kodo.jdbc.meta.tableperclass.TestUnionPlaceholderTypes.testUnion(TestUnionPlaceholderTypes.java:28)
> [testlogic]   at sun.reflect.GeneratedMethodAccessor206.invoke(Unknown Source)
> On sybase,
> [testlogic] 16535  WARN   [jdo.jdbcR2.suite.testjdbcstandalone (Main 
> Thread_19)] openjpa.MetaData - OpenJPA cannot map field 
> 'kodo.jdbc.meta.tableperclass.PlaceholderTypesB.blobB' efficiently.  It is of 
> an unsupported type. The field value will be serialized to a BLOB by default.
> [testlogic] com.sybase.jdbc3.jdbc.SybSQLException: Implicit conversion from 
> datatype 'TEXT' to 'VARCHAR' is not allowed.  Use the CONVERT function to run 
> this query.
> [testlogic]   at com.sybase.jdbc3.tds.Tds.a(Unknown Source)
> [testlogic]   at com.sybase.jdbc3.tds.Tds.nextResult(Unknown Source)
> [testlogic]   at com.sybase.jdbc3.jdbc.ResultGetter.nextResult(Unknown Source)
> [testlogic]   at com.sybase.jdbc3.jdbc.SybStatement.nextResult(Unknown Source)
> [testlogic]   at com.sybase.jdbc3.jdbc.SybStatement.nextResult(Unknown Source)
> [testlogic]   at com.sybase.jdbc3.jdbc.SybStatement.queryLoop(Unknown Source)
> [testlogic]   at com.sybase.jdbc3.jdbc.SybStatement.executeQuery(Unknown 
> Source)
> [testlogic]   at 
> com.sybase.jdbc3.jdbc.SybPreparedStatement.executeQuery(Unknown Source)
> [testlogic]   at 
> org.apache.openjpa.lib.jdbc.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:264)
> [testlogic]   at 
> com.solarmetric.jdbc.PoolConnection$PoolPreparedStatement.executeQuery(PoolConnection.java:260)
> [testlogic]   at 
> org.apache.openjpa.lib.jdbc.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:262)
> [testlogic]   at 
> org.apache.openjpa.lib.jdbc.JDBCEventConnectionDecorator$EventPreparedStatement.executeQuery(JDBCEventConnectionDecorator.java:237)
> [testlogic]   at 
> org.apache.openjpa.lib.jdbc.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:262)
> [testlogic]   at 
> org.apache.openjpa.lib.jdbc.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:262)
> [testlogic]   at 
> org.apache.openjpa.jdbc.kernel.JDBCStoreManager$CancelPreparedStatement.executeQuery(JDBCStoreManager.java:1407)
> [testlogic]   at 
> org.apache.openjpa.lib.jdbc.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:252)
> [testlogic]   at kodo.jdbc.sql.TrueUnion.execute(TrueUnion.java:193)
> [testlogic]   at kodo.jdbc.sql.TrueUnion.execute(TrueUnion.java:170)



--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

Reply via email to