Skip to content

Commit 736053c

Browse files
authored
SQL: Return functions in JDBC driver metadata (elastic#33672)
Update JDBC database metadata to advertised the supported functions Add aliases to some date/time functions to match the ODBC spec Fix elastic#33671
1 parent 0b4960f commit 736053c

File tree

5 files changed

+239
-195
lines changed

5 files changed

+239
-195
lines changed

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

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -179,14 +179,34 @@ public String getSQLKeywords() throws SQLException {
179179

180180
@Override
181181
public String getNumericFunctions() throws SQLException {
182-
// TODO: sync this with the grammar
183-
return "";
182+
//https://docs.microsoft.com/en-us/sql/odbc/reference/appendixes/numeric-functions?view=sql-server-2017
183+
return "ABS,ACOS,ASIN,ATAN,ATAN2,"
184+
+ "CEILING,COS,"
185+
+ "DEGREES,"
186+
+ "EXP,"
187+
+ "FLOOR,"
188+
+ "LOG,LOG10,"
189+
+ "MOD,"
190+
+ "PI,POWER,"
191+
+ "RADIANS,RAND,ROUND,"
192+
+ "SIGN,SIN,SQRT,"
193+
+ "TAN";
184194
}
185195

186196
@Override
187197
public String getStringFunctions() throws SQLException {
188-
// TODO: sync this with the grammar
189-
return "";
198+
//https://docs.microsoft.com/en-us/sql/odbc/reference/appendixes/string-functions?view=sql-server-2017
199+
return "ASCII,"
200+
+ "BIT_LENGTH,"
201+
+ "CHAR,CHAR_LENGTH,CHARACTER_LENGTH,CONCAT,"
202+
+ "INSERT,"
203+
+ "LCASE,LEFT,LENGTH,LOCATE,LTRIM,"
204+
// waiting on https://github.com/elastic/elasticsearch/issues/33477
205+
//+ "OCTET_LENGTH,"
206+
+ "POSITION,"
207+
+ "REPEAT,REPLACE,RIGHT,RTRIM,"
208+
+ "SPACE,SUBSTRING,"
209+
+ "UCASE";
190210
}
191211

192212
@Override
@@ -197,7 +217,15 @@ public String getSystemFunctions() throws SQLException {
197217

198218
@Override
199219
public String getTimeDateFunctions() throws SQLException {
200-
return "";
220+
//https://docs.microsoft.com/en-us/sql/odbc/reference/appendixes/time-date-and-interval-functions?view=sql-server-2017
221+
return "DAYNAME,DAYOFMONTH,DAYOFWEEK,DAYOFYEAR"
222+
+ "EXTRACT,"
223+
+ "HOUR,"
224+
+ "MINUTE,MONTH,MONTHNAME"
225+
+ "QUARTER,"
226+
+ "SECOND,"
227+
+ "WEEK,"
228+
+ "YEAR";
201229
}
202230

203231
@Override

x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/expression/function/FunctionRegistry.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -116,9 +116,9 @@ public class FunctionRegistry {
116116
def(Kurtosis.class, Kurtosis::new),
117117
// Scalar functions
118118
// Date
119-
def(DayOfMonth.class, DayOfMonth::new, "DAY", "DOM"),
120-
def(DayOfWeek.class, DayOfWeek::new, "DOW"),
121-
def(DayOfYear.class, DayOfYear::new, "DOY"),
119+
def(DayOfMonth.class, DayOfMonth::new, "DAYOFMONTH", "DAY", "DOM"),
120+
def(DayOfWeek.class, DayOfWeek::new, "DAYOFWEEK", "DOW"),
121+
def(DayOfYear.class, DayOfYear::new, "DAYOFYEAR", "DOY"),
122122
def(HourOfDay.class, HourOfDay::new, "HOUR"),
123123
def(MinuteOfDay.class, MinuteOfDay::new),
124124
def(MinuteOfHour.class, MinuteOfHour::new, "MINUTE"),
@@ -163,7 +163,7 @@ public class FunctionRegistry {
163163
def(Ascii.class, Ascii::new),
164164
def(Char.class, Char::new),
165165
def(BitLength.class, BitLength::new),
166-
def(CharLength.class, CharLength::new),
166+
def(CharLength.class, CharLength::new, "CHARACTER_LENGTH"),
167167
def(LCase.class, LCase::new),
168168
def(Length.class, Length::new),
169169
def(LTrim.class, LTrim::new),

x-pack/qa/sql/src/main/java/org/elasticsearch/xpack/qa/sql/cli/ShowTestCase.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,9 +60,12 @@ public void testShowFunctionsLikeInfix() throws IOException {
6060
assertThat(command("SHOW FUNCTIONS LIKE '%DAY%'"), RegexMatcher.matches("\\s*name\\s*\\|\\s*type\\s*"));
6161
assertThat(readLine(), containsString("----------"));
6262
assertThat(readLine(), RegexMatcher.matches("\\s*DAY_OF_MONTH\\s*\\|\\s*SCALAR\\s*"));
63+
assertThat(readLine(), RegexMatcher.matches("\\s*DAYOFMONTH\\s*\\|\\s*SCALAR\\s*"));
6364
assertThat(readLine(), RegexMatcher.matches("\\s*DAY\\s*\\|\\s*SCALAR\\s*"));
6465
assertThat(readLine(), RegexMatcher.matches("\\s*DAY_OF_WEEK\\s*\\|\\s*SCALAR\\s*"));
66+
assertThat(readLine(), RegexMatcher.matches("\\s*DAYOFWEEK\\s*\\|\\s*SCALAR\\s*"));
6567
assertThat(readLine(), RegexMatcher.matches("\\s*DAY_OF_YEAR\\s*\\|\\s*SCALAR\\s*"));
68+
assertThat(readLine(), RegexMatcher.matches("\\s*DAYOFYEAR\\s*\\|\\s*SCALAR\\s*"));
6669
assertThat(readLine(), RegexMatcher.matches("\\s*HOUR_OF_DAY\\s*\\|\\s*SCALAR\\s*"));
6770
assertThat(readLine(), RegexMatcher.matches("\\s*MINUTE_OF_DAY\\s*\\|\\s*SCALAR\\s*"));
6871
assertThat(readLine(), RegexMatcher.matches("\\s*DAY_NAME\\s*\\|\\s*SCALAR\\s*"));

x-pack/qa/sql/src/main/resources/command.csv-spec

Lines changed: 103 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -7,93 +7,97 @@ showFunctions
77
SHOW FUNCTIONS;
88

99
name:s | type:s
10-
AVG |AGGREGATE
11-
COUNT |AGGREGATE
12-
MAX |AGGREGATE
13-
MIN |AGGREGATE
14-
SUM |AGGREGATE
15-
STDDEV_POP |AGGREGATE
16-
VAR_POP |AGGREGATE
17-
PERCENTILE |AGGREGATE
18-
PERCENTILE_RANK |AGGREGATE
19-
SUM_OF_SQUARES |AGGREGATE
20-
SKEWNESS |AGGREGATE
21-
KURTOSIS |AGGREGATE
22-
DAY_OF_MONTH |SCALAR
23-
DAY |SCALAR
24-
DOM |SCALAR
25-
DAY_OF_WEEK |SCALAR
26-
DOW |SCALAR
27-
DAY_OF_YEAR |SCALAR
28-
DOY |SCALAR
29-
HOUR_OF_DAY |SCALAR
30-
HOUR |SCALAR
31-
MINUTE_OF_DAY |SCALAR
32-
MINUTE_OF_HOUR |SCALAR
33-
MINUTE |SCALAR
34-
SECOND_OF_MINUTE|SCALAR
35-
SECOND |SCALAR
36-
MONTH_OF_YEAR |SCALAR
37-
MONTH |SCALAR
38-
YEAR |SCALAR
39-
WEEK_OF_YEAR |SCALAR
40-
WEEK |SCALAR
41-
DAY_NAME |SCALAR
42-
DAYNAME |SCALAR
43-
MONTH_NAME |SCALAR
44-
MONTHNAME |SCALAR
45-
QUARTER |SCALAR
46-
ABS |SCALAR
47-
ACOS |SCALAR
48-
ASIN |SCALAR
49-
ATAN |SCALAR
50-
ATAN2 |SCALAR
51-
CBRT |SCALAR
52-
CEIL |SCALAR
53-
CEILING |SCALAR
54-
COS |SCALAR
55-
COSH |SCALAR
56-
COT |SCALAR
57-
DEGREES |SCALAR
58-
E |SCALAR
59-
EXP |SCALAR
60-
EXPM1 |SCALAR
61-
FLOOR |SCALAR
62-
LOG |SCALAR
63-
LOG10 |SCALAR
64-
MOD |SCALAR
65-
PI |SCALAR
66-
POWER |SCALAR
67-
RADIANS |SCALAR
68-
RANDOM |SCALAR
69-
RAND |SCALAR
70-
ROUND |SCALAR
71-
SIGN |SCALAR
72-
SIGNUM |SCALAR
73-
SIN |SCALAR
74-
SINH |SCALAR
75-
SQRT |SCALAR
76-
TAN |SCALAR
77-
ASCII |SCALAR
78-
CHAR |SCALAR
79-
BIT_LENGTH |SCALAR
80-
CHAR_LENGTH |SCALAR
81-
LCASE |SCALAR
82-
LENGTH |SCALAR
83-
LTRIM |SCALAR
84-
RTRIM |SCALAR
85-
SPACE |SCALAR
86-
CONCAT |SCALAR
87-
INSERT |SCALAR
88-
LEFT |SCALAR
89-
LOCATE |SCALAR
90-
POSITION |SCALAR
91-
REPEAT |SCALAR
92-
REPLACE |SCALAR
93-
RIGHT |SCALAR
94-
SUBSTRING |SCALAR
95-
UCASE |SCALAR
96-
SCORE |SCORE
10+
AVG |AGGREGATE
11+
COUNT |AGGREGATE
12+
MAX |AGGREGATE
13+
MIN |AGGREGATE
14+
SUM |AGGREGATE
15+
STDDEV_POP |AGGREGATE
16+
VAR_POP |AGGREGATE
17+
PERCENTILE |AGGREGATE
18+
PERCENTILE_RANK |AGGREGATE
19+
SUM_OF_SQUARES |AGGREGATE
20+
SKEWNESS |AGGREGATE
21+
KURTOSIS |AGGREGATE
22+
DAY_OF_MONTH |SCALAR
23+
DAYOFMONTH |SCALAR
24+
DAY |SCALAR
25+
DOM |SCALAR
26+
DAY_OF_WEEK |SCALAR
27+
DAYOFWEEK |SCALAR
28+
DOW |SCALAR
29+
DAY_OF_YEAR |SCALAR
30+
DAYOFYEAR |SCALAR
31+
DOY |SCALAR
32+
HOUR_OF_DAY |SCALAR
33+
HOUR |SCALAR
34+
MINUTE_OF_DAY |SCALAR
35+
MINUTE_OF_HOUR |SCALAR
36+
MINUTE |SCALAR
37+
SECOND_OF_MINUTE|SCALAR
38+
SECOND |SCALAR
39+
MONTH_OF_YEAR |SCALAR
40+
MONTH |SCALAR
41+
YEAR |SCALAR
42+
WEEK_OF_YEAR |SCALAR
43+
WEEK |SCALAR
44+
DAY_NAME |SCALAR
45+
DAYNAME |SCALAR
46+
MONTH_NAME |SCALAR
47+
MONTHNAME |SCALAR
48+
QUARTER |SCALAR
49+
ABS |SCALAR
50+
ACOS |SCALAR
51+
ASIN |SCALAR
52+
ATAN |SCALAR
53+
ATAN2 |SCALAR
54+
CBRT |SCALAR
55+
CEIL |SCALAR
56+
CEILING |SCALAR
57+
COS |SCALAR
58+
COSH |SCALAR
59+
COT |SCALAR
60+
DEGREES |SCALAR
61+
E |SCALAR
62+
EXP |SCALAR
63+
EXPM1 |SCALAR
64+
FLOOR |SCALAR
65+
LOG |SCALAR
66+
LOG10 |SCALAR
67+
MOD |SCALAR
68+
PI |SCALAR
69+
POWER |SCALAR
70+
RADIANS |SCALAR
71+
RANDOM |SCALAR
72+
RAND |SCALAR
73+
ROUND |SCALAR
74+
SIGN |SCALAR
75+
SIGNUM |SCALAR
76+
SIN |SCALAR
77+
SINH |SCALAR
78+
SQRT |SCALAR
79+
TAN |SCALAR
80+
ASCII |SCALAR
81+
CHAR |SCALAR
82+
BIT_LENGTH |SCALAR
83+
CHAR_LENGTH |SCALAR
84+
CHARACTER_LENGTH|SCALAR
85+
LCASE |SCALAR
86+
LENGTH |SCALAR
87+
LTRIM |SCALAR
88+
RTRIM |SCALAR
89+
SPACE |SCALAR
90+
CONCAT |SCALAR
91+
INSERT |SCALAR
92+
LEFT |SCALAR
93+
LOCATE |SCALAR
94+
POSITION |SCALAR
95+
REPEAT |SCALAR
96+
REPLACE |SCALAR
97+
RIGHT |SCALAR
98+
SUBSTRING |SCALAR
99+
UCASE |SCALAR
100+
SCORE |SCORE
97101
;
98102

99103
showFunctionsWithExactMatch
@@ -128,15 +132,18 @@ ABS |SCALAR
128132
showFunctionsWithLeadingPattern
129133
SHOW FUNCTIONS LIKE '%DAY%';
130134

131-
name:s | type:s
132-
DAY_OF_MONTH |SCALAR
133-
DAY |SCALAR
134-
DAY_OF_WEEK |SCALAR
135-
DAY_OF_YEAR |SCALAR
136-
HOUR_OF_DAY |SCALAR
137-
MINUTE_OF_DAY |SCALAR
138-
DAY_NAME |SCALAR
139-
DAYNAME |SCALAR
135+
name:s | type:s
136+
DAY_OF_MONTH |SCALAR
137+
DAYOFMONTH |SCALAR
138+
DAY |SCALAR
139+
DAY_OF_WEEK |SCALAR
140+
DAYOFWEEK |SCALAR
141+
DAY_OF_YEAR |SCALAR
142+
DAYOFYEAR |SCALAR
143+
HOUR_OF_DAY |SCALAR
144+
MINUTE_OF_DAY |SCALAR
145+
DAY_NAME |SCALAR
146+
DAYNAME |SCALAR
140147
;
141148

142149
showTables

0 commit comments

Comments
 (0)