71 bool isTopLevel,
List **targetlist);
88#ifdef DEBUG_NODE_TESTS_ENABLED
89static bool test_raw_expression_coverage(
Node *node,
void *context);
106 const Oid *paramTypes,
int numParams,
113 Assert(sourceText != NULL);
128 (*post_parse_analyze_hook) (pstate, query, jstate);
146 Oid **paramTypes,
int *numParams,
153 Assert(sourceText != NULL);
170 (*post_parse_analyze_hook) (pstate, query, jstate);
188 void *parserSetupArg,
195 Assert(sourceText != NULL);
199 (*parserSetup) (pstate, parserSetupArg);
207 (*post_parse_analyze_hook) (pstate, query, jstate);
224 bool locked_from_parent,
225 bool resolve_unknowns)
274 stmt_len = ((
InsertStmt *) parseTree)->stmt_len;
279 stmt_len = ((
DeleteStmt *) parseTree)->stmt_len;
284 stmt_len = ((
UpdateStmt *) parseTree)->stmt_len;
289 stmt_len = ((
MergeStmt *) parseTree)->stmt_len;
294 stmt_len = ((
SelectStmt *) parseTree)->stmt_len;
309 qry->stmt_len = stmt_len;
321 Assert(qry->stmt_len >= 0);
368 if (
stmt->intoClause)
372 ctas->
query = parseTree;
382 stmt->intoClause = NULL;
384 parseTree = (
Node *) ctas;
400#ifdef DEBUG_NODE_TESTS_ENABLED
408 if (Debug_raw_expression_coverage_test)
417 (void) test_raw_expression_coverage(parseTree, NULL);
476 case T_DeclareCursorStmt:
486 case T_CreateTableAsStmt:
510 result->canSetTag =
true;
554 case T_DeclareCursorStmt:
556 case T_CreateTableAsStmt:
619 case T_DeclareCursorStmt:
621 case T_CreateTableAsStmt:
647 if (
stmt->withClause)
649 qry->hasRecursive =
stmt->withClause->recursive;
715 bool isGeneralSelect;
717 List *sub_rteperminfos;
726 bool isOnConflictUpdate;
736 if (
stmt->withClause)
738 qry->hasRecursive =
stmt->withClause->recursive;
743 qry->override =
stmt->override;
745 isOnConflictUpdate = (
stmt->onConflictClause &&
757 isGeneralSelect = (selectStmt && (selectStmt->
valuesLists ==
NIL ||
785 sub_rteperminfos =
NIL;
796 if (isOnConflictUpdate)
799 false,
false, targetPerms);
808 if (selectStmt == NULL)
817 else if (isGeneralSelect)
857 elog(
ERROR,
"unexpected non-SELECT command in INSERT ... SELECT");
903 exprList =
lappend(exprList, expr);
924 int sublist_length = -1;
925 bool lateral =
false;
927 Assert(selectStmt->intoClause == NULL);
929 foreach(lc, selectStmt->valuesLists)
945 if (sublist_length < 0)
953 (
errcode(ERRCODE_SYNTAX_ERROR),
954 errmsg(
"VALUES lists must all be the same length"),
988 exprsLists =
lappend(exprsLists, sublist);
1021 coltypes, coltypmods, colcollations,
1022 NULL, lateral,
true);
1046 List *valuesLists = selectStmt->valuesLists;
1049 Assert(selectStmt->intoClause == NULL);
1071 perminfo = pstate->p_target_nsitem->p_perminfo;
1072 qry->targetList =
NIL;
1074 forthree(lc, exprList, icols, icolumns, attnos, attrnos)
1085 qry->targetList =
lappend(qry->targetList, tle);
1096 if (
stmt->onConflictClause ||
stmt->returningClause)
1098 pstate->p_namespace =
NIL;
1104 if (
stmt->onConflictClause)
1106 stmt->onConflictClause);
1109 if (
stmt->returningClause)
1114 qry->rtable = pstate->p_rtable;
1115 qry->rteperminfos = pstate->p_rteperminfos;
1116 qry->jointree =
makeFromExpr(pstate->p_joinlist, NULL);
1118 qry->hasTargetSRFs = pstate->p_hasTargetSRFs;
1119 qry->hasSubLinks = pstate->p_hasSubLinks;
1139 bool strip_indirection)
1155 (
errcode(ERRCODE_SYNTAX_ERROR),
1156 errmsg(
"INSERT has more expressions than target columns"),
1160 if (stmtcols !=
NIL &&
1173 (
errcode(ERRCODE_SYNTAX_ERROR),
1174 errmsg(
"INSERT has more target columns than expressions"),
1178 errhint(
"The insertion source is a row expression containing the same number of columns expected by the INSERT. Did you accidentally use extra parentheses?") : 0),
1188 forthree(lc, exprlist, icols, icolumns, attnos, attrnos)
1201 if (strip_indirection)
1210 Expr *subexpr = expr;
1236 result =
lappend(result, expr);
1253 Oid arbiterConstraint;
1255 Node *onConflictWhere = NULL;
1256 int exclRelIndex = 0;
1276 exclRte = exclNSItem->
p_rte;
1284 exclRte->relkind = RELKIND_COMPOSITE_TYPE;
1293 &arbiterWhere, &arbiterConstraint);
1371 if (attr->attisdropped)
1382 var =
makeVar(exclRelIndex, attno + 1,
1383 attr->atttypid, attr->atttypmod,
1405 targetrel->
rd_rel->reltype,
1435 if (
attnum > 0 && var->vartype == RECORDOID)
1446 if (ste == NULL || ste->resjunk)
1475 if (
stmt->withClause)
1477 qry->hasRecursive =
stmt->withClause->recursive;
1483 if (
stmt->intoClause)
1485 (
errcode(ERRCODE_SYNTAX_ERROR),
1486 errmsg(
"SELECT ... INTO is not allowed here"),
1535 if (
stmt->distinctClause ==
NIL)
1538 qry->hasDistinctOn =
false;
1547 qry->hasDistinctOn =
false;
1553 stmt->distinctClause,
1556 qry->hasDistinctOn =
true;
1586 foreach(l,
stmt->lockingClause)
1616 List **colexprs = NULL;
1617 int sublist_length = -1;
1618 bool lateral =
false;
1638 if (
stmt->withClause)
1640 qry->hasRecursive =
stmt->withClause->recursive;
1652 foreach(lc,
stmt->valuesLists)
1668 if (sublist_length < 0)
1678 (
errcode(ERRCODE_SYNTAX_ERROR),
1679 errmsg(
"VALUES lists must all be the same length"),
1686 foreach(lc2, sublist)
1690 colexprs[
i] =
lappend(colexprs[
i], col);
1715 for (
i = 0;
i < sublist_length;
i++)
1723 foreach(lc, colexprs[
i])
1736 colcollations =
lappend_oid(colcollations, colcoll);
1742 for (
i = 0;
i < sublist_length;
i++)
1744 forboth(lc, colexprs[
i], lc2, exprsLists)
1749 sublist =
lappend(sublist, col);
1769 coltypes, coltypmods, colcollations,
1770 NULL, lateral,
true);
1797 if (
stmt->lockingClause)
1799 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1802 errmsg(
"%s cannot be applied to VALUES",
1833 Query *leftmostQuery;
1838 List *lockingClause;
1849 int sv_rtable_length;
1865 leftmostSelect =
stmt->larg;
1866 while (leftmostSelect && leftmostSelect->
op !=
SETOP_NONE)
1867 leftmostSelect = leftmostSelect->
larg;
1869 leftmostSelect->
larg == NULL);
1872 (
errcode(ERRCODE_SYNTAX_ERROR),
1873 errmsg(
"SELECT ... INTO is not allowed here"),
1882 sortClause =
stmt->sortClause;
1883 limitOffset =
stmt->limitOffset;
1884 limitCount =
stmt->limitCount;
1885 lockingClause =
stmt->lockingClause;
1886 withClause =
stmt->withClause;
1889 stmt->limitOffset = NULL;
1890 stmt->limitCount = NULL;
1892 stmt->withClause = NULL;
1897 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1900 errmsg(
"%s is not allowed with UNION/INTERSECT/EXCEPT",
1902 linitial(lockingClause))->strength))));
1907 qry->hasRecursive = withClause->
recursive;
1923 node = sostmt->
larg;
1929 Assert(leftmostQuery != NULL);
1949 forfour(lct, sostmt->colTypes,
1950 lcm, sostmt->colTypmods,
1951 lcc, sostmt->colCollations,
1962 Assert(!lefttle->resjunk);
1963 colName =
pstrdup(lefttle->resname);
1976 targetvars =
lappend(targetvars, var);
1978 sortnscolumns[sortcolindex].
p_varno = leftmostRTI;
1980 sortnscolumns[sortcolindex].
p_vartype = colType;
1981 sortnscolumns[sortcolindex].
p_vartypmod = colTypmod;
1982 sortnscolumns[sortcolindex].
p_varcollid = colCollation;
1983 sortnscolumns[sortcolindex].
p_varnosyn = leftmostRTI;
2039 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
2040 errmsg(
"invalid UNION/INTERSECT/EXCEPT ORDER BY clause"),
2041 errdetail(
"Only result column names can be used, not expressions or functions."),
2042 errhint(
"Add the expression/function to every SELECT, or move the UNION into a FROM clause."),
2063 foreach(l, lockingClause)
2095 &sortop, &eqop, NULL,
2104 if (require_hash && (rescoltype == RECORDOID || rescoltype == RECORDARRAYOID))
2113 grpcl->hashable = hashable;
2134 bool isTopLevel,
List **targetlist)
2146 if (
stmt->intoClause)
2148 (
errcode(ERRCODE_SYNTAX_ERROR),
2149 errmsg(
"INTO is only allowed on first SELECT of UNION/INTERSECT/EXCEPT"),
2154 if (
stmt->lockingClause)
2156 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
2159 errmsg(
"%s is not allowed with UNION/INTERSECT/EXCEPT",
2177 if (
stmt->sortClause ||
stmt->limitOffset ||
stmt->limitCount ||
2178 stmt->lockingClause ||
stmt->withClause)
2188 char selectName[32];
2208 NULL,
false,
false);
2220 (
errcode(ERRCODE_INVALID_COLUMN_REFERENCE),
2221 errmsg(
"UNION/INTERSECT/EXCEPT member statement cannot refer to other relations of same query level"),
2237 *targetlist =
lappend(*targetlist, tle);
2244 snprintf(selectName,
sizeof(selectName),
"*SELECT* %d",
2257 return (
Node *) rtr;
2267 const char *context;
2291 if (isTopLevel && recursive)
2307 (
errcode(ERRCODE_SYNTAX_ERROR),
2308 errmsg(
"each %s query must have the same number of columns",
2316 op->colTypmods =
NIL;
2317 op->colCollations =
NIL;
2318 op->groupClauses =
NIL;
2319 forboth(ltl, ltargetlist, rtl, rtargetlist)
2367 if (lcoltype != UNKNOWNOID)
2369 rescoltype, context);
2374 rescoltype, context);
2378 if (rcoltype != UNKNOWNOID)
2380 rescoltype, context);
2385 rescoltype, context);
2407 op->colTypes =
lappend_oid(op->colTypes, rescoltype);
2408 op->colTypmods =
lappend_int(op->colTypmods, rescoltypmod);
2409 op->colCollations =
lappend_oid(op->colCollations, rescolcoll);
2427 op->groupClauses =
lappend(op->groupClauses,
2443 rescolnode->
typeId = rescoltype;
2444 rescolnode->typeMod = rescoltypmod;
2445 rescolnode->collation = rescolcoll;
2446 rescolnode->
location = bestlocation;
2451 *targetlist =
lappend(*targetlist, restle);
2468 Query *leftmostQuery;
2483 Assert(leftmostQuery != NULL);
2499 Assert(!lefttle->resjunk);
2500 colName =
pstrdup(lefttle->resname);
2505 targetList =
lappend(targetList, tle);
2523 qry->isReturn =
true;
2559 if (
stmt->withClause)
2561 qry->hasRecursive =
stmt->withClause->recursive;
2567 stmt->relation->inh,
2648 tle->resname = NULL;
2651 if (orig_tl == NULL)
2652 elog(
ERROR,
"UPDATE target count mismatch --- internal error");
2656 origTarget->
name,
true);
2659 (
errcode(ERRCODE_UNDEFINED_COLUMN),
2660 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
2665 errhint(
"SET target columns cannot be qualified with the relation name.") : 0,
2677 orig_tl =
lnext(origTlist, orig_tl);
2679 if (orig_tl != NULL)
2680 elog(
ERROR,
"UPDATE target count mismatch --- internal error");
2709 for (
int i = 0;
i < numattrs;
i++)
2710 nscolumns[
i].p_varreturningtype = returning_type;
2735 int save_next_resno;
2737 if (returningClause == NULL)
2749 if (qry->returningOldAlias != NULL)
2751 errcode(ERRCODE_SYNTAX_ERROR),
2753 errmsg(
"%s cannot be specified multiple times",
"OLD"),
2755 qry->returningOldAlias =
option->value;
2759 if (qry->returningNewAlias != NULL)
2761 errcode(ERRCODE_SYNTAX_ERROR),
2763 errmsg(
"%s cannot be specified multiple times",
"NEW"),
2765 qry->returningNewAlias =
option->value;
2774 errcode(ERRCODE_DUPLICATE_ALIAS),
2775 errmsg(
"table name \"%s\" specified more than once",
2788 if (qry->returningOldAlias == NULL &&
2791 qry->returningOldAlias =
"old";
2794 if (qry->returningNewAlias == NULL &&
2797 qry->returningNewAlias =
"new";
2811 returningClause->
exprs,
2822 (
errcode(ERRCODE_SYNTAX_ERROR),
2823 errmsg(
"RETURNING must have at least one column"),
2856 List *indirection =
stmt->indirection;
2857 int nnames =
stmt->nnames;
2862 Oid targetcollation;
2880 while (--nnames > 0 && indirection !=
NIL)
2885 elog(
ERROR,
"invalid name count in PLAssignStmt");
2924 (
errcode(ERRCODE_SYNTAX_ERROR),
2926 "assignment source returned %d columns",
2956 else if (targettype != type_id &&
2957 (targettype == RECORDOID ||
ISCOMPLEX(targettype)) &&
2958 (type_id == RECORDOID ||
ISCOMPLEX(type_id)))
2978 targettype, targettypmod,
2983 if (tle->
expr == NULL)
2985 (
errcode(ERRCODE_DATATYPE_MISMATCH),
2986 errmsg(
"variable \"%s\" is of type %s"
2987 " but expression is of type %s",
2991 errhint(
"You will need to rewrite or cast the expression."),
3030 qry->hasDistinctOn =
false;
3039 qry->hasDistinctOn =
false;
3048 qry->hasDistinctOn =
true;
3109 (
errcode(ERRCODE_INVALID_CURSOR_DEFINITION),
3111 errmsg(
"cannot specify both %s and %s",
3112 "SCROLL",
"NO SCROLL")));
3117 (
errcode(ERRCODE_INVALID_CURSOR_DEFINITION),
3119 errmsg(
"cannot specify both %s and %s",
3120 "ASENSITIVE",
"INSENSITIVE")));
3129 elog(
ERROR,
"unexpected non-SELECT command in DECLARE CURSOR");
3136 if (query->hasModifyingCTE)
3138 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3139 errmsg(
"DECLARE CURSOR must not contain data-modifying statements in WITH")));
3144 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3147 errmsg(
"DECLARE CURSOR WITH HOLD ... %s is not supported",
3150 errdetail(
"Holdable cursors must be READ ONLY.")));
3155 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3158 errmsg(
"DECLARE SCROLL CURSOR ... %s is not supported",
3161 errdetail(
"Scrollable cursors must be READ ONLY.")));
3166 (
errcode(ERRCODE_INVALID_CURSOR_DEFINITION),
3169 errmsg(
"DECLARE INSENSITIVE CURSOR ... %s is not valid",
3172 errdetail(
"Insensitive cursors must be READ ONLY.")));
3197 bool generic_plan =
false;
3198 Oid *paramTypes = NULL;
3210 foreach(lc,
stmt->options)
3214 if (strcmp(opt->
defname,
"generic_plan") == 0)
3263 if (query->hasModifyingCTE)
3265 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3266 errmsg(
"materialized views must not use data-modifying statements in WITH")));
3275 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3276 errmsg(
"materialized views must not use temporary tables or views")));
3285 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3286 errmsg(
"materialized views may not be defined using bound parameters")));
3295 if (
stmt->into->rel->relpersistence == RELPERSISTENCE_UNLOGGED)
3297 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3298 errmsg(
"materialized views cannot be unlogged")));
3338 foreach(lc,
stmt->funccall->args)
3346 stmt->funccall->funcname,
3351 stmt->funccall->location);
3369 fexpr->funcresulttype,
3374 Anum_pg_proc_proargmodes,
3394 elog(
ERROR,
"proargmodes is not a 1-D char array of length %d or it contains nulls",
3400 foreach(lc, fexpr->
args)
3404 switch (argmodes[
i])
3407 case PROARGMODE_VARIADIC:
3410 case PROARGMODE_OUT:
3411 outargs =
lappend(outargs, n);
3413 case PROARGMODE_INOUT:
3419 elog(
ERROR,
"invalid argmode %c for procedure",
3425 fexpr->
args = inargs;
3428 stmt->funcexpr = fexpr;
3429 stmt->outargs = outargs;
3454 return "FOR KEY SHARE";
3458 return "FOR NO KEY UPDATE";
3460 return "FOR UPDATE";
3477 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3480 errmsg(
"%s is not allowed with UNION/INTERSECT/EXCEPT",
3484 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3487 errmsg(
"%s is not allowed with DISTINCT clause",
3491 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3494 errmsg(
"%s is not allowed with GROUP BY clause",
3498 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3501 errmsg(
"%s is not allowed with HAVING clause",
3505 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3508 errmsg(
"%s is not allowed with aggregate functions",
3510 if (qry->hasWindowFuncs)
3512 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3515 errmsg(
"%s is not allowed with window functions",
3517 if (qry->hasTargetSRFs)
3519 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3522 errmsg(
"%s is not allowed with set-returning functions in the target list",
3552 if (lockedRels ==
NIL)
3611 foreach(l, lockedRels)
3618 (
errcode(ERRCODE_SYNTAX_ERROR),
3621 errmsg(
"%s must specify unqualified relation names",
3629 char *rtename = rte->eref->aliasname;
3644 if (rte->alias == NULL)
3648 if (rte->join_using_alias == NULL)
3650 rtename = rte->join_using_alias->aliasname;
3657 if (strcmp(rtename, thisrel->
relname) == 0)
3682 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3685 errmsg(
"%s cannot be applied to a join",
3691 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3694 errmsg(
"%s cannot be applied to a function",
3700 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3703 errmsg(
"%s cannot be applied to a table function",
3709 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3712 errmsg(
"%s cannot be applied to VALUES",
3718 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3721 errmsg(
"%s cannot be applied to a WITH query",
3727 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3730 errmsg(
"%s cannot be applied to a named tuplestore",
3738 elog(
ERROR,
"unrecognized RTE type: %d",
3750 errmsg(
"relation \"%s\" in %s clause not found in FROM clause",
3772 qry->hasForUpdate =
true;
3811#ifdef DEBUG_NODE_TESTS_ENABLED
3821test_raw_expression_coverage(
Node *node,
void *context)
3826 test_raw_expression_coverage,
void(* post_parse_analyze_hook_type)(ParseState *pstate, Query *query, JumbleState *jstate)
#define DatumGetArrayTypeP(X)
#define InvalidAttrNumber
void pgstat_report_query_id(uint64 query_id, bool force)
Bitmapset * bms_add_member(Bitmapset *a, int x)
List * expand_function_arguments(List *args, bool include_out_arguments, Oid result_type, HeapTuple func_tuple)
bool defGetBoolean(DefElem *def)
int errmsg_plural(const char *fmt_singular, const char *fmt_plural, unsigned long n,...)
int errdetail(const char *fmt,...)
int errhint(const char *fmt,...)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
Assert(PointerIsAligned(start, uint64))
#define HeapTupleIsValid(tuple)
if(TABLE==NULL||TABLE_index==NULL)
List * lappend(List *list, void *datum)
List * list_delete_first(List *list)
List * list_copy(const List *oldlist)
List * lappend_int(List *list, int datum)
List * lappend_oid(List *list, Oid datum)
List * list_delete_last(List *list)
void list_free(List *list)
List * list_truncate(List *list, int new_size)
Alias * makeAlias(const char *aliasname, List *colnames)
Var * makeVarFromTargetEntry(int varno, TargetEntry *tle)
FromExpr * makeFromExpr(List *fromlist, Node *quals)
Var * makeVar(int varno, AttrNumber varattno, Oid vartype, int32 vartypmod, Oid varcollid, Index varlevelsup)
Const * makeNullConst(Oid consttype, int32 consttypmod, Oid constcollid)
TargetEntry * makeTargetEntry(Expr *expr, AttrNumber resno, char *resname, bool resjunk)
char * pstrdup(const char *in)
void * palloc0(Size size)
Oid exprType(const Node *expr)
int32 exprTypmod(const Node *expr)
Oid exprCollation(const Node *expr)
int exprLocation(const Node *expr)
#define raw_expression_tree_walker(n, w, c)
#define IsA(nodeptr, _type_)
#define castNode(_type_, nodeptr)
void(* ParserSetupHook)(struct ParseState *pstate, void *arg)
void parseCheckAggregates(ParseState *pstate, Query *qry)
List * transformGroupClause(ParseState *pstate, List *grouplist, List **groupingSets, List **targetlist, List *sortClause, ParseExprKind exprKind, bool useSQL99)
Node * transformWhereClause(ParseState *pstate, Node *clause, ParseExprKind exprKind, const char *constructName)
List * transformSortClause(ParseState *pstate, List *orderlist, List **targetlist, ParseExprKind exprKind, bool useSQL99)
List * transformDistinctOnClause(ParseState *pstate, List *distinctlist, List **targetlist, List *sortClause)
List * transformWindowDefinitions(ParseState *pstate, List *windowdefs, List **targetlist)
void transformFromClause(ParseState *pstate, List *frmList)
List * transformDistinctClause(ParseState *pstate, List **targetlist, List *sortClause, bool is_agg)
Node * transformLimitClause(ParseState *pstate, Node *clause, ParseExprKind exprKind, const char *constructName, LimitOption limitOption)
void transformOnConflictArbiter(ParseState *pstate, OnConflictClause *onConflictClause, List **arbiterExpr, Node **arbiterWhere, Oid *constraint)
int setTargetTable(ParseState *pstate, RangeVar *relation, bool inh, bool alsoSource, AclMode requiredPerms)
Node * coerce_to_common_type(ParseState *pstate, Node *node, Oid targetTypeId, const char *context)
int32 select_common_typmod(ParseState *pstate, List *exprs, Oid common_type)
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_list_collations(ParseState *pstate, List *exprs)
Oid select_common_collation(ParseState *pstate, List *exprs, bool none_ok)
void assign_query_collations(ParseState *pstate, Query *query)
void assign_expr_collations(ParseState *pstate, Node *expr)
void analyzeCTETargetList(ParseState *pstate, CommonTableExpr *cte, List *tlist)
List * transformWithClause(ParseState *pstate, WithClause *withClause)
Node * transformExpr(ParseState *pstate, Node *expr, ParseExprKind exprKind)
Node * ParseFuncOrColumn(ParseState *pstate, List *funcname, List *fargs, Node *last_srf, FuncCall *fn, bool proc_call, int location)
Query * transformMergeStmt(ParseState *pstate, MergeStmt *stmt)
void cancel_parser_errposition_callback(ParseCallbackState *pcbstate)
void free_parsestate(ParseState *pstate)
int parser_errposition(ParseState *pstate, int location)
void setup_parser_errposition_callback(ParseCallbackState *pcbstate, ParseState *pstate, int location)
ParseState * make_parsestate(ParseState *parentParseState)
@ EXPR_KIND_INSERT_TARGET
@ EXPR_KIND_UPDATE_TARGET
@ EXPR_KIND_SELECT_TARGET
@ EXPR_KIND_CALL_ARGUMENT
@ EXPR_KIND_UPDATE_SOURCE
@ EXPR_KIND_VALUES_SINGLE
struct ParseNamespaceColumn ParseNamespaceColumn
void get_sort_group_operators(Oid argtype, bool needLT, bool needEQ, bool needGT, Oid *ltOpr, Oid *eqOpr, Oid *gtOpr, bool *isHashable)
void check_variable_parameters(ParseState *pstate, Query *query)
bool query_contains_extern_params(Query *query)
void setup_parse_variable_parameters(ParseState *pstate, Oid **paramTypes, int *numParams)
void setup_parse_fixed_parameters(ParseState *pstate, const Oid *paramTypes, int numParams)
ParseNamespaceItem * addRangeTableEntryForRelation(ParseState *pstate, Relation rel, int lockmode, Alias *alias, bool inh, bool inFromCl)
RTEPermissionInfo * getRTEPermissionInfo(List *rteperminfos, RangeTblEntry *rte)
RowMarkClause * get_parse_rowmark(Query *qry, Index rtindex)
TargetEntry * get_tle_by_resno(List *tlist, AttrNumber resno)
List * expandNSItemVars(ParseState *pstate, ParseNamespaceItem *nsitem, int sublevels_up, int location, List **colnames)
void addNSItemToQuery(ParseState *pstate, ParseNamespaceItem *nsitem, bool addToJoinList, bool addToRelNameSpace, bool addToVarNameSpace)
ParseNamespaceItem * addRangeTableEntryForSubquery(ParseState *pstate, Query *subquery, Alias *alias, bool lateral, bool inFromCl)
ParseNamespaceItem * addRangeTableEntryForJoin(ParseState *pstate, List *colnames, ParseNamespaceColumn *nscolumns, JoinType jointype, int nummergedcols, List *aliasvars, List *leftcols, List *rightcols, Alias *join_using_alias, Alias *alias, bool inFromCl)
List * expandNSItemAttrs(ParseState *pstate, ParseNamespaceItem *nsitem, int sublevels_up, bool require_col_privs, int location)
bool isQueryUsingTempRelation(Query *query)
ParseNamespaceItem * refnameNamespaceItem(ParseState *pstate, const char *schemaname, const char *refname, int location, int *sublevels_up)
RangeTblEntry * GetRTEByRangeTablePosn(ParseState *pstate, int varno, int sublevels_up)
int attnameAttNum(Relation rd, const char *attname, bool sysColOK)
ParseNamespaceItem * addRangeTableEntryForValues(ParseState *pstate, List *exprs, List *coltypes, List *coltypmods, List *colcollations, Alias *alias, bool lateral, bool inFromCl)
Expr * transformAssignedExpr(ParseState *pstate, Expr *expr, ParseExprKind exprKind, const char *colname, int attrno, List *indirection, int location)
List * transformExpressionList(ParseState *pstate, List *exprlist, ParseExprKind exprKind, bool allowDefault)
Node * transformAssignmentIndirection(ParseState *pstate, Node *basenode, const char *targetName, bool targetIsSubscripting, Oid targetTypeId, int32 targetTypMod, Oid targetCollation, List *indirection, ListCell *indirection_cell, Node *rhs, CoercionContext ccontext, int location)
void updateTargetListEntry(ParseState *pstate, TargetEntry *tle, char *colname, int attrno, List *indirection, int location)
List * transformTargetList(ParseState *pstate, List *targetlist, ParseExprKind exprKind)
void resolveTargetListUnknowns(ParseState *pstate, List *targetlist)
void markTargetListOrigins(ParseState *pstate, List *targetlist)
List * checkInsertTargets(ParseState *pstate, List *cols, List **attrnos)
#define ISCOMPLEX(typeid)
#define CURSOR_OPT_INSENSITIVE
#define CURSOR_OPT_SCROLL
#define ACL_SELECT_FOR_UPDATE
#define CURSOR_OPT_ASENSITIVE
#define CURSOR_OPT_NO_SCROLL
static OnConflictExpr * transformOnConflictClause(ParseState *pstate, OnConflictClause *onConflictClause)
static Query * transformOptionalSelectInto(ParseState *pstate, Node *parseTree)
static void transformLockingClause(ParseState *pstate, Query *qry, LockingClause *lc, bool pushedDown)
static void setQueryLocationAndLength(ParseState *pstate, Query *qry, Node *parseTree)
static Query * transformDeleteStmt(ParseState *pstate, DeleteStmt *stmt)
void CheckSelectLocking(Query *qry, LockClauseStrength strength)
SortGroupClause * makeSortGroupClauseForSetOp(Oid rescoltype, bool require_hash)
static Node * transformSetOperationTree(ParseState *pstate, SelectStmt *stmt, bool isTopLevel, List **targetlist)
Query * parse_analyze_withcb(RawStmt *parseTree, const char *sourceText, ParserSetupHook parserSetup, void *parserSetupArg, QueryEnvironment *queryEnv)
bool analyze_requires_snapshot(RawStmt *parseTree)
List * transformInsertRow(ParseState *pstate, List *exprlist, List *stmtcols, List *icolumns, List *attrnos, bool strip_indirection)
void applyLockingClause(Query *qry, Index rtindex, LockClauseStrength strength, LockWaitPolicy waitPolicy, bool pushedDown)
static void determineRecursiveColTypes(ParseState *pstate, Node *larg, List *nrtargetlist)
static Query * transformReturnStmt(ParseState *pstate, ReturnStmt *stmt)
static void addNSItemForReturning(ParseState *pstate, const char *aliasname, VarReturningType returning_type)
void transformReturningClause(ParseState *pstate, Query *qry, ReturningClause *returningClause, ParseExprKind exprKind)
static Query * transformPLAssignStmt(ParseState *pstate, PLAssignStmt *stmt)
static Query * transformCreateTableAsStmt(ParseState *pstate, CreateTableAsStmt *stmt)
post_parse_analyze_hook_type post_parse_analyze_hook
static Query * transformCallStmt(ParseState *pstate, CallStmt *stmt)
List * transformUpdateTargetList(ParseState *pstate, List *origTlist)
static Query * transformSetOperationStmt(ParseState *pstate, SelectStmt *stmt)
bool query_requires_rewrite_plan(Query *query)
Query * transformTopLevelStmt(ParseState *pstate, RawStmt *parseTree)
const char * LCS_asString(LockClauseStrength strength)
Query * parse_analyze_fixedparams(RawStmt *parseTree, const char *sourceText, const Oid *paramTypes, int numParams, QueryEnvironment *queryEnv)
static Query * transformUpdateStmt(ParseState *pstate, UpdateStmt *stmt)
static Query * transformSelectStmt(ParseState *pstate, SelectStmt *stmt)
Query * parse_sub_analyze(Node *parseTree, ParseState *parentParseState, CommonTableExpr *parentCTE, bool locked_from_parent, bool resolve_unknowns)
static Query * transformExplainStmt(ParseState *pstate, ExplainStmt *stmt)
List * BuildOnConflictExcludedTargetlist(Relation targetrel, Index exclRelIndex)
static int count_rowexpr_columns(ParseState *pstate, Node *expr)
Query * parse_analyze_varparams(RawStmt *parseTree, const char *sourceText, Oid **paramTypes, int *numParams, QueryEnvironment *queryEnv)
bool stmt_requires_parse_analysis(RawStmt *parseTree)
static Query * transformDeclareCursorStmt(ParseState *pstate, DeclareCursorStmt *stmt)
static Query * transformInsertStmt(ParseState *pstate, InsertStmt *stmt)
static Query * transformValuesClause(ParseState *pstate, SelectStmt *stmt)
Query * transformStmt(ParseState *pstate, Node *parseTree)
#define rt_fetch(rangetable_index, rangetable)
FormData_pg_attribute * Form_pg_attribute
#define lfirst_node(type, lc)
static int list_length(const List *l)
#define linitial_node(type, l)
#define forboth(cell1, list1, cell2, list2)
#define forthree(cell1, list1, cell2, list2, cell3, list3)
static void * list_nth(const List *list, int n)
#define foreach_node(type, var, lst)
#define forfour(cell1, list1, cell2, list2, cell3, list3, cell4, list4)
static ListCell * list_head(const List *l)
static ListCell * lnext(const List *l, const ListCell *c)
#define list_make2(x1, x2)
#define ERRCODE_UNDEFINED_TABLE
static Datum ObjectIdGetDatum(Oid X)
static bool IsQueryIdEnabled(void)
JumbleState * JumbleQuery(Query *query)
#define RelationGetNumberOfAttributes(relation)
#define RelationGetRelationName(relation)
void check_stack_depth(void)
LockClauseStrength strength
LockWaitPolicy waitPolicy
ParseNamespaceColumn * p_nscolumns
RTEPermissionInfo * p_perminfo
VarReturningType p_returning_type
ParseNamespaceItem * p_target_nsitem
ParseExprKind p_expr_kind
bool p_locked_from_parent
ParseParamRefHook p_paramref_hook
QueryEnvironment * p_queryEnv
const char * p_sourcetext
Relation p_target_relation
CommonTableExpr * p_parent_cte
LockClauseStrength strength
LockWaitPolicy waitPolicy
#define FirstLowInvalidHeapAttributeNumber
void ReleaseSysCache(HeapTuple tuple)
HeapTuple SearchSysCache1(int cacheId, Datum key1)
Datum SysCacheGetAttr(int cacheId, HeapTuple tup, AttrNumber attributeNumber, bool *isNull)
static FormData_pg_attribute * TupleDescAttr(TupleDesc tupdesc, int i)
String * makeString(char *str)
bool contain_vars_of_level(Node *node, int levelsup)
int locate_var_of_level(Node *node, int levelsup)