[
https://issues.apache.org/jira/browse/DERBY-4946?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12972082#action_12972082
]
Rick Hillegas commented on DERBY-4946:
--------------------------------------
Prior to 10.7, the behavior of Derby's BOOLEAN datatype was, frankly, broken.
It was a half datatype. You could not create columns of BOOLEAN type but you
could select columns of BOOLEAN type (from the system tables). From the point
of view of applications wanting to know what kind of data they could INSERT, it
was correct for DatabaseMetaData.getTypeInfo() to omit the BOOLEAN datatype.
However, from the point of view of applications wanting to know what kind of
datatypes they could SELECT, it was wrong for DatabaseMetaData.getTypeInfo() to
omit the BOOLEAN datatype. The full, gory state of the mess is described in the
appendixes of the functional spec attached to DERBY-499.
In short, prior to 10.7, including or omitting BOOLEAN from
DatabaseMetaData.getTypeInfo() would have been correct or incorrect depending
on what your application's needs were. I have no enthusiasm for changing this
output from one wrong answer to another. Conversely, I won't veto your work if
you want to change which wrong answer we give.
Users will not get the right answer until they hard-upgrade to 10.7, the
release which fixes this datatype.
> Derby 10.7 DatabaseMetaData.getTypeInfo() should not return BOOLEAN for a
> soft upgraded database
> ------------------------------------------------------------------------------------------------
>
> Key: DERBY-4946
> URL: https://issues.apache.org/jira/browse/DERBY-4946
> Project: Derby
> Issue Type: Bug
> Components: JDBC
> Affects Versions: 10.7.1.1, 10.8.0.0
> Reporter: Kathey Marsden
> Attachments: UseDBMetaForBool.java
>
>
> Derby 10.7 DatabaseMetaData.getTypeInfo() should not return the BOOLEAN data
> type with a soft upgraded database as often applications use getTypeInfo() to
> determine if tables can be created with this type.
> To reproduce and see the impact of the problem, first create the database
> testdb with 10.6
> ij version 10.6
> ij> connect 'jdbc:derby:testdb;create=true';
> ij>
> run the attached program UseDBMetaForBool with 10.6 and it runs fine.
> $ java UseDBMetaForBool
> getDriverVersion10.6.2.3 - (1026030M)
> supportsBoolean = false Make my table accordingly
> CREATING SMALLINT TABLE SINCE NO BOOLEAN
> getBoolean=true
> getString=1
> Next run the program against 10.7 in soft upgrade mode and it fails with:
> $ java UseDBMetaForBool
> getDriverVersion10.7.1.2 - (1040699M)
> supportsBoolean = true Make my table accordingly
> CREATING BOOLEAN TABLE
> Exception in thread "main" java.sql.SQLException: Use of 'BOOLEAN' requires
> data
> base to be upgraded from version 10.6 to version 10.7 or later.
> at
> org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(SQLE
> xceptionFactory40.java:95)
> at
> org.apache.derby.impl.jdbc.Util.generateCsSQLException(Util.java:256)
> at
> org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException
> (TransactionResourceImpl.java:396)
> at
> org.apache.derby.impl.jdbc.TransactionResourceImpl.handleException(Tr
> ansactionResourceImpl.java:348)
> at
> org.apache.derby.impl.jdbc.EmbedConnection.handleException(EmbedConne
> ction.java:2284)
> at
> org.apache.derby.impl.jdbc.ConnectionChild.handleException(Connection
> Child.java:82)
> at
> org.apache.derby.impl.jdbc.EmbedStatement.execute(EmbedStatement.java
> :616)
> at
> org.apache.derby.impl.jdbc.EmbedStatement.executeUpdate(EmbedStatemen
> t.java:176)
> at UseDBMetaForBool.main(UseDBMetaForBool.java:28)
> Caused by: java.sql.SQLException: Use of 'BOOLEAN' requires database to be
> upgra
> ded from version 10.6 to version 10.7 or later.
> at
> org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(SQLExc
> eptionFactory.java:45)
> at
> org.apache.derby.impl.jdbc.SQLExceptionFactory40.wrapArgsForTransport
> AcrossDRDA(SQLExceptionFactory40.java:119)
> at
> org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(SQLE
> xceptionFactory40.java:70)
> ... 8 more
> Caused by: ERROR XCL47: Use of 'BOOLEAN' requires database to be upgraded
> from v
> ersion 10.6 to version 10.7 or later.
> at
> org.apache.derby.iapi.error.StandardException.newException(StandardEx
> ception.java:343)
> at
> org.apache.derby.impl.sql.catalog.DD_Version.checkVersion(DD_Version.
> java:845)
> at
> org.apache.derby.impl.sql.catalog.DataDictionaryImpl.checkVersion(Dat
> aDictionaryImpl.java:9662)
> at
> org.apache.derby.impl.sql.compile.SQLParser.checkVersion(SQLParser.ja
> va:327)
> at
> org.apache.derby.impl.sql.compile.SQLParser.dataTypeCommon(SQLParser.
> java:3336)
> at
> org.apache.derby.impl.sql.compile.SQLParser.dataTypeDDL(SQLParser.jav
> a:3260)
> at
> org.apache.derby.impl.sql.compile.SQLParser.columnDefinition(SQLParse
> r.java:3125)
> at
> org.apache.derby.impl.sql.compile.SQLParser.tableElement(SQLParser.ja
> va:3090)
> at
> org.apache.derby.impl.sql.compile.SQLParser.tableElementList(SQLParse
> r.java:3061)
> at
> org.apache.derby.impl.sql.compile.SQLParser.tableDefinition(SQLParser
> .java:10204)
> at
> org.apache.derby.impl.sql.compile.SQLParser.createStatements(SQLParse
> r.java:2079)
> at
> org.apache.derby.impl.sql.compile.SQLParser.StatementPart(SQLParser.j
> ava:1974)
> at
> org.apache.derby.impl.sql.compile.SQLParser.Statement(SQLParser.java:
> 1892)
> at
> org.apache.derby.impl.sql.compile.ParserImpl.parseStatement(ParserImp
> l.java:151)
> at
> org.apache.derby.impl.sql.GenericStatement.prepMinion(GenericStatemen
> t.java:282)
> at
> org.apache.derby.impl.sql.GenericStatement.prepare(GenericStatement.j
> ava:90)
> at
> org.apache.derby.impl.sql.conn.GenericLanguageConnectionContext.prepa
> reInternalStatement(GenericLanguageConnectionContext.java:1101)
> at
> org.apache.derby.impl.jdbc.EmbedStatement.execute(EmbedStatement.java
> :607)
> ... 2 more
> Finally, hard upgrade and see it runs again once the upgrade has been
> performed:
> $ java org.apache.derby.tools.ij
> ij version 10.7
> ij> connect 'jdbc:derby:testdb;upgrade=true';
> ij>
> kmars...@ibm-93ae43e63c0 ~/repro/softUpgr
> $ java UseDBMetaForBool
> getDriverVersion10.7.1.2 - (1040699M)
> supportsBoolean = true Make my table accordingly
> CREATING BOOLEAN TABLE
> getBoolean=true
> getString=true
> The application should run in soft upgrade mode and
> DatabaseMetaData.getTypeInfo() should not return the BOOLEAN type in soft
> upgrade before it is available to use.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.