71 int sublevels_up,
int location);
76 List *largs,
List *rargs,
int location);
134 case T_A_Indirection:
147 case T_CollateClause:
189 elog(
ERROR,
"unrecognized A_Expr kind: %d",
a->kind);
204 case T_MultiAssignRef:
264 case T_CurrentOfExpr:
274 (
errcode(ERRCODE_SYNTAX_ERROR),
275 errmsg(
"DEFAULT is not allowed in this context"),
293 result = (
Node *) expr;
324 ((
Var *) relref)->varno,
325 ((
Var *) relref)->varlevelsup);
327 (
errcode(ERRCODE_UNDEFINED_COLUMN),
328 errmsg(
"column %s.%s does not exist",
339 (
errcode(ERRCODE_UNDEFINED_COLUMN),
340 errmsg(
"column \"%s\" not found in data type %s",
343 else if (relTypeId == RECORDOID)
345 (
errcode(ERRCODE_UNDEFINED_COLUMN),
346 errmsg(
"could not identify column \"%s\" in record data type",
351 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
352 errmsg(
"column notation .%s applied to type %s, "
353 "which is not a composite type",
373 foreach(
i,
ind->indirection)
378 subscripts =
lappend(subscripts, n);
382 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
383 errmsg(
"row expansion via \"*\" is not supported here"),
409 if (newresult == NULL)
435 char *nspname = NULL;
437 char *colname = NULL;
446 } crerr = CRERR_NO_COLUMN;
505 err =
_(
"cannot use column reference in DEFAULT expression");
508 err =
_(
"cannot use column reference in partition bound expression");
521 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
605 crerr = CRERR_NO_RTE;
652 crerr = CRERR_NO_RTE;
701 crerr = CRERR_WRONG_DB;
711 crerr = CRERR_NO_RTE;
744 crerr = CRERR_TOO_MANY;
764 else if (hookresult != NULL)
766 (
errcode(ERRCODE_AMBIGUOUS_COLUMN),
767 errmsg(
"column reference \"%s\" is ambiguous",
779 case CRERR_NO_COLUMN:
788 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
789 errmsg(
"cross-database references are not implemented: %s",
795 (
errcode(ERRCODE_SYNTAX_ERROR),
796 errmsg(
"improper qualified name (too many dotted names): %s",
822 (
errcode(ERRCODE_UNDEFINED_PARAMETER),
846 Node *lexpr =
a->lexpr;
847 Node *rexpr =
a->rexpr;
888 s->operName =
a->name;
955 Node *lexpr =
a->lexpr;
956 Node *rexpr =
a->rexpr;
1020 if (result->opresulttype != BOOLOID)
1022 (
errcode(ERRCODE_DATATYPE_MISMATCH),
1023 errmsg(
"NULLIF requires = operator to yield boolean"),
1025 if (result->opretset)
1027 (
errcode(ERRCODE_DATATYPE_MISMATCH),
1029 errmsg(
"%s must not return a set",
"NULLIF"),
1042 return (
Node *) result;
1048 Node *result = NULL;
1076 rexprs = rvars = rnonvars =
NIL;
1077 foreach(l, (
List *)
a->rexpr)
1081 rexprs =
lappend(rexprs, rexpr);
1083 rvars =
lappend(rvars, rexpr);
1085 rnonvars =
lappend(rnonvars, rexpr);
1119 if (
OidIsValid(scalar_type) && scalar_type != RECORDOID)
1133 foreach(l, rnonvars)
1140 aexprs =
lappend(aexprs, rexpr);
1143 newa->array_typeid = array_type;
1145 newa->element_typeid = scalar_type;
1147 newa->multidims =
false;
1289 elog(
ERROR,
"unrecognized A_Expr kind: %d",
a->kind);
1316 elog(
ERROR,
"unrecognized boolop: %d", (
int)
a->boolop);
1321 foreach(lc,
a->args)
1356 if (
fn->agg_within_group)
1359 foreach(
args,
fn->agg_order)
1390 if (maref->
colno == 1)
1413 (
errcode(ERRCODE_SYNTAX_ERROR),
1414 errmsg(
"number of columns does not match number of values"),
1445 (
errcode(ERRCODE_SYNTAX_ERROR),
1446 errmsg(
"number of columns does not match number of values"),
1459 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1460 errmsg(
"source for a multiple-column UPDATE item must be a sub-SELECT or ROW() expression"),
1497 return (
Node *) param;
1522 elog(
ERROR,
"unexpected expr type in multiassign list");
1587 (
Node *) placeholder,
1601 newargs =
lappend(newargs, neww);
1605 newc->
args = newargs;
1608 defresult = (
Node *)
c->defresult;
1609 if (defresult == NULL)
1615 defresult = (
Node *) n;
1628 newc->casetype = ptype;
1639 foreach(l, newc->
args)
1653 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1655 errmsg(
"set-returning functions are not allowed in %s",
1657 errhint(
"You might be able to move the set-returning function into a LATERAL FROM item."),
1663 return (
Node *) newc;
1718 err =
_(
"cannot use subquery in check constraint");
1722 err =
_(
"cannot use subquery in DEFAULT expression");
1725 err =
_(
"cannot use subquery in index expression");
1728 err =
_(
"cannot use subquery in index predicate");
1731 err =
_(
"cannot use subquery in statistics expression");
1734 err =
_(
"cannot use subquery in transform expression");
1737 err =
_(
"cannot use subquery in EXECUTE parameter");
1740 err =
_(
"cannot use subquery in trigger WHEN condition");
1743 err =
_(
"cannot use subquery in partition bound");
1746 err =
_(
"cannot use subquery in partition key expression");
1749 err =
_(
"cannot use subquery in CALL argument");
1752 err =
_(
"cannot use subquery in COPY FROM WHERE condition");
1755 err =
_(
"cannot use subquery in column generation expression");
1768 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1785 elog(
ERROR,
"unexpected non-SELECT command in SubLink");
1796 sublink->operName =
NIL;
1807 (
errcode(ERRCODE_SYNTAX_ERROR),
1808 errmsg(
"subquery must return only one column"),
1816 sublink->operName =
NIL;
1822 sublink->operName =
NIL;
1835 if (sublink->operName ==
NIL)
1843 left_list = ((
RowExpr *) lefthand)->args;
1868 right_list =
lappend(right_list, param);
1878 (
errcode(ERRCODE_SYNTAX_ERROR),
1879 errmsg(
"subquery has too many columns"),
1883 (
errcode(ERRCODE_SYNTAX_ERROR),
1884 errmsg(
"subquery has too few columns"),
1925 newa->multidims =
false;
1944 newa->multidims =
true;
1955 newa->multidims =
true;
1958 newelems =
lappend(newelems, newe);
1971 coerce_type = (newa->multidims ? array_type : element_type);
1977 if (newelems ==
NIL)
1979 (
errcode(ERRCODE_INDETERMINATE_DATATYPE),
1980 errmsg(
"cannot determine type of empty array"),
1981 errhint(
"Explicitly cast to the desired type, "
1982 "for example ARRAY[]::integer[]."),
1988 if (newa->multidims)
1994 (
errcode(ERRCODE_UNDEFINED_OBJECT),
1995 errmsg(
"could not find element type for data type %s",
2005 (
errcode(ERRCODE_UNDEFINED_OBJECT),
2006 errmsg(
"could not find array type for data type %s",
2010 coerce_hard =
false;
2039 (
errcode(ERRCODE_CANNOT_COERCE),
2040 errmsg(
"cannot cast type %s to %s",
2049 newcoercedelems =
lappend(newcoercedelems, newe);
2052 newa->array_typeid = array_type;
2054 newa->element_typeid = element_type;
2058 return (
Node *) newa;
2077 (
errcode(ERRCODE_TOO_MANY_COLUMNS),
2078 errmsg(
"ROW expressions can have at most %d entries",
2083 newr->row_typeid = RECORDOID;
2087 newr->colnames =
NIL;
2090 snprintf(fname,
sizeof(fname),
"f%d", fnum);
2096 return (
Node *) newr;
2108 foreach(
args,
c->args)
2114 newargs =
lappend(newargs, newe);
2121 foreach(
args, newargs)
2129 newcoercedargs =
lappend(newcoercedargs, newe);
2135 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
2137 errmsg(
"set-returning functions are not allowed in %s",
2139 errhint(
"You might be able to move the set-returning function into a LATERAL FROM item."),
2143 newc->
args = newcoercedargs;
2145 return (
Node *) newc;
2164 newargs =
lappend(newargs, newe);
2171 foreach(
args, newargs)
2179 newcoercedargs =
lappend(newcoercedargs, newe);
2182 newm->
args = newcoercedargs;
2184 return (
Node *) newm;
2200 newx->xmloption =
x->xmloption;
2201 newx->type = XMLOID;
2210 newx->arg_names =
NIL;
2212 foreach(lc,
x->named_args)
2228 (
errcode(ERRCODE_SYNTAX_ERROR),
2230 ?
errmsg(
"unnamed XML attribute value must be a column reference")
2231 :
errmsg(
"unnamed XML element value must be a column reference"),
2241 foreach(lc2, newx->arg_names)
2245 (
errcode(ERRCODE_SYNTAX_ERROR),
2246 errmsg(
"XML attribute name \"%s\" appears more than once",
2259 foreach(lc,
x->args)
2313 return (
Node *) newx;
2337 xexpr->type = targetType;
2338 xexpr->typmod = targetTypmod;
2347 TEXTOID, targetType, targetTypmod,
2353 (
errcode(ERRCODE_CANNOT_COERCE),
2354 errmsg(
"cannot cast XMLSERIALIZE result to %s",
2363 const char *clausename;
2365 switch (
b->booltesttype)
2368 clausename =
"IS TRUE";
2371 clausename =
"IS NOT TRUE";
2374 clausename =
"IS FALSE";
2377 clausename =
"IS NOT FALSE";
2380 clausename =
"IS UNKNOWN";
2383 clausename =
"IS NOT UNKNOWN";
2386 elog(
ERROR,
"unrecognized booltesttype: %d",
2387 (
int)
b->booltesttype);
2432 if (node != NULL &&
IsA(node,
Param))
2446 return (
Node *) cexpr;
2454 int sublevels_up,
int location)
2477 sublevels_up,
true);
2488 return (
Node *) result;
2502 sublevels_up, location,
false,
2507 rowexpr->row_typeid = RECORDOID;
2514 return (
Node *) rowexpr;
2548 int32 targetBaseTypmod;
2557 targetBaseTypmod = targetTypmod;
2588 targetType, targetTypmod,
2594 (
errcode(ERRCODE_CANNOT_COERCE),
2595 errmsg(
"cannot cast type %s to %s",
2625 (
errcode(ERRCODE_DATATYPE_MISMATCH),
2626 errmsg(
"collations are not supported by type %s",
2633 return (
Node *) newc;
2650 List *largs,
List *rargs,
int location)
2659 List **opinfo_lists;
2667 (
errcode(ERRCODE_SYNTAX_ERROR),
2668 errmsg(
"unequal number of entries in row expressions"),
2677 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
2678 errmsg(
"cannot compare rows of zero length"),
2700 if (
cmp->opresulttype != BOOLOID)
2702 (
errcode(ERRCODE_DATATYPE_MISMATCH),
2703 errmsg(
"row comparison operator must yield type boolean, "
2709 (
errcode(ERRCODE_DATATYPE_MISMATCH),
2710 errmsg(
"row comparison operator must not return a set"),
2745 foreach(
j, opinfo_lists[
i])
2752 strats = this_strats;
2768 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
2769 errmsg(
"could not determine interpretation of row comparison operator %s",
2771 errhint(
"Row comparison operators must be associated with btree operator families."),
2790 for (
i = 0;
i < nopers;
i++)
2795 foreach(
j, opinfo_lists[
i])
2809 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
2810 errmsg(
"could not determine interpretation of row comparison operator %s",
2812 errdetail(
"There are multiple equally-plausible candidates."),
2836 rcexpr->opnos = opnos;
2837 rcexpr->opfamilies = opfamilies;
2838 rcexpr->inputcollids =
NIL;
2839 rcexpr->
largs = largs;
2840 rcexpr->
rargs = rargs;
2842 return (
Node *) rcexpr;
2855 Node *result = NULL;
2863 (
errcode(ERRCODE_SYNTAX_ERROR),
2864 errmsg(
"unequal number of entries in row expressions"),
2902 if (((
OpExpr *) result)->opresulttype != BOOLOID)
2904 (
errcode(ERRCODE_DATATYPE_MISMATCH),
2905 errmsg(
"IS DISTINCT FROM requires = operator to yield boolean"),
2907 if (((
OpExpr *) result)->opretset)
2909 (
errcode(ERRCODE_DATATYPE_MISMATCH),
2911 errmsg(
"%s must not return a set",
"IS DISTINCT FROM"),
2939 nt->argisrow =
false;
2957 return "invalid expression context";
2959 return "extension expression";
2963 return "JOIN/USING";
2965 return "sub-SELECT in FROM";
2967 return "function in FROM";
2977 return "window PARTITION BY";
2979 return "window ORDER BY";
2981 return "window RANGE";
2983 return "window ROWS";
2985 return "window GROUPS";
2994 return "MERGE WHEN";
3000 return "DISTINCT ON";
3017 return "index expression";
3019 return "index predicate";
3021 return "statistics expression";
3029 return "partition bound";
3031 return "PARTITION BY";
3037 return "GENERATED AS";
3048 return "unrecognized expression kind";
#define InvalidAttrNumber
int bms_next_member(const Bitmapset *a, int prevbit)
Bitmapset * bms_add_member(Bitmapset *a, int x)
Bitmapset * bms_int_members(Bitmapset *a, const Bitmapset *b)
#define OidIsValid(objectId)
char * get_database_name(Oid dbid)
elog(ERROR, "%s: %s", p2, msg)
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 MaxTupleAttributeNumber
if(TABLE==NULL||TABLE_index==NULL)
Assert(fmt[strlen(fmt) - 1] !='\n')
List * list_truncate(List *list, int new_size)
List * lappend(List *list, void *datum)
List * lappend_oid(List *list, Oid datum)
List * list_concat(List *list1, const List *list2)
List * lcons(void *datum, List *list)
List * list_delete_last(List *list)
Oid get_element_type(Oid typid)
bool type_is_rowtype(Oid typid)
List * get_op_btree_interpretation(Oid opno)
bool type_is_collatable(Oid typid)
Oid getBaseTypeAndTypmod(Oid typid, int32 *typmod)
Oid get_array_type(Oid typid)
#define type_is_array(typid)
Var * makeWholeRowVar(RangeTblEntry *rte, int varno, Index varlevelsup, bool allowScalar)
TargetEntry * makeTargetEntry(Expr *expr, AttrNumber resno, char *resname, bool resjunk)
RangeVar * makeRangeVar(char *schemaname, char *relname, int location)
Expr * makeBoolExpr(BoolExprType boolop, List *args, int location)
Node * makeBoolConst(bool value, bool isnull)
A_Expr * makeSimpleA_Expr(A_Expr_Kind kind, char *name, Node *lexpr, Node *rexpr, int location)
char * pstrdup(const char *in)
char * NameListToString(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 IsA(nodeptr, _type_)
#define NodeSetTag(nodeptr, t)
#define castNode(_type_, nodeptr)
Node * transformGroupingFunc(ParseState *pstate, GroupingFunc *p)
Node * coerce_to_common_type(ParseState *pstate, Node *node, Oid targetTypeId, const char *context)
Node * coerce_type(ParseState *pstate, Node *node, Oid inputTypeId, Oid targetTypeId, int32 targetTypeMod, CoercionContext ccontext, CoercionForm cformat, int location)
Node * coerce_to_target_type(ParseState *pstate, Node *expr, Oid exprtype, Oid targettype, int32 targettypmod, CoercionContext ccontext, CoercionForm cformat, int location)
bool verify_common_type(Oid common_type, List *exprs)
Node * coerce_to_boolean(ParseState *pstate, Node *node, const char *constructName)
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)
Oid select_common_type(ParseState *pstate, List *exprs, const char *context, Node **which_expr)
void assign_expr_collations(ParseState *pstate, Node *expr)
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 * transformCurrentOfExpr(ParseState *pstate, CurrentOfExpr *cexpr)
static Node * transformAExprOpAll(ParseState *pstate, A_Expr *a)
Node * transformExpr(ParseState *pstate, Node *expr, ParseExprKind exprKind)
static Node * transformAExprIn(ParseState *pstate, A_Expr *a)
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)
static bool exprIsNullConstant(Node *arg)
static Expr * make_distinct_op(ParseState *pstate, List *opname, Node *ltree, Node *rtree, int location)
static Node * transformColumnRef(ParseState *pstate, ColumnRef *cref)
static Node * transformCollateClause(ParseState *pstate, CollateClause *c)
static Node * transformBoolExpr(ParseState *pstate, BoolExpr *a)
static Node * transformFuncCall(ParseState *pstate, FuncCall *fn)
static Node * transformMinMaxExpr(ParseState *pstate, MinMaxExpr *m)
static Node * transformCoalesceExpr(ParseState *pstate, CoalesceExpr *c)
bool Transform_null_equals
static Node * transformSubLink(ParseState *pstate, SubLink *sublink)
static Node * make_row_comparison_op(ParseState *pstate, List *opname, List *largs, List *rargs, int location)
static Node * transformAExprOp(ParseState *pstate, A_Expr *a)
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 * transformParamRef(ParseState *pstate, ParamRef *pref)
static Node * transformCaseExpr(ParseState *pstate, CaseExpr *c)
static Node * transformIndirection(ParseState *pstate, A_Indirection *ind)
const char * ParseExprKindName(ParseExprKind exprKind)
static Node * transformRowExpr(ParseState *pstate, RowExpr *r, bool allowDefault)
static Node * transformXmlExpr(ParseState *pstate, XmlExpr *x)
static Node * transformAExprBetween(ParseState *pstate, A_Expr *a)
static Node * transformWholeRowRef(ParseState *pstate, ParseNamespaceItem *nsitem, int sublevels_up, int location)
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)
SubscriptingRef * transformContainerSubscripts(ParseState *pstate, Node *containerBase, Oid containerType, int32 containerTypMod, List *indirection, bool isAssignment)
int parser_errposition(ParseState *pstate, int location)
Const * make_const(ParseState *pstate, A_Const *aconst)
@ EXPR_KIND_EXECUTE_PARAMETER
@ EXPR_KIND_COLUMN_DEFAULT
@ EXPR_KIND_STATS_EXPRESSION
@ EXPR_KIND_INDEX_EXPRESSION
@ 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)
RangeTblEntry * GetRTEByRangeTablePosn(ParseState *pstate, int varno, int sublevels_up)
void errorMissingColumn(ParseState *pstate, const char *relname, const char *colname, int location)
void markVarForSelectPriv(ParseState *pstate, Var *var)
void errorMissingRTE(ParseState *pstate, RangeVar *relation)
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)
Node * colNameToVar(ParseState *pstate, const char *colname, bool localonly, int location)
void expandRTE(RangeTblEntry *rte, int rtindex, int sublevels_up, int location, bool include_dropped, List **colnames, List **colvars)
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)
#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)
void check_stack_depth(void)
static int cmp(const chr *x, const chr *y, size_t len)
static chr element(struct vars *v, const chr *startp, const chr *endp)
NullTestType nulltesttype
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
static void * fn(void *arg)
int count_nonjunk_tlist_entries(List *tlist)
String * makeString(char *str)
bool contain_vars_of_level(Node *node, int levelsup)
char * map_sql_identifier_to_xml_name(const char *ident, bool fully_escaped, bool escape_period)