ResultSetMetaData.getPrecision of a numeric column when no transaction is active throws an SQLException [JDBC464] #503
Submitted by: @mrotteveel
Relate to JDBC465
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
Exception in Jaybird 2.2.x:
org.firebirdsql.jdbc.FBSQLException: GDS Exception. 335544332. invalid transaction handle (expecting explicit transaction start)
Caused by: org.firebirdsql.gds.GDSException: invalid transaction handle (expecting explicit transaction start)
The text was updated successfully, but these errors were encountered:
Commented by: @mrotteveel
Changed implementation so it now will start a transaction if none is present. As part of this change, FBDatabaseMetaData statements are now kept prepared for reuse. This might provide a small performance benefit for applications that use the metadata a lot at the cost of a little more resources (open statement handles).
I have exposed a close method in the FirebirdDatabaseMetaData interface. This close method will close all statements in the database metadata, but keep the database metadata object itself usable. It should not be necessary to call this normally (it is called on connection close), but it is provided just in case.