53 #include "utils/fmgroids.h"
121 bool *haveNull,
bool *forceTrue);
124 bool *haveNull,
bool *forceFalse);
127 Oid result_type,
int32 result_typmod,
128 Oid result_collid,
Oid input_collid,
List **args_p,
129 bool funcvariadic,
bool process_args,
bool allow_non_const,
251 elog(
ERROR,
"WindowFunc contains out-of-range winref %u",
299 if (expr->funcretset)
402 foreach(lc, ctor->
args)
598 return (func_id != F_NEXTVAL &&
695 for (proot = root; proot != NULL; proot = proot->parent_root)
715 case PROPARALLEL_SAFE:
718 case PROPARALLEL_RESTRICTED:
726 case PROPARALLEL_UNSAFE:
731 elog(
ERROR,
"unrecognized proparallel value \"%c\"", proparallel);
822 List *save_safe_param_ids;
1103 #define CCDN_CASETESTEXPR_OK 0x0001
1123 int save_flags = *flags;
1138 *flags = save_flags;
1153 save_flags = *flags;
1157 *flags = save_flags;
1205 case T_NamedArgExpr:
1210 case T_CaseTestExpr:
1212 case T_SQLValueFunction:
1215 case T_NextValueExpr:
1226 case T_DistinctExpr:
1228 case T_ScalarArrayOpExpr:
1230 case T_ArrayCoerceExpr:
1242 case T_SubscriptingRef:
1262 case T_RowCompareExpr:
1275 larg, rcexpr->
largs,
1276 rarg, rcexpr->
rargs)
1318 case T_CurrentOfExpr:
1404 foreach(l, (
List *) node)
1463 foreach(l, expr->
args)
1657 foreach(l, (
List *) node)
1721 foreach(l, expr->
args)
1856 foreach(l, (
List *) node)
1952 if (expr->
useOr && falseOK)
1957 if (rightop &&
IsA(rightop,
Const))
1959 Datum arraydatum = ((
Const *) rightop)->constvalue;
1960 bool arrayisnull = ((
Const *) rightop)->constisnull;
1975 if (arrayexpr->
elements !=
NIL && !arrayexpr->multidims)
2072 elog(
ERROR,
"cannot commute non-binary-operator clause");
2077 elog(
ERROR,
"could not find commutator for operator %u",
2083 clause->
opno = opoid;
2104 Oid expectedtype,
int32 expectedtypmod,
2105 Oid expectedcollation)
2111 if (rowtypeid == RECORDOID)
2114 if (fieldnum <= 0 || fieldnum > tupdesc->
natts)
2120 if (attr->attisdropped ||
2121 attr->atttypid != expectedtype ||
2122 attr->atttypmod != expectedtypmod ||
2123 attr->attcollation != expectedcollation)
2179 context.
root = root;
2186 #define MIN_ARRAY_SIZE_FOR_HASHED_SAOP 9
2222 if (arrayarg &&
IsA(arrayarg,
Const) &&
2223 !((
Const *) arrayarg)->constisnull)
2228 lefthashfunc == righthashfunc)
2230 Datum arrdatum = ((
Const *) arrayarg)->constvalue;
2244 saop->hashfuncid = lefthashfunc;
2260 lefthashfunc == righthashfunc)
2262 Datum arrdatum = ((
Const *) arrayarg)->constvalue;
2276 saop->hashfuncid = lefthashfunc;
2318 context.
root = NULL;
2334 #define ece_generic_processing(node) \
2335 expression_tree_mutator((Node *) (node), eval_const_expressions_mutator, \
2343 #define ece_all_arguments_const(node) \
2344 (!expression_tree_walker((Node *) (node), contain_non_const_walker, NULL))
2347 #define ece_evaluate_expr(node) \
2348 ((Node *) evaluate_expr((Expr *) (node), \
2349 exprType((Node *) (node)), \
2350 exprTypmod((Node *) (node)), \
2351 exprCollation((Node *) (node))))
2414 &typLen, &typByVal);
2415 if (prm->
isnull || typByVal)
2427 return (
Node *) con;
2456 elog(
ERROR,
"cache lookup failed for function %u", funcid);
2459 false, expr->wintype,
2470 aggfilter = (
Expr *)
2477 newexpr->wintype = expr->wintype;
2478 newexpr->wincollid = expr->wincollid;
2479 newexpr->inputcollid = expr->inputcollid;
2483 newexpr->winstar = expr->winstar;
2484 newexpr->winagg = expr->winagg;
2487 return (
Node *) newexpr;
2504 expr->funcresulttype,
2514 return (
Node *) simple;
2524 newexpr->funcresulttype = expr->funcresulttype;
2525 newexpr->funcretset = expr->funcretset;
2526 newexpr->funcvariadic = expr->funcvariadic;
2527 newexpr->funcformat = expr->funcformat;
2528 newexpr->funccollid = expr->funccollid;
2529 newexpr->inputcollid = expr->inputcollid;
2532 return (
Node *) newexpr;
2552 expr->opresulttype, -1,
2561 return (
Node *) simple;
2568 if (expr->
opno == BooleanEqualOperator ||
2569 expr->
opno == BooleanNotEqualOperator)
2574 return (
Node *) simple;
2584 newexpr->opfuncid = expr->opfuncid;
2585 newexpr->opresulttype = expr->opresulttype;
2586 newexpr->opretset = expr->opretset;
2587 newexpr->opcollid = expr->opcollid;
2588 newexpr->inputcollid = expr->inputcollid;
2591 return (
Node *) newexpr;
2593 case T_DistinctExpr:
2598 bool has_null_input =
false;
2599 bool all_null_input =
true;
2600 bool has_nonconst_input =
false;
2627 has_nonconst_input =
true;
2631 if (!has_nonconst_input)
2656 expr->opresulttype, -1,
2672 csimple->constvalue =
2674 return (
Node *) csimple;
2685 newexpr->opfuncid = expr->opfuncid;
2686 newexpr->opresulttype = expr->opresulttype;
2687 newexpr->opretset = expr->opretset;
2688 newexpr->opcollid = expr->opcollid;
2689 newexpr->inputcollid = expr->inputcollid;
2692 return (
Node *) newexpr;
2698 bool has_nonconst_input =
false;
2707 has_nonconst_input =
true;
2718 if (!has_nonconst_input &&
2722 return (
Node *) expr;
2724 case T_ScalarArrayOpExpr:
2741 return (
Node *) saop;
2752 bool haveNull =
false;
2753 bool forceTrue =
false;
2780 bool haveNull =
false;
2781 bool forceFalse =
false;
2827 case T_JsonValueExpr:
2834 if (formatted &&
IsA(formatted,
Const))
2840 case T_AlternativeSubPlan:
2860 relabel->resulttypmod,
2861 relabel->resultcollid,
2862 relabel->relabelformat,
2871 bool outtypisvarlena;
2890 &outfunc, &outtypisvarlena);
2892 &infunc, &intypioparam);
2936 return (
Node *) simple;
2947 newexpr->resultcollid = expr->resultcollid;
2948 newexpr->coerceformat = expr->coerceformat;
2950 return (
Node *) newexpr;
2952 case T_ArrayCoerceExpr:
2955 Node *save_case_val;
3053 Node *save_case_val;
3056 bool const_true_cond;
3057 Node *defresult = NULL;
3076 const_true_cond =
false;
3092 if (casecond &&
IsA(casecond,
Const))
3096 if (const_input->constisnull ||
3100 const_true_cond =
true;
3108 if (!const_true_cond)
3112 newcasewhen->
expr = (
Expr *) casecond;
3115 newargs =
lappend(newargs, newcasewhen);
3124 defresult = caseresult;
3129 if (!const_true_cond)
3143 newcase->casetype = caseexpr->casetype;
3144 newcase->casecollid = caseexpr->casecollid;
3145 newcase->
arg = (
Expr *) newarg;
3146 newcase->
args = newargs;
3149 return (
Node *) newcase;
3151 case T_CaseTestExpr:
3163 case T_SubscriptingRef:
3190 case T_CoalesceExpr:
3198 foreach(
arg, coalesceexpr->
args)
3215 if (((
Const *)
e)->constisnull)
3232 coalesceexpr->coalescecollid);
3235 newcoalesce->coalescetype = coalesceexpr->coalescetype;
3236 newcoalesce->coalescecollid = coalesceexpr->coalescecollid;
3237 newcoalesce->
args = newargs;
3239 return (
Node *) newcoalesce;
3241 case T_SQLValueFunction:
3292 ((
Var *)
arg)->varlevelsup == 0)
3296 fselect->resulttype,
3297 fselect->resulttypmod,
3298 fselect->resultcollid))
3301 fselect->resulttype,
3302 fselect->resulttypmod,
3303 fselect->resultcollid,
3304 ((
Var *)
arg)->varlevelsup);
3318 fselect->resulttype,
3319 fselect->resulttypmod,
3320 fselect->resultcollid) &&
3321 fselect->resulttype ==
exprType(fld) &&
3330 newfselect->resulttype = fselect->resulttype;
3331 newfselect->resulttypmod = fselect->resulttypmod;
3332 newfselect->resultcollid = fselect->resultcollid;
3339 newfselect->resulttype,
3340 newfselect->resulttypmod,
3341 newfselect->resultcollid))
3344 return (
Node *) newfselect;
3366 foreach(l, rarg->
args)
3378 if (carg->constisnull ?
3392 newntest->
arg = (
Expr *) relem;
3394 newntest->argisrow =
false;
3396 newargs =
lappend(newargs, newntest);
3415 result = carg->constisnull;
3418 result = !carg->constisnull;
3421 elog(
ERROR,
"unrecognized nulltesttype: %d",
3433 newntest->argisrow = ntest->argisrow;
3435 return (
Node *) newntest;
3460 result = (!carg->constisnull &&
3464 result = (carg->constisnull ||
3468 result = (!carg->constisnull &&
3472 result = (carg->constisnull ||
3476 result = carg->constisnull;
3479 result = !carg->constisnull;
3482 elog(
ERROR,
"unrecognized booltesttype: %d",
3495 return (
Node *) newbtest;
3497 case T_CoerceToDomain:
3526 cdomain->resulttypmod,
3527 cdomain->resultcollid,
3528 cdomain->coercionformat,
3536 newcdomain->resulttypmod = cdomain->resulttypmod;
3537 newcdomain->resultcollid = cdomain->resultcollid;
3538 newcdomain->coercionformat = cdomain->coercionformat;
3540 return (
Node *) newcdomain;
3542 case T_PlaceHolderVar:
3559 case T_ConvertRowtypeExpr:
3570 newcre->convertformat = cre->convertformat;
3596 newcre->convertformat = argcre->convertformat;
3603 return (
Node *) newcre;
3656 if (provolatile == PROVOLATILE_IMMUTABLE)
3658 if (context->
estimate && provolatile == PROVOLATILE_STABLE)
3685 bool *haveNull,
bool *forceTrue)
3688 List *unprocessed_args;
3702 while (unprocessed_args)
3712 List *oldlist = unprocessed_args;
3745 if (const_input->constisnull)
3791 bool *haveNull,
bool *forceFalse)
3794 List *unprocessed_args;
3798 while (unprocessed_args)
3808 List *oldlist = unprocessed_args;
3841 if (const_input->constisnull)
3894 if (opno == BooleanEqualOperator)
3909 if (rightop &&
IsA(rightop,
Const))
3912 if (opno == BooleanEqualOperator)
3953 Oid result_collid,
Oid input_collid,
List **args_p,
3954 bool funcvariadic,
bool process_args,
bool allow_non_const,
3976 elog(
ERROR,
"cache lookup failed for function %u", funcid);
3998 result_collid, input_collid,
4000 func_tuple, context);
4002 if (!newexpr && allow_non_const &&
OidIsValid(func_form->prosupport))
4014 fexpr.
xpr.type = T_FuncExpr;
4016 fexpr.funcresulttype = result_type;
4017 fexpr.funcretset = func_form->proretset;
4018 fexpr.funcvariadic = funcvariadic;
4020 fexpr.funccollid = result_collid;
4021 fexpr.inputcollid = input_collid;
4025 req.
type = T_SupportRequestSimplify;
4037 if (!newexpr && allow_non_const)
4039 input_collid,
args, funcvariadic,
4040 func_tuple, context);
4072 Oid *proargtypes = funcform->proargtypes.values;
4074 bool has_named_args =
false;
4085 if (include_out_arguments)
4087 Datum proallargtypes;
4091 Anum_pg_proc_proallargtypes,
4102 elog(
ERROR,
"proallargtypes is not a 1-D Oid array or it contains nulls");
4115 has_named_args =
true;
4159 elog(
ERROR,
"too many function arguments");
4172 argarray[
i++] =
arg;
4192 i =
pronargs - funcform->pronargdefaults;
4193 foreach(lc, defaults)
4195 if (argarray[
i] == NULL)
4231 elog(
ERROR,
"not enough default arguments");
4246 Datum proargdefaults;
4250 Anum_pg_proc_proargdefaults);
4285 elog(
ERROR,
"too many function arguments");
4292 memcpy(declared_arg_types, proargtypes,
pronargs *
sizeof(
Oid));
4296 funcform->prorettype,
4299 if (rettype != result_type)
4300 elog(
ERROR,
"function's resolved result type changed during planning");
4325 bool has_nonconst_input =
false;
4326 bool has_null_input =
false;
4333 if (funcform->proretset)
4347 if (funcform->prorettype == RECORDOID)
4358 has_nonconst_input =
true;
4367 if (funcform->proisstrict && has_null_input)
4376 if (has_nonconst_input)
4386 if (funcform->provolatile == PROVOLATILE_IMMUTABLE)
4388 else if (context->
estimate && funcform->provolatile == PROVOLATILE_STABLE)
4399 newexpr->
funcid = funcid;
4400 newexpr->funcresulttype = result_type;
4401 newexpr->funcretset =
false;
4402 newexpr->funcvariadic = funcvariadic;
4404 newexpr->funccollid = result_collid;
4405 newexpr->inputcollid = input_collid;
4463 List *raw_parsetree_list;
4464 List *querytree_list;
4475 if (funcform->prolang != SQLlanguageId ||
4476 funcform->prokind != PROKIND_FUNCTION ||
4477 funcform->prosecdef ||
4478 funcform->proretset ||
4479 funcform->prorettype == RECORDOID ||
4512 fexpr->funcresulttype = result_type;
4513 fexpr->funcretset =
false;
4514 fexpr->funcvariadic = funcvariadic;
4516 fexpr->funccollid = result_collid;
4517 fexpr->inputcollid = input_collid;
4530 callback_arg.
prosrc = src;
4533 sqlerrcontext.
arg = (
void *) &callback_arg;
4540 Anum_pg_proc_prosqlbody,
4635 result_type, rettupdesc,
4657 if (
exprType(newexpr) != result_type)
4668 if (funcform->provolatile == PROVOLATILE_IMMUTABLE &&
4671 else if (funcform->provolatile == PROVOLATILE_STABLE &&
4675 if (funcform->proisstrict &&
4692 usecounts = (
int *)
palloc0(funcform->pronargs *
sizeof(
int));
4702 if (usecounts[
i] == 0)
4705 if (funcform->proisstrict)
4708 else if (usecounts[
i] != 1)
4756 if (
OidIsValid(exprcoll) && exprcoll != result_collid)
4760 newnode->
arg = (
Expr *) newexpr;
4761 newnode->
collOid = result_collid;
4764 newexpr = (
Node *) newnode;
4785 return (
Expr *) newexpr;
4805 context.
nargs = nargs;
4845 int syntaxerrposition;
4849 if (syntaxerrposition > 0)
4867 Oid result_collation)
4875 bool resultTypByVal;
4922 if (resultTypLen == -1)
4925 const_val =
datumCopy(const_val, resultTypByVal, resultTypLen);
4934 return (
Expr *)
makeConst(result_type, result_typmod, result_collation,
4936 const_val, const_is_null,
4975 List *raw_parsetree_list;
4976 List *querytree_list;
5002 func_oid = fexpr->
funcid;
5009 if (!fexpr->funcretset)
5038 elog(
ERROR,
"cache lookup failed for function %u", func_oid);
5051 if (funcform->prolang != SQLlanguageId ||
5052 funcform->prokind != PROKIND_FUNCTION ||
5053 funcform->proisstrict ||
5054 funcform->provolatile == PROVOLATILE_VOLATILE ||
5055 funcform->prorettype == VOIDOID ||
5056 funcform->prosecdef ||
5057 !funcform->proretset ||
5070 "inline_set_returning_function",
5083 callback_arg.
prosrc = src;
5086 sqlerrcontext.
arg = (
void *) &callback_arg;
5093 Anum_pg_proc_prosqlbody,
5124 fexpr->inputcollid);
5152 rtfunc->funccoltypes,
5153 rtfunc->funccoltypmods,
5154 rtfunc->funccolcollations);
5177 fexpr->funcresulttype, rettupdesc,
5250 context.
nargs = nargs;
Datum querytree(PG_FUNCTION_ARGS)
AclResult object_aclcheck(Oid classid, Oid objectid, Oid roleid, AclMode mode)
#define DatumGetArrayTypeP(X)
int ArrayGetNItems(int ndim, const int *dims)
#define InvalidAttrNumber
Bitmapset * bms_join(Bitmapset *a, Bitmapset *b)
void bms_free(Bitmapset *a)
int bms_num_members(const Bitmapset *a)
Bitmapset * bms_make_singleton(int x)
Bitmapset * bms_add_member(Bitmapset *a, int x)
Bitmapset * bms_add_members(Bitmapset *a, const Bitmapset *b)
Bitmapset * bms_del_members(Bitmapset *a, const Bitmapset *b)
Bitmapset * bms_int_members(Bitmapset *a, const Bitmapset *b)
BMS_Membership bms_membership(const Bitmapset *a)
#define TextDatumGetCString(d)
#define OidIsValid(objectId)
static bool contain_subplans_walker(Node *node, void *context)
#define CCDN_CASETESTEXPR_OK
static List * simplify_or_arguments(List *args, eval_const_expressions_context *context, bool *haveNull, bool *forceTrue)
static bool is_strict_saop(ScalarArrayOpExpr *expr, bool falseOK)
bool contain_volatile_functions_not_nextval(Node *clause)
static bool contain_leaked_vars_checker(Oid func_id, void *context)
static bool rowtype_field_matches(Oid rowtypeid, int fieldnum, Oid expectedtype, int32 expectedtypmod, Oid expectedcollation)
WindowFuncLists * find_window_functions(Node *clause, Index maxWinRef)
static bool contain_nonstrict_functions_walker(Node *node, void *context)
static List * add_function_defaults(List *args, int pronargs, HeapTuple func_tuple)
#define ece_all_arguments_const(node)
Expr * evaluate_expr(Expr *expr, Oid result_type, int32 result_typmod, Oid result_collation)
#define ece_evaluate_expr(node)
static bool max_parallel_hazard_checker(Oid func_id, void *context)
static bool max_parallel_hazard_test(char proparallel, max_parallel_hazard_context *context)
bool contain_agg_clause(Node *clause)
static Node * substitute_actual_srf_parameters_mutator(Node *node, substitute_actual_srf_parameters_context *context)
static bool contain_agg_clause_walker(Node *node, void *context)
static bool contain_nonstrict_functions_checker(Oid func_id, void *context)
int NumRelids(PlannerInfo *root, Node *clause)
bool contain_mutable_functions(Node *clause)
bool is_pseudo_constant_clause(Node *clause)
static bool max_parallel_hazard_walker(Node *node, max_parallel_hazard_context *context)
bool contain_window_function(Node *clause)
#define ece_generic_processing(node)
static Expr * evaluate_function(Oid funcid, Oid result_type, int32 result_typmod, Oid result_collid, Oid input_collid, List *args, bool funcvariadic, HeapTuple func_tuple, eval_const_expressions_context *context)
static Node * substitute_actual_parameters_mutator(Node *node, substitute_actual_parameters_context *context)
static bool contain_mutable_functions_checker(Oid func_id, void *context)
bool is_pseudo_constant_clause_relids(Node *clause, Relids relids)
List * expand_function_arguments(List *args, bool include_out_arguments, Oid result_type, HeapTuple func_tuple)
static Query * substitute_actual_srf_parameters(Query *expr, int nargs, List *args)
Var * find_forced_null_var(Node *node)
static bool ece_function_is_safe(Oid funcid, eval_const_expressions_context *context)
static bool contain_volatile_functions_checker(Oid func_id, void *context)
static List * simplify_and_arguments(List *args, eval_const_expressions_context *context, bool *haveNull, bool *forceFalse)
List * find_forced_null_vars(Node *node)
static Expr * simplify_function(Oid funcid, Oid result_type, int32 result_typmod, Oid result_collid, Oid input_collid, List **args_p, bool funcvariadic, bool process_args, bool allow_non_const, eval_const_expressions_context *context)
static Expr * inline_function(Oid funcid, Oid result_type, Oid result_collid, Oid input_collid, List *args, bool funcvariadic, HeapTuple func_tuple, eval_const_expressions_context *context)
static List * reorder_function_arguments(List *args, int pronargs, HeapTuple func_tuple)
static Node * substitute_actual_parameters(Node *expr, int nargs, List *args, int *usecounts)
static bool contain_mutable_functions_walker(Node *node, void *context)
Query * inline_set_returning_function(PlannerInfo *root, RangeTblEntry *rte)
static bool contain_volatile_functions_walker(Node *node, void *context)
bool contain_leaked_vars(Node *clause)
static Relids find_nonnullable_rels_walker(Node *node, bool top_level)
Bitmapset * pull_paramids(Expr *expr)
void convert_saop_to_hashed_saop(Node *node)
static void sql_inline_error_callback(void *arg)
static bool contain_volatile_functions_not_nextval_walker(Node *node, void *context)
static bool contain_leaked_vars_walker(Node *node, void *context)
static bool contain_non_const_walker(Node *node, void *context)
static bool contain_context_dependent_node(Node *clause)
Relids find_nonnullable_rels(Node *clause)
static void recheck_cast_function_args(List *args, Oid result_type, Oid *proargtypes, int pronargs, HeapTuple func_tuple)
static bool find_window_functions_walker(Node *node, WindowFuncLists *lists)
List * find_nonnullable_vars(Node *clause)
char max_parallel_hazard(Query *parse)
bool is_parallel_safe(PlannerInfo *root, Node *node)
bool contain_nonstrict_functions(Node *clause)
static bool contain_volatile_functions_not_nextval_checker(Oid func_id, void *context)
static List * find_nonnullable_vars_walker(Node *node, bool top_level)
Node * eval_const_expressions(PlannerInfo *root, Node *node)
bool contain_subplans(Node *clause)
static Node * simplify_boolean_equality(Oid opno, List *args)
static bool contain_exec_param_walker(Node *node, List *param_ids)
void CommuteOpExpr(OpExpr *clause)
static Node * eval_const_expressions_mutator(Node *node, eval_const_expressions_context *context)
static bool pull_paramids_walker(Node *node, Bitmapset **context)
static bool convert_saop_to_hashed_saop_walker(Node *node, void *context)
static List * fetch_function_defaults(HeapTuple func_tuple)
bool contain_volatile_functions(Node *clause)
double expression_returns_set_rows(PlannerInfo *root, Node *clause)
static bool contain_context_dependent_node_walker(Node *node, int *flags)
bool contain_exec_param(Node *clause, List *param_ids)
#define MIN_ARRAY_SIZE_FOR_HASHED_SAOP
Node * estimate_expression_value(PlannerInfo *root, Node *node)
void cost_qual_eval(QualCost *cost, List *quals, PlannerInfo *root)
double clamp_row_est(double nrows)
Datum datumCopy(Datum value, bool typByVal, int typLen)
static void PGresult * res
elog(ERROR, "%s: %s", p2, msg)
int internalerrquery(const char *query)
int internalerrposition(int cursorpos)
ErrorContextCallback * error_context_stack
int errposition(int cursorpos)
ExprState * ExecInitExpr(Expr *node, PlanState *parent)
EState * CreateExecutorState(void)
void FreeExecutorState(EState *estate)
#define GetPerTupleExprContext(estate)
static Datum ExecEvalExprSwitchContext(ExprState *state, ExprContext *econtext, bool *isNull)
#define OidFunctionCall1(functionId, arg1)
#define PG_DETOAST_DATUM_COPY(datum)
#define FmgrHookIsNeeded(fn_oid)
TypeFuncClass get_expr_result_type(Node *expr, Oid *resultTypeId, TupleDesc *resultTupleDesc)
@ TYPEFUNC_COMPOSITE_DOMAIN
bool check_sql_fn_retval(List *queryTreeLists, Oid rettype, TupleDesc rettupdesc, bool insertDroppedCols, List **resultTargetList)
void sql_fn_parser_setup(struct ParseState *pstate, SQLFunctionParseInfoPtr pinfo)
SQLFunctionParseInfoPtr prepare_sql_fn_parse_info(HeapTuple procedureTuple, Node *call_expr, Oid inputCollation)
bool heap_attisnull(HeapTuple tup, int attnum, TupleDesc tupleDesc)
#define HeapTupleIsValid(tuple)
if(TABLE==NULL||TABLE_index==NULL)
bool to_json_is_immutable(Oid typoid)
bool to_jsonb_is_immutable(Oid typoid)
Assert(fmt[strlen(fmt) - 1] !='\n')
List * list_delete_first_n(List *list, int n)
List * lappend(List *list, void *datum)
List * lappend_oid(List *list, Oid datum)
List * list_copy(const List *oldlist)
List * list_delete_first(List *list)
void list_free(List *list)
bool list_member_int(const List *list, int datum)
bool list_member_oid(const List *list, Oid datum)
List * list_concat(List *list1, const List *list2)
bool list_member(const List *list, const void *datum)
List * list_concat_copy(const List *list1, const List *list2)
List * list_delete_last(List *list)
char func_parallel(Oid funcid)
void getTypeOutputInfo(Oid type, Oid *typOutput, bool *typIsVarlena)
void get_typlenbyval(Oid typid, int16 *typlen, bool *typbyval)
RegProcedure get_opcode(Oid opno)
void getTypeInputInfo(Oid type, Oid *typInput, Oid *typIOParam)
char func_volatile(Oid funcid)
bool func_strict(Oid funcid)
bool get_func_leakproof(Oid funcid)
const struct SubscriptRoutines * getSubscriptingRoutines(Oid typid, Oid *typelemp)
bool get_op_hash_functions(Oid opno, RegProcedure *lhs_procno, RegProcedure *rhs_procno)
Oid get_negator(Oid opno)
Oid get_commutator(Oid opno)
Const * makeNullConst(Oid consttype, int32 consttypmod, Oid constcollid)
Const * makeConst(Oid consttype, int32 consttypmod, Oid constcollid, int constlen, Datum constvalue, bool constisnull, bool constbyval)
Expr * make_andclause(List *andclauses)
Var * makeVar(int varno, AttrNumber varattno, Oid vartype, int32 vartypmod, Oid varcollid, Index varlevelsup)
Node * makeBoolConst(bool value, bool isnull)
Expr * make_orclause(List *orclauses)
void pfree(void *pointer)
void * palloc0(Size size)
MemoryContext CurrentMemoryContext
void MemoryContextDelete(MemoryContext context)
#define AllocSetContextCreate
#define ALLOCSET_DEFAULT_SIZES
List * mbms_int_members(List *a, const List *b)
List * mbms_add_member(List *a, int listidx, int bitidx)
List * mbms_add_members(List *a, const List *b)
Oid exprType(const Node *expr)
int32 exprTypmod(const Node *expr)
bool check_functions_in_node(Node *node, check_function_callback checker, void *context)
Oid exprCollation(const Node *expr)
Node * applyRelabelType(Node *arg, Oid rtype, int32 rtypmod, Oid rcollid, CoercionForm rformat, int rlocation, bool overwrite_ok)
void fix_opfuncids(Node *node)
void set_sa_opfuncid(ScalarArrayOpExpr *opexpr)
void set_opfuncid(OpExpr *opexpr)
#define expression_tree_mutator(n, m, c)
static bool is_andclause(const void *clause)
static bool is_orclause(const void *clause)
#define query_tree_walker(q, w, c, f)
static bool is_opclause(const void *clause)
#define expression_tree_walker(n, w, c)
#define query_tree_mutator(q, m, c, f)