Skip to content

Commit c23677c

Browse files
authored
SQL: Fix ODBC metadata for DATE & TIME data types (#55316)
Fix MINIMUM_SCALE, MAXIMUM_SCALE and SQL_DATETIME_SUB ODBC metadata for the DATE & TIME data types. Fixes: #42086
1 parent d77dfb6 commit c23677c

File tree

2 files changed

+23
-7
lines changed

2 files changed

+23
-7
lines changed

x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/type/SqlDataTypes.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -653,6 +653,12 @@ public static Integer metaSqlDateTimeSub(DataType t) {
653653
if (t == DATETIME) {
654654
// ODBC SQL_CODE_TIMESTAMP
655655
return Integer.valueOf(3);
656+
} else if (t == DATE) {
657+
// ODBC SQL_CODE_DATE
658+
return Integer.valueOf(1);
659+
} else if (t == TIME) {
660+
// ODBC SQL_CODE_TIME
661+
return Integer.valueOf(2);
656662
}
657663
// ODBC null
658664
return 0;
@@ -675,7 +681,7 @@ private static Short metaSqlSameScale(DataType t) {
675681
if (t.isInteger()) {
676682
return Short.valueOf((short) 0);
677683
}
678-
if (isDateBased(t) || t.isRational()) {
684+
if (t == DATETIME || t == TIME || t.isRational()) {
679685
return Short.valueOf((short) defaultPrecision(t));
680686
}
681687
return null;

x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/type/SqlDataTypesTests.java

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import static org.elasticsearch.xpack.ql.type.DataTypes.KEYWORD;
2121
import static org.elasticsearch.xpack.ql.type.DataTypes.LONG;
2222
import static org.elasticsearch.xpack.sql.expression.literal.interval.Intervals.compatibleInterval;
23+
import static org.elasticsearch.xpack.sql.type.SqlDataTypes.DATE;
2324
import static org.elasticsearch.xpack.sql.type.SqlDataTypes.INTERVAL_DAY;
2425
import static org.elasticsearch.xpack.sql.type.SqlDataTypes.INTERVAL_DAY_TO_HOUR;
2526
import static org.elasticsearch.xpack.sql.type.SqlDataTypes.INTERVAL_DAY_TO_MINUTE;
@@ -33,6 +34,7 @@
3334
import static org.elasticsearch.xpack.sql.type.SqlDataTypes.INTERVAL_SECOND;
3435
import static org.elasticsearch.xpack.sql.type.SqlDataTypes.INTERVAL_YEAR;
3536
import static org.elasticsearch.xpack.sql.type.SqlDataTypes.INTERVAL_YEAR_TO_MONTH;
37+
import static org.elasticsearch.xpack.sql.type.SqlDataTypes.TIME;
3638
import static org.elasticsearch.xpack.sql.type.SqlDataTypes.defaultPrecision;
3739
import static org.elasticsearch.xpack.sql.type.SqlDataTypes.isInterval;
3840
import static org.elasticsearch.xpack.sql.type.SqlDataTypes.metaSqlDataType;
@@ -45,24 +47,32 @@
4547
public class SqlDataTypesTests extends ESTestCase {
4648

4749
public void testMetadataType() {
50+
assertEquals(Integer.valueOf(91), metaSqlDataType(DATE));
51+
assertEquals(Integer.valueOf(92), metaSqlDataType(TIME));
4852
assertEquals(Integer.valueOf(9), metaSqlDataType(DATETIME));
4953
DataType t = randomDataTypeNoDateTime();
5054
assertEquals(sqlType(t).getVendorTypeNumber(), metaSqlDataType(t));
5155
}
5256

5357
public void testMetaDateTypeSub() {
58+
assertEquals(Integer.valueOf(1), metaSqlDateTimeSub(DATE));
59+
assertEquals(Integer.valueOf(2), metaSqlDateTimeSub(TIME));
5460
assertEquals(Integer.valueOf(3), metaSqlDateTimeSub(DATETIME));
5561
assertEquals(Integer.valueOf(0), metaSqlDateTimeSub(randomDataTypeNoDateTime()));
5662
}
5763

5864
public void testMetaMinimumScale() {
65+
assertNull(metaSqlMinimumScale(DATE));
66+
assertEquals(Short.valueOf((short) 3), metaSqlMinimumScale(TIME));
5967
assertEquals(Short.valueOf((short) 3), metaSqlMinimumScale(DATETIME));
6068
assertEquals(Short.valueOf((short) 0), metaSqlMinimumScale(LONG));
6169
assertEquals(Short.valueOf((short) defaultPrecision(FLOAT)), metaSqlMaximumScale(FLOAT));
6270
assertNull(metaSqlMinimumScale(KEYWORD));
6371
}
6472

6573
public void testMetaMaximumScale() {
74+
assertNull(metaSqlMinimumScale(DATE));
75+
assertEquals(Short.valueOf((short) 3), metaSqlMinimumScale(TIME));
6676
assertEquals(Short.valueOf((short) 3), metaSqlMaximumScale(DATETIME));
6777
assertEquals(Short.valueOf((short) 0), metaSqlMaximumScale(LONG));
6878
assertEquals(Short.valueOf((short) defaultPrecision(FLOAT)), metaSqlMaximumScale(FLOAT));
@@ -78,7 +88,7 @@ public void testMetaRadix() {
7888

7989

8090
// type checks
81-
public void testIsInterval() throws Exception {
91+
public void testIsInterval() {
8292
for (DataType dataType : asList(INTERVAL_YEAR,
8393
INTERVAL_MONTH,
8494
INTERVAL_DAY,
@@ -96,14 +106,14 @@ public void testIsInterval() throws Exception {
96106
}
97107
}
98108

99-
public void testIntervalCompatibilityYearMonth() throws Exception {
109+
public void testIntervalCompatibilityYearMonth() {
100110
assertEquals(INTERVAL_YEAR_TO_MONTH, compatibleInterval(INTERVAL_YEAR, INTERVAL_MONTH));
101111
assertEquals(INTERVAL_YEAR_TO_MONTH, compatibleInterval(INTERVAL_YEAR, INTERVAL_YEAR_TO_MONTH));
102112
assertEquals(INTERVAL_YEAR_TO_MONTH, compatibleInterval(INTERVAL_MONTH, INTERVAL_YEAR));
103113
assertEquals(INTERVAL_YEAR_TO_MONTH, compatibleInterval(INTERVAL_MONTH, INTERVAL_YEAR_TO_MONTH));
104114
}
105115

106-
public void testIntervalCompatibilityDayTime() throws Exception {
116+
public void testIntervalCompatibilityDayTime() {
107117
assertEquals(INTERVAL_DAY_TO_HOUR, compatibleInterval(INTERVAL_DAY, INTERVAL_HOUR));
108118
assertEquals(INTERVAL_DAY_TO_HOUR, compatibleInterval(INTERVAL_DAY_TO_HOUR, INTERVAL_HOUR));
109119
assertEquals(INTERVAL_DAY_TO_MINUTE, compatibleInterval(INTERVAL_DAY, INTERVAL_MINUTE));
@@ -121,14 +131,14 @@ public void testIntervalCompatibilityDayTime() throws Exception {
121131
assertEquals(INTERVAL_MINUTE_TO_SECOND, compatibleInterval(INTERVAL_SECOND, INTERVAL_MINUTE));
122132
}
123133

124-
public void testIncompatibleInterval() throws Exception {
134+
public void testIncompatibleInterval() {
125135
assertNull(compatibleInterval(INTERVAL_YEAR, INTERVAL_SECOND));
126136
assertNull(compatibleInterval(INTERVAL_YEAR, INTERVAL_DAY_TO_HOUR));
127137
assertNull(compatibleInterval(INTERVAL_HOUR, INTERVAL_MONTH));
128138
assertNull(compatibleInterval(INTERVAL_MINUTE_TO_SECOND, INTERVAL_MONTH));
129139
}
130140

131-
public void testEsToDataType() throws Exception {
141+
public void testEsToDataType() {
132142
List<String> types = new ArrayList<>(Arrays.asList("null", "boolean", "bool",
133143
"byte", "tinyint",
134144
"short", "smallint",
@@ -157,6 +167,6 @@ public void testEsToDataType() throws Exception {
157167
}
158168

159169
private DataType randomDataTypeNoDateTime() {
160-
return randomValueOtherThan(DATETIME, () -> randomFrom(SqlDataTypes.types()));
170+
return randomValueOtherThanMany(SqlDataTypes::isDateOrTimeBased, () -> randomFrom(SqlDataTypes.types()));
161171
}
162172
}

0 commit comments

Comments
 (0)