1 /*-------------------------------------------------------------------------
4 * Querytree manipulation subroutines for query rewriter.
7 * Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group
8 * Portions Copyright (c) 1994, Regents of the University of California
10 * src/include/rewrite/rewriteManip.h
12 *-------------------------------------------------------------------------
14 #ifndef REWRITEMANIP_H
15 #define REWRITEMANIP_H
17 #include "nodes/parsenodes.h"
19 struct AttrMap
; /* avoid including attmap.h here */
22 typedef struct replace_rte_variables_context replace_rte_variables_context
;
24 typedef Node
*(*replace_rte_variables_callback
) (Var
*var
,
25 replace_rte_variables_context
*context
);
27 struct replace_rte_variables_context
29 replace_rte_variables_callback callback
; /* callback function */
30 void *callback_arg
; /* context data for callback function */
31 int target_varno
; /* RTE index to search for */
32 int sublevels_up
; /* (current) nesting depth */
33 bool inserted_sublink
; /* have we inserted a SubLink? */
36 typedef enum ReplaceVarsNoMatchOption
38 REPLACEVARS_REPORT_ERROR
, /* throw error if no match */
39 REPLACEVARS_CHANGE_VARNO
, /* change the Var's varno, nothing else */
40 REPLACEVARS_SUBSTITUTE_NULL
, /* replace with a NULL Const */
41 } ReplaceVarsNoMatchOption
;
44 extern void CombineRangeTables(List
**dst_rtable
, List
**dst_perminfos
,
45 List
*src_rtable
, List
*src_perminfos
);
46 extern void OffsetVarNodes(Node
*node
, int offset
, int sublevels_up
);
47 extern void ChangeVarNodes(Node
*node
, int rt_index
, int new_index
,
49 extern void IncrementVarSublevelsUp(Node
*node
, int delta_sublevels_up
,
50 int min_sublevels_up
);
51 extern void IncrementVarSublevelsUp_rtable(List
*rtable
,
52 int delta_sublevels_up
, int min_sublevels_up
);
54 extern bool rangeTableEntry_used(Node
*node
, int rt_index
,
57 extern Query
*getInsertSelectQuery(Query
*parsetree
, Query
***subquery_ptr
);
59 extern void AddQual(Query
*parsetree
, Node
*qual
);
60 extern void AddInvertedQual(Query
*parsetree
, Node
*qual
);
62 extern bool contain_aggs_of_level(Node
*node
, int levelsup
);
63 extern int locate_agg_of_level(Node
*node
, int levelsup
);
64 extern bool contain_windowfuncs(Node
*node
);
65 extern int locate_windowfunc(Node
*node
);
66 extern bool checkExprHasSubLink(Node
*node
);
68 extern Node
*add_nulling_relids(Node
*node
,
69 const Bitmapset
*target_relids
,
70 const Bitmapset
*added_relids
);
71 extern Node
*remove_nulling_relids(Node
*node
,
72 const Bitmapset
*removable_relids
,
73 const Bitmapset
*except_relids
);
75 extern Node
*replace_rte_variables(Node
*node
,
76 int target_varno
, int sublevels_up
,
77 replace_rte_variables_callback callback
,
79 bool *outer_hasSubLinks
);
80 extern Node
*replace_rte_variables_mutator(Node
*node
,
81 replace_rte_variables_context
*context
);
83 extern Node
*map_variable_attnos(Node
*node
,
84 int target_varno
, int sublevels_up
,
85 const struct AttrMap
*attno_map
,
86 Oid to_rowtype
, bool *found_whole_row
);
88 extern Node
*ReplaceVarsFromTargetList(Node
*node
,
89 int target_varno
, int sublevels_up
,
90 RangeTblEntry
*target_rte
,
93 ReplaceVarsNoMatchOption nomatch_option
,
95 bool *outer_hasSubLinks
);
97 #endif /* REWRITEMANIP_H */