Skip to content

Commit aafefb4

Browse files
committed
Clean up grammar a bit
Simplify the grammar specification of substring() and overlay() a bit, simplify and update some comments. Reviewed-by: Pavel Stehule <pavel.stehule@gmail.com> Reviewed-by: Vik Fearing <vik@postgresfriends.org> Reviewed-by: Fabien COELHO <coelho@cri.ensmp.fr> Discussion: https://www.postgresql.org/message-id/flat/a15db31c-d0f8-8ce0-9039-578a31758adb%402ndquadrant.com
1 parent 68de144 commit aafefb4

File tree

1 file changed

+23
-50
lines changed

1 file changed

+23
-50
lines changed

src/backend/parser/gram.y

Lines changed: 23 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -452,7 +452,6 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
452452
%type <list> extract_list overlay_list position_list
453453
%type <list> substr_list trim_list
454454
%type <list> opt_interval interval_second
455-
%type <node> overlay_placing substr_from substr_for
456455
%type <str> unicode_normal_form
457456

458457
%type <boolean> opt_instead
@@ -13797,11 +13796,6 @@ func_expr_common_subexpr:
1379713796
}
1379813797
| OVERLAY '(' overlay_list ')'
1379913798
{
13800-
/* overlay(A PLACING B FROM C FOR D) is converted to
13801-
* overlay(A, B, C, D)
13802-
* overlay(A PLACING B FROM C) is converted to
13803-
* overlay(A, B, C)
13804-
*/
1380513799
$$ = (Node *) makeFuncCall(SystemFuncName("overlay"), $3, @1);
1380613800
}
1380713801
| POSITION '(' position_list ')'
@@ -14437,63 +14431,45 @@ unicode_normal_form:
1443714431
| NFKD { $$ = "nfkd"; }
1443814432
;
1443914433

14440-
/* OVERLAY() arguments
14441-
* SQL99 defines the OVERLAY() function:
14442-
* o overlay(text placing text from int for int)
14443-
* o overlay(text placing text from int)
14444-
* and similarly for binary strings
14445-
*/
14434+
/* OVERLAY() arguments */
1444614435
overlay_list:
14447-
a_expr overlay_placing substr_from substr_for
14436+
a_expr PLACING a_expr FROM a_expr FOR a_expr
1444814437
{
14449-
$$ = list_make4($1, $2, $3, $4);
14438+
/* overlay(A PLACING B FROM C FOR D) is converted to overlay(A, B, C, D) */
14439+
$$ = list_make4($1, $3, $5, $7);
1445014440
}
14451-
| a_expr overlay_placing substr_from
14441+
| a_expr PLACING a_expr FROM a_expr
1445214442
{
14453-
$$ = list_make3($1, $2, $3);
14443+
/* overlay(A PLACING B FROM C) is converted to overlay(A, B, C) */
14444+
$$ = list_make3($1, $3, $5);
1445414445
}
1445514446
;
1445614447

14457-
overlay_placing:
14458-
PLACING a_expr
14459-
{ $$ = $2; }
14460-
;
14461-
1446214448
/* position_list uses b_expr not a_expr to avoid conflict with general IN */
14463-
1446414449
position_list:
1446514450
b_expr IN_P b_expr { $$ = list_make2($3, $1); }
1446614451
| /*EMPTY*/ { $$ = NIL; }
1446714452
;
1446814453

14469-
/* SUBSTRING() arguments
14470-
* SQL9x defines a specific syntax for arguments to SUBSTRING():
14471-
* o substring(text from int for int)
14472-
* o substring(text from int) get entire string from starting point "int"
14473-
* o substring(text for int) get first "int" characters of string
14474-
* o substring(text from pattern) get entire string matching pattern
14475-
* o substring(text from pattern for escape) same with specified escape char
14476-
* We also want to support generic substring functions which accept
14477-
* the usual generic list of arguments. So we will accept both styles
14478-
* here, and convert the SQL9x style to the generic list for further
14479-
* processing. - thomas 2000-11-28
14480-
*/
14454+
/* SUBSTRING() arguments */
1448114455
substr_list:
14482-
a_expr substr_from substr_for
14456+
a_expr FROM a_expr FOR a_expr
1448314457
{
14484-
$$ = list_make3($1, $2, $3);
14458+
$$ = list_make3($1, $3, $5);
1448514459
}
14486-
| a_expr substr_for substr_from
14460+
| a_expr FOR a_expr FROM a_expr
1448714461
{
14488-
/* not legal per SQL99, but might as well allow it */
14489-
$$ = list_make3($1, $3, $2);
14462+
/* not legal per SQL, but might as well allow it */
14463+
$$ = list_make3($1, $5, $3);
1449014464
}
14491-
| a_expr substr_from
14465+
| a_expr FROM a_expr
1449214466
{
14493-
$$ = list_make2($1, $2);
14467+
$$ = list_make2($1, $3);
1449414468
}
14495-
| a_expr substr_for
14469+
| a_expr FOR a_expr
1449614470
{
14471+
/* not legal per SQL */
14472+
1449714473
/*
1449814474
* Since there are no cases where this syntax allows
1449914475
* a textual FOR value, we forcibly cast the argument
@@ -14504,9 +14480,13 @@ substr_list:
1450414480
* is unknown or doesn't have an implicit cast to int4.
1450514481
*/
1450614482
$$ = list_make3($1, makeIntConst(1, -1),
14507-
makeTypeCast($2,
14483+
makeTypeCast($3,
1450814484
SystemTypeName("int4"), -1));
1450914485
}
14486+
/*
14487+
* We also want to support generic substring functions that
14488+
* accept the usual generic list of arguments.
14489+
*/
1451014490
| expr_list
1451114491
{
1451214492
$$ = $1;
@@ -14515,13 +14495,6 @@ substr_list:
1451514495
{ $$ = NIL; }
1451614496
;
1451714497

14518-
substr_from:
14519-
FROM a_expr { $$ = $2; }
14520-
;
14521-
14522-
substr_for: FOR a_expr { $$ = $2; }
14523-
;
14524-
1452514498
trim_list: a_expr FROM expr_list { $$ = lappend($3, $1); }
1452614499
| FROM expr_list { $$ = $2; }
1452714500
| expr_list { $$ = $1; }

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy