Issue Details (XML | Word | Printable)

Key: JDBC-470
Type: Bug Bug
Status: Closed Closed
Resolution: Fixed
Priority: Major Major
Assignee: Mark Rotteveel
Reporter: Mark Rotteveel
Votes: 0
Watchers: 0
Operations

If you were logged in you would be able to see more operations.
Jaybird JCA/JDBC Driver

CLONE -ResultSetMetaData.getPrecision of a numeric column when no transaction is active throws an SQLException

Created: 24/Dec/16 04:54 PM   Updated: 05/Mar/17 12:59 PM
Component/s: JDBC driver
Affects Version/s: Jaybird 2.2.9, Jaybird 2.2.10, Jaybird 2.2.11, Jaybird 3.0.0-beta-1, Jaybird 3.0.0-beta-2
Fix Version/s: Jaybird 3.0.0-beta-3, Jaybird 3.0.0, Jaybird 2.2.13

Issue Links:
Relate
 


 Description  « Hide
The fix of JDBC-464 didn't fix all cases.

If ResultSetMetaData.getPrecision is called for a numeric or decimal column while no transaction is active (and the method wasn't called earlier when a transaction was active for the same RSMD), then this will fail with an exception.

The cause is that RSMD will execute the query, but as the FBConnection is not accessible in the context, it can only piggyback on an existing transaction instead of starting a new one. We should change this so it can either start a new normal transaction, or start a separate transaction for this metadata query (and commit that asap).

Also investigate if similar problems occur elsewhere (prime candidates are where the constructor FBDatabaseMetaData(GDSHelper gdsHelper) is used instead of FBDatabaseMetaData(AbstractConnection c).

Exception in 3.0 beta 1:

java.sql.SQLNonTransientException: No transaction or transaction not ACTIVE

at org.firebirdsql.gds.ng.TransactionHelper.checkTransactionActive(TransactionHelper.java:49)
at org.firebirdsql.gds.ng.wire.version11.V11Statement.prepare(V11Statement.java:57)
at org.firebirdsql.jdbc.FBStatement.prepareFixedStatement(FBStatement.java:1399)
at org.firebirdsql.jdbc.AbstractPreparedStatement.prepareFixedStatement(AbstractPreparedStatement.java:1229)
at org.firebirdsql.jdbc.AbstractPreparedStatement.<init>(AbstractPreparedStatement.java:147)
at org.firebirdsql.jdbc.FBPreparedStatement.<init>(FBPreparedStatement.java:50)
at org.firebirdsql.jdbc.FBDatabaseMetaData.getStatement(FBDatabaseMetaData.java:5035)
at org.firebirdsql.jdbc.FBDatabaseMetaData.doQuery(FBDatabaseMetaData.java:5061)
at org.firebirdsql.jdbc.FBResultSetMetaData.getExtendedFieldInfo(FBResultSetMetaData.java:506)
at org.firebirdsql.jdbc.AbstractFieldMetaData.getExtFieldInfo(AbstractFieldMetaData.java:342)
at org.firebirdsql.jdbc.AbstractFieldMetaData.getPrecisionInternal(AbstractFieldMetaData.java:280)
at org.firebirdsql.jdbc.FBResultSetMetaData.getPrecision(FBResultSetMetaData.java:281)
at org.firebirdsql.jdbc.TestFBResultSetMetaData.getPrecisionOfNumericColumnWithoutActiveTransaction(TestFBResultSetMetaData.java:305)

Exception in Jaybird 2.2.x:

org.firebirdsql.jdbc.FBSQLException: GDS Exception. 335544332. invalid transaction handle (expecting explicit transaction start)

at org.firebirdsql.jdbc.AbstractPreparedStatement.<init>(AbstractPreparedStatement.java:137)
at org.firebirdsql.jdbc.FBPreparedStatement.<init>(FBPreparedStatement.java:45)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.firebirdsql.jdbc.FBStatementFactory.createPreparedStatement(FBStatementFactory.java:89)
at org.firebirdsql.jdbc.AbstractDatabaseMetaData.getStatement(AbstractDatabaseMetaData.java:6175)
at org.firebirdsql.jdbc.AbstractDatabaseMetaData.doQuery(AbstractDatabaseMetaData.java:6203)
at org.firebirdsql.jdbc.FBResultSetMetaData.getExtendedFieldInfo(FBResultSetMetaData.java:833)
at org.firebirdsql.jdbc.FBResultSetMetaData.getExtFieldInfo(FBResultSetMetaData.java:682)
at org.firebirdsql.jdbc.FBResultSetMetaData.getPrecision(FBResultSetMetaData.java:305)
at org.firebirdsql.jdbc.TestFBResultSetMetaData.getPrecisionOfNumericColumnWithoutActiveTransaction(TestFBResultSetMetaData.java:361)
at ...
Caused by: org.firebirdsql.gds.GDSException: invalid transaction handle (expecting explicit transaction start)
at org.firebirdsql.gds.impl.wire.AbstractJavaGDSImpl.validateHandle(AbstractJavaGDSImpl.java:3246)
at org.firebirdsql.gds.impl.wire.AbstractJavaGDSImpl.iscDsqlPrepare(AbstractJavaGDSImpl.java:1454)
at org.firebirdsql.gds.impl.GDSHelper.prepareStatement(GDSHelper.java:214)
at org.firebirdsql.jdbc.AbstractStatement.prepareFixedStatement(AbstractStatement.java:1388)
at org.firebirdsql.jdbc.AbstractPreparedStatement.prepareFixedStatement(AbstractPreparedStatement.java:1269)
at org.firebirdsql.jdbc.AbstractPreparedStatement.<init>(AbstractPreparedStatement.java:134)
... 41 more

 All   Comments   Change History   Subversion Commits      Sort Order: Ascending order - Click to sort in descending order
Mark Rotteveel added a comment - 24/Dec/16 05:02 PM
The exception could still occur when a connection was in use by another thread when the meta data statement was prepared.

Mark Rotteveel added a comment - 31/Dec/16 09:01 AM - edited
Fixed thread safety issue caused by insufficient synchronization