49 #define PREC_GROUP_POSTFIX_IS 1
50 #define PREC_GROUP_INFIX_IS 2
51 #define PREC_GROUP_LESS 3
52 #define PREC_GROUP_EQUAL 4
53 #define PREC_GROUP_LESS_EQUAL 5
54 #define PREC_GROUP_LIKE 6
55 #define PREC_GROUP_BETWEEN 7
56 #define PREC_GROUP_IN 8
57 #define PREC_GROUP_NOT_LIKE 9
58 #define PREC_GROUP_NOT_BETWEEN 10
59 #define PREC_GROUP_NOT_IN 11
60 #define PREC_GROUP_POSTFIX_OP 12
61 #define PREC_GROUP_INFIX_OP 13
62 #define PREC_GROUP_PREFIX_OP 14
84 0, 10, 10, 3, 2, 8, 4, 5, 6, 4, 5, 6, 7, 8, 9
87 0, 10, 10, 3, 2, 8, 4, 5, 6, 1, 1, 1, 7, 8, 9
122 List *largs,
List *rargs,
int location);
129 int opgroup,
const char *opname,
352 result = (
Node *) expr;
383 ((
Var *) relref)->varno,
384 ((
Var *) relref)->varlevelsup);
386 (
errcode(ERRCODE_UNDEFINED_COLUMN),
387 errmsg(
"column %s.%s does not exist",
398 (
errcode(ERRCODE_UNDEFINED_COLUMN),
399 errmsg(
"column \"%s\" not found in data type %s",
404 (
errcode(ERRCODE_UNDEFINED_COLUMN),
405 errmsg(
"could not identify column \"%s\" in record data type",
410 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
411 errmsg(
"column notation .%s applied to type %s, "
412 "which is not a composite type",
421 Node *result = basenode;
431 foreach(i, indirection)
436 subscripts =
lappend(subscripts, n);
440 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
441 errmsg(
"row expansion via \"*\" is not supported here"),
466 if (newresult ==
NULL)
493 char *nspname =
NULL;
495 char *colname =
NULL;
504 } crerr = CRERR_NO_COLUMN;
563 strcmp(colname,
"value") == 0)
609 crerr = CRERR_NO_RTE;
655 crerr = CRERR_NO_RTE;
704 crerr = CRERR_WRONG_DB;
714 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),
864 lexpr = ((
A_Expr *) lexpr)->lexpr;
867 rexpr = ((
A_Expr *) rexpr)->lexpr;
1041 (
errcode(ERRCODE_DATATYPE_MISMATCH),
1042 errmsg(
"NULLIF requires = operator to yield boolean"),
1055 return (
Node *) result;
1070 bool matched =
false;
1083 matched = (rtype == ltype);
1093 matched = (!matched);
1100 return (
Node *) result;
1141 rexprs = rvars = rnonvars =
NIL;
1146 rexprs =
lappend(rexprs, rexpr);
1148 rvars =
lappend(rvars, rexpr);
1150 rnonvars =
lappend(rnonvars, rexpr);
1193 foreach(l, rnonvars)
1200 aexprs =
lappend(aexprs, rexpr);
1397 foreach(lc, a->
args)
1417 foreach(args, fn->
args)
1463 if (maref->
colno == 1)
1475 (
errcode(ERRCODE_SYNTAX_ERROR),
1476 errmsg(
"number of columns does not match number of values"),
1522 return (
Node *) param;
1589 (
Node *) placeholder,
1603 newargs =
lappend(newargs, neww);
1607 newc->
args = newargs;
1611 if (defresult ==
NULL)
1617 defresult = (
Node *) n;
1641 foreach(l, newc->
args)
1654 return (
Node *) newc;
1705 err =
_(
"cannot use subquery in check constraint");
1709 err =
_(
"cannot use subquery in DEFAULT expression");
1712 err =
_(
"cannot use subquery in index expression");
1715 err =
_(
"cannot use subquery in index predicate");
1718 err =
_(
"cannot use subquery in transform expression");
1721 err =
_(
"cannot use subquery in EXECUTE parameter");
1724 err =
_(
"cannot use subquery in trigger WHEN condition");
1737 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1755 elog(
ERROR,
"unexpected non-SELECT command in SubLink");
1777 (
errcode(ERRCODE_SYNTAX_ERROR),
1778 errmsg(
"subquery must return only one column"),
1826 left_list = ((
RowExpr *) lefthand)->args;
1851 right_list =
lappend(right_list, param);
1861 (
errcode(ERRCODE_SYNTAX_ERROR),
1862 errmsg(
"subquery has too many columns"),
1866 (
errcode(ERRCODE_SYNTAX_ERROR),
1867 errmsg(
"subquery has too few columns"),
1946 newelems =
lappend(newelems, newe);
1959 coerce_type = (newa->
multidims ? array_type : element_type);
1965 if (newelems ==
NIL)
1967 (
errcode(ERRCODE_INDETERMINATE_DATATYPE),
1968 errmsg(
"cannot determine type of empty array"),
1969 errhint(
"Explicitly cast to the desired type, "
1970 "for example ARRAY[]::integer[]."),
1982 (
errcode(ERRCODE_UNDEFINED_OBJECT),
1983 errmsg(
"could not find element type for data type %s",
1993 (
errcode(ERRCODE_UNDEFINED_OBJECT),
1994 errmsg(
"could not find array type for data type %s",
1998 coerce_hard =
false;
2011 foreach(element, newelems)
2027 (
errcode(ERRCODE_CANNOT_COERCE),
2028 errmsg(
"cannot cast type %s to %s",
2037 newcoercedelems =
lappend(newcoercedelems, newe);
2046 return (
Node *) newa;
2069 foreach(lc, newr->
args)
2071 snprintf(fname,
sizeof(fname),
"f%d", fnum++);
2077 return (
Node *) newr;
2088 foreach(args, c->
args)
2094 newargs =
lappend(newargs, newe);
2101 foreach(args, newargs)
2109 newcoercedargs =
lappend(newcoercedargs, newe);
2112 newc->
args = newcoercedargs;
2114 return (
Node *) newc;
2123 const char *funcname = (m->
op ==
IS_GREATEST) ?
"GREATEST" :
"LEAST";
2127 foreach(args, m->
args)
2133 newargs =
lappend(newargs, newe);
2140 foreach(args, newargs)
2148 newcoercedargs =
lappend(newcoercedargs, newe);
2151 newm->
args = newcoercedargs;
2153 return (
Node *) newm;
2204 (
errcode(ERRCODE_SYNTAX_ERROR),
2206 ?
errmsg(
"unnamed XML attribute value must be a column reference")
2207 :
errmsg(
"unnamed XML element value must be a column reference"),
2221 (
errcode(ERRCODE_SYNTAX_ERROR),
2222 errmsg(
"XML attribute name \"%s\" appears more than once",
2235 foreach(lc, x->
args)
2289 return (
Node *) newx;
2312 xexpr->
type = targetType;
2313 xexpr->
typmod = targetTypmod;
2322 TEXTOID, targetType, targetTypmod,
2328 (
errcode(ERRCODE_CANNOT_COERCE),
2329 errmsg(
"cannot cast XMLSERIALIZE result to %s",
2338 const char *clausename;
2348 clausename =
"IS TRUE";
2351 clausename =
"IS NOT TRUE";
2354 clausename =
"IS FALSE";
2357 clausename =
"IS NOT FALSE";
2360 clausename =
"IS UNKNOWN";
2363 clausename =
"IS NOT UNKNOWN";
2366 elog(
ERROR,
"unrecognized booltesttype: %d",
2390 Assert(sublevels_up == 0);
2431 return (
Node *) cexpr;
2463 return (
Node *) result;
2493 arg = ((
A_Expr *) arg)->lexpr;
2505 int32 targetBaseTypmod;
2514 targetBaseTypmod = targetTypmod;
2545 targetType, targetTypmod,
2551 (
errcode(ERRCODE_CANNOT_COERCE),
2552 errmsg(
"cannot cast type %s to %s",
2582 (
errcode(ERRCODE_DATATYPE_MISMATCH),
2583 errmsg(
"collations are not supported by type %s",
2590 return (
Node *) newc;
2607 List *largs,
List *rargs,
int location)
2616 List **opinfo_lists;
2624 (
errcode(ERRCODE_SYNTAX_ERROR),
2625 errmsg(
"unequal number of entries in row expressions"),
2634 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
2635 errmsg(
"cannot compare rows of zero length"),
2649 cmp = (
OpExpr *)
make_op(pstate, opname, larg, rarg, location);
2659 (
errcode(ERRCODE_DATATYPE_MISMATCH),
2660 errmsg(
"row comparison operator must yield type boolean, "
2666 (
errcode(ERRCODE_DATATYPE_MISMATCH),
2667 errmsg(
"row comparison operator must not return a set"),
2669 opexprs =
lappend(opexprs, cmp);
2702 foreach(j, opinfo_lists[i])
2709 strats = this_strats;
2725 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
2726 errmsg(
"could not determine interpretation of row comparison operator %s",
2728 errhint(
"Row comparison operators must be associated with btree operator families."),
2747 for (i = 0; i < nopers; i++)
2752 foreach(j, opinfo_lists[i])
2766 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
2767 errmsg(
"could not determine interpretation of row comparison operator %s",
2769 errdetail(
"There are multiple equally-plausible candidates."),
2793 rcexpr->
opnos = opnos;
2796 rcexpr->
largs = largs;
2797 rcexpr->
rargs = rargs;
2799 return (
Node *) rcexpr;
2820 (
errcode(ERRCODE_SYNTAX_ERROR),
2821 errmsg(
"unequal number of entries in row expressions"),
2857 result =
make_op(pstate, opname, ltree, rtree, location);
2860 (
errcode(ERRCODE_DATATYPE_MISMATCH),
2861 errmsg(
"IS DISTINCT FROM requires = operator to yield boolean"),
2903 if (strcmp(*nodename,
"+") == 0 ||
2904 strcmp(*nodename,
"-") == 0 ||
2905 strcmp(*nodename,
"*") == 0 ||
2906 strcmp(*nodename,
"/") == 0 ||
2907 strcmp(*nodename,
"%") == 0 ||
2908 strcmp(*nodename,
"^") == 0)
2910 else if (strcmp(*nodename,
"<") == 0 ||
2911 strcmp(*nodename,
">") == 0)
2913 else if (strcmp(*nodename,
"=") == 0)
2915 else if (strcmp(*nodename,
"<=") == 0 ||
2916 strcmp(*nodename,
">=") == 0 ||
2917 strcmp(*nodename,
"<>") == 0)
2925 *nodename =
"OPERATOR()";
2938 if (strcmp(*nodename,
"+") == 0 ||
2939 strcmp(*nodename,
"-"))
2947 *nodename =
"OPERATOR()";
2964 *nodename =
"OPERATOR()";
3002 *nodename =
"ILIKE";
3010 *nodename =
"SIMILAR";
3125 int opgroup,
const char *opname,
3130 const char *copname;
3151 (
errmsg(
"operator precedence change: %s is now lower precedence than %s",
3169 (
errmsg(
"operator precedence change: %s is now lower precedence than %s",
3188 return "invalid expression context";
3190 return "extension expression";
3194 return "JOIN/USING";
3196 return "sub-SELECT in FROM";
3198 return "function in FROM";
3208 return "window PARTITION BY";
3210 return "window ORDER BY";
3212 return "window RANGE";
3214 return "window ROWS";
3227 return "DISTINCT ON";
3243 return "index expression";
3245 return "index predicate";
3260 return "unrecognized expression kind";
#define list_make2(x1, x2)
Node * scanRTEForColumn(ParseState *pstate, RangeTblEntry *rte, char *colname, int location, int fuzzy_rte_penalty, FuzzyAttrMatchState *fuzzystate)
Value * makeString(char *str)
static Node * transformAExprDistinct(ParseState *pstate, A_Expr *a)
static bool exprIsNullConstant(Node *arg)
static Node * transformExprRecurse(ParseState *pstate, Node *expr)
Oid getBaseTypeAndTypmod(Oid typid, int32 *typmod)
int bms_first_member(Bitmapset *a)
#define PREC_GROUP_PREFIX_OP
#define IsA(nodeptr, _type_)
#define PREC_GROUP_INFIX_OP
int errhint(const char *fmt,...)
static Node * transformCurrentOfExpr(ParseState *pstate, CurrentOfExpr *cexpr)
Expr * make_scalar_array_op(ParseState *pstate, List *opname, bool useOr, Node *ltree, Node *rtree, int location)
#define forboth(cell1, list1, cell2, list2)
static Node * transformAExprOpAny(ParseState *pstate, A_Expr *a)
int exprLocation(const Node *expr)
#define PREC_GROUP_POSTFIX_IS
static Node * transformMinMaxExpr(ParseState *pstate, MinMaxExpr *m)
void markVarForSelectPriv(ParseState *pstate, Var *var, RangeTblEntry *rte)
int32 exprTypmod(const Node *expr)
Oid get_element_type(Oid typid)
#define NodeSetTag(nodeptr, t)
Oid get_array_type(Oid typid)
Node * p_value_substitute
char * pstrdup(const char *in)
static int operator_precedence_group(Node *node, const char **nodename)
static Node * transformAExprNullIf(ParseState *pstate, A_Expr *a)
bool expression_returns_set(Node *clause)
Node * transformExpr(ParseState *pstate, Node *expr, ParseExprKind exprKind)
static Node * transformSubLink(ParseState *pstate, SubLink *sublink)
Node * coerce_type(ParseState *pstate, Node *node, Oid inputTypeId, Oid targetTypeId, int32 targetTypeMod, CoercionContext ccontext, CoercionForm cformat, int location)
Var * makeWholeRowVar(RangeTblEntry *rte, Index varno, Index varlevelsup, bool allowScalar)
int errcode(int sqlerrcode)
List * p_multiassign_exprs
static Expr * make_distinct_op(ParseState *pstate, List *opname, Node *ltree, Node *rtree, int location)
List * list_concat(List *list1, List *list2)
#define PREC_GROUP_INFIX_IS
int snprintf(char *str, size_t count, const char *fmt,...) pg_attribute_printf(3
Expr * make_op(ParseState *pstate, List *opname, Node *ltree, Node *rtree, int location)
Node * ParseFuncOrColumn(ParseState *pstate, List *funcname, List *fargs, FuncCall *fn, int location)
A_Expr * makeSimpleA_Expr(A_Expr_Kind kind, char *name, Node *lexpr, Node *rexpr, int location)
Const * make_const(ParseState *pstate, Value *value, int location)
static Node * transformBooleanTest(ParseState *pstate, BooleanTest *b)
static Node * transformIndirection(ParseState *pstate, Node *basenode, List *indirection)
static Node * transformXmlExpr(ParseState *pstate, XmlExpr *x)
List * lappend_oid(List *list, Oid datum)
#define OidIsValid(objectId)
RangeTblEntry * refnameRangeTblEntry(ParseState *pstate, const char *schemaname, const char *refname, int location, int *sublevels_up)
static Node * transformCoalesceExpr(ParseState *pstate, CoalesceExpr *c)
static Node * make_row_comparison_op(ParseState *pstate, List *opname, List *largs, List *rargs, int location)
const char * ParseExprKindName(ParseExprKind exprKind)
PostParseColumnRefHook p_post_columnref_hook
Expr * makeBoolExpr(BoolExprType boolop, List *args, int location)
void * copyObject(const void *from)
static char * relname(char const *dir, char const *base)
void assign_expr_collations(ParseState *pstate, Node *expr)
char * map_sql_identifier_to_xml_name(char *ident, bool fully_escaped, bool escape_period)
static Node * transformBoolExpr(ParseState *pstate, BoolExpr *a)
char * FigureColname(Node *node)
Node * coerce_to_target_type(ParseState *pstate, Node *expr, Oid exprtype, Oid targettype, int32 targettypmod, CoercionContext ccontext, CoercionForm cformat, int location)
#define PREC_GROUP_BETWEEN
Node * makeBoolConst(bool value, bool isnull)
#define PREC_GROUP_NOT_IN
static Node * transformArrayExpr(ParseState *pstate, A_ArrayExpr *a, Oid array_type, Oid element_type, int32 typmod)
static Node * transformAExprOpAll(ParseState *pstate, A_Expr *a)
char * get_database_name(Oid dbid)
static Node * transformFuncCall(ParseState *pstate, FuncCall *fn)
void * list_nth(const List *list, int n)
ParseParamRefHook p_paramref_hook
void check_stack_depth(void)
#define PREC_GROUP_NOT_LIKE
int errdetail(const char *fmt,...)
static Node * transformParamRef(ParseState *pstate, ParamRef *pref)
void errorMissingRTE(ParseState *pstate, RangeVar *relation)
A_Expr * makeA_Expr(A_Expr_Kind kind, List *name, Node *lexpr, Node *rexpr, int location)
static Node * transformAExprOf(ParseState *pstate, A_Expr *a)
bool type_is_rowtype(Oid typid)
#define ereport(elevel, rest)
TargetEntry * makeTargetEntry(Expr *expr, AttrNumber resno, char *resname, bool resjunk)
static Node * transformAExprOp(ParseState *pstate, A_Expr *a)
void errorMissingColumn(ParseState *pstate, char *relname, char *colname, int location)
Node * coerce_to_common_type(ParseState *pstate, Node *node, Oid targetTypeId, const char *context)
List * lappend(List *list, void *datum)
char * NameListToString(List *names)
static Node * transformMultiAssignRef(ParseState *pstate, MultiAssignRef *maref)
static Node * transformCollateClause(ParseState *pstate, CollateClause *c)
bool Transform_null_equals
List * get_op_btree_interpretation(Oid opno)
BoolTestType booltesttype
Node * transformGroupingFunc(ParseState *pstate, GroupingFunc *p)
RangeTblEntry * GetRTEByRangeTablePosn(ParseState *pstate, int varno, int sublevels_up)
RangeTblEntry * p_target_rangetblentry
bool operator_precedence_warning
static Node * make_row_distinct_op(ParseState *pstate, List *opname, RowExpr *lrow, RowExpr *rrow, int location)
static void emit_precedence_warnings(ParseState *pstate, int opgroup, const char *opname, Node *lchild, Node *rchild, int location)
static Node * transformWholeRowRef(ParseState *pstate, RangeTblEntry *rte, int location)
ParseExprKind p_expr_kind
NullTestType nulltesttype
void typenameTypeIdAndMod(ParseState *pstate, const TypeName *typeName, Oid *typeid_p, int32 *typmod_p)
Oid LookupCollation(ParseState *pstate, List *collnames, int location)
static void * fn(void *arg)
Node * colNameToVar(ParseState *pstate, char *colname, bool localonly, int location)
List * lcons(void *datum, List *list)
int errmsg_internal(const char *fmt,...)
#define Assert(condition)
bool contain_vars_of_level(Node *node, int levelsup)
static Node * transformRowExpr(ParseState *pstate, RowExpr *r)
#define ISCOMPLEX(typeid)
Oid exprType(const Node *expr)
static int list_length(const List *l)
int parser_errposition(ParseState *pstate, int location)
Oid exprCollation(const Node *expr)
#define type_is_array(typid)
Bitmapset * bms_add_member(Bitmapset *a, int x)
Query * parse_sub_analyze(Node *parseTree, ParseState *parentParseState, CommonTableExpr *parentCTE, bool locked_from_parent)
static Node * transformCaseExpr(ParseState *pstate, CaseExpr *c)
#define InvalidAttrNumber
int RTERangeTablePosn(ParseState *pstate, RangeTblEntry *rte, int *sublevels_up)
static Node * transformTypeCast(ParseState *pstate, TypeCast *tc)
static const int oldprecedence_l[]
static Node * transformColumnRef(ParseState *pstate, ColumnRef *cref)
int errmsg(const char *fmt,...)
static Node * transformXmlSerialize(ParseState *pstate, XmlSerialize *xs)
static const int oldprecedence_r[]
static void unknown_attribute(ParseState *pstate, Node *relref, char *attname, int location)
int parser_coercion_errposition(ParseState *pstate, int coerce_location, Node *input_expr)
#define PREC_GROUP_LESS_EQUAL
static celt element(struct vars *v, const chr *startp, const chr *endp)
int count_nonjunk_tlist_entries(List *tlist)
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)
PreParseColumnRefHook p_pre_columnref_hook
#define PREC_GROUP_POSTFIX_OP
List * transformExpressionList(ParseState *pstate, List *exprlist, ParseExprKind exprKind)
Bitmapset * bms_int_members(Bitmapset *a, const Bitmapset *b)
#define PREC_GROUP_NOT_BETWEEN
bool type_is_collatable(Oid typid)
ArrayRef * transformArraySubscripts(ParseState *pstate, Node *arrayBase, Oid arrayType, Oid elementType, int32 arrayTypMod, List *indirection, Node *assignFrom)
RangeVar * makeRangeVar(char *schemaname, char *relname, int location)
static Node * transformAExprBetween(ParseState *pstate, A_Expr *a)
static int cmp(const chr *x, const chr *y, size_t len)
Oid typenameTypeId(ParseState *pstate, const TypeName *typeName)
static Node * transformAExprIn(ParseState *pstate, A_Expr *a)
Node * coerce_to_boolean(ParseState *pstate, Node *node, const char *constructName)