@Test public void testMetadataWithFloatAndDoubleCol() { SchemaTableName schemaTableName = new SchemaTableName("exa_ple", "table_with_float_col"); JdbcTableHandle table = jdbcClient.getTableHandle(schemaTableName); assertNotNull(table, "table is null"); assertEquals(jdbcClient.getColumns(session, table), ImmutableList.of( new JdbcColumnHandle(CONNECTOR_ID, "COL1", JDBC_BIGINT, BIGINT), new JdbcColumnHandle(CONNECTOR_ID, "COL2", JDBC_DOUBLE, DOUBLE), new JdbcColumnHandle(CONNECTOR_ID, "COL3", JDBC_DOUBLE, DOUBLE), new JdbcColumnHandle(CONNECTOR_ID, "COL4", JDBC_REAL, REAL))); } }
@Test public void testEquivalence() { EquivalenceTester.equivalenceTester() .addEquivalentGroup( new JdbcColumnHandle("connectorId", "columnName", JDBC_VARCHAR, VARCHAR), new JdbcColumnHandle("connectorId", "columnName", JDBC_VARCHAR, VARCHAR), new JdbcColumnHandle("connectorId", "columnName", JDBC_BIGINT, BIGINT), new JdbcColumnHandle("connectorId", "columnName", JDBC_VARCHAR, VARCHAR)) .addEquivalentGroup( new JdbcColumnHandle("connectorIdX", "columnName", JDBC_VARCHAR, VARCHAR), new JdbcColumnHandle("connectorIdX", "columnName", JDBC_VARCHAR, VARCHAR), new JdbcColumnHandle("connectorIdX", "columnName", JDBC_BIGINT, BIGINT), new JdbcColumnHandle("connectorIdX", "columnName", JDBC_VARCHAR, VARCHAR)) .addEquivalentGroup( new JdbcColumnHandle("connectorId", "columnNameX", JDBC_VARCHAR, VARCHAR), new JdbcColumnHandle("connectorId", "columnNameX", JDBC_VARCHAR, VARCHAR), new JdbcColumnHandle("connectorId", "columnNameX", JDBC_BIGINT, BIGINT), new JdbcColumnHandle("connectorId", "columnNameX", JDBC_VARCHAR, VARCHAR)) .check(); } }
@Test public void testJsonRoundTrip() { assertJsonRoundTrip(COLUMN_CODEC, new JdbcColumnHandle("connectorId", "columnName", JDBC_VARCHAR, VARCHAR)); }
@Override public List<JdbcColumnHandle> getColumns(ConnectorSession session, JdbcTableHandle tableHandle) { try (Connection connection = connectionFactory.openConnection()) { try (ResultSet resultSet = getColumns(tableHandle, connection.getMetaData())) { List<JdbcColumnHandle> columns = new ArrayList<>(); while (resultSet.next()) { JdbcTypeHandle typeHandle = new JdbcTypeHandle( resultSet.getInt("DATA_TYPE"), resultSet.getInt("COLUMN_SIZE"), resultSet.getInt("DECIMAL_DIGITS")); Optional<ReadMapping> columnMapping = toPrestoType(session, typeHandle); // skip unsupported column types if (columnMapping.isPresent()) { String columnName = resultSet.getString("COLUMN_NAME"); columns.add(new JdbcColumnHandle(connectorId, columnName, typeHandle, columnMapping.get().getType())); } } if (columns.isEmpty()) { // In rare cases (e.g. PostgreSQL) a table might have no columns. throw new TableNotFoundException(tableHandle.getSchemaTableName()); } return ImmutableList.copyOf(columns); } } catch (SQLException e) { throw new PrestoException(JDBC_ERROR, e); } }
@Test public void testGetColumnTypes() { RecordSet recordSet = new JdbcRecordSet(jdbcClient, session, split, ImmutableList.of( new JdbcColumnHandle("test", "text", JDBC_VARCHAR, VARCHAR), new JdbcColumnHandle("test", "text_short", JDBC_VARCHAR, createVarcharType(32)), new JdbcColumnHandle("test", "value", JDBC_BIGINT, BIGINT))); assertEquals(recordSet.getColumnTypes(), ImmutableList.of(VARCHAR, createVarcharType(32), BIGINT)); recordSet = new JdbcRecordSet(jdbcClient, session, split, ImmutableList.of( new JdbcColumnHandle("test", "value", JDBC_BIGINT, BIGINT), new JdbcColumnHandle("test", "text", JDBC_VARCHAR, VARCHAR))); assertEquals(recordSet.getColumnTypes(), ImmutableList.of(BIGINT, VARCHAR)); recordSet = new JdbcRecordSet(jdbcClient, session, split, ImmutableList.of( new JdbcColumnHandle("test", "value", JDBC_BIGINT, BIGINT), new JdbcColumnHandle("test", "value", JDBC_BIGINT, BIGINT), new JdbcColumnHandle("test", "text", JDBC_VARCHAR, VARCHAR))); assertEquals(recordSet.getColumnTypes(), ImmutableList.of(BIGINT, BIGINT, VARCHAR)); recordSet = new JdbcRecordSet(jdbcClient, session, split, ImmutableList.of()); assertEquals(recordSet.getColumnTypes(), ImmutableList.of()); }
@Test public void testMetadataWithSchemaPattern() { SchemaTableName schemaTableName = new SchemaTableName("exa_ple", "num_ers"); JdbcTableHandle table = jdbcClient.getTableHandle(schemaTableName); assertNotNull(table, "table is null"); assertEquals(jdbcClient.getColumns(session, table), ImmutableList.of( new JdbcColumnHandle(CONNECTOR_ID, "TE_T", JDBC_VARCHAR, VARCHAR), new JdbcColumnHandle(CONNECTOR_ID, "VA%UE", JDBC_BIGINT, BIGINT))); }
@Test public void getColumnMetadata() { assertEquals( metadata.getColumnMetadata(SESSION, tableHandle, new JdbcColumnHandle(CONNECTOR_ID, "text", JDBC_VARCHAR, VARCHAR)), new ColumnMetadata("text", VARCHAR)); }
new JdbcColumnHandle("test_id", "col_0", JDBC_BIGINT, BIGINT), new JdbcColumnHandle("test_id", "col_1", JDBC_DOUBLE, DOUBLE), new JdbcColumnHandle("test_id", "col_2", JDBC_BOOLEAN, BOOLEAN), new JdbcColumnHandle("test_id", "col_3", JDBC_VARCHAR, VARCHAR), new JdbcColumnHandle("test_id", "col_4", JDBC_DATE, DATE), new JdbcColumnHandle("test_id", "col_5", JDBC_TIME, TIME), new JdbcColumnHandle("test_id", "col_6", JDBC_TIMESTAMP, TIMESTAMP), new JdbcColumnHandle("test_id", "col_7", JDBC_TINYINT, TINYINT), new JdbcColumnHandle("test_id", "col_8", JDBC_SMALLINT, SMALLINT), new JdbcColumnHandle("test_id", "col_9", JDBC_INTEGER, INTEGER), new JdbcColumnHandle("test_id", "col_10", JDBC_REAL, REAL), new JdbcColumnHandle("test_id", "col_11", JDBC_CHAR, charType));
@Test public void testGetColumnHandles() { // known table assertEquals(metadata.getColumnHandles(SESSION, tableHandle), ImmutableMap.of( "text", new JdbcColumnHandle(CONNECTOR_ID, "TEXT", JDBC_VARCHAR, VARCHAR), "text_short", new JdbcColumnHandle(CONNECTOR_ID, "TEXT_SHORT", JDBC_VARCHAR, createVarcharType(32)), "value", new JdbcColumnHandle(CONNECTOR_ID, "VALUE", JDBC_BIGINT, BIGINT))); // unknown table unknownTableColumnHandle(new JdbcTableHandle(CONNECTOR_ID, new SchemaTableName("unknown", "unknown"), "unknown", "unknown", "unknown")); unknownTableColumnHandle(new JdbcTableHandle(CONNECTOR_ID, new SchemaTableName("example", "numbers"), null, "example", "unknown")); }
@Test public void testMetadata() { assertTrue(jdbcClient.getSchemaNames().containsAll(ImmutableSet.of("example", "tpch"))); assertEquals(jdbcClient.getTableNames("example"), ImmutableList.of( new SchemaTableName("example", "numbers"), new SchemaTableName("example", "view_source"), new SchemaTableName("example", "view"))); assertEquals(jdbcClient.getTableNames("tpch"), ImmutableList.of( new SchemaTableName("tpch", "lineitem"), new SchemaTableName("tpch", "orders"))); SchemaTableName schemaTableName = new SchemaTableName("example", "numbers"); JdbcTableHandle table = jdbcClient.getTableHandle(schemaTableName); assertNotNull(table, "table is null"); assertEquals(table.getCatalogName(), catalogName.toUpperCase(ENGLISH)); assertEquals(table.getSchemaName(), "EXAMPLE"); assertEquals(table.getTableName(), "NUMBERS"); assertEquals(table.getSchemaTableName(), schemaTableName); assertEquals(jdbcClient.getColumns(session, table), ImmutableList.of( new JdbcColumnHandle(CONNECTOR_ID, "TEXT", JDBC_VARCHAR, VARCHAR), new JdbcColumnHandle(CONNECTOR_ID, "TEXT_SHORT", JDBC_VARCHAR, createVarcharType(32)), new JdbcColumnHandle(CONNECTOR_ID, "VALUE", JDBC_BIGINT, BIGINT))); }
@Test public void testMetadataWithFloatAndDoubleCol() { SchemaTableName schemaTableName = new SchemaTableName("exa_ple", "table_with_float_col"); JdbcTableHandle table = jdbcClient.getTableHandle(schemaTableName); assertNotNull(table, "table is null"); assertEquals(jdbcClient.getColumns(session, table), ImmutableList.of( new JdbcColumnHandle(CONNECTOR_ID, "COL1", JDBC_BIGINT, BIGINT), new JdbcColumnHandle(CONNECTOR_ID, "COL2", JDBC_DOUBLE, DOUBLE), new JdbcColumnHandle(CONNECTOR_ID, "COL3", JDBC_DOUBLE, DOUBLE), new JdbcColumnHandle(CONNECTOR_ID, "COL4", JDBC_REAL, REAL))); } }
@Test public void testEquivalence() { EquivalenceTester.equivalenceTester() .addEquivalentGroup( new JdbcColumnHandle("connectorId", "columnName", JDBC_VARCHAR, VARCHAR), new JdbcColumnHandle("connectorId", "columnName", JDBC_VARCHAR, VARCHAR), new JdbcColumnHandle("connectorId", "columnName", JDBC_BIGINT, BIGINT), new JdbcColumnHandle("connectorId", "columnName", JDBC_VARCHAR, VARCHAR)) .addEquivalentGroup( new JdbcColumnHandle("connectorIdX", "columnName", JDBC_VARCHAR, VARCHAR), new JdbcColumnHandle("connectorIdX", "columnName", JDBC_VARCHAR, VARCHAR), new JdbcColumnHandle("connectorIdX", "columnName", JDBC_BIGINT, BIGINT), new JdbcColumnHandle("connectorIdX", "columnName", JDBC_VARCHAR, VARCHAR)) .addEquivalentGroup( new JdbcColumnHandle("connectorId", "columnNameX", JDBC_VARCHAR, VARCHAR), new JdbcColumnHandle("connectorId", "columnNameX", JDBC_VARCHAR, VARCHAR), new JdbcColumnHandle("connectorId", "columnNameX", JDBC_BIGINT, BIGINT), new JdbcColumnHandle("connectorId", "columnNameX", JDBC_VARCHAR, VARCHAR)) .check(); } }
@Test public void testJsonRoundTrip() { assertJsonRoundTrip(COLUMN_CODEC, new JdbcColumnHandle("connectorId", "columnName", JDBC_VARCHAR, VARCHAR)); }
@Test public void testGetColumnTypes() { RecordSet recordSet = new JdbcRecordSet(jdbcClient, session, split, ImmutableList.of( new JdbcColumnHandle("test", "text", JDBC_VARCHAR, VARCHAR), new JdbcColumnHandle("test", "text_short", JDBC_VARCHAR, createVarcharType(32)), new JdbcColumnHandle("test", "value", JDBC_BIGINT, BIGINT))); assertEquals(recordSet.getColumnTypes(), ImmutableList.of(VARCHAR, createVarcharType(32), BIGINT)); recordSet = new JdbcRecordSet(jdbcClient, session, split, ImmutableList.of( new JdbcColumnHandle("test", "value", JDBC_BIGINT, BIGINT), new JdbcColumnHandle("test", "text", JDBC_VARCHAR, VARCHAR))); assertEquals(recordSet.getColumnTypes(), ImmutableList.of(BIGINT, VARCHAR)); recordSet = new JdbcRecordSet(jdbcClient, session, split, ImmutableList.of( new JdbcColumnHandle("test", "value", JDBC_BIGINT, BIGINT), new JdbcColumnHandle("test", "value", JDBC_BIGINT, BIGINT), new JdbcColumnHandle("test", "text", JDBC_VARCHAR, VARCHAR))); assertEquals(recordSet.getColumnTypes(), ImmutableList.of(BIGINT, BIGINT, VARCHAR)); recordSet = new JdbcRecordSet(jdbcClient, session, split, ImmutableList.of()); assertEquals(recordSet.getColumnTypes(), ImmutableList.of()); }
@Override public List<JdbcColumnHandle> getColumns(JdbcTableHandle tableHandle) { try (Connection connection = driver.connect(connectionUrl, connectionProperties)) { try (ResultSet resultSet = getColumns(tableHandle, connection.getMetaData())) { List<JdbcColumnHandle> columns = new ArrayList<>(); boolean found = false; while (resultSet.next()) { found = true; Type columnType = toPrestoType(resultSet.getInt("DATA_TYPE")); // skip unsupported column types if (columnType != null) { String columnName = resultSet.getString("COLUMN_NAME"); columns.add(new JdbcColumnHandle(connectorId, columnName, columnType)); } } if (!found) { throw new TableNotFoundException(tableHandle.getSchemaTableName()); } if (columns.isEmpty()) { throw new PrestoException(NOT_SUPPORTED, "Table has no supported column types: " + tableHandle.getSchemaTableName()); } return ImmutableList.copyOf(columns); } } catch (SQLException e) { throw new PrestoException(JDBC_ERROR, e); } }
@Test public void testMetadataWithSchemaPattern() { SchemaTableName schemaTableName = new SchemaTableName("exa_ple", "num_ers"); JdbcTableHandle table = jdbcClient.getTableHandle(schemaTableName); assertNotNull(table, "table is null"); assertEquals(jdbcClient.getColumns(session, table), ImmutableList.of( new JdbcColumnHandle(CONNECTOR_ID, "TE_T", JDBC_VARCHAR, VARCHAR), new JdbcColumnHandle(CONNECTOR_ID, "VA%UE", JDBC_BIGINT, BIGINT))); }
@Test public void getColumnMetadata() { assertEquals( metadata.getColumnMetadata(SESSION, tableHandle, new JdbcColumnHandle(CONNECTOR_ID, "text", JDBC_VARCHAR, VARCHAR)), new ColumnMetadata("text", VARCHAR)); }
new JdbcColumnHandle("test_id", "col_0", JDBC_BIGINT, BIGINT), new JdbcColumnHandle("test_id", "col_1", JDBC_DOUBLE, DOUBLE), new JdbcColumnHandle("test_id", "col_2", JDBC_BOOLEAN, BOOLEAN), new JdbcColumnHandle("test_id", "col_3", JDBC_VARCHAR, VARCHAR), new JdbcColumnHandle("test_id", "col_4", JDBC_DATE, DATE), new JdbcColumnHandle("test_id", "col_5", JDBC_TIME, TIME), new JdbcColumnHandle("test_id", "col_6", JDBC_TIMESTAMP, TIMESTAMP), new JdbcColumnHandle("test_id", "col_7", JDBC_TINYINT, TINYINT), new JdbcColumnHandle("test_id", "col_8", JDBC_SMALLINT, SMALLINT), new JdbcColumnHandle("test_id", "col_9", JDBC_INTEGER, INTEGER), new JdbcColumnHandle("test_id", "col_10", JDBC_REAL, REAL), new JdbcColumnHandle("test_id", "col_11", JDBC_CHAR, charType));
@Test public void testGetColumnHandles() { // known table assertEquals(metadata.getColumnHandles(SESSION, tableHandle), ImmutableMap.of( "text", new JdbcColumnHandle(CONNECTOR_ID, "TEXT", JDBC_VARCHAR, VARCHAR), "text_short", new JdbcColumnHandle(CONNECTOR_ID, "TEXT_SHORT", JDBC_VARCHAR, createVarcharType(32)), "value", new JdbcColumnHandle(CONNECTOR_ID, "VALUE", JDBC_BIGINT, BIGINT))); // unknown table unknownTableColumnHandle(new JdbcTableHandle(CONNECTOR_ID, new SchemaTableName("unknown", "unknown"), "unknown", "unknown", "unknown")); unknownTableColumnHandle(new JdbcTableHandle(CONNECTOR_ID, new SchemaTableName("example", "numbers"), null, "example", "unknown")); }
@Test public void testMetadata() { assertTrue(jdbcClient.getSchemaNames().containsAll(ImmutableSet.of("example", "tpch"))); assertEquals(jdbcClient.getTableNames("example"), ImmutableList.of( new SchemaTableName("example", "numbers"), new SchemaTableName("example", "view_source"), new SchemaTableName("example", "view"))); assertEquals(jdbcClient.getTableNames("tpch"), ImmutableList.of( new SchemaTableName("tpch", "lineitem"), new SchemaTableName("tpch", "orders"))); SchemaTableName schemaTableName = new SchemaTableName("example", "numbers"); JdbcTableHandle table = jdbcClient.getTableHandle(schemaTableName); assertNotNull(table, "table is null"); assertEquals(table.getCatalogName(), catalogName.toUpperCase(ENGLISH)); assertEquals(table.getSchemaName(), "EXAMPLE"); assertEquals(table.getTableName(), "NUMBERS"); assertEquals(table.getSchemaTableName(), schemaTableName); assertEquals(jdbcClient.getColumns(session, table), ImmutableList.of( new JdbcColumnHandle(CONNECTOR_ID, "TEXT", JDBC_VARCHAR, VARCHAR), new JdbcColumnHandle(CONNECTOR_ID, "TEXT_SHORT", JDBC_VARCHAR, createVarcharType(32)), new JdbcColumnHandle(CONNECTOR_ID, "VALUE", JDBC_BIGINT, BIGINT))); }