37#include "utils/fmgroids.h"
75 int sublevels_up,
int location);
95 List **passing_values,
List **passing_names);
101 List *largs,
List *rargs,
int location);
159 case T_A_Indirection:
172 case T_CollateClause:
214 elog(
ERROR,
"unrecognized A_Expr kind: %d",
a->kind);
229 case T_MultiAssignRef:
237 case T_MergeSupportFunc:
271 case T_SQLValueFunction:
299 case T_CurrentOfExpr:
309 (
errcode(ERRCODE_SYNTAX_ERROR),
310 errmsg(
"DEFAULT is not allowed in this context"),
328 result = (
Node *) expr;
332 case T_JsonObjectConstructor:
336 case T_JsonArrayConstructor:
340 case T_JsonArrayQueryConstructor:
344 case T_JsonObjectAgg:
352 case T_JsonIsPredicate:
356 case T_JsonParseExpr:
360 case T_JsonScalarExpr:
364 case T_JsonSerializeExpr:
399 ((
Var *) relref)->varno,
400 ((
Var *) relref)->varlevelsup);
402 (
errcode(ERRCODE_UNDEFINED_COLUMN),
403 errmsg(
"column %s.%s does not exist",
404 rte->eref->aliasname,
attname),
414 (
errcode(ERRCODE_UNDEFINED_COLUMN),
415 errmsg(
"column \"%s\" not found in data type %s",
418 else if (relTypeId == RECORDOID)
420 (
errcode(ERRCODE_UNDEFINED_COLUMN),
421 errmsg(
"could not identify column \"%s\" in record data type",
426 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
427 errmsg(
"column notation .%s applied to type %s, "
428 "which is not a composite type",
448 foreach(
i,
ind->indirection)
453 subscripts =
lappend(subscripts, n);
457 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
458 errmsg(
"row expansion via \"*\" is not supported here"),
484 if (newresult == NULL)
510 char *nspname = NULL;
512 char *colname = NULL;
521 } crerr = CRERR_NO_COLUMN;
581 err =
_(
"cannot use column reference in DEFAULT expression");
584 err =
_(
"cannot use column reference in partition bound expression");
597 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
681 crerr = CRERR_NO_RTE;
728 crerr = CRERR_NO_RTE;
777 crerr = CRERR_WRONG_DB;
787 crerr = CRERR_NO_RTE;
820 crerr = CRERR_TOO_MANY;
840 else if (hookresult != NULL)
842 (
errcode(ERRCODE_AMBIGUOUS_COLUMN),
843 errmsg(
"column reference \"%s\" is ambiguous",
855 case CRERR_NO_COLUMN:
864 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
865 errmsg(
"cross-database references are not implemented: %s",
871 (
errcode(ERRCODE_SYNTAX_ERROR),
872 errmsg(
"improper qualified name (too many dotted names): %s",
898 (
errcode(ERRCODE_UNDEFINED_PARAMETER),
922 Node *lexpr =
a->lexpr;
923 Node *rexpr =
a->rexpr;
964 s->operName =
a->name;
1031 Node *lexpr =
a->lexpr;
1032 Node *rexpr =
a->rexpr;
1096 if (result->opresulttype != BOOLOID)
1098 (
errcode(ERRCODE_DATATYPE_MISMATCH),
1100 errmsg(
"%s requires = operator to yield boolean",
"NULLIF"),
1102 if (result->opretset)
1104 (
errcode(ERRCODE_DATATYPE_MISMATCH),
1106 errmsg(
"%s must not return a set",
"NULLIF"),
1119 return (
Node *) result;
1125 Node *result = NULL;
1153 rexprs = rvars = rnonvars =
NIL;
1154 foreach(l, (
List *)
a->rexpr)
1158 rexprs =
lappend(rexprs, rexpr);
1160 rvars =
lappend(rvars, rexpr);
1162 rnonvars =
lappend(rnonvars, rexpr);
1196 if (
OidIsValid(scalar_type) && scalar_type != RECORDOID)
1210 foreach(l, rnonvars)
1217 aexprs =
lappend(aexprs, rexpr);
1220 newa->array_typeid = array_type;
1222 newa->element_typeid = scalar_type;
1223 newa->elements = aexprs;
1224 newa->multidims =
false;
1368 elog(
ERROR,
"unrecognized A_Expr kind: %d",
a->kind);
1387 while (parent_pstate &&
1393 errcode(ERRCODE_SYNTAX_ERROR),
1394 errmsg(
"MERGE_ACTION() can only be used in the RETURNING list of a MERGE command"),
1420 elog(
ERROR,
"unrecognized boolop: %d", (
int)
a->boolop);
1425 foreach(lc,
a->args)
1460 if (
fn->agg_within_group)
1463 foreach(
args,
fn->agg_order)
1494 if (maref->
colno == 1)
1517 (
errcode(ERRCODE_SYNTAX_ERROR),
1518 errmsg(
"number of columns does not match number of values"),
1549 (
errcode(ERRCODE_SYNTAX_ERROR),
1550 errmsg(
"number of columns does not match number of values"),
1563 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1564 errmsg(
"source for a multiple-column UPDATE item must be a sub-SELECT or ROW() expression"),
1601 return (
Node *) param;
1626 elog(
ERROR,
"unexpected expr type in multiassign list");
1691 (
Node *) placeholder,
1705 newargs =
lappend(newargs, neww);
1709 newc->
args = newargs;
1712 defresult = (
Node *)
c->defresult;
1713 if (defresult == NULL)
1719 defresult = (
Node *) n;
1732 newc->casetype = ptype;
1743 foreach(l, newc->
args)
1757 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1759 errmsg(
"set-returning functions are not allowed in %s",
1761 errhint(
"You might be able to move the set-returning function into a LATERAL FROM item."),
1767 return (
Node *) newc;
1823 err =
_(
"cannot use subquery in check constraint");
1827 err =
_(
"cannot use subquery in DEFAULT expression");
1830 err =
_(
"cannot use subquery in index expression");
1833 err =
_(
"cannot use subquery in index predicate");
1836 err =
_(
"cannot use subquery in statistics expression");
1839 err =
_(
"cannot use subquery in transform expression");
1842 err =
_(
"cannot use subquery in EXECUTE parameter");
1845 err =
_(
"cannot use subquery in trigger WHEN condition");
1848 err =
_(
"cannot use subquery in partition bound");
1851 err =
_(
"cannot use subquery in partition key expression");
1854 err =
_(
"cannot use subquery in CALL argument");
1857 err =
_(
"cannot use subquery in COPY FROM WHERE condition");
1860 err =
_(
"cannot use subquery in column generation expression");
1873 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1890 elog(
ERROR,
"unexpected non-SELECT command in SubLink");
1901 sublink->operName =
NIL;
1912 (
errcode(ERRCODE_SYNTAX_ERROR),
1913 errmsg(
"subquery must return only one column"),
1921 sublink->operName =
NIL;
1927 sublink->operName =
NIL;
1940 if (sublink->operName ==
NIL)
1948 left_list = ((
RowExpr *) lefthand)->args;
1973 right_list =
lappend(right_list, param);
1983 (
errcode(ERRCODE_SYNTAX_ERROR),
1984 errmsg(
"subquery has too many columns"),
1988 (
errcode(ERRCODE_SYNTAX_ERROR),
1989 errmsg(
"subquery has too few columns"),
2030 newa->multidims =
false;
2049 newa->multidims =
true;
2061 if (!newa->multidims)
2065 if (newetype != INT2VECTOROID && newetype != OIDVECTOROID &&
2067 newa->multidims =
true;
2071 newelems =
lappend(newelems, newe);
2084 coerce_type = (newa->multidims ? array_type : element_type);
2090 if (newelems ==
NIL)
2092 (
errcode(ERRCODE_INDETERMINATE_DATATYPE),
2093 errmsg(
"cannot determine type of empty array"),
2094 errhint(
"Explicitly cast to the desired type, "
2095 "for example ARRAY[]::integer[]."),
2101 if (newa->multidims)
2107 (
errcode(ERRCODE_UNDEFINED_OBJECT),
2108 errmsg(
"could not find element type for data type %s",
2118 (
errcode(ERRCODE_UNDEFINED_OBJECT),
2119 errmsg(
"could not find array type for data type %s",
2123 coerce_hard =
false;
2152 (
errcode(ERRCODE_CANNOT_COERCE),
2153 errmsg(
"cannot cast type %s to %s",
2162 newcoercedelems =
lappend(newcoercedelems, newe);
2165 newa->array_typeid = array_type;
2167 newa->element_typeid = element_type;
2168 newa->elements = newcoercedelems;
2173 return (
Node *) newa;
2192 (
errcode(ERRCODE_TOO_MANY_COLUMNS),
2193 errmsg(
"ROW expressions can have at most %d entries",
2198 newr->row_typeid = RECORDOID;
2202 newr->colnames =
NIL;
2205 snprintf(fname,
sizeof(fname),
"f%d", fnum);
2211 return (
Node *) newr;
2223 foreach(
args,
c->args)
2229 newargs =
lappend(newargs, newe);
2236 foreach(
args, newargs)
2244 newcoercedargs =
lappend(newcoercedargs, newe);
2250 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
2252 errmsg(
"set-returning functions are not allowed in %s",
2254 errhint(
"You might be able to move the set-returning function into a LATERAL FROM item."),
2258 newc->
args = newcoercedargs;
2260 return (
Node *) newc;
2279 newargs =
lappend(newargs, newe);
2286 foreach(
args, newargs)
2294 newcoercedargs =
lappend(newcoercedargs, newe);
2297 newm->
args = newcoercedargs;
2299 return (
Node *) newm;
2312 svf->type = DATEOID;
2315 svf->type = TIMETZOID;
2318 svf->type = TIMETZOID;
2322 svf->type = TIMESTAMPTZOID;
2325 svf->type = TIMESTAMPTZOID;
2329 svf->type = TIMEOID;
2332 svf->type = TIMEOID;
2336 svf->type = TIMESTAMPOID;
2339 svf->type = TIMESTAMPOID;
2348 svf->type = NAMEOID;
2352 return (
Node *) svf;
2368 newx->xmloption =
x->xmloption;
2369 newx->type = XMLOID;
2378 newx->arg_names =
NIL;
2380 foreach(lc,
x->named_args)
2396 (
errcode(ERRCODE_SYNTAX_ERROR),
2398 ?
errmsg(
"unnamed XML attribute value must be a column reference")
2399 :
errmsg(
"unnamed XML element value must be a column reference"),
2409 foreach(lc2, newx->arg_names)
2413 (
errcode(ERRCODE_SYNTAX_ERROR),
2414 errmsg(
"XML attribute name \"%s\" appears more than once",
2427 foreach(lc,
x->args)
2481 return (
Node *) newx;
2505 xexpr->type = targetType;
2506 xexpr->typmod = targetTypmod;
2515 TEXTOID, targetType, targetTypmod,
2521 (
errcode(ERRCODE_CANNOT_COERCE),
2522 errmsg(
"cannot cast XMLSERIALIZE result to %s",
2531 const char *clausename;
2533 switch (
b->booltesttype)
2536 clausename =
"IS TRUE";
2539 clausename =
"IS NOT TRUE";
2542 clausename =
"IS FALSE";
2545 clausename =
"IS NOT FALSE";
2548 clausename =
"IS UNKNOWN";
2551 clausename =
"IS NOT UNKNOWN";
2554 elog(
ERROR,
"unrecognized booltesttype: %d",
2555 (
int)
b->booltesttype);
2600 if (node != NULL &&
IsA(node,
Param))
2614 return (
Node *) cexpr;
2622 int sublevels_up,
int location)
2653 sublevels_up,
true);
2667 return (
Node *) result;
2685 rowexpr->row_typeid = RECORDOID;
2692 return (
Node *) rowexpr;
2726 int32 targetBaseTypmod;
2735 targetBaseTypmod = targetTypmod;
2766 targetType, targetTypmod,
2772 (
errcode(ERRCODE_CANNOT_COERCE),
2773 errmsg(
"cannot cast type %s to %s",
2803 (
errcode(ERRCODE_DATATYPE_MISMATCH),
2804 errmsg(
"collations are not supported by type %s",
2811 return (
Node *) newc;
2828 List *largs,
List *rargs,
int location)
2837 List **opinfo_lists;
2845 (
errcode(ERRCODE_SYNTAX_ERROR),
2846 errmsg(
"unequal number of entries in row expressions"),
2855 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
2856 errmsg(
"cannot compare rows of zero length"),
2878 if (
cmp->opresulttype != BOOLOID)
2880 (
errcode(ERRCODE_DATATYPE_MISMATCH),
2881 errmsg(
"row comparison operator must yield type boolean, "
2887 (
errcode(ERRCODE_DATATYPE_MISMATCH),
2888 errmsg(
"row comparison operator must not return a set"),
2922 this_cmptypes = NULL;
2923 foreach(
j, opinfo_lists[
i])
2930 cmptypes = this_cmptypes;
2946 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
2947 errmsg(
"could not determine interpretation of row comparison operator %s",
2949 errhint(
"Row comparison operators must be associated with btree operator families."),
2968 for (
i = 0;
i < nopers;
i++)
2973 foreach(
j, opinfo_lists[
i])
2977 if (opinfo->
cmptype == cmptype)
2987 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
2988 errmsg(
"could not determine interpretation of row comparison operator %s",
2990 errdetail(
"There are multiple equally-plausible candidates."),
3014 rcexpr->opnos = opnos;
3015 rcexpr->opfamilies = opfamilies;
3016 rcexpr->inputcollids =
NIL;
3017 rcexpr->
largs = largs;
3018 rcexpr->
rargs = rargs;
3020 return (
Node *) rcexpr;
3033 Node *result = NULL;
3041 (
errcode(ERRCODE_SYNTAX_ERROR),
3042 errmsg(
"unequal number of entries in row expressions"),
3080 if (((
OpExpr *) result)->opresulttype != BOOLOID)
3082 (
errcode(ERRCODE_DATATYPE_MISMATCH),
3084 errmsg(
"%s requires = operator to yield boolean",
3085 "IS DISTINCT FROM"),
3087 if (((
OpExpr *) result)->opretset)
3089 (
errcode(ERRCODE_DATATYPE_MISMATCH),
3091 errmsg(
"%s must not return a set",
"IS DISTINCT FROM"),
3119 nt->argisrow =
false;
3137 return "invalid expression context";
3139 return "extension expression";
3143 return "JOIN/USING";
3145 return "sub-SELECT in FROM";
3147 return "function in FROM";
3157 return "window PARTITION BY";
3159 return "window ORDER BY";
3161 return "window RANGE";
3163 return "window ROWS";
3165 return "window GROUPS";
3174 return "MERGE WHEN";
3180 return "DISTINCT ON";
3198 return "index expression";
3200 return "index predicate";
3202 return "statistics expression";
3210 return "partition bound";
3212 return "PARTITION BY";
3218 return "GENERATED AS";
3229 return "unrecognized expression kind";
3287 return (
Node *) fexpr;
3301 Oid targettype,
bool isarg)
3309 bool typispreferred;
3324 errcode(ERRCODE_DATATYPE_MISMATCH),
3325 errmsg(
"JSON ENCODING clause is only allowed for bytea input type"),
3328 if (exprtype == JSONOID || exprtype == JSONBOID)
3356 case TIMESTAMPTZOID:
3360 if (typcategory == TYPCATEGORY_STRING)
3368 else if (exprtype == JSONOID || exprtype == JSONBOID)
3374 (
OidIsValid(targettype) && exprtype != targettype))
3377 bool only_allow_cast =
OidIsValid(targettype);
3385 exprtype != BYTEAOID && typcategory != TYPCATEGORY_STRING)
3387 errcode(ERRCODE_DATATYPE_MISMATCH),
3389 errmsg(
"cannot use non-string types with implicit FORMAT JSON clause") :
3390 errmsg(
"cannot use non-string types with explicit FORMAT JSON clause"),
3421 if (only_allow_cast)
3423 (
errcode(ERRCODE_CANNOT_COERCE),
3424 errmsg(
"cannot cast type %s to %s",
3429 fnoid = targettype == JSONOID ? F_TO_JSON : F_TO_JSONB;
3435 coerced = (
Node *) fexpr;
3438 if (coerced == expr)
3462 Oid targettype,
bool allow_format_for_non_strings)
3464 if (!allow_format_for_non_strings &&
3466 (targettype != BYTEAOID &&
3467 targettype != JSONOID &&
3468 targettype != JSONBOID))
3471 bool typispreferred;
3475 if (typcategory != TYPCATEGORY_STRING)
3477 errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3479 errmsg(
"cannot use JSON format with non-string output types"));
3487 if (targettype != BYTEAOID &&
3490 errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3492 errmsg(
"cannot set JSON encoding for non-bytea output types"));
3496 errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3497 errmsg(
"unsupported JSON encoding"),
3498 errhint(
"Only UTF8 JSON encoding is supported."),
3532 if (
output->typeName->setof)
3534 errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3535 errmsg(
"returning SETOF types is not supported in SQL/JSON functions"));
3539 errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3540 errmsg(
"returning pseudo-types is not supported in SQL/JSON functions"));
3566 bool have_jsonb =
false;
3573 have_jsonb |= typid == JSONBOID;
3581 returning->
typid = JSONBOID;
3587 returning->
typid = JSONOID;
3619 returning->
typid == BYTEAOID)
3632 return (
Node *) fexpr;
3650 if (!res && report_error)
3652 errcode(ERRCODE_CANNOT_COERCE),
3653 errmsg(
"cannot cast type %s to %s",
3667 bool unique,
bool absent_on_null,
int location)
3674 jsctor->
func = fexpr;
3695 placeholder = (
Node *) cte;
3706 placeholder = (
Node *) cte;
3711 if (coercion != placeholder)
3714 return (
Node *) jsctor;
3736 foreach(lc, ctor->
exprs)
3782 errcode(ERRCODE_SYNTAX_ERROR),
3783 errmsg(
"subquery must return only one column"),
3804 target->
name = NULL;
3812 range->lateral =
false;
3814 range->alias = alias;
3822 sublink->operName =
NIL;
3835 Oid aggfnoid,
Oid aggtype,
3837 bool unique,
bool absent_on_null)
3852 wfunc->wintype = aggtype;
3856 wfunc->runCondition =
NIL;
3858 wfunc->winstar =
false;
3859 wfunc->winagg =
true;
3867 errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3868 errmsg(
"aggregate ORDER BY is not implemented for window functions"),
3874 node = (
Node *) wfunc;
3881 aggref->aggtype = aggtype;
3889 aggref->aggstar =
false;
3890 aggref->aggvariadic =
false;
3891 aggref->aggkind = AGGKIND_NORMAL;
3892 aggref->aggpresorted =
false;
3896 aggref->aggtransno = -1;
3901 node = (
Node *) aggref;
3905 returning, unique, absent_on_null,
3942 aggfnoid = F_JSONB_OBJECT_AGG_UNIQUE_STRICT;
3944 aggfnoid = F_JSONB_OBJECT_AGG_STRICT;
3946 aggfnoid = F_JSONB_OBJECT_AGG_UNIQUE;
3948 aggfnoid = F_JSONB_OBJECT_AGG;
3956 aggfnoid = F_JSON_OBJECT_AGG_UNIQUE_STRICT;
3958 aggfnoid = F_JSON_OBJECT_AGG_STRICT;
3960 aggfnoid = F_JSON_OBJECT_AGG_UNIQUE;
3962 aggfnoid = F_JSON_OBJECT_AGG;
3968 args, aggfnoid, aggtype,
3998 aggfnoid = agg->
absent_on_null ? F_JSONB_AGG_STRICT : F_JSONB_AGG;
4032 foreach(lc, ctor->
exprs)
4055 Node *expr = raw_expr;
4060 if (*exprtype == BYTEAOID)
4066 *exprtype = TEXTOID;
4069 expr = (
Node *) jve;
4074 bool typispreferred;
4078 if (*exprtype == UNKNOWNOID || typcategory == TYPCATEGORY_STRING)
4084 *exprtype = TEXTOID;
4089 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
4091 errmsg(
"cannot use JSON FORMAT ENCODING clause for non-bytea input types")));
4108 if (exprtype != TEXTOID && exprtype != JSONOID && exprtype != JSONBOID)
4110 (
errcode(ERRCODE_DATATYPE_MISMATCH),
4111 errmsg(
"cannot use type %s in IS JSON predicate",
4134 if (returning->
typid != JSONOID && returning->
typid != JSONBOID)
4136 (
errcode(ERRCODE_DATATYPE_MISMATCH),
4137 errmsg(
"cannot use type %s in RETURNING clause of %s",
4139 errhint(
"Try returning json or jsonb."),
4145 Oid targettype = JSONOID;
4150 returning->
typid = targettype;
4184 if (arg_type != TEXTOID)
4186 (
errcode(ERRCODE_DATATYPE_MISMATCH),
4187 errmsg(
"cannot use non-string types with WITH UNIQUE KEYS clause"),
4225 returning,
false,
false, jsexpr->
location);
4248 if (returning->
typid != BYTEAOID)
4251 bool typispreferred;
4255 if (typcategory != TYPCATEGORY_STRING)
4257 (
errcode(ERRCODE_DATATYPE_MISMATCH),
4258 errmsg(
"cannot use type %s in RETURNING clause of %s",
4260 "JSON_SERIALIZE()"),
4261 errhint(
"Try returning a string type or bytea.")));
4269 returning->
typid = TEXTOID;
4274 NULL, returning,
false,
false, expr->
location);
4286 const char *func_name = NULL;
4292 func_name =
"JSON_EXISTS";
4296 func_name =
"JSON_QUERY";
4300 func_name =
"JSON_VALUE";
4304 func_name =
"JSON_TABLE";
4308 elog(
ERROR,
"invalid JsonFuncExpr op %d", (
int) func->
op);
4325 errcode(ERRCODE_SYNTAX_ERROR),
4326 errmsg(
"cannot specify FORMAT JSON in RETURNING clause of %s()",
4338 errcode(ERRCODE_SYNTAX_ERROR),
4339 errmsg(
"SQL/JSON QUOTES behavior must not be specified when WITH WRAPPER is used"),
4351 errcode(ERRCODE_SYNTAX_ERROR),
4353 errmsg(
"invalid %s behavior",
"ON EMPTY"),
4356 errdetail(
"Only ERROR, NULL, EMPTY ARRAY, EMPTY OBJECT, or DEFAULT expression is allowed in %s for %s.",
4357 "ON EMPTY",
"JSON_QUERY()"),
4361 errcode(ERRCODE_SYNTAX_ERROR),
4363 errmsg(
"invalid %s behavior for column \"%s\"",
4366 errdetail(
"Only ERROR, NULL, EMPTY ARRAY, EMPTY OBJECT, or DEFAULT expression is allowed in %s for formatted columns.",
4380 errcode(ERRCODE_SYNTAX_ERROR),
4382 errmsg(
"invalid %s behavior",
"ON ERROR"),
4385 errdetail(
"Only ERROR, NULL, EMPTY ARRAY, EMPTY OBJECT, or DEFAULT expression is allowed in %s for %s.",
4386 "ON ERROR",
"JSON_QUERY()"),
4390 errcode(ERRCODE_SYNTAX_ERROR),
4392 errmsg(
"invalid %s behavior for column \"%s\"",
4395 errdetail(
"Only ERROR, NULL, EMPTY ARRAY, EMPTY OBJECT, or DEFAULT expression is allowed in %s for formatted columns.",
4411 errcode(ERRCODE_SYNTAX_ERROR),
4413 errmsg(
"invalid %s behavior",
"ON ERROR"),
4414 errdetail(
"Only ERROR, TRUE, FALSE, or UNKNOWN is allowed in %s for %s.",
4415 "ON ERROR",
"JSON_EXISTS()"),
4419 errcode(ERRCODE_SYNTAX_ERROR),
4421 errmsg(
"invalid %s behavior for column \"%s\"",
4424 errdetail(
"Only ERROR, TRUE, FALSE, or UNKNOWN is allowed in %s for EXISTS columns.",
4437 errcode(ERRCODE_SYNTAX_ERROR),
4439 errmsg(
"invalid %s behavior",
"ON EMPTY"),
4442 errdetail(
"Only ERROR, NULL, or DEFAULT expression is allowed in %s for %s.",
4443 "ON EMPTY",
"JSON_VALUE()"),
4447 errcode(ERRCODE_SYNTAX_ERROR),
4449 errmsg(
"invalid %s behavior for column \"%s\"",
4452 errdetail(
"Only ERROR, NULL, or DEFAULT expression is allowed in %s for scalar columns.",
4463 errcode(ERRCODE_SYNTAX_ERROR),
4465 errmsg(
"invalid %s behavior",
"ON ERROR"),
4468 errdetail(
"Only ERROR, NULL, or DEFAULT expression is allowed in %s for %s.",
4469 "ON ERROR",
"JSON_VALUE()"),
4473 errcode(ERRCODE_SYNTAX_ERROR),
4475 errmsg(
"invalid %s behavior for column \"%s\"",
4478 errdetail(
"Only ERROR, NULL, or DEFAULT expression is allowed in %s for scalar columns.",
4486 jsexpr->
op = func->
op;
4505 if (path_spec == NULL)
4507 (
errcode(ERRCODE_DATATYPE_MISMATCH),
4508 errmsg(
"JSON path expression must be of type %s, not of type %s",
4548 ret->
typid = JSONBOID;
4637 elog(
ERROR,
"invalid JsonFuncExpr op %d", (
int) func->
op);
4641 return (
Node *) jsexpr;
4650 List **passing_values,
List **passing_names)
4654 *passing_values =
NIL;
4655 *passing_names =
NIL;
4664 *passing_values =
lappend(*passing_values, expr);
4689 case T_CoerceToDomain:
4690 case T_ArrayCoerceExpr:
4691 case T_ConvertRowtypeExpr:
4713 bool coerce_at_runtime =
false;
4718 btype = behavior->
btype;
4725 (
errcode(ERRCODE_DATATYPE_MISMATCH),
4726 errmsg(
"can only specify a constant, non-aggregate function, or operator expression for DEFAULT"),
4730 (
errcode(ERRCODE_DATATYPE_MISMATCH),
4731 errmsg(
"DEFAULT expression must not contain column references"),
4735 (
errcode(ERRCODE_DATATYPE_MISMATCH),
4736 errmsg(
"DEFAULT expression must not return a set"),
4757 bool isnull = (
IsA(expr,
Const) && ((
Const *) expr)->constisnull);
4764 coerce_at_runtime =
true;
4796 (typcategory == TYPCATEGORY_STRING ||
4797 typcategory == TYPCATEGORY_BITSTRING) ?
4803 if (coerced_expr == NULL)
4811 errcode(ERRCODE_CANNOT_COERCE),
4812 errmsg(
"cannot cast behavior expression of type %s to %s",
4815 errhint(
"You will need to explicitly cast the expression to type %s.",
4820 errcode(ERRCODE_CANNOT_COERCE),
4821 errmsg(
"cannot cast behavior expression of type %s to %s",
4827 expr = coerced_expr;
4832 behavior->
expr = expr;
4836 behavior->
coerce = coerce_at_runtime;
4849 Oid typid = JSONBOID;
4851 bool isbyval =
false;
4852 bool isnull =
false;
4896 elog(
ERROR,
"unrecognized SQL/JSON behavior %d", btype);
4901 con->location = location;
4903 return (
Node *) con;
#define InvalidAttrNumber
int32 anytimestamp_typmod_check(bool istz, int32 typmod)
Bitmapset * bms_int_members(Bitmapset *a, const Bitmapset *b)
int bms_next_member(const Bitmapset *a, int prevbit)
Bitmapset * bms_add_member(Bitmapset *a, int x)
#define OidIsValid(objectId)
int32 anytime_typmod_check(bool istz, int32 typmod)
int errmsg_internal(const char *fmt,...)
int errdetail(const char *fmt,...)
int errhint(const char *fmt,...)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
void err(int eval, const char *fmt,...)
#define DirectFunctionCall1(func, arg1)
Assert(PointerIsAligned(start, uint64))
#define MaxTupleAttributeNumber
if(TABLE==NULL||TABLE_index==NULL)
Datum jsonb_in(PG_FUNCTION_ARGS)
List * lappend(List *list, void *datum)
List * list_concat(List *list1, const List *list2)
List * lappend_oid(List *list, Oid datum)
List * lcons(void *datum, List *list)
List * list_delete_last(List *list)
List * list_truncate(List *list, int new_size)
Oid get_element_type(Oid typid)
bool type_is_rowtype(Oid typid)
char * get_database_name(Oid dbid)
List * get_op_index_interpretation(Oid opno)
bool type_is_collatable(Oid typid)
char get_typtype(Oid typid)
Oid getBaseTypeAndTypmod(Oid typid, int32 *typmod)
Oid getBaseType(Oid typid)
Oid get_array_type(Oid typid)
void get_type_category_preferred(Oid typid, char *typcategory, bool *typispreferred)
#define type_is_array(typid)
Expr * makeBoolExpr(BoolExprType boolop, List *args, int location)
JsonBehavior * makeJsonBehavior(JsonBehaviorType btype, Node *expr, int location)
A_Expr * makeSimpleA_Expr(A_Expr_Kind kind, char *name, Node *lexpr, Node *rexpr, int location)
Var * makeWholeRowVar(RangeTblEntry *rte, int varno, Index varlevelsup, bool allowScalar)
Node * makeBoolConst(bool value, bool isnull)
RangeVar * makeRangeVar(char *schemaname, char *relname, int location)
TargetEntry * makeTargetEntry(Expr *expr, AttrNumber resno, char *resname, bool resjunk)
FuncExpr * makeFuncExpr(Oid funcid, Oid rettype, List *args, Oid funccollid, Oid inputcollid, CoercionForm fformat)
JsonValueExpr * makeJsonValueExpr(Expr *raw_expr, Expr *formatted_expr, JsonFormat *format)
JsonFormat * makeJsonFormat(JsonFormatType type, JsonEncoding encoding, int location)
Const * makeConst(Oid consttype, int32 consttypmod, Oid constcollid, int constlen, Datum constvalue, bool constisnull, bool constbyval)
Node * makeJsonIsPredicate(Node *expr, JsonFormat *format, JsonValueType item_type, bool unique_keys, int location)
char * pstrdup(const char *in)
void namestrcpy(Name name, const char *str)
char * NameListToString(const List *names)
Oid exprType(const Node *expr)
int32 exprTypmod(const Node *expr)
Oid exprCollation(const Node *expr)
int exprLocation(const Node *expr)
bool expression_returns_set(Node *clause)
#define expression_tree_walker(n, w, c)
#define IsA(nodeptr, _type_)
#define NodeSetTag(nodeptr, t)
#define castNode(_type_, nodeptr)
Node * transformGroupingFunc(ParseState *pstate, GroupingFunc *p)
void transformWindowFuncCall(ParseState *pstate, WindowFunc *wfunc, WindowDef *windef)
void transformAggregateCall(ParseState *pstate, Aggref *agg, List *args, List *aggorder, bool agg_distinct)
Node * transformWhereClause(ParseState *pstate, Node *clause, ParseExprKind exprKind, const char *constructName)
TYPCATEGORY TypeCategory(Oid type)
Node * coerce_to_common_type(ParseState *pstate, Node *node, Oid targetTypeId, const char *context)
bool verify_common_type(Oid common_type, List *exprs)
int parser_coercion_errposition(ParseState *pstate, int coerce_location, Node *input_expr)
Node * coerce_to_specific_type(ParseState *pstate, Node *node, Oid targetTypeId, const char *constructName)
Node * coerce_type(ParseState *pstate, Node *node, Oid inputTypeId, Oid targetTypeId, int32 targetTypeMod, CoercionContext ccontext, CoercionForm cformat, int location)
Node * coerce_to_boolean(ParseState *pstate, Node *node, const char *constructName)
Oid select_common_type(ParseState *pstate, List *exprs, const char *context, Node **which_expr)
Node * coerce_to_target_type(ParseState *pstate, Node *expr, Oid exprtype, Oid targettype, int32 targettypmod, CoercionContext ccontext, CoercionForm cformat, int location)
void assign_expr_collations(ParseState *pstate, Node *expr)
static Node * transformMergeSupportFunc(ParseState *pstate, MergeSupportFunc *f)
static Node * make_nulltest_from_distinct(ParseState *pstate, A_Expr *distincta, Node *arg)
static void unknown_attribute(ParseState *pstate, Node *relref, const char *attname, int location)
static Node * transformJsonArrayConstructor(ParseState *pstate, JsonArrayConstructor *ctor)
static Node * transformCurrentOfExpr(ParseState *pstate, CurrentOfExpr *cexpr)
static Node * transformAExprOpAll(ParseState *pstate, A_Expr *a)
static Node * makeJsonByteaToTextConversion(Node *expr, JsonFormat *format, int location)
static Node * transformJsonParseExpr(ParseState *pstate, JsonParseExpr *jsexpr)
static Node * transformAExprIn(ParseState *pstate, A_Expr *a)
static JsonReturning * transformJsonOutput(ParseState *pstate, const JsonOutput *output, bool allow_format)
static void checkJsonOutputFormat(ParseState *pstate, const JsonFormat *format, Oid targettype, bool allow_format_for_non_strings)
static Node * transformJsonParseArg(ParseState *pstate, Node *jsexpr, JsonFormat *format, Oid *exprtype)
static Node * makeJsonConstructorExpr(ParseState *pstate, JsonConstructorType type, List *args, Expr *fexpr, JsonReturning *returning, bool unique, bool absent_on_null, int location)
static Node * transformAExprOpAny(ParseState *pstate, A_Expr *a)
static Node * transformXmlSerialize(ParseState *pstate, XmlSerialize *xs)
static Node * transformExprRecurse(ParseState *pstate, Node *expr)
static Node * transformAExprNullIf(ParseState *pstate, A_Expr *a)
Node * transformExpr(ParseState *pstate, Node *expr, ParseExprKind exprKind)
static Node * transformJsonScalarExpr(ParseState *pstate, JsonScalarExpr *jsexpr)
static bool exprIsNullConstant(Node *arg)
static Expr * make_distinct_op(ParseState *pstate, List *opname, Node *ltree, Node *rtree, int location)
static Node * transformJsonArrayQueryConstructor(ParseState *pstate, JsonArrayQueryConstructor *ctor)
static Node * transformSQLValueFunction(ParseState *pstate, SQLValueFunction *svf)
static Node * transformColumnRef(ParseState *pstate, ColumnRef *cref)
static Node * transformCollateClause(ParseState *pstate, CollateClause *c)
static Node * transformBoolExpr(ParseState *pstate, BoolExpr *a)
static bool ValidJsonBehaviorDefaultExpr(Node *expr, void *context)
static Node * transformFuncCall(ParseState *pstate, FuncCall *fn)
static JsonReturning * transformJsonConstructorOutput(ParseState *pstate, JsonOutput *output, List *args)
static Node * transformMinMaxExpr(ParseState *pstate, MinMaxExpr *m)
static Node * transformJsonAggConstructor(ParseState *pstate, JsonAggConstructor *agg_ctor, JsonReturning *returning, List *args, Oid aggfnoid, Oid aggtype, JsonConstructorType ctor_type, bool unique, bool absent_on_null)
static Node * transformCoalesceExpr(ParseState *pstate, CoalesceExpr *c)
bool Transform_null_equals
static Node * transformSubLink(ParseState *pstate, SubLink *sublink)
static void transformJsonPassingArgs(ParseState *pstate, const char *constructName, JsonFormatType format, List *args, List **passing_values, List **passing_names)
static Node * transformJsonObjectConstructor(ParseState *pstate, JsonObjectConstructor *ctor)
static Node * make_row_comparison_op(ParseState *pstate, List *opname, List *largs, List *rargs, int location)
static JsonReturning * transformJsonReturning(ParseState *pstate, JsonOutput *output, const char *fname)
static Node * transformAExprOp(ParseState *pstate, A_Expr *a)
static Node * GetJsonBehaviorConst(JsonBehaviorType btype, int location)
static JsonBehavior * transformJsonBehavior(ParseState *pstate, JsonBehavior *behavior, JsonBehaviorType default_behavior, JsonReturning *returning)
static Node * transformJsonArrayAgg(ParseState *pstate, JsonArrayAgg *agg)
static Node * transformArrayExpr(ParseState *pstate, A_ArrayExpr *a, Oid array_type, Oid element_type, int32 typmod)
static Node * transformMultiAssignRef(ParseState *pstate, MultiAssignRef *maref)
static Node * transformBooleanTest(ParseState *pstate, BooleanTest *b)
static Node * make_row_distinct_op(ParseState *pstate, List *opname, RowExpr *lrow, RowExpr *rrow, int location)
static Node * transformTypeCast(ParseState *pstate, TypeCast *tc)
static Node * transformJsonValueExpr(ParseState *pstate, const char *constructName, JsonValueExpr *ve, JsonFormatType default_format, Oid targettype, bool isarg)
static Node * transformParamRef(ParseState *pstate, ParamRef *pref)
static Node * transformCaseExpr(ParseState *pstate, CaseExpr *c)
static Node * transformIndirection(ParseState *pstate, A_Indirection *ind)
static Node * coerceJsonFuncExpr(ParseState *pstate, Node *expr, const JsonReturning *returning, bool report_error)
static Node * transformJsonSerializeExpr(ParseState *pstate, JsonSerializeExpr *expr)
static Node * transformRowExpr(ParseState *pstate, RowExpr *r, bool allowDefault)
static Node * transformXmlExpr(ParseState *pstate, XmlExpr *x)
static Const * getJsonEncodingConst(JsonFormat *format)
static Node * transformAExprBetween(ParseState *pstate, A_Expr *a)
static Node * transformWholeRowRef(ParseState *pstate, ParseNamespaceItem *nsitem, int sublevels_up, int location)
const char * ParseExprKindName(ParseExprKind exprKind)
static Node * transformJsonFuncExpr(ParseState *pstate, JsonFuncExpr *func)
static Node * transformJsonIsPredicate(ParseState *pstate, JsonIsPredicate *pred)
static Node * transformJsonObjectAgg(ParseState *pstate, JsonObjectAgg *agg)
static Node * transformAExprDistinct(ParseState *pstate, A_Expr *a)
Node * ParseFuncOrColumn(ParseState *pstate, List *funcname, List *fargs, Node *last_srf, FuncCall *fn, bool proc_call, int location)
void free_parsestate(ParseState *pstate)
int parser_errposition(ParseState *pstate, int location)
SubscriptingRef * transformContainerSubscripts(ParseState *pstate, Node *containerBase, Oid containerType, int32 containerTypMod, List *indirection, bool isAssignment)
Const * make_const(ParseState *pstate, A_Const *aconst)
ParseState * make_parsestate(ParseState *parentParseState)
@ EXPR_KIND_EXECUTE_PARAMETER
@ EXPR_KIND_COLUMN_DEFAULT
@ EXPR_KIND_STATS_EXPRESSION
@ EXPR_KIND_INDEX_EXPRESSION
@ EXPR_KIND_MERGE_RETURNING
@ EXPR_KIND_PARTITION_BOUND
@ EXPR_KIND_FUNCTION_DEFAULT
@ EXPR_KIND_WINDOW_FRAME_RANGE
@ EXPR_KIND_FROM_SUBSELECT
@ EXPR_KIND_WINDOW_FRAME_GROUPS
@ EXPR_KIND_PARTITION_EXPRESSION
@ EXPR_KIND_INDEX_PREDICATE
@ EXPR_KIND_INSERT_TARGET
@ EXPR_KIND_ALTER_COL_TRANSFORM
@ EXPR_KIND_UPDATE_TARGET
@ EXPR_KIND_SELECT_TARGET
@ EXPR_KIND_GENERATED_COLUMN
@ EXPR_KIND_CALL_ARGUMENT
@ EXPR_KIND_FROM_FUNCTION
@ EXPR_KIND_UPDATE_SOURCE
@ EXPR_KIND_CHECK_CONSTRAINT
@ EXPR_KIND_WINDOW_PARTITION
@ EXPR_KIND_WINDOW_FRAME_ROWS
@ EXPR_KIND_VALUES_SINGLE
Expr * make_op(ParseState *pstate, List *opname, Node *ltree, Node *rtree, Node *last_srf, int location)
Expr * make_scalar_array_op(ParseState *pstate, List *opname, bool useOr, Node *ltree, Node *rtree, int location)
void markNullableIfNeeded(ParseState *pstate, Var *var)
void errorMissingColumn(ParseState *pstate, const char *relname, const char *colname, int location)
Node * colNameToVar(ParseState *pstate, const char *colname, bool localonly, int location)
void markVarForSelectPriv(ParseState *pstate, Var *var)
void errorMissingRTE(ParseState *pstate, RangeVar *relation)
void expandRTE(RangeTblEntry *rte, int rtindex, int sublevels_up, VarReturningType returning_type, int location, bool include_dropped, List **colnames, List **colvars)
Node * scanNSItemForColumn(ParseState *pstate, ParseNamespaceItem *nsitem, int sublevels_up, const char *colname, int location)
ParseNamespaceItem * refnameNamespaceItem(ParseState *pstate, const char *schemaname, const char *refname, int location, int *sublevels_up)
RangeTblEntry * GetRTEByRangeTablePosn(ParseState *pstate, int varno, int sublevels_up)
List * transformExpressionList(ParseState *pstate, List *exprlist, ParseExprKind exprKind, bool allowDefault)
char * FigureColname(Node *node)
Oid LookupCollation(ParseState *pstate, List *collnames, int location)
void typenameTypeIdAndMod(ParseState *pstate, const TypeName *typeName, Oid *typeid_p, int32 *typmod_p)
#define ISCOMPLEX(typeid)
Query * parse_sub_analyze(Node *parseTree, ParseState *parentParseState, CommonTableExpr *parentCTE, bool locked_from_parent, bool resolve_unknowns)
Query * transformStmt(ParseState *pstate, Node *parseTree)
#define lfirst_node(type, lc)
static int list_length(const List *l)
#define forboth(cell1, list1, cell2, list2)
static void * list_nth(const List *list, int n)
#define list_make2(x1, x2)
static Datum BoolGetDatum(bool X)
static Datum NameGetDatum(const NameData *X)
static Datum CStringGetDatum(const char *X)
@ SVFOP_CURRENT_TIMESTAMP
@ SVFOP_CURRENT_TIMESTAMP_N
@ JSON_BEHAVIOR_EMPTY_OBJECT
@ JSON_BEHAVIOR_EMPTY_ARRAY
static int cmp(const chr *x, const chr *y, size_t len)
static struct cvec * range(struct vars *v, chr a, chr b, int cases)
static chr element(struct vars *v, const chr *startp, const chr *endp)
void check_stack_depth(void)
JsonAggConstructor * constructor
JsonReturning * returning
JsonReturning * returning
JsonValueExpr * context_item
JsonAggConstructor * constructor
JsonReturning * returning
NullTestType nulltesttype
VarReturningType p_returning_type
ParseState * parentParseState
ParseNamespaceItem * p_target_nsitem
ParseExprKind p_expr_kind
List * p_multiassign_exprs
ParseParamRefHook p_paramref_hook
PreParseColumnRefHook p_pre_columnref_hook
PostParseColumnRefHook p_post_columnref_hook
VarReturningType varreturningtype
static void * fn(void *arg)
int count_nonjunk_tlist_entries(List *tlist)
bool DomainHasConstraints(Oid type_id)
String * makeString(char *str)
bool contain_vars_of_level(Node *node, int levelsup)
bool contain_var_clause(Node *node)
#define select(n, r, w, e, timeout)
char * map_sql_identifier_to_xml_name(const char *ident, bool fully_escaped, bool escape_period)