Skip to content

Commit dc633e0

Browse files
authored
SQL: Support for escape sequences (#31884)
Enhance grammar to allow JDBC/ODBC escape sequences, namely - date, time and timestamp {d ''}, {t ''} and {ts ''} - guid {guid ''} - LIKE escape {escape ''} - scalar function {fn } Fix #31883
1 parent 6136e49 commit dc633e0

File tree

13 files changed

+2921
-1375
lines changed

13 files changed

+2921
-1375
lines changed

x-pack/plugin/sql/src/main/antlr/SqlBase.g4

+57-5
Original file line numberDiff line numberDiff line change
@@ -74,9 +74,14 @@ queryNoWith
7474
: queryTerm
7575
/** we could add sort by - sort per partition */
7676
(ORDER BY orderBy (',' orderBy)*)?
77-
(LIMIT limit=(INTEGER_VALUE | ALL))?
77+
limitClause?
7878
;
7979

80+
limitClause
81+
: LIMIT limit=(INTEGER_VALUE | ALL)
82+
| LIMIT_ESC limit=(INTEGER_VALUE | ALL) ESC_END
83+
;
84+
8085
queryTerm
8186
: querySpecification #queryPrimaryDefault
8287
| '(' queryNoWith ')' #subquery
@@ -185,7 +190,12 @@ predicate
185190
;
186191

187192
pattern
188-
: value=string (ESCAPE escape=string)?
193+
: value=string patternEscape?
194+
;
195+
196+
patternEscape
197+
: ESCAPE escape=string
198+
| ESCAPE_ESC escape=string '}'
189199
;
190200
191201
valueExpression
@@ -197,25 +207,55 @@ valueExpression
197207
;
198208
199209
primaryExpression
200-
: CAST '(' expression AS dataType ')' #cast
201-
| EXTRACT '(' field=identifier FROM valueExpression ')' #extract
210+
: castExpression #cast
211+
| extractExpression #extract
202212
| constant #constantDefault
203213
| ASTERISK #star
204214
| (qualifiedName DOT)? ASTERISK #star
205-
| identifier '(' (setQuantifier? expression (',' expression)*)? ')' #functionCall
215+
| functionExpression #function
206216
| '(' query ')' #subqueryExpression
207217
| identifier #columnReference
208218
| qualifiedName #dereference
209219
| '(' expression ')' #parenthesizedExpression
210220
;
211221
222+
castExpression
223+
: castTemplate
224+
| FUNCTION_ESC castTemplate ESC_END
225+
;
226+
227+
castTemplate
228+
: CAST '(' expression AS dataType ')'
229+
;
230+
231+
extractExpression
232+
: extractTemplate
233+
| FUNCTION_ESC extractTemplate ESC_END
234+
;
235+
236+
extractTemplate
237+
: EXTRACT '(' field=identifier FROM valueExpression ')'
238+
;
239+
240+
functionExpression
241+
: functionTemplate
242+
| FUNCTION_ESC functionTemplate '}'
243+
;
244+
245+
functionTemplate
246+
: identifier '(' (setQuantifier? expression (',' expression)*)? ')'
247+
;
212248
213249
constant
214250
: NULL #nullLiteral
215251
| number #numericLiteral
216252
| booleanValue #booleanLiteral
217253
| STRING+ #stringLiteral
218254
| PARAM #paramLiteral
255+
| DATE_ESC string ESC_END #dateEscapedLiteral
256+
| TIME_ESC string ESC_END #timeEscapedLiteral
257+
| TIMESTAMP_ESC string ESC_END #timestampEscapedLiteral
258+
| GUID_ESC string ESC_END #guidEscapedLiteral
219259
;
220260
221261
comparisonOperator
@@ -351,6 +391,18 @@ VERIFY: 'VERIFY';
351391
WHERE: 'WHERE';
352392
WITH: 'WITH';
353393
394+
// Escaped Sequence
395+
ESCAPE_ESC: '{ESCAPE';
396+
FUNCTION_ESC: '{FN';
397+
LIMIT_ESC:'{LIMIT';
398+
DATE_ESC: '{D';
399+
TIME_ESC: '{T';
400+
TIMESTAMP_ESC: '{TS';
401+
// mapped to string literal
402+
GUID_ESC: '{GUID';
403+
404+
ESC_END: '}';
405+
354406
EQ : '=';
355407
NEQ : '<>' | '!=' | '<=>';
356408
LT : '<';

x-pack/plugin/sql/src/main/antlr/SqlBase.tokens

+56-40
Original file line numberDiff line numberDiff line change
@@ -69,33 +69,41 @@ USING=68
6969
VERIFY=69
7070
WHERE=70
7171
WITH=71
72-
EQ=72
73-
NEQ=73
74-
LT=74
75-
LTE=75
76-
GT=76
77-
GTE=77
78-
PLUS=78
79-
MINUS=79
80-
ASTERISK=80
81-
SLASH=81
82-
PERCENT=82
83-
CONCAT=83
84-
DOT=84
85-
PARAM=85
86-
STRING=86
87-
INTEGER_VALUE=87
88-
DECIMAL_VALUE=88
89-
IDENTIFIER=89
90-
DIGIT_IDENTIFIER=90
91-
TABLE_IDENTIFIER=91
92-
QUOTED_IDENTIFIER=92
93-
BACKQUOTED_IDENTIFIER=93
94-
SIMPLE_COMMENT=94
95-
BRACKETED_COMMENT=95
96-
WS=96
97-
UNRECOGNIZED=97
98-
DELIMITER=98
72+
ESCAPE_ESC=72
73+
FUNCTION_ESC=73
74+
LIMIT_ESC=74
75+
DATE_ESC=75
76+
TIME_ESC=76
77+
TIMESTAMP_ESC=77
78+
GUID_ESC=78
79+
ESC_END=79
80+
EQ=80
81+
NEQ=81
82+
LT=82
83+
LTE=83
84+
GT=84
85+
GTE=85
86+
PLUS=86
87+
MINUS=87
88+
ASTERISK=88
89+
SLASH=89
90+
PERCENT=90
91+
CONCAT=91
92+
DOT=92
93+
PARAM=93
94+
STRING=94
95+
INTEGER_VALUE=95
96+
DECIMAL_VALUE=96
97+
IDENTIFIER=97
98+
DIGIT_IDENTIFIER=98
99+
TABLE_IDENTIFIER=99
100+
QUOTED_IDENTIFIER=100
101+
BACKQUOTED_IDENTIFIER=101
102+
SIMPLE_COMMENT=102
103+
BRACKETED_COMMENT=103
104+
WS=104
105+
UNRECOGNIZED=105
106+
DELIMITER=106
99107
'('=1
100108
')'=2
101109
','=3
@@ -167,16 +175,24 @@ DELIMITER=98
167175
'VERIFY'=69
168176
'WHERE'=70
169177
'WITH'=71
170-
'='=72
171-
'<'=74
172-
'<='=75
173-
'>'=76
174-
'>='=77
175-
'+'=78
176-
'-'=79
177-
'*'=80
178-
'/'=81
179-
'%'=82
180-
'||'=83
181-
'.'=84
182-
'?'=85
178+
'{ESCAPE'=72
179+
'{FN'=73
180+
'{LIMIT'=74
181+
'{D'=75
182+
'{T'=76
183+
'{TS'=77
184+
'{GUID'=78
185+
'}'=79
186+
'='=80
187+
'<'=82
188+
'<='=83
189+
'>'=84
190+
'>='=85
191+
'+'=86
192+
'-'=87
193+
'*'=88
194+
'/'=89
195+
'%'=90
196+
'||'=91
197+
'.'=92
198+
'?'=93

x-pack/plugin/sql/src/main/antlr/SqlBaseLexer.tokens

+55-39
Original file line numberDiff line numberDiff line change
@@ -69,32 +69,40 @@ USING=68
6969
VERIFY=69
7070
WHERE=70
7171
WITH=71
72-
EQ=72
73-
NEQ=73
74-
LT=74
75-
LTE=75
76-
GT=76
77-
GTE=77
78-
PLUS=78
79-
MINUS=79
80-
ASTERISK=80
81-
SLASH=81
82-
PERCENT=82
83-
CONCAT=83
84-
DOT=84
85-
PARAM=85
86-
STRING=86
87-
INTEGER_VALUE=87
88-
DECIMAL_VALUE=88
89-
IDENTIFIER=89
90-
DIGIT_IDENTIFIER=90
91-
TABLE_IDENTIFIER=91
92-
QUOTED_IDENTIFIER=92
93-
BACKQUOTED_IDENTIFIER=93
94-
SIMPLE_COMMENT=94
95-
BRACKETED_COMMENT=95
96-
WS=96
97-
UNRECOGNIZED=97
72+
ESCAPE_ESC=72
73+
FUNCTION_ESC=73
74+
LIMIT_ESC=74
75+
DATE_ESC=75
76+
TIME_ESC=76
77+
TIMESTAMP_ESC=77
78+
GUID_ESC=78
79+
ESC_END=79
80+
EQ=80
81+
NEQ=81
82+
LT=82
83+
LTE=83
84+
GT=84
85+
GTE=85
86+
PLUS=86
87+
MINUS=87
88+
ASTERISK=88
89+
SLASH=89
90+
PERCENT=90
91+
CONCAT=91
92+
DOT=92
93+
PARAM=93
94+
STRING=94
95+
INTEGER_VALUE=95
96+
DECIMAL_VALUE=96
97+
IDENTIFIER=97
98+
DIGIT_IDENTIFIER=98
99+
TABLE_IDENTIFIER=99
100+
QUOTED_IDENTIFIER=100
101+
BACKQUOTED_IDENTIFIER=101
102+
SIMPLE_COMMENT=102
103+
BRACKETED_COMMENT=103
104+
WS=104
105+
UNRECOGNIZED=105
98106
'('=1
99107
')'=2
100108
','=3
@@ -166,16 +174,24 @@ UNRECOGNIZED=97
166174
'VERIFY'=69
167175
'WHERE'=70
168176
'WITH'=71
169-
'='=72
170-
'<'=74
171-
'<='=75
172-
'>'=76
173-
'>='=77
174-
'+'=78
175-
'-'=79
176-
'*'=80
177-
'/'=81
178-
'%'=82
179-
'||'=83
180-
'.'=84
181-
'?'=85
177+
'{ESCAPE'=72
178+
'{FN'=73
179+
'{LIMIT'=74
180+
'{D'=75
181+
'{T'=76
182+
'{TS'=77
183+
'{GUID'=78
184+
'}'=79
185+
'='=80
186+
'<'=82
187+
'<='=83
188+
'>'=84
189+
'>='=85
190+
'+'=86
191+
'-'=87
192+
'*'=88
193+
'/'=89
194+
'%'=90
195+
'||'=91
196+
'.'=92
197+
'?'=93

0 commit comments

Comments
 (0)