-
Notifications
You must be signed in to change notification settings - Fork 19
JDBC status
- Contents
-
JDBC Status
- Summary
- Driver type
- JDBC acceptance criteria
-
API support
-
java.sqlpackagejava.sql.Arrayinterface (optional)java.sql.Blobinterface (optional)java.sql.CallableStatementinterface (optional)java.sql.Clobinterface (optional)java.sql.Connectioninterfacejava.sql.DatabaseMetaDatainterfacejava.sql.Driverinterfacejava.sql.DriverActioninterface (optional)java.sql.NClobinterface (optional)java.sql.ParameterMetaDatainterfacejava.sql.PreparedStatementinterfacejava.sql.Refinterface (optional)java.sql.ResultSetinterfacejava.sql.ResultSetMetaDatainterfacejava.sql.RowIdinterface (optional)java.sql.Savepointinterface (optional)java.sql.SQLInputinterface (optional)java.sql.SQLOutputinterface (optional)java.sql.SQLXMLinterface (optional)java.sql.Statementinterfacejava.sql.Structinterface (optional)java.sql.Wrapperinterface
-
javax.sqlpackage (optional)
-
- Data model
- Links
- Notes
The following things are known to have issues or are not supported yet:
- Date/time values are broken in tarantool.
- BLOBs are broken in tarantool.
- Large INTEGER values cannot be inserted (broken in tarantool too).
- No callable / prepared callable statements.
- No escape syntax support.
- No batch execution.
- 75% of provided metainfo is incorrect or not verified.
This is not an exhaustive list.
The connector is Type-4-driver written in pure Java,
and uses a native network protocol to communicate with
Tarantool server.
See also:
- Chapter 9.1 in JDBC spec.
- Tarantool SQL Protocol.
Here is a potential list of software to test JDBC completeness coverage level:
Web apps:
Libraries / Frameworks:
Dev apps / Clients:
NOTE: * optional interface, but if it's implemented then the implementation must support all methods required.
| Interface | Required | Supported | Covered | Details |
|---|---|---|---|---|
| Array* | 11/11 | 0/11 | 0/11 | #65; blocked |
| Blob* | 11/11 | 0/11 | 0/11 | #67 |
| CallableStatement* | 25/121 | 0/25 + 0/96 | 0/25 + 0/96 | #64 |
| Clob* | 13/13 | 0/13 | 0/13 | #66; blocked |
| Connection | 32/52 | 19/32 + 2/20 | 12/32 + 2/20 | |
| DatabaseMetaData | 176/176 | 52/176 | 20/176 | |
| Driver | 7/8 | 7/7 + 0/1 | 4/7 + 0/1 | |
| DriverAction* | 1/1 | 0/1 | 0/1 | #174 |
| NClob* | 13/13 | 0/13 | 0/13 | #68; blocked |
| ParameterMetaData | 9/9 | 0/9 | 0/9 | #173 |
| PreparedStatement | 34/58 | 27/34 + 4/24 | 12/34 + 0/24 | |
| Ref* | 4/4 | 0/4 | 0/4 | |
| ResultSet | 56/193 | 47/56 + 17/137 | 16/56 + 13/137 | |
| ResultSetMetaData | 21/21 | 3/21 | 3/21 | |
| RowId* | 4/4 | 0/4 | 0/4 | |
| Savepoint* | 2/2 | 0/2 | 0/2 | ; blocked |
| SQLInput* | 19/28 | 0/19 + 0/9 | 0/19 + 0/9 | |
| SQLOutput* | 18/28 | 0/18 + 0/10 | 0/18 + 0/10 | |
| SQLXML* | 9/9 | 0/9 | 0/9 | #69; blocked |
| Statement | 37/50 | 17/37 + 0/13 | 12/38 + 0/13 | |
| Struct* | 3/3 | 0/3 | 0/3 | #70; blocked |
| Wrapper | 14/18 | 12/16 + 0/2 | 12/16 + 0/2 | #175 |
NOTE: All methods on the
Arrayinterface must be fully implemented if the JDBC driver supports the data type.
| Method | Required? | Supported? | Covered? | Details |
|---|---|---|---|---|
| free() | Yes | No | No | |
| getArray() | Yes | No | No | |
| getArray(Map<String,Class<?>>) | Yes | No | No | |
| getArray(long, int) | Yes | No | No | |
| getArray(long, int, Map<String,Class<?>>) | Yes | No | No | |
| getBaseType() | Yes | No | No | |
| getBaseTypeName() | Yes | No | No | |
| getResultSet() | Yes | No | No | |
| getResultSet(Map<String,Class<?>>) | Yes | No | No | |
| getResultSet(long, int) | Yes | No | No | |
| getResultSet(long, int, Map<String,Class<?>>) | Yes | No | No |
NOTE: All methods on the
Blobinterface must be fully implemented if the JDBC driver supports the data type.
| Method | Required? | Supported? | Covered? | Details |
|---|---|---|---|---|
| free() | Yes | No | No | No |
| getBinaryStream() | Yes | No | No | No |
| getBinaryStream(long, long) | Yes | No | No | No |
| getBytes(long, int) | Yes | No | No | No |
| length() | Yes | No | No | No |
| position(Blob, long) | Yes | No | No | No |
| position(byte[], long) | Yes | No | No | No |
| setBinaryStream(long) | Yes | No | No | No |
| setBytes(long, byte[]) | Yes | No | No | No |
| setBytes(long, byte[], int, int) | Yes | No | No | No |
| truncate(long) | Yes | No | No | No |
NOTE: It must implement the
CallableStatementinterface if the methodDatabaseMetaData.supportsStoredProcedures()returnstrue
NOTE: * is not required to implement the methods unless the driver supports the associated data type.
| Method | Required? | Supported? | Covered? | Details |
|---|---|---|---|---|
| getArray(String) | No* | No | No | |
| getArray(int) | No* | No | No | |
| getBigDecimal(String) | No | No | No | |
| getBigDecimal(int) | Yes | No | No | |
| getBigDecimal(int, int) | No | No | No | |
| getBlob(String) | No* | No | No | |
| getBlob(int) | No* | No | No | |
| getBoolean(String) | No | No | No | |
| getBoolean(int) | Yes | No | No | |
| getByte(String) | No | No | No | |
| getByte(int) | Yes | No | No | |
| getBytes(String) | No | No | No | |
| getBytes(int) | Yes | No | No | |
| getCharacterStream(String) | No | No | No | |
| getCharacterStream(int) | Yes | No | No | |
| getClob(String) | No* | No | No | |
| getClob(int) | No* | No | No | |
| getDate(String) | No | No | No | |
| getDate(String, Calendar) | No | No | No | |
| getDate(int) | Yes | No | No | |
| getDate(int, Calendar) | Yes | No | No | |
| getDouble(String) | No | No | No | |
| getDouble(int) | Yes | No | No | |
| getFloat(String) | No | No | No | |
| getFloat(int) | Yes | No | No | |
| getInt(String) | No | No | No | |
| getInt(int) | Yes | No | No | |
| getLong(String) | No | No | No | |
| getLong(int) | Yes | No | No | |
| getNCharacterStream(String) | No* | No | No | |
| getNCharacterStream(int) | No* | No | No | |
| getNClob(String) | No* | No | No | |
| getNClob(int) | No* | No | No | |
| getNString(String) | No* | No | No | |
| getNString(int) | No* | No | No | |
| getObject(String) | No | No | No | |
| getObject(String, Class) | No | No | No | |
| getObject(String, Map<String,Class<?>>) | No | No | No | |
| getObject(int) | Yes | No | No | |
| getObject(int, Class) | No | No | No | |
| getObject(int, Map<String,Class<?>>) | No* | No | No | |
| getRef(String) | No* | No | No | |
| getRef(int) | No* | No | No | |
| getRowId(String) | No* | No | No | |
| getRowId(int) | No* | No | No | |
| getSQLXML(String) | No* | No | No | |
| getSQLXML(int) | No* | No | No | |
| getShort(String) | No | No | No | |
| getShort(int) | Yes | No | No | |
| getString(String) | No | No | No | |
| getString(int) | Yes | No | No | |
| getTime(String) | No | No | No | |
| getTime(String, Calendar) | No | No | No | |
| getTime(int) | Yes | No | No | |
| getTime(int, Calendar) | Yes | No | No | |
| getTimestamp(String) | No | No | No | |
| getTimestamp(String, Calendar) | No | No | No | |
| getTimestamp(int) | Yes | No | No | |
| getTimestamp(int, Calendar) | Yes | No | No | |
| getURL(String) | No* | No | No | |
| getURL(int) | No* | No | No | |
| registerOutParameter(String, int) | No | No | No | |
| registerOutParameter(String, int, String) | No* | No | No | |
| registerOutParameter(String, int, int) | No | No | No | |
| registerOutParameter(String, SQLType) | No | No | No | |
| registerOutParameter(String, SQLType, int) | No | No | No | |
| registerOutParameter(String, SQLType, String) | No | No | No | |
| registerOutParameter(int, int) | Yes | No | No | |
| registerOutParameter(int, int, String) | Yes | No | No | |
| registerOutParameter(int, int, int) | Yes | No | No | |
| registerOutParameter(int, SQLType) | Yes | No | No | |
| registerOutParameter(int, SQLType, int) | Yes | No | No | |
| registerOutParameter(int, SQLType, String) | Yes | No | No | |
| setAsciiStream(String, InputStream) | No | No | No | |
| setAsciiStream(String, InputStream, int) | No | No | No | |
| setAsciiStream(String, InputStream, long) | No | No | No | |
| setBigDecimal(String, BigDecimal) | No | No | No | |
| setBinaryStream(String, InputStream) | No | No | No | |
| setBinaryStream(String, InputStream, int) | No | No | No | |
| setBinaryStream(String, InputStream, long) | No | No | No | |
| setBlob(String, Blob) | No | No | No | |
| setBlob(String, InputStream) | No | No | No | |
| setBlob(String, InputStream, long) | No | No | No | |
| setBoolean(String, boolean) | No | No | No | |
| setByte(String, byte) | No | No | No | |
| setBytes(String, byte[]) | No | No | No | |
| setCharacterStream(String, Reader) | No | No | No | |
| setCharacterStream(String, Reader, int) | No | No | No | |
| setCharacterStream(String, Reader, long) | No | No | No | |
| setClob(String, Clob) | No | No | No | |
| setClob(String, Reader) | No | No | No | |
| setClob(String, Reader, long) | No | No | No | |
| setDate(String, Date) | No | No | No | |
| setDate(String, Date, Calendar) | No | No | No | |
| setDouble(String, double) | No | No | No | |
| setFloat(String, float) | No | No | No | |
| setInt(String, int) | No | No | No | |
| setLong(String, long) | No | No | No | |
| setNCharacterStream(String, Reader) | No | No | No | |
| setNCharacterStream(String, Reader, long) | No | No | No | |
| setNClob(String, NClob) | No | No | No | |
| setNClob(String, Reader) | No | No | No | |
| setNClob(String, Reader, long) | No | No | No | |
| setNString(String, String) | No | No | No | |
| setNull(String, int) | No | No | No | |
| setNull(String, int, String) | No* | No | No | |
| setObject(String, Object) | No | No | No | |
| setObject(String, Object, int) | No | No | No | |
| setObject(String, Object, int, int) | No | No | No | |
| setObject(String, Object, SQLType) | No | No | No | |
| setObject(String, Object, SQLType, int) | No | No | No | |
| setRowId(String, RowId) | No | No | No | |
| setSQLXML(String, SQLXML) | No | No | No | |
| setShort(String, short) | No | No | No | |
| setString(String, String) | No | No | No | |
| setTime(String, Time) | No | No | No | |
| setTime(String, Time, Calendar) | No | No | No | |
| setTimestamp(String, Timestamp) | No | No | No | |
| setTimestamp(String, Timestamp, Calendar) | No | No | No | |
| setURL(String, URL) | No | No | No | |
| wasNull() | Yes | No | No |
NOTE: All methods on the
Clobinterface must be fully implemented if the JDBC driver supports the data type.
| Method | Required? | Supported? | Covered? | Details |
|---|---|---|---|---|
| free() | Yes | No | No | |
| getAsciiStream() | Yes | No | No | |
| getCharacterStream() | Yes | No | No | |
| getCharacterStream(long, length) | Yes | No | No | |
| getSubString(long, int) | Yes | No | No | |
| length() | Yes | No | No | |
| position(Clob, long) | Yes | No | No | |
| position(String, long) | Yes | No | No | |
| setAsciiStream(long) | Yes | No | No | |
| setCharacterStream(long) | Yes | No | No | |
| setString(long, String) | Yes | No | No | |
| setString(long, String, int, int) | Yes | No | No | |
| truncate(long) | Yes | No | No |
NOTE: * is not required to implement the methods unless the driver supports the associated data type.
NOTE: ** is not required to implement
prepareStatement(String sql, Statement.RETURN_GENERATED_KEYS)unless the driver supports generated keys.
| Method | Required? | Supported? | Covered? | Details |
|---|---|---|---|---|
| abort(Executor) | Yes | No | No | #71 |
| clearWarnings() | Yes | Yes | No | dumb, but enough |
| close() | Yes | Yes | Yes | |
| commit() | Yes | No | No | #63; blocked |
| createArrayOf(String, Object[]) | No* | No | No | #65; blocked |
| createBlob() | No* | No | No | #67 |
| createClob() | No* | No | No | #66; blocked |
| createNClob() | No* | No | No | #66; blocked |
| createSQLXML() | No* | No | No | #69; blocked |
| createStatement() | Yes | Yes | Yes | |
| createStatement(int, int) | Yes | Yes | Yes | |
| createStatement(int, int, int) | Yes | Yes | Yes | |
| createStruct(String, Object[]) | No* | No | No | #70; blocked |
| getAutoCommit() | Yes | No | No | #63; blocked |
| getCatalog() | Yes | Yes | No | dumb, but enough |
| getClientInfo() | Yes | No | No | #74 |
| getClientInfo(String) | Yes | No | No | #74 |
| getHoldability() | Yes | Yes | Yes | |
| getMetaData() | Yes | Yes | Yes | |
| getNetworkTimeout() | No | Yes | Yes | |
| getSchema() | Yes | Yes | No | dumb, but enough |
| getTransactionIsolation() | Yes | No | No | #103; blocked |
| getTypeMap() | No* | No | No | |
| getWarnings() | Yes | Yes | No | dumb, but enough |
| isClosed() | Yes | Yes | Yes | |
| isReadOnly() | Yes | Yes | No | dumb, but enough |
| isValid(int) | Yes | Yes | Yes | w/o timeout |
| nativeSQL(String) | Yes | No | No | #76 |
| prepareCall(String) | No | No | No | |
| prepareCall(String, int, int) | No | No | No | |
| prepareCall(String, int, int, int) | No | No | No | |
| prepareStatement(String) | Yes | Yes | Yes | |
| prepareStatement(String, String[]) | No | No | No | #77; blocked |
| prepareStatement(String, int[]) | No | No | No | #77; blocked |
| prepareStatement(String, int) | No** | No | No | #77; blocked |
| prepareStatement(String, int, int) | Yes | Yes | Yes | |
| prepareStatement(String, int, int, int) | Yes | Yes | Yes | |
| releaseSavepoint(Savepoint) | No | No | No | |
| rollback() | Yes | No | No | #63; blocked |
| rollback(Savepoint) | No | No | No | |
| setAutoCommit(boolean) | Yes | No | No | #63; blocked |
| setCatalog(String) | Yes | Yes | No | dumb, but enough |
| setClientInfo(Properties) | Yes | No | No | #74 |
| setClientInfo(String, String) | Yes | No | No | #74 |
| setHoldability(int) | Yes | Yes | Yes | HOLD_CURSORS_OVER_COMMIT only |
| setNetworkTimeout(Executor, int) | No | Yes | Yes | |
| setReadOnly(boolean) | Yes | No | No | |
| setSavepoint() | No | No | No | |
| setSavepoint(String) | No | No | No | |
| setSchema(String) | Yes | Yes | No | dumb, but enough |
| setTransactionIsolation(int) | Yes | No | No | #103; blocked |
| setTypeMap(Map<String,Class<?>>) | No | No | No |
| Method | Required? | Supported? | Covered? | Details |
|---|---|---|---|---|
| allProceduresAreCallable() | Yes | No | No | #110 |
| allTablesAreSelectable() | Yes | No | No | #110 |
| autoCommitFailureClosesAllResultSets() | Yes | No | No | #112 |
| dataDefinitionCausesTransactionCommit() | Yes | No | No | #112 |
| dataDefinitionIgnoredInTransactions() | Yes | No | No | #112 |
| deletesAreDetected(int) | Yes | Yes | Yes | |
| doesMaxRowSizeIncludeBlobs() | Yes | No | No | #109 |
| generatedKeyAlwaysReturned() | Yes | No | No | #112 |
| getAttributes(String, String, String, String) | Yes | Yes | No | dumb, but enough (until we'll add UDTs) |
| getBestRowIdentifier(String, String, String, int, boolean) | Yes | No | No | #114 |
| getCatalogSeparator() | Yes | Yes | No | |
| getCatalogTerm() | Yes | Yes | No | |
| getCatalogs() | Yes | No | No | #105 |
| getClientInfoProperties() | Yes | No | No | #74 |
| getColumnPrivileges(String, String, String, String) | Yes | No | No | #115 |
| getColumns(String, String, String, String) | Yes | Yes | Yes | |
| getConnection() | Yes | Yes | No | |
| getCrossReference(String x 6) | Yes | No | No | #116 |
| getDatabaseMajorVersion() | Yes | No | No | #106 |
| getDatabaseMinorVersion() | Yes | No | No | #106 |
| getDatabaseProductName() | Yes | Yes | No | #106 |
| getDatabaseProductVersion() | Yes | Yes | No | #106 |
| getDefaultTransactionIsolation() | Yes | No | No | #103; blocked |
| getDriverMajorVersion() | Yes | Yes | No | |
| getDriverMinorVersion() | Yes | Yes | No | |
| getDriverName() | Yes | Yes | No | |
| getDriverVersion() | Yes | Yes | No | |
| getExportedKeys(String, String, String) | Yes | No | No | #116 |
| getExtraNameCharacters() | Yes | No | No | #105 |
| getFunctionColumns(String, String, String, String) | Yes | No | No | #118 |
| getFunctions(String, String, String) | Yes | No | No | #104 |
| getIdentifierQuoteString() | Yes | No | No | #105 |
| getImportedKeys(String, String, String) | Yes | No | No | #116 |
| getIndexInfo(String, String, String, boolean, boolean) | Yes | No | No | #117 |
| getJDBCMajorVersion() | Yes | Yes | No | #106 |
| getJDBCMinorVersion() | Yes | Yes | No | #106 |
| getMaxBinaryLiteralLength() | Yes | No | No | #105 |
| getMaxCatalogNameLength() | Yes | No | No | #105 |
| getMaxCharLiteralLength() | Yes | No | No | #105 |
| getMaxColumnNameLength() | Yes | No | No | #105 |
| getMaxColumnsInGroupBy() | Yes | No | No | #109 |
| getMaxColumnsInIndex() | Yes | No | No | #109 |
| getMaxColumnsInOrderBy() | Yes | No | No | #109 |
| getMaxColumnsInSelect() | Yes | No | No | #109 |
| getMaxColumnsInTable() | Yes | No | No | #109 |
| getMaxConnections() | Yes | No | No | #109 |
| getMaxCursorNameLength() | Yes | No | No | #105 |
| getMaxIndexLength() | Yes | No | No | #105 |
| getMaxLogicalLobSize() | Yes | No | No | #109 |
| getMaxProcedureNameLength() | Yes | No | No | #105 |
| getMaxRowSize() | Yes | No | No | #109 |
| getMaxSchemaNameLength() | Yes | No | No | #105 |
| getMaxStatementLength() | Yes | No | No | #105 |
| getMaxStatements() | Yes | No | No | #109 |
| getMaxTableNameLength() | Yes | No | No | #105 |
| getMaxTablesInSelect() | Yes | No | No | #109 |
| getMaxUserNameLength() | Yes | No | No | #105 |
| getNumericFunctions() | Yes | No | No | #82 |
| getPrimaryKeys(String, String, String) | Yes | Yes | Yes | |
| getProcedureColumns(String, String, String, String) | Yes | No | No | #118 |
| getProcedureTerm() | Yes | No | No | #104 |
| getProcedures(String, String, String) | Yes | No | No | #105 |
| getPseudoColumns(String, String, String, String) | Yes | Yes | No | dumb, but enough |
| getResultSetHoldability() | Yes | Yes | Yes | |
| getRowIdLifetime() | Yes | Yes | No | |
| getSQLKeywords()() | Yes | Yes | No | |
| getSQLStateType() | Yes | Yes | No | |
| getSchemaTerm() | Yes | No | No | #105 |
| getSchemas() | Yes | No | No | #105 |
| getSchemas(String, String) | Yes | No | No | #105 |
| getSearchStringEscape() | Yes | No | No | #119 |
| getStringFunctions() | Yes | No | No | #82 |
| getSuperTables(String, String, String) | Yes | Yes | No | dumb, but enough (until we'll add structured types) |
| getSuperTypes(String, String, String) | Yes | Yes | No | dumb, but enough (until we'll add structured types) |
| getSystemFunctions() | Yes | No | No | #82 |
| getTablePrivileges(String, String, String) | Yes | No | No | #115 |
| getTableTypes() | Yes | Yes | Yes | |
| getTables(String, String, String, String[]) | Yes | No | No | #107 |
| getTimeDateFunctions() | Yes | No | No | #82 |
| getTypeInfo() | Yes | No | No | #113 |
| getUDTs(String, String, String, int[]) | Yes | Yes | No | dumb, but enough |
| getURL() | Yes | Yes | No | |
| getUserName() | Yes | Yes | No | |
| getVersionColumns(String, String, String) | Yes | Yes | No | |
| insertsAreDetected(int) | Yes | Yes | Yes | |
| isCatalogAtStart() | Yes | Yes | No | |
| isReadOnly() | Yes | Yes | No | dumb, but enough |
| locatorsUpdateCopy() | Yes | Yes | No | |
| nullPlusNonNullIsNull() | Yes | Yes | No | |
| nullsAreSortedAtEnd() | Yes | Yes | Yes | |
| nullsAreSortedAtStart() | Yes | Yes | Yes | |
| nullsAreSortedHigh() | Yes | Yes | Yes | |
| nullsAreSortedLow() | Yes | Yes | Yes | |
| othersDeletesAreVisible(int) | Yes | Yes | Yes | |
| othersInsertsAreVisible(int) | Yes | Yes | Yes | |
| othersUpdatesAreVisible(int) | Yes | Yes | Yes | |
| ownDeletesAreVisible(int) | Yes | Yes | Yes | |
| ownInsertsAreVisible(int) | Yes | Yes | Yes | |
| ownUpdatesAreVisible(int) | Yes | Yes | Yes | |
| storesLowerCaseIdentifiers() | Yes | Yes | No | #105 |
| storesLowerCaseQuotedIdentifiers() | Yes | Yes | No | #105 |
| storesMixedCaseIdentifiers() | Yes | No | No | #105 |
| storesMixedCaseQuotedIdentifiers() | Yes | Yes | No | #105 |
| storesUpperCaseIdentifiers() | Yes | No | No | #105 |
| storesUpperCaseQuotedIdentifiers() | Yes | Yes | No | #105 |
| supportsANSI92EntryLevelSQL() | Yes | No | No | #108 |
| supportsANSI92FullSQL() | Yes | No | No | #108 |
| supportsANSI92IntermediateSQL() | Yes | No | No | #108 |
| supportsAlterTableWithAddColumn() | Yes | No | No | #108 |
| supportsAlterTableWithDropColumn() | Yes | No | No | #108 |
| supportsBatchUpdates() | Yes | No | No | #108 |
| supportsCatalogsInDataManipulation() | Yes | No | No | #108 |
| supportsCatalogsInIndexDefinitions() | Yes | No | No | #108 |
| supportsCatalogsInPrivilegeDefinitions() | Yes | No | No | #108 |
| supportsCatalogsInProcedureCalls() | Yes | No | No | #108 |
| supportsCatalogsInTableDefinitions() | Yes | No | No | #108 |
| supportsColumnAliasing() | Yes | No | No | #108 |
| supportsConvert() | Yes | No | No | #108 |
| supportsConvert(int fromType, int toType) | Yes | No | No | #108 |
| supportsCoreSQLGrammar() | Yes | No | No | #108 |
| supportsCorrelatedSubqueries() | Yes | No | No | #108 |
| supportsDataDefinitionAndDataManipulationTransactions() | Yes | No | No | #108 |
| supportsDataManipulationTransactionsOnly() | Yes | No | No | #108 |
| supportsDifferentTableCorrelationNames() | Yes | No | No | #108 |
| supportsExpressionsInOrderBy() | Yes | No | No | #108 |
| supportsExtendedSQLGrammar() | Yes | No | No | #108 |
| supportsFullOuterJoins() | Yes | No | No | #108 |
| supportsGetGeneratedKeys() | Yes | No | No | #108 |
| supportsGroupBy() | Yes | No | No | #108 |
| supportsGroupByBeyondSelect() | Yes | No | No | #108 |
| supportsGroupByUnrelated() | Yes | No | No | #108 |
| supportsIntegrityEnhancementFacility() | Yes | No | No | #108 |
| supportsLikeEscapeClause() | Yes | No | No | #108 |
| supportsLimitedOuterJoins() | Yes | No | No | #108 |
| supportsMinimumSQLGrammar() | Yes | No | No | #108 |
| supportsMixedCaseIdentifiers() | Yes | No | No | #105 + #108 |
| supportsMixedCaseQuotedIdentifiers() | Yes | No | No | #105 + #108 |
| supportsMultipleOpenResults() | Yes | No | No | #108 |
| supportsMultipleResultSets() | Yes | No | No | #108 |
| supportsMultipleTransactions() | Yes | No | No | #108 |
| supportsNamedParameters() | Yes | No | No | #108 |
| supportsNonNullableColumns() | Yes | No | No | #108 |
| supportsOpenCursorsAcrossCommit() | Yes | No | No | #108 |
| supportsOpenCursorsAcrossRollback() | Yes | No | No | #108 |
| supportsOpenStatementsAcrossCommit() | Yes | No | No | #108 |
| supportsOpenStatementsAcrossRollback() | Yes | No | No | #108 |
| supportsOrderByUnrelated() | Yes | No | No | #108 |
| supportsOuterJoins() | Yes | No | No | #108 |
| supportsPositionedDelete() | Yes | No | No | #108 |
| supportsPositionedUpdate() | Yes | No | No | #108 |
| supportsRefCursors() | Yes | No | No | #108 |
| supportsResultSetConcurrency(int, int) | Yes | Yes | Yes | #108 |
| supportsResultSetHoldability(int) | Yes | Yes | Yes | |
| supportsResultSetType(int) | Yes | Yes | Yes | |
| supportsSavepoints() | Yes | No | No | #108 |
| supportsSchemasInDataManipulation() | Yes | No | No | #108 |
| supportsSchemasInIndexDefinitions() | Yes | No | No | #108 |
| supportsSchemasInPrivilegeDefinitions() | Yes | No | No | #108 |
| supportsSchemasInProcedureCalls() | Yes | No | No | #108 |
| supportsSchemasInTableDefinitions() | Yes | No | No | #108 |
| supportsSelectForUpdate() | Yes | No | No | #108 |
| supportsStatementPooling() | Yes | No | No | #108 |
| supportsStoredFunctionsUsingCallSyntax() | Yes | No | No | #82 + #108 |
| supportsStoredProcedures() | Yes | No | No | #82 + #108 |
| supportsSubqueriesInComparisons() | Yes | No | No | #108 |
| supportsSubqueriesInExists() | Yes | No | No | #108 |
| supportsSubqueriesInIns() | Yes | No | No | #108 |
| supportsSubqueriesInQuantifieds() | Yes | No | No | #108 |
| supportsTableCorrelationNames() | Yes | No | No | #108 |
| supportsTransactionIsolationLevel(int) | Yes | No | No | #103 + #108; blocked |
| supportsTransactions() | Yes | No | No | #63 + #108; blocked |
| supportsUnion() | Yes | No | No | #108 |
| supportsUnionAll() | Yes | No | No | #108 |
| updatesAreDetected(int) | Yes | Yes | Yes | |
| usesLocalFilePerTable() | Yes | Yes | No | |
| usesLocalFiles() | Yes | Yes | No |
NOTE: * implementation must contain a static initializer that will be called when the driver is loaded and automatically register an instance of the driver.
| Method | Required? | Supported? | Covered? | Details |
|---|---|---|---|---|
| static { } | Yes* | Yes | Yes | |
| acceptsURL(String) | Yes | Yes | No | |
| connect(String, Properties) | Yes | Yes | Yes | |
| getMajorVersion() | Yes | Yes | No | dumb |
| getMinorVersion() | Yes | Yes | No | dumb |
| getParentLogger() | No | No | No | |
| getPropertyInfo(String, Properties) | Yes | Yes | Yes | |
| jdbcCompliant() | Yes | Yes | Yes | false |
NOTE: All methods on the
DriverActioninterface must be fully implemented if the JDBC driver supports driver notifications.
| Method | Required? | Supported? | Covered? | Details |
|---|---|---|---|---|
| deregister() | Yes | No | No |
NOTE: All methods on the
NClobinterface must be fully implemented if the JDBC driver supports the data type.
| Method | Required? | Supported? | Covered? | Details |
|---|---|---|---|---|
| free() | Yes | No | No | |
| getAsciiStream() | Yes | No | No | |
| getCharacterStream() | Yes | No | No | |
| getCharacterStream(long, length) | Yes | No | No | |
| getSubString(long, int) | Yes | No | No | |
| length() | Yes | No | No | |
| position(Clob, long) | Yes | No | No | |
| position(String, long) | Yes | No | No | |
| setAsciiStream(long) | Yes | No | No | |
| setCharacterStream(long) | Yes | No | No | |
| setString(long, String) | Yes | No | No | |
| setString(long, String, int, int) | Yes | No | No | |
| truncate(long) | Yes | No | No |
| Method | Required? | Supported? | Covered? | Details |
|---|---|---|---|---|
| getParameterClassName(int) | Yes | No | No | |
| getParameterCount() | Yes | No | No | |
| getParameterMode(int) | Yes | No | No | |
| getParameterType(int) | Yes | No | No | |
| getParameterTypeName(int) | Yes | No | No | |
| getPrecision(int) | Yes | No | No | |
| getScale(int) | Yes | No | No | |
| isNullable(int) | Yes | No | No | |
| isSigned(int) | Yes | No | No |
NOTE: * is not required to implement the methods unless the driver supports the associated data type.
| Method | Required? | Supported? | Covered? | Details |
|---|---|---|---|---|
| addBatch() | Yes | No | No | |
| clearParameters() | Yes | Yes | No | |
| execute() | Yes | Yes | Yes | |
| executeQuery() | Yes | Yes | Yes | |
| executeLargeUpdate() | No | No | No | |
| executeUpdate() | Yes | Yes | Yes | |
| getMetaData() | No | Yes | No | |
| getParameterMetaData() | Yes | No | No | |
| setArray(int, Array) | No* | No | No | |
| setAsciiStream(int, InputStream) | No | No | No | |
| setAsciiStream(int, InputStream, int) | Yes | Yes | No | length is ignored |
| setAsciiStream(int, InputStream, long) | Yes | No | No | |
| setBigDecimal(int, BigDecimal) | Yes | Yes | Yes | |
| setBinaryStream(int, InputStream) | No | No | No | |
| setBinaryStream(int, InputStream, int) | Yes | Yes | No | length is ignored |
| setBinaryStream(int, InputStream, long) | Yes | No | No | |
| setBlob(int, Blob) | No* | No | No | |
| setBlob(int, InputStream) | No* | No | No | |
| setBlob(int, InputStream, long) | No* | No | No | |
| setBoolean(int, boolean) | Yes | Yes | No | |
| setByte(int, byte) | Yes | Yes | Yes | |
| setBytes(int, byte[]) | Yes | Yes | Yes | |
| setCharacterStream(int, Reader) | No | No | No | |
| setCharacterStream(int, Reader, int) | Yes | No | No | |
| setCharacterStream(int, Reader, long) | Yes | No | No | |
| setClob(int, Clob) | No* | No | No | |
| setClob(int, Reader) | No* | No | No | |
| setClob(int, Reader, long) | No* | No | No | |
| setDate(int, Date) | Yes | Yes | Yes | |
| setDate(int, Date, Calendar) | Yes | Yes | No | calendar is ignored |
| setDouble(int, double) | Yes | Yes | Yes | |
| setFloat(int, float) | Yes | Yes | Yes | |
| setInt(int, int) | Yes | Yes | Yes | |
| setLong(int, long) | Yes | Yes | Yes | |
| setNCharacterStream(int, Reader) | No* | No | No | |
| setNCharacterStream(int, Reader, long) | No* | No | No | |
| setNClob(int, NClob) | No* | No | No | |
| setNClob(int, Reader) | No* | No | No | |
| setNClob(int, Reader, long) | No* | No | No | |
| setNString(int, String) | No* | Yes | No | encoding is ignored |
| setNull(int, int) | Yes | Yes | No | |
| setNull(int, int, String) | No* | Yes | No | |
| setObject(int, Object) | Yes | Yes | No | |
| setObject(int, Object, SQLType) | Yes | No | No | |
| setObject(int, Object, SQLType, int) | Yes | No | No | |
| setObject(int, Object, int) | Yes | Yes | No | type is ignored |
| setObject(int, Object, int, int) | Yes | Yes | No | length is ignored |
| setRef(int, Ref) | No* | No | No | |
| setRowId(int, RowId) | No* | No | No | |
| setSQLXML(int, SQLXMLmlObject) | No* | No | No | |
| setShort(int, short) | Yes | Yes | No | |
| setString(int, String) | Yes | Yes | Yes | |
| setTime(int, Time) | Yes | Yes | No | |
| setTime(int, Time, Calendar) | Yes | Yes | No | calendar is ignored |
| setTimestamp(int, Timestamp) | Yes | Yes | No | |
| setTimestamp(int, Timestamp, Calendar) | Yes | Yes | No | calendar is ignored |
| setURL(int, URL) | No* | Yes | No | |
| setUnicodeStream(int, InputStream, int) | No | Yes | No | length is ignored |
NOTE: All methods on the
Refinterface must be fully implemented if the JDBC driver supports the data type.
| Method | Required? | Supported? | Covered? | Details |
|---|---|---|---|---|
| getBaseTypeName() | Yes | No | No | |
| getObject() | Yes | No | No | |
| getObject(Map<String,Class<?>>) | Yes | No | No | |
| setObject(Object) | Yes | No | No |
NOTE: * is not required to implement the methods unless the driver supports the associated data type.
NOTE: ** is not required to implement the methods unless driver supports a
ResultSetconcurrency ofCONCUR_UPDATABLE
NOTE: *** is not required to implement the methods unless driver supports a
ResultSettype ofTYPE_SCROLL_SENSITIVEorTYPE_SCROLL_INSENSITIVE
| Method | Required? | Supported? | Covered? | Details |
|---|---|---|---|---|
| absolute(int) | No*** | Yes | Yes | |
| afterLast() | No*** | Yes | Yes | |
| beforeFirst() | No*** | Yes | Yes | |
| cancelRowUpdates() | No** | No | No | |
| clearWarnings() | Yes | Yes | No | dumb |
| close() | Yes | Yes | Yes | |
| deleteRow() | No** | No | No | |
| findColumn(String) | Yes | Yes | Yes | |
| first() | No*** | Yes | Yes | |
| getArray(String) | No* | No | No | |
| getArray(int) | No* | No | No | |
| getAsciiStream(String) | Yes | Yes | No | |
| getAsciiStream(int) | Yes | Yes | No | |
| getBigDecimal(String) | Yes | Yes | Yes | |
| getBigDecimal(String, int) | No | Yes | Yes | |
| getBigDecimal(int) | Yes | Yes | Yes | |
| getBigDecimal(int, int) | No | Yes | Yes | |
| getBinaryStream(String) | Yes | Yes | No | |
| getBinaryStream(int) | Yes | Yes | No | |
| getBlob(String) | No* | No | No | |
| getBlob(int) | No* | No | No | |
| getBoolean(String) | Yes | Yes | No | |
| getBoolean(int) | Yes | Yes | No | |
| getByte(String) | Yes | Yes | Yes | |
| getByte(int) | Yes | Yes | Yes | |
| getBytes(String) | Yes | Yes | Yes | |
| getBytes(int) | Yes | Yes | Yes | |
| getCharacterStream(String) | Yes | Yes | No | |
| getCharacterStream(int) | Yes | Yes | No | |
| getClob(String) | No* | No | No | |
| getClob(int) | No* | No | No | |
| getConcurrency() | Yes | Yes | Yes | |
| getCursorName() | No | No | No | |
| getDate(String) | Yes | Yes | Yes | |
| getDate(String, Calendar) | Yes | No | No | |
| getDate(int) | Yes | Yes | Yes | |
| getDate(int, Calendar) | Yes | No | No | |
| getDouble(String) | Yes | Yes | Yes | |
| getDouble(int) | Yes | Yes | Yes | |
| getFetchDirection() | Yes | Yes | No | FETCH_FORWARD only |
| getFetchSize() | Yes | No | No | |
| getFloat(String) | Yes | Yes | Yes | |
| getFloat(int) | Yes | Yes | Yes | |
| getHoldability() | Yes | Yes | Yes | |
| getInt(String) | Yes | Yes | Yes | |
| getInt(int) | Yes | Yes | Yes | |
| getLong(String) | Yes | Yes | Yes | |
| getLong(int) | Yes | Yes | Yes | |
| getMetaData() | Yes | Yes | Yes | |
| getNCharacterStream(String) | No* | No | No | |
| getNCharacterStream(int) | No* | No | No | |
| getNClob(String) | No* | No | No | |
| getNClob(int) | No* | No | No | |
| getNString(String) | No* | No | No | |
| getNString(int) | No* | No | No | |
| getObject(String) | Yes | Yes | No | |
| getObject(String, Class) | No | No | No | wrong cast |
| getObject(String, Map<String,Class<?>>) | No* | No | No | |
| getObject(int) | Yes | Yes | No | |
| getObject(int, Class type) | No | No | No | wrong cast |
| getObject(int, Map<String,Class<?>>) | No* | No | No | |
| getRef(String) | No* | No | No | |
| getRef(int) | No* | No | No | |
| getRow() | No | Yes | Yes | |
| getRowId(String) | No* | No | No | |
| getRowId(int) | No* | No | No | |
| getSQLXML(String) | No* | No | No | |
| getSQLXML(int) | No* | No | No | |
| getShort(String) | Yes | Yes | Yes | |
| getShort(int) | Yes | Yes | Yes | |
| getStatement() | Yes | Yes | Yes | |
| getString(String) | Yes | Yes | Yes | |
| getString(int) | Yes | Yes | Yes | |
| getTime(String) | Yes | Yes | No | |
| getTime(String, Calendar) | Yes | No | No | |
| getTime(int) | Yes | Yes | No | |
| getTime(int, Calendar) | Yes | No | No | |
| getTimestamp(String) | Yes | Yes | No | |
| getTimestamp(String, Calendar) | Yes | No | No | |
| getTimestamp(int) | Yes | Yes | No | |
| getTimestamp(int, Calendar) | Yes | No | No | |
| getType() | Yes | Yes | Yes | |
| getURL(String) | No* | Yes | No | |
| getURL(int) | No* | Yes | No | |
| getUnicodeStream(String) | No | Yes | No | |
| getUnicodeStream(int) | No | Yes | No | |
| getWarnings() | Yes | Yes | No | dumb |
| insertRow() | No | No | No | |
| isAfterLast() | No*** | Yes | Yes | |
| isBeforeFirst() | No*** | Yes | Yes | |
| isClosed() | Yes | Yes | Yes | |
| isFirst() | No*** | Yes | Yes | |
| isLast() | No*** | Yes | Yes | |
| last() | No*** | Yes | Yes | |
| moveToCurrentRow() | No | No | No | |
| moveToInsertRow() | No | No | No | |
| next() | Yes | Yes | Yes | |
| previous() | No*** | Yes | Yes | |
| refreshRow() | No | No | No | |
| relative(int) | No*** | No | No | |
| rowDeleted() | No** | No | No | |
| rowInserted() | No | No | No | |
| rowUpdated() | No** | No | No | |
| setFetchDirection(int) | Yes | Yes | No | FETCH_FORWARD only |
| setFetchSize(int) | Yes | No | No | |
| updateArray(String, Array) | No** | No | No | |
| updateArray(int, Array) | No** | No | No | |
| updateAsciiStream(String, InputStream) | No** | No | No | |
| updateAsciiStream(String, InputStream, int) | No** | No | No | |
| updateAsciiStream(String, InputStream, long) | No** | No | No | |
| updateAsciiStream(int, InputStream) | No** | No | No | |
| updateAsciiStream(int, InputStream, int) | No** | No | No | |
| updateAsciiStream(int, InputStream, long) | No** | No | No | |
| updateBigDecimal(String, BigDecimal) | No** | No | No | |
| updateBigDecimal(int, BigDecimal) | No** | No | No | |
| updateBinaryStream(String, InputStream) | No** | No | No | |
| updateBinaryStream(String, InputStream, int) | No** | No | No | |
| updateBinaryStream(String, InputStream, long) | No** | No | No | |
| updateBinaryStream(int, InputStream) | No** | No | No | |
| updateBinaryStream(int, InputStream, int) | No** | No | No | |
| updateBinaryStream(int, InputStream, long) | No** | No | No | |
| updateBlob(String, Blob) | No** | No | No | |
| updateBlob(String, InputStream) | No** | No | No | |
| updateBlob(String, InputStream, long) | No** | No | No | |
| updateBlob(int, Blob) | No** | No | No | |
| updateBlob(int, InputStream) | No** | No | No | |
| updateBlob(int, InputStream, long) | No** | No | No | |
| updateBoolean(String, boolean) | No** | No | No | |
| updateBoolean(int, boolean) | No** | No | No | |
| updateByte(String, byte) | No** | No | No | |
| updateByte(int, byte) | No** | No | No | |
| updateBytes(String, byte[]) | No** | No | No | |
| updateBytes(int, byte[]) | No** | No | No | |
| updateCharacterStream(String, Reader) | No** | No | No | |
| updateCharacterStream(String, Reader, int) | No** | No | No | |
| updateCharacterStream(String, Reader, long) | No** | No | No | |
| updateCharacterStream(int, Reader) | No** | No | No | |
| updateCharacterStream(int, Reader, int) | No** | No | No | |
| updateCharacterStream(int, Reader, long) | No** | No | No | |
| updateClob(String, Clob) | No** | No | No | |
| updateClob(String, Reader) | No** | No | No | |
| updateClob(String, Reader, long) | No** | No | No | |
| updateClob(int, Clob) | No** | No | No | |
| updateClob(int, Reader) | No** | No | No | |
| updateClob(int, Reader, long) | No** | No | No | |
| updateDate(String, Date) | No** | No | No | |
| updateDate(int, Date) | No** | No | No | |
| updateDouble(String, double) | No** | No | No | |
| updateDouble(int, double) | No** | No | No | |
| updateFloat(String, float) | No** | No | No | |
| updateFloat(int, float) | No** | No | No | |
| updateInt(String, int) | No** | No | No | |
| updateInt(int, int) | No** | No | No | |
| updateLong(String, long) | No** | No | No | |
| updateLong(int, long) | No** | No | No | |
| updateNCharacterStream(String, Reader) | No** | No | No | |
| updateNCharacterStream(String, Reader, long) | No** | No | No | |
| updateNCharacterStream(int, Reader) | No** | No | No | |
| updateNCharacterStream(int, Reader, long) | No** | No | No | |
| updateNClob(String, NClob) | No** | No | No | |
| updateNClob(String, Reader) | No** | No | No | |
| updateNClob(String, Reader, long) | No** | No | No | |
| updateNClob(int, NClob) | No** | No | No | |
| updateNClob(int, Reader) | No** | No | No | |
| updateNClob(int, Reader, long) | No** | No | No | |
| updateNString(String, String) | No** | No | No | |
| updateNString(int, String) | No** | No | No | |
| updateNull(String) | No** | No | No | |
| updateNull(int) | No** | No | No | |
| updateObject(String, Object) | No** | No | No | |
| updateObject(String, Object, SQLType) | No** | No | No | |
| updateObject(String, Object, SQLType, int) | No** | No | No | |
| updateObject(String, Object, int) | No** | No | No | |
| updateObject(int, Object) | No** | No | No | |
| updateObject(int, Object, SQLType) | No** | No | No | |
| updateObject(int, Object, SQLType, int) | No** | No | No | |
| updateObject(int, Object, int) | No** | No | No | |
| updateRef(String, Ref) | No** | No | No | |
| updateRef(int, Ref) | No** | No | No | |
| updateRow() | No** | No | No | |
| updateRowId(String, RowId) | No** | No | No | |
| updateRowId(int, RowId) | No** | No | No | |
| updateSQLXML(String, SQLXMLmlObject) | No** | No | No | |
| updateSQLXML(int, SQLXMLmlObject) | No** | No | No | |
| updateShort(String, short) | No** | No | No | |
| updateShort(int, short) | No** | No | No | |
| updateString(String, String) | No** | No | No | |
| updateString(int, String) | No** | No | No | |
| updateTime(String, Time) | No** | No | No | |
| updateTime(int, Time) | No** | No | No | |
| updateTimestamp(String, Timestamp) | No** | No | No | |
| updateTimestamp(int, Timestamp) | No** | No | No | |
| wasNull() | Yes | No | No |
| Method | Required? | Supported? | Covered? | Details |
|---|---|---|---|---|
| getCatalogName(int) | Yes | No | No | |
| getColumnClassName(int) | Yes | No | No | |
| getColumnCount() | Yes | Yes | Yes | |
| getColumnDisplaySize(int) | Yes | No | No | |
| getColumnLabel(int) | Yes | Yes | Yes | |
| getColumnName(int) | Yes | Yes | Yes | |
| getColumnType(int) | Yes | No | No | |
| getColumnTypeName(int) | Yes | No | No | |
| getPrecision(int) | Yes | No | No | |
| getScale(int) | Yes | No | No | |
| getSchemaName(int) | Yes | No | No | |
| getTableName(int) | Yes | No | No | |
| isAutoIncrement(int) | Yes | No | No | |
| isCaseSensitive(int) | Yes | No | No | |
| isCurrency(int) | Yes | No | No | |
| isDefinitelyWritable(int) | Yes | No | No | |
| isNullable(int) | Yes | No | No | |
| isReadOnly(int) | Yes | No | No | |
| isSearchable(int) | Yes | No | No | |
| isSigned(int) | Yes | No | No | |
| isWritable(int) | Yes | No | No |
NOTE: All methods on the
RowIdinterface must be fully implemented if the JDBC driver supports the data type.
| Method | Required? | Supported? | Covered? | Details |
|---|---|---|---|---|
| equals(Object) | Yes | No | No | |
| getBytes() | Yes | No | No | |
| hashCode() | Yes | No | No | |
| toString() | Yes | No | No |
NOTE: It must implement the
Savepointinterface if the methodDatabaseMetaData.supportsSavepoints()returnstrue
| Method | Required? | Supported? | Covered? | Details |
|---|---|---|---|---|
| getSavepointId() | Yes | No | No | |
| getSavepointName() | Yes | No | No |
SQLInputis optional interface, but if it's implemented then the implementation must support all methods with the exception of optional methods marked*.
NOTE: * is not required to implement the methods unless the driver supports the associated data type.
| Method | Required? | Supported? | Covered? | Details |
|---|---|---|---|---|
| readArray() | No* | No | No | |
| readAsciiStream() | Yes | No | No | |
| readBigDecimal() | Yes | No | No | |
| readBinaryStream() | Yes | No | No | |
| readBlob() | No* | No | No | |
| readBoolean() | Yes | No | No | |
| readByte() | Yes | No | No | |
| readBytes() | Yes | No | No | |
| readCharacterStream() | Yes | No | No | |
| readClob() | No* | No | No | |
| readDate() | Yes | No | No | |
| readDouble() | Yes | No | No | |
| readFloat() | Yes | No | No | |
| readInt() | Yes | No | No | |
| readLong() | Yes | No | No | |
| readNClob() | No* | No | No | |
| readNString() | No* | No | No | |
| readObject() | Yes | No | No | |
| readObject(Class) | Yes | No | No | |
| readRef() | No* | No | No | |
| readRowId() | No* | No | No | |
| readSQLXML() | No* | No | No | |
| readShort() | Yes | No | No | |
| readString() | Yes | No | No | |
| readTime() | Yes | No | No | |
| readTimestamp() | Yes | No | No | |
| readURL() | No* | No | No | |
| wasNull() | Yes | No | No |
SQLOutputis optional interface, but if it's implemented then the implementation must support all methods with the exception of optional methods marked*.
NOTE: * is not required to implement the methods unless the driver supports the associated data type.
| Method | Required? | Supported? | Covered? | Details |
|---|---|---|---|---|
| writeArray(Array) | No* | No | No | |
| writeAsciiStream(InputStream) | Yes | No | No | |
| writeBigDecimal(BigDecimal) | Yes | No | No | |
| writeBinaryStream(InputStream) | Yes | No | No | |
| writeBlob(Blob) | No* | No | No | |
| writeBoolean(boolean) | Yes | No | No | |
| writeByte(byte) | Yes | No | No | |
| writeBytes(byte[]) | Yes | No | No | |
| writeCharacterStream(Reader) | Yes | No | No | |
| writeClob(Clob) | No* | No | No | |
| writeDate(Date) | Yes | No | No | |
| writeDouble(double) | Yes | No | No | |
| writeFloat(float) | Yes | No | No | |
| writeInt(int) | Yes | No | No | |
| writeLong(long) | Yes | No | No | |
| writeNClob(NClob) | No* | No | No | |
| writeNString(String) | No* | No | No | |
| writeObject(Object, SQLType) | Yes | No | No | |
| writeObject(SQLData) | Yes | No | No | |
| writeRef(Ref) | No* | No | No | |
| writeRowId(RowId) | No* | No | No | |
| writeSQLXML(SQLXML) | No* | No | No | |
| writeShort(short) | Yes | No | No | |
| writeString(String) | Yes | No | No | |
| writeStruct(Struct) | No* | No | No | |
| writeTime(Time) | Yes | No | No | |
| writeTimestamp(Timestamp) | Yes | No | No | |
| writeURL(URL) | No* | No | No |
NOTE: All methods on the
SQLXMLinterface must be fully implemented if the JDBC driver supports the data type.
| Method | Required? | Supported? | Covered? | Details |
|---|---|---|---|---|
| free() | Yes | No | No | |
| getBinaryStream() | Yes | No | No | |
| getCharacterStream() | Yes | No | No | |
| getSource(Class) | Yes | No | No | |
| getString() | Yes | No | No | |
| setBinaryStream() | Yes | No | No | |
| setCharacterStream() | Yes | No | No | |
| setResult(Class) | Yes | No | No | |
| setString(String) | Yes | No | No |
NOTE: * is not required to implement
execute(String sql, Statement.RETURN_GENERATED_KEYS)andexecuteUpdate(String sql, Statement.RETURN_GENERATED_KEYS)unless the driver supports generated keys.
NOTE: ** is not required to implement
getMoreResults(String sql, Statement.KEEP_CURRENT_RESULT | Statement.CLOSE_ALL_RESULTS)unlessDatabasemetaData.supportsMultipleOpenResults()returnstrue.
| Method | Required? | Supported? | Covered? | Details |
|---|---|---|---|---|
| addBatch(String) | Yes | No | No | |
| cancel() | No | No | No | |
| clearBatch() | Yes | No | No | |
| clearWarnings() | Yes | Yes | No | dumb |
| close() | Yes | Yes | Yes | |
| closeOnCompletion() | Yes | No | No | |
| execute(String) | Yes | Yes | Yes | |
| execute(String, String[]) | No | No | No | |
| execute(String, int[]) | No | No | No | |
| execute(String, int) | No* | No | No | |
| executeBatch() | Yes | No | No | |
| executeLargeBatch() | Yes | No | No | |
| executeLargeUpdate(String) | Yes | No | No | |
| executeLargeUpdate(String, String[]) | No | No | No | |
| executeLargeUpdate(String, int[]) | No | No | No | |
| executeLargeUpdate(String, int) | No* | No | No | |
| executeQuery(String) | Yes | Yes | Yes | |
| executeUpdate(String) | Yes | Yes | Yes | |
| executeUpdate(String, String[]) | No | No | No | |
| executeUpdate(String, int[]) | No | No | No | |
| executeUpdate(String, int) | No* | No | No | |
| getConnection() | Yes | Yes | Yes | |
| getFetchDirection() | Yes | Yes | No | FETCH_FORWARD only |
| getFetchSize() | Yes | No | No | |
| getGeneratedKeys() | No | No | No | |
| getLargeMaxRows() | Yes | No | No | |
| getLargeUpdateCount() | Yes | No | No | |
| getMaxFieldSize() | Yes | No | No | |
| getMaxRows() | Yes | Yes | Yes | |
| getMoreResults() | Yes | No | No | |
| getMoreResults(int) | No** | No | No | |
| getQueryTimeout() | Yes | No | No | |
| getResultSet() | Yes | Yes | Yes | |
| getResultSetConcurrency() | Yes | Yes | Yes | |
| getResultSetHoldability() | Yes | Yes | Yes | |
| getResultSetType() | Yes | Yes | Yes | |
| getUpdateCount() | Yes | Yes | Yes | |
| getWarnings() | Yes | Yes | No | dumb |
| isCloseOnCompletion() | Yes | No | No | |
| isClosed() | Yes | Yes | Yes | |
| isPoolable() | Yes | No | No | |
| setCursorName(String) | No | No | No | |
| setEscapeProcessing(boolean) | Yes | No | No | |
| setFetchDirection(int) | Yes | Yes | No | FETCH_FORWARD only |
| setFetchSize(int) | Yes | No | No | |
| setLargeMaxRows(long) | Yes | No | No | |
| setMaxFieldSize(int) | Yes | No | No | |
| setMaxRows(int) | Yes | Yes | No | |
| setPoolable(boolean) | Yes | No | No | |
| setQueryTimeout(int) | Yes | No | No |
NOTE: All methods on the
Structinterface must be fully implemented if the JDBC driver supports the data type.
| Method | Required? | Supported? | Covered? | Details |
|---|---|---|---|---|
| getAttributes() | Yes | No | No | |
| getAttributes(Map<String,Class<?>>) | Yes | No | No | |
| getSQLTypeName() | Yes | No | No |
NOTE: Wrapper is extended by
CallableStatement,Connection,DatabaseMetaData,ParameterMetaData,PreparedStatement,ResultSet,ResultSetMetaData, andStatementinterfaces and should be considered in scope of theirs implementations
NOTE: * must be implemented by
CallableStatementinterface if it's supported
| Method | Required? | Supported? | Covered? | Details |
|---|---|---|---|---|
| CallableStatement.isWrapperFor(Class<?>) | No* | No | No | |
| CallableStatement.unwrap(Class) | No* | No | No | |
| Connection.isWrapperFor(Class<?>) | Yes | Yes | Yes | |
| Connection.unwrap(Class) | Yes | Yes | Yes | |
| DatabaseMetaData.isWrapperFor(Class<?>) | Yes | Yes | Yes | |
| DatabaseMetaData.unwrap(Class) | Yes | Yes | Yes | |
| ParameterMetaData.isWrapperFor(Class<?>) | Yes | No | No | |
| ParameterMetaData.unwrap(Class) | Yes | No | No | |
| PreparedStatement.isWrapperFor(Class<?>) | Yes | Yes | Yes | |
| PreparedStatement.unwrap(Class) | Yes | Yes | Yes | |
| ResultSet.isWrapperFor(Class<?>) | Yes | Yes | Yes | |
| ResultSet.unwrap(Class) | Yes | Yes | Yes | |
| ResultSetMetaData.isWrapperFor(Class<?>) | Yes | Yes | Yes | |
| ResultSetMetaData.unwrap(Class) | Yes | Yes | Yes | |
| Statement.isWrapperFor(Class<?>) | Yes | Yes | Yes | |
| Statement.unwrap(Class) | Yes | Yes | Yes | |
| DataSource.isWrapperFor(Class<?>) | Yes | No | No | |
| SataSource.unwrap(Class) | Yes | No | No |
NOTE: All interfaces in
javax.sqlare optional with an exception forDataSourcewhich is required to be implemented. All optional interfaces are skipped for now.
| Interface | Required | Supported | Covered | Details |
|---|---|---|---|---|
| DataSource | 6/7 | 0/6 + 0/1 | 0/6 + 0/1 | #175 |
| Method | Required? | Supported? | Covered? | Details |
|---|---|---|---|---|
| getConnection() | Yes | No | No | |
| getConnection(String, String) | Yes | No | No | |
| getLogWriter() | Yes | No | No | |
| getLoginTimeout() | Yes | No | No | |
| getParentLogger() | No | No | No | |
| setLogWriter(PrintWriter out) | Yes | No | No | |
| setLoginTimeout(int seconds) | Yes | No | No |
Tarantool/SQL types are going to be more strict, so tables below will be updated to reflect current Tarantool and Tarantool/SQL types.
Mapping from Tarantool/SQL types into JDBC and Java types:
| Tarantool/SQL | JDBC | Java | Supported? | Details |
|---|---|---|---|---|
| FLOAT | Types.FLOAT | double | No | |
| DOUBLE | Types.DOUBLE | double | No | |
| REAL | Types.REAL | float | No | |
| INT | Types.INTEGER | BigInteger | No | |
| INTEGER | Types.INTEGER | BigInteger | No | |
| DECIMAL | Types.DECIMAL | BigDecimal | No | |
| DECIMAL(N) | Types.DECIMAL | BigDecimal | No | |
| DECIMAL(N, M) | Types.DECIMAL | BigDecimal | No | |
| NUMERIC | Types.NUMERIC | BigDecimal | No | |
| NUMERIC(N) | Types.NUMERIC | BigDecimal | No | |
| NUMERIC(N, M) | Types.NUMERIC | BigDecimal | No | |
| NUM | Types.NUMERIC | BigDecimal | No | |
| NUM(N) | Types.NUMERIC | BigDecimal | No | |
| NUM(N, M) | Types.NUMERIC | BigDecimal | No | |
| DATE | Types.DATE | java.sql.Date | No | blocked by #3694 |
| TIME | Types.TIME | java.sql.Time | No | blocked by #3694 |
| DATETIME | N/A | N/A | N/A | to be removed |
| TIMESTAMP | Types.TIMESTAMP | java.sql.Timestamp | No | blocked by #3694 |
| CHAR(N) | Types.CHAR | String | No | |
| VARCHAR(N) | Types.VARCHAR | String | No | |
| TEXT | Types.VARCHAR | String | No | |
| BLOB | Types.VARBINARY | byte[] | No | blocked by #3650, tracked by [#45][j#45] |
Mapping from Tarantool/SQL types into Tarantool native types (space format / index format) and additional Tarantool/SQL constraints (for reference):
| Tarantool/SQL | Tarantool native | Tarantool/SQL constraints |
|---|---|---|
| FLOAT | number | float64 for insert, native number (int+fp) for select |
| DOUBLE | number | float64 for insert, native number (int+fp) for select |
| REAL | number | float64 for insert, native number (int+fp) for select |
| INT | integer | -2^63 .. 2^63-1 for insert, native integer (-2^63 .. 2^64-1) for select; #3810 |
| INTEGER | integer | -2^63 .. 2^63-1 for insert, native integer (-2^63 .. 2^64-1) for select; #3810 |
| DECIMAL | number | same as REAL |
| DECIMAL(N) | number | same as REAL |
| DECIMAL(N, M) | number | same as REAL |
| NUMERIC | number | same as REAL |
| NUMERIC(N) | number | same as REAL |
| NUMERIC(N, M) | number | same as REAL |
| NUM | number | same as REAL |
| NUM(N) | number | same as REAL |
| NUM(N, M) | number | same as REAL |
| DATE | number | broken at all (blocked by #3694) |
| TIME | number | broken at all (blocked by #3694) |
| DATETIME | number | broken at all (blocked by #3694) |
| CHAR(N) | string | native string (of any length) |
| VARCHAR(N) | string | native string (of any length) |
| TEXT | string | native string (of any length) |
| BLOB | scalar | native scalar (blocked by #3650, tracked by [#45][j#45]) |
Tarantool native types, msgpack and Lua types (for reference):
| Tarantool native | Msgpack | Lua |
|---|---|---|
| integer | nil, pos/neg fixint, int/uint 8/16/32/64 | nil/box.NULL, number, cdata(int64_t), cdata(uint64_t) |
| number | nil, pos/neg fixint, int/uint 8/16/32/64, float 32/64 | nil/box.NULL, number, cdata(int64_t), cdata(uint64_t) |
| string | nil, fixstr, str 8/16/32 | nil/box.NULL, string |
| scalar | all above, bin 8/16/32, bool | all above, bool |
Transaction and isolation level metainformation methods correctly reports now that transactions do not supported, but they are marked as 'No' in 'Supported?' column. This is because JDBC compliant driver must support transactions and at least highest (serializable) isolation level, so just report that we don't support these features does not make our driver JDBC compliant. Also we cannot report serializable isolation level before transactions will be supported, because the API states we must report TRANSACTION_NONE isolation level when transactions does not supported (see DatabaseMetaData.supportsTransactions()).