LCOV - code coverage report
Current view: top level - src/backend/parser - parse_expr.c (source / functions) Hit Total Coverage
Test: PostgreSQL 19devel Lines: 1594 1820 87.6 %
Date: 2026-02-03 21:17:54 Functions: 62 62 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /*-------------------------------------------------------------------------
       2             :  *
       3             :  * parse_expr.c
       4             :  *    handle expressions in parser
       5             :  *
       6             :  * Portions Copyright (c) 1996-2026, PostgreSQL Global Development Group
       7             :  * Portions Copyright (c) 1994, Regents of the University of California
       8             :  *
       9             :  *
      10             :  * IDENTIFICATION
      11             :  *    src/backend/parser/parse_expr.c
      12             :  *
      13             :  *-------------------------------------------------------------------------
      14             :  */
      15             : 
      16             : #include "postgres.h"
      17             : 
      18             : #include "access/htup_details.h"
      19             : #include "catalog/pg_aggregate.h"
      20             : #include "catalog/pg_type.h"
      21             : #include "miscadmin.h"
      22             : #include "nodes/makefuncs.h"
      23             : #include "nodes/nodeFuncs.h"
      24             : #include "optimizer/optimizer.h"
      25             : #include "parser/analyze.h"
      26             : #include "parser/parse_agg.h"
      27             : #include "parser/parse_clause.h"
      28             : #include "parser/parse_coerce.h"
      29             : #include "parser/parse_collate.h"
      30             : #include "parser/parse_expr.h"
      31             : #include "parser/parse_func.h"
      32             : #include "parser/parse_oper.h"
      33             : #include "parser/parse_relation.h"
      34             : #include "parser/parse_target.h"
      35             : #include "parser/parse_type.h"
      36             : #include "utils/builtins.h"
      37             : #include "utils/date.h"
      38             : #include "utils/fmgroids.h"
      39             : #include "utils/lsyscache.h"
      40             : #include "utils/timestamp.h"
      41             : #include "utils/typcache.h"
      42             : #include "utils/xml.h"
      43             : 
      44             : /* GUC parameters */
      45             : bool        Transform_null_equals = false;
      46             : 
      47             : 
      48             : static Node *transformExprRecurse(ParseState *pstate, Node *expr);
      49             : static Node *transformParamRef(ParseState *pstate, ParamRef *pref);
      50             : static Node *transformAExprOp(ParseState *pstate, A_Expr *a);
      51             : static Node *transformAExprOpAny(ParseState *pstate, A_Expr *a);
      52             : static Node *transformAExprOpAll(ParseState *pstate, A_Expr *a);
      53             : static Node *transformAExprDistinct(ParseState *pstate, A_Expr *a);
      54             : static Node *transformAExprNullIf(ParseState *pstate, A_Expr *a);
      55             : static Node *transformAExprIn(ParseState *pstate, A_Expr *a);
      56             : static Node *transformAExprBetween(ParseState *pstate, A_Expr *a);
      57             : static Node *transformMergeSupportFunc(ParseState *pstate, MergeSupportFunc *f);
      58             : static Node *transformBoolExpr(ParseState *pstate, BoolExpr *a);
      59             : static Node *transformFuncCall(ParseState *pstate, FuncCall *fn);
      60             : static Node *transformMultiAssignRef(ParseState *pstate, MultiAssignRef *maref);
      61             : static Node *transformCaseExpr(ParseState *pstate, CaseExpr *c);
      62             : static Node *transformSubLink(ParseState *pstate, SubLink *sublink);
      63             : static Node *transformArrayExpr(ParseState *pstate, A_ArrayExpr *a,
      64             :                                 Oid array_type, Oid element_type, int32 typmod);
      65             : static Node *transformRowExpr(ParseState *pstate, RowExpr *r, bool allowDefault);
      66             : static Node *transformCoalesceExpr(ParseState *pstate, CoalesceExpr *c);
      67             : static Node *transformMinMaxExpr(ParseState *pstate, MinMaxExpr *m);
      68             : static Node *transformSQLValueFunction(ParseState *pstate,
      69             :                                        SQLValueFunction *svf);
      70             : static Node *transformXmlExpr(ParseState *pstate, XmlExpr *x);
      71             : static Node *transformXmlSerialize(ParseState *pstate, XmlSerialize *xs);
      72             : static Node *transformBooleanTest(ParseState *pstate, BooleanTest *b);
      73             : static Node *transformCurrentOfExpr(ParseState *pstate, CurrentOfExpr *cexpr);
      74             : static Node *transformColumnRef(ParseState *pstate, ColumnRef *cref);
      75             : static Node *transformWholeRowRef(ParseState *pstate,
      76             :                                   ParseNamespaceItem *nsitem,
      77             :                                   int sublevels_up, int location);
      78             : static Node *transformIndirection(ParseState *pstate, A_Indirection *ind);
      79             : static Node *transformTypeCast(ParseState *pstate, TypeCast *tc);
      80             : static Node *transformCollateClause(ParseState *pstate, CollateClause *c);
      81             : static Node *transformJsonObjectConstructor(ParseState *pstate,
      82             :                                             JsonObjectConstructor *ctor);
      83             : static Node *transformJsonArrayConstructor(ParseState *pstate,
      84             :                                            JsonArrayConstructor *ctor);
      85             : static Node *transformJsonArrayQueryConstructor(ParseState *pstate,
      86             :                                                 JsonArrayQueryConstructor *ctor);
      87             : static Node *transformJsonObjectAgg(ParseState *pstate, JsonObjectAgg *agg);
      88             : static Node *transformJsonArrayAgg(ParseState *pstate, JsonArrayAgg *agg);
      89             : static Node *transformJsonIsPredicate(ParseState *pstate, JsonIsPredicate *pred);
      90             : static Node *transformJsonParseExpr(ParseState *pstate, JsonParseExpr *jsexpr);
      91             : static Node *transformJsonScalarExpr(ParseState *pstate, JsonScalarExpr *jsexpr);
      92             : static Node *transformJsonSerializeExpr(ParseState *pstate,
      93             :                                         JsonSerializeExpr *expr);
      94             : static Node *transformJsonFuncExpr(ParseState *pstate, JsonFuncExpr *func);
      95             : static void transformJsonPassingArgs(ParseState *pstate, const char *constructName,
      96             :                                      JsonFormatType format, List *args,
      97             :                                      List **passing_values, List **passing_names);
      98             : static JsonBehavior *transformJsonBehavior(ParseState *pstate, JsonExpr *jsexpr,
      99             :                                            JsonBehavior *behavior,
     100             :                                            JsonBehaviorType default_behavior,
     101             :                                            JsonReturning *returning);
     102             : static Node *GetJsonBehaviorConst(JsonBehaviorType btype, int location);
     103             : static Node *make_row_comparison_op(ParseState *pstate, List *opname,
     104             :                                     List *largs, List *rargs, int location);
     105             : static Node *make_row_distinct_op(ParseState *pstate, List *opname,
     106             :                                   RowExpr *lrow, RowExpr *rrow, int location);
     107             : static Expr *make_distinct_op(ParseState *pstate, List *opname,
     108             :                               Node *ltree, Node *rtree, int location);
     109             : static Node *make_nulltest_from_distinct(ParseState *pstate,
     110             :                                          A_Expr *distincta, Node *arg);
     111             : 
     112             : 
     113             : /*
     114             :  * transformExpr -
     115             :  *    Analyze and transform expressions. Type checking and type casting is
     116             :  *    done here.  This processing converts the raw grammar output into
     117             :  *    expression trees with fully determined semantics.
     118             :  */
     119             : Node *
     120     1827914 : transformExpr(ParseState *pstate, Node *expr, ParseExprKind exprKind)
     121             : {
     122             :     Node       *result;
     123             :     ParseExprKind sv_expr_kind;
     124             : 
     125             :     /* Save and restore identity of expression type we're parsing */
     126             :     Assert(exprKind != EXPR_KIND_NONE);
     127     1827914 :     sv_expr_kind = pstate->p_expr_kind;
     128     1827914 :     pstate->p_expr_kind = exprKind;
     129             : 
     130     1827914 :     result = transformExprRecurse(pstate, expr);
     131             : 
     132     1821558 :     pstate->p_expr_kind = sv_expr_kind;
     133             : 
     134     1821558 :     return result;
     135             : }
     136             : 
     137             : static Node *
     138     4884820 : transformExprRecurse(ParseState *pstate, Node *expr)
     139             : {
     140             :     Node       *result;
     141             : 
     142     4884820 :     if (expr == NULL)
     143       34278 :         return NULL;
     144             : 
     145             :     /* Guard against stack overflow due to overly complex expressions */
     146     4850542 :     check_stack_depth();
     147             : 
     148     4850542 :     switch (nodeTag(expr))
     149             :     {
     150     1801492 :         case T_ColumnRef:
     151     1801492 :             result = transformColumnRef(pstate, (ColumnRef *) expr);
     152     1800804 :             break;
     153             : 
     154       45942 :         case T_ParamRef:
     155       45942 :             result = transformParamRef(pstate, (ParamRef *) expr);
     156       45930 :             break;
     157             : 
     158     1247966 :         case T_A_Const:
     159     1247966 :             result = (Node *) make_const(pstate, (A_Const *) expr);
     160     1247942 :             break;
     161             : 
     162       23952 :         case T_A_Indirection:
     163       23952 :             result = transformIndirection(pstate, (A_Indirection *) expr);
     164       23856 :             break;
     165             : 
     166        6490 :         case T_A_ArrayExpr:
     167        6490 :             result = transformArrayExpr(pstate, (A_ArrayExpr *) expr,
     168             :                                         InvalidOid, InvalidOid, -1);
     169        6484 :             break;
     170             : 
     171      320718 :         case T_TypeCast:
     172      320718 :             result = transformTypeCast(pstate, (TypeCast *) expr);
     173      316860 :             break;
     174             : 
     175        9518 :         case T_CollateClause:
     176        9518 :             result = transformCollateClause(pstate, (CollateClause *) expr);
     177        9500 :             break;
     178             : 
     179      649454 :         case T_A_Expr:
     180             :             {
     181      649454 :                 A_Expr     *a = (A_Expr *) expr;
     182             : 
     183      649454 :                 switch (a->kind)
     184             :                 {
     185      605042 :                     case AEXPR_OP:
     186      605042 :                         result = transformAExprOp(pstate, a);
     187      604560 :                         break;
     188       16920 :                     case AEXPR_OP_ANY:
     189       16920 :                         result = transformAExprOpAny(pstate, a);
     190       16908 :                         break;
     191         300 :                     case AEXPR_OP_ALL:
     192         300 :                         result = transformAExprOpAll(pstate, a);
     193         300 :                         break;
     194        1148 :                     case AEXPR_DISTINCT:
     195             :                     case AEXPR_NOT_DISTINCT:
     196        1148 :                         result = transformAExprDistinct(pstate, a);
     197        1148 :                         break;
     198         484 :                     case AEXPR_NULLIF:
     199         484 :                         result = transformAExprNullIf(pstate, a);
     200         484 :                         break;
     201       22252 :                     case AEXPR_IN:
     202       22252 :                         result = transformAExprIn(pstate, a);
     203       22240 :                         break;
     204        2790 :                     case AEXPR_LIKE:
     205             :                     case AEXPR_ILIKE:
     206             :                     case AEXPR_SIMILAR:
     207             :                         /* we can transform these just like AEXPR_OP */
     208        2790 :                         result = transformAExprOp(pstate, a);
     209        2784 :                         break;
     210         518 :                     case AEXPR_BETWEEN:
     211             :                     case AEXPR_NOT_BETWEEN:
     212             :                     case AEXPR_BETWEEN_SYM:
     213             :                     case AEXPR_NOT_BETWEEN_SYM:
     214         518 :                         result = transformAExprBetween(pstate, a);
     215         518 :                         break;
     216           0 :                     default:
     217           0 :                         elog(ERROR, "unrecognized A_Expr kind: %d", a->kind);
     218             :                         result = NULL;  /* keep compiler quiet */
     219             :                         break;
     220             :                 }
     221      648942 :                 break;
     222             :             }
     223             : 
     224      156636 :         case T_BoolExpr:
     225      156636 :             result = transformBoolExpr(pstate, (BoolExpr *) expr);
     226      156616 :             break;
     227             : 
     228      382308 :         case T_FuncCall:
     229      382308 :             result = transformFuncCall(pstate, (FuncCall *) expr);
     230      381180 :             break;
     231             : 
     232         378 :         case T_MultiAssignRef:
     233         378 :             result = transformMultiAssignRef(pstate, (MultiAssignRef *) expr);
     234         372 :             break;
     235             : 
     236         370 :         case T_GroupingFunc:
     237         370 :             result = transformGroupingFunc(pstate, (GroupingFunc *) expr);
     238         370 :             break;
     239             : 
     240         204 :         case T_MergeSupportFunc:
     241         204 :             result = transformMergeSupportFunc(pstate,
     242             :                                                (MergeSupportFunc *) expr);
     243         192 :             break;
     244             : 
     245       46656 :         case T_NamedArgExpr:
     246             :             {
     247       46656 :                 NamedArgExpr *na = (NamedArgExpr *) expr;
     248             : 
     249       46656 :                 na->arg = (Expr *) transformExprRecurse(pstate, (Node *) na->arg);
     250       46656 :                 result = expr;
     251       46656 :                 break;
     252             :             }
     253             : 
     254       48660 :         case T_SubLink:
     255       48660 :             result = transformSubLink(pstate, (SubLink *) expr);
     256       48558 :             break;
     257             : 
     258       40212 :         case T_CaseExpr:
     259       40212 :             result = transformCaseExpr(pstate, (CaseExpr *) expr);
     260       40206 :             break;
     261             : 
     262        5906 :         case T_RowExpr:
     263        5906 :             result = transformRowExpr(pstate, (RowExpr *) expr, false);
     264        5906 :             break;
     265             : 
     266        3320 :         case T_CoalesceExpr:
     267        3320 :             result = transformCoalesceExpr(pstate, (CoalesceExpr *) expr);
     268        3314 :             break;
     269             : 
     270         280 :         case T_MinMaxExpr:
     271         280 :             result = transformMinMaxExpr(pstate, (MinMaxExpr *) expr);
     272         280 :             break;
     273             : 
     274        2728 :         case T_SQLValueFunction:
     275        2728 :             result = transformSQLValueFunction(pstate,
     276             :                                                (SQLValueFunction *) expr);
     277        2728 :             break;
     278             : 
     279         596 :         case T_XmlExpr:
     280         596 :             result = transformXmlExpr(pstate, (XmlExpr *) expr);
     281         566 :             break;
     282             : 
     283         218 :         case T_XmlSerialize:
     284         218 :             result = transformXmlSerialize(pstate, (XmlSerialize *) expr);
     285         218 :             break;
     286             : 
     287       18776 :         case T_NullTest:
     288             :             {
     289       18776 :                 NullTest   *n = (NullTest *) expr;
     290             : 
     291       18776 :                 n->arg = (Expr *) transformExprRecurse(pstate, (Node *) n->arg);
     292             :                 /* the argument can be any type, so don't coerce it */
     293       18776 :                 n->argisrow = type_is_rowtype(exprType((Node *) n->arg));
     294       18776 :                 result = expr;
     295       18776 :                 break;
     296             :             }
     297             : 
     298         946 :         case T_BooleanTest:
     299         946 :             result = transformBooleanTest(pstate, (BooleanTest *) expr);
     300         946 :             break;
     301             : 
     302         254 :         case T_CurrentOfExpr:
     303         254 :             result = transformCurrentOfExpr(pstate, (CurrentOfExpr *) expr);
     304         254 :             break;
     305             : 
     306             :             /*
     307             :              * In all places where DEFAULT is legal, the caller should have
     308             :              * processed it rather than passing it to transformExpr().
     309             :              */
     310           0 :         case T_SetToDefault:
     311           0 :             ereport(ERROR,
     312             :                     (errcode(ERRCODE_SYNTAX_ERROR),
     313             :                      errmsg("DEFAULT is not allowed in this context"),
     314             :                      parser_errposition(pstate,
     315             :                                         ((SetToDefault *) expr)->location)));
     316             :             break;
     317             : 
     318             :             /*
     319             :              * CaseTestExpr doesn't require any processing; it is only
     320             :              * injected into parse trees in a fully-formed state.
     321             :              *
     322             :              * Ordinarily we should not see a Var here, but it is convenient
     323             :              * for transformJoinUsingClause() to create untransformed operator
     324             :              * trees containing already-transformed Vars.  The best
     325             :              * alternative would be to deconstruct and reconstruct column
     326             :              * references, which seems expensively pointless.  So allow it.
     327             :              */
     328       31566 :         case T_CaseTestExpr:
     329             :         case T_Var:
     330             :             {
     331       31566 :                 result = expr;
     332       31566 :                 break;
     333             :             }
     334             : 
     335         440 :         case T_JsonObjectConstructor:
     336         440 :             result = transformJsonObjectConstructor(pstate, (JsonObjectConstructor *) expr);
     337         398 :             break;
     338             : 
     339         206 :         case T_JsonArrayConstructor:
     340         206 :             result = transformJsonArrayConstructor(pstate, (JsonArrayConstructor *) expr);
     341         188 :             break;
     342             : 
     343          60 :         case T_JsonArrayQueryConstructor:
     344          60 :             result = transformJsonArrayQueryConstructor(pstate, (JsonArrayQueryConstructor *) expr);
     345          42 :             break;
     346             : 
     347         204 :         case T_JsonObjectAgg:
     348         204 :             result = transformJsonObjectAgg(pstate, (JsonObjectAgg *) expr);
     349         204 :             break;
     350             : 
     351         198 :         case T_JsonArrayAgg:
     352         198 :             result = transformJsonArrayAgg(pstate, (JsonArrayAgg *) expr);
     353         198 :             break;
     354             : 
     355         350 :         case T_JsonIsPredicate:
     356         350 :             result = transformJsonIsPredicate(pstate, (JsonIsPredicate *) expr);
     357         344 :             break;
     358             : 
     359         164 :         case T_JsonParseExpr:
     360         164 :             result = transformJsonParseExpr(pstate, (JsonParseExpr *) expr);
     361         138 :             break;
     362             : 
     363         112 :         case T_JsonScalarExpr:
     364         112 :             result = transformJsonScalarExpr(pstate, (JsonScalarExpr *) expr);
     365         112 :             break;
     366             : 
     367         108 :         case T_JsonSerializeExpr:
     368         108 :             result = transformJsonSerializeExpr(pstate, (JsonSerializeExpr *) expr);
     369          98 :             break;
     370             : 
     371        3154 :         case T_JsonFuncExpr:
     372        3154 :             result = transformJsonFuncExpr(pstate, (JsonFuncExpr *) expr);
     373        2980 :             break;
     374             : 
     375           0 :         default:
     376             :             /* should not reach here */
     377           0 :             elog(ERROR, "unrecognized node type: %d", (int) nodeTag(expr));
     378             :             result = NULL;      /* keep compiler quiet */
     379             :             break;
     380             :     }
     381             : 
     382     4843724 :     return result;
     383             : }
     384             : 
     385             : /*
     386             :  * helper routine for delivering "column does not exist" error message
     387             :  *
     388             :  * (Usually we don't have to work this hard, but the general case of field
     389             :  * selection from an arbitrary node needs it.)
     390             :  */
     391             : static void
     392          44 : unknown_attribute(ParseState *pstate, Node *relref, const char *attname,
     393             :                   int location)
     394             : {
     395             :     RangeTblEntry *rte;
     396             : 
     397          44 :     if (IsA(relref, Var) &&
     398          12 :         ((Var *) relref)->varattno == InvalidAttrNumber)
     399             :     {
     400             :         /* Reference the RTE by alias not by actual table name */
     401           0 :         rte = GetRTEByRangeTablePosn(pstate,
     402             :                                      ((Var *) relref)->varno,
     403           0 :                                      ((Var *) relref)->varlevelsup);
     404           0 :         ereport(ERROR,
     405             :                 (errcode(ERRCODE_UNDEFINED_COLUMN),
     406             :                  errmsg("column %s.%s does not exist",
     407             :                         rte->eref->aliasname, attname),
     408             :                  parser_errposition(pstate, location)));
     409             :     }
     410             :     else
     411             :     {
     412             :         /* Have to do it by reference to the type of the expression */
     413          44 :         Oid         relTypeId = exprType(relref);
     414             : 
     415          44 :         if (ISCOMPLEX(relTypeId))
     416          18 :             ereport(ERROR,
     417             :                     (errcode(ERRCODE_UNDEFINED_COLUMN),
     418             :                      errmsg("column \"%s\" not found in data type %s",
     419             :                             attname, format_type_be(relTypeId)),
     420             :                      parser_errposition(pstate, location)));
     421          26 :         else if (relTypeId == RECORDOID)
     422          20 :             ereport(ERROR,
     423             :                     (errcode(ERRCODE_UNDEFINED_COLUMN),
     424             :                      errmsg("could not identify column \"%s\" in record data type",
     425             :                             attname),
     426             :                      parser_errposition(pstate, location)));
     427             :         else
     428           6 :             ereport(ERROR,
     429             :                     (errcode(ERRCODE_WRONG_OBJECT_TYPE),
     430             :                      errmsg("column notation .%s applied to type %s, "
     431             :                             "which is not a composite type",
     432             :                             attname, format_type_be(relTypeId)),
     433             :                      parser_errposition(pstate, location)));
     434             :     }
     435             : }
     436             : 
     437             : static Node *
     438       23952 : transformIndirection(ParseState *pstate, A_Indirection *ind)
     439             : {
     440       23952 :     Node       *last_srf = pstate->p_last_srf;
     441       23952 :     Node       *result = transformExprRecurse(pstate, ind->arg);
     442       23952 :     List       *subscripts = NIL;
     443       23952 :     int         location = exprLocation(result);
     444             :     ListCell   *i;
     445             : 
     446             :     /*
     447             :      * We have to split any field-selection operations apart from
     448             :      * subscripting.  Adjacent A_Indices nodes have to be treated as a single
     449             :      * multidimensional subscript operation.
     450             :      */
     451       47350 :     foreach(i, ind->indirection)
     452             :     {
     453       23442 :         Node       *n = lfirst(i);
     454             : 
     455       23442 :         if (IsA(n, A_Indices))
     456       11908 :             subscripts = lappend(subscripts, n);
     457       11534 :         else if (IsA(n, A_Star))
     458             :         {
     459           0 :             ereport(ERROR,
     460             :                     (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
     461             :                      errmsg("row expansion via \"*\" is not supported here"),
     462             :                      parser_errposition(pstate, location)));
     463             :         }
     464             :         else
     465             :         {
     466             :             Node       *newresult;
     467             : 
     468             :             Assert(IsA(n, String));
     469             : 
     470             :             /* process subscripts before this field selection */
     471       11534 :             if (subscripts)
     472         154 :                 result = (Node *) transformContainerSubscripts(pstate,
     473             :                                                                result,
     474             :                                                                exprType(result),
     475             :                                                                exprTypmod(result),
     476             :                                                                subscripts,
     477             :                                                                false);
     478       11534 :             subscripts = NIL;
     479             : 
     480       11534 :             newresult = ParseFuncOrColumn(pstate,
     481       11534 :                                           list_make1(n),
     482       11534 :                                           list_make1(result),
     483             :                                           last_srf,
     484             :                                           NULL,
     485             :                                           false,
     486             :                                           location);
     487       11534 :             if (newresult == NULL)
     488          44 :                 unknown_attribute(pstate, result, strVal(n), location);
     489       11490 :             result = newresult;
     490             :         }
     491             :     }
     492             :     /* process trailing subscripts, if any */
     493       23908 :     if (subscripts)
     494       11434 :         result = (Node *) transformContainerSubscripts(pstate,
     495             :                                                        result,
     496             :                                                        exprType(result),
     497             :                                                        exprTypmod(result),
     498             :                                                        subscripts,
     499             :                                                        false);
     500             : 
     501       23856 :     return result;
     502             : }
     503             : 
     504             : /*
     505             :  * Transform a ColumnRef.
     506             :  *
     507             :  * If you find yourself changing this code, see also ExpandColumnRefStar.
     508             :  */
     509             : static Node *
     510     1801492 : transformColumnRef(ParseState *pstate, ColumnRef *cref)
     511             : {
     512     1801492 :     Node       *node = NULL;
     513     1801492 :     char       *nspname = NULL;
     514     1801492 :     char       *relname = NULL;
     515     1801492 :     char       *colname = NULL;
     516             :     ParseNamespaceItem *nsitem;
     517             :     int         levels_up;
     518             :     enum
     519             :     {
     520             :         CRERR_NO_COLUMN,
     521             :         CRERR_NO_RTE,
     522             :         CRERR_WRONG_DB,
     523             :         CRERR_TOO_MANY
     524     1801492 :     }           crerr = CRERR_NO_COLUMN;
     525             :     const char *err;
     526             : 
     527             :     /*
     528             :      * Check to see if the column reference is in an invalid place within the
     529             :      * query.  We allow column references in most places, except in default
     530             :      * expressions and partition bound expressions.
     531             :      */
     532     1801492 :     err = NULL;
     533     1801492 :     switch (pstate->p_expr_kind)
     534             :     {
     535           0 :         case EXPR_KIND_NONE:
     536             :             Assert(false);      /* can't happen */
     537           0 :             break;
     538     1801408 :         case EXPR_KIND_OTHER:
     539             :         case EXPR_KIND_JOIN_ON:
     540             :         case EXPR_KIND_JOIN_USING:
     541             :         case EXPR_KIND_FROM_SUBSELECT:
     542             :         case EXPR_KIND_FROM_FUNCTION:
     543             :         case EXPR_KIND_WHERE:
     544             :         case EXPR_KIND_POLICY:
     545             :         case EXPR_KIND_HAVING:
     546             :         case EXPR_KIND_FILTER:
     547             :         case EXPR_KIND_WINDOW_PARTITION:
     548             :         case EXPR_KIND_WINDOW_ORDER:
     549             :         case EXPR_KIND_WINDOW_FRAME_RANGE:
     550             :         case EXPR_KIND_WINDOW_FRAME_ROWS:
     551             :         case EXPR_KIND_WINDOW_FRAME_GROUPS:
     552             :         case EXPR_KIND_SELECT_TARGET:
     553             :         case EXPR_KIND_INSERT_TARGET:
     554             :         case EXPR_KIND_UPDATE_SOURCE:
     555             :         case EXPR_KIND_UPDATE_TARGET:
     556             :         case EXPR_KIND_MERGE_WHEN:
     557             :         case EXPR_KIND_GROUP_BY:
     558             :         case EXPR_KIND_ORDER_BY:
     559             :         case EXPR_KIND_DISTINCT_ON:
     560             :         case EXPR_KIND_LIMIT:
     561             :         case EXPR_KIND_OFFSET:
     562             :         case EXPR_KIND_RETURNING:
     563             :         case EXPR_KIND_MERGE_RETURNING:
     564             :         case EXPR_KIND_VALUES:
     565             :         case EXPR_KIND_VALUES_SINGLE:
     566             :         case EXPR_KIND_CHECK_CONSTRAINT:
     567             :         case EXPR_KIND_DOMAIN_CHECK:
     568             :         case EXPR_KIND_FUNCTION_DEFAULT:
     569             :         case EXPR_KIND_INDEX_EXPRESSION:
     570             :         case EXPR_KIND_INDEX_PREDICATE:
     571             :         case EXPR_KIND_STATS_EXPRESSION:
     572             :         case EXPR_KIND_ALTER_COL_TRANSFORM:
     573             :         case EXPR_KIND_EXECUTE_PARAMETER:
     574             :         case EXPR_KIND_TRIGGER_WHEN:
     575             :         case EXPR_KIND_PARTITION_EXPRESSION:
     576             :         case EXPR_KIND_CALL_ARGUMENT:
     577             :         case EXPR_KIND_COPY_WHERE:
     578             :         case EXPR_KIND_GENERATED_COLUMN:
     579             :         case EXPR_KIND_CYCLE_MARK:
     580             :             /* okay */
     581     1801408 :             break;
     582             : 
     583          24 :         case EXPR_KIND_COLUMN_DEFAULT:
     584          24 :             err = _("cannot use column reference in DEFAULT expression");
     585          24 :             break;
     586          60 :         case EXPR_KIND_PARTITION_BOUND:
     587          60 :             err = _("cannot use column reference in partition bound expression");
     588          60 :             break;
     589             : 
     590             :             /*
     591             :              * There is intentionally no default: case here, so that the
     592             :              * compiler will warn if we add a new ParseExprKind without
     593             :              * extending this switch.  If we do see an unrecognized value at
     594             :              * runtime, the behavior will be the same as for EXPR_KIND_OTHER,
     595             :              * which is sane anyway.
     596             :              */
     597             :     }
     598     1801492 :     if (err)
     599          84 :         ereport(ERROR,
     600             :                 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
     601             :                  errmsg_internal("%s", err),
     602             :                  parser_errposition(pstate, cref->location)));
     603             : 
     604             :     /*
     605             :      * Give the PreParseColumnRefHook, if any, first shot.  If it returns
     606             :      * non-null then that's all, folks.
     607             :      */
     608     1801408 :     if (pstate->p_pre_columnref_hook != NULL)
     609             :     {
     610       38416 :         node = pstate->p_pre_columnref_hook(pstate, cref);
     611       38416 :         if (node != NULL)
     612         816 :             return node;
     613             :     }
     614             : 
     615             :     /*----------
     616             :      * The allowed syntaxes are:
     617             :      *
     618             :      * A        First try to resolve as unqualified column name;
     619             :      *          if no luck, try to resolve as unqualified table name (A.*).
     620             :      * A.B      A is an unqualified table name; B is either a
     621             :      *          column or function name (trying column name first).
     622             :      * A.B.C    schema A, table B, col or func name C.
     623             :      * A.B.C.D  catalog A, schema B, table C, col or func D.
     624             :      * A.*      A is an unqualified table name; means whole-row value.
     625             :      * A.B.*    whole-row value of table B in schema A.
     626             :      * A.B.C.*  whole-row value of table C in schema B in catalog A.
     627             :      *
     628             :      * We do not need to cope with bare "*"; that will only be accepted by
     629             :      * the grammar at the top level of a SELECT list, and transformTargetList
     630             :      * will take care of it before it ever gets here.  Also, "A.*" etc will
     631             :      * be expanded by transformTargetList if they appear at SELECT top level,
     632             :      * so here we are only going to see them as function or operator inputs.
     633             :      *
     634             :      * Currently, if a catalog name is given then it must equal the current
     635             :      * database name; we check it here and then discard it.
     636             :      *----------
     637             :      */
     638     1800592 :     switch (list_length(cref->fields))
     639             :     {
     640      732440 :         case 1:
     641             :             {
     642      732440 :                 Node       *field1 = (Node *) linitial(cref->fields);
     643             : 
     644      732440 :                 colname = strVal(field1);
     645             : 
     646             :                 /* Try to identify as an unqualified column */
     647      732440 :                 node = colNameToVar(pstate, colname, false, cref->location);
     648             : 
     649      732374 :                 if (node == NULL)
     650             :                 {
     651             :                     /*
     652             :                      * Not known as a column of any range-table entry.
     653             :                      *
     654             :                      * Try to find the name as a relation.  Note that only
     655             :                      * relations already entered into the rangetable will be
     656             :                      * recognized.
     657             :                      *
     658             :                      * This is a hack for backwards compatibility with
     659             :                      * PostQUEL-inspired syntax.  The preferred form now is
     660             :                      * "rel.*".
     661             :                      */
     662       37154 :                     nsitem = refnameNamespaceItem(pstate, NULL, colname,
     663             :                                                   cref->location,
     664             :                                                   &levels_up);
     665       37154 :                     if (nsitem)
     666        7544 :                         node = transformWholeRowRef(pstate, nsitem, levels_up,
     667             :                                                     cref->location);
     668             :                 }
     669      732374 :                 break;
     670             :             }
     671     1068068 :         case 2:
     672             :             {
     673     1068068 :                 Node       *field1 = (Node *) linitial(cref->fields);
     674     1068068 :                 Node       *field2 = (Node *) lsecond(cref->fields);
     675             : 
     676     1068068 :                 relname = strVal(field1);
     677             : 
     678             :                 /* Locate the referenced nsitem */
     679     1068068 :                 nsitem = refnameNamespaceItem(pstate, nspname, relname,
     680             :                                               cref->location,
     681             :                                               &levels_up);
     682     1068044 :                 if (nsitem == NULL)
     683             :                 {
     684        5558 :                     crerr = CRERR_NO_RTE;
     685        5558 :                     break;
     686             :                 }
     687             : 
     688             :                 /* Whole-row reference? */
     689     1062486 :                 if (IsA(field2, A_Star))
     690             :                 {
     691        1460 :                     node = transformWholeRowRef(pstate, nsitem, levels_up,
     692             :                                                 cref->location);
     693        1460 :                     break;
     694             :                 }
     695             : 
     696     1061026 :                 colname = strVal(field2);
     697             : 
     698             :                 /* Try to identify as a column of the nsitem */
     699     1061026 :                 node = scanNSItemForColumn(pstate, nsitem, levels_up, colname,
     700             :                                            cref->location);
     701     1061020 :                 if (node == NULL)
     702             :                 {
     703             :                     /* Try it as a function call on the whole row */
     704         168 :                     node = transformWholeRowRef(pstate, nsitem, levels_up,
     705             :                                                 cref->location);
     706         168 :                     node = ParseFuncOrColumn(pstate,
     707         168 :                                              list_make1(makeString(colname)),
     708         168 :                                              list_make1(node),
     709             :                                              pstate->p_last_srf,
     710             :                                              NULL,
     711             :                                              false,
     712             :                                              cref->location);
     713             :                 }
     714     1061020 :                 break;
     715             :             }
     716          84 :         case 3:
     717             :             {
     718          84 :                 Node       *field1 = (Node *) linitial(cref->fields);
     719          84 :                 Node       *field2 = (Node *) lsecond(cref->fields);
     720          84 :                 Node       *field3 = (Node *) lthird(cref->fields);
     721             : 
     722          84 :                 nspname = strVal(field1);
     723          84 :                 relname = strVal(field2);
     724             : 
     725             :                 /* Locate the referenced nsitem */
     726          84 :                 nsitem = refnameNamespaceItem(pstate, nspname, relname,
     727             :                                               cref->location,
     728             :                                               &levels_up);
     729          84 :                 if (nsitem == NULL)
     730             :                 {
     731          66 :                     crerr = CRERR_NO_RTE;
     732          66 :                     break;
     733             :                 }
     734             : 
     735             :                 /* Whole-row reference? */
     736          18 :                 if (IsA(field3, A_Star))
     737             :                 {
     738           6 :                     node = transformWholeRowRef(pstate, nsitem, levels_up,
     739             :                                                 cref->location);
     740           6 :                     break;
     741             :                 }
     742             : 
     743          12 :                 colname = strVal(field3);
     744             : 
     745             :                 /* Try to identify as a column of the nsitem */
     746          12 :                 node = scanNSItemForColumn(pstate, nsitem, levels_up, colname,
     747             :                                            cref->location);
     748          12 :                 if (node == NULL)
     749             :                 {
     750             :                     /* Try it as a function call on the whole row */
     751           0 :                     node = transformWholeRowRef(pstate, nsitem, levels_up,
     752             :                                                 cref->location);
     753           0 :                     node = ParseFuncOrColumn(pstate,
     754           0 :                                              list_make1(makeString(colname)),
     755           0 :                                              list_make1(node),
     756             :                                              pstate->p_last_srf,
     757             :                                              NULL,
     758             :                                              false,
     759             :                                              cref->location);
     760             :                 }
     761          12 :                 break;
     762             :             }
     763           0 :         case 4:
     764             :             {
     765           0 :                 Node       *field1 = (Node *) linitial(cref->fields);
     766           0 :                 Node       *field2 = (Node *) lsecond(cref->fields);
     767           0 :                 Node       *field3 = (Node *) lthird(cref->fields);
     768           0 :                 Node       *field4 = (Node *) lfourth(cref->fields);
     769             :                 char       *catname;
     770             : 
     771           0 :                 catname = strVal(field1);
     772           0 :                 nspname = strVal(field2);
     773           0 :                 relname = strVal(field3);
     774             : 
     775             :                 /*
     776             :                  * We check the catalog name and then ignore it.
     777             :                  */
     778           0 :                 if (strcmp(catname, get_database_name(MyDatabaseId)) != 0)
     779             :                 {
     780           0 :                     crerr = CRERR_WRONG_DB;
     781           0 :                     break;
     782             :                 }
     783             : 
     784             :                 /* Locate the referenced nsitem */
     785           0 :                 nsitem = refnameNamespaceItem(pstate, nspname, relname,
     786             :                                               cref->location,
     787             :                                               &levels_up);
     788           0 :                 if (nsitem == NULL)
     789             :                 {
     790           0 :                     crerr = CRERR_NO_RTE;
     791           0 :                     break;
     792             :                 }
     793             : 
     794             :                 /* Whole-row reference? */
     795           0 :                 if (IsA(field4, A_Star))
     796             :                 {
     797           0 :                     node = transformWholeRowRef(pstate, nsitem, levels_up,
     798             :                                                 cref->location);
     799           0 :                     break;
     800             :                 }
     801             : 
     802           0 :                 colname = strVal(field4);
     803             : 
     804             :                 /* Try to identify as a column of the nsitem */
     805           0 :                 node = scanNSItemForColumn(pstate, nsitem, levels_up, colname,
     806             :                                            cref->location);
     807           0 :                 if (node == NULL)
     808             :                 {
     809             :                     /* Try it as a function call on the whole row */
     810           0 :                     node = transformWholeRowRef(pstate, nsitem, levels_up,
     811             :                                                 cref->location);
     812           0 :                     node = ParseFuncOrColumn(pstate,
     813           0 :                                              list_make1(makeString(colname)),
     814           0 :                                              list_make1(node),
     815             :                                              pstate->p_last_srf,
     816             :                                              NULL,
     817             :                                              false,
     818             :                                              cref->location);
     819             :                 }
     820           0 :                 break;
     821             :             }
     822           0 :         default:
     823           0 :             crerr = CRERR_TOO_MANY; /* too many dotted names */
     824           0 :             break;
     825             :     }
     826             : 
     827             :     /*
     828             :      * Now give the PostParseColumnRefHook, if any, a chance.  We pass the
     829             :      * translation-so-far so that it can throw an error if it wishes in the
     830             :      * case that it has a conflicting interpretation of the ColumnRef. (If it
     831             :      * just translates anyway, we'll throw an error, because we can't undo
     832             :      * whatever effects the preceding steps may have had on the pstate.) If it
     833             :      * returns NULL, use the standard translation, or throw a suitable error
     834             :      * if there is none.
     835             :      */
     836     1800496 :     if (pstate->p_post_columnref_hook != NULL)
     837             :     {
     838             :         Node       *hookresult;
     839             : 
     840       46830 :         hookresult = pstate->p_post_columnref_hook(pstate, cref, node);
     841       46794 :         if (node == NULL)
     842       34840 :             node = hookresult;
     843       11954 :         else if (hookresult != NULL)
     844           0 :             ereport(ERROR,
     845             :                     (errcode(ERRCODE_AMBIGUOUS_COLUMN),
     846             :                      errmsg("column reference \"%s\" is ambiguous",
     847             :                             NameListToString(cref->fields)),
     848             :                      parser_errposition(pstate, cref->location)));
     849             :     }
     850             : 
     851             :     /*
     852             :      * Throw error if no translation found.
     853             :      */
     854     1800460 :     if (node == NULL)
     855             :     {
     856         472 :         switch (crerr)
     857             :         {
     858         364 :             case CRERR_NO_COLUMN:
     859         364 :                 errorMissingColumn(pstate, relname, colname, cref->location);
     860             :                 break;
     861         108 :             case CRERR_NO_RTE:
     862         108 :                 errorMissingRTE(pstate, makeRangeVar(nspname, relname,
     863             :                                                      cref->location));
     864             :                 break;
     865           0 :             case CRERR_WRONG_DB:
     866           0 :                 ereport(ERROR,
     867             :                         (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
     868             :                          errmsg("cross-database references are not implemented: %s",
     869             :                                 NameListToString(cref->fields)),
     870             :                          parser_errposition(pstate, cref->location)));
     871             :                 break;
     872           0 :             case CRERR_TOO_MANY:
     873           0 :                 ereport(ERROR,
     874             :                         (errcode(ERRCODE_SYNTAX_ERROR),
     875             :                          errmsg("improper qualified name (too many dotted names): %s",
     876             :                                 NameListToString(cref->fields)),
     877             :                          parser_errposition(pstate, cref->location)));
     878             :                 break;
     879             :         }
     880             :     }
     881             : 
     882     1799988 :     return node;
     883             : }
     884             : 
     885             : static Node *
     886       45942 : transformParamRef(ParseState *pstate, ParamRef *pref)
     887             : {
     888             :     Node       *result;
     889             : 
     890             :     /*
     891             :      * The core parser knows nothing about Params.  If a hook is supplied,
     892             :      * call it.  If not, or if the hook returns NULL, throw a generic error.
     893             :      */
     894       45942 :     if (pstate->p_paramref_hook != NULL)
     895       45936 :         result = pstate->p_paramref_hook(pstate, pref);
     896             :     else
     897           6 :         result = NULL;
     898             : 
     899       45942 :     if (result == NULL)
     900          12 :         ereport(ERROR,
     901             :                 (errcode(ERRCODE_UNDEFINED_PARAMETER),
     902             :                  errmsg("there is no parameter $%d", pref->number),
     903             :                  parser_errposition(pstate, pref->location)));
     904             : 
     905       45930 :     return result;
     906             : }
     907             : 
     908             : /* Test whether an a_expr is a plain NULL constant or not */
     909             : static bool
     910        2266 : exprIsNullConstant(Node *arg)
     911             : {
     912        2266 :     if (arg && IsA(arg, A_Const))
     913             :     {
     914         108 :         A_Const    *con = (A_Const *) arg;
     915             : 
     916         108 :         if (con->isnull)
     917          30 :             return true;
     918             :     }
     919        2236 :     return false;
     920             : }
     921             : 
     922             : static Node *
     923      607832 : transformAExprOp(ParseState *pstate, A_Expr *a)
     924             : {
     925      607832 :     Node       *lexpr = a->lexpr;
     926      607832 :     Node       *rexpr = a->rexpr;
     927             :     Node       *result;
     928             : 
     929             :     /*
     930             :      * Special-case "foo = NULL" and "NULL = foo" for compatibility with
     931             :      * standards-broken products (like Microsoft's).  Turn these into IS NULL
     932             :      * exprs. (If either side is a CaseTestExpr, then the expression was
     933             :      * generated internally from a CASE-WHEN expression, and
     934             :      * transform_null_equals does not apply.)
     935             :      */
     936      607832 :     if (Transform_null_equals &&
     937           0 :         list_length(a->name) == 1 &&
     938           0 :         strcmp(strVal(linitial(a->name)), "=") == 0 &&
     939           0 :         (exprIsNullConstant(lexpr) || exprIsNullConstant(rexpr)) &&
     940           0 :         (!IsA(lexpr, CaseTestExpr) && !IsA(rexpr, CaseTestExpr)))
     941           0 :     {
     942           0 :         NullTest   *n = makeNode(NullTest);
     943             : 
     944           0 :         n->nulltesttype = IS_NULL;
     945           0 :         n->location = a->location;
     946             : 
     947           0 :         if (exprIsNullConstant(lexpr))
     948           0 :             n->arg = (Expr *) rexpr;
     949             :         else
     950           0 :             n->arg = (Expr *) lexpr;
     951             : 
     952           0 :         result = transformExprRecurse(pstate, (Node *) n);
     953             :     }
     954      607832 :     else if (lexpr && IsA(lexpr, RowExpr) &&
     955         826 :              rexpr && IsA(rexpr, SubLink) &&
     956          30 :              ((SubLink *) rexpr)->subLinkType == EXPR_SUBLINK)
     957          30 :     {
     958             :         /*
     959             :          * Convert "row op subselect" into a ROWCOMPARE sublink. Formerly the
     960             :          * grammar did this, but now that a row construct is allowed anywhere
     961             :          * in expressions, it's easier to do it here.
     962             :          */
     963          30 :         SubLink    *s = (SubLink *) rexpr;
     964             : 
     965          30 :         s->subLinkType = ROWCOMPARE_SUBLINK;
     966          30 :         s->testexpr = lexpr;
     967          30 :         s->operName = a->name;
     968          30 :         s->location = a->location;
     969          30 :         result = transformExprRecurse(pstate, (Node *) s);
     970             :     }
     971      607802 :     else if (lexpr && IsA(lexpr, RowExpr) &&
     972         796 :              rexpr && IsA(rexpr, RowExpr))
     973             :     {
     974             :         /* ROW() op ROW() is handled specially */
     975         790 :         lexpr = transformExprRecurse(pstate, lexpr);
     976         790 :         rexpr = transformExprRecurse(pstate, rexpr);
     977             : 
     978         790 :         result = make_row_comparison_op(pstate,
     979             :                                         a->name,
     980             :                                         castNode(RowExpr, lexpr)->args,
     981             :                                         castNode(RowExpr, rexpr)->args,
     982             :                                         a->location);
     983             :     }
     984             :     else
     985             :     {
     986             :         /* Ordinary scalar operator */
     987      607012 :         Node       *last_srf = pstate->p_last_srf;
     988             : 
     989      607012 :         lexpr = transformExprRecurse(pstate, lexpr);
     990      606740 :         rexpr = transformExprRecurse(pstate, rexpr);
     991             : 
     992      606654 :         result = (Node *) make_op(pstate,
     993             :                                   a->name,
     994             :                                   lexpr,
     995             :                                   rexpr,
     996             :                                   last_srf,
     997             :                                   a->location);
     998             :     }
     999             : 
    1000      607344 :     return result;
    1001             : }
    1002             : 
    1003             : static Node *
    1004       16920 : transformAExprOpAny(ParseState *pstate, A_Expr *a)
    1005             : {
    1006       16920 :     Node       *lexpr = transformExprRecurse(pstate, a->lexpr);
    1007       16920 :     Node       *rexpr = transformExprRecurse(pstate, a->rexpr);
    1008             : 
    1009       16920 :     return (Node *) make_scalar_array_op(pstate,
    1010             :                                          a->name,
    1011             :                                          true,
    1012             :                                          lexpr,
    1013             :                                          rexpr,
    1014             :                                          a->location);
    1015             : }
    1016             : 
    1017             : static Node *
    1018         300 : transformAExprOpAll(ParseState *pstate, A_Expr *a)
    1019             : {
    1020         300 :     Node       *lexpr = transformExprRecurse(pstate, a->lexpr);
    1021         300 :     Node       *rexpr = transformExprRecurse(pstate, a->rexpr);
    1022             : 
    1023         300 :     return (Node *) make_scalar_array_op(pstate,
    1024             :                                          a->name,
    1025             :                                          false,
    1026             :                                          lexpr,
    1027             :                                          rexpr,
    1028             :                                          a->location);
    1029             : }
    1030             : 
    1031             : static Node *
    1032        1148 : transformAExprDistinct(ParseState *pstate, A_Expr *a)
    1033             : {
    1034        1148 :     Node       *lexpr = a->lexpr;
    1035        1148 :     Node       *rexpr = a->rexpr;
    1036             :     Node       *result;
    1037             : 
    1038             :     /*
    1039             :      * If either input is an undecorated NULL literal, transform to a NullTest
    1040             :      * on the other input. That's simpler to process than a full DistinctExpr,
    1041             :      * and it avoids needing to require that the datatype have an = operator.
    1042             :      */
    1043        1148 :     if (exprIsNullConstant(rexpr))
    1044          30 :         return make_nulltest_from_distinct(pstate, a, lexpr);
    1045        1118 :     if (exprIsNullConstant(lexpr))
    1046           0 :         return make_nulltest_from_distinct(pstate, a, rexpr);
    1047             : 
    1048        1118 :     lexpr = transformExprRecurse(pstate, lexpr);
    1049        1118 :     rexpr = transformExprRecurse(pstate, rexpr);
    1050             : 
    1051        1118 :     if (lexpr && IsA(lexpr, RowExpr) &&
    1052           6 :         rexpr && IsA(rexpr, RowExpr))
    1053             :     {
    1054             :         /* ROW() op ROW() is handled specially */
    1055           6 :         result = make_row_distinct_op(pstate, a->name,
    1056             :                                       (RowExpr *) lexpr,
    1057             :                                       (RowExpr *) rexpr,
    1058             :                                       a->location);
    1059             :     }
    1060             :     else
    1061             :     {
    1062             :         /* Ordinary scalar operator */
    1063        1112 :         result = (Node *) make_distinct_op(pstate,
    1064             :                                            a->name,
    1065             :                                            lexpr,
    1066             :                                            rexpr,
    1067             :                                            a->location);
    1068             :     }
    1069             : 
    1070             :     /*
    1071             :      * If it's NOT DISTINCT, we first build a DistinctExpr and then stick a
    1072             :      * NOT on top.
    1073             :      */
    1074        1118 :     if (a->kind == AEXPR_NOT_DISTINCT)
    1075          56 :         result = (Node *) makeBoolExpr(NOT_EXPR,
    1076          56 :                                        list_make1(result),
    1077             :                                        a->location);
    1078             : 
    1079        1118 :     return result;
    1080             : }
    1081             : 
    1082             : static Node *
    1083         484 : transformAExprNullIf(ParseState *pstate, A_Expr *a)
    1084             : {
    1085         484 :     Node       *lexpr = transformExprRecurse(pstate, a->lexpr);
    1086         484 :     Node       *rexpr = transformExprRecurse(pstate, a->rexpr);
    1087             :     OpExpr     *result;
    1088             : 
    1089         484 :     result = (OpExpr *) make_op(pstate,
    1090             :                                 a->name,
    1091             :                                 lexpr,
    1092             :                                 rexpr,
    1093             :                                 pstate->p_last_srf,
    1094             :                                 a->location);
    1095             : 
    1096             :     /*
    1097             :      * The comparison operator itself should yield boolean ...
    1098             :      */
    1099         484 :     if (result->opresulttype != BOOLOID)
    1100           0 :         ereport(ERROR,
    1101             :                 (errcode(ERRCODE_DATATYPE_MISMATCH),
    1102             :         /* translator: %s is name of a SQL construct, eg NULLIF */
    1103             :                  errmsg("%s requires = operator to yield boolean", "NULLIF"),
    1104             :                  parser_errposition(pstate, a->location)));
    1105         484 :     if (result->opretset)
    1106           0 :         ereport(ERROR,
    1107             :                 (errcode(ERRCODE_DATATYPE_MISMATCH),
    1108             :         /* translator: %s is name of a SQL construct, eg NULLIF */
    1109             :                  errmsg("%s must not return a set", "NULLIF"),
    1110             :                  parser_errposition(pstate, a->location)));
    1111             : 
    1112             :     /*
    1113             :      * ... but the NullIfExpr will yield the first operand's type.
    1114             :      */
    1115         484 :     result->opresulttype = exprType((Node *) linitial(result->args));
    1116             : 
    1117             :     /*
    1118             :      * We rely on NullIfExpr and OpExpr being the same struct
    1119             :      */
    1120         484 :     NodeSetTag(result, T_NullIfExpr);
    1121             : 
    1122         484 :     return (Node *) result;
    1123             : }
    1124             : 
    1125             : static Node *
    1126       22252 : transformAExprIn(ParseState *pstate, A_Expr *a)
    1127             : {
    1128       22252 :     Node       *result = NULL;
    1129             :     Node       *lexpr;
    1130             :     List       *rexprs;
    1131             :     List       *rvars;
    1132             :     List       *rnonvars;
    1133             :     bool        useOr;
    1134             :     ListCell   *l;
    1135       22252 :     bool        has_rvars = false;
    1136             : 
    1137             :     /*
    1138             :      * If the operator is <>, combine with AND not OR.
    1139             :      */
    1140       22252 :     if (strcmp(strVal(linitial(a->name)), "<>") == 0)
    1141        2772 :         useOr = false;
    1142             :     else
    1143       19480 :         useOr = true;
    1144             : 
    1145             :     /*
    1146             :      * We try to generate a ScalarArrayOpExpr from IN/NOT IN, but this is only
    1147             :      * possible if there is a suitable array type available.  If not, we fall
    1148             :      * back to a boolean condition tree with multiple copies of the lefthand
    1149             :      * expression.  Also, any IN-list items that contain Vars are handled as
    1150             :      * separate boolean conditions, because that gives the planner more scope
    1151             :      * for optimization on such clauses.
    1152             :      *
    1153             :      * First step: transform all the inputs, and detect whether any contain
    1154             :      * Vars.
    1155             :      */
    1156       22252 :     lexpr = transformExprRecurse(pstate, a->lexpr);
    1157       22252 :     rexprs = rvars = rnonvars = NIL;
    1158       82764 :     foreach(l, (List *) a->rexpr)
    1159             :     {
    1160       60518 :         Node       *rexpr = transformExprRecurse(pstate, lfirst(l));
    1161             : 
    1162       60512 :         rexprs = lappend(rexprs, rexpr);
    1163       60512 :         if (contain_vars_of_level(rexpr, 0))
    1164             :         {
    1165           8 :             rvars = lappend(rvars, rexpr);
    1166           8 :             has_rvars = true;
    1167             :         }
    1168             :         else
    1169       60504 :             rnonvars = lappend(rnonvars, rexpr);
    1170             :     }
    1171             : 
    1172             :     /*
    1173             :      * ScalarArrayOpExpr is only going to be useful if there's more than one
    1174             :      * non-Var righthand item.
    1175             :      */
    1176       22246 :     if (list_length(rnonvars) > 1)
    1177             :     {
    1178             :         List       *allexprs;
    1179             :         Oid         scalar_type;
    1180             :         Oid         array_type;
    1181             : 
    1182             :         /*
    1183             :          * Try to select a common type for the array elements.  Note that
    1184             :          * since the LHS' type is first in the list, it will be preferred when
    1185             :          * there is doubt (eg, when all the RHS items are unknown literals).
    1186             :          *
    1187             :          * Note: use list_concat here not lcons, to avoid damaging rnonvars.
    1188             :          */
    1189       19202 :         allexprs = list_concat(list_make1(lexpr), rnonvars);
    1190       19202 :         scalar_type = select_common_type(pstate, allexprs, NULL, NULL);
    1191             : 
    1192             :         /* We have to verify that the selected type actually works */
    1193       19202 :         if (OidIsValid(scalar_type) &&
    1194       19198 :             !verify_common_type(scalar_type, allexprs))
    1195           6 :             scalar_type = InvalidOid;
    1196             : 
    1197             :         /*
    1198             :          * Do we have an array type to use?  Aside from the case where there
    1199             :          * isn't one, we don't risk using ScalarArrayOpExpr when the common
    1200             :          * type is RECORD, because the RowExpr comparison logic below can cope
    1201             :          * with some cases of non-identical row types.
    1202             :          */
    1203       19202 :         if (OidIsValid(scalar_type) && scalar_type != RECORDOID)
    1204       19166 :             array_type = get_array_type(scalar_type);
    1205             :         else
    1206          36 :             array_type = InvalidOid;
    1207       19202 :         if (array_type != InvalidOid)
    1208             :         {
    1209             :             /*
    1210             :              * OK: coerce all the right-hand non-Var inputs to the common type
    1211             :              * and build an ArrayExpr for them.
    1212             :              */
    1213             :             List       *aexprs;
    1214             :             ArrayExpr  *newa;
    1215             : 
    1216       19154 :             aexprs = NIL;
    1217       76518 :             foreach(l, rnonvars)
    1218             :             {
    1219       57364 :                 Node       *rexpr = (Node *) lfirst(l);
    1220             : 
    1221       57364 :                 rexpr = coerce_to_common_type(pstate, rexpr,
    1222             :                                               scalar_type,
    1223             :                                               "IN");
    1224       57364 :                 aexprs = lappend(aexprs, rexpr);
    1225             :             }
    1226       19154 :             newa = makeNode(ArrayExpr);
    1227       19154 :             newa->array_typeid = array_type;
    1228             :             /* array_collid will be set by parse_collate.c */
    1229       19154 :             newa->element_typeid = scalar_type;
    1230       19154 :             newa->elements = aexprs;
    1231       19154 :             newa->multidims = false;
    1232       19154 :             newa->location = -1;
    1233             : 
    1234             :             /*
    1235             :              * If the IN expression contains Vars, disable query jumbling
    1236             :              * squashing.  Vars cannot be safely jumbled.
    1237             :              */
    1238       19154 :             newa->list_start = has_rvars ? -1 : a->rexpr_list_start;
    1239       19154 :             newa->list_end = has_rvars ? -1 : a->rexpr_list_end;
    1240             : 
    1241       19154 :             result = (Node *) make_scalar_array_op(pstate,
    1242             :                                                    a->name,
    1243             :                                                    useOr,
    1244             :                                                    lexpr,
    1245             :                                                    (Node *) newa,
    1246             :                                                    a->location);
    1247             : 
    1248             :             /* Consider only the Vars (if any) in the loop below */
    1249       19154 :             rexprs = rvars;
    1250             :         }
    1251             :     }
    1252             : 
    1253             :     /*
    1254             :      * Must do it the hard way, ie, with a boolean expression tree.
    1255             :      */
    1256       25382 :     foreach(l, rexprs)
    1257             :     {
    1258        3142 :         Node       *rexpr = (Node *) lfirst(l);
    1259             :         Node       *cmp;
    1260             : 
    1261        3142 :         if (IsA(lexpr, RowExpr) &&
    1262          52 :             IsA(rexpr, RowExpr))
    1263             :         {
    1264             :             /* ROW() op ROW() is handled specially */
    1265          52 :             cmp = make_row_comparison_op(pstate,
    1266             :                                          a->name,
    1267          52 :                                          copyObject(((RowExpr *) lexpr)->args),
    1268             :                                          ((RowExpr *) rexpr)->args,
    1269             :                                          a->location);
    1270             :         }
    1271             :         else
    1272             :         {
    1273             :             /* Ordinary scalar operator */
    1274        3090 :             cmp = (Node *) make_op(pstate,
    1275             :                                    a->name,
    1276        3090 :                                    copyObject(lexpr),
    1277             :                                    rexpr,
    1278             :                                    pstate->p_last_srf,
    1279             :                                    a->location);
    1280             :         }
    1281             : 
    1282        3136 :         cmp = coerce_to_boolean(pstate, cmp, "IN");
    1283        3136 :         if (result == NULL)
    1284        3086 :             result = cmp;
    1285             :         else
    1286          50 :             result = (Node *) makeBoolExpr(useOr ? OR_EXPR : AND_EXPR,
    1287          50 :                                            list_make2(result, cmp),
    1288             :                                            a->location);
    1289             :     }
    1290             : 
    1291       22240 :     return result;
    1292             : }
    1293             : 
    1294             : static Node *
    1295         518 : transformAExprBetween(ParseState *pstate, A_Expr *a)
    1296             : {
    1297             :     Node       *aexpr;
    1298             :     Node       *bexpr;
    1299             :     Node       *cexpr;
    1300             :     Node       *result;
    1301             :     Node       *sub1;
    1302             :     Node       *sub2;
    1303             :     List       *args;
    1304             : 
    1305             :     /* Deconstruct A_Expr into three subexprs */
    1306         518 :     aexpr = a->lexpr;
    1307         518 :     args = castNode(List, a->rexpr);
    1308             :     Assert(list_length(args) == 2);
    1309         518 :     bexpr = (Node *) linitial(args);
    1310         518 :     cexpr = (Node *) lsecond(args);
    1311             : 
    1312             :     /*
    1313             :      * Build the equivalent comparison expression.  Make copies of
    1314             :      * multiply-referenced subexpressions for safety.  (XXX this is really
    1315             :      * wrong since it results in multiple runtime evaluations of what may be
    1316             :      * volatile expressions ...)
    1317             :      *
    1318             :      * Ideally we would not use hard-wired operators here but instead use
    1319             :      * opclasses.  However, mixed data types and other issues make this
    1320             :      * difficult:
    1321             :      * http://archives.postgresql.org/pgsql-hackers/2008-08/msg01142.php
    1322             :      */
    1323         518 :     switch (a->kind)
    1324             :     {
    1325         482 :         case AEXPR_BETWEEN:
    1326         482 :             args = list_make2(makeSimpleA_Expr(AEXPR_OP, ">=",
    1327             :                                                aexpr, bexpr,
    1328             :                                                a->location),
    1329             :                               makeSimpleA_Expr(AEXPR_OP, "<=",
    1330             :                                                copyObject(aexpr), cexpr,
    1331             :                                                a->location));
    1332         482 :             result = (Node *) makeBoolExpr(AND_EXPR, args, a->location);
    1333         482 :             break;
    1334          12 :         case AEXPR_NOT_BETWEEN:
    1335          12 :             args = list_make2(makeSimpleA_Expr(AEXPR_OP, "<",
    1336             :                                                aexpr, bexpr,
    1337             :                                                a->location),
    1338             :                               makeSimpleA_Expr(AEXPR_OP, ">",
    1339             :                                                copyObject(aexpr), cexpr,
    1340             :                                                a->location));
    1341          12 :             result = (Node *) makeBoolExpr(OR_EXPR, args, a->location);
    1342          12 :             break;
    1343          12 :         case AEXPR_BETWEEN_SYM:
    1344          12 :             args = list_make2(makeSimpleA_Expr(AEXPR_OP, ">=",
    1345             :                                                aexpr, bexpr,
    1346             :                                                a->location),
    1347             :                               makeSimpleA_Expr(AEXPR_OP, "<=",
    1348             :                                                copyObject(aexpr), cexpr,
    1349             :                                                a->location));
    1350          12 :             sub1 = (Node *) makeBoolExpr(AND_EXPR, args, a->location);
    1351          12 :             args = list_make2(makeSimpleA_Expr(AEXPR_OP, ">=",
    1352             :                                                copyObject(aexpr), copyObject(cexpr),
    1353             :                                                a->location),
    1354             :                               makeSimpleA_Expr(AEXPR_OP, "<=",
    1355             :                                                copyObject(aexpr), copyObject(bexpr),
    1356             :                                                a->location));
    1357          12 :             sub2 = (Node *) makeBoolExpr(AND_EXPR, args, a->location);
    1358          12 :             args = list_make2(sub1, sub2);
    1359          12 :             result = (Node *) makeBoolExpr(OR_EXPR, args, a->location);
    1360          12 :             break;
    1361          12 :         case AEXPR_NOT_BETWEEN_SYM:
    1362          12 :             args = list_make2(makeSimpleA_Expr(AEXPR_OP, "<",
    1363             :                                                aexpr, bexpr,
    1364             :                                                a->location),
    1365             :                               makeSimpleA_Expr(AEXPR_OP, ">",
    1366             :                                                copyObject(aexpr), cexpr,
    1367             :                                                a->location));
    1368          12 :             sub1 = (Node *) makeBoolExpr(OR_EXPR, args, a->location);
    1369          12 :             args = list_make2(makeSimpleA_Expr(AEXPR_OP, "<",
    1370             :                                                copyObject(aexpr), copyObject(cexpr),
    1371             :                                                a->location),
    1372             :                               makeSimpleA_Expr(AEXPR_OP, ">",
    1373             :                                                copyObject(aexpr), copyObject(bexpr),
    1374             :                                                a->location));
    1375          12 :             sub2 = (Node *) makeBoolExpr(OR_EXPR, args, a->location);
    1376          12 :             args = list_make2(sub1, sub2);
    1377          12 :             result = (Node *) makeBoolExpr(AND_EXPR, args, a->location);
    1378          12 :             break;
    1379           0 :         default:
    1380           0 :             elog(ERROR, "unrecognized A_Expr kind: %d", a->kind);
    1381             :             result = NULL;      /* keep compiler quiet */
    1382             :             break;
    1383             :     }
    1384             : 
    1385         518 :     return transformExprRecurse(pstate, result);
    1386             : }
    1387             : 
    1388             : static Node *
    1389         204 : transformMergeSupportFunc(ParseState *pstate, MergeSupportFunc *f)
    1390             : {
    1391             :     /*
    1392             :      * All we need to do is check that we're in the RETURNING list of a MERGE
    1393             :      * command.  If so, we just return the node as-is.
    1394             :      */
    1395         204 :     if (pstate->p_expr_kind != EXPR_KIND_MERGE_RETURNING)
    1396             :     {
    1397          18 :         ParseState *parent_pstate = pstate->parentParseState;
    1398             : 
    1399          18 :         while (parent_pstate &&
    1400           6 :                parent_pstate->p_expr_kind != EXPR_KIND_MERGE_RETURNING)
    1401           0 :             parent_pstate = parent_pstate->parentParseState;
    1402             : 
    1403          18 :         if (!parent_pstate)
    1404          12 :             ereport(ERROR,
    1405             :                     errcode(ERRCODE_SYNTAX_ERROR),
    1406             :                     errmsg("MERGE_ACTION() can only be used in the RETURNING list of a MERGE command"),
    1407             :                     parser_errposition(pstate, f->location));
    1408             :     }
    1409             : 
    1410         192 :     return (Node *) f;
    1411             : }
    1412             : 
    1413             : static Node *
    1414      156636 : transformBoolExpr(ParseState *pstate, BoolExpr *a)
    1415             : {
    1416      156636 :     List       *args = NIL;
    1417             :     const char *opname;
    1418             :     ListCell   *lc;
    1419             : 
    1420      156636 :     switch (a->boolop)
    1421             :     {
    1422      127890 :         case AND_EXPR:
    1423      127890 :             opname = "AND";
    1424      127890 :             break;
    1425       12166 :         case OR_EXPR:
    1426       12166 :             opname = "OR";
    1427       12166 :             break;
    1428       16580 :         case NOT_EXPR:
    1429       16580 :             opname = "NOT";
    1430       16580 :             break;
    1431           0 :         default:
    1432           0 :             elog(ERROR, "unrecognized boolop: %d", (int) a->boolop);
    1433             :             opname = NULL;      /* keep compiler quiet */
    1434             :             break;
    1435             :     }
    1436             : 
    1437      567124 :     foreach(lc, a->args)
    1438             :     {
    1439      410508 :         Node       *arg = (Node *) lfirst(lc);
    1440             : 
    1441      410508 :         arg = transformExprRecurse(pstate, arg);
    1442      410488 :         arg = coerce_to_boolean(pstate, arg, opname);
    1443      410488 :         args = lappend(args, arg);
    1444             :     }
    1445             : 
    1446      156616 :     return (Node *) makeBoolExpr(a->boolop, args, a->location);
    1447             : }
    1448             : 
    1449             : static Node *
    1450      382308 : transformFuncCall(ParseState *pstate, FuncCall *fn)
    1451             : {
    1452      382308 :     Node       *last_srf = pstate->p_last_srf;
    1453             :     List       *targs;
    1454             :     ListCell   *args;
    1455             : 
    1456             :     /* Transform the list of arguments ... */
    1457      382308 :     targs = NIL;
    1458     1007430 :     foreach(args, fn->args)
    1459             :     {
    1460      625122 :         targs = lappend(targs, transformExprRecurse(pstate,
    1461      625182 :                                                     (Node *) lfirst(args)));
    1462             :     }
    1463             : 
    1464             :     /*
    1465             :      * When WITHIN GROUP is used, we treat its ORDER BY expressions as
    1466             :      * additional arguments to the function, for purposes of function lookup
    1467             :      * and argument type coercion.  So, transform each such expression and add
    1468             :      * them to the targs list.  We don't explicitly mark where each argument
    1469             :      * came from, but ParseFuncOrColumn can tell what's what by reference to
    1470             :      * list_length(fn->agg_order).
    1471             :      */
    1472      382248 :     if (fn->agg_within_group)
    1473             :     {
    1474             :         Assert(fn->agg_order != NIL);
    1475         744 :         foreach(args, fn->agg_order)
    1476             :         {
    1477         402 :             SortBy     *arg = (SortBy *) lfirst(args);
    1478             : 
    1479         402 :             targs = lappend(targs, transformExpr(pstate, arg->node,
    1480             :                                                  EXPR_KIND_ORDER_BY));
    1481             :         }
    1482             :     }
    1483             : 
    1484             :     /* ... and hand off to ParseFuncOrColumn */
    1485      382248 :     return ParseFuncOrColumn(pstate,
    1486             :                              fn->funcname,
    1487             :                              targs,
    1488             :                              last_srf,
    1489             :                              fn,
    1490             :                              false,
    1491             :                              fn->location);
    1492             : }
    1493             : 
    1494             : static Node *
    1495         378 : transformMultiAssignRef(ParseState *pstate, MultiAssignRef *maref)
    1496             : {
    1497             :     SubLink    *sublink;
    1498             :     RowExpr    *rexpr;
    1499             :     Query      *qtree;
    1500             :     TargetEntry *tle;
    1501             : 
    1502             :     /* We should only see this in first-stage processing of UPDATE tlists */
    1503             :     Assert(pstate->p_expr_kind == EXPR_KIND_UPDATE_SOURCE);
    1504             : 
    1505             :     /* We only need to transform the source if this is the first column */
    1506         378 :     if (maref->colno == 1)
    1507             :     {
    1508             :         /*
    1509             :          * For now, we only allow EXPR SubLinks and RowExprs as the source of
    1510             :          * an UPDATE multiassignment.  This is sufficient to cover interesting
    1511             :          * cases; at worst, someone would have to write (SELECT * FROM expr)
    1512             :          * to expand a composite-returning expression of another form.
    1513             :          */
    1514         184 :         if (IsA(maref->source, SubLink) &&
    1515         138 :             ((SubLink *) maref->source)->subLinkType == EXPR_SUBLINK)
    1516             :         {
    1517             :             /* Relabel it as a MULTIEXPR_SUBLINK */
    1518         138 :             sublink = (SubLink *) maref->source;
    1519         138 :             sublink->subLinkType = MULTIEXPR_SUBLINK;
    1520             :             /* And transform it */
    1521         138 :             sublink = (SubLink *) transformExprRecurse(pstate,
    1522             :                                                        (Node *) sublink);
    1523             : 
    1524         138 :             qtree = castNode(Query, sublink->subselect);
    1525             : 
    1526             :             /* Check subquery returns required number of columns */
    1527         138 :             if (count_nonjunk_tlist_entries(qtree->targetList) != maref->ncolumns)
    1528           0 :                 ereport(ERROR,
    1529             :                         (errcode(ERRCODE_SYNTAX_ERROR),
    1530             :                          errmsg("number of columns does not match number of values"),
    1531             :                          parser_errposition(pstate, sublink->location)));
    1532             : 
    1533             :             /*
    1534             :              * Build a resjunk tlist item containing the MULTIEXPR SubLink,
    1535             :              * and add it to pstate->p_multiassign_exprs, whence it will later
    1536             :              * get appended to the completed targetlist.  We needn't worry
    1537             :              * about selecting a resno for it; transformUpdateStmt will do
    1538             :              * that.
    1539             :              */
    1540         138 :             tle = makeTargetEntry((Expr *) sublink, 0, NULL, true);
    1541         138 :             pstate->p_multiassign_exprs = lappend(pstate->p_multiassign_exprs,
    1542             :                                                   tle);
    1543             : 
    1544             :             /*
    1545             :              * Assign a unique-within-this-targetlist ID to the MULTIEXPR
    1546             :              * SubLink.  We can just use its position in the
    1547             :              * p_multiassign_exprs list.
    1548             :              */
    1549         138 :             sublink->subLinkId = list_length(pstate->p_multiassign_exprs);
    1550             :         }
    1551          46 :         else if (IsA(maref->source, RowExpr))
    1552             :         {
    1553             :             /* Transform the RowExpr, allowing SetToDefault items */
    1554          40 :             rexpr = (RowExpr *) transformRowExpr(pstate,
    1555          40 :                                                  (RowExpr *) maref->source,
    1556             :                                                  true);
    1557             : 
    1558             :             /* Check it returns required number of columns */
    1559          40 :             if (list_length(rexpr->args) != maref->ncolumns)
    1560           0 :                 ereport(ERROR,
    1561             :                         (errcode(ERRCODE_SYNTAX_ERROR),
    1562             :                          errmsg("number of columns does not match number of values"),
    1563             :                          parser_errposition(pstate, rexpr->location)));
    1564             : 
    1565             :             /*
    1566             :              * Temporarily append it to p_multiassign_exprs, so we can get it
    1567             :              * back when we come back here for additional columns.
    1568             :              */
    1569          40 :             tle = makeTargetEntry((Expr *) rexpr, 0, NULL, true);
    1570          40 :             pstate->p_multiassign_exprs = lappend(pstate->p_multiassign_exprs,
    1571             :                                                   tle);
    1572             :         }
    1573             :         else
    1574           6 :             ereport(ERROR,
    1575             :                     (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
    1576             :                      errmsg("source for a multiple-column UPDATE item must be a sub-SELECT or ROW() expression"),
    1577             :                      parser_errposition(pstate, exprLocation(maref->source))));
    1578             :     }
    1579             :     else
    1580             :     {
    1581             :         /*
    1582             :          * Second or later column in a multiassignment.  Re-fetch the
    1583             :          * transformed SubLink or RowExpr, which we assume is still the last
    1584             :          * entry in p_multiassign_exprs.
    1585             :          */
    1586             :         Assert(pstate->p_multiassign_exprs != NIL);
    1587         194 :         tle = (TargetEntry *) llast(pstate->p_multiassign_exprs);
    1588             :     }
    1589             : 
    1590             :     /*
    1591             :      * Emit the appropriate output expression for the current column
    1592             :      */
    1593         372 :     if (IsA(tle->expr, SubLink))
    1594             :     {
    1595             :         Param      *param;
    1596             : 
    1597         280 :         sublink = (SubLink *) tle->expr;
    1598             :         Assert(sublink->subLinkType == MULTIEXPR_SUBLINK);
    1599         280 :         qtree = castNode(Query, sublink->subselect);
    1600             : 
    1601             :         /* Build a Param representing the current subquery output column */
    1602         280 :         tle = (TargetEntry *) list_nth(qtree->targetList, maref->colno - 1);
    1603             :         Assert(!tle->resjunk);
    1604             : 
    1605         280 :         param = makeNode(Param);
    1606         280 :         param->paramkind = PARAM_MULTIEXPR;
    1607         280 :         param->paramid = (sublink->subLinkId << 16) | maref->colno;
    1608         280 :         param->paramtype = exprType((Node *) tle->expr);
    1609         280 :         param->paramtypmod = exprTypmod((Node *) tle->expr);
    1610         280 :         param->paramcollid = exprCollation((Node *) tle->expr);
    1611         280 :         param->location = exprLocation((Node *) tle->expr);
    1612             : 
    1613         280 :         return (Node *) param;
    1614             :     }
    1615             : 
    1616          92 :     if (IsA(tle->expr, RowExpr))
    1617             :     {
    1618             :         Node       *result;
    1619             : 
    1620          92 :         rexpr = (RowExpr *) tle->expr;
    1621             : 
    1622             :         /* Just extract and return the next element of the RowExpr */
    1623          92 :         result = (Node *) list_nth(rexpr->args, maref->colno - 1);
    1624             : 
    1625             :         /*
    1626             :          * If we're at the last column, delete the RowExpr from
    1627             :          * p_multiassign_exprs; we don't need it anymore, and don't want it in
    1628             :          * the finished UPDATE tlist.  We assume this is still the last entry
    1629             :          * in p_multiassign_exprs.
    1630             :          */
    1631          92 :         if (maref->colno == maref->ncolumns)
    1632          40 :             pstate->p_multiassign_exprs =
    1633          40 :                 list_delete_last(pstate->p_multiassign_exprs);
    1634             : 
    1635          92 :         return result;
    1636             :     }
    1637             : 
    1638           0 :     elog(ERROR, "unexpected expr type in multiassign list");
    1639             :     return NULL;                /* keep compiler quiet */
    1640             : }
    1641             : 
    1642             : static Node *
    1643       40212 : transformCaseExpr(ParseState *pstate, CaseExpr *c)
    1644             : {
    1645       40212 :     CaseExpr   *newc = makeNode(CaseExpr);
    1646       40212 :     Node       *last_srf = pstate->p_last_srf;
    1647             :     Node       *arg;
    1648             :     CaseTestExpr *placeholder;
    1649             :     List       *newargs;
    1650             :     List       *resultexprs;
    1651             :     ListCell   *l;
    1652             :     Node       *defresult;
    1653             :     Oid         ptype;
    1654             : 
    1655             :     /* transform the test expression, if any */
    1656       40212 :     arg = transformExprRecurse(pstate, (Node *) c->arg);
    1657             : 
    1658             :     /* generate placeholder for test expression */
    1659       40212 :     if (arg)
    1660             :     {
    1661             :         /*
    1662             :          * If test expression is an untyped literal, force it to text. We have
    1663             :          * to do something now because we won't be able to do this coercion on
    1664             :          * the placeholder.  This is not as flexible as what was done in 7.4
    1665             :          * and before, but it's good enough to handle the sort of silly coding
    1666             :          * commonly seen.
    1667             :          */
    1668        7202 :         if (exprType(arg) == UNKNOWNOID)
    1669           6 :             arg = coerce_to_common_type(pstate, arg, TEXTOID, "CASE");
    1670             : 
    1671             :         /*
    1672             :          * Run collation assignment on the test expression so that we know
    1673             :          * what collation to mark the placeholder with.  In principle we could
    1674             :          * leave it to parse_collate.c to do that later, but propagating the
    1675             :          * result to the CaseTestExpr would be unnecessarily complicated.
    1676             :          */
    1677        7202 :         assign_expr_collations(pstate, arg);
    1678             : 
    1679        7202 :         placeholder = makeNode(CaseTestExpr);
    1680        7202 :         placeholder->typeId = exprType(arg);
    1681        7202 :         placeholder->typeMod = exprTypmod(arg);
    1682        7202 :         placeholder->collation = exprCollation(arg);
    1683             :     }
    1684             :     else
    1685       33010 :         placeholder = NULL;
    1686             : 
    1687       40212 :     newc->arg = (Expr *) arg;
    1688             : 
    1689             :     /* transform the list of arguments */
    1690       40212 :     newargs = NIL;
    1691       40212 :     resultexprs = NIL;
    1692      110794 :     foreach(l, c->args)
    1693             :     {
    1694       70582 :         CaseWhen   *w = lfirst_node(CaseWhen, l);
    1695       70582 :         CaseWhen   *neww = makeNode(CaseWhen);
    1696             :         Node       *warg;
    1697             : 
    1698       70582 :         warg = (Node *) w->expr;
    1699       70582 :         if (placeholder)
    1700             :         {
    1701             :             /* shorthand form was specified, so expand... */
    1702       27288 :             warg = (Node *) makeSimpleA_Expr(AEXPR_OP, "=",
    1703             :                                              (Node *) placeholder,
    1704             :                                              warg,
    1705             :                                              w->location);
    1706             :         }
    1707       70582 :         neww->expr = (Expr *) transformExprRecurse(pstate, warg);
    1708             : 
    1709      141164 :         neww->expr = (Expr *) coerce_to_boolean(pstate,
    1710       70582 :                                                 (Node *) neww->expr,
    1711             :                                                 "CASE/WHEN");
    1712             : 
    1713       70582 :         warg = (Node *) w->result;
    1714       70582 :         neww->result = (Expr *) transformExprRecurse(pstate, warg);
    1715       70582 :         neww->location = w->location;
    1716             : 
    1717       70582 :         newargs = lappend(newargs, neww);
    1718       70582 :         resultexprs = lappend(resultexprs, neww->result);
    1719             :     }
    1720             : 
    1721       40212 :     newc->args = newargs;
    1722             : 
    1723             :     /* transform the default clause */
    1724       40212 :     defresult = (Node *) c->defresult;
    1725       40212 :     if (defresult == NULL)
    1726             :     {
    1727       10014 :         A_Const    *n = makeNode(A_Const);
    1728             : 
    1729       10014 :         n->isnull = true;
    1730       10014 :         n->location = -1;
    1731       10014 :         defresult = (Node *) n;
    1732             :     }
    1733       40212 :     newc->defresult = (Expr *) transformExprRecurse(pstate, defresult);
    1734             : 
    1735             :     /*
    1736             :      * Note: default result is considered the most significant type in
    1737             :      * determining preferred type. This is how the code worked before, but it
    1738             :      * seems a little bogus to me --- tgl
    1739             :      */
    1740       40212 :     resultexprs = lcons(newc->defresult, resultexprs);
    1741             : 
    1742       40212 :     ptype = select_common_type(pstate, resultexprs, "CASE", NULL);
    1743             :     Assert(OidIsValid(ptype));
    1744       40212 :     newc->casetype = ptype;
    1745             :     /* casecollid will be set by parse_collate.c */
    1746             : 
    1747             :     /* Convert default result clause, if necessary */
    1748       40212 :     newc->defresult = (Expr *)
    1749       40212 :         coerce_to_common_type(pstate,
    1750       40212 :                               (Node *) newc->defresult,
    1751             :                               ptype,
    1752             :                               "CASE/ELSE");
    1753             : 
    1754             :     /* Convert when-clause results, if necessary */
    1755      110794 :     foreach(l, newc->args)
    1756             :     {
    1757       70582 :         CaseWhen   *w = (CaseWhen *) lfirst(l);
    1758             : 
    1759       70582 :         w->result = (Expr *)
    1760       70582 :             coerce_to_common_type(pstate,
    1761       70582 :                                   (Node *) w->result,
    1762             :                                   ptype,
    1763             :                                   "CASE/WHEN");
    1764             :     }
    1765             : 
    1766             :     /* if any subexpression contained a SRF, complain */
    1767       40212 :     if (pstate->p_last_srf != last_srf)
    1768           6 :         ereport(ERROR,
    1769             :                 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
    1770             :         /* translator: %s is name of a SQL construct, eg GROUP BY */
    1771             :                  errmsg("set-returning functions are not allowed in %s",
    1772             :                         "CASE"),
    1773             :                  errhint("You might be able to move the set-returning function into a LATERAL FROM item."),
    1774             :                  parser_errposition(pstate,
    1775             :                                     exprLocation(pstate->p_last_srf))));
    1776             : 
    1777       40206 :     newc->location = c->location;
    1778             : 
    1779       40206 :     return (Node *) newc;
    1780             : }
    1781             : 
    1782             : static Node *
    1783       48660 : transformSubLink(ParseState *pstate, SubLink *sublink)
    1784             : {
    1785       48660 :     Node       *result = (Node *) sublink;
    1786             :     Query      *qtree;
    1787             :     const char *err;
    1788             : 
    1789             :     /*
    1790             :      * Check to see if the sublink is in an invalid place within the query. We
    1791             :      * allow sublinks everywhere in SELECT/INSERT/UPDATE/DELETE/MERGE, but
    1792             :      * generally not in utility statements.
    1793             :      */
    1794       48660 :     err = NULL;
    1795       48660 :     switch (pstate->p_expr_kind)
    1796             :     {
    1797           0 :         case EXPR_KIND_NONE:
    1798             :             Assert(false);      /* can't happen */
    1799           0 :             break;
    1800           0 :         case EXPR_KIND_OTHER:
    1801             :             /* Accept sublink here; caller must throw error if wanted */
    1802           0 :             break;
    1803       48618 :         case EXPR_KIND_JOIN_ON:
    1804             :         case EXPR_KIND_JOIN_USING:
    1805             :         case EXPR_KIND_FROM_SUBSELECT:
    1806             :         case EXPR_KIND_FROM_FUNCTION:
    1807             :         case EXPR_KIND_WHERE:
    1808             :         case EXPR_KIND_POLICY:
    1809             :         case EXPR_KIND_HAVING:
    1810             :         case EXPR_KIND_FILTER:
    1811             :         case EXPR_KIND_WINDOW_PARTITION:
    1812             :         case EXPR_KIND_WINDOW_ORDER:
    1813             :         case EXPR_KIND_WINDOW_FRAME_RANGE:
    1814             :         case EXPR_KIND_WINDOW_FRAME_ROWS:
    1815             :         case EXPR_KIND_WINDOW_FRAME_GROUPS:
    1816             :         case EXPR_KIND_SELECT_TARGET:
    1817             :         case EXPR_KIND_INSERT_TARGET:
    1818             :         case EXPR_KIND_UPDATE_SOURCE:
    1819             :         case EXPR_KIND_UPDATE_TARGET:
    1820             :         case EXPR_KIND_MERGE_WHEN:
    1821             :         case EXPR_KIND_GROUP_BY:
    1822             :         case EXPR_KIND_ORDER_BY:
    1823             :         case EXPR_KIND_DISTINCT_ON:
    1824             :         case EXPR_KIND_LIMIT:
    1825             :         case EXPR_KIND_OFFSET:
    1826             :         case EXPR_KIND_RETURNING:
    1827             :         case EXPR_KIND_MERGE_RETURNING:
    1828             :         case EXPR_KIND_VALUES:
    1829             :         case EXPR_KIND_VALUES_SINGLE:
    1830             :         case EXPR_KIND_CYCLE_MARK:
    1831             :             /* okay */
    1832       48618 :             break;
    1833           0 :         case EXPR_KIND_CHECK_CONSTRAINT:
    1834             :         case EXPR_KIND_DOMAIN_CHECK:
    1835           0 :             err = _("cannot use subquery in check constraint");
    1836           0 :             break;
    1837           6 :         case EXPR_KIND_COLUMN_DEFAULT:
    1838             :         case EXPR_KIND_FUNCTION_DEFAULT:
    1839           6 :             err = _("cannot use subquery in DEFAULT expression");
    1840           6 :             break;
    1841           0 :         case EXPR_KIND_INDEX_EXPRESSION:
    1842           0 :             err = _("cannot use subquery in index expression");
    1843           0 :             break;
    1844           0 :         case EXPR_KIND_INDEX_PREDICATE:
    1845           0 :             err = _("cannot use subquery in index predicate");
    1846           0 :             break;
    1847           0 :         case EXPR_KIND_STATS_EXPRESSION:
    1848           0 :             err = _("cannot use subquery in statistics expression");
    1849           0 :             break;
    1850           0 :         case EXPR_KIND_ALTER_COL_TRANSFORM:
    1851           0 :             err = _("cannot use subquery in transform expression");
    1852           0 :             break;
    1853           0 :         case EXPR_KIND_EXECUTE_PARAMETER:
    1854           0 :             err = _("cannot use subquery in EXECUTE parameter");
    1855           0 :             break;
    1856           0 :         case EXPR_KIND_TRIGGER_WHEN:
    1857           0 :             err = _("cannot use subquery in trigger WHEN condition");
    1858           0 :             break;
    1859          12 :         case EXPR_KIND_PARTITION_BOUND:
    1860          12 :             err = _("cannot use subquery in partition bound");
    1861          12 :             break;
    1862           6 :         case EXPR_KIND_PARTITION_EXPRESSION:
    1863           6 :             err = _("cannot use subquery in partition key expression");
    1864           6 :             break;
    1865           0 :         case EXPR_KIND_CALL_ARGUMENT:
    1866           0 :             err = _("cannot use subquery in CALL argument");
    1867           0 :             break;
    1868           6 :         case EXPR_KIND_COPY_WHERE:
    1869           6 :             err = _("cannot use subquery in COPY FROM WHERE condition");
    1870           6 :             break;
    1871          12 :         case EXPR_KIND_GENERATED_COLUMN:
    1872          12 :             err = _("cannot use subquery in column generation expression");
    1873          12 :             break;
    1874             : 
    1875             :             /*
    1876             :              * There is intentionally no default: case here, so that the
    1877             :              * compiler will warn if we add a new ParseExprKind without
    1878             :              * extending this switch.  If we do see an unrecognized value at
    1879             :              * runtime, the behavior will be the same as for EXPR_KIND_OTHER,
    1880             :              * which is sane anyway.
    1881             :              */
    1882             :     }
    1883       48660 :     if (err)
    1884          42 :         ereport(ERROR,
    1885             :                 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
    1886             :                  errmsg_internal("%s", err),
    1887             :                  parser_errposition(pstate, sublink->location)));
    1888             : 
    1889       48618 :     pstate->p_hasSubLinks = true;
    1890             : 
    1891             :     /*
    1892             :      * OK, let's transform the sub-SELECT.
    1893             :      */
    1894       48618 :     qtree = parse_sub_analyze(sublink->subselect, pstate, NULL, false, true);
    1895             : 
    1896             :     /*
    1897             :      * Check that we got a SELECT.  Anything else should be impossible given
    1898             :      * restrictions of the grammar, but check anyway.
    1899             :      */
    1900       48570 :     if (!IsA(qtree, Query) ||
    1901       48570 :         qtree->commandType != CMD_SELECT)
    1902           0 :         elog(ERROR, "unexpected non-SELECT command in SubLink");
    1903             : 
    1904       48570 :     sublink->subselect = (Node *) qtree;
    1905             : 
    1906       48570 :     if (sublink->subLinkType == EXISTS_SUBLINK)
    1907             :     {
    1908             :         /*
    1909             :          * EXISTS needs no test expression or combining operator. These fields
    1910             :          * should be null already, but make sure.
    1911             :          */
    1912        6286 :         sublink->testexpr = NULL;
    1913        6286 :         sublink->operName = NIL;
    1914             :     }
    1915       42284 :     else if (sublink->subLinkType == EXPR_SUBLINK ||
    1916       14774 :              sublink->subLinkType == ARRAY_SUBLINK)
    1917             :     {
    1918             :         /*
    1919             :          * Make sure the subselect delivers a single column (ignoring resjunk
    1920             :          * targets).
    1921             :          */
    1922       36102 :         if (count_nonjunk_tlist_entries(qtree->targetList) != 1)
    1923           0 :             ereport(ERROR,
    1924             :                     (errcode(ERRCODE_SYNTAX_ERROR),
    1925             :                      errmsg("subquery must return only one column"),
    1926             :                      parser_errposition(pstate, sublink->location)));
    1927             : 
    1928             :         /*
    1929             :          * EXPR and ARRAY need no test expression or combining operator. These
    1930             :          * fields should be null already, but make sure.
    1931             :          */
    1932       36102 :         sublink->testexpr = NULL;
    1933       36102 :         sublink->operName = NIL;
    1934             :     }
    1935        6182 :     else if (sublink->subLinkType == MULTIEXPR_SUBLINK)
    1936             :     {
    1937             :         /* Same as EXPR case, except no restriction on number of columns */
    1938         138 :         sublink->testexpr = NULL;
    1939         138 :         sublink->operName = NIL;
    1940             :     }
    1941             :     else
    1942             :     {
    1943             :         /* ALL, ANY, or ROWCOMPARE: generate row-comparing expression */
    1944             :         Node       *lefthand;
    1945             :         List       *left_list;
    1946             :         List       *right_list;
    1947             :         ListCell   *l;
    1948             : 
    1949             :         /*
    1950             :          * If the source was "x IN (select)", convert to "x = ANY (select)".
    1951             :          */
    1952        6044 :         if (sublink->operName == NIL)
    1953        5834 :             sublink->operName = list_make1(makeString("="));
    1954             : 
    1955             :         /*
    1956             :          * Transform lefthand expression, and convert to a list
    1957             :          */
    1958        6044 :         lefthand = transformExprRecurse(pstate, sublink->testexpr);
    1959        6044 :         if (lefthand && IsA(lefthand, RowExpr))
    1960         312 :             left_list = ((RowExpr *) lefthand)->args;
    1961             :         else
    1962        5732 :             left_list = list_make1(lefthand);
    1963             : 
    1964             :         /*
    1965             :          * Build a list of PARAM_SUBLINK nodes representing the output columns
    1966             :          * of the subquery.
    1967             :          */
    1968        6044 :         right_list = NIL;
    1969       12596 :         foreach(l, qtree->targetList)
    1970             :         {
    1971        6552 :             TargetEntry *tent = (TargetEntry *) lfirst(l);
    1972             :             Param      *param;
    1973             : 
    1974        6552 :             if (tent->resjunk)
    1975          12 :                 continue;
    1976             : 
    1977        6540 :             param = makeNode(Param);
    1978        6540 :             param->paramkind = PARAM_SUBLINK;
    1979        6540 :             param->paramid = tent->resno;
    1980        6540 :             param->paramtype = exprType((Node *) tent->expr);
    1981        6540 :             param->paramtypmod = exprTypmod((Node *) tent->expr);
    1982        6540 :             param->paramcollid = exprCollation((Node *) tent->expr);
    1983        6540 :             param->location = -1;
    1984             : 
    1985        6540 :             right_list = lappend(right_list, param);
    1986             :         }
    1987             : 
    1988             :         /*
    1989             :          * We could rely on make_row_comparison_op to complain if the list
    1990             :          * lengths differ, but we prefer to generate a more specific error
    1991             :          * message.
    1992             :          */
    1993        6044 :         if (list_length(left_list) < list_length(right_list))
    1994           0 :             ereport(ERROR,
    1995             :                     (errcode(ERRCODE_SYNTAX_ERROR),
    1996             :                      errmsg("subquery has too many columns"),
    1997             :                      parser_errposition(pstate, sublink->location)));
    1998        6044 :         if (list_length(left_list) > list_length(right_list))
    1999           0 :             ereport(ERROR,
    2000             :                     (errcode(ERRCODE_SYNTAX_ERROR),
    2001             :                      errmsg("subquery has too few columns"),
    2002             :                      parser_errposition(pstate, sublink->location)));
    2003             : 
    2004             :         /*
    2005             :          * Identify the combining operator(s) and generate a suitable
    2006             :          * row-comparison expression.
    2007             :          */
    2008        6044 :         sublink->testexpr = make_row_comparison_op(pstate,
    2009             :                                                    sublink->operName,
    2010             :                                                    left_list,
    2011             :                                                    right_list,
    2012             :                                                    sublink->location);
    2013             :     }
    2014             : 
    2015       48558 :     return result;
    2016             : }
    2017             : 
    2018             : /*
    2019             :  * transformArrayExpr
    2020             :  *
    2021             :  * If the caller specifies the target type, the resulting array will
    2022             :  * be of exactly that type.  Otherwise we try to infer a common type
    2023             :  * for the elements using select_common_type().
    2024             :  */
    2025             : static Node *
    2026        8044 : transformArrayExpr(ParseState *pstate, A_ArrayExpr *a,
    2027             :                    Oid array_type, Oid element_type, int32 typmod)
    2028             : {
    2029        8044 :     ArrayExpr  *newa = makeNode(ArrayExpr);
    2030        8044 :     List       *newelems = NIL;
    2031        8044 :     List       *newcoercedelems = NIL;
    2032             :     ListCell   *element;
    2033             :     Oid         coerce_type;
    2034             :     bool        coerce_hard;
    2035             : 
    2036             :     /*
    2037             :      * Transform the element expressions
    2038             :      *
    2039             :      * Assume that the array is one-dimensional unless we find an array-type
    2040             :      * element expression.
    2041             :      */
    2042        8044 :     newa->multidims = false;
    2043       26952 :     foreach(element, a->elements)
    2044             :     {
    2045       18908 :         Node       *e = (Node *) lfirst(element);
    2046             :         Node       *newe;
    2047             : 
    2048             :         /*
    2049             :          * If an element is itself an A_ArrayExpr, recurse directly so that we
    2050             :          * can pass down any target type we were given.
    2051             :          */
    2052       18908 :         if (IsA(e, A_ArrayExpr))
    2053             :         {
    2054         840 :             newe = transformArrayExpr(pstate,
    2055             :                                       (A_ArrayExpr *) e,
    2056             :                                       array_type,
    2057             :                                       element_type,
    2058             :                                       typmod);
    2059             :             /* we certainly have an array here */
    2060             :             Assert(array_type == InvalidOid || array_type == exprType(newe));
    2061         840 :             newa->multidims = true;
    2062             :         }
    2063             :         else
    2064             :         {
    2065       18068 :             newe = transformExprRecurse(pstate, e);
    2066             : 
    2067             :             /*
    2068             :              * Check for sub-array expressions, if we haven't already found
    2069             :              * one.  Note we don't accept domain-over-array as a sub-array,
    2070             :              * nor int2vector nor oidvector; those have constraints that don't
    2071             :              * map well to being treated as a sub-array.
    2072             :              */
    2073       18068 :             if (!newa->multidims)
    2074             :             {
    2075       18068 :                 Oid         newetype = exprType(newe);
    2076             : 
    2077       36088 :                 if (newetype != INT2VECTOROID && newetype != OIDVECTOROID &&
    2078       18020 :                     type_is_array(newetype))
    2079           6 :                     newa->multidims = true;
    2080             :             }
    2081             :         }
    2082             : 
    2083       18908 :         newelems = lappend(newelems, newe);
    2084             :     }
    2085             : 
    2086             :     /*
    2087             :      * Select a target type for the elements.
    2088             :      *
    2089             :      * If we haven't been given a target array type, we must try to deduce a
    2090             :      * common type based on the types of the individual elements present.
    2091             :      */
    2092        8044 :     if (OidIsValid(array_type))
    2093             :     {
    2094             :         /* Caller must ensure array_type matches element_type */
    2095             :         Assert(OidIsValid(element_type));
    2096         842 :         coerce_type = (newa->multidims ? array_type : element_type);
    2097         842 :         coerce_hard = true;
    2098             :     }
    2099             :     else
    2100             :     {
    2101             :         /* Can't handle an empty array without a target type */
    2102        7202 :         if (newelems == NIL)
    2103           6 :             ereport(ERROR,
    2104             :                     (errcode(ERRCODE_INDETERMINATE_DATATYPE),
    2105             :                      errmsg("cannot determine type of empty array"),
    2106             :                      errhint("Explicitly cast to the desired type, "
    2107             :                              "for example ARRAY[]::integer[]."),
    2108             :                      parser_errposition(pstate, a->location)));
    2109             : 
    2110             :         /* Select a common type for the elements */
    2111        7196 :         coerce_type = select_common_type(pstate, newelems, "ARRAY", NULL);
    2112             : 
    2113        7196 :         if (newa->multidims)
    2114             :         {
    2115         400 :             array_type = coerce_type;
    2116         400 :             element_type = get_element_type(array_type);
    2117         400 :             if (!OidIsValid(element_type))
    2118           0 :                 ereport(ERROR,
    2119             :                         (errcode(ERRCODE_UNDEFINED_OBJECT),
    2120             :                          errmsg("could not find element type for data type %s",
    2121             :                                 format_type_be(array_type)),
    2122             :                          parser_errposition(pstate, a->location)));
    2123             :         }
    2124             :         else
    2125             :         {
    2126        6796 :             element_type = coerce_type;
    2127        6796 :             array_type = get_array_type(element_type);
    2128        6796 :             if (!OidIsValid(array_type))
    2129           0 :                 ereport(ERROR,
    2130             :                         (errcode(ERRCODE_UNDEFINED_OBJECT),
    2131             :                          errmsg("could not find array type for data type %s",
    2132             :                                 format_type_be(element_type)),
    2133             :                          parser_errposition(pstate, a->location)));
    2134             :         }
    2135        7196 :         coerce_hard = false;
    2136             :     }
    2137             : 
    2138             :     /*
    2139             :      * Coerce elements to target type
    2140             :      *
    2141             :      * If the array has been explicitly cast, then the elements are in turn
    2142             :      * explicitly coerced.
    2143             :      *
    2144             :      * If the array's type was merely derived from the common type of its
    2145             :      * elements, then the elements are implicitly coerced to the common type.
    2146             :      * This is consistent with other uses of select_common_type().
    2147             :      */
    2148       26946 :     foreach(element, newelems)
    2149             :     {
    2150       18908 :         Node       *e = (Node *) lfirst(element);
    2151             :         Node       *newe;
    2152             : 
    2153       18908 :         if (coerce_hard)
    2154             :         {
    2155        2038 :             newe = coerce_to_target_type(pstate, e,
    2156             :                                          exprType(e),
    2157             :                                          coerce_type,
    2158             :                                          typmod,
    2159             :                                          COERCION_EXPLICIT,
    2160             :                                          COERCE_EXPLICIT_CAST,
    2161             :                                          -1);
    2162        2038 :             if (newe == NULL)
    2163           0 :                 ereport(ERROR,
    2164             :                         (errcode(ERRCODE_CANNOT_COERCE),
    2165             :                          errmsg("cannot cast type %s to %s",
    2166             :                                 format_type_be(exprType(e)),
    2167             :                                 format_type_be(coerce_type)),
    2168             :                          parser_errposition(pstate, exprLocation(e))));
    2169             :         }
    2170             :         else
    2171       16870 :             newe = coerce_to_common_type(pstate, e,
    2172             :                                          coerce_type,
    2173             :                                          "ARRAY");
    2174       18908 :         newcoercedelems = lappend(newcoercedelems, newe);
    2175             :     }
    2176             : 
    2177        8038 :     newa->array_typeid = array_type;
    2178             :     /* array_collid will be set by parse_collate.c */
    2179        8038 :     newa->element_typeid = element_type;
    2180        8038 :     newa->elements = newcoercedelems;
    2181        8038 :     newa->list_start = a->list_start;
    2182        8038 :     newa->list_end = a->list_end;
    2183        8038 :     newa->location = a->location;
    2184             : 
    2185        8038 :     return (Node *) newa;
    2186             : }
    2187             : 
    2188             : static Node *
    2189        5946 : transformRowExpr(ParseState *pstate, RowExpr *r, bool allowDefault)
    2190             : {
    2191             :     RowExpr    *newr;
    2192             :     char        fname[16];
    2193             :     int         fnum;
    2194             : 
    2195        5946 :     newr = makeNode(RowExpr);
    2196             : 
    2197             :     /* Transform the field expressions */
    2198        5946 :     newr->args = transformExpressionList(pstate, r->args,
    2199             :                                          pstate->p_expr_kind, allowDefault);
    2200             : 
    2201             :     /* Disallow more columns than will fit in a tuple */
    2202        5946 :     if (list_length(newr->args) > MaxTupleAttributeNumber)
    2203           0 :         ereport(ERROR,
    2204             :                 (errcode(ERRCODE_TOO_MANY_COLUMNS),
    2205             :                  errmsg("ROW expressions can have at most %d entries",
    2206             :                         MaxTupleAttributeNumber),
    2207             :                  parser_errposition(pstate, r->location)));
    2208             : 
    2209             :     /* Barring later casting, we consider the type RECORD */
    2210        5946 :     newr->row_typeid = RECORDOID;
    2211        5946 :     newr->row_format = COERCE_IMPLICIT_CAST;
    2212             : 
    2213             :     /* ROW() has anonymous columns, so invent some field names */
    2214        5946 :     newr->colnames = NIL;
    2215       20814 :     for (fnum = 1; fnum <= list_length(newr->args); fnum++)
    2216             :     {
    2217       14868 :         snprintf(fname, sizeof(fname), "f%d", fnum);
    2218       14868 :         newr->colnames = lappend(newr->colnames, makeString(pstrdup(fname)));
    2219             :     }
    2220             : 
    2221        5946 :     newr->location = r->location;
    2222             : 
    2223        5946 :     return (Node *) newr;
    2224             : }
    2225             : 
    2226             : static Node *
    2227        3320 : transformCoalesceExpr(ParseState *pstate, CoalesceExpr *c)
    2228             : {
    2229        3320 :     CoalesceExpr *newc = makeNode(CoalesceExpr);
    2230        3320 :     Node       *last_srf = pstate->p_last_srf;
    2231        3320 :     List       *newargs = NIL;
    2232        3320 :     List       *newcoercedargs = NIL;
    2233             :     ListCell   *args;
    2234             : 
    2235        9966 :     foreach(args, c->args)
    2236             :     {
    2237        6646 :         Node       *e = (Node *) lfirst(args);
    2238             :         Node       *newe;
    2239             : 
    2240        6646 :         newe = transformExprRecurse(pstate, e);
    2241        6646 :         newargs = lappend(newargs, newe);
    2242             :     }
    2243             : 
    2244        3320 :     newc->coalescetype = select_common_type(pstate, newargs, "COALESCE", NULL);
    2245             :     /* coalescecollid will be set by parse_collate.c */
    2246             : 
    2247             :     /* Convert arguments if necessary */
    2248        9966 :     foreach(args, newargs)
    2249             :     {
    2250        6646 :         Node       *e = (Node *) lfirst(args);
    2251             :         Node       *newe;
    2252             : 
    2253        6646 :         newe = coerce_to_common_type(pstate, e,
    2254             :                                      newc->coalescetype,
    2255             :                                      "COALESCE");
    2256        6646 :         newcoercedargs = lappend(newcoercedargs, newe);
    2257             :     }
    2258             : 
    2259             :     /* if any subexpression contained a SRF, complain */
    2260        3320 :     if (pstate->p_last_srf != last_srf)
    2261           6 :         ereport(ERROR,
    2262             :                 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
    2263             :         /* translator: %s is name of a SQL construct, eg GROUP BY */
    2264             :                  errmsg("set-returning functions are not allowed in %s",
    2265             :                         "COALESCE"),
    2266             :                  errhint("You might be able to move the set-returning function into a LATERAL FROM item."),
    2267             :                  parser_errposition(pstate,
    2268             :                                     exprLocation(pstate->p_last_srf))));
    2269             : 
    2270        3314 :     newc->args = newcoercedargs;
    2271        3314 :     newc->location = c->location;
    2272        3314 :     return (Node *) newc;
    2273             : }
    2274             : 
    2275             : static Node *
    2276         280 : transformMinMaxExpr(ParseState *pstate, MinMaxExpr *m)
    2277             : {
    2278         280 :     MinMaxExpr *newm = makeNode(MinMaxExpr);
    2279         280 :     List       *newargs = NIL;
    2280         280 :     List       *newcoercedargs = NIL;
    2281         280 :     const char *funcname = (m->op == IS_GREATEST) ? "GREATEST" : "LEAST";
    2282             :     ListCell   *args;
    2283             : 
    2284         280 :     newm->op = m->op;
    2285         894 :     foreach(args, m->args)
    2286             :     {
    2287         614 :         Node       *e = (Node *) lfirst(args);
    2288             :         Node       *newe;
    2289             : 
    2290         614 :         newe = transformExprRecurse(pstate, e);
    2291         614 :         newargs = lappend(newargs, newe);
    2292             :     }
    2293             : 
    2294         280 :     newm->minmaxtype = select_common_type(pstate, newargs, funcname, NULL);
    2295             :     /* minmaxcollid and inputcollid will be set by parse_collate.c */
    2296             : 
    2297             :     /* Convert arguments if necessary */
    2298         894 :     foreach(args, newargs)
    2299             :     {
    2300         614 :         Node       *e = (Node *) lfirst(args);
    2301             :         Node       *newe;
    2302             : 
    2303         614 :         newe = coerce_to_common_type(pstate, e,
    2304             :                                      newm->minmaxtype,
    2305             :                                      funcname);
    2306         614 :         newcoercedargs = lappend(newcoercedargs, newe);
    2307             :     }
    2308             : 
    2309         280 :     newm->args = newcoercedargs;
    2310         280 :     newm->location = m->location;
    2311         280 :     return (Node *) newm;
    2312             : }
    2313             : 
    2314             : static Node *
    2315        2728 : transformSQLValueFunction(ParseState *pstate, SQLValueFunction *svf)
    2316             : {
    2317             :     /*
    2318             :      * All we need to do is insert the correct result type and (where needed)
    2319             :      * validate the typmod, so we just modify the node in-place.
    2320             :      */
    2321        2728 :     switch (svf->op)
    2322             :     {
    2323         312 :         case SVFOP_CURRENT_DATE:
    2324         312 :             svf->type = DATEOID;
    2325         312 :             break;
    2326          24 :         case SVFOP_CURRENT_TIME:
    2327          24 :             svf->type = TIMETZOID;
    2328          24 :             break;
    2329          24 :         case SVFOP_CURRENT_TIME_N:
    2330          24 :             svf->type = TIMETZOID;
    2331          24 :             svf->typmod = anytime_typmod_check(true, svf->typmod);
    2332          24 :             break;
    2333         286 :         case SVFOP_CURRENT_TIMESTAMP:
    2334         286 :             svf->type = TIMESTAMPTZOID;
    2335         286 :             break;
    2336         176 :         case SVFOP_CURRENT_TIMESTAMP_N:
    2337         176 :             svf->type = TIMESTAMPTZOID;
    2338         176 :             svf->typmod = anytimestamp_typmod_check(true, svf->typmod);
    2339         176 :             break;
    2340          24 :         case SVFOP_LOCALTIME:
    2341          24 :             svf->type = TIMEOID;
    2342          24 :             break;
    2343          24 :         case SVFOP_LOCALTIME_N:
    2344          24 :             svf->type = TIMEOID;
    2345          24 :             svf->typmod = anytime_typmod_check(false, svf->typmod);
    2346          24 :             break;
    2347          36 :         case SVFOP_LOCALTIMESTAMP:
    2348          36 :             svf->type = TIMESTAMPOID;
    2349          36 :             break;
    2350          24 :         case SVFOP_LOCALTIMESTAMP_N:
    2351          24 :             svf->type = TIMESTAMPOID;
    2352          24 :             svf->typmod = anytimestamp_typmod_check(false, svf->typmod);
    2353          24 :             break;
    2354        1798 :         case SVFOP_CURRENT_ROLE:
    2355             :         case SVFOP_CURRENT_USER:
    2356             :         case SVFOP_USER:
    2357             :         case SVFOP_SESSION_USER:
    2358             :         case SVFOP_CURRENT_CATALOG:
    2359             :         case SVFOP_CURRENT_SCHEMA:
    2360        1798 :             svf->type = NAMEOID;
    2361        1798 :             break;
    2362             :     }
    2363             : 
    2364        2728 :     return (Node *) svf;
    2365             : }
    2366             : 
    2367             : static Node *
    2368         596 : transformXmlExpr(ParseState *pstate, XmlExpr *x)
    2369             : {
    2370             :     XmlExpr    *newx;
    2371             :     ListCell   *lc;
    2372             :     int         i;
    2373             : 
    2374         596 :     newx = makeNode(XmlExpr);
    2375         596 :     newx->op = x->op;
    2376         596 :     if (x->name)
    2377         258 :         newx->name = map_sql_identifier_to_xml_name(x->name, false, false);
    2378             :     else
    2379         338 :         newx->name = NULL;
    2380         596 :     newx->xmloption = x->xmloption;
    2381         596 :     newx->type = XMLOID;     /* this just marks the node as transformed */
    2382         596 :     newx->typmod = -1;
    2383         596 :     newx->location = x->location;
    2384             : 
    2385             :     /*
    2386             :      * gram.y built the named args as a list of ResTarget.  Transform each,
    2387             :      * and break the names out as a separate list.
    2388             :      */
    2389         596 :     newx->named_args = NIL;
    2390         596 :     newx->arg_names = NIL;
    2391             : 
    2392         816 :     foreach(lc, x->named_args)
    2393             :     {
    2394         232 :         ResTarget  *r = lfirst_node(ResTarget, lc);
    2395             :         Node       *expr;
    2396             :         char       *argname;
    2397             : 
    2398         232 :         expr = transformExprRecurse(pstate, r->val);
    2399             : 
    2400         232 :         if (r->name)
    2401         106 :             argname = map_sql_identifier_to_xml_name(r->name, false, false);
    2402         126 :         else if (IsA(r->val, ColumnRef))
    2403         120 :             argname = map_sql_identifier_to_xml_name(FigureColname(r->val),
    2404             :                                                      true, false);
    2405             :         else
    2406             :         {
    2407           6 :             ereport(ERROR,
    2408             :                     (errcode(ERRCODE_SYNTAX_ERROR),
    2409             :                      x->op == IS_XMLELEMENT
    2410             :                      ? errmsg("unnamed XML attribute value must be a column reference")
    2411             :                      : errmsg("unnamed XML element value must be a column reference"),
    2412             :                      parser_errposition(pstate, r->location)));
    2413             :             argname = NULL;     /* keep compiler quiet */
    2414             :         }
    2415             : 
    2416             :         /* reject duplicate argnames in XMLELEMENT only */
    2417         226 :         if (x->op == IS_XMLELEMENT)
    2418             :         {
    2419             :             ListCell   *lc2;
    2420             : 
    2421         120 :             foreach(lc2, newx->arg_names)
    2422             :             {
    2423          38 :                 if (strcmp(argname, strVal(lfirst(lc2))) == 0)
    2424           6 :                     ereport(ERROR,
    2425             :                             (errcode(ERRCODE_SYNTAX_ERROR),
    2426             :                              errmsg("XML attribute name \"%s\" appears more than once",
    2427             :                                     argname),
    2428             :                              parser_errposition(pstate, r->location)));
    2429             :             }
    2430             :         }
    2431             : 
    2432         220 :         newx->named_args = lappend(newx->named_args, expr);
    2433         220 :         newx->arg_names = lappend(newx->arg_names, makeString(argname));
    2434             :     }
    2435             : 
    2436             :     /* The other arguments are of varying types depending on the function */
    2437         584 :     newx->args = NIL;
    2438         584 :     i = 0;
    2439        1402 :     foreach(lc, x->args)
    2440             :     {
    2441         836 :         Node       *e = (Node *) lfirst(lc);
    2442             :         Node       *newe;
    2443             : 
    2444         836 :         newe = transformExprRecurse(pstate, e);
    2445         836 :         switch (x->op)
    2446             :         {
    2447         130 :             case IS_XMLCONCAT:
    2448         130 :                 newe = coerce_to_specific_type(pstate, newe, XMLOID,
    2449             :                                                "XMLCONCAT");
    2450         118 :                 break;
    2451         136 :             case IS_XMLELEMENT:
    2452             :                 /* no coercion necessary */
    2453         136 :                 break;
    2454           0 :             case IS_XMLFOREST:
    2455           0 :                 newe = coerce_to_specific_type(pstate, newe, XMLOID,
    2456             :                                                "XMLFOREST");
    2457           0 :                 break;
    2458         280 :             case IS_XMLPARSE:
    2459         280 :                 if (i == 0)
    2460         140 :                     newe = coerce_to_specific_type(pstate, newe, TEXTOID,
    2461             :                                                    "XMLPARSE");
    2462             :                 else
    2463         140 :                     newe = coerce_to_boolean(pstate, newe, "XMLPARSE");
    2464         280 :                 break;
    2465          50 :             case IS_XMLPI:
    2466          50 :                 newe = coerce_to_specific_type(pstate, newe, TEXTOID,
    2467             :                                                "XMLPI");
    2468          50 :                 break;
    2469         204 :             case IS_XMLROOT:
    2470         204 :                 if (i == 0)
    2471          68 :                     newe = coerce_to_specific_type(pstate, newe, XMLOID,
    2472             :                                                    "XMLROOT");
    2473         136 :                 else if (i == 1)
    2474          68 :                     newe = coerce_to_specific_type(pstate, newe, TEXTOID,
    2475             :                                                    "XMLROOT");
    2476             :                 else
    2477          68 :                     newe = coerce_to_specific_type(pstate, newe, INT4OID,
    2478             :                                                    "XMLROOT");
    2479         204 :                 break;
    2480           0 :             case IS_XMLSERIALIZE:
    2481             :                 /* not handled here */
    2482             :                 Assert(false);
    2483           0 :                 break;
    2484          36 :             case IS_DOCUMENT:
    2485          36 :                 newe = coerce_to_specific_type(pstate, newe, XMLOID,
    2486             :                                                "IS DOCUMENT");
    2487          30 :                 break;
    2488             :         }
    2489         818 :         newx->args = lappend(newx->args, newe);
    2490         818 :         i++;
    2491             :     }
    2492             : 
    2493         566 :     return (Node *) newx;
    2494             : }
    2495             : 
    2496             : static Node *
    2497         218 : transformXmlSerialize(ParseState *pstate, XmlSerialize *xs)
    2498             : {
    2499             :     Node       *result;
    2500             :     XmlExpr    *xexpr;
    2501             :     Oid         targetType;
    2502             :     int32       targetTypmod;
    2503             : 
    2504         218 :     xexpr = makeNode(XmlExpr);
    2505         218 :     xexpr->op = IS_XMLSERIALIZE;
    2506         218 :     xexpr->args = list_make1(coerce_to_specific_type(pstate,
    2507             :                                                      transformExprRecurse(pstate, xs->expr),
    2508             :                                                      XMLOID,
    2509             :                                                      "XMLSERIALIZE"));
    2510             : 
    2511         218 :     typenameTypeIdAndMod(pstate, xs->typeName, &targetType, &targetTypmod);
    2512             : 
    2513         218 :     xexpr->xmloption = xs->xmloption;
    2514         218 :     xexpr->indent = xs->indent;
    2515         218 :     xexpr->location = xs->location;
    2516             :     /* We actually only need these to be able to parse back the expression. */
    2517         218 :     xexpr->type = targetType;
    2518         218 :     xexpr->typmod = targetTypmod;
    2519             : 
    2520             :     /*
    2521             :      * The actual target type is determined this way.  SQL allows char and
    2522             :      * varchar as target types.  We allow anything that can be cast implicitly
    2523             :      * from text.  This way, user-defined text-like data types automatically
    2524             :      * fit in.
    2525             :      */
    2526         218 :     result = coerce_to_target_type(pstate, (Node *) xexpr,
    2527             :                                    TEXTOID, targetType, targetTypmod,
    2528             :                                    COERCION_IMPLICIT,
    2529             :                                    COERCE_IMPLICIT_CAST,
    2530             :                                    -1);
    2531         218 :     if (result == NULL)
    2532           0 :         ereport(ERROR,
    2533             :                 (errcode(ERRCODE_CANNOT_COERCE),
    2534             :                  errmsg("cannot cast XMLSERIALIZE result to %s",
    2535             :                         format_type_be(targetType)),
    2536             :                  parser_errposition(pstate, xexpr->location)));
    2537         218 :     return result;
    2538             : }
    2539             : 
    2540             : static Node *
    2541         946 : transformBooleanTest(ParseState *pstate, BooleanTest *b)
    2542             : {
    2543             :     const char *clausename;
    2544             : 
    2545         946 :     switch (b->booltesttype)
    2546             :     {
    2547         456 :         case IS_TRUE:
    2548         456 :             clausename = "IS TRUE";
    2549         456 :             break;
    2550         140 :         case IS_NOT_TRUE:
    2551         140 :             clausename = "IS NOT TRUE";
    2552         140 :             break;
    2553         158 :         case IS_FALSE:
    2554         158 :             clausename = "IS FALSE";
    2555         158 :             break;
    2556          92 :         case IS_NOT_FALSE:
    2557          92 :             clausename = "IS NOT FALSE";
    2558          92 :             break;
    2559          52 :         case IS_UNKNOWN:
    2560          52 :             clausename = "IS UNKNOWN";
    2561          52 :             break;
    2562          48 :         case IS_NOT_UNKNOWN:
    2563          48 :             clausename = "IS NOT UNKNOWN";
    2564          48 :             break;
    2565           0 :         default:
    2566           0 :             elog(ERROR, "unrecognized booltesttype: %d",
    2567             :                  (int) b->booltesttype);
    2568             :             clausename = NULL;  /* keep compiler quiet */
    2569             :     }
    2570             : 
    2571         946 :     b->arg = (Expr *) transformExprRecurse(pstate, (Node *) b->arg);
    2572             : 
    2573        1892 :     b->arg = (Expr *) coerce_to_boolean(pstate,
    2574         946 :                                         (Node *) b->arg,
    2575             :                                         clausename);
    2576             : 
    2577         946 :     return (Node *) b;
    2578             : }
    2579             : 
    2580             : static Node *
    2581         254 : transformCurrentOfExpr(ParseState *pstate, CurrentOfExpr *cexpr)
    2582             : {
    2583             :     /* CURRENT OF can only appear at top level of UPDATE/DELETE */
    2584             :     Assert(pstate->p_target_nsitem != NULL);
    2585         254 :     cexpr->cvarno = pstate->p_target_nsitem->p_rtindex;
    2586             : 
    2587             :     /*
    2588             :      * Check to see if the cursor name matches a parameter of type REFCURSOR.
    2589             :      * If so, replace the raw name reference with a parameter reference. (This
    2590             :      * is a hack for the convenience of plpgsql.)
    2591             :      */
    2592         254 :     if (cexpr->cursor_name != NULL) /* in case already transformed */
    2593             :     {
    2594         254 :         ColumnRef  *cref = makeNode(ColumnRef);
    2595         254 :         Node       *node = NULL;
    2596             : 
    2597             :         /* Build an unqualified ColumnRef with the given name */
    2598         254 :         cref->fields = list_make1(makeString(cexpr->cursor_name));
    2599         254 :         cref->location = -1;
    2600             : 
    2601             :         /* See if there is a translation available from a parser hook */
    2602         254 :         if (pstate->p_pre_columnref_hook != NULL)
    2603          12 :             node = pstate->p_pre_columnref_hook(pstate, cref);
    2604         254 :         if (node == NULL && pstate->p_post_columnref_hook != NULL)
    2605          12 :             node = pstate->p_post_columnref_hook(pstate, cref, NULL);
    2606             : 
    2607             :         /*
    2608             :          * XXX Should we throw an error if we get a translation that isn't a
    2609             :          * refcursor Param?  For now it seems best to silently ignore false
    2610             :          * matches.
    2611             :          */
    2612         254 :         if (node != NULL && IsA(node, Param))
    2613             :         {
    2614          12 :             Param      *p = (Param *) node;
    2615             : 
    2616          12 :             if (p->paramkind == PARAM_EXTERN &&
    2617          12 :                 p->paramtype == REFCURSOROID)
    2618             :             {
    2619             :                 /* Matches, so convert CURRENT OF to a param reference */
    2620          12 :                 cexpr->cursor_name = NULL;
    2621          12 :                 cexpr->cursor_param = p->paramid;
    2622             :             }
    2623             :         }
    2624             :     }
    2625             : 
    2626         254 :     return (Node *) cexpr;
    2627             : }
    2628             : 
    2629             : /*
    2630             :  * Construct a whole-row reference to represent the notation "relation.*".
    2631             :  */
    2632             : static Node *
    2633        9178 : transformWholeRowRef(ParseState *pstate, ParseNamespaceItem *nsitem,
    2634             :                      int sublevels_up, int location)
    2635             : {
    2636             :     /*
    2637             :      * Build the appropriate referencing node.  Normally this can be a
    2638             :      * whole-row Var, but if the nsitem is a JOIN USING alias then it contains
    2639             :      * only a subset of the columns of the underlying join RTE, so that will
    2640             :      * not work.  Instead we immediately expand the reference into a RowExpr.
    2641             :      * Since the JOIN USING's common columns are fully determined at this
    2642             :      * point, there seems no harm in expanding it now rather than during
    2643             :      * planning.
    2644             :      *
    2645             :      * Note that if the nsitem is an OLD/NEW alias for the target RTE (as can
    2646             :      * appear in a RETURNING list), its alias won't match the target RTE's
    2647             :      * alias, but we still want to make a whole-row Var here rather than a
    2648             :      * RowExpr, for consistency with direct references to the target RTE, and
    2649             :      * so that any dropped columns are handled correctly.  Thus we also check
    2650             :      * p_returning_type here.
    2651             :      *
    2652             :      * Note that if the RTE is a function returning scalar, we create just a
    2653             :      * plain reference to the function value, not a composite containing a
    2654             :      * single column.  This is pretty inconsistent at first sight, but it's
    2655             :      * what we've done historically.  One argument for it is that "rel" and
    2656             :      * "rel.*" mean the same thing for composite relations, so why not for
    2657             :      * scalar functions...
    2658             :      */
    2659        9178 :     if (nsitem->p_names == nsitem->p_rte->eref ||
    2660         288 :         nsitem->p_returning_type != VAR_RETURNING_DEFAULT)
    2661             :     {
    2662             :         Var        *result;
    2663             : 
    2664        9166 :         result = makeWholeRowVar(nsitem->p_rte, nsitem->p_rtindex,
    2665             :                                  sublevels_up, true);
    2666             : 
    2667             :         /* mark Var for RETURNING OLD/NEW, as necessary */
    2668        9166 :         result->varreturningtype = nsitem->p_returning_type;
    2669             : 
    2670             :         /* location is not filled in by makeWholeRowVar */
    2671        9166 :         result->location = location;
    2672             : 
    2673             :         /* mark Var if it's nulled by any outer joins */
    2674        9166 :         markNullableIfNeeded(pstate, result);
    2675             : 
    2676             :         /* mark relation as requiring whole-row SELECT access */
    2677        9166 :         markVarForSelectPriv(pstate, result);
    2678             : 
    2679        9166 :         return (Node *) result;
    2680             :     }
    2681             :     else
    2682             :     {
    2683             :         RowExpr    *rowexpr;
    2684             :         List       *fields;
    2685             : 
    2686             :         /*
    2687             :          * We want only as many columns as are listed in p_names->colnames,
    2688             :          * and we should use those names not whatever possibly-aliased names
    2689             :          * are in the RTE.  We needn't worry about marking the RTE for SELECT
    2690             :          * access, as the common columns are surely so marked already.
    2691             :          */
    2692          12 :         expandRTE(nsitem->p_rte, nsitem->p_rtindex, sublevels_up,
    2693             :                   nsitem->p_returning_type, location, false, NULL, &fields);
    2694          12 :         rowexpr = makeNode(RowExpr);
    2695          12 :         rowexpr->args = list_truncate(fields,
    2696          12 :                                       list_length(nsitem->p_names->colnames));
    2697          12 :         rowexpr->row_typeid = RECORDOID;
    2698          12 :         rowexpr->row_format = COERCE_IMPLICIT_CAST;
    2699          12 :         rowexpr->colnames = copyObject(nsitem->p_names->colnames);
    2700          12 :         rowexpr->location = location;
    2701             : 
    2702             :         /* XXX we ought to mark the row as possibly nullable */
    2703             : 
    2704          12 :         return (Node *) rowexpr;
    2705             :     }
    2706             : }
    2707             : 
    2708             : /*
    2709             :  * Handle an explicit CAST construct.
    2710             :  *
    2711             :  * Transform the argument, look up the type name, and apply any necessary
    2712             :  * coercion function(s).
    2713             :  */
    2714             : static Node *
    2715      320718 : transformTypeCast(ParseState *pstate, TypeCast *tc)
    2716             : {
    2717             :     Node       *result;
    2718      320718 :     Node       *arg = tc->arg;
    2719             :     Node       *expr;
    2720             :     Oid         inputType;
    2721             :     Oid         targetType;
    2722             :     int32       targetTypmod;
    2723             :     int         location;
    2724             : 
    2725             :     /* Look up the type name first */
    2726      320718 :     typenameTypeIdAndMod(pstate, tc->typeName, &targetType, &targetTypmod);
    2727             : 
    2728             :     /*
    2729             :      * If the subject of the typecast is an ARRAY[] construct and the target
    2730             :      * type is an array type, we invoke transformArrayExpr() directly so that
    2731             :      * we can pass down the type information.  This avoids some cases where
    2732             :      * transformArrayExpr() might not infer the correct type.  Otherwise, just
    2733             :      * transform the argument normally.
    2734             :      */
    2735      320718 :     if (IsA(arg, A_ArrayExpr))
    2736             :     {
    2737             :         Oid         targetBaseType;
    2738             :         int32       targetBaseTypmod;
    2739             :         Oid         elementType;
    2740             : 
    2741             :         /*
    2742             :          * If target is a domain over array, work with the base array type
    2743             :          * here.  Below, we'll cast the array type to the domain.  In the
    2744             :          * usual case that the target is not a domain, the remaining steps
    2745             :          * will be a no-op.
    2746             :          */
    2747         724 :         targetBaseTypmod = targetTypmod;
    2748         724 :         targetBaseType = getBaseTypeAndTypmod(targetType, &targetBaseTypmod);
    2749         724 :         elementType = get_element_type(targetBaseType);
    2750         724 :         if (OidIsValid(elementType))
    2751             :         {
    2752         714 :             expr = transformArrayExpr(pstate,
    2753             :                                       (A_ArrayExpr *) arg,
    2754             :                                       targetBaseType,
    2755             :                                       elementType,
    2756             :                                       targetBaseTypmod);
    2757             :         }
    2758             :         else
    2759          10 :             expr = transformExprRecurse(pstate, arg);
    2760             :     }
    2761             :     else
    2762      319994 :         expr = transformExprRecurse(pstate, arg);
    2763             : 
    2764      320700 :     inputType = exprType(expr);
    2765      320700 :     if (inputType == InvalidOid)
    2766           0 :         return expr;            /* do nothing if NULL input */
    2767             : 
    2768             :     /*
    2769             :      * Location of the coercion is preferentially the location of the :: or
    2770             :      * CAST symbol, but if there is none then use the location of the type
    2771             :      * name (this can happen in TypeName 'string' syntax, for instance).
    2772             :      */
    2773      320700 :     location = tc->location;
    2774      320700 :     if (location < 0)
    2775       17262 :         location = tc->typeName->location;
    2776             : 
    2777      320700 :     result = coerce_to_target_type(pstate, expr, inputType,
    2778             :                                    targetType, targetTypmod,
    2779             :                                    COERCION_EXPLICIT,
    2780             :                                    COERCE_EXPLICIT_CAST,
    2781             :                                    location);
    2782      316888 :     if (result == NULL)
    2783          28 :         ereport(ERROR,
    2784             :                 (errcode(ERRCODE_CANNOT_COERCE),
    2785             :                  errmsg("cannot cast type %s to %s",
    2786             :                         format_type_be(inputType),
    2787             :                         format_type_be(targetType)),
    2788             :                  parser_coercion_errposition(pstate, location, expr)));
    2789             : 
    2790      316860 :     return result;
    2791             : }
    2792             : 
    2793             : /*
    2794             :  * Handle an explicit COLLATE clause.
    2795             :  *
    2796             :  * Transform the argument, and look up the collation name.
    2797             :  */
    2798             : static Node *
    2799        9518 : transformCollateClause(ParseState *pstate, CollateClause *c)
    2800             : {
    2801             :     CollateExpr *newc;
    2802             :     Oid         argtype;
    2803             : 
    2804        9518 :     newc = makeNode(CollateExpr);
    2805        9518 :     newc->arg = (Expr *) transformExprRecurse(pstate, c->arg);
    2806             : 
    2807        9518 :     argtype = exprType((Node *) newc->arg);
    2808             : 
    2809             :     /*
    2810             :      * The unknown type is not collatable, but coerce_type() takes care of it
    2811             :      * separately, so we'll let it go here.
    2812             :      */
    2813        9518 :     if (!type_is_collatable(argtype) && argtype != UNKNOWNOID)
    2814          18 :         ereport(ERROR,
    2815             :                 (errcode(ERRCODE_DATATYPE_MISMATCH),
    2816             :                  errmsg("collations are not supported by type %s",
    2817             :                         format_type_be(argtype)),
    2818             :                  parser_errposition(pstate, c->location)));
    2819             : 
    2820        9500 :     newc->collOid = LookupCollation(pstate, c->collname, c->location);
    2821        9500 :     newc->location = c->location;
    2822             : 
    2823        9500 :     return (Node *) newc;
    2824             : }
    2825             : 
    2826             : /*
    2827             :  * Transform a "row compare-op row" construct
    2828             :  *
    2829             :  * The inputs are lists of already-transformed expressions.
    2830             :  * As with coerce_type, pstate may be NULL if no special unknown-Param
    2831             :  * processing is wanted.
    2832             :  *
    2833             :  * The output may be a single OpExpr, an AND or OR combination of OpExprs,
    2834             :  * or a RowCompareExpr.  In all cases it is guaranteed to return boolean.
    2835             :  * The AND, OR, and RowCompareExpr cases further imply things about the
    2836             :  * behavior of the operators (ie, they behave as =, <>, or < <= > >=).
    2837             :  */
    2838             : static Node *
    2839        6886 : make_row_comparison_op(ParseState *pstate, List *opname,
    2840             :                        List *largs, List *rargs, int location)
    2841             : {
    2842             :     RowCompareExpr *rcexpr;
    2843             :     CompareType cmptype;
    2844             :     List       *opexprs;
    2845             :     List       *opnos;
    2846             :     List       *opfamilies;
    2847             :     ListCell   *l,
    2848             :                *r;
    2849             :     List      **opinfo_lists;
    2850             :     Bitmapset  *cmptypes;
    2851             :     int         nopers;
    2852             :     int         i;
    2853             : 
    2854        6886 :     nopers = list_length(largs);
    2855        6886 :     if (nopers != list_length(rargs))
    2856           0 :         ereport(ERROR,
    2857             :                 (errcode(ERRCODE_SYNTAX_ERROR),
    2858             :                  errmsg("unequal number of entries in row expressions"),
    2859             :                  parser_errposition(pstate, location)));
    2860             : 
    2861             :     /*
    2862             :      * We can't compare zero-length rows because there is no principled basis
    2863             :      * for figuring out what the operator is.
    2864             :      */
    2865        6886 :     if (nopers == 0)
    2866           6 :         ereport(ERROR,
    2867             :                 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
    2868             :                  errmsg("cannot compare rows of zero length"),
    2869             :                  parser_errposition(pstate, location)));
    2870             : 
    2871             :     /*
    2872             :      * Identify all the pairwise operators, using make_op so that behavior is
    2873             :      * the same as in the simple scalar case.
    2874             :      */
    2875        6880 :     opexprs = NIL;
    2876       15146 :     forboth(l, largs, r, rargs)
    2877             :     {
    2878        8278 :         Node       *larg = (Node *) lfirst(l);
    2879        8278 :         Node       *rarg = (Node *) lfirst(r);
    2880             :         OpExpr     *cmp;
    2881             : 
    2882        8278 :         cmp = castNode(OpExpr, make_op(pstate, opname, larg, rarg,
    2883             :                                        pstate->p_last_srf, location));
    2884             : 
    2885             :         /*
    2886             :          * We don't use coerce_to_boolean here because we insist on the
    2887             :          * operator yielding boolean directly, not via coercion.  If it
    2888             :          * doesn't yield bool it won't be in any index opfamilies...
    2889             :          */
    2890        8266 :         if (cmp->opresulttype != BOOLOID)
    2891           0 :             ereport(ERROR,
    2892             :                     (errcode(ERRCODE_DATATYPE_MISMATCH),
    2893             :                      errmsg("row comparison operator must yield type boolean, "
    2894             :                             "not type %s",
    2895             :                             format_type_be(cmp->opresulttype)),
    2896             :                      parser_errposition(pstate, location)));
    2897        8266 :         if (expression_returns_set((Node *) cmp))
    2898           0 :             ereport(ERROR,
    2899             :                     (errcode(ERRCODE_DATATYPE_MISMATCH),
    2900             :                      errmsg("row comparison operator must not return a set"),
    2901             :                      parser_errposition(pstate, location)));
    2902        8266 :         opexprs = lappend(opexprs, cmp);
    2903             :     }
    2904             : 
    2905             :     /*
    2906             :      * If rows are length 1, just return the single operator.  In this case we
    2907             :      * don't insist on identifying btree semantics for the operator (but we
    2908             :      * still require it to return boolean).
    2909             :      */
    2910        6868 :     if (nopers == 1)
    2911        5738 :         return (Node *) linitial(opexprs);
    2912             : 
    2913             :     /*
    2914             :      * Now we must determine which row comparison semantics (= <> < <= > >=)
    2915             :      * apply to this set of operators.  We look for opfamilies containing the
    2916             :      * operators, and see which interpretations (cmptypes) exist for each
    2917             :      * operator.
    2918             :      */
    2919        1130 :     opinfo_lists = palloc_array(List *, nopers);
    2920        1130 :     cmptypes = NULL;
    2921        1130 :     i = 0;
    2922        3658 :     foreach(l, opexprs)
    2923             :     {
    2924        2528 :         Oid         opno = ((OpExpr *) lfirst(l))->opno;
    2925             :         Bitmapset  *this_cmptypes;
    2926             :         ListCell   *j;
    2927             : 
    2928        2528 :         opinfo_lists[i] = get_op_index_interpretation(opno);
    2929             : 
    2930             :         /*
    2931             :          * convert comparison types into a Bitmapset to make the intersection
    2932             :          * calculation easy.
    2933             :          */
    2934        2528 :         this_cmptypes = NULL;
    2935        5214 :         foreach(j, opinfo_lists[i])
    2936             :         {
    2937        2686 :             OpIndexInterpretation *opinfo = lfirst(j);
    2938             : 
    2939        2686 :             this_cmptypes = bms_add_member(this_cmptypes, opinfo->cmptype);
    2940             :         }
    2941        2528 :         if (i == 0)
    2942        1130 :             cmptypes = this_cmptypes;
    2943             :         else
    2944        1398 :             cmptypes = bms_int_members(cmptypes, this_cmptypes);
    2945        2528 :         i++;
    2946             :     }
    2947             : 
    2948             :     /*
    2949             :      * If there are multiple common interpretations, we may use any one of
    2950             :      * them ... this coding arbitrarily picks the lowest comparison type
    2951             :      * number.
    2952             :      */
    2953        1130 :     i = bms_next_member(cmptypes, -1);
    2954        1130 :     if (i < 0)
    2955             :     {
    2956             :         /* No common interpretation, so fail */
    2957           6 :         ereport(ERROR,
    2958             :                 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
    2959             :                  errmsg("could not determine interpretation of row comparison operator %s",
    2960             :                         strVal(llast(opname))),
    2961             :                  errhint("Row comparison operators must be associated with btree operator families."),
    2962             :                  parser_errposition(pstate, location)));
    2963             :     }
    2964        1124 :     cmptype = (CompareType) i;
    2965             : 
    2966             :     /*
    2967             :      * For = and <> cases, we just combine the pairwise operators with AND or
    2968             :      * OR respectively.
    2969             :      */
    2970        1124 :     if (cmptype == COMPARE_EQ)
    2971         450 :         return (Node *) makeBoolExpr(AND_EXPR, opexprs, location);
    2972         674 :     if (cmptype == COMPARE_NE)
    2973         404 :         return (Node *) makeBoolExpr(OR_EXPR, opexprs, location);
    2974             : 
    2975             :     /*
    2976             :      * Otherwise we need to choose exactly which opfamily to associate with
    2977             :      * each operator.
    2978             :      */
    2979         270 :     opfamilies = NIL;
    2980         864 :     for (i = 0; i < nopers; i++)
    2981             :     {
    2982         594 :         Oid         opfamily = InvalidOid;
    2983             :         ListCell   *j;
    2984             : 
    2985         594 :         foreach(j, opinfo_lists[i])
    2986             :         {
    2987         594 :             OpIndexInterpretation *opinfo = lfirst(j);
    2988             : 
    2989         594 :             if (opinfo->cmptype == cmptype)
    2990             :             {
    2991         594 :                 opfamily = opinfo->opfamily_id;
    2992         594 :                 break;
    2993             :             }
    2994             :         }
    2995         594 :         if (OidIsValid(opfamily))
    2996         594 :             opfamilies = lappend_oid(opfamilies, opfamily);
    2997             :         else                    /* should not happen */
    2998           0 :             ereport(ERROR,
    2999             :                     (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
    3000             :                      errmsg("could not determine interpretation of row comparison operator %s",
    3001             :                             strVal(llast(opname))),
    3002             :                      errdetail("There are multiple equally-plausible candidates."),
    3003             :                      parser_errposition(pstate, location)));
    3004             :     }
    3005             : 
    3006             :     /*
    3007             :      * Now deconstruct the OpExprs and create a RowCompareExpr.
    3008             :      *
    3009             :      * Note: can't just reuse the passed largs/rargs lists, because of
    3010             :      * possibility that make_op inserted coercion operations.
    3011             :      */
    3012         270 :     opnos = NIL;
    3013         270 :     largs = NIL;
    3014         270 :     rargs = NIL;
    3015         864 :     foreach(l, opexprs)
    3016             :     {
    3017         594 :         OpExpr     *cmp = (OpExpr *) lfirst(l);
    3018             : 
    3019         594 :         opnos = lappend_oid(opnos, cmp->opno);
    3020         594 :         largs = lappend(largs, linitial(cmp->args));
    3021         594 :         rargs = lappend(rargs, lsecond(cmp->args));
    3022             :     }
    3023             : 
    3024         270 :     rcexpr = makeNode(RowCompareExpr);
    3025         270 :     rcexpr->cmptype = cmptype;
    3026         270 :     rcexpr->opnos = opnos;
    3027         270 :     rcexpr->opfamilies = opfamilies;
    3028         270 :     rcexpr->inputcollids = NIL; /* assign_expr_collations will fix this */
    3029         270 :     rcexpr->largs = largs;
    3030         270 :     rcexpr->rargs = rargs;
    3031             : 
    3032         270 :     return (Node *) rcexpr;
    3033             : }
    3034             : 
    3035             : /*
    3036             :  * Transform a "row IS DISTINCT FROM row" construct
    3037             :  *
    3038             :  * The input RowExprs are already transformed
    3039             :  */
    3040             : static Node *
    3041           6 : make_row_distinct_op(ParseState *pstate, List *opname,
    3042             :                      RowExpr *lrow, RowExpr *rrow,
    3043             :                      int location)
    3044             : {
    3045           6 :     Node       *result = NULL;
    3046           6 :     List       *largs = lrow->args;
    3047           6 :     List       *rargs = rrow->args;
    3048             :     ListCell   *l,
    3049             :                *r;
    3050             : 
    3051           6 :     if (list_length(largs) != list_length(rargs))
    3052           0 :         ereport(ERROR,
    3053             :                 (errcode(ERRCODE_SYNTAX_ERROR),
    3054             :                  errmsg("unequal number of entries in row expressions"),
    3055             :                  parser_errposition(pstate, location)));
    3056             : 
    3057          24 :     forboth(l, largs, r, rargs)
    3058             :     {
    3059          18 :         Node       *larg = (Node *) lfirst(l);
    3060          18 :         Node       *rarg = (Node *) lfirst(r);
    3061             :         Node       *cmp;
    3062             : 
    3063          18 :         cmp = (Node *) make_distinct_op(pstate, opname, larg, rarg, location);
    3064          18 :         if (result == NULL)
    3065           6 :             result = cmp;
    3066             :         else
    3067          12 :             result = (Node *) makeBoolExpr(OR_EXPR,
    3068          12 :                                            list_make2(result, cmp),
    3069             :                                            location);
    3070             :     }
    3071             : 
    3072           6 :     if (result == NULL)
    3073             :     {
    3074             :         /* zero-length rows?  Generate constant FALSE */
    3075           0 :         result = makeBoolConst(false, false);
    3076             :     }
    3077             : 
    3078           6 :     return result;
    3079             : }
    3080             : 
    3081             : /*
    3082             :  * make the node for an IS DISTINCT FROM operator
    3083             :  */
    3084             : static Expr *
    3085        1130 : make_distinct_op(ParseState *pstate, List *opname, Node *ltree, Node *rtree,
    3086             :                  int location)
    3087             : {
    3088             :     Expr       *result;
    3089             : 
    3090        1130 :     result = make_op(pstate, opname, ltree, rtree,
    3091             :                      pstate->p_last_srf, location);
    3092        1130 :     if (((OpExpr *) result)->opresulttype != BOOLOID)
    3093           0 :         ereport(ERROR,
    3094             :                 (errcode(ERRCODE_DATATYPE_MISMATCH),
    3095             :         /* translator: %s is name of a SQL construct, eg NULLIF */
    3096             :                  errmsg("%s requires = operator to yield boolean",
    3097             :                         "IS DISTINCT FROM"),
    3098             :                  parser_errposition(pstate, location)));
    3099        1130 :     if (((OpExpr *) result)->opretset)
    3100           0 :         ereport(ERROR,
    3101             :                 (errcode(ERRCODE_DATATYPE_MISMATCH),
    3102             :         /* translator: %s is name of a SQL construct, eg NULLIF */
    3103             :                  errmsg("%s must not return a set", "IS DISTINCT FROM"),
    3104             :                  parser_errposition(pstate, location)));
    3105             : 
    3106             :     /*
    3107             :      * We rely on DistinctExpr and OpExpr being same struct
    3108             :      */
    3109        1130 :     NodeSetTag(result, T_DistinctExpr);
    3110             : 
    3111        1130 :     return result;
    3112             : }
    3113             : 
    3114             : /*
    3115             :  * Produce a NullTest node from an IS [NOT] DISTINCT FROM NULL construct
    3116             :  *
    3117             :  * "arg" is the untransformed other argument
    3118             :  */
    3119             : static Node *
    3120          30 : make_nulltest_from_distinct(ParseState *pstate, A_Expr *distincta, Node *arg)
    3121             : {
    3122          30 :     NullTest   *nt = makeNode(NullTest);
    3123             : 
    3124          30 :     nt->arg = (Expr *) transformExprRecurse(pstate, arg);
    3125             :     /* the argument can be any type, so don't coerce it */
    3126          30 :     if (distincta->kind == AEXPR_NOT_DISTINCT)
    3127          12 :         nt->nulltesttype = IS_NULL;
    3128             :     else
    3129          18 :         nt->nulltesttype = IS_NOT_NULL;
    3130             :     /* argisrow = false is correct whether or not arg is composite */
    3131          30 :     nt->argisrow = false;
    3132          30 :     nt->location = distincta->location;
    3133          30 :     return (Node *) nt;
    3134             : }
    3135             : 
    3136             : /*
    3137             :  * Produce a string identifying an expression by kind.
    3138             :  *
    3139             :  * Note: when practical, use a simple SQL keyword for the result.  If that
    3140             :  * doesn't work well, check call sites to see whether custom error message
    3141             :  * strings are required.
    3142             :  */
    3143             : const char *
    3144          78 : ParseExprKindName(ParseExprKind exprKind)
    3145             : {
    3146          78 :     switch (exprKind)
    3147             :     {
    3148           0 :         case EXPR_KIND_NONE:
    3149           0 :             return "invalid expression context";
    3150           0 :         case EXPR_KIND_OTHER:
    3151           0 :             return "extension expression";
    3152           0 :         case EXPR_KIND_JOIN_ON:
    3153           0 :             return "JOIN/ON";
    3154           0 :         case EXPR_KIND_JOIN_USING:
    3155           0 :             return "JOIN/USING";
    3156           0 :         case EXPR_KIND_FROM_SUBSELECT:
    3157           0 :             return "sub-SELECT in FROM";
    3158           0 :         case EXPR_KIND_FROM_FUNCTION:
    3159           0 :             return "function in FROM";
    3160          24 :         case EXPR_KIND_WHERE:
    3161          24 :             return "WHERE";
    3162           0 :         case EXPR_KIND_POLICY:
    3163           0 :             return "POLICY";
    3164           0 :         case EXPR_KIND_HAVING:
    3165           0 :             return "HAVING";
    3166          12 :         case EXPR_KIND_FILTER:
    3167          12 :             return "FILTER";
    3168           0 :         case EXPR_KIND_WINDOW_PARTITION:
    3169           0 :             return "window PARTITION BY";
    3170           0 :         case EXPR_KIND_WINDOW_ORDER:
    3171           0 :             return "window ORDER BY";
    3172           0 :         case EXPR_KIND_WINDOW_FRAME_RANGE:
    3173           0 :             return "window RANGE";
    3174           0 :         case EXPR_KIND_WINDOW_FRAME_ROWS:
    3175           0 :             return "window ROWS";
    3176           0 :         case EXPR_KIND_WINDOW_FRAME_GROUPS:
    3177           0 :             return "window GROUPS";
    3178           0 :         case EXPR_KIND_SELECT_TARGET:
    3179           0 :             return "SELECT";
    3180           0 :         case EXPR_KIND_INSERT_TARGET:
    3181           0 :             return "INSERT";
    3182           6 :         case EXPR_KIND_UPDATE_SOURCE:
    3183             :         case EXPR_KIND_UPDATE_TARGET:
    3184           6 :             return "UPDATE";
    3185           0 :         case EXPR_KIND_MERGE_WHEN:
    3186           0 :             return "MERGE WHEN";
    3187          12 :         case EXPR_KIND_GROUP_BY:
    3188          12 :             return "GROUP BY";
    3189           0 :         case EXPR_KIND_ORDER_BY:
    3190           0 :             return "ORDER BY";
    3191           0 :         case EXPR_KIND_DISTINCT_ON:
    3192           0 :             return "DISTINCT ON";
    3193           6 :         case EXPR_KIND_LIMIT:
    3194           6 :             return "LIMIT";
    3195           0 :         case EXPR_KIND_OFFSET:
    3196           0 :             return "OFFSET";
    3197          12 :         case EXPR_KIND_RETURNING:
    3198             :         case EXPR_KIND_MERGE_RETURNING:
    3199          12 :             return "RETURNING";
    3200           6 :         case EXPR_KIND_VALUES:
    3201             :         case EXPR_KIND_VALUES_SINGLE:
    3202           6 :             return "VALUES";
    3203           0 :         case EXPR_KIND_CHECK_CONSTRAINT:
    3204             :         case EXPR_KIND_DOMAIN_CHECK:
    3205           0 :             return "CHECK";
    3206           0 :         case EXPR_KIND_COLUMN_DEFAULT:
    3207             :         case EXPR_KIND_FUNCTION_DEFAULT:
    3208           0 :             return "DEFAULT";
    3209           0 :         case EXPR_KIND_INDEX_EXPRESSION:
    3210           0 :             return "index expression";
    3211           0 :         case EXPR_KIND_INDEX_PREDICATE:
    3212           0 :             return "index predicate";
    3213           0 :         case EXPR_KIND_STATS_EXPRESSION:
    3214           0 :             return "statistics expression";
    3215           0 :         case EXPR_KIND_ALTER_COL_TRANSFORM:
    3216           0 :             return "USING";
    3217           0 :         case EXPR_KIND_EXECUTE_PARAMETER:
    3218           0 :             return "EXECUTE";
    3219           0 :         case EXPR_KIND_TRIGGER_WHEN:
    3220           0 :             return "WHEN";
    3221           0 :         case EXPR_KIND_PARTITION_BOUND:
    3222           0 :             return "partition bound";
    3223           0 :         case EXPR_KIND_PARTITION_EXPRESSION:
    3224           0 :             return "PARTITION BY";
    3225           0 :         case EXPR_KIND_CALL_ARGUMENT:
    3226           0 :             return "CALL";
    3227           0 :         case EXPR_KIND_COPY_WHERE:
    3228           0 :             return "WHERE";
    3229           0 :         case EXPR_KIND_GENERATED_COLUMN:
    3230           0 :             return "GENERATED AS";
    3231           0 :         case EXPR_KIND_CYCLE_MARK:
    3232           0 :             return "CYCLE";
    3233             : 
    3234             :             /*
    3235             :              * There is intentionally no default: case here, so that the
    3236             :              * compiler will warn if we add a new ParseExprKind without
    3237             :              * extending this switch.  If we do see an unrecognized value at
    3238             :              * runtime, we'll fall through to the "unrecognized" return.
    3239             :              */
    3240             :     }
    3241           0 :     return "unrecognized expression kind";
    3242             : }
    3243             : 
    3244             : /*
    3245             :  * Make string Const node from JSON encoding name.
    3246             :  *
    3247             :  * UTF8 is default encoding.
    3248             :  */
    3249             : static Const *
    3250         192 : getJsonEncodingConst(JsonFormat *format)
    3251             : {
    3252             :     JsonEncoding encoding;
    3253             :     const char *enc;
    3254         192 :     Name        encname = palloc_object(NameData);
    3255             : 
    3256         192 :     if (!format ||
    3257         192 :         format->format_type == JS_FORMAT_DEFAULT ||
    3258         132 :         format->encoding == JS_ENC_DEFAULT)
    3259         168 :         encoding = JS_ENC_UTF8;
    3260             :     else
    3261          24 :         encoding = format->encoding;
    3262             : 
    3263         192 :     switch (encoding)
    3264             :     {
    3265           0 :         case JS_ENC_UTF16:
    3266           0 :             enc = "UTF16";
    3267           0 :             break;
    3268           0 :         case JS_ENC_UTF32:
    3269           0 :             enc = "UTF32";
    3270           0 :             break;
    3271         192 :         case JS_ENC_UTF8:
    3272         192 :             enc = "UTF8";
    3273         192 :             break;
    3274           0 :         default:
    3275           0 :             elog(ERROR, "invalid JSON encoding: %d", encoding);
    3276             :             break;
    3277             :     }
    3278             : 
    3279         192 :     namestrcpy(encname, enc);
    3280             : 
    3281         192 :     return makeConst(NAMEOID, -1, InvalidOid, NAMEDATALEN,
    3282             :                      NameGetDatum(encname), false, false);
    3283             : }
    3284             : 
    3285             : /*
    3286             :  * Make bytea => text conversion using specified JSON format encoding.
    3287             :  */
    3288             : static Node *
    3289         132 : makeJsonByteaToTextConversion(Node *expr, JsonFormat *format, int location)
    3290             : {
    3291         132 :     Const      *encoding = getJsonEncodingConst(format);
    3292         132 :     FuncExpr   *fexpr = makeFuncExpr(F_CONVERT_FROM, TEXTOID,
    3293         132 :                                      list_make2(expr, encoding),
    3294             :                                      InvalidOid, InvalidOid,
    3295             :                                      COERCE_EXPLICIT_CALL);
    3296             : 
    3297         132 :     fexpr->location = location;
    3298             : 
    3299         132 :     return (Node *) fexpr;
    3300             : }
    3301             : 
    3302             : /*
    3303             :  * Transform JSON value expression using specified input JSON format or
    3304             :  * default format otherwise, coercing to the targettype if needed.
    3305             :  *
    3306             :  * Returned expression is either ve->raw_expr coerced to text (if needed) or
    3307             :  * a JsonValueExpr with formatted_expr set to the coerced copy of raw_expr
    3308             :  * if the specified format and the targettype requires it.
    3309             :  */
    3310             : static Node *
    3311        5804 : transformJsonValueExpr(ParseState *pstate, const char *constructName,
    3312             :                        JsonValueExpr *ve, JsonFormatType default_format,
    3313             :                        Oid targettype, bool isarg)
    3314             : {
    3315        5804 :     Node       *expr = transformExprRecurse(pstate, (Node *) ve->raw_expr);
    3316             :     Node       *rawexpr;
    3317             :     JsonFormatType format;
    3318             :     Oid         exprtype;
    3319             :     int         location;
    3320             :     char        typcategory;
    3321             :     bool        typispreferred;
    3322             : 
    3323        5804 :     if (exprType(expr) == UNKNOWNOID)
    3324         734 :         expr = coerce_to_specific_type(pstate, expr, TEXTOID, constructName);
    3325             : 
    3326        5804 :     rawexpr = expr;
    3327        5804 :     exprtype = exprType(expr);
    3328        5804 :     location = exprLocation(expr);
    3329             : 
    3330        5804 :     get_type_category_preferred(exprtype, &typcategory, &typispreferred);
    3331             : 
    3332        5804 :     if (ve->format->format_type != JS_FORMAT_DEFAULT)
    3333             :     {
    3334         246 :         if (ve->format->encoding != JS_ENC_DEFAULT && exprtype != BYTEAOID)
    3335          28 :             ereport(ERROR,
    3336             :                     errcode(ERRCODE_DATATYPE_MISMATCH),
    3337             :                     errmsg("JSON ENCODING clause is only allowed for bytea input type"),
    3338             :                     parser_errposition(pstate, ve->format->location));
    3339             : 
    3340         218 :         if (exprtype == JSONOID || exprtype == JSONBOID)
    3341          12 :             format = JS_FORMAT_DEFAULT; /* do not format json[b] types */
    3342             :         else
    3343         206 :             format = ve->format->format_type;
    3344             :     }
    3345        5558 :     else if (isarg)
    3346             :     {
    3347             :         /*
    3348             :          * Special treatment for PASSING arguments.
    3349             :          *
    3350             :          * Pass types supported by GetJsonPathVar() / JsonItemFromDatum()
    3351             :          * directly without converting to json[b].
    3352             :          */
    3353        1200 :         switch (exprtype)
    3354             :         {
    3355         930 :             case BOOLOID:
    3356             :             case NUMERICOID:
    3357             :             case INT2OID:
    3358             :             case INT4OID:
    3359             :             case INT8OID:
    3360             :             case FLOAT4OID:
    3361             :             case FLOAT8OID:
    3362             :             case TEXTOID:
    3363             :             case VARCHAROID:
    3364             :             case DATEOID:
    3365             :             case TIMEOID:
    3366             :             case TIMETZOID:
    3367             :             case TIMESTAMPOID:
    3368             :             case TIMESTAMPTZOID:
    3369         930 :                 return expr;
    3370             : 
    3371         270 :             default:
    3372         270 :                 if (typcategory == TYPCATEGORY_STRING)
    3373           0 :                     return expr;
    3374             :                 /* else convert argument to json[b] type */
    3375         270 :                 break;
    3376             :         }
    3377             : 
    3378         270 :         format = default_format;
    3379             :     }
    3380        4358 :     else if (exprtype == JSONOID || exprtype == JSONBOID)
    3381        3024 :         format = JS_FORMAT_DEFAULT; /* do not format json[b] types */
    3382             :     else
    3383        1334 :         format = default_format;
    3384             : 
    3385        4846 :     if (format != JS_FORMAT_DEFAULT ||
    3386        3026 :         (OidIsValid(targettype) && exprtype != targettype))
    3387             :     {
    3388             :         Node       *coerced;
    3389         808 :         bool        only_allow_cast = OidIsValid(targettype);
    3390             : 
    3391             :         /*
    3392             :          * PASSING args are handled appropriately by GetJsonPathVar() /
    3393             :          * JsonItemFromDatum().
    3394             :          */
    3395         808 :         if (!isarg &&
    3396         538 :             !only_allow_cast &&
    3397         200 :             exprtype != BYTEAOID && typcategory != TYPCATEGORY_STRING)
    3398           6 :             ereport(ERROR,
    3399             :                     errcode(ERRCODE_DATATYPE_MISMATCH),
    3400             :                     ve->format->format_type == JS_FORMAT_DEFAULT ?
    3401             :                     errmsg("cannot use non-string types with implicit FORMAT JSON clause") :
    3402             :                     errmsg("cannot use non-string types with explicit FORMAT JSON clause"),
    3403             :                     parser_errposition(pstate, ve->format->location >= 0 ?
    3404             :                                        ve->format->location : location));
    3405             : 
    3406             :         /* Convert encoded JSON text from bytea. */
    3407         802 :         if (format == JS_FORMAT_JSON && exprtype == BYTEAOID)
    3408             :         {
    3409          72 :             expr = makeJsonByteaToTextConversion(expr, ve->format, location);
    3410          72 :             exprtype = TEXTOID;
    3411             :         }
    3412             : 
    3413         802 :         if (!OidIsValid(targettype))
    3414         518 :             targettype = format == JS_FORMAT_JSONB ? JSONBOID : JSONOID;
    3415             : 
    3416             :         /* Try to coerce to the target type. */
    3417         802 :         coerced = coerce_to_target_type(pstate, expr, exprtype,
    3418             :                                         targettype, -1,
    3419             :                                         COERCION_EXPLICIT,
    3420             :                                         COERCE_EXPLICIT_CAST,
    3421             :                                         location);
    3422             : 
    3423         802 :         if (!coerced)
    3424             :         {
    3425             :             /* If coercion failed, use to_json()/to_jsonb() functions. */
    3426             :             FuncExpr   *fexpr;
    3427             :             Oid         fnoid;
    3428             : 
    3429             :             /*
    3430             :              * Though only allow a cast when the target type is specified by
    3431             :              * the caller.
    3432             :              */
    3433          30 :             if (only_allow_cast)
    3434           6 :                 ereport(ERROR,
    3435             :                         (errcode(ERRCODE_CANNOT_COERCE),
    3436             :                          errmsg("cannot cast type %s to %s",
    3437             :                                 format_type_be(exprtype),
    3438             :                                 format_type_be(targettype)),
    3439             :                          parser_errposition(pstate, location)));
    3440             : 
    3441          24 :             fnoid = targettype == JSONOID ? F_TO_JSON : F_TO_JSONB;
    3442          24 :             fexpr = makeFuncExpr(fnoid, targettype, list_make1(expr),
    3443             :                                  InvalidOid, InvalidOid, COERCE_EXPLICIT_CALL);
    3444             : 
    3445          24 :             fexpr->location = location;
    3446             : 
    3447          24 :             coerced = (Node *) fexpr;
    3448             :         }
    3449             : 
    3450         796 :         if (coerced == expr)
    3451           0 :             expr = rawexpr;
    3452             :         else
    3453             :         {
    3454         796 :             ve = copyObject(ve);
    3455         796 :             ve->raw_expr = (Expr *) rawexpr;
    3456         796 :             ve->formatted_expr = (Expr *) coerced;
    3457             : 
    3458         796 :             expr = (Node *) ve;
    3459             :         }
    3460             :     }
    3461             : 
    3462             :     /* If returning a JsonValueExpr, formatted_expr must have been set. */
    3463             :     Assert(!IsA(expr, JsonValueExpr) ||
    3464             :            ((JsonValueExpr *) expr)->formatted_expr != NULL);
    3465             : 
    3466        4834 :     return expr;
    3467             : }
    3468             : 
    3469             : /*
    3470             :  * Checks specified output format for its applicability to the target type.
    3471             :  */
    3472             : static void
    3473         248 : checkJsonOutputFormat(ParseState *pstate, const JsonFormat *format,
    3474             :                       Oid targettype, bool allow_format_for_non_strings)
    3475             : {
    3476         248 :     if (!allow_format_for_non_strings &&
    3477         144 :         format->format_type != JS_FORMAT_DEFAULT &&
    3478         126 :         (targettype != BYTEAOID &&
    3479         120 :          targettype != JSONOID &&
    3480             :          targettype != JSONBOID))
    3481             :     {
    3482             :         char        typcategory;
    3483             :         bool        typispreferred;
    3484             : 
    3485          90 :         get_type_category_preferred(targettype, &typcategory, &typispreferred);
    3486             : 
    3487          90 :         if (typcategory != TYPCATEGORY_STRING)
    3488           0 :             ereport(ERROR,
    3489             :                     errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
    3490             :                     parser_errposition(pstate, format->location),
    3491             :                     errmsg("cannot use JSON format with non-string output types"));
    3492             :     }
    3493             : 
    3494         248 :     if (format->format_type == JS_FORMAT_JSON)
    3495             :     {
    3496         496 :         JsonEncoding enc = format->encoding != JS_ENC_DEFAULT ?
    3497         248 :             format->encoding : JS_ENC_UTF8;
    3498             : 
    3499         248 :         if (targettype != BYTEAOID &&
    3500         182 :             format->encoding != JS_ENC_DEFAULT)
    3501          12 :             ereport(ERROR,
    3502             :                     errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
    3503             :                     parser_errposition(pstate, format->location),
    3504             :                     errmsg("cannot set JSON encoding for non-bytea output types"));
    3505             : 
    3506         236 :         if (enc != JS_ENC_UTF8)
    3507          24 :             ereport(ERROR,
    3508             :                     errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
    3509             :                     errmsg("unsupported JSON encoding"),
    3510             :                     errhint("Only UTF8 JSON encoding is supported."),
    3511             :                     parser_errposition(pstate, format->location));
    3512             :     }
    3513         212 : }
    3514             : 
    3515             : /*
    3516             :  * Transform JSON output clause.
    3517             :  *
    3518             :  * Assigns target type oid and modifier.
    3519             :  * Assigns default format or checks specified format for its applicability to
    3520             :  * the target type.
    3521             :  */
    3522             : static JsonReturning *
    3523        4156 : transformJsonOutput(ParseState *pstate, const JsonOutput *output,
    3524             :                     bool allow_format)
    3525             : {
    3526             :     JsonReturning *ret;
    3527             : 
    3528             :     /* if output clause is not specified, make default clause value */
    3529        4156 :     if (!output)
    3530             :     {
    3531        1804 :         ret = makeNode(JsonReturning);
    3532             : 
    3533        1804 :         ret->format = makeJsonFormat(JS_FORMAT_DEFAULT, JS_ENC_DEFAULT, -1);
    3534        1804 :         ret->typid = InvalidOid;
    3535        1804 :         ret->typmod = -1;
    3536             : 
    3537        1804 :         return ret;
    3538             :     }
    3539             : 
    3540        2352 :     ret = copyObject(output->returning);
    3541             : 
    3542        2352 :     typenameTypeIdAndMod(pstate, output->typeName, &ret->typid, &ret->typmod);
    3543             : 
    3544        2352 :     if (output->typeName->setof)
    3545           0 :         ereport(ERROR,
    3546             :                 errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
    3547             :                 errmsg("returning SETOF types is not supported in SQL/JSON functions"));
    3548             : 
    3549        2352 :     if (get_typtype(ret->typid) == TYPTYPE_PSEUDO)
    3550          12 :         ereport(ERROR,
    3551             :                 errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
    3552             :                 errmsg("returning pseudo-types is not supported in SQL/JSON functions"));
    3553             : 
    3554        2340 :     if (ret->format->format_type == JS_FORMAT_DEFAULT)
    3555             :         /* assign JSONB format when returning jsonb, or JSON format otherwise */
    3556        2092 :         ret->format->format_type =
    3557        2092 :             ret->typid == JSONBOID ? JS_FORMAT_JSONB : JS_FORMAT_JSON;
    3558             :     else
    3559         248 :         checkJsonOutputFormat(pstate, ret->format, ret->typid, allow_format);
    3560             : 
    3561        2304 :     return ret;
    3562             : }
    3563             : 
    3564             : /*
    3565             :  * Transform JSON output clause of JSON constructor functions.
    3566             :  *
    3567             :  * Derive RETURNING type, if not specified, from argument types.
    3568             :  */
    3569             : static JsonReturning *
    3570        1024 : transformJsonConstructorOutput(ParseState *pstate, JsonOutput *output,
    3571             :                                List *args)
    3572             : {
    3573        1024 :     JsonReturning *returning = transformJsonOutput(pstate, output, true);
    3574             : 
    3575         988 :     if (!OidIsValid(returning->typid))
    3576             :     {
    3577             :         ListCell   *lc;
    3578         500 :         bool        have_jsonb = false;
    3579             : 
    3580        1680 :         foreach(lc, args)
    3581             :         {
    3582        1210 :             Node       *expr = lfirst(lc);
    3583        1210 :             Oid         typid = exprType(expr);
    3584             : 
    3585        1210 :             have_jsonb |= typid == JSONBOID;
    3586             : 
    3587        1210 :             if (have_jsonb)
    3588          30 :                 break;
    3589             :         }
    3590             : 
    3591         500 :         if (have_jsonb)
    3592             :         {
    3593          30 :             returning->typid = JSONBOID;
    3594          30 :             returning->format->format_type = JS_FORMAT_JSONB;
    3595             :         }
    3596             :         else
    3597             :         {
    3598             :             /* XXX TEXT is default by the standard, but we return JSON */
    3599         470 :             returning->typid = JSONOID;
    3600         470 :             returning->format->format_type = JS_FORMAT_JSON;
    3601             :         }
    3602             : 
    3603         500 :         returning->typmod = -1;
    3604             :     }
    3605             : 
    3606         988 :     return returning;
    3607             : }
    3608             : 
    3609             : /*
    3610             :  * Coerce json[b]-valued function expression to the output type.
    3611             :  */
    3612             : static Node *
    3613        1336 : coerceJsonFuncExpr(ParseState *pstate, Node *expr,
    3614             :                    const JsonReturning *returning, bool report_error)
    3615             : {
    3616             :     Node       *res;
    3617             :     int         location;
    3618        1336 :     Oid         exprtype = exprType(expr);
    3619             : 
    3620             :     /* if output type is not specified or equals to function type, return */
    3621        1336 :     if (!OidIsValid(returning->typid) || returning->typid == exprtype)
    3622        1010 :         return expr;
    3623             : 
    3624         326 :     location = exprLocation(expr);
    3625             : 
    3626         326 :     if (location < 0)
    3627         326 :         location = returning->format->location;
    3628             : 
    3629             :     /* special case for RETURNING bytea FORMAT json */
    3630         326 :     if (returning->format->format_type == JS_FORMAT_JSON &&
    3631         326 :         returning->typid == BYTEAOID)
    3632             :     {
    3633             :         /* encode json text into bytea using pg_convert_to() */
    3634          60 :         Node       *texpr = coerce_to_specific_type(pstate, expr, TEXTOID,
    3635             :                                                     "JSON_FUNCTION");
    3636          60 :         Const      *enc = getJsonEncodingConst(returning->format);
    3637          60 :         FuncExpr   *fexpr = makeFuncExpr(F_CONVERT_TO, BYTEAOID,
    3638          60 :                                          list_make2(texpr, enc),
    3639             :                                          InvalidOid, InvalidOid,
    3640             :                                          COERCE_EXPLICIT_CALL);
    3641             : 
    3642          60 :         fexpr->location = location;
    3643             : 
    3644          60 :         return (Node *) fexpr;
    3645             :     }
    3646             : 
    3647             :     /*
    3648             :      * For other cases, try to coerce expression to the output type using
    3649             :      * assignment-level casts, erroring out if none available.  This basically
    3650             :      * allows coercing the jsonb value to any string type (typcategory = 'S').
    3651             :      *
    3652             :      * Requesting assignment-level here means that typmod / length coercion
    3653             :      * assumes implicit coercion which is the behavior we want; see
    3654             :      * build_coercion_expression().
    3655             :      */
    3656         266 :     res = coerce_to_target_type(pstate, expr, exprtype,
    3657         266 :                                 returning->typid, returning->typmod,
    3658             :                                 COERCION_ASSIGNMENT,
    3659             :                                 COERCE_IMPLICIT_CAST,
    3660             :                                 location);
    3661             : 
    3662         266 :     if (!res && report_error)
    3663           0 :         ereport(ERROR,
    3664             :                 errcode(ERRCODE_CANNOT_COERCE),
    3665             :                 errmsg("cannot cast type %s to %s",
    3666             :                        format_type_be(exprtype),
    3667             :                        format_type_be(returning->typid)),
    3668             :                 parser_coercion_errposition(pstate, location, expr));
    3669             : 
    3670         266 :     return res;
    3671             : }
    3672             : 
    3673             : /*
    3674             :  * Make a JsonConstructorExpr node.
    3675             :  */
    3676             : static Node *
    3677        1336 : makeJsonConstructorExpr(ParseState *pstate, JsonConstructorType type,
    3678             :                         List *args, Expr *fexpr, JsonReturning *returning,
    3679             :                         bool unique, bool absent_on_null, int location)
    3680             : {
    3681        1336 :     JsonConstructorExpr *jsctor = makeNode(JsonConstructorExpr);
    3682             :     Node       *placeholder;
    3683             :     Node       *coercion;
    3684             : 
    3685        1336 :     jsctor->args = args;
    3686        1336 :     jsctor->func = fexpr;
    3687        1336 :     jsctor->type = type;
    3688        1336 :     jsctor->returning = returning;
    3689        1336 :     jsctor->unique = unique;
    3690        1336 :     jsctor->absent_on_null = absent_on_null;
    3691        1336 :     jsctor->location = location;
    3692             : 
    3693             :     /*
    3694             :      * Coerce to the RETURNING type and format, if needed.  We abuse
    3695             :      * CaseTestExpr here as placeholder to pass the result of either
    3696             :      * evaluating 'fexpr' or whatever is produced by ExecEvalJsonConstructor()
    3697             :      * that is of type JSON or JSONB to the coercion function.
    3698             :      */
    3699        1336 :     if (fexpr)
    3700             :     {
    3701         402 :         CaseTestExpr *cte = makeNode(CaseTestExpr);
    3702             : 
    3703         402 :         cte->typeId = exprType((Node *) fexpr);
    3704         402 :         cte->typeMod = exprTypmod((Node *) fexpr);
    3705         402 :         cte->collation = exprCollation((Node *) fexpr);
    3706             : 
    3707         402 :         placeholder = (Node *) cte;
    3708             :     }
    3709             :     else
    3710             :     {
    3711         934 :         CaseTestExpr *cte = makeNode(CaseTestExpr);
    3712             : 
    3713        1868 :         cte->typeId = returning->format->format_type == JS_FORMAT_JSONB ?
    3714         934 :             JSONBOID : JSONOID;
    3715         934 :         cte->typeMod = -1;
    3716         934 :         cte->collation = InvalidOid;
    3717             : 
    3718         934 :         placeholder = (Node *) cte;
    3719             :     }
    3720             : 
    3721        1336 :     coercion = coerceJsonFuncExpr(pstate, placeholder, returning, true);
    3722             : 
    3723        1336 :     if (coercion != placeholder)
    3724         326 :         jsctor->coercion = (Expr *) coercion;
    3725             : 
    3726        1336 :     return (Node *) jsctor;
    3727             : }
    3728             : 
    3729             : /*
    3730             :  * Transform JSON_OBJECT() constructor.
    3731             :  *
    3732             :  * JSON_OBJECT() is transformed into a JsonConstructorExpr node of type
    3733             :  * JSCTOR_JSON_OBJECT.  The result is coerced to the target type given
    3734             :  * by ctor->output.
    3735             :  */
    3736             : static Node *
    3737         440 : transformJsonObjectConstructor(ParseState *pstate, JsonObjectConstructor *ctor)
    3738             : {
    3739             :     JsonReturning *returning;
    3740         440 :     List       *args = NIL;
    3741             : 
    3742             :     /* transform key-value pairs, if any */
    3743         440 :     if (ctor->exprs)
    3744             :     {
    3745             :         ListCell   *lc;
    3746             : 
    3747             :         /* transform and append key-value arguments */
    3748         928 :         foreach(lc, ctor->exprs)
    3749             :         {
    3750         604 :             JsonKeyValue *kv = castNode(JsonKeyValue, lfirst(lc));
    3751         604 :             Node       *key = transformExprRecurse(pstate, (Node *) kv->key);
    3752         604 :             Node       *val = transformJsonValueExpr(pstate, "JSON_OBJECT()",
    3753             :                                                      kv->value,
    3754             :                                                      JS_FORMAT_DEFAULT,
    3755             :                                                      InvalidOid, false);
    3756             : 
    3757         580 :             args = lappend(args, key);
    3758         580 :             args = lappend(args, val);
    3759             :         }
    3760             :     }
    3761             : 
    3762         416 :     returning = transformJsonConstructorOutput(pstate, ctor->output, args);
    3763             : 
    3764         796 :     return makeJsonConstructorExpr(pstate, JSCTOR_JSON_OBJECT, args, NULL,
    3765         398 :                                    returning, ctor->unique,
    3766         398 :                                    ctor->absent_on_null, ctor->location);
    3767             : }
    3768             : 
    3769             : /*
    3770             :  * Transform JSON_ARRAY(query [FORMAT] [RETURNING] [ON NULL]) into
    3771             :  *  (SELECT  JSON_ARRAYAGG(a  [FORMAT] [RETURNING] [ON NULL]) FROM (query) q(a))
    3772             :  */
    3773             : static Node *
    3774          60 : transformJsonArrayQueryConstructor(ParseState *pstate,
    3775             :                                    JsonArrayQueryConstructor *ctor)
    3776             : {
    3777          60 :     SubLink    *sublink = makeNode(SubLink);
    3778          60 :     SelectStmt *select = makeNode(SelectStmt);
    3779          60 :     RangeSubselect *range = makeNode(RangeSubselect);
    3780          60 :     Alias      *alias = makeNode(Alias);
    3781          60 :     ResTarget  *target = makeNode(ResTarget);
    3782          60 :     JsonArrayAgg *agg = makeNode(JsonArrayAgg);
    3783          60 :     ColumnRef  *colref = makeNode(ColumnRef);
    3784             :     Query      *query;
    3785             :     ParseState *qpstate;
    3786             : 
    3787             :     /* Transform query only for counting target list entries. */
    3788          60 :     qpstate = make_parsestate(pstate);
    3789             : 
    3790          60 :     query = transformStmt(qpstate, copyObject(ctor->query));
    3791             : 
    3792          60 :     if (count_nonjunk_tlist_entries(query->targetList) != 1)
    3793          18 :         ereport(ERROR,
    3794             :                 errcode(ERRCODE_SYNTAX_ERROR),
    3795             :                 errmsg("subquery must return only one column"),
    3796             :                 parser_errposition(pstate, ctor->location));
    3797             : 
    3798          42 :     free_parsestate(qpstate);
    3799             : 
    3800          42 :     colref->fields = list_make2(makeString(pstrdup("q")),
    3801             :                                 makeString(pstrdup("a")));
    3802          42 :     colref->location = ctor->location;
    3803             : 
    3804             :     /*
    3805             :      * No formatting necessary, so set formatted_expr to be the same as
    3806             :      * raw_expr.
    3807             :      */
    3808          42 :     agg->arg = makeJsonValueExpr((Expr *) colref, (Expr *) colref,
    3809             :                                  ctor->format);
    3810          42 :     agg->absent_on_null = ctor->absent_on_null;
    3811          42 :     agg->constructor = makeNode(JsonAggConstructor);
    3812          42 :     agg->constructor->agg_order = NIL;
    3813          42 :     agg->constructor->output = ctor->output;
    3814          42 :     agg->constructor->location = ctor->location;
    3815             : 
    3816          42 :     target->name = NULL;
    3817          42 :     target->indirection = NIL;
    3818          42 :     target->val = (Node *) agg;
    3819          42 :     target->location = ctor->location;
    3820             : 
    3821          42 :     alias->aliasname = pstrdup("q");
    3822          42 :     alias->colnames = list_make1(makeString(pstrdup("a")));
    3823             : 
    3824          42 :     range->lateral = false;
    3825          42 :     range->subquery = ctor->query;
    3826          42 :     range->alias = alias;
    3827             : 
    3828          42 :     select->targetList = list_make1(target);
    3829          42 :     select->fromClause = list_make1(range);
    3830             : 
    3831          42 :     sublink->subLinkType = EXPR_SUBLINK;
    3832          42 :     sublink->subLinkId = 0;
    3833          42 :     sublink->testexpr = NULL;
    3834          42 :     sublink->operName = NIL;
    3835          42 :     sublink->subselect = (Node *) select;
    3836          42 :     sublink->location = ctor->location;
    3837             : 
    3838          42 :     return transformExprRecurse(pstate, (Node *) sublink);
    3839             : }
    3840             : 
    3841             : /*
    3842             :  * Common code for JSON_OBJECTAGG and JSON_ARRAYAGG transformation.
    3843             :  */
    3844             : static Node *
    3845         402 : transformJsonAggConstructor(ParseState *pstate, JsonAggConstructor *agg_ctor,
    3846             :                             JsonReturning *returning, List *args,
    3847             :                             Oid aggfnoid, Oid aggtype,
    3848             :                             JsonConstructorType ctor_type,
    3849             :                             bool unique, bool absent_on_null)
    3850             : {
    3851             :     Node       *node;
    3852             :     Expr       *aggfilter;
    3853             : 
    3854         804 :     aggfilter = agg_ctor->agg_filter ? (Expr *)
    3855          42 :         transformWhereClause(pstate, agg_ctor->agg_filter,
    3856         402 :                              EXPR_KIND_FILTER, "FILTER") : NULL;
    3857             : 
    3858         402 :     if (agg_ctor->over)
    3859             :     {
    3860             :         /* window function */
    3861          48 :         WindowFunc *wfunc = makeNode(WindowFunc);
    3862             : 
    3863          48 :         wfunc->winfnoid = aggfnoid;
    3864          48 :         wfunc->wintype = aggtype;
    3865             :         /* wincollid and inputcollid will be set by parse_collate.c */
    3866          48 :         wfunc->args = args;
    3867          48 :         wfunc->aggfilter = aggfilter;
    3868          48 :         wfunc->runCondition = NIL;
    3869             :         /* winref will be set by transformWindowFuncCall */
    3870          48 :         wfunc->winstar = false;
    3871          48 :         wfunc->winagg = true;
    3872          48 :         wfunc->location = agg_ctor->location;
    3873             : 
    3874             :         /*
    3875             :          * ordered aggs not allowed in windows yet
    3876             :          */
    3877          48 :         if (agg_ctor->agg_order != NIL)
    3878           0 :             ereport(ERROR,
    3879             :                     errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
    3880             :                     errmsg("aggregate ORDER BY is not implemented for window functions"),
    3881             :                     parser_errposition(pstate, agg_ctor->location));
    3882             : 
    3883             :         /* parse_agg.c does additional window-func-specific processing */
    3884          48 :         transformWindowFuncCall(pstate, wfunc, agg_ctor->over);
    3885             : 
    3886          48 :         node = (Node *) wfunc;
    3887             :     }
    3888             :     else
    3889             :     {
    3890         354 :         Aggref     *aggref = makeNode(Aggref);
    3891             : 
    3892         354 :         aggref->aggfnoid = aggfnoid;
    3893         354 :         aggref->aggtype = aggtype;
    3894             : 
    3895             :         /* aggcollid and inputcollid will be set by parse_collate.c */
    3896             :         /* aggtranstype will be set by planner */
    3897             :         /* aggargtypes will be set by transformAggregateCall */
    3898             :         /* aggdirectargs and args will be set by transformAggregateCall */
    3899             :         /* aggorder and aggdistinct will be set by transformAggregateCall */
    3900         354 :         aggref->aggfilter = aggfilter;
    3901         354 :         aggref->aggstar = false;
    3902         354 :         aggref->aggvariadic = false;
    3903         354 :         aggref->aggkind = AGGKIND_NORMAL;
    3904         354 :         aggref->aggpresorted = false;
    3905             :         /* agglevelsup will be set by transformAggregateCall */
    3906         354 :         aggref->aggsplit = AGGSPLIT_SIMPLE; /* planner might change this */
    3907         354 :         aggref->aggno = -1;      /* planner will set aggno and aggtransno */
    3908         354 :         aggref->aggtransno = -1;
    3909         354 :         aggref->location = agg_ctor->location;
    3910             : 
    3911         354 :         transformAggregateCall(pstate, aggref, args, agg_ctor->agg_order, false);
    3912             : 
    3913         354 :         node = (Node *) aggref;
    3914             :     }
    3915             : 
    3916         402 :     return makeJsonConstructorExpr(pstate, ctor_type, NIL, (Expr *) node,
    3917             :                                    returning, unique, absent_on_null,
    3918             :                                    agg_ctor->location);
    3919             : }
    3920             : 
    3921             : /*
    3922             :  * Transform JSON_OBJECTAGG() aggregate function.
    3923             :  *
    3924             :  * JSON_OBJECTAGG() is transformed into a JsonConstructorExpr node of type
    3925             :  * JSCTOR_JSON_OBJECTAGG, which at runtime becomes a
    3926             :  * json[b]_object_agg[_unique][_strict](agg->arg->key, agg->arg->value) call
    3927             :  * depending on the output JSON format.  The result is coerced to the target
    3928             :  * type given by agg->constructor->output.
    3929             :  */
    3930             : static Node *
    3931         204 : transformJsonObjectAgg(ParseState *pstate, JsonObjectAgg *agg)
    3932             : {
    3933             :     JsonReturning *returning;
    3934             :     Node       *key;
    3935             :     Node       *val;
    3936             :     List       *args;
    3937             :     Oid         aggfnoid;
    3938             :     Oid         aggtype;
    3939             : 
    3940         204 :     key = transformExprRecurse(pstate, (Node *) agg->arg->key);
    3941         204 :     val = transformJsonValueExpr(pstate, "JSON_OBJECTAGG()",
    3942         204 :                                  agg->arg->value,
    3943             :                                  JS_FORMAT_DEFAULT,
    3944             :                                  InvalidOid, false);
    3945         204 :     args = list_make2(key, val);
    3946             : 
    3947         204 :     returning = transformJsonConstructorOutput(pstate, agg->constructor->output,
    3948             :                                                args);
    3949             : 
    3950         204 :     if (returning->format->format_type == JS_FORMAT_JSONB)
    3951             :     {
    3952          54 :         if (agg->absent_on_null)
    3953          18 :             if (agg->unique)
    3954          12 :                 aggfnoid = F_JSONB_OBJECT_AGG_UNIQUE_STRICT;
    3955             :             else
    3956           6 :                 aggfnoid = F_JSONB_OBJECT_AGG_STRICT;
    3957          36 :         else if (agg->unique)
    3958           6 :             aggfnoid = F_JSONB_OBJECT_AGG_UNIQUE;
    3959             :         else
    3960          30 :             aggfnoid = F_JSONB_OBJECT_AGG;
    3961             : 
    3962          54 :         aggtype = JSONBOID;
    3963             :     }
    3964             :     else
    3965             :     {
    3966         150 :         if (agg->absent_on_null)
    3967          36 :             if (agg->unique)
    3968          18 :                 aggfnoid = F_JSON_OBJECT_AGG_UNIQUE_STRICT;
    3969             :             else
    3970          18 :                 aggfnoid = F_JSON_OBJECT_AGG_STRICT;
    3971         114 :         else if (agg->unique)
    3972          48 :             aggfnoid = F_JSON_OBJECT_AGG_UNIQUE;
    3973             :         else
    3974          66 :             aggfnoid = F_JSON_OBJECT_AGG;
    3975             : 
    3976         150 :         aggtype = JSONOID;
    3977             :     }
    3978             : 
    3979         408 :     return transformJsonAggConstructor(pstate, agg->constructor, returning,
    3980             :                                        args, aggfnoid, aggtype,
    3981             :                                        JSCTOR_JSON_OBJECTAGG,
    3982         204 :                                        agg->unique, agg->absent_on_null);
    3983             : }
    3984             : 
    3985             : /*
    3986             :  * Transform JSON_ARRAYAGG() aggregate function.
    3987             :  *
    3988             :  * JSON_ARRAYAGG() is transformed into a JsonConstructorExpr node of type
    3989             :  * JSCTOR_JSON_ARRAYAGG, which at runtime becomes a
    3990             :  * json[b]_object_agg[_unique][_strict](agg->arg) call depending on the output
    3991             :  * JSON format.  The result is coerced to the target type given by
    3992             :  * agg->constructor->output.
    3993             :  */
    3994             : static Node *
    3995         198 : transformJsonArrayAgg(ParseState *pstate, JsonArrayAgg *agg)
    3996             : {
    3997             :     JsonReturning *returning;
    3998             :     Node       *arg;
    3999             :     Oid         aggfnoid;
    4000             :     Oid         aggtype;
    4001             : 
    4002         198 :     arg = transformJsonValueExpr(pstate, "JSON_ARRAYAGG()", agg->arg,
    4003             :                                  JS_FORMAT_DEFAULT, InvalidOid, false);
    4004             : 
    4005         198 :     returning = transformJsonConstructorOutput(pstate, agg->constructor->output,
    4006         198 :                                                list_make1(arg));
    4007             : 
    4008         198 :     if (returning->format->format_type == JS_FORMAT_JSONB)
    4009             :     {
    4010          72 :         aggfnoid = agg->absent_on_null ? F_JSONB_AGG_STRICT : F_JSONB_AGG;
    4011          72 :         aggtype = JSONBOID;
    4012             :     }
    4013             :     else
    4014             :     {
    4015         126 :         aggfnoid = agg->absent_on_null ? F_JSON_AGG_STRICT : F_JSON_AGG;
    4016         126 :         aggtype = JSONOID;
    4017             :     }
    4018             : 
    4019         198 :     return transformJsonAggConstructor(pstate, agg->constructor, returning,
    4020         198 :                                        list_make1(arg), aggfnoid, aggtype,
    4021             :                                        JSCTOR_JSON_ARRAYAGG,
    4022         198 :                                        false, agg->absent_on_null);
    4023             : }
    4024             : 
    4025             : /*
    4026             :  * Transform JSON_ARRAY() constructor.
    4027             :  *
    4028             :  * JSON_ARRAY() is transformed into a JsonConstructorExpr node of type
    4029             :  * JSCTOR_JSON_ARRAY.  The result is coerced to the target type given
    4030             :  * by ctor->output.
    4031             :  */
    4032             : static Node *
    4033         206 : transformJsonArrayConstructor(ParseState *pstate, JsonArrayConstructor *ctor)
    4034             : {
    4035             :     JsonReturning *returning;
    4036         206 :     List       *args = NIL;
    4037             : 
    4038             :     /* transform element expressions, if any */
    4039         206 :     if (ctor->exprs)
    4040             :     {
    4041             :         ListCell   *lc;
    4042             : 
    4043             :         /* transform and append element arguments */
    4044         378 :         foreach(lc, ctor->exprs)
    4045             :         {
    4046         258 :             JsonValueExpr *jsval = castNode(JsonValueExpr, lfirst(lc));
    4047         258 :             Node       *val = transformJsonValueExpr(pstate, "JSON_ARRAY()",
    4048             :                                                      jsval, JS_FORMAT_DEFAULT,
    4049             :                                                      InvalidOid, false);
    4050             : 
    4051         258 :             args = lappend(args, val);
    4052             :         }
    4053             :     }
    4054             : 
    4055         206 :     returning = transformJsonConstructorOutput(pstate, ctor->output, args);
    4056             : 
    4057         376 :     return makeJsonConstructorExpr(pstate, JSCTOR_JSON_ARRAY, args, NULL,
    4058         188 :                                    returning, false, ctor->absent_on_null,
    4059             :                                    ctor->location);
    4060             : }
    4061             : 
    4062             : static Node *
    4063         376 : transformJsonParseArg(ParseState *pstate, Node *jsexpr, JsonFormat *format,
    4064             :                       Oid *exprtype)
    4065             : {
    4066         376 :     Node       *raw_expr = transformExprRecurse(pstate, jsexpr);
    4067         376 :     Node       *expr = raw_expr;
    4068             : 
    4069         376 :     *exprtype = exprType(expr);
    4070             : 
    4071             :     /* prepare input document */
    4072         376 :     if (*exprtype == BYTEAOID)
    4073             :     {
    4074             :         JsonValueExpr *jve;
    4075             : 
    4076          60 :         expr = raw_expr;
    4077          60 :         expr = makeJsonByteaToTextConversion(expr, format, exprLocation(expr));
    4078          60 :         *exprtype = TEXTOID;
    4079             : 
    4080          60 :         jve = makeJsonValueExpr((Expr *) raw_expr, (Expr *) expr, format);
    4081          60 :         expr = (Node *) jve;
    4082             :     }
    4083             :     else
    4084             :     {
    4085             :         char        typcategory;
    4086             :         bool        typispreferred;
    4087             : 
    4088         316 :         get_type_category_preferred(*exprtype, &typcategory, &typispreferred);
    4089             : 
    4090         316 :         if (*exprtype == UNKNOWNOID || typcategory == TYPCATEGORY_STRING)
    4091             :         {
    4092         192 :             expr = coerce_to_target_type(pstate, expr, *exprtype,
    4093             :                                          TEXTOID, -1,
    4094             :                                          COERCION_IMPLICIT,
    4095             :                                          COERCE_IMPLICIT_CAST, -1);
    4096         192 :             *exprtype = TEXTOID;
    4097             :         }
    4098             : 
    4099         316 :         if (format->encoding != JS_ENC_DEFAULT)
    4100           0 :             ereport(ERROR,
    4101             :                     (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
    4102             :                      parser_errposition(pstate, format->location),
    4103             :                      errmsg("cannot use JSON FORMAT ENCODING clause for non-bytea input types")));
    4104             :     }
    4105             : 
    4106         376 :     return expr;
    4107             : }
    4108             : 
    4109             : /*
    4110             :  * Transform IS JSON predicate.
    4111             :  */
    4112             : static Node *
    4113         350 : transformJsonIsPredicate(ParseState *pstate, JsonIsPredicate *pred)
    4114             : {
    4115             :     Oid         exprtype;
    4116         350 :     Node       *expr = transformJsonParseArg(pstate, pred->expr, pred->format,
    4117             :                                              &exprtype);
    4118             : 
    4119             :     /* make resulting expression */
    4120         350 :     if (exprtype != TEXTOID && exprtype != JSONOID && exprtype != JSONBOID)
    4121           6 :         ereport(ERROR,
    4122             :                 (errcode(ERRCODE_DATATYPE_MISMATCH),
    4123             :                  errmsg("cannot use type %s in IS JSON predicate",
    4124             :                         format_type_be(exprtype))));
    4125             : 
    4126             :     /* This intentionally(?) drops the format clause. */
    4127         688 :     return makeJsonIsPredicate(expr, NULL, pred->item_type,
    4128         344 :                                pred->unique_keys, pred->location);
    4129             : }
    4130             : 
    4131             : /*
    4132             :  * Transform the RETURNING clause of a JSON_*() expression if there is one and
    4133             :  * create one if not.
    4134             :  */
    4135             : static JsonReturning *
    4136         276 : transformJsonReturning(ParseState *pstate, JsonOutput *output, const char *fname)
    4137             : {
    4138             :     JsonReturning *returning;
    4139             : 
    4140         276 :     if (output)
    4141             :     {
    4142           0 :         returning = transformJsonOutput(pstate, output, false);
    4143             : 
    4144             :         Assert(OidIsValid(returning->typid));
    4145             : 
    4146           0 :         if (returning->typid != JSONOID && returning->typid != JSONBOID)
    4147           0 :             ereport(ERROR,
    4148             :                     (errcode(ERRCODE_DATATYPE_MISMATCH),
    4149             :                      errmsg("cannot use type %s in RETURNING clause of %s",
    4150             :                             format_type_be(returning->typid), fname),
    4151             :                      errhint("Try returning json or jsonb."),
    4152             :                      parser_errposition(pstate, output->typeName->location)));
    4153             :     }
    4154             :     else
    4155             :     {
    4156             :         /* Output type is JSON by default. */
    4157         276 :         Oid         targettype = JSONOID;
    4158         276 :         JsonFormatType format = JS_FORMAT_JSON;
    4159             : 
    4160         276 :         returning = makeNode(JsonReturning);
    4161         276 :         returning->format = makeJsonFormat(format, JS_ENC_DEFAULT, -1);
    4162         276 :         returning->typid = targettype;
    4163         276 :         returning->typmod = -1;
    4164             :     }
    4165             : 
    4166         276 :     return returning;
    4167             : }
    4168             : 
    4169             : /*
    4170             :  * Transform a JSON() expression.
    4171             :  *
    4172             :  * JSON() is transformed into a JsonConstructorExpr of type JSCTOR_JSON_PARSE,
    4173             :  * which validates the input expression value as JSON.
    4174             :  */
    4175             : static Node *
    4176         164 : transformJsonParseExpr(ParseState *pstate, JsonParseExpr *jsexpr)
    4177             : {
    4178         164 :     JsonOutput *output = jsexpr->output;
    4179             :     JsonReturning *returning;
    4180             :     Node       *arg;
    4181             : 
    4182         164 :     returning = transformJsonReturning(pstate, output, "JSON()");
    4183             : 
    4184         164 :     if (jsexpr->unique_keys)
    4185             :     {
    4186             :         /*
    4187             :          * Coerce string argument to text and then to json[b] in the executor
    4188             :          * node with key uniqueness check.
    4189             :          */
    4190          26 :         JsonValueExpr *jve = jsexpr->expr;
    4191             :         Oid         arg_type;
    4192             : 
    4193          26 :         arg = transformJsonParseArg(pstate, (Node *) jve->raw_expr, jve->format,
    4194             :                                     &arg_type);
    4195             : 
    4196          26 :         if (arg_type != TEXTOID)
    4197          10 :             ereport(ERROR,
    4198             :                     (errcode(ERRCODE_DATATYPE_MISMATCH),
    4199             :                      errmsg("cannot use non-string types with WITH UNIQUE KEYS clause"),
    4200             :                      parser_errposition(pstate, jsexpr->location)));
    4201             :     }
    4202             :     else
    4203             :     {
    4204             :         /*
    4205             :          * Coerce argument to target type using CAST for compatibility with PG
    4206             :          * function-like CASTs.
    4207             :          */
    4208         138 :         arg = transformJsonValueExpr(pstate, "JSON()", jsexpr->expr,
    4209             :                                      JS_FORMAT_JSON, returning->typid, false);
    4210             :     }
    4211             : 
    4212         138 :     return makeJsonConstructorExpr(pstate, JSCTOR_JSON_PARSE, list_make1(arg), NULL,
    4213         138 :                                    returning, jsexpr->unique_keys, false,
    4214             :                                    jsexpr->location);
    4215             : }
    4216             : 
    4217             : /*
    4218             :  * Transform a JSON_SCALAR() expression.
    4219             :  *
    4220             :  * JSON_SCALAR() is transformed into a JsonConstructorExpr of type
    4221             :  * JSCTOR_JSON_SCALAR, which converts the input SQL scalar value into
    4222             :  * a json[b] value.
    4223             :  */
    4224             : static Node *
    4225         112 : transformJsonScalarExpr(ParseState *pstate, JsonScalarExpr *jsexpr)
    4226             : {
    4227         112 :     Node       *arg = transformExprRecurse(pstate, (Node *) jsexpr->expr);
    4228         112 :     JsonOutput *output = jsexpr->output;
    4229             :     JsonReturning *returning;
    4230             : 
    4231         112 :     returning = transformJsonReturning(pstate, output, "JSON_SCALAR()");
    4232             : 
    4233         112 :     if (exprType(arg) == UNKNOWNOID)
    4234          26 :         arg = coerce_to_specific_type(pstate, arg, TEXTOID, "JSON_SCALAR");
    4235             : 
    4236         112 :     return makeJsonConstructorExpr(pstate, JSCTOR_JSON_SCALAR, list_make1(arg), NULL,
    4237             :                                    returning, false, false, jsexpr->location);
    4238             : }
    4239             : 
    4240             : /*
    4241             :  * Transform a JSON_SERIALIZE() expression.
    4242             :  *
    4243             :  * JSON_SERIALIZE() is transformed into a JsonConstructorExpr of type
    4244             :  * JSCTOR_JSON_SERIALIZE which converts the input JSON value into a character
    4245             :  * or bytea string.
    4246             :  */
    4247             : static Node *
    4248         108 : transformJsonSerializeExpr(ParseState *pstate, JsonSerializeExpr *expr)
    4249             : {
    4250             :     JsonReturning *returning;
    4251         108 :     Node       *arg = transformJsonValueExpr(pstate, "JSON_SERIALIZE()",
    4252             :                                              expr->expr,
    4253             :                                              JS_FORMAT_JSON,
    4254             :                                              InvalidOid, false);
    4255             : 
    4256         108 :     if (expr->output)
    4257             :     {
    4258          50 :         returning = transformJsonOutput(pstate, expr->output, true);
    4259             : 
    4260          50 :         if (returning->typid != BYTEAOID)
    4261             :         {
    4262             :             char        typcategory;
    4263             :             bool        typispreferred;
    4264             : 
    4265          38 :             get_type_category_preferred(returning->typid, &typcategory,
    4266             :                                         &typispreferred);
    4267          38 :             if (typcategory != TYPCATEGORY_STRING)
    4268          10 :                 ereport(ERROR,
    4269             :                         (errcode(ERRCODE_DATATYPE_MISMATCH),
    4270             :                          errmsg("cannot use type %s in RETURNING clause of %s",
    4271             :                                 format_type_be(returning->typid),
    4272             :                                 "JSON_SERIALIZE()"),
    4273             :                          errhint("Try returning a string type or bytea.")));
    4274             :         }
    4275             :     }
    4276             :     else
    4277             :     {
    4278             :         /* RETURNING TEXT FORMAT JSON is by default */
    4279          58 :         returning = makeNode(JsonReturning);
    4280          58 :         returning->format = makeJsonFormat(JS_FORMAT_JSON, JS_ENC_DEFAULT, -1);
    4281          58 :         returning->typid = TEXTOID;
    4282          58 :         returning->typmod = -1;
    4283             :     }
    4284             : 
    4285          98 :     return makeJsonConstructorExpr(pstate, JSCTOR_JSON_SERIALIZE, list_make1(arg),
    4286             :                                    NULL, returning, false, false, expr->location);
    4287             : }
    4288             : 
    4289             : /*
    4290             :  * Transform JSON_VALUE, JSON_QUERY, JSON_EXISTS, JSON_TABLE functions into
    4291             :  * a JsonExpr node.
    4292             :  */
    4293             : static Node *
    4294        3154 : transformJsonFuncExpr(ParseState *pstate, JsonFuncExpr *func)
    4295             : {
    4296             :     JsonExpr   *jsexpr;
    4297             :     Node       *path_spec;
    4298             :     Oid         pathspec_type;
    4299             :     int         pathspec_loc;
    4300             :     Node       *coerced_path_spec;
    4301        3154 :     const char *func_name = NULL;
    4302             :     JsonFormatType default_format;
    4303             : 
    4304        3154 :     switch (func->op)
    4305             :     {
    4306         306 :         case JSON_EXISTS_OP:
    4307         306 :             func_name = "JSON_EXISTS";
    4308         306 :             default_format = JS_FORMAT_DEFAULT;
    4309         306 :             break;
    4310        1272 :         case JSON_QUERY_OP:
    4311        1272 :             func_name = "JSON_QUERY";
    4312        1272 :             default_format = JS_FORMAT_JSONB;
    4313        1272 :             break;
    4314        1100 :         case JSON_VALUE_OP:
    4315        1100 :             func_name = "JSON_VALUE";
    4316        1100 :             default_format = JS_FORMAT_DEFAULT;
    4317        1100 :             break;
    4318         476 :         case JSON_TABLE_OP:
    4319         476 :             func_name = "JSON_TABLE";
    4320         476 :             default_format = JS_FORMAT_JSONB;
    4321         476 :             break;
    4322           0 :         default:
    4323           0 :             elog(ERROR, "invalid JsonFuncExpr op %d", (int) func->op);
    4324             :             default_format = JS_FORMAT_DEFAULT; /* keep compiler quiet */
    4325             :             break;
    4326             :     }
    4327             : 
    4328             :     /*
    4329             :      * Even though the syntax allows it, FORMAT JSON specification in
    4330             :      * RETURNING is meaningless except for JSON_QUERY().  Flag if not
    4331             :      * JSON_QUERY().
    4332             :      */
    4333        3154 :     if (func->output && func->op != JSON_QUERY_OP)
    4334             :     {
    4335        1058 :         JsonFormat *format = func->output->returning->format;
    4336             : 
    4337        1058 :         if (format->format_type != JS_FORMAT_DEFAULT ||
    4338        1052 :             format->encoding != JS_ENC_DEFAULT)
    4339           6 :             ereport(ERROR,
    4340             :                     errcode(ERRCODE_SYNTAX_ERROR),
    4341             :                     errmsg("cannot specify FORMAT JSON in RETURNING clause of %s()",
    4342             :                            func_name),
    4343             :                     parser_errposition(pstate, format->location));
    4344             :     }
    4345             : 
    4346             :     /* OMIT QUOTES is meaningless when strings are wrapped. */
    4347        3148 :     if (func->op == JSON_QUERY_OP)
    4348             :     {
    4349        1272 :         if (func->quotes == JS_QUOTES_OMIT &&
    4350         180 :             (func->wrapper == JSW_CONDITIONAL ||
    4351         174 :              func->wrapper == JSW_UNCONDITIONAL))
    4352          18 :             ereport(ERROR,
    4353             :                     errcode(ERRCODE_SYNTAX_ERROR),
    4354             :                     errmsg("SQL/JSON QUOTES behavior must not be specified when WITH WRAPPER is used"),
    4355             :                     parser_errposition(pstate, func->location));
    4356        1254 :         if (func->on_empty != NULL &&
    4357          96 :             func->on_empty->btype != JSON_BEHAVIOR_ERROR &&
    4358          60 :             func->on_empty->btype != JSON_BEHAVIOR_NULL &&
    4359          54 :             func->on_empty->btype != JSON_BEHAVIOR_EMPTY &&
    4360          54 :             func->on_empty->btype != JSON_BEHAVIOR_EMPTY_ARRAY &&
    4361          30 :             func->on_empty->btype != JSON_BEHAVIOR_EMPTY_OBJECT &&
    4362          24 :             func->on_empty->btype != JSON_BEHAVIOR_DEFAULT)
    4363             :         {
    4364           0 :             if (func->column_name == NULL)
    4365           0 :                 ereport(ERROR,
    4366             :                         errcode(ERRCODE_SYNTAX_ERROR),
    4367             :                 /*- translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) */
    4368             :                         errmsg("invalid %s behavior", "ON EMPTY"),
    4369             :                 /*- translator: first %s is name of a SQL/JSON clause (eg. ON EMPTY),
    4370             :                     second %s is a SQL/JSON function name (e.g. JSON_QUERY) */
    4371             :                         errdetail("Only ERROR, NULL, EMPTY ARRAY, EMPTY OBJECT, or DEFAULT expression is allowed in %s for %s.",
    4372             :                                   "ON EMPTY", "JSON_QUERY()"),
    4373             :                         parser_errposition(pstate, func->on_empty->location));
    4374             :             else
    4375           0 :                 ereport(ERROR,
    4376             :                         errcode(ERRCODE_SYNTAX_ERROR),
    4377             :                 /*- translator: first %s is name of a SQL/JSON clause (eg. ON EMPTY) */
    4378             :                         errmsg("invalid %s behavior for column \"%s\"",
    4379             :                                "ON EMPTY", func->column_name),
    4380             :                 /*- translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) */
    4381             :                         errdetail("Only ERROR, NULL, EMPTY ARRAY, EMPTY OBJECT, or DEFAULT expression is allowed in %s for formatted columns.",
    4382             :                                   "ON EMPTY"),
    4383             :                         parser_errposition(pstate, func->on_empty->location));
    4384             :         }
    4385        1254 :         if (func->on_error != NULL &&
    4386         330 :             func->on_error->btype != JSON_BEHAVIOR_ERROR &&
    4387         156 :             func->on_error->btype != JSON_BEHAVIOR_NULL &&
    4388         150 :             func->on_error->btype != JSON_BEHAVIOR_EMPTY &&
    4389         150 :             func->on_error->btype != JSON_BEHAVIOR_EMPTY_ARRAY &&
    4390         144 :             func->on_error->btype != JSON_BEHAVIOR_EMPTY_OBJECT &&
    4391          90 :             func->on_error->btype != JSON_BEHAVIOR_DEFAULT)
    4392             :         {
    4393          12 :             if (func->column_name == NULL)
    4394           6 :                 ereport(ERROR,
    4395             :                         errcode(ERRCODE_SYNTAX_ERROR),
    4396             :                 /*- translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) */
    4397             :                         errmsg("invalid %s behavior", "ON ERROR"),
    4398             :                 /*- translator: first %s is name of a SQL/JSON clause (eg. ON EMPTY),
    4399             :                     second %s is a SQL/JSON function name (e.g. JSON_QUERY) */
    4400             :                         errdetail("Only ERROR, NULL, EMPTY ARRAY, EMPTY OBJECT, or DEFAULT expression is allowed in %s for %s.",
    4401             :                                   "ON ERROR", "JSON_QUERY()"),
    4402             :                         parser_errposition(pstate, func->on_error->location));
    4403             :             else
    4404           6 :                 ereport(ERROR,
    4405             :                         errcode(ERRCODE_SYNTAX_ERROR),
    4406             :                 /*- translator: first %s is name of a SQL/JSON clause (eg. ON EMPTY) */
    4407             :                         errmsg("invalid %s behavior for column \"%s\"",
    4408             :                                "ON ERROR", func->column_name),
    4409             :                 /*- translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) */
    4410             :                         errdetail("Only ERROR, NULL, EMPTY ARRAY, EMPTY OBJECT, or DEFAULT expression is allowed in %s for formatted columns.",
    4411             :                                   "ON ERROR"),
    4412             :                         parser_errposition(pstate, func->on_error->location));
    4413             :         }
    4414             :     }
    4415             : 
    4416             :     /* Check that ON ERROR/EMPTY behavior values are valid for the function. */
    4417        3118 :     if (func->op == JSON_EXISTS_OP &&
    4418         306 :         func->on_error != NULL &&
    4419          90 :         func->on_error->btype != JSON_BEHAVIOR_ERROR &&
    4420          48 :         func->on_error->btype != JSON_BEHAVIOR_TRUE &&
    4421          36 :         func->on_error->btype != JSON_BEHAVIOR_FALSE &&
    4422          24 :         func->on_error->btype != JSON_BEHAVIOR_UNKNOWN)
    4423             :     {
    4424          12 :         if (func->column_name == NULL)
    4425           6 :             ereport(ERROR,
    4426             :                     errcode(ERRCODE_SYNTAX_ERROR),
    4427             :             /*- translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) */
    4428             :                     errmsg("invalid %s behavior", "ON ERROR"),
    4429             :                     errdetail("Only ERROR, TRUE, FALSE, or UNKNOWN is allowed in %s for %s.",
    4430             :                               "ON ERROR", "JSON_EXISTS()"),
    4431             :                     parser_errposition(pstate, func->on_error->location));
    4432             :         else
    4433           6 :             ereport(ERROR,
    4434             :                     errcode(ERRCODE_SYNTAX_ERROR),
    4435             :             /*- translator: first %s is name a SQL/JSON clause (eg. ON EMPTY) */
    4436             :                     errmsg("invalid %s behavior for column \"%s\"",
    4437             :                            "ON ERROR", func->column_name),
    4438             :             /*- translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) */
    4439             :                     errdetail("Only ERROR, TRUE, FALSE, or UNKNOWN is allowed in %s for EXISTS columns.",
    4440             :                               "ON ERROR"),
    4441             :                     parser_errposition(pstate, func->on_error->location));
    4442             :     }
    4443        3106 :     if (func->op == JSON_VALUE_OP)
    4444             :     {
    4445        1094 :         if (func->on_empty != NULL &&
    4446         222 :             func->on_empty->btype != JSON_BEHAVIOR_ERROR &&
    4447         192 :             func->on_empty->btype != JSON_BEHAVIOR_NULL &&
    4448         186 :             func->on_empty->btype != JSON_BEHAVIOR_DEFAULT)
    4449             :         {
    4450           6 :             if (func->column_name == NULL)
    4451           0 :                 ereport(ERROR,
    4452             :                         errcode(ERRCODE_SYNTAX_ERROR),
    4453             :                 /*- translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) */
    4454             :                         errmsg("invalid %s behavior", "ON EMPTY"),
    4455             :                 /*- translator: first %s is name of a SQL/JSON clause (eg. ON EMPTY),
    4456             :                     second %s is a SQL/JSON function name (e.g. JSON_QUERY) */
    4457             :                         errdetail("Only ERROR, NULL, or DEFAULT expression is allowed in %s for %s.",
    4458             :                                   "ON EMPTY", "JSON_VALUE()"),
    4459             :                         parser_errposition(pstate, func->on_empty->location));
    4460             :             else
    4461           6 :                 ereport(ERROR,
    4462             :                         errcode(ERRCODE_SYNTAX_ERROR),
    4463             :                 /*- translator: first %s is name of a SQL/JSON clause (eg. ON EMPTY) */
    4464             :                         errmsg("invalid %s behavior for column \"%s\"",
    4465             :                                "ON EMPTY", func->column_name),
    4466             :                 /*- translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) */
    4467             :                         errdetail("Only ERROR, NULL, or DEFAULT expression is allowed in %s for scalar columns.",
    4468             :                                   "ON EMPTY"),
    4469             :                         parser_errposition(pstate, func->on_empty->location));
    4470             :         }
    4471        1088 :         if (func->on_error != NULL &&
    4472         324 :             func->on_error->btype != JSON_BEHAVIOR_ERROR &&
    4473         144 :             func->on_error->btype != JSON_BEHAVIOR_NULL &&
    4474         144 :             func->on_error->btype != JSON_BEHAVIOR_DEFAULT)
    4475             :         {
    4476           6 :             if (func->column_name == NULL)
    4477           6 :                 ereport(ERROR,
    4478             :                         errcode(ERRCODE_SYNTAX_ERROR),
    4479             :                 /*- translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) */
    4480             :                         errmsg("invalid %s behavior", "ON ERROR"),
    4481             :                 /*- translator: first %s is name of a SQL/JSON clause (eg. ON EMPTY),
    4482             :                     second %s is a SQL/JSON function name (e.g. JSON_QUERY) */
    4483             :                         errdetail("Only ERROR, NULL, or DEFAULT expression is allowed in %s for %s.",
    4484             :                                   "ON ERROR", "JSON_VALUE()"),
    4485             :                         parser_errposition(pstate, func->on_error->location));
    4486             :             else
    4487           0 :                 ereport(ERROR,
    4488             :                         errcode(ERRCODE_SYNTAX_ERROR),
    4489             :                 /*- translator: first %s is name of a SQL/JSON clause (eg. ON EMPTY) */
    4490             :                         errmsg("invalid %s behavior for column \"%s\"",
    4491             :                                "ON ERROR", func->column_name),
    4492             :                 /*- translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) */
    4493             :                         errdetail("Only ERROR, NULL, or DEFAULT expression is allowed in %s for scalar columns.",
    4494             :                                   "ON ERROR"),
    4495             :                         parser_errposition(pstate, func->on_error->location));
    4496             :         }
    4497             :     }
    4498             : 
    4499        3094 :     jsexpr = makeNode(JsonExpr);
    4500        3094 :     jsexpr->location = func->location;
    4501        3094 :     jsexpr->op = func->op;
    4502        3094 :     jsexpr->column_name = func->column_name;
    4503             : 
    4504             :     /*
    4505             :      * jsonpath machinery can only handle jsonb documents, so coerce the input
    4506             :      * if not already of jsonb type.
    4507             :      */
    4508        3094 :     jsexpr->formatted_expr = transformJsonValueExpr(pstate, func_name,
    4509             :                                                     func->context_item,
    4510             :                                                     default_format,
    4511             :                                                     JSONBOID,
    4512             :                                                     false);
    4513        3094 :     jsexpr->format = func->context_item->format;
    4514             : 
    4515        3094 :     path_spec = transformExprRecurse(pstate, func->pathspec);
    4516        3094 :     pathspec_type = exprType(path_spec);
    4517        3094 :     pathspec_loc = exprLocation(path_spec);
    4518        3094 :     coerced_path_spec = coerce_to_target_type(pstate, path_spec,
    4519             :                                               pathspec_type,
    4520             :                                               JSONPATHOID, -1,
    4521             :                                               COERCION_EXPLICIT,
    4522             :                                               COERCE_IMPLICIT_CAST,
    4523             :                                               pathspec_loc);
    4524        3094 :     if (coerced_path_spec == NULL)
    4525          12 :         ereport(ERROR,
    4526             :                 (errcode(ERRCODE_DATATYPE_MISMATCH),
    4527             :                  errmsg("JSON path expression must be of type %s, not of type %s",
    4528             :                         "jsonpath", format_type_be(pathspec_type)),
    4529             :                  parser_errposition(pstate, pathspec_loc)));
    4530        3082 :     jsexpr->path_spec = coerced_path_spec;
    4531             : 
    4532             :     /* Transform and coerce the PASSING arguments to jsonb. */
    4533        3082 :     transformJsonPassingArgs(pstate, func_name,
    4534             :                              JS_FORMAT_JSONB,
    4535             :                              func->passing,
    4536             :                              &jsexpr->passing_values,
    4537             :                              &jsexpr->passing_names);
    4538             : 
    4539             :     /* Transform the JsonOutput into JsonReturning. */
    4540        3082 :     jsexpr->returning = transformJsonOutput(pstate, func->output, false);
    4541             : 
    4542        3070 :     switch (func->op)
    4543             :     {
    4544         294 :         case JSON_EXISTS_OP:
    4545             :             /* JSON_EXISTS returns boolean by default. */
    4546         294 :             if (!OidIsValid(jsexpr->returning->typid))
    4547             :             {
    4548         162 :                 jsexpr->returning->typid = BOOLOID;
    4549         162 :                 jsexpr->returning->typmod = -1;
    4550         162 :                 jsexpr->collation = InvalidOid;
    4551             :             }
    4552             : 
    4553             :             /* JSON_TABLE() COLUMNS can specify a non-boolean type. */
    4554         294 :             if (jsexpr->returning->typid != BOOLOID)
    4555         120 :                 jsexpr->use_json_coercion = true;
    4556             : 
    4557         294 :             jsexpr->on_error = transformJsonBehavior(pstate,
    4558             :                                                      jsexpr,
    4559             :                                                      func->on_error,
    4560             :                                                      JSON_BEHAVIOR_FALSE,
    4561             :                                                      jsexpr->returning);
    4562         294 :             break;
    4563             : 
    4564        1230 :         case JSON_QUERY_OP:
    4565             :             /* JSON_QUERY returns jsonb by default. */
    4566        1230 :             if (!OidIsValid(jsexpr->returning->typid))
    4567             :             {
    4568         492 :                 JsonReturning *ret = jsexpr->returning;
    4569             : 
    4570         492 :                 ret->typid = JSONBOID;
    4571         492 :                 ret->typmod = -1;
    4572             :             }
    4573             : 
    4574        1230 :             jsexpr->collation = get_typcollation(jsexpr->returning->typid);
    4575             : 
    4576             :             /*
    4577             :              * Keep quotes on scalar strings by default, omitting them only if
    4578             :              * OMIT QUOTES is specified.
    4579             :              */
    4580        1230 :             jsexpr->omit_quotes = (func->quotes == JS_QUOTES_OMIT);
    4581        1230 :             jsexpr->wrapper = func->wrapper;
    4582             : 
    4583             :             /*
    4584             :              * Set up to coerce the result value of JsonPathValue() to the
    4585             :              * RETURNING type (default or user-specified), if needed.  Also if
    4586             :              * OMIT QUOTES is specified.
    4587             :              */
    4588        1230 :             if (jsexpr->returning->typid != JSONBOID || jsexpr->omit_quotes)
    4589         690 :                 jsexpr->use_json_coercion = true;
    4590             : 
    4591             :             /* Assume NULL ON EMPTY when ON EMPTY is not specified. */
    4592        1230 :             jsexpr->on_empty = transformJsonBehavior(pstate,
    4593             :                                                      jsexpr,
    4594             :                                                      func->on_empty,
    4595             :                                                      JSON_BEHAVIOR_NULL,
    4596             :                                                      jsexpr->returning);
    4597             :             /* Assume NULL ON ERROR when ON ERROR is not specified. */
    4598        1230 :             jsexpr->on_error = transformJsonBehavior(pstate,
    4599             :                                                      jsexpr,
    4600             :                                                      func->on_error,
    4601             :                                                      JSON_BEHAVIOR_NULL,
    4602             :                                                      jsexpr->returning);
    4603        1170 :             break;
    4604             : 
    4605        1070 :         case JSON_VALUE_OP:
    4606             :             /* JSON_VALUE returns text by default. */
    4607        1070 :             if (!OidIsValid(jsexpr->returning->typid))
    4608             :             {
    4609         174 :                 jsexpr->returning->typid = TEXTOID;
    4610         174 :                 jsexpr->returning->typmod = -1;
    4611             :             }
    4612        1070 :             jsexpr->collation = get_typcollation(jsexpr->returning->typid);
    4613             : 
    4614             :             /*
    4615             :              * Override whatever transformJsonOutput() set these to, which
    4616             :              * assumes that output type to be jsonb.
    4617             :              */
    4618        1070 :             jsexpr->returning->format->format_type = JS_FORMAT_DEFAULT;
    4619        1070 :             jsexpr->returning->format->encoding = JS_ENC_DEFAULT;
    4620             : 
    4621             :             /* Always omit quotes from scalar strings. */
    4622        1070 :             jsexpr->omit_quotes = true;
    4623             : 
    4624             :             /*
    4625             :              * Set up to coerce the result value of JsonPathValue() to the
    4626             :              * RETURNING type (default or user-specified), if needed.
    4627             :              */
    4628        1070 :             if (jsexpr->returning->typid != TEXTOID)
    4629             :             {
    4630        1004 :                 if (get_typtype(jsexpr->returning->typid) == TYPTYPE_DOMAIN &&
    4631         192 :                     DomainHasConstraints(jsexpr->returning->typid))
    4632         132 :                     jsexpr->use_json_coercion = true;
    4633             :                 else
    4634         680 :                     jsexpr->use_io_coercion = true;
    4635             :             }
    4636             : 
    4637             :             /* Assume NULL ON EMPTY when ON EMPTY is not specified. */
    4638        1070 :             jsexpr->on_empty = transformJsonBehavior(pstate,
    4639             :                                                      jsexpr,
    4640             :                                                      func->on_empty,
    4641             :                                                      JSON_BEHAVIOR_NULL,
    4642             :                                                      jsexpr->returning);
    4643             :             /* Assume NULL ON ERROR when ON ERROR is not specified. */
    4644        1046 :             jsexpr->on_error = transformJsonBehavior(pstate,
    4645             :                                                      jsexpr,
    4646             :                                                      func->on_error,
    4647             :                                                      JSON_BEHAVIOR_NULL,
    4648             :                                                      jsexpr->returning);
    4649        1040 :             break;
    4650             : 
    4651         476 :         case JSON_TABLE_OP:
    4652         476 :             if (!OidIsValid(jsexpr->returning->typid))
    4653             :             {
    4654         476 :                 jsexpr->returning->typid = exprType(jsexpr->formatted_expr);
    4655         476 :                 jsexpr->returning->typmod = -1;
    4656             :             }
    4657         476 :             jsexpr->collation = get_typcollation(jsexpr->returning->typid);
    4658             : 
    4659             :             /*
    4660             :              * Assume EMPTY ARRAY ON ERROR when ON ERROR is not specified.
    4661             :              *
    4662             :              * ON EMPTY cannot be specified at the top level but it can be for
    4663             :              * the individual columns.
    4664             :              */
    4665         476 :             jsexpr->on_error = transformJsonBehavior(pstate,
    4666             :                                                      jsexpr,
    4667             :                                                      func->on_error,
    4668             :                                                      JSON_BEHAVIOR_EMPTY_ARRAY,
    4669             :                                                      jsexpr->returning);
    4670         476 :             break;
    4671             : 
    4672           0 :         default:
    4673           0 :             elog(ERROR, "invalid JsonFuncExpr op %d", (int) func->op);
    4674             :             break;
    4675             :     }
    4676             : 
    4677        2980 :     return (Node *) jsexpr;
    4678             : }
    4679             : 
    4680             : /*
    4681             :  * Transform a SQL/JSON PASSING clause.
    4682             :  */
    4683             : static void
    4684        3082 : transformJsonPassingArgs(ParseState *pstate, const char *constructName,
    4685             :                          JsonFormatType format, List *args,
    4686             :                          List **passing_values, List **passing_names)
    4687             : {
    4688             :     ListCell   *lc;
    4689             : 
    4690        3082 :     *passing_values = NIL;
    4691        3082 :     *passing_names = NIL;
    4692             : 
    4693        4282 :     foreach(lc, args)
    4694             :     {
    4695        1200 :         JsonArgument *arg = castNode(JsonArgument, lfirst(lc));
    4696        1200 :         Node       *expr = transformJsonValueExpr(pstate, constructName,
    4697             :                                                   arg->val, format,
    4698             :                                                   InvalidOid, true);
    4699             : 
    4700        1200 :         *passing_values = lappend(*passing_values, expr);
    4701        1200 :         *passing_names = lappend(*passing_names, makeString(arg->name));
    4702             :     }
    4703        3082 : }
    4704             : 
    4705             : /*
    4706             :  * Recursively checks if the given expression, or its sub-node in some cases,
    4707             :  * is valid for using as an ON ERROR / ON EMPTY DEFAULT expression.
    4708             :  */
    4709             : static bool
    4710         582 : ValidJsonBehaviorDefaultExpr(Node *expr, void *context)
    4711             : {
    4712         582 :     if (expr == NULL)
    4713           0 :         return false;
    4714             : 
    4715         582 :     switch (nodeTag(expr))
    4716             :     {
    4717             :             /* Acceptable expression nodes */
    4718         372 :         case T_Const:
    4719             :         case T_FuncExpr:
    4720             :         case T_OpExpr:
    4721         372 :             return true;
    4722             : 
    4723             :             /* Acceptable iff arg of the following nodes is one of the above */
    4724         156 :         case T_CoerceViaIO:
    4725             :         case T_CoerceToDomain:
    4726             :         case T_ArrayCoerceExpr:
    4727             :         case T_ConvertRowtypeExpr:
    4728             :         case T_RelabelType:
    4729             :         case T_CollateExpr:
    4730         156 :             return expression_tree_walker(expr, ValidJsonBehaviorDefaultExpr,
    4731             :                                           context);
    4732          54 :         default:
    4733          54 :             break;
    4734             :     }
    4735             : 
    4736          54 :     return false;
    4737             : }
    4738             : 
    4739             : /*
    4740             :  * Transform a JSON BEHAVIOR clause.
    4741             :  */
    4742             : static JsonBehavior *
    4743        5346 : transformJsonBehavior(ParseState *pstate, JsonExpr *jsexpr,
    4744             :                       JsonBehavior *behavior,
    4745             :                       JsonBehaviorType default_behavior,
    4746             :                       JsonReturning *returning)
    4747             : {
    4748        5346 :     JsonBehaviorType btype = default_behavior;
    4749        5346 :     Node       *expr = NULL;
    4750        5346 :     bool        coerce_at_runtime = false;
    4751        5346 :     int         location = -1;
    4752             : 
    4753        5346 :     if (behavior)
    4754             :     {
    4755        1062 :         btype = behavior->btype;
    4756        1062 :         location = behavior->location;
    4757        1062 :         if (btype == JSON_BEHAVIOR_DEFAULT)
    4758             :         {
    4759         420 :             Oid         targetcoll = jsexpr->collation;
    4760             :             Oid         exprcoll;
    4761             : 
    4762         420 :             expr = transformExprRecurse(pstate, behavior->expr);
    4763             : 
    4764         420 :             if (!ValidJsonBehaviorDefaultExpr(expr, NULL))
    4765          48 :                 ereport(ERROR,
    4766             :                         (errcode(ERRCODE_DATATYPE_MISMATCH),
    4767             :                          errmsg("can only specify a constant, non-aggregate function, or operator expression for DEFAULT"),
    4768             :                          parser_errposition(pstate, exprLocation(expr))));
    4769         372 :             if (contain_var_clause(expr))
    4770           6 :                 ereport(ERROR,
    4771             :                         (errcode(ERRCODE_DATATYPE_MISMATCH),
    4772             :                          errmsg("DEFAULT expression must not contain column references"),
    4773             :                          parser_errposition(pstate, exprLocation(expr))));
    4774         366 :             if (expression_returns_set(expr))
    4775           6 :                 ereport(ERROR,
    4776             :                         (errcode(ERRCODE_DATATYPE_MISMATCH),
    4777             :                          errmsg("DEFAULT expression must not return a set"),
    4778             :                          parser_errposition(pstate, exprLocation(expr))));
    4779             : 
    4780             :             /*
    4781             :              * Reject a DEFAULT expression whose collation differs from the
    4782             :              * enclosing JSON expression's result collation
    4783             :              * (jsexpr->collation), as chosen by the RETURNING clause.
    4784             :              */
    4785         360 :             exprcoll = exprCollation(expr);
    4786         360 :             if (!OidIsValid(exprcoll))
    4787         336 :                 exprcoll = get_typcollation(exprType(expr));
    4788         360 :             if (OidIsValid(targetcoll) && OidIsValid(exprcoll) &&
    4789             :                 targetcoll != exprcoll)
    4790          24 :                 ereport(ERROR,
    4791             :                         errcode(ERRCODE_COLLATION_MISMATCH),
    4792             :                         errmsg("collation of DEFAULT expression conflicts with RETURNING clause"),
    4793             :                         errdetail("\"%s\" versus \"%s\"",
    4794             :                                   get_collation_name(exprcoll),
    4795             :                                   get_collation_name(targetcoll)),
    4796             :                         parser_errposition(pstate, exprLocation(expr)));
    4797             :         }
    4798             :     }
    4799             : 
    4800        5262 :     if (expr == NULL && btype != JSON_BEHAVIOR_ERROR)
    4801        4440 :         expr = GetJsonBehaviorConst(btype, location);
    4802             : 
    4803             :     /*
    4804             :      * Try to coerce the expression if needed.
    4805             :      *
    4806             :      * Use runtime coercion using json_populate_type() if the expression is
    4807             :      * NULL, jsonb-valued, or boolean-valued (unless the target type is
    4808             :      * integer or domain over integer, in which case use the
    4809             :      * boolean-to-integer cast function).
    4810             :      *
    4811             :      * For other non-NULL expressions, try to find a cast and error out if one
    4812             :      * is not found.
    4813             :      */
    4814        5262 :     if (expr && exprType(expr) != returning->typid)
    4815             :     {
    4816        3270 :         bool        isnull = (IsA(expr, Const) && ((Const *) expr)->constisnull);
    4817             : 
    4818        3582 :         if (isnull ||
    4819         582 :             exprType(expr) == JSONBOID ||
    4820         348 :             (exprType(expr) == BOOLOID &&
    4821          78 :              getBaseType(returning->typid) != INT4OID))
    4822             :         {
    4823        3042 :             coerce_at_runtime = true;
    4824             : 
    4825             :             /*
    4826             :              * json_populate_type() expects to be passed a jsonb value, so gin
    4827             :              * up a Const containing the appropriate boolean value represented
    4828             :              * as jsonb, discarding the original Const containing a plain
    4829             :              * boolean.
    4830             :              */
    4831        3042 :             if (exprType(expr) == BOOLOID)
    4832             :             {
    4833          42 :                 char       *val = btype == JSON_BEHAVIOR_TRUE ? "true" : "false";
    4834             : 
    4835          42 :                 expr = (Node *) makeConst(JSONBOID, -1, InvalidOid, -1,
    4836             :                                           DirectFunctionCall1(jsonb_in,
    4837             :                                                               CStringGetDatum(val)),
    4838             :                                           false, false);
    4839             :             }
    4840             :         }
    4841             :         else
    4842             :         {
    4843             :             Node       *coerced_expr;
    4844         228 :             char        typcategory = TypeCategory(returning->typid);
    4845             : 
    4846             :             /*
    4847             :              * Use an assignment cast if coercing to a string type so that
    4848             :              * build_coercion_expression() assumes implicit coercion when
    4849             :              * coercing the typmod, so that inputs exceeding length cause an
    4850             :              * error instead of silent truncation.
    4851             :              */
    4852             :             coerced_expr =
    4853         324 :                 coerce_to_target_type(pstate, expr, exprType(expr),
    4854             :                                       returning->typid, returning->typmod,
    4855          96 :                                       (typcategory == TYPCATEGORY_STRING ||
    4856             :                                        typcategory == TYPCATEGORY_BITSTRING) ?
    4857             :                                       COERCION_ASSIGNMENT :
    4858             :                                       COERCION_EXPLICIT,
    4859             :                                       COERCE_EXPLICIT_CAST,
    4860             :                                       exprLocation((Node *) behavior));
    4861             : 
    4862         228 :             if (coerced_expr == NULL)
    4863             :             {
    4864             :                 /*
    4865             :                  * Provide a HINT if the expression comes from a DEFAULT
    4866             :                  * clause.
    4867             :                  */
    4868           6 :                 if (btype == JSON_BEHAVIOR_DEFAULT)
    4869           6 :                     ereport(ERROR,
    4870             :                             errcode(ERRCODE_CANNOT_COERCE),
    4871             :                             errmsg("cannot cast behavior expression of type %s to %s",
    4872             :                                    format_type_be(exprType(expr)),
    4873             :                                    format_type_be(returning->typid)),
    4874             :                             errhint("You will need to explicitly cast the expression to type %s.",
    4875             :                                     format_type_be(returning->typid)),
    4876             :                             parser_errposition(pstate, exprLocation(expr)));
    4877             :                 else
    4878           0 :                     ereport(ERROR,
    4879             :                             errcode(ERRCODE_CANNOT_COERCE),
    4880             :                             errmsg("cannot cast behavior expression of type %s to %s",
    4881             :                                    format_type_be(exprType(expr)),
    4882             :                                    format_type_be(returning->typid)),
    4883             :                             parser_errposition(pstate, exprLocation(expr)));
    4884             :             }
    4885             : 
    4886         222 :             expr = coerced_expr;
    4887             :         }
    4888             :     }
    4889             : 
    4890        5256 :     if (behavior)
    4891         972 :         behavior->expr = expr;
    4892             :     else
    4893        4284 :         behavior = makeJsonBehavior(btype, expr, location);
    4894             : 
    4895        5256 :     behavior->coerce = coerce_at_runtime;
    4896             : 
    4897        5256 :     return behavior;
    4898             : }
    4899             : 
    4900             : /*
    4901             :  * Returns a Const node holding the value for the given non-ERROR
    4902             :  * JsonBehaviorType.
    4903             :  */
    4904             : static Node *
    4905        4440 : GetJsonBehaviorConst(JsonBehaviorType btype, int location)
    4906             : {
    4907        4440 :     Datum       val = (Datum) 0;
    4908        4440 :     Oid         typid = JSONBOID;
    4909        4440 :     int         len = -1;
    4910        4440 :     bool        isbyval = false;
    4911        4440 :     bool        isnull = false;
    4912             :     Const      *con;
    4913             : 
    4914        4440 :     switch (btype)
    4915             :     {
    4916         482 :         case JSON_BEHAVIOR_EMPTY_ARRAY:
    4917         482 :             val = DirectFunctionCall1(jsonb_in, CStringGetDatum("[]"));
    4918         482 :             break;
    4919             : 
    4920          54 :         case JSON_BEHAVIOR_EMPTY_OBJECT:
    4921          54 :             val = DirectFunctionCall1(jsonb_in, CStringGetDatum("{}"));
    4922          54 :             break;
    4923             : 
    4924          12 :         case JSON_BEHAVIOR_TRUE:
    4925          12 :             val = BoolGetDatum(true);
    4926          12 :             typid = BOOLOID;
    4927          12 :             len = sizeof(bool);
    4928          12 :             isbyval = true;
    4929          12 :             break;
    4930             : 
    4931         228 :         case JSON_BEHAVIOR_FALSE:
    4932         228 :             val = BoolGetDatum(false);
    4933         228 :             typid = BOOLOID;
    4934         228 :             len = sizeof(bool);
    4935         228 :             isbyval = true;
    4936         228 :             break;
    4937             : 
    4938        3664 :         case JSON_BEHAVIOR_NULL:
    4939             :         case JSON_BEHAVIOR_UNKNOWN:
    4940             :         case JSON_BEHAVIOR_EMPTY:
    4941        3664 :             val = (Datum) 0;
    4942        3664 :             isnull = true;
    4943        3664 :             typid = INT4OID;
    4944        3664 :             len = sizeof(int32);
    4945        3664 :             isbyval = true;
    4946        3664 :             break;
    4947             : 
    4948             :             /* These two behavior types are handled by the caller. */
    4949           0 :         case JSON_BEHAVIOR_DEFAULT:
    4950             :         case JSON_BEHAVIOR_ERROR:
    4951             :             Assert(false);
    4952           0 :             break;
    4953             : 
    4954           0 :         default:
    4955           0 :             elog(ERROR, "unrecognized SQL/JSON behavior %d", btype);
    4956             :             break;
    4957             :     }
    4958             : 
    4959        4440 :     con = makeConst(typid, -1, InvalidOid, len, val, isnull, isbyval);
    4960        4440 :     con->location = location;
    4961             : 
    4962        4440 :     return (Node *) con;
    4963             : }

Generated by: LCOV version 1.16