blob: 9ee39b37e39c6faaf34f83d0d213c0a606aa0390 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.drill.jdbc;
import static java.sql.Connection.TRANSACTION_NONE;
import static java.sql.Connection.TRANSACTION_READ_COMMITTED;
import static java.sql.Connection.TRANSACTION_READ_UNCOMMITTED;
import static java.sql.Connection.TRANSACTION_REPEATABLE_READ;
import static java.sql.Connection.TRANSACTION_SERIALIZABLE;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import org.apache.calcite.avatica.util.Quoting;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.SQLException;
import org.apache.drill.categories.JdbcTest;
import org.apache.drill.test.BaseTest;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.experimental.categories.Category;
/**
* Test for Drill's implementation of DatabaseMetaData's methods (other than
* those tested separately, e.g., {@code getColumn(...)}, tested in
* {@link DatabaseMetaDataGetColumnsTest})).
*/
@Category(JdbcTest.class)
public class DatabaseMetaDataTest extends BaseTest {
protected static Connection connection;
protected static DatabaseMetaData dbmd;
@BeforeClass
public static void setUpConnection() throws SQLException {
// (Note: Can't use JdbcTest's connect(...) because JdbcTest closes
// Connection--and other JDBC objects--on test method failure, but this test
// class uses some objects across methods.)
connection = new Driver().connect( "jdbc:drill:zk=local", null );
dbmd = connection.getMetaData();
}
@AfterClass
public static void tearDownConnection() throws SQLException {
connection.close();
}
// For matching order of java.sql.DatabaseMetaData:
//
// allProceduresAreCallable()
// allTablesAreSelectable()
// getURL()
// getUserName()
// isReadOnly()
@Test
public void testNullsAreSortedMethodsSaySortedHigh() throws SQLException {
assertThat( "DatabaseMetadata.nullsAreSortedHigh()",
dbmd.nullsAreSortedHigh(), equalTo( true ) );
assertThat( "DatabaseMetadata.nullsAreSortedLow()",
dbmd.nullsAreSortedLow(), equalTo( false ) );
assertThat( "DatabaseMetadata.nullsAreSortedAtEnd()",
dbmd.nullsAreSortedAtEnd(), equalTo( false ) );
assertThat( "DatabaseMetadata.nullsAreSortedAtStart()",
dbmd.nullsAreSortedAtStart(), equalTo( false ) );
}
// For matching order of java.sql.DatabaseMetaData:
//
// getDatabaseProductName()
// getDatabaseProductVersion()
// getDriverName()
// getDriverVersion()
// getDriverMajorVersion();
// getDriverMinorVersion();
// usesLocalFiles()
// usesLocalFilePerTable()
// supportsMixedCaseIdentifiers()
// storesUpperCaseIdentifiers()
// storesLowerCaseIdentifiers()
// storesMixedCaseIdentifiers()
// supportsMixedCaseQuotedIdentifiers()
// storesUpperCaseQuotedIdentifiers()
// storesLowerCaseQuotedIdentifiers()
// storesMixedCaseQuotedIdentifiers()
// TODO(DRILL-5402): Update when server meta information will be updated during one session.
@Test
public void testGetIdentifierQuoteString() throws SQLException {
// If connection string hasn't "quoting_identifiers" property, this method will return current system
// "planner.parser.quoting_identifiers" option (back tick by default)
assertThat(dbmd.getIdentifierQuoteString(), equalTo(Quoting.BACK_TICK.string));
}
// For matching order of java.sql.DatabaseMetaData:
//
// getSQLKeywords()
// getNumericFunctions()
// getStringFunctions()
// getSystemFunctions()
// getTimeDateFunctions()
// getSearchStringEscape()
// getExtraNameCharacters()
// supportsAlterTableWithAddColumn()
// supportsAlterTableWithDropColumn()
// supportsColumnAliasing()
// nullPlusNonNullIsNull()
// supportsConvert()
// supportsConvert(int fromType, int toType)
// supportsTableCorrelationNames()
// supportsDifferentTableCorrelationNames()
// supportsExpressionsInOrderBy()
// supportsOrderByUnrelated()
// supportsGroupBy()
// supportsGroupByUnrelated()
// supportsGroupByBeyondSelect()
// supportsLikeEscapeClause()
// supportsMultipleResultSets()
// supportsMultipleTransactions()
// supportsNonNullableColumns()
// supportsMinimumSQLGrammar()
// supportsCoreSQLGrammar()
// supportsExtendedSQLGrammar()
// supportsANSI92EntryLevelSQL()
// supportsANSI92IntermediateSQL()
// supportsANSI92FullSQL()
// supportsIntegrityEnhancementFacility()
// supportsOuterJoins()
// supportsFullOuterJoins()
// supportsLimitedOuterJoins()
// getSchemaTerm()
// getProcedureTerm()
// getCatalogTerm()
// isCatalogAtStart()
// getCatalogSeparator()
// supportsSchemasInDataManipulation()
// supportsSchemasInProcedureCalls()
// supportsSchemasInTableDefinitions()
// supportsSchemasInIndexDefinitions()
// supportsSchemasInPrivilegeDefinitions()
// supportsCatalogsInDataManipulation()
// supportsCatalogsInProcedureCalls()
// supportsCatalogsInTableDefinitions()
// supportsCatalogsInIndexDefinitions()
// supportsCatalogsInPrivilegeDefinitions()
// supportsPositionedDelete()
// supportsPositionedUpdate()
// supportsSelectForUpdate()
// supportsStoredProcedures()
// supportsSubqueriesInComparisons()
// supportsSubqueriesInExists()
// supportsSubqueriesInIns()
// supportsSubqueriesInQuantifieds()
// supportsCorrelatedSubqueries()
// supportsUnion()
// supportsUnionAll()
// supportsOpenCursorsAcrossCommit()
// supportsOpenCursorsAcrossRollback()
// supportsOpenStatementsAcrossCommit()
// supportsOpenStatementsAcrossRollback()
// getMaxBinaryLiteralLength()
// getMaxCharLiteralLength()
// getMaxColumnNameLength()
// getMaxColumnsInGroupBy()
// getMaxColumnsInIndex()
// getMaxColumnsInOrderBy()
// getMaxColumnsInSelect()
// getMaxColumnsInTable()
// getMaxConnections()
// getMaxCursorNameLength()
// getMaxIndexLength()
// getMaxSchemaNameLength()
// getMaxProcedureNameLength()
// getMaxCatalogNameLength()
// getMaxRowSize()
// doesMaxRowSizeIncludeBlobs()
// getMaxStatementLength()
// getMaxStatements()
// getMaxTableNameLength()
// getMaxTablesInSelect()
// getMaxUserNameLength()
// getDefaultTransactionIsolation()
// supportsTransactions()
// supportsTransactionIsolationLevel(int level)
// supportsDataDefinitionAndDataManipulationTransactions()
// supportsDataManipulationTransactionsOnly()
// dataDefinitionCausesTransactionCommit()
// dataDefinitionIgnoredInTransactions()
@Test
public void testGetDefaultTransactionIsolationSaysNone() throws SQLException {
assertThat( dbmd.getDefaultTransactionIsolation(), equalTo( TRANSACTION_NONE ) );
}
@Test
public void testSupportsTransactionsSaysNo() throws SQLException {
assertThat( dbmd.supportsTransactions(), equalTo( false ) );
}
@Test
public void testSupportsTransactionIsolationLevelNoneSaysYes()
throws SQLException {
assertTrue( dbmd.supportsTransactionIsolationLevel( TRANSACTION_NONE ) );
}
@Test
public void testSupportsTransactionIsolationLevelOthersSayNo()
throws SQLException {
assertFalse( dbmd.supportsTransactionIsolationLevel( TRANSACTION_READ_UNCOMMITTED ) );
assertFalse( dbmd.supportsTransactionIsolationLevel( TRANSACTION_READ_COMMITTED ) );
assertFalse( dbmd.supportsTransactionIsolationLevel( TRANSACTION_REPEATABLE_READ ) );
assertFalse( dbmd.supportsTransactionIsolationLevel( TRANSACTION_SERIALIZABLE ) );
}
@Test
public void testGetProceduresReturnsNonNull() throws SQLException {
assertThat( dbmd.getProcedures( null, null, "%" ), notNullValue() );
}
// TODO: Later, test more (e.g., right columns (even if/though zero rows)).
@Test
public void testGetProcedureColumnsReturnsNonNull() throws SQLException {
assertThat( dbmd.getProcedureColumns( null, null, "%", "%" ), notNullValue() );
}
// TODO: Later, test more (e.g., right columns (even if/though zero rows)).
// For matching order of java.sql.DatabaseMetaData:
//
// getTables(String catalog, String schemaPattern, String tableNamePattern, String types[])
// getSchemas()
// getCatalogs()
@Test
public void testGetTableTypesReturnsNonNull() throws SQLException {
assertThat( dbmd.getTableTypes(), notNullValue() );
}
// TODO: Later, test more (e.g., right columns (even if/though zero rows)).
// For matching order of java.sql.DatabaseMetaData:
//
// getColumns(String catalog, String schemaPattern, String tableNamePattern, String columnNamePattern)
@Test
public void testGetColumnPrivilegesReturnsNonNull() throws SQLException {
assertThat( dbmd.getColumnPrivileges( null, null, "%", "%" ), notNullValue() );
}
// TODO: Later, test more (e.g., right columns (even if/though zero rows)).
@Test
public void testGetTablePrivilegesReturnsNonNull() throws SQLException {
assertThat( dbmd.getTablePrivileges( null, null, "%" ), notNullValue() );
}
// TODO: Later, test more (e.g., right columns (even if/though zero rows)).
@Test
public void testGetBestRowIdentifierReturnsNonNull() throws SQLException {
assertThat( dbmd.getBestRowIdentifier( null, null, "%", DatabaseMetaData.bestRowTemporary, true ), notNullValue() );
}
// TODO: Later, test more (e.g., right columns (even if/though zero rows)).
@Test
public void testGetVersionColumnsReturnsNonNull() throws SQLException {
assertThat( dbmd.getVersionColumns( null, null, "%" ), notNullValue() );
}
// TODO: Later, test more (e.g., right columns (even if/though zero rows)).
@Test
public void testGetPrimaryKeysReturnsNonNull() throws SQLException {
assertThat( dbmd.getPrimaryKeys( null, null, "%" ), notNullValue() );
}
// TODO: Later, test more (e.g., right columns (even if/though zero rows)).
@Test
public void testGetImportedKeysReturnsNonNull() throws SQLException {
assertThat( dbmd.getImportedKeys( null, null, "%" ), notNullValue() );
}
// TODO: Later, test more (e.g., right columns (even if/though zero rows)).
@Test
public void testGetExportedKeysReturnsNonNull() throws SQLException {
assertThat( dbmd.getExportedKeys( null, null, "%" ), notNullValue() );
}
// TODO: Later, test more (e.g., right columns (even if/though zero rows)).
@Test
public void testGetCrossReferenceReturnsNonNull() throws SQLException {
assertThat( dbmd.getCrossReference( null, null, "%", null, null, "%" ), notNullValue() );
}
// TODO: Later, test more (e.g., right columns (even if/though zero rows)).
@Test
public void testGetTypeInfoReturnsNonNull() throws SQLException {
assertThat( dbmd.getTypeInfo(), notNullValue() );
}
// TODO: Later, test more (e.g., right columns (even if/though zero rows)).
@Test
public void testGetIndexInfoReturnsNonNull() throws SQLException {
assertThat( dbmd.getIndexInfo( null, null, "%", false, true ), notNullValue() );
}
// TODO: Later, test more (e.g., right columns (even if/though zero rows)).
// For matching order of java.sql.DatabaseMetaData:
//
// --------------------------JDBC 2.0-----------------------------
// supportsResultSetType(int type)
// supportsResultSetConcurrency(int type, int concurrency)
// ownUpdatesAreVisible(int type)
// ownDeletesAreVisible(int type)
// ownInsertsAreVisible(int type)
// othersUpdatesAreVisible(int type)
// othersDeletesAreVisible(int type)
// othersInsertsAreVisible(int type)
// updatesAreDetected(int type)
// deletesAreDetected(int type)
// insertsAreDetected(int type)
// supportsBatchUpdates()
@Test
public void testGetUDTsReturnsNonNull() throws SQLException {
assertThat( dbmd.getUDTs( null, null, "%", null ), notNullValue() );
}
// TODO: Later, test more (e.g., right columns (even if/though zero rows)).
// For matching order of java.sql.DatabaseMetaData:
// getConnection()
// ------------------- JDBC 3.0 -------------------------
// supportsSavepoints()
// supportsNamedParameters()
// supportsMultipleOpenResults()
// supportsGetGeneratedKeys()
@Test
public void testGetSuperTypesReturnsNonNull() throws SQLException {
assertThat( dbmd.getSuperTypes( null, "%", "%" ), notNullValue() );
}
// TODO: Later, test more (e.g., right columns (even if/though zero rows)).
@Test
public void testGetSuperTablesReturnsNonNull() throws SQLException {
assertThat( dbmd.getSuperTables( null, "%", "%" ), notNullValue() );
}
// TODO: Later, test more (e.g., right columns (even if/though zero rows)).
@Test
public void testGetAttributesReturnsNonNull() throws SQLException {
assertThat( dbmd.getAttributes( null, null, "%", "%" ), notNullValue() );
}
// TODO: Later, test more (e.g., right columns (even if/though zero rows)).
// For matching order of java.sql.DatabaseMetaData:
//
// supportsResultSetHoldability(int holdability)
// getResultSetHoldability()
// getDatabaseMajorVersion()
// getDatabaseMinorVersion()
// getJDBCMajorVersion()
// getJDBCMinorVersion()
// getSQLStateType()
// locatorsUpdateCopy()
// supportsStatementPooling()
//- ------------------------ JDBC 4.0 -----------------------------------
// getRowIdLifetime()
// getSchemas(String catalog, String schemaPattern)
// getSchemas(String, String)
@Test
public void testGetClientInfoPropertiesReturnsNonNull() throws SQLException {
assertThat( dbmd.getClientInfoProperties(), notNullValue() );
}
// TODO: Later, test more (e.g., right columns (even if/though zero rows)).
@Test
public void testGetFunctionsReturnsNonNull() throws SQLException {
assertThat( dbmd.getFunctions( null, "%", "%" ), notNullValue() );
}
// TODO: Later, test more (e.g., right columns (even if/though zero rows)).
@Test
public void testGetFunctionColumnsReturnsNonNull() throws SQLException {
assertThat( dbmd.getFunctionColumns( null, null, "%", null ), notNullValue() );
}
// TODO: Later, test more (e.g., right columns (even if/though zero rows)).
// For matching order of java.sql.DatabaseMetaData:
//
// supportsStoredFunctionsUsingCallSyntax()
// autoCommitFailureClosesAllResultSets()
//??--------------------------JDBC 4.1 -----------------------------
@Test
public void testGetPseudoColumnsReturnsNonNull() throws SQLException {
assertThat( dbmd.getPseudoColumns( null, null, "%", "%" ), notNullValue() );
}
// TODO: Later, test more (e.g., right columns (even if/though zero rows)).
// For matching order of java.sql.DatabaseMetaData:
//
// generatedKeyAlwaysReturned()
}