This is an automated email from the ASF dual-hosted git repository.
zhangliang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/master by this push:
new 811833da53c Add SQLFederationResultSetMetaDataTest (#37296)
811833da53c is described below
commit 811833da53c475a349b5292a0ac82126d00ee9e0
Author: Liang Zhang <[email protected]>
AuthorDate: Mon Dec 8 00:50:30 2025 +0800
Add SQLFederationResultSetMetaDataTest (#37296)
* Add SQLFederationResultSetMetaDataTest
* Add SQLFederationResultSetMetaDataTest
---
.../resultset/SQLFederationResultSetMetaData.java | 5 +-
.../SQLFederationResultSetMetaDataTest.java | 385 +++++++++++++++++++++
2 files changed, 386 insertions(+), 4 deletions(-)
diff --git
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/resultset/SQLFederationResultSetMetaData.java
b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/resultset/SQLFederationResultSetMetaData.java
index 48250b1fb39..d21218b359d 100644
---
a/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/resultset/SQLFederationResultSetMetaData.java
+++
b/kernel/sql-federation/core/src/main/java/org/apache/shardingsphere/sqlfederation/resultset/SQLFederationResultSetMetaData.java
@@ -110,10 +110,7 @@ public final class SQLFederationResultSetMetaData extends
SQLFederationWrapperAd
@Override
public String getColumnLabel(final int column) {
- if (indexAndColumnLabels.size() < column) {
- return resultColumnType.getFieldList().get(column - 1).getName();
- }
- return indexAndColumnLabels.get(column);
+ return indexAndColumnLabels.size() < column ?
resultColumnType.getFieldList().get(column - 1).getName() :
indexAndColumnLabels.get(column);
}
@Override
diff --git
a/kernel/sql-federation/core/src/test/java/org/apache/shardingsphere/sqlfederation/resultset/SQLFederationResultSetMetaDataTest.java
b/kernel/sql-federation/core/src/test/java/org/apache/shardingsphere/sqlfederation/resultset/SQLFederationResultSetMetaDataTest.java
new file mode 100644
index 00000000000..92d10e25c96
--- /dev/null
+++
b/kernel/sql-federation/core/src/test/java/org/apache/shardingsphere/sqlfederation/resultset/SQLFederationResultSetMetaDataTest.java
@@ -0,0 +1,385 @@
+/*
+ * 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.shardingsphere.sqlfederation.resultset;
+
+import org.apache.calcite.avatica.SqlType;
+import org.apache.calcite.rel.type.RelDataType;
+import org.apache.calcite.rel.type.RelDataTypeFactory;
+import org.apache.calcite.rel.type.RelDataTypeFactoryImpl.JavaType;
+import org.apache.calcite.rel.type.RelDataTypeField;
+import org.apache.calcite.schema.Schema;
+import org.apache.calcite.schema.Table;
+import org.apache.calcite.schema.lookup.Lookup;
+import org.apache.calcite.sql.type.SqlTypeName;
+import org.apache.shardingsphere.database.connector.core.DefaultDatabase;
+import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
+import
org.apache.shardingsphere.infra.binder.context.segment.select.projection.Projection;
+import
org.apache.shardingsphere.infra.binder.context.segment.select.projection.impl.ColumnProjection;
+import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
+import
org.apache.shardingsphere.sqlfederation.resultset.converter.SQLFederationColumnTypeConverter;
+import org.junit.jupiter.api.Test;
+
+import java.math.BigInteger;
+import java.sql.ResultSetMetaData;
+import java.sql.Types;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+class SQLFederationResultSetMetaDataTest {
+
+ private final DatabaseType databaseType =
TypedSPILoader.getService(DatabaseType.class, "FIXTURE");
+
+ @Test
+ void assertGetColumnCount() {
+ Map<Integer, String> labels = new HashMap<>(2, 1F);
+ labels.put(1, "c1");
+ labels.put(2, "c2");
+ SQLFederationResultSetMetaData metaData = new
SQLFederationResultSetMetaData(mock(Schema.class), Collections.emptyList(),
+ databaseType, createResultType(new String[]{"c1", "c2"},
mock(RelDataType.class), mock(RelDataType.class)), labels,
mock(SQLFederationColumnTypeConverter.class));
+ assertThat(metaData.getColumnCount(), is(2));
+ }
+
+ @Test
+ void assertIsAutoIncrement() {
+ SQLFederationResultSetMetaData metaData = new
SQLFederationResultSetMetaData(mock(Schema.class), Collections.emptyList(),
+ databaseType, createResultType(new String[]{"c1"},
mock(RelDataType.class)), Collections.singletonMap(1, "c1"),
mock(SQLFederationColumnTypeConverter.class));
+ assertThat(metaData.isAutoIncrement(1), is(false));
+ }
+
+ @Test
+ void assertIsCaseSensitive() {
+ SQLFederationResultSetMetaData metaData = new
SQLFederationResultSetMetaData(mock(Schema.class), Collections.emptyList(),
+ databaseType, createResultType(new String[]{"c1"},
mock(RelDataType.class)), Collections.singletonMap(1, "c1"),
mock(SQLFederationColumnTypeConverter.class));
+ assertThat(metaData.isCaseSensitive(1), is(false));
+ }
+
+ @Test
+ void assertIsSearchable() {
+ SQLFederationResultSetMetaData metaData = new
SQLFederationResultSetMetaData(mock(Schema.class), Collections.emptyList(),
+ databaseType, createResultType(new String[]{"c1"},
mock(RelDataType.class)), Collections.singletonMap(1, "c1"),
mock(SQLFederationColumnTypeConverter.class));
+ assertThat(metaData.isSearchable(1), is(false));
+ }
+
+ @Test
+ void assertIsCurrency() {
+ SQLFederationResultSetMetaData metaData = new
SQLFederationResultSetMetaData(mock(Schema.class), Collections.emptyList(),
+ databaseType, createResultType(new String[]{"c1"},
mock(RelDataType.class)), Collections.singletonMap(1, "c1"),
mock(SQLFederationColumnTypeConverter.class));
+ assertThat(metaData.isCurrency(1), is(false));
+ }
+
+ @Test
+ void assertIsNullableWhenTableNotNullable() {
+ Schema schema = createSchemaWithTable("foo_tbl", createRowType(false,
0, 0));
+ SQLFederationResultSetMetaData metaData = new
SQLFederationResultSetMetaData(schema, Collections.singletonList(new
ColumnProjection("foo_tbl", "foo_col", null, databaseType)),
+ databaseType, createResultType(new String[]{"foo_col"},
mock(RelDataType.class)), Collections.singletonMap(1, "foo_label"),
mock(SQLFederationColumnTypeConverter.class));
+ assertThat(metaData.isNullable(1),
is(ResultSetMetaData.columnNoNulls));
+ }
+
+ @Test
+ void assertIsNullableWhenTableNullable() {
+ Schema schema = createSchemaWithTable("foo_tbl", createRowType(true,
0, 0));
+ SQLFederationResultSetMetaData metaData = new
SQLFederationResultSetMetaData(schema, Collections.singletonList(new
ColumnProjection("foo_tbl", "foo_col", null, databaseType)),
+ databaseType, createResultType(new String[]{"foo_col"},
mock(RelDataType.class)), Collections.singletonMap(1, "foo_label"),
mock(SQLFederationColumnTypeConverter.class));
+ assertThat(metaData.isNullable(1),
is(ResultSetMetaData.columnNullable));
+ }
+
+ @SuppressWarnings("unchecked")
+ @Test
+ void assertIsNullableWhenTableMissing() {
+ Lookup<Table> tables = mock(Lookup.class);
+ Schema schema = mock(Schema.class);
+ when(schema.tables()).thenReturn(tables);
+ SQLFederationResultSetMetaData metaData = new
SQLFederationResultSetMetaData(schema, Collections.singletonList(new
ColumnProjection("foo_tbl", "foo_col", null, databaseType)),
+ databaseType, createResultType(new String[]{"foo_col"},
mock(RelDataType.class)), Collections.singletonMap(1, "foo_label"),
mock(SQLFederationColumnTypeConverter.class));
+ assertThat(metaData.isNullable(1),
is(ResultSetMetaData.columnNullable));
+ }
+
+ @Test
+ void assertIsSigned() {
+ SQLFederationResultSetMetaData metaData = new
SQLFederationResultSetMetaData(mock(Schema.class), Collections.emptyList(),
+ databaseType, createResultType(new String[]{"c1"},
mock(RelDataType.class)), Collections.singletonMap(1, "c1"),
mock(SQLFederationColumnTypeConverter.class));
+ assertThat(metaData.isSigned(1), is(true));
+ }
+
+ @Test
+ void assertGetColumnDisplaySizeWithTable() {
+ Schema schema = createSchemaWithTable("foo_tbl", createRowType(false,
8, 0));
+ SQLFederationResultSetMetaData metaData = new
SQLFederationResultSetMetaData(schema, Collections.singletonList(new
ColumnProjection("foo_tbl", "foo_col", null, databaseType)),
+ databaseType, createResultType(new String[]{"foo_col"},
mock(RelDataType.class)), Collections.singletonMap(1, "foo_label"),
mock(SQLFederationColumnTypeConverter.class));
+ assertThat(metaData.getColumnDisplaySize(1), is(8));
+ }
+
+ @Test
+ void assertGetColumnDisplaySizeWithoutTable() {
+ SQLFederationResultSetMetaData metaData = new
SQLFederationResultSetMetaData(mock(Schema.class),
Collections.singletonList(mock(Projection.class)),
+ databaseType, createResultType(new String[]{"foo_col"},
mock(RelDataType.class)), Collections.singletonMap(1, "foo_label"),
mock(SQLFederationColumnTypeConverter.class));
+ assertThat(metaData.getColumnDisplaySize(1), is(0));
+ }
+
+ @Test
+ void assertGetColumnLabelFromIndexLabel() {
+ Map<Integer, String> labels = Collections.singletonMap(1, "foo_label");
+ SQLFederationResultSetMetaData metaData = new
SQLFederationResultSetMetaData(mock(Schema.class),
Collections.singletonList(mock(Projection.class)),
+ databaseType, createResultType(new String[]{"foo_col"},
mock(RelDataType.class)), labels, mock(SQLFederationColumnTypeConverter.class));
+ assertThat(metaData.getColumnLabel(1), is("foo_label"));
+ }
+
+ @Test
+ void assertGetColumnLabelFallbackToResultField() {
+ SQLFederationResultSetMetaData metaData = new
SQLFederationResultSetMetaData(mock(Schema.class),
Collections.singletonList(mock(Projection.class)),
+ databaseType, createResultType(new String[]{"foo_col"},
mock(RelDataType.class)), Collections.emptyMap(),
mock(SQLFederationColumnTypeConverter.class));
+ assertThat(metaData.getColumnLabel(1), is("foo_col"));
+ }
+
+ @Test
+ void assertGetTableNameWithAutoProjection() {
+ SQLFederationResultSetMetaData metaData = new
SQLFederationResultSetMetaData(mock(Schema.class), Collections.emptyList(),
+ databaseType, createResultType(new String[]{"foo_col"},
mock(RelDataType.class)), Collections.singletonMap(1, "foo_label"),
mock(SQLFederationColumnTypeConverter.class));
+ assertThat(metaData.getTableName(1), is(""));
+ }
+
+ @Test
+ void assertGetColumnLabelFallbackForSecondColumn() {
+ Map<Integer, String> labels = Collections.singletonMap(1, "foo_label");
+ SQLFederationResultSetMetaData metaData = new
SQLFederationResultSetMetaData(mock(Schema.class),
Collections.singletonList(mock(Projection.class)),
+ databaseType, createResultType(new String[]{"foo_col",
"col2"}, mock(RelDataType.class), mock(RelDataType.class)), labels,
mock(SQLFederationColumnTypeConverter.class));
+ assertThat(metaData.getColumnLabel(2), is("col2"));
+ }
+
+ @Test
+ void assertGetColumnNameFallbackForSecondColumn() {
+ Projection projection = mock(Projection.class);
+ when(projection.getColumnName()).thenReturn("projection_col1");
+ SQLFederationResultSetMetaData metaData = new
SQLFederationResultSetMetaData(mock(Schema.class),
Collections.singletonList(projection),
+ databaseType, createResultType(new String[]{"foo_col",
"col2"}, mock(RelDataType.class), mock(RelDataType.class)),
Collections.singletonMap(1, "foo_label"),
+ mock(SQLFederationColumnTypeConverter.class));
+ assertThat(metaData.getColumnName(2), is("col2"));
+ }
+
+ @Test
+ void assertGetColumnNameFromProjection() {
+ Projection projection = mock(Projection.class);
+ when(projection.getColumnName()).thenReturn("projection_col");
+ SQLFederationResultSetMetaData metaData = new
SQLFederationResultSetMetaData(mock(Schema.class),
Collections.singletonList(projection),
+ databaseType, createResultType(new String[]{"foo_col"},
mock(RelDataType.class)), Collections.singletonMap(1, "foo_label"),
mock(SQLFederationColumnTypeConverter.class));
+ assertThat(metaData.getColumnName(1), is("projection_col"));
+ }
+
+ @Test
+ void assertGetColumnNameFromResultType() {
+ SQLFederationResultSetMetaData metaData = new
SQLFederationResultSetMetaData(mock(Schema.class), Collections.emptyList(),
+ databaseType, createResultType(new String[]{"fallback_col"},
mock(RelDataType.class)), Collections.emptyMap(),
mock(SQLFederationColumnTypeConverter.class));
+ assertThat(metaData.getColumnName(1), is("fallback_col"));
+ }
+
+ @Test
+ void assertGetSchemaName() {
+ SQLFederationResultSetMetaData metaData = new
SQLFederationResultSetMetaData(mock(Schema.class), Collections.emptyList(),
+ databaseType, createResultType(new String[]{"foo_col"},
mock(RelDataType.class)), Collections.singletonMap(1, "foo_label"),
mock(SQLFederationColumnTypeConverter.class));
+ assertThat(metaData.getSchemaName(1), is(DefaultDatabase.LOGIC_NAME));
+ }
+
+ @Test
+ void assertGetPrecisionWithTable() {
+ Schema schema = createSchemaWithTable("foo_tbl", createRowType(false,
12, 0));
+ SQLFederationResultSetMetaData metaData = new
SQLFederationResultSetMetaData(schema, Collections.singletonList(new
ColumnProjection("foo_tbl", "foo_col", null, databaseType)),
+ databaseType, createResultType(new String[]{"foo_col"},
mock(RelDataType.class)), Collections.singletonMap(1, "foo_label"),
mock(SQLFederationColumnTypeConverter.class));
+ assertThat(metaData.getPrecision(1), is(12));
+ }
+
+ @Test
+ void assertGetPrecisionNotSpecified() {
+ Schema schema = createSchemaWithTable("foo_tbl", createRowType(false,
RelDataType.PRECISION_NOT_SPECIFIED, 0));
+ SQLFederationResultSetMetaData metaData = new
SQLFederationResultSetMetaData(schema, Collections.singletonList(new
ColumnProjection("foo_tbl", "foo_col", null, databaseType)),
+ databaseType, createResultType(new String[]{"foo_col"},
mock(RelDataType.class)), Collections.singletonMap(1, "foo_label"),
mock(SQLFederationColumnTypeConverter.class));
+ assertThat(metaData.getPrecision(1), is(0));
+ }
+
+ @Test
+ void assertGetPrecisionWithoutTable() {
+ SQLFederationResultSetMetaData metaData = new
SQLFederationResultSetMetaData(mock(Schema.class),
Collections.singletonList(mock(Projection.class)),
+ databaseType, createResultType(new String[]{"foo_col"},
mock(RelDataType.class)), Collections.singletonMap(1, "foo_label"),
mock(SQLFederationColumnTypeConverter.class));
+ assertThat(metaData.getPrecision(1), is(0));
+ }
+
+ @Test
+ void assertGetPrecisionWithAutoProjectionAndMatchedTable() {
+ Schema schema = createSchemaWithTable("", createRowType(false, 7, 0));
+ SQLFederationResultSetMetaData metaData = new
SQLFederationResultSetMetaData(schema, Collections.emptyList(),
+ databaseType, createResultType(new String[]{"foo_col"},
mock(RelDataType.class)), Collections.singletonMap(1, "foo_label"),
mock(SQLFederationColumnTypeConverter.class));
+ assertThat(metaData.getPrecision(1), is(7));
+ }
+
+ @Test
+ void assertGetScaleWithTable() {
+ Schema schema = createSchemaWithTable("foo_tbl", createRowType(false,
0, 4));
+ SQLFederationResultSetMetaData metaData = new
SQLFederationResultSetMetaData(schema, Collections.singletonList(new
ColumnProjection("foo_tbl", "foo_col", null, databaseType)),
+ databaseType, createResultType(new String[]{"foo_col"},
mock(RelDataType.class)), Collections.singletonMap(1, "foo_label"),
mock(SQLFederationColumnTypeConverter.class));
+ assertThat(metaData.getScale(1), is(4));
+ }
+
+ @Test
+ void assertGetScaleNotSpecified() {
+ Schema schema = createSchemaWithTable("foo_tbl", createRowType(false,
0, RelDataType.SCALE_NOT_SPECIFIED));
+ SQLFederationResultSetMetaData metaData = new
SQLFederationResultSetMetaData(schema, Collections.singletonList(new
ColumnProjection("foo_tbl", "foo_col", null, databaseType)),
+ databaseType, createResultType(new String[]{"foo_col"},
mock(RelDataType.class)), Collections.singletonMap(1, "foo_label"),
mock(SQLFederationColumnTypeConverter.class));
+ assertThat(metaData.getScale(1), is(0));
+ }
+
+ @Test
+ void assertGetScaleWithoutTable() {
+ SQLFederationResultSetMetaData metaData = new
SQLFederationResultSetMetaData(mock(Schema.class),
Collections.singletonList(mock(Projection.class)),
+ databaseType, createResultType(new String[]{"foo_col"},
mock(RelDataType.class)), Collections.singletonMap(1, "foo_label"),
mock(SQLFederationColumnTypeConverter.class));
+ assertThat(metaData.getScale(1), is(0));
+ }
+
+ @Test
+ void assertGetTableNameFromColumnProjection() {
+ SQLFederationResultSetMetaData metaData = new
SQLFederationResultSetMetaData(mock(Schema.class),
Collections.singletonList(new ColumnProjection("foo_tbl", "foo_col", null,
databaseType)),
+ databaseType, createResultType(new String[]{"foo_col"},
mock(RelDataType.class)), Collections.singletonMap(1, "foo_label"),
mock(SQLFederationColumnTypeConverter.class));
+ assertThat(metaData.getTableName(1), is("foo_tbl"));
+ }
+
+ @Test
+ void assertGetTableNameFromNonColumnProjection() {
+ SQLFederationResultSetMetaData metaData = new
SQLFederationResultSetMetaData(mock(Schema.class),
Collections.singletonList(mock(Projection.class)),
+ databaseType, createResultType(new String[]{"foo_col"},
mock(RelDataType.class)), Collections.singletonMap(1, "foo_label"),
mock(SQLFederationColumnTypeConverter.class));
+ assertThat(metaData.getTableName(1), is(""));
+ }
+
+ @Test
+ void assertGetCatalogName() {
+ SQLFederationResultSetMetaData metaData = new
SQLFederationResultSetMetaData(mock(Schema.class), Collections.emptyList(),
+ databaseType, createResultType(new String[]{"foo_col"},
mock(RelDataType.class)), Collections.singletonMap(1, "foo_label"),
mock(SQLFederationColumnTypeConverter.class));
+ assertThat(metaData.getCatalogName(1), is(DefaultDatabase.LOGIC_NAME));
+ }
+
+ @Test
+ void assertGetColumnTypeForBigInteger() {
+ JavaType javaBigIntegerType = mock(JavaType.class);
+ when(javaBigIntegerType.getJavaClass()).thenReturn(BigInteger.class);
+
when(javaBigIntegerType.getSqlTypeName()).thenReturn(SqlTypeName.DECIMAL);
+ RelDataType resultType = createResultType(new String[]{"foo_col"},
javaBigIntegerType);
+ SQLFederationResultSetMetaData metaData = new
SQLFederationResultSetMetaData(mock(), Collections.emptyList(), databaseType,
resultType, Collections.singletonMap(1, "foo_label"), mock());
+ assertThat(metaData.getColumnType(1), is(SqlType.BIGINT.id));
+ }
+
+ @Test
+ void assertGetColumnTypeForRegularType() {
+ RelDataType intType = mock(RelDataType.class);
+ when(intType.getSqlTypeName()).thenReturn(SqlTypeName.INTEGER);
+ SQLFederationColumnTypeConverter converter =
mock(SQLFederationColumnTypeConverter.class);
+
when(converter.convertColumnType(intType.getSqlTypeName())).thenReturn(Types.INTEGER);
+ SQLFederationResultSetMetaData metaData = new
SQLFederationResultSetMetaData(mock(Schema.class), Collections.emptyList(),
+ databaseType, createResultType(new String[]{"foo_col"},
intType), Collections.singletonMap(1, "foo_label"), converter);
+ assertThat(metaData.getColumnType(1), is(Types.INTEGER));
+ }
+
+ @Test
+ void assertGetColumnTypeNameWithMapping() {
+ RelDataType intType = mock(RelDataType.class);
+ when(intType.getSqlTypeName()).thenReturn(SqlTypeName.INTEGER);
+ SQLFederationColumnTypeConverter converter =
mock(SQLFederationColumnTypeConverter.class);
+
when(converter.convertColumnType(intType.getSqlTypeName())).thenReturn(Types.INTEGER);
+ SQLFederationResultSetMetaData metaData = new
SQLFederationResultSetMetaData(mock(Schema.class), Collections.emptyList(),
+ databaseType, createResultType(new String[]{"foo_col"},
intType), Collections.singletonMap(1, "foo_label"), converter);
+ assertThat(metaData.getColumnTypeName(1),
is(SqlTypeName.INTEGER.getName()));
+ }
+
+ @Test
+ void assertGetColumnTypeNameWithoutMapping() {
+ RelDataType varcharType = mock(RelDataType.class);
+ when(varcharType.getSqlTypeName()).thenReturn(SqlTypeName.VARCHAR);
+ SQLFederationColumnTypeConverter converter =
mock(SQLFederationColumnTypeConverter.class);
+
when(converter.convertColumnType(varcharType.getSqlTypeName())).thenReturn(999);
+ SQLFederationResultSetMetaData metaData = new
SQLFederationResultSetMetaData(mock(Schema.class), Collections.emptyList(),
+ databaseType, createResultType(new String[]{"foo_col"},
varcharType), Collections.singletonMap(1, "foo_label"), converter);
+ assertThat(metaData.getColumnTypeName(1),
is(SqlTypeName.VARCHAR.getName()));
+ }
+
+ @Test
+ void assertIsReadOnly() {
+ SQLFederationResultSetMetaData metaData = new
SQLFederationResultSetMetaData(mock(Schema.class), Collections.emptyList(),
+ databaseType, createResultType(new String[]{"foo_col"},
mock(RelDataType.class)), Collections.singletonMap(1, "foo_label"),
mock(SQLFederationColumnTypeConverter.class));
+ assertThat(metaData.isReadOnly(1), is(false));
+ }
+
+ @Test
+ void assertIsWritable() {
+ SQLFederationResultSetMetaData metaData = new
SQLFederationResultSetMetaData(mock(Schema.class), Collections.emptyList(),
+ databaseType, createResultType(new String[]{"foo_col"},
mock(RelDataType.class)), Collections.singletonMap(1, "foo_label"),
mock(SQLFederationColumnTypeConverter.class));
+ assertThat(metaData.isWritable(1), is(false));
+ }
+
+ @Test
+ void assertIsDefinitelyWritable() {
+ SQLFederationResultSetMetaData metaData = new
SQLFederationResultSetMetaData(mock(Schema.class), Collections.emptyList(),
+ databaseType, createResultType(new String[]{"foo_col"},
mock(RelDataType.class)), Collections.singletonMap(1, "foo_label"),
mock(SQLFederationColumnTypeConverter.class));
+ assertThat(metaData.isDefinitelyWritable(1), is(false));
+ }
+
+ @Test
+ void assertGetColumnClassName() {
+ RelDataType varcharType = mock(RelDataType.class);
+ when(varcharType.getSqlTypeName()).thenReturn(SqlTypeName.VARCHAR);
+ SQLFederationResultSetMetaData metaData = new
SQLFederationResultSetMetaData(mock(), Collections.emptyList(),
+ databaseType, createResultType(new String[]{"foo_col"},
varcharType), Collections.singletonMap(1, "foo_label"),
mock(SQLFederationColumnTypeConverter.class));
+ assertThat(metaData.getColumnClassName(1),
is(SqlTypeName.VARCHAR.getClass().getName()));
+ }
+
+ private RelDataType createRowType(final boolean nullable, final int
precision, final int scale) {
+ RelDataType result = mock(RelDataType.class);
+ when(result.isNullable()).thenReturn(nullable);
+ when(result.getPrecision()).thenReturn(precision);
+ when(result.getScale()).thenReturn(scale);
+ return result;
+ }
+
+ @SuppressWarnings("unchecked")
+ private Schema createSchemaWithTable(final String tableName, final
RelDataType rowType) {
+ Table table = mock(Table.class);
+
when(table.getRowType(any(RelDataTypeFactory.class))).thenReturn(rowType);
+ Lookup<Table> tables = mock(Lookup.class);
+ when(tables.get(tableName)).thenReturn(table);
+ Schema result = mock(Schema.class);
+ when(result.tables()).thenReturn(tables);
+ return result;
+ }
+
+ private RelDataType createResultType(final String[] names, final
RelDataType... types) {
+ List<RelDataTypeField> fields = new ArrayList<>(names.length);
+ for (int i = 0; i < names.length; i++) {
+ RelDataTypeField field = mock(RelDataTypeField.class);
+ when(field.getName()).thenReturn(names[i]);
+ when(field.getType()).thenReturn(types[i]);
+ fields.add(field);
+ }
+ RelDataType result = mock(RelDataType.class);
+ when(result.getFieldList()).thenReturn(fields);
+ return result;
+ }
+}