@@ -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 */
1444614435overlay_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-
1446414449position_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 */
1448114455substr_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-
1452514498trim_list: a_expr FROM expr_list { $$ = lappend ($3 , $1 ); }
1452614499 | FROM expr_list { $$ = $2 ; }
1452714500 | expr_list { $$ = $1 ; }
0 commit comments