Skip to content

Commit 7d78f46

Browse files
committed
SQL: fall back to using the field name for column label (#38842)
(cherry picked from commit 0567bf2)
1 parent 335cf91 commit 7d78f46

File tree

6 files changed

+133
-8
lines changed

6 files changed

+133
-8
lines changed

x-pack/plugin/sql/jdbc/src/main/java/org/elasticsearch/xpack/sql/jdbc/JdbcColumnInfo.java

+6-4
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77

88
import java.util.Objects;
99

10+
import static org.elasticsearch.xpack.sql.client.StringUtils.EMPTY;
11+
1012
class JdbcColumnInfo {
1113
public final String catalog;
1214
public final String schema;
@@ -52,17 +54,17 @@ int displaySize() {
5254
@Override
5355
public String toString() {
5456
StringBuilder b = new StringBuilder();
55-
if (false == "".equals(table)) {
57+
if (false == EMPTY.equals(table)) {
5658
b.append(table).append('.');
5759
}
5860
b.append(name).append("<type=[").append(type).append(']');
59-
if (false == "".equals(catalog)) {
61+
if (false == EMPTY.equals(catalog)) {
6062
b.append(" catalog=[").append(catalog).append(']');
6163
}
62-
if (false == "".equals(schema)) {
64+
if (false == EMPTY.equals(schema)) {
6365
b.append(" schema=[").append(schema).append(']');
6466
}
65-
if (false == "".equals(label)) {
67+
if (false == EMPTY.equals(label)) {
6668
b.append(" label=[").append(label).append(']');
6769
}
6870
return b.append('>').toString();

x-pack/plugin/sql/jdbc/src/main/java/org/elasticsearch/xpack/sql/jdbc/JdbcResultSetMetaData.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import java.util.Locale;
1212

1313
import static java.lang.String.format;
14+
import static org.elasticsearch.xpack.sql.client.StringUtils.EMPTY;
1415

1516
class JdbcResultSetMetaData implements ResultSetMetaData, JdbcWrapper {
1617

@@ -70,7 +71,8 @@ public int getColumnDisplaySize(int column) throws SQLException {
7071

7172
@Override
7273
public String getColumnLabel(int column) throws SQLException {
73-
return column(column).label;
74+
JdbcColumnInfo info = column(column);
75+
return true == EMPTY.equals(info.label) ? info.name : info.label;
7476
}
7577

7678
@Override
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
/*
2+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3+
* or more contributor license agreements. Licensed under the Elastic License;
4+
* you may not use this file except in compliance with the Elastic License.
5+
*/
6+
7+
package org.elasticsearch.xpack.sql.jdbc;
8+
9+
import org.elasticsearch.test.ESTestCase;
10+
11+
import java.sql.ResultSetMetaData;
12+
import java.sql.SQLException;
13+
import java.util.Arrays;
14+
import java.util.List;
15+
16+
import static org.elasticsearch.xpack.sql.client.StringUtils.EMPTY;
17+
18+
public class JdbcResultSetMetaDataTests extends ESTestCase {
19+
20+
private final List<JdbcColumnInfo> columns = Arrays.asList(
21+
new JdbcColumnInfo("test_keyword", EsType.KEYWORD, EMPTY, EMPTY, EMPTY, EMPTY, 0),
22+
new JdbcColumnInfo("test_integer", EsType.INTEGER, EMPTY, EMPTY, EMPTY, EMPTY, 11),
23+
new JdbcColumnInfo("test_double", EsType.DOUBLE, EMPTY, EMPTY, EMPTY, EMPTY, 25),
24+
new JdbcColumnInfo("test_long", EsType.LONG, "test_table", "test", "schema", "custom_label", 20)
25+
);
26+
private final JdbcResultSetMetaData metaData = new JdbcResultSetMetaData(null, columns);
27+
28+
public void testColumnsProperties() throws SQLException {
29+
int maxColumnIndex = columns.size();
30+
assertEquals(false, metaData.isAutoIncrement(randomIntBetween(1, maxColumnIndex)));
31+
assertEquals(true, metaData.isCaseSensitive(randomIntBetween(1, maxColumnIndex)));
32+
assertEquals(true, metaData.isSearchable(randomIntBetween(1, maxColumnIndex)));
33+
assertEquals(false, metaData.isCurrency(randomIntBetween(1, maxColumnIndex)));
34+
assertEquals(ResultSetMetaData.columnNullableUnknown, metaData.isNullable(randomIntBetween(1, maxColumnIndex)));
35+
assertEquals(false, metaData.isSigned(1));
36+
assertEquals(true, metaData.isSigned(2));
37+
assertEquals(true, metaData.isSigned(3));
38+
assertEquals(true, metaData.isSigned(4));
39+
}
40+
41+
public void testColumnNamesAndLabels() throws SQLException {
42+
assertEquals("test_keyword", metaData.getColumnName(1));
43+
assertEquals("test_integer", metaData.getColumnName(2));
44+
assertEquals("test_double", metaData.getColumnName(3));
45+
assertEquals("test_long", metaData.getColumnName(4));
46+
47+
assertEquals("test_keyword", metaData.getColumnLabel(1));
48+
assertEquals("test_integer", metaData.getColumnLabel(2));
49+
assertEquals("test_double", metaData.getColumnLabel(3));
50+
assertEquals("custom_label", metaData.getColumnLabel(4));
51+
}
52+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
/*
2+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3+
* or more contributor license agreements. Licensed under the Elastic License;
4+
* you may not use this file except in compliance with the Elastic License.
5+
*/
6+
7+
package org.elasticsearch.xpack.sql.qa.single_node;
8+
9+
import org.elasticsearch.xpack.sql.qa.jdbc.ResultSetMetaDataTestCase;
10+
11+
public class JdbcResultSetMetaDataIT extends ResultSetMetaDataTestCase {
12+
13+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
/*
2+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3+
* or more contributor license agreements. Licensed under the Elastic License;
4+
* you may not use this file except in compliance with the Elastic License.
5+
*/
6+
7+
package org.elasticsearch.xpack.sql.qa.jdbc;
8+
9+
import org.elasticsearch.common.CheckedConsumer;
10+
11+
import java.sql.Connection;
12+
import java.sql.PreparedStatement;
13+
import java.sql.ResultSet;
14+
import java.sql.ResultSetMetaData;
15+
import java.sql.SQLException;
16+
17+
public class ResultSetMetaDataTestCase extends JdbcIntegrationTestCase {
18+
19+
private final String[] fieldsNames = new String[] {"test_byte", "test_integer", "test_long", "test_short",
20+
"test_double", "test_float", "test_keyword", "test_boolean", "test_date"};
21+
22+
public void testValidGetObjectCalls() throws Exception {
23+
ResultSetTestCase.createIndex("test");
24+
ResultSetTestCase.updateMapping("test", builder -> {
25+
for(String field : fieldsNames) {
26+
builder.startObject(field).field("type", field.substring(5)).endObject();
27+
}
28+
});
29+
30+
String q = "SELECT test_byte, test_integer, test_long, test_short, test_double, test_float, test_keyword, "
31+
+ "test_boolean, test_date FROM test";
32+
doWithQuery(q, (r) -> assertColumnNamesAndLabels(r.getMetaData(), fieldsNames));
33+
34+
q = "SELECT test_byte AS b, test_integer AS i, test_long AS l, test_short AS s, test_double AS d, test_float AS f, "
35+
+ "test_keyword AS k, test_boolean AS bool, test_date AS dt FROM test";
36+
doWithQuery(q, (r) -> assertColumnNamesAndLabels(r.getMetaData(), new String[] {"b", "i", "l", "s", "d", "f", "k", "bool", "dt"}));
37+
}
38+
39+
private void doWithQuery(String query, CheckedConsumer<ResultSet, SQLException> consumer) throws SQLException {
40+
try (Connection connection = esJdbc()) {
41+
try (PreparedStatement statement = connection.prepareStatement(query)) {
42+
try (ResultSet results = statement.executeQuery()) {
43+
assertEquals(fieldsNames.length, results.getMetaData().getColumnCount());
44+
consumer.accept(results);
45+
}
46+
}
47+
}
48+
}
49+
50+
private void assertColumnNamesAndLabels(ResultSetMetaData metaData, String[] names) throws SQLException {
51+
for(int i = 0; i < fieldsNames.length; i++) {
52+
assertEquals(names[i], metaData.getColumnName(i + 1));
53+
assertEquals(names[i], metaData.getColumnLabel(i + 1));
54+
}
55+
}
56+
}

x-pack/plugin/sql/qa/src/main/java/org/elasticsearch/xpack/sql/qa/jdbc/ResultSetTestCase.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -1262,7 +1262,7 @@ private void doWithQueryAndTimezone(String query, String tz, CheckedConsumer<Res
12621262
}
12631263
}
12641264

1265-
private void createIndex(String index) throws Exception {
1265+
protected static void createIndex(String index) throws Exception {
12661266
Request request = new Request("PUT", "/" + index);
12671267
XContentBuilder createIndex = JsonXContent.contentBuilder().startObject();
12681268
createIndex.startObject("settings");
@@ -1282,7 +1282,7 @@ private void createIndex(String index) throws Exception {
12821282
client().performRequest(request);
12831283
}
12841284

1285-
private void updateMapping(String index, CheckedConsumer<XContentBuilder, IOException> body) throws Exception {
1285+
protected static void updateMapping(String index, CheckedConsumer<XContentBuilder, IOException> body) throws Exception {
12861286
Request request = new Request("PUT", "/" + index + "/_mapping");
12871287
XContentBuilder updateMapping = JsonXContent.contentBuilder().startObject();
12881288
updateMapping.startObject("properties");
@@ -1460,7 +1460,7 @@ private Map<String,Number> createTestDataForNumericValueTypes(Supplier<Number> r
14601460
return map;
14611461
}
14621462

1463-
private void updateMappingForNumericValuesTests(String indexName) throws Exception {
1463+
private static void updateMappingForNumericValuesTests(String indexName) throws Exception {
14641464
updateMapping(indexName, builder -> {
14651465
for(String field : fieldsNames) {
14661466
builder.startObject(field).field("type", field.substring(5)).endObject();

0 commit comments

Comments
 (0)