|
|
|
|
@ -10503,16 +10503,9 @@ a_expr: c_expr { $$ = $1; } |
|
|
|
|
} |
|
|
|
|
| a_expr AT TIME ZONE a_expr %prec AT |
|
|
|
|
{ |
|
|
|
|
FuncCall *n = makeNode(FuncCall); |
|
|
|
|
n->funcname = SystemFuncName("timezone"); |
|
|
|
|
n->args = list_make2($5, $1); |
|
|
|
|
n->agg_order = NIL; |
|
|
|
|
n->agg_star = FALSE; |
|
|
|
|
n->agg_distinct = FALSE; |
|
|
|
|
n->func_variadic = FALSE; |
|
|
|
|
n->over = NULL; |
|
|
|
|
n->location = @2; |
|
|
|
|
$$ = (Node *) n; |
|
|
|
|
$$ = (Node *) makeFuncCall(SystemFuncName("timezone"), |
|
|
|
|
list_make2($5, $1), |
|
|
|
|
@2); |
|
|
|
|
} |
|
|
|
|
/* |
|
|
|
|
* These operators must be called out explicitly in order to make use |
|
|
|
|
@ -10564,113 +10557,65 @@ a_expr: c_expr { $$ = $1; } |
|
|
|
|
{ $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "~~", $1, $3, @2); } |
|
|
|
|
| a_expr LIKE a_expr ESCAPE a_expr |
|
|
|
|
{ |
|
|
|
|
FuncCall *n = makeNode(FuncCall); |
|
|
|
|
n->funcname = SystemFuncName("like_escape"); |
|
|
|
|
n->args = list_make2($3, $5); |
|
|
|
|
n->agg_order = NIL; |
|
|
|
|
n->agg_star = FALSE; |
|
|
|
|
n->agg_distinct = FALSE; |
|
|
|
|
n->func_variadic = FALSE; |
|
|
|
|
n->over = NULL; |
|
|
|
|
n->location = @2; |
|
|
|
|
FuncCall *n = makeFuncCall(SystemFuncName("like_escape"), |
|
|
|
|
list_make2($3, $5), |
|
|
|
|
@2); |
|
|
|
|
$$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "~~", $1, (Node *) n, @2); |
|
|
|
|
} |
|
|
|
|
| a_expr NOT LIKE a_expr |
|
|
|
|
{ $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "!~~", $1, $4, @2); } |
|
|
|
|
| a_expr NOT LIKE a_expr ESCAPE a_expr |
|
|
|
|
{ |
|
|
|
|
FuncCall *n = makeNode(FuncCall); |
|
|
|
|
n->funcname = SystemFuncName("like_escape"); |
|
|
|
|
n->args = list_make2($4, $6); |
|
|
|
|
n->agg_order = NIL; |
|
|
|
|
n->agg_star = FALSE; |
|
|
|
|
n->agg_distinct = FALSE; |
|
|
|
|
n->func_variadic = FALSE; |
|
|
|
|
n->over = NULL; |
|
|
|
|
n->location = @2; |
|
|
|
|
FuncCall *n = makeFuncCall(SystemFuncName("like_escape"), |
|
|
|
|
list_make2($4, $6), |
|
|
|
|
@2); |
|
|
|
|
$$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "!~~", $1, (Node *) n, @2); |
|
|
|
|
} |
|
|
|
|
| a_expr ILIKE a_expr |
|
|
|
|
{ $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "~~*", $1, $3, @2); } |
|
|
|
|
| a_expr ILIKE a_expr ESCAPE a_expr |
|
|
|
|
{ |
|
|
|
|
FuncCall *n = makeNode(FuncCall); |
|
|
|
|
n->funcname = SystemFuncName("like_escape"); |
|
|
|
|
n->args = list_make2($3, $5); |
|
|
|
|
n->agg_order = NIL; |
|
|
|
|
n->agg_star = FALSE; |
|
|
|
|
n->agg_distinct = FALSE; |
|
|
|
|
n->func_variadic = FALSE; |
|
|
|
|
n->over = NULL; |
|
|
|
|
n->location = @2; |
|
|
|
|
FuncCall *n = makeFuncCall(SystemFuncName("like_escape"), |
|
|
|
|
list_make2($3, $5), |
|
|
|
|
@2); |
|
|
|
|
$$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "~~*", $1, (Node *) n, @2); |
|
|
|
|
} |
|
|
|
|
| a_expr NOT ILIKE a_expr |
|
|
|
|
{ $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "!~~*", $1, $4, @2); } |
|
|
|
|
| a_expr NOT ILIKE a_expr ESCAPE a_expr |
|
|
|
|
{ |
|
|
|
|
FuncCall *n = makeNode(FuncCall); |
|
|
|
|
n->funcname = SystemFuncName("like_escape"); |
|
|
|
|
n->args = list_make2($4, $6); |
|
|
|
|
n->agg_order = NIL; |
|
|
|
|
n->agg_star = FALSE; |
|
|
|
|
n->agg_distinct = FALSE; |
|
|
|
|
n->func_variadic = FALSE; |
|
|
|
|
n->over = NULL; |
|
|
|
|
n->location = @2; |
|
|
|
|
FuncCall *n = makeFuncCall(SystemFuncName("like_escape"), |
|
|
|
|
list_make2($4, $6), |
|
|
|
|
@2); |
|
|
|
|
$$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "!~~*", $1, (Node *) n, @2); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
| a_expr SIMILAR TO a_expr %prec SIMILAR |
|
|
|
|
{ |
|
|
|
|
FuncCall *n = makeNode(FuncCall); |
|
|
|
|
n->funcname = SystemFuncName("similar_escape"); |
|
|
|
|
n->args = list_make2($4, makeNullAConst(-1)); |
|
|
|
|
n->agg_order = NIL; |
|
|
|
|
n->agg_star = FALSE; |
|
|
|
|
n->agg_distinct = FALSE; |
|
|
|
|
n->func_variadic = FALSE; |
|
|
|
|
n->over = NULL; |
|
|
|
|
n->location = @2; |
|
|
|
|
FuncCall *n = makeFuncCall(SystemFuncName("similar_escape"), |
|
|
|
|
list_make2($4, makeNullAConst(-1)), |
|
|
|
|
@2); |
|
|
|
|
$$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "~", $1, (Node *) n, @2); |
|
|
|
|
} |
|
|
|
|
| a_expr SIMILAR TO a_expr ESCAPE a_expr |
|
|
|
|
{ |
|
|
|
|
FuncCall *n = makeNode(FuncCall); |
|
|
|
|
n->funcname = SystemFuncName("similar_escape"); |
|
|
|
|
n->args = list_make2($4, $6); |
|
|
|
|
n->agg_order = NIL; |
|
|
|
|
n->agg_star = FALSE; |
|
|
|
|
n->agg_distinct = FALSE; |
|
|
|
|
n->func_variadic = FALSE; |
|
|
|
|
n->over = NULL; |
|
|
|
|
n->location = @2; |
|
|
|
|
FuncCall *n = makeFuncCall(SystemFuncName("similar_escape"), |
|
|
|
|
list_make2($4, $6), |
|
|
|
|
@2); |
|
|
|
|
$$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "~", $1, (Node *) n, @2); |
|
|
|
|
} |
|
|
|
|
| a_expr NOT SIMILAR TO a_expr %prec SIMILAR |
|
|
|
|
{ |
|
|
|
|
FuncCall *n = makeNode(FuncCall); |
|
|
|
|
n->funcname = SystemFuncName("similar_escape"); |
|
|
|
|
n->args = list_make2($5, makeNullAConst(-1)); |
|
|
|
|
n->agg_order = NIL; |
|
|
|
|
n->agg_star = FALSE; |
|
|
|
|
n->agg_distinct = FALSE; |
|
|
|
|
n->func_variadic = FALSE; |
|
|
|
|
n->over = NULL; |
|
|
|
|
n->location = @2; |
|
|
|
|
FuncCall *n = makeFuncCall(SystemFuncName("similar_escape"), |
|
|
|
|
list_make2($5, makeNullAConst(-1)), |
|
|
|
|
@2); |
|
|
|
|
$$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "!~", $1, (Node *) n, @2); |
|
|
|
|
} |
|
|
|
|
| a_expr NOT SIMILAR TO a_expr ESCAPE a_expr |
|
|
|
|
{ |
|
|
|
|
FuncCall *n = makeNode(FuncCall); |
|
|
|
|
n->funcname = SystemFuncName("similar_escape"); |
|
|
|
|
n->args = list_make2($5, $7); |
|
|
|
|
n->agg_order = NIL; |
|
|
|
|
n->agg_star = FALSE; |
|
|
|
|
n->agg_distinct = FALSE; |
|
|
|
|
n->func_variadic = FALSE; |
|
|
|
|
n->over = NULL; |
|
|
|
|
n->location = @2; |
|
|
|
|
FuncCall *n = makeFuncCall(SystemFuncName("similar_escape"), |
|
|
|
|
list_make2($5, $7), |
|
|
|
|
@2); |
|
|
|
|
$$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "!~", $1, (Node *) n, @2); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -11097,97 +11042,45 @@ c_expr: columnref { $$ = $1; } |
|
|
|
|
|
|
|
|
|
func_application: func_name '(' ')' |
|
|
|
|
{ |
|
|
|
|
FuncCall *n = makeNode(FuncCall); |
|
|
|
|
n->funcname = $1; |
|
|
|
|
n->args = NIL; |
|
|
|
|
n->agg_order = NIL; |
|
|
|
|
n->agg_star = FALSE; |
|
|
|
|
n->agg_distinct = FALSE; |
|
|
|
|
n->func_variadic = FALSE; |
|
|
|
|
n->over = NULL; |
|
|
|
|
n->location = @1; |
|
|
|
|
$$ = (Node *)n; |
|
|
|
|
$$ = (Node *) makeFuncCall($1, NIL, @1); |
|
|
|
|
} |
|
|
|
|
| func_name '(' func_arg_list ')' |
|
|
|
|
{ |
|
|
|
|
FuncCall *n = makeNode(FuncCall); |
|
|
|
|
n->funcname = $1; |
|
|
|
|
n->args = $3; |
|
|
|
|
n->agg_order = NIL; |
|
|
|
|
n->agg_star = FALSE; |
|
|
|
|
n->agg_distinct = FALSE; |
|
|
|
|
n->func_variadic = FALSE; |
|
|
|
|
n->over = NULL; |
|
|
|
|
n->location = @1; |
|
|
|
|
$$ = (Node *)n; |
|
|
|
|
$$ = (Node *) makeFuncCall($1, $3, @1); |
|
|
|
|
} |
|
|
|
|
| func_name '(' VARIADIC func_arg_expr ')' |
|
|
|
|
{ |
|
|
|
|
FuncCall *n = makeNode(FuncCall); |
|
|
|
|
n->funcname = $1; |
|
|
|
|
n->args = list_make1($4); |
|
|
|
|
n->agg_order = NIL; |
|
|
|
|
n->agg_star = FALSE; |
|
|
|
|
n->agg_distinct = FALSE; |
|
|
|
|
FuncCall *n = makeFuncCall($1, list_make1($4), @1); |
|
|
|
|
n->func_variadic = TRUE; |
|
|
|
|
n->over = NULL; |
|
|
|
|
n->location = @1; |
|
|
|
|
$$ = (Node *)n; |
|
|
|
|
} |
|
|
|
|
| func_name '(' func_arg_list ',' VARIADIC func_arg_expr ')' |
|
|
|
|
{ |
|
|
|
|
FuncCall *n = makeNode(FuncCall); |
|
|
|
|
n->funcname = $1; |
|
|
|
|
n->args = lappend($3, $6); |
|
|
|
|
n->agg_order = NIL; |
|
|
|
|
n->agg_star = FALSE; |
|
|
|
|
n->agg_distinct = FALSE; |
|
|
|
|
FuncCall *n = makeFuncCall($1, lappend($3, $6), @1); |
|
|
|
|
n->func_variadic = TRUE; |
|
|
|
|
n->over = NULL; |
|
|
|
|
n->location = @1; |
|
|
|
|
$$ = (Node *)n; |
|
|
|
|
} |
|
|
|
|
| func_name '(' func_arg_list sort_clause ')' |
|
|
|
|
{ |
|
|
|
|
FuncCall *n = makeNode(FuncCall); |
|
|
|
|
n->funcname = $1; |
|
|
|
|
n->args = $3; |
|
|
|
|
FuncCall *n = makeFuncCall($1, $3, @1); |
|
|
|
|
n->agg_order = $4; |
|
|
|
|
n->agg_star = FALSE; |
|
|
|
|
n->agg_distinct = FALSE; |
|
|
|
|
n->func_variadic = FALSE; |
|
|
|
|
n->over = NULL; |
|
|
|
|
n->location = @1; |
|
|
|
|
$$ = (Node *)n; |
|
|
|
|
} |
|
|
|
|
| func_name '(' ALL func_arg_list opt_sort_clause ')' |
|
|
|
|
{ |
|
|
|
|
FuncCall *n = makeNode(FuncCall); |
|
|
|
|
n->funcname = $1; |
|
|
|
|
n->args = $4; |
|
|
|
|
FuncCall *n = makeFuncCall($1, $4, @1); |
|
|
|
|
n->agg_order = $5; |
|
|
|
|
n->agg_star = FALSE; |
|
|
|
|
n->agg_distinct = FALSE; |
|
|
|
|
/* Ideally we'd mark the FuncCall node to indicate |
|
|
|
|
* "must be an aggregate", but there's no provision |
|
|
|
|
* for that in FuncCall at the moment. |
|
|
|
|
*/ |
|
|
|
|
n->func_variadic = FALSE; |
|
|
|
|
n->over = NULL; |
|
|
|
|
n->location = @1; |
|
|
|
|
$$ = (Node *)n; |
|
|
|
|
} |
|
|
|
|
| func_name '(' DISTINCT func_arg_list opt_sort_clause ')' |
|
|
|
|
{ |
|
|
|
|
FuncCall *n = makeNode(FuncCall); |
|
|
|
|
n->funcname = $1; |
|
|
|
|
n->args = $4; |
|
|
|
|
FuncCall *n = makeFuncCall($1, $4, @1); |
|
|
|
|
n->agg_order = $5; |
|
|
|
|
n->agg_star = FALSE; |
|
|
|
|
n->agg_distinct = TRUE; |
|
|
|
|
n->func_variadic = FALSE; |
|
|
|
|
n->over = NULL; |
|
|
|
|
n->location = @1; |
|
|
|
|
$$ = (Node *)n; |
|
|
|
|
} |
|
|
|
|
| func_name '(' '*' ')' |
|
|
|
|
@ -11202,15 +11095,8 @@ func_application: func_name '(' ')' |
|
|
|
|
* so that later processing can detect what the argument |
|
|
|
|
* really was. |
|
|
|
|
*/ |
|
|
|
|
FuncCall *n = makeNode(FuncCall); |
|
|
|
|
n->funcname = $1; |
|
|
|
|
n->args = NIL; |
|
|
|
|
n->agg_order = NIL; |
|
|
|
|
FuncCall *n = makeFuncCall($1, NIL, @1); |
|
|
|
|
n->agg_star = TRUE; |
|
|
|
|
n->agg_distinct = FALSE; |
|
|
|
|
n->func_variadic = FALSE; |
|
|
|
|
n->over = NULL; |
|
|
|
|
n->location = @1; |
|
|
|
|
$$ = (Node *)n; |
|
|
|
|
} |
|
|
|
|
; |
|
|
|
|
@ -11252,16 +11138,9 @@ func_expr_windowless: |
|
|
|
|
func_expr_common_subexpr: |
|
|
|
|
COLLATION FOR '(' a_expr ')' |
|
|
|
|
{ |
|
|
|
|
FuncCall *n = makeNode(FuncCall); |
|
|
|
|
n->funcname = SystemFuncName("pg_collation_for"); |
|
|
|
|
n->args = list_make1($4); |
|
|
|
|
n->agg_order = NIL; |
|
|
|
|
n->agg_star = FALSE; |
|
|
|
|
n->agg_distinct = FALSE; |
|
|
|
|
n->func_variadic = FALSE; |
|
|
|
|
n->over = NULL; |
|
|
|
|
n->location = @1; |
|
|
|
|
$$ = (Node *)n; |
|
|
|
|
$$ = (Node *) makeFuncCall(SystemFuncName("pg_collation_for"), |
|
|
|
|
list_make1($4), |
|
|
|
|
@1); |
|
|
|
|
} |
|
|
|
|
| CURRENT_DATE |
|
|
|
|
{ |
|
|
|
|
@ -11313,16 +11192,7 @@ func_expr_common_subexpr: |
|
|
|
|
* Translate as "now()", since we have a function that |
|
|
|
|
* does exactly what is needed. |
|
|
|
|
*/ |
|
|
|
|
FuncCall *n = makeNode(FuncCall); |
|
|
|
|
n->funcname = SystemFuncName("now"); |
|
|
|
|
n->args = NIL; |
|
|
|
|
n->agg_order = NIL; |
|
|
|
|
n->agg_star = FALSE; |
|
|
|
|
n->agg_distinct = FALSE; |
|
|
|
|
n->func_variadic = FALSE; |
|
|
|
|
n->over = NULL; |
|
|
|
|
n->location = @1; |
|
|
|
|
$$ = (Node *)n; |
|
|
|
|
$$ = (Node *) makeFuncCall(SystemFuncName("now"), NIL, @1); |
|
|
|
|
} |
|
|
|
|
| CURRENT_TIMESTAMP '(' Iconst ')' |
|
|
|
|
{ |
|
|
|
|
@ -11385,96 +11255,33 @@ func_expr_common_subexpr: |
|
|
|
|
} |
|
|
|
|
| CURRENT_ROLE |
|
|
|
|
{ |
|
|
|
|
FuncCall *n = makeNode(FuncCall); |
|
|
|
|
n->funcname = SystemFuncName("current_user"); |
|
|
|
|
n->args = NIL; |
|
|
|
|
n->agg_order = NIL; |
|
|
|
|
n->agg_star = FALSE; |
|
|
|
|
n->agg_distinct = FALSE; |
|
|
|
|
n->func_variadic = FALSE; |
|
|
|
|
n->over = NULL; |
|
|
|
|
n->location = @1; |
|
|
|
|
$$ = (Node *)n; |
|
|
|
|
$$ = (Node *) makeFuncCall(SystemFuncName("current_user"), NIL, @1); |
|
|
|
|
} |
|
|
|
|
| CURRENT_USER |
|
|
|
|
{ |
|
|
|
|
FuncCall *n = makeNode(FuncCall); |
|
|
|
|
n->funcname = SystemFuncName("current_user"); |
|
|
|
|
n->args = NIL; |
|
|
|
|
n->agg_order = NIL; |
|
|
|
|
n->agg_star = FALSE; |
|
|
|
|
n->agg_distinct = FALSE; |
|
|
|
|
n->func_variadic = FALSE; |
|
|
|
|
n->over = NULL; |
|
|
|
|
n->location = @1; |
|
|
|
|
$$ = (Node *)n; |
|
|
|
|
$$ = (Node *) makeFuncCall(SystemFuncName("current_user"), NIL, @1); |
|
|
|
|
} |
|
|
|
|
| SESSION_USER |
|
|
|
|
{ |
|
|
|
|
FuncCall *n = makeNode(FuncCall); |
|
|
|
|
n->funcname = SystemFuncName("session_user"); |
|
|
|
|
n->args = NIL; |
|
|
|
|
n->agg_order = NIL; |
|
|
|
|
n->agg_star = FALSE; |
|
|
|
|
n->agg_distinct = FALSE; |
|
|
|
|
n->func_variadic = FALSE; |
|
|
|
|
n->over = NULL; |
|
|
|
|
n->location = @1; |
|
|
|
|
$$ = (Node *)n; |
|
|
|
|
$$ = (Node *) makeFuncCall(SystemFuncName("session_user"), NIL, @1); |
|
|
|
|
} |
|
|
|
|
| USER |
|
|
|
|
{ |
|
|
|
|
FuncCall *n = makeNode(FuncCall); |
|
|
|
|
n->funcname = SystemFuncName("current_user"); |
|
|
|
|
n->args = NIL; |
|
|
|
|
n->agg_order = NIL; |
|
|
|
|
n->agg_star = FALSE; |
|
|
|
|
n->agg_distinct = FALSE; |
|
|
|
|
n->func_variadic = FALSE; |
|
|
|
|
n->over = NULL; |
|
|
|
|
n->location = @1; |
|
|
|
|
$$ = (Node *)n; |
|
|
|
|
$$ = (Node *) makeFuncCall(SystemFuncName("current_user"), NIL, @1); |
|
|
|
|
} |
|
|
|
|
| CURRENT_CATALOG |
|
|
|
|
{ |
|
|
|
|
FuncCall *n = makeNode(FuncCall); |
|
|
|
|
n->funcname = SystemFuncName("current_database"); |
|
|
|
|
n->args = NIL; |
|
|
|
|
n->agg_order = NIL; |
|
|
|
|
n->agg_star = FALSE; |
|
|
|
|
n->agg_distinct = FALSE; |
|
|
|
|
n->func_variadic = FALSE; |
|
|
|
|
n->over = NULL; |
|
|
|
|
n->location = @1; |
|
|
|
|
$$ = (Node *)n; |
|
|
|
|
$$ = (Node *) makeFuncCall(SystemFuncName("current_database"), NIL, @1); |
|
|
|
|
} |
|
|
|
|
| CURRENT_SCHEMA |
|
|
|
|
{ |
|
|
|
|
FuncCall *n = makeNode(FuncCall); |
|
|
|
|
n->funcname = SystemFuncName("current_schema"); |
|
|
|
|
n->args = NIL; |
|
|
|
|
n->agg_order = NIL; |
|
|
|
|
n->agg_star = FALSE; |
|
|
|
|
n->agg_distinct = FALSE; |
|
|
|
|
n->func_variadic = FALSE; |
|
|
|
|
n->over = NULL; |
|
|
|
|
n->location = @1; |
|
|
|
|
$$ = (Node *)n; |
|
|
|
|
$$ = (Node *) makeFuncCall(SystemFuncName("current_schema"), NIL, @1); |
|
|
|
|
} |
|
|
|
|
| CAST '(' a_expr AS Typename ')' |
|
|
|
|
{ $$ = makeTypeCast($3, $5, @1); } |
|
|
|
|
| EXTRACT '(' extract_list ')' |
|
|
|
|
{ |
|
|
|
|
FuncCall *n = makeNode(FuncCall); |
|
|
|
|
n->funcname = SystemFuncName("date_part"); |
|
|
|
|
n->args = $3; |
|
|
|
|
n->agg_order = NIL; |
|
|
|
|
n->agg_star = FALSE; |
|
|
|
|
n->agg_distinct = FALSE; |
|
|
|
|
n->func_variadic = FALSE; |
|
|
|
|
n->over = NULL; |
|
|
|
|
n->location = @1; |
|
|
|
|
$$ = (Node *)n; |
|
|
|
|
$$ = (Node *) makeFuncCall(SystemFuncName("date_part"), $3, @1); |
|
|
|
|
} |
|
|
|
|
| OVERLAY '(' overlay_list ')' |
|
|
|
|
{ |
|
|
|
|
@ -11483,46 +11290,19 @@ func_expr_common_subexpr: |
|
|
|
|
* overlay(A PLACING B FROM C) is converted to |
|
|
|
|
* overlay(A, B, C) |
|
|
|
|
*/ |
|
|
|
|
FuncCall *n = makeNode(FuncCall); |
|
|
|
|
n->funcname = SystemFuncName("overlay"); |
|
|
|
|
n->args = $3; |
|
|
|
|
n->agg_order = NIL; |
|
|
|
|
n->agg_star = FALSE; |
|
|
|
|
n->agg_distinct = FALSE; |
|
|
|
|
n->func_variadic = FALSE; |
|
|
|
|
n->over = NULL; |
|
|
|
|
n->location = @1; |
|
|
|
|
$$ = (Node *)n; |
|
|
|
|
$$ = (Node *) makeFuncCall(SystemFuncName("overlay"), $3, @1); |
|
|
|
|
} |
|
|
|
|
| POSITION '(' position_list ')' |
|
|
|
|
{ |
|
|
|
|
/* position(A in B) is converted to position(B, A) */ |
|
|
|
|
FuncCall *n = makeNode(FuncCall); |
|
|
|
|
n->funcname = SystemFuncName("position"); |
|
|
|
|
n->args = $3; |
|
|
|
|
n->agg_order = NIL; |
|
|
|
|
n->agg_star = FALSE; |
|
|
|
|
n->agg_distinct = FALSE; |
|
|
|
|
n->func_variadic = FALSE; |
|
|
|
|
n->over = NULL; |
|
|
|
|
n->location = @1; |
|
|
|
|
$$ = (Node *)n; |
|
|
|
|
$$ = (Node *) makeFuncCall(SystemFuncName("position"), $3, @1); |
|
|
|
|
} |
|
|
|
|
| SUBSTRING '(' substr_list ')' |
|
|
|
|
{ |
|
|
|
|
/* substring(A from B for C) is converted to |
|
|
|
|
* substring(A, B, C) - thomas 2000-11-28 |
|
|
|
|
*/ |
|
|
|
|
FuncCall *n = makeNode(FuncCall); |
|
|
|
|
n->funcname = SystemFuncName("substring"); |
|
|
|
|
n->args = $3; |
|
|
|
|
n->agg_order = NIL; |
|
|
|
|
n->agg_star = FALSE; |
|
|
|
|
n->agg_distinct = FALSE; |
|
|
|
|
n->func_variadic = FALSE; |
|
|
|
|
n->over = NULL; |
|
|
|
|
n->location = @1; |
|
|
|
|
$$ = (Node *)n; |
|
|
|
|
$$ = (Node *) makeFuncCall(SystemFuncName("substring"), $3, @1); |
|
|
|
|
} |
|
|
|
|
| TREAT '(' a_expr AS Typename ')' |
|
|
|
|
{ |
|
|
|
|
@ -11531,75 +11311,32 @@ func_expr_common_subexpr: |
|
|
|
|
* In SQL99, this is intended for use with structured UDTs, |
|
|
|
|
* but let's make this a generally useful form allowing stronger |
|
|
|
|
* coercions than are handled by implicit casting. |
|
|
|
|
*/ |
|
|
|
|
FuncCall *n = makeNode(FuncCall); |
|
|
|
|
/* Convert SystemTypeName() to SystemFuncName() even though |
|
|
|
|
* |
|
|
|
|
* Convert SystemTypeName() to SystemFuncName() even though |
|
|
|
|
* at the moment they result in the same thing. |
|
|
|
|
*/ |
|
|
|
|
n->funcname = SystemFuncName(((Value *)llast($5->names))->val.str); |
|
|
|
|
n->args = list_make1($3); |
|
|
|
|
n->agg_order = NIL; |
|
|
|
|
n->agg_star = FALSE; |
|
|
|
|
n->agg_distinct = FALSE; |
|
|
|
|
n->func_variadic = FALSE; |
|
|
|
|
n->over = NULL; |
|
|
|
|
n->location = @1; |
|
|
|
|
$$ = (Node *)n; |
|
|
|
|
$$ = (Node *) makeFuncCall(SystemFuncName(((Value *)llast($5->names))->val.str), |
|
|
|
|
list_make1($3), |
|
|
|
|
@1); |
|
|
|
|
} |
|
|
|
|
| TRIM '(' BOTH trim_list ')' |
|
|
|
|
{ |
|
|
|
|
/* various trim expressions are defined in SQL |
|
|
|
|
* - thomas 1997-07-19 |
|
|
|
|
*/ |
|
|
|
|
FuncCall *n = makeNode(FuncCall); |
|
|
|
|
n->funcname = SystemFuncName("btrim"); |
|
|
|
|
n->args = $4; |
|
|
|
|
n->agg_order = NIL; |
|
|
|
|
n->agg_star = FALSE; |
|
|
|
|
n->agg_distinct = FALSE; |
|
|
|
|
n->func_variadic = FALSE; |
|
|
|
|
n->over = NULL; |
|
|
|
|
n->location = @1; |
|
|
|
|
$$ = (Node *)n; |
|
|
|
|
$$ = (Node *) makeFuncCall(SystemFuncName("btrim"), $4, @1); |
|
|
|
|
} |
|
|
|
|
| TRIM '(' LEADING trim_list ')' |
|
|
|
|
{ |
|
|
|
|
FuncCall *n = makeNode(FuncCall); |
|
|
|
|
n->funcname = SystemFuncName("ltrim"); |
|
|
|
|
n->args = $4; |
|
|
|
|
n->agg_order = NIL; |
|
|
|
|
n->agg_star = FALSE; |
|
|
|
|
n->agg_distinct = FALSE; |
|
|
|
|
n->func_variadic = FALSE; |
|
|
|
|
n->over = NULL; |
|
|
|
|
n->location = @1; |
|
|
|
|
$$ = (Node *)n; |
|
|
|
|
$$ = (Node *) makeFuncCall(SystemFuncName("ltrim"), $4, @1); |
|
|
|
|
} |
|
|
|
|
| TRIM '(' TRAILING trim_list ')' |
|
|
|
|
{ |
|
|
|
|
FuncCall *n = makeNode(FuncCall); |
|
|
|
|
n->funcname = SystemFuncName("rtrim"); |
|
|
|
|
n->args = $4; |
|
|
|
|
n->agg_order = NIL; |
|
|
|
|
n->agg_star = FALSE; |
|
|
|
|
n->agg_distinct = FALSE; |
|
|
|
|
n->func_variadic = FALSE; |
|
|
|
|
n->over = NULL; |
|
|
|
|
n->location = @1; |
|
|
|
|
$$ = (Node *)n; |
|
|
|
|
$$ = (Node *) makeFuncCall(SystemFuncName("rtrim"), $4, @1); |
|
|
|
|
} |
|
|
|
|
| TRIM '(' trim_list ')' |
|
|
|
|
{ |
|
|
|
|
FuncCall *n = makeNode(FuncCall); |
|
|
|
|
n->funcname = SystemFuncName("btrim"); |
|
|
|
|
n->args = $3; |
|
|
|
|
n->agg_order = NIL; |
|
|
|
|
n->agg_star = FALSE; |
|
|
|
|
n->agg_distinct = FALSE; |
|
|
|
|
n->func_variadic = FALSE; |
|
|
|
|
n->over = NULL; |
|
|
|
|
n->location = @1; |
|
|
|
|
$$ = (Node *)n; |
|
|
|
|
$$ = (Node *) makeFuncCall(SystemFuncName("btrim"), $3, @1); |
|
|
|
|
} |
|
|
|
|
| NULLIF '(' a_expr ',' a_expr ')' |
|
|
|
|
{ |
|
|
|
|
@ -11652,16 +11389,7 @@ func_expr_common_subexpr: |
|
|
|
|
{ |
|
|
|
|
/* xmlexists(A PASSING [BY REF] B [BY REF]) is |
|
|
|
|
* converted to xmlexists(A, B)*/ |
|
|
|
|
FuncCall *n = makeNode(FuncCall); |
|
|
|
|
n->funcname = SystemFuncName("xmlexists"); |
|
|
|
|
n->args = list_make2($3, $4); |
|
|
|
|
n->agg_order = NIL; |
|
|
|
|
n->agg_star = FALSE; |
|
|
|
|
n->agg_distinct = FALSE; |
|
|
|
|
n->func_variadic = FALSE; |
|
|
|
|
n->over = NULL; |
|
|
|
|
n->location = @1; |
|
|
|
|
$$ = (Node *)n; |
|
|
|
|
$$ = (Node *) makeFuncCall(SystemFuncName("xmlexists"), list_make2($3, $4), @1); |
|
|
|
|
} |
|
|
|
|
| XMLFOREST '(' xml_attribute_list ')' |
|
|
|
|
{ |
|
|
|
|
@ -13317,9 +13045,7 @@ makeBoolAConst(bool state, int location) |
|
|
|
|
static FuncCall * |
|
|
|
|
makeOverlaps(List *largs, List *rargs, int location, core_yyscan_t yyscanner) |
|
|
|
|
{ |
|
|
|
|
FuncCall *n = makeNode(FuncCall); |
|
|
|
|
|
|
|
|
|
n->funcname = SystemFuncName("overlaps"); |
|
|
|
|
FuncCall *n; |
|
|
|
|
if (list_length(largs) == 1) |
|
|
|
|
largs = lappend(largs, largs); |
|
|
|
|
else if (list_length(largs) != 2) |
|
|
|
|
@ -13334,13 +13060,7 @@ makeOverlaps(List *largs, List *rargs, int location, core_yyscan_t yyscanner) |
|
|
|
|
(errcode(ERRCODE_SYNTAX_ERROR), |
|
|
|
|
errmsg("wrong number of parameters on right side of OVERLAPS expression"), |
|
|
|
|
parser_errposition(location))); |
|
|
|
|
n->args = list_concat(largs, rargs); |
|
|
|
|
n->agg_order = NIL; |
|
|
|
|
n->agg_star = FALSE; |
|
|
|
|
n->agg_distinct = FALSE; |
|
|
|
|
n->func_variadic = FALSE; |
|
|
|
|
n->over = NULL; |
|
|
|
|
n->location = location; |
|
|
|
|
n = makeFuncCall(SystemFuncName("overlaps"), list_concat(largs, rargs), location); |
|
|
|
|
return n; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|