1/*-------------------------------------------------------------------------
2 *
3 * rewriteManip.h
4 * Querytree manipulation subroutines for query rewriter.
5 *
6 *
7 * Portions Copyright (c) 1996-2019, PostgreSQL Global Development Group
8 * Portions Copyright (c) 1994, Regents of the University of California
9 *
10 * src/include/rewrite/rewriteManip.h
11 *
12 *-------------------------------------------------------------------------
13 */
14#ifndef REWRITEMANIP_H
15#define REWRITEMANIP_H
16
17#include "nodes/parsenodes.h"
18
19
20typedef struct replace_rte_variables_context replace_rte_variables_context;
21
22typedef Node *(*replace_rte_variables_callback) (Var *var,
23 replace_rte_variables_context *context);
24
25struct replace_rte_variables_context
26{
27 replace_rte_variables_callback callback; /* callback function */
28 void *callback_arg; /* context data for callback function */
29 int target_varno; /* RTE index to search for */
30 int sublevels_up; /* (current) nesting depth */
31 bool inserted_sublink; /* have we inserted a SubLink? */
32};
33
34typedef enum ReplaceVarsNoMatchOption
35{
36 REPLACEVARS_REPORT_ERROR, /* throw error if no match */
37 REPLACEVARS_CHANGE_VARNO, /* change the Var's varno, nothing else */
38 REPLACEVARS_SUBSTITUTE_NULL /* replace with a NULL Const */
39} ReplaceVarsNoMatchOption;
40
41
42extern void OffsetVarNodes(Node *node, int offset, int sublevels_up);
43extern void ChangeVarNodes(Node *node, int old_varno, int new_varno,
44 int sublevels_up);
45extern void IncrementVarSublevelsUp(Node *node, int delta_sublevels_up,
46 int min_sublevels_up);
47extern void IncrementVarSublevelsUp_rtable(List *rtable,
48 int delta_sublevels_up, int min_sublevels_up);
49
50extern bool rangeTableEntry_used(Node *node, int rt_index,
51 int sublevels_up);
52
53extern Query *getInsertSelectQuery(Query *parsetree, Query ***subquery_ptr);
54
55extern void AddQual(Query *parsetree, Node *qual);
56extern void AddInvertedQual(Query *parsetree, Node *qual);
57
58extern bool contain_aggs_of_level(Node *node, int levelsup);
59extern int locate_agg_of_level(Node *node, int levelsup);
60extern bool contain_windowfuncs(Node *node);
61extern int locate_windowfunc(Node *node);
62extern bool checkExprHasSubLink(Node *node);
63
64extern Node *replace_rte_variables(Node *node,
65 int target_varno, int sublevels_up,
66 replace_rte_variables_callback callback,
67 void *callback_arg,
68 bool *outer_hasSubLinks);
69extern Node *replace_rte_variables_mutator(Node *node,
70 replace_rte_variables_context *context);
71
72extern Node *map_variable_attnos(Node *node,
73 int target_varno, int sublevels_up,
74 const AttrNumber *attno_map, int map_length,
75 Oid to_rowtype, bool *found_whole_row);
76
77extern Node *ReplaceVarsFromTargetList(Node *node,
78 int target_varno, int sublevels_up,
79 RangeTblEntry *target_rte,
80 List *targetlist,
81 ReplaceVarsNoMatchOption nomatch_option,
82 int nomatch_varno,
83 bool *outer_hasSubLinks);
84
85#endif /* REWRITEMANIP_H */
86