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


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 is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to