@@ -378,6 +378,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
378
378
| <K_SQL_NO_CACHE: "SQL_NO_CACHE">
379
379
| <K_USING:"USING">
380
380
| <K_SIGNED:"SIGNED">
381
+ | <K_STRING_FUNCTION_NAME: ("SUBSTR" | "SUBSTRING" | "TRIM" | "POSITION" | "OVERLAY")>
381
382
| <K_UNSIGNED:"UNSIGNED">
382
383
| <K_VALIDATE : "VALIDATE">
383
384
| <K_VALUE:"VALUE">
@@ -1439,6 +1440,7 @@ String RelObjectNameWithoutValue() :
1439
1440
/*| tk=<K_PLACING> | tk=<K_BOTH> | tk=<K_LEADING> | tk=<K_TRAILING> */
1440
1441
| tk=<K_FORMAT> | tk=<K_DIV> | tk=<K_UNSIGNED> | tk=<K_CASE> | tk=<K_LOCAL>
1441
1442
| tk=<K_ARRAY_LITERAL>
1443
+ | tk=<K_STRING_FUNCTION_NAME>
1442
1444
1443
1445
/* Keywords for ALTER SESSION */
1444
1446
/* | tk=<K_NAME> */ | tk=<K_TIMEOUT> | tk=<K_PARALLEL>
@@ -1455,7 +1457,7 @@ String RelObjectName() :
1455
1457
{
1456
1458
(result = RelObjectNameWithoutValue()
1457
1459
| tk=<K_GROUP> | tk=<K_INTERVAL> | tk=<K_ON> | tk=<K_ORDER> | tk=<K_START> | tk=<K_TOP> | tk=<K_VALUE>
1458
- | tk=<K_VALUES> | tk=<K_CREATE> | tk=<K_TABLES> )
1460
+ | tk=<K_VALUES> | tk=<K_CREATE> | tk=<K_TABLES> )
1459
1461
1460
1462
{
1461
1463
if (tk!=null) result=tk.image;
@@ -1485,7 +1487,7 @@ String RelObjectNameExt():
1485
1487
{
1486
1488
( result=RelObjectName() | tk=<K_ALL> | tk=<K_ANY> | tk=<K_SOME> | tk=<K_LEFT> | tk=<K_RIGHT> | tk=<K_SET>
1487
1489
| tk=<K_DOUBLE> | tk=<K_IF> | tk=<K_IIF> | tk=<K_OPTIMIZE> | tk=<K_LIMIT>
1488
- | tk=<K_OFFSET> | tk=<K_PROCEDURE> | tk=<K_PUBLIC>
1490
+ | tk=<K_OFFSET> | tk=<K_PROCEDURE> | tk=<K_PUBLIC>
1489
1491
| tk=<K_CASEWHEN> | tk=<K_IN> )
1490
1492
{
1491
1493
if (tk!=null) result=tk.image;
@@ -4201,6 +4203,7 @@ Function Function() #Function:
4201
4203
{
4202
4204
(
4203
4205
"{" <K_FN> { retval.setEscaped(true); } InternalFunction(retval) "}"
4206
+ | LOOKAHEAD(3) retval = SpecialStringFunctionWithNamedParameters()
4204
4207
| InternalFunction(retval)
4205
4208
)
4206
4209
{
@@ -4209,6 +4212,33 @@ Function Function() #Function:
4209
4212
}
4210
4213
}
4211
4214
4215
+ Function SpecialStringFunctionWithNamedParameters() :
4216
+ {
4217
+ Token funcName;
4218
+ NamedExpressionList namedExpressionList = null;
4219
+ ExpressionList expressionList = null;
4220
+ List<OrderByElement> orderByList;
4221
+ }
4222
+ {
4223
+ funcName = <K_STRING_FUNCTION_NAME>
4224
+
4225
+ "("
4226
+ (
4227
+ LOOKAHEAD(NamedExpressionList1()) namedExpressionList=NamedExpressionList1()
4228
+ |
4229
+ LOOKAHEAD(NamedExpressionListExprFirst(), { getAsBoolean(Feature.allowComplexParsing) }) namedExpressionList = NamedExpressionListExprFirst()
4230
+ |
4231
+ LOOKAHEAD(3, { getAsBoolean(Feature.allowComplexParsing) }) expressionList=ComplexExpressionList() {expressionList.setUsingBrackets(false);}
4232
+ |
4233
+ LOOKAHEAD(3) expressionList=SimpleExpressionList(false)
4234
+ )
4235
+ ")"
4236
+
4237
+ {
4238
+ return new Function().withName(funcName.image).withNamedParameters(namedExpressionList).withParameters(expressionList);
4239
+ }
4240
+ }
4241
+
4212
4242
Function InternalFunction(Function retval) :
4213
4243
{
4214
4244
List<String> funcName;
@@ -4231,10 +4261,6 @@ Function InternalFunction(Function retval) :
4231
4261
( LOOKAHEAD(4)
4232
4262
"*" { retval.setAllColumns(true); }
4233
4263
|
4234
- LOOKAHEAD(NamedExpressionList1()) namedExpressionList=NamedExpressionList1()
4235
- |
4236
- LOOKAHEAD(NamedExpressionListExprFirst(), { getAsBoolean(Feature.allowComplexParsing) }) namedExpressionList = NamedExpressionListExprFirst()
4237
- |
4238
4264
LOOKAHEAD(3, { getAsBoolean(Feature.allowComplexParsing) }) (expressionList=ComplexExpressionList() {expressionList.setUsingBrackets(false);} [ orderByList = OrderByElements() { retval.setOrderByElements(orderByList); } ])
4239
4265
|
4240
4266
LOOKAHEAD(3) (expressionList=SimpleExpressionList(false) [ orderByList = OrderByElements() { retval.setOrderByElements(orderByList); } ])
@@ -4243,7 +4269,7 @@ Function InternalFunction(Function retval) :
4243
4269
4244
4270
)]
4245
4271
[ <K_IGNORE> <K_NULLS> {retval.setIgnoreNulls(true); }]
4246
- ")"
4272
+ ")"
4247
4273
4248
4274
[ "." (
4249
4275
LOOKAHEAD(2) expr1=Function() { retval.setAttribute(expr1); }
@@ -4255,7 +4281,6 @@ Function InternalFunction(Function retval) :
4255
4281
4256
4282
{
4257
4283
retval.setParameters(expressionList);
4258
- retval.setNamedParameters(namedExpressionList);
4259
4284
retval.setName(funcName);
4260
4285
retval.setKeep(keep);
4261
4286
return retval;
0 commit comments