@@ -382,6 +382,7 @@ TOKEN: /* SQL Keywords. prefixed with K_ to avoid name clashes */
382
382
| <K_SQL_NO_CACHE: "SQL_NO_CACHE">
383
383
| <K_USING:"USING">
384
384
| <K_SIGNED:"SIGNED">
385
+ | <K_STRING_FUNCTION_NAME: ("SUBSTR" | "SUBSTRING" | "TRIM" | "POSITION" | "OVERLAY")>
385
386
| <K_UNSIGNED:"UNSIGNED">
386
387
| <K_VALIDATE : "VALIDATE">
387
388
| <K_VALUE:"VALUE">
@@ -1519,6 +1520,7 @@ String RelObjectNameWithoutValue() :
1519
1520
/*| tk=<K_PLACING> | tk=<K_BOTH> | tk=<K_LEADING> | tk=<K_TRAILING> */
1520
1521
| tk=<K_FORMAT> | tk=<K_DIV> | tk=<K_UNSIGNED> | tk=<K_CASE> | tk=<K_LOCAL>
1521
1522
| tk=<K_ARRAY_LITERAL>
1523
+ | tk=<K_STRING_FUNCTION_NAME>
1522
1524
| tk=<K_USER>
1523
1525
1524
1526
/* Keywords for ALTER SESSION */
@@ -1536,7 +1538,7 @@ String RelObjectName() :
1536
1538
{
1537
1539
(result = RelObjectNameWithoutValue()
1538
1540
| tk=<K_GROUP> | tk=<K_INTERVAL> | tk=<K_ON> | tk=<K_ORDER> | tk=<K_START> | tk=<K_TOP> | tk=<K_VALUE>
1539
- | tk=<K_VALUES> | tk=<K_CREATE> | tk=<K_TABLES> )
1541
+ | tk=<K_VALUES> | tk=<K_CREATE> | tk=<K_TABLES> )
1540
1542
1541
1543
{
1542
1544
if (tk!=null) result=tk.image;
@@ -1566,7 +1568,7 @@ String RelObjectNameExt():
1566
1568
{
1567
1569
( result=RelObjectName() | tk=<K_ALL> | tk=<K_ANY> | tk=<K_SOME> | tk=<K_LEFT> | tk=<K_RIGHT> | tk=<K_SET>
1568
1570
| tk=<K_DOUBLE> | tk=<K_IF> | tk=<K_IIF> | tk=<K_OPTIMIZE> | tk=<K_LIMIT>
1569
- | tk=<K_OFFSET> | tk=<K_PROCEDURE> | tk=<K_PUBLIC>
1571
+ | tk=<K_OFFSET> | tk=<K_PROCEDURE> | tk=<K_PUBLIC>
1570
1572
| tk=<K_CASEWHEN> | tk=<K_IN> )
1571
1573
{
1572
1574
if (tk!=null) result=tk.image;
@@ -4282,6 +4284,7 @@ Function Function() #Function:
4282
4284
{
4283
4285
(
4284
4286
"{" <K_FN> { retval.setEscaped(true); } InternalFunction(retval) "}"
4287
+ | LOOKAHEAD(3) retval = SpecialStringFunctionWithNamedParameters()
4285
4288
| InternalFunction(retval)
4286
4289
)
4287
4290
{
@@ -4290,6 +4293,33 @@ Function Function() #Function:
4290
4293
}
4291
4294
}
4292
4295
4296
+ Function SpecialStringFunctionWithNamedParameters() :
4297
+ {
4298
+ Token funcName;
4299
+ NamedExpressionList namedExpressionList = null;
4300
+ ExpressionList expressionList = null;
4301
+ List<OrderByElement> orderByList;
4302
+ }
4303
+ {
4304
+ funcName = <K_STRING_FUNCTION_NAME>
4305
+
4306
+ "("
4307
+ (
4308
+ LOOKAHEAD(NamedExpressionList1()) namedExpressionList=NamedExpressionList1()
4309
+ |
4310
+ LOOKAHEAD(NamedExpressionListExprFirst(), { getAsBoolean(Feature.allowComplexParsing) }) namedExpressionList = NamedExpressionListExprFirst()
4311
+ |
4312
+ LOOKAHEAD(3, { getAsBoolean(Feature.allowComplexParsing) }) expressionList=ComplexExpressionList() {expressionList.setUsingBrackets(false);}
4313
+ |
4314
+ LOOKAHEAD(3) expressionList=SimpleExpressionList(false)
4315
+ )
4316
+ ")"
4317
+
4318
+ {
4319
+ return new Function().withName(funcName.image).withNamedParameters(namedExpressionList).withParameters(expressionList);
4320
+ }
4321
+ }
4322
+
4293
4323
Function InternalFunction(Function retval) :
4294
4324
{
4295
4325
List<String> funcName;
@@ -4312,10 +4342,6 @@ Function InternalFunction(Function retval) :
4312
4342
( LOOKAHEAD(4)
4313
4343
"*" { retval.setAllColumns(true); }
4314
4344
|
4315
- LOOKAHEAD(NamedExpressionList1()) namedExpressionList=NamedExpressionList1()
4316
- |
4317
- LOOKAHEAD(NamedExpressionListExprFirst(), { getAsBoolean(Feature.allowComplexParsing) }) namedExpressionList = NamedExpressionListExprFirst()
4318
- |
4319
4345
LOOKAHEAD(3, { getAsBoolean(Feature.allowComplexParsing) }) (expressionList=ComplexExpressionList() {expressionList.setUsingBrackets(false);} [ orderByList = OrderByElements() { retval.setOrderByElements(orderByList); } ])
4320
4346
|
4321
4347
LOOKAHEAD(3) (expressionList=SimpleExpressionList(false) [ orderByList = OrderByElements() { retval.setOrderByElements(orderByList); } ])
@@ -4324,7 +4350,7 @@ Function InternalFunction(Function retval) :
4324
4350
4325
4351
)]
4326
4352
[ <K_IGNORE> <K_NULLS> {retval.setIgnoreNulls(true); }]
4327
- ")"
4353
+ ")"
4328
4354
4329
4355
[ "." (
4330
4356
LOOKAHEAD(2) expr1=Function() { retval.setAttribute(expr1); }
@@ -4336,7 +4362,6 @@ Function InternalFunction(Function retval) :
4336
4362
4337
4363
{
4338
4364
retval.setParameters(expressionList);
4339
- retval.setNamedParameters(namedExpressionList);
4340
4365
retval.setName(funcName);
4341
4366
retval.setKeep(keep);
4342
4367
return retval;
0 commit comments