Skip to content

Commit 423b3b0

Browse files
committed
SQL: Skip the nested and object field types in case of an ODBC request (#37948)
(cherry picked from commit 908c8de)
1 parent 702e959 commit 423b3b0

File tree

2 files changed

+97
-42
lines changed
  • x-pack/plugin/sql/src

2 files changed

+97
-42
lines changed

x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/plan/logical/command/sys/SysColumns.java

Lines changed: 41 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@
1515
import org.elasticsearch.xpack.sql.session.Rows;
1616
import org.elasticsearch.xpack.sql.session.SchemaRowSet;
1717
import org.elasticsearch.xpack.sql.session.SqlSession;
18-
import org.elasticsearch.xpack.sql.tree.Source;
1918
import org.elasticsearch.xpack.sql.tree.NodeInfo;
19+
import org.elasticsearch.xpack.sql.tree.Source;
2020
import org.elasticsearch.xpack.sql.type.DataType;
2121
import org.elasticsearch.xpack.sql.type.DataTypes;
2222
import org.elasticsearch.xpack.sql.type.EsField;
@@ -133,42 +133,46 @@ static void fillInRows(String clusterName, String indexName, Map<String, EsField
133133
EsField field = entry.getValue();
134134
DataType type = field.getDataType();
135135

136-
if (columnMatcher == null || columnMatcher.matcher(name).matches()) {
137-
rows.add(asList(clusterName,
138-
// schema is not supported
139-
null,
140-
indexName,
141-
name,
142-
odbcCompatible(type.sqlType.getVendorTypeNumber(), isOdbcClient),
143-
type.esType.toUpperCase(Locale.ROOT),
144-
type.displaySize,
145-
// TODO: is the buffer_length correct?
146-
type.size,
147-
// no DECIMAL support
148-
null,
149-
odbcCompatible(DataTypes.metaSqlRadix(type), isOdbcClient),
150-
// everything is nullable
151-
odbcCompatible(DatabaseMetaData.columnNullable, isOdbcClient),
152-
// no remarks
153-
null,
154-
// no column def
155-
null,
156-
// SQL_DATA_TYPE apparently needs to be same as DATA_TYPE except for datetime and interval data types
157-
odbcCompatible(DataTypes.metaSqlDataType(type), isOdbcClient),
158-
// SQL_DATETIME_SUB ?
159-
odbcCompatible(DataTypes.metaSqlDateTimeSub(type), isOdbcClient),
160-
// char octet length
161-
type.isString() || type == DataType.BINARY ? type.size : null,
162-
// position
163-
pos,
164-
"YES",
165-
null,
166-
null,
167-
null,
168-
null,
169-
"NO",
170-
"NO"
171-
));
136+
// skip the nested and object types only for ODBC
137+
// https://github.com/elastic/elasticsearch/issues/35376
138+
if (type.isPrimitive() || !isOdbcClient) {
139+
if (columnMatcher == null || columnMatcher.matcher(name).matches()) {
140+
rows.add(asList(clusterName,
141+
// schema is not supported
142+
null,
143+
indexName,
144+
name,
145+
odbcCompatible(type.sqlType.getVendorTypeNumber(), isOdbcClient),
146+
type.esType.toUpperCase(Locale.ROOT),
147+
type.displaySize,
148+
// TODO: is the buffer_length correct?
149+
type.size,
150+
// no DECIMAL support
151+
null,
152+
odbcCompatible(DataTypes.metaSqlRadix(type), isOdbcClient),
153+
// everything is nullable
154+
odbcCompatible(DatabaseMetaData.columnNullable, isOdbcClient),
155+
// no remarks
156+
null,
157+
// no column def
158+
null,
159+
// SQL_DATA_TYPE apparently needs to be same as DATA_TYPE except for datetime and interval data types
160+
odbcCompatible(DataTypes.metaSqlDataType(type), isOdbcClient),
161+
// SQL_DATETIME_SUB ?
162+
odbcCompatible(DataTypes.metaSqlDateTimeSub(type), isOdbcClient),
163+
// char octet length
164+
type.isString() || type == DataType.BINARY ? type.size : null,
165+
// position
166+
pos,
167+
"YES",
168+
null,
169+
null,
170+
null,
171+
null,
172+
"NO",
173+
"NO"
174+
));
175+
}
172176
}
173177
if (field.getProperties() != null) {
174178
fillInRows(clusterName, indexName, field.getProperties(), name, rows, columnMatcher, isOdbcClient);

x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/plan/logical/command/sys/SysColumnsTests.java

Lines changed: 56 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ public void testSysColumns() {
6161
public void testSysColumnsInOdbcMode() {
6262
List<List<?>> rows = new ArrayList<>();
6363
SysColumns.fillInRows("test", "index", TypesTests.loadMapping("mapping-multi-field-variation.json", true), null, rows, null, true);
64-
assertEquals(16, rows.size());
64+
assertEquals(14, rows.size());
6565
assertEquals(24, rows.get(0).size());
6666

6767
List<?> row = rows.get(0);
@@ -90,6 +90,16 @@ public void testSysColumnsInOdbcMode() {
9090
assertEquals(Short.class, sqlDataType(row).getClass());
9191
assertEquals(Short.class, sqlDataTypeSub(row).getClass());
9292

93+
row = rows.get(3);
94+
assertEquals("keyword", name(row));
95+
assertEquals((short) Types.VARCHAR, sqlType(row));
96+
assertEquals(null, radix(row));
97+
assertEquals(Integer.MAX_VALUE, bufferLength(row));
98+
assertNull(decimalPrecision(row));
99+
assertEquals(Short.class, nullable(row).getClass());
100+
assertEquals(Short.class, sqlDataType(row).getClass());
101+
assertEquals(Short.class, sqlDataTypeSub(row).getClass());
102+
93103
row = rows.get(4);
94104
assertEquals("date", name(row));
95105
assertEquals((short) Types.TIMESTAMP, sqlType(row));
@@ -101,17 +111,58 @@ public void testSysColumnsInOdbcMode() {
101111
assertEquals(Short.class, sqlDataType(row).getClass());
102112
assertEquals(Short.class, sqlDataTypeSub(row).getClass());
103113

114+
row = rows.get(5);
115+
assertEquals("unsupported", name(row));
116+
assertEquals((short) Types.OTHER, sqlType(row));
117+
assertEquals(null, radix(row));
118+
assertEquals(0, precision(row));
119+
assertEquals(0, bufferLength(row));
120+
assertNull(decimalPrecision(row));
121+
assertEquals(Short.class, nullable(row).getClass());
122+
assertEquals(Short.class, sqlDataType(row).getClass());
123+
assertEquals(Short.class, sqlDataTypeSub(row).getClass());
124+
125+
row = rows.get(6);
126+
assertEquals("some.dotted.field", name(row));
127+
assertEquals((short) Types.VARCHAR, sqlType(row));
128+
assertEquals(null, radix(row));
129+
assertEquals(Integer.MAX_VALUE, bufferLength(row));
130+
assertNull(decimalPrecision(row));
131+
assertEquals(Short.class, nullable(row).getClass());
132+
assertEquals(Short.class, sqlDataType(row).getClass());
133+
assertEquals(Short.class, sqlDataTypeSub(row).getClass());
134+
104135
row = rows.get(7);
105-
assertEquals("some.dotted", name(row));
106-
assertEquals((short) Types.STRUCT, sqlType(row));
136+
assertEquals("some.string", name(row));
137+
assertEquals((short) Types.VARCHAR, sqlType(row));
107138
assertEquals(null, radix(row));
108-
assertEquals(-1, bufferLength(row));
139+
assertEquals(Integer.MAX_VALUE, bufferLength(row));
109140
assertNull(decimalPrecision(row));
110141
assertEquals(Short.class, nullable(row).getClass());
111142
assertEquals(Short.class, sqlDataType(row).getClass());
112143
assertEquals(Short.class, sqlDataTypeSub(row).getClass());
113144

114-
row = rows.get(15);
145+
row = rows.get(8);
146+
assertEquals("some.string.normalized", name(row));
147+
assertEquals((short) Types.VARCHAR, sqlType(row));
148+
assertEquals(null, radix(row));
149+
assertEquals(Integer.MAX_VALUE, bufferLength(row));
150+
assertNull(decimalPrecision(row));
151+
assertEquals(Short.class, nullable(row).getClass());
152+
assertEquals(Short.class, sqlDataType(row).getClass());
153+
assertEquals(Short.class, sqlDataTypeSub(row).getClass());
154+
155+
row = rows.get(9);
156+
assertEquals("some.string.typical", name(row));
157+
assertEquals((short) Types.VARCHAR, sqlType(row));
158+
assertEquals(null, radix(row));
159+
assertEquals(Integer.MAX_VALUE, bufferLength(row));
160+
assertNull(decimalPrecision(row));
161+
assertEquals(Short.class, nullable(row).getClass());
162+
assertEquals(Short.class, sqlDataType(row).getClass());
163+
assertEquals(Short.class, sqlDataTypeSub(row).getClass());
164+
165+
row = rows.get(13);
115166
assertEquals("some.ambiguous.normalized", name(row));
116167
assertEquals((short) Types.VARCHAR, sqlType(row));
117168
assertEquals(null, radix(row));

0 commit comments

Comments
 (0)