1 /*------------------------------------------------------------------------- 2 * 3 * nodeFuncs.h 4 * Various general-purpose manipulations of Node trees 5 * 6 * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group 7 * Portions Copyright (c) 1994, Regents of the University of California 8 * 9 * src/include/nodes/nodeFuncs.h 10 * 11 *------------------------------------------------------------------------- 12 */ 13 #ifndef NODEFUNCS_H 14 #define NODEFUNCS_H 15 16 #include "nodes/parsenodes.h" 17 18 19 /* flags bits for query_tree_walker and query_tree_mutator */ 20 #define QTW_IGNORE_RT_SUBQUERIES 0x01 /* subqueries in rtable */ 21 #define QTW_IGNORE_CTE_SUBQUERIES 0x02 /* subqueries in cteList */ 22 #define QTW_IGNORE_RC_SUBQUERIES 0x03 /* both of above */ 23 #define QTW_IGNORE_JOINALIASES 0x04 /* JOIN alias var lists */ 24 #define QTW_IGNORE_RANGE_TABLE 0x08 /* skip rangetable entirely */ 25 #define QTW_EXAMINE_RTES 0x10 /* examine RTEs */ 26 #define QTW_DONT_COPY_QUERY 0x20 /* do not copy top Query */ 27 #define QTW_EXAMINE_SORTGROUP 0x80 /* include SortGroupNode lists */ 28 29 /* callback function for check_functions_in_node */ 30 typedef bool (*check_function_callback) (Oid func_id, void *context); 31 32 33 extern Oid exprType(const Node *expr); 34 extern int32 exprTypmod(const Node *expr); 35 extern bool exprIsLengthCoercion(const Node *expr, int32 *coercedTypmod); 36 extern Node *relabel_to_typmod(Node *expr, int32 typmod); 37 extern Node *strip_implicit_coercions(Node *node); 38 extern bool expression_returns_set(Node *clause); 39 40 extern Oid exprCollation(const Node *expr); 41 extern Oid exprInputCollation(const Node *expr); 42 extern void exprSetCollation(Node *expr, Oid collation); 43 extern void exprSetInputCollation(Node *expr, Oid inputcollation); 44 45 extern int exprLocation(const Node *expr); 46 47 extern void fix_opfuncids(Node *node); 48 extern void set_opfuncid(OpExpr *opexpr); 49 extern void set_sa_opfuncid(ScalarArrayOpExpr *opexpr); 50 51 extern bool check_functions_in_node(Node *node, check_function_callback checker, 52 void *context); 53 54 extern bool expression_tree_walker(Node *node, bool (*walker) (), 55 void *context); 56 extern Node *expression_tree_mutator(Node *node, Node *(*mutator) (), 57 void *context); 58 59 extern bool query_tree_walker(Query *query, bool (*walker) (), 60 void *context, int flags); 61 extern Query *query_tree_mutator(Query *query, Node *(*mutator) (), 62 void *context, int flags); 63 64 extern bool range_table_walker(List *rtable, bool (*walker) (), 65 void *context, int flags); 66 extern List *range_table_mutator(List *rtable, Node *(*mutator) (), 67 void *context, int flags); 68 69 extern bool query_or_expression_tree_walker(Node *node, bool (*walker) (), 70 void *context, int flags); 71 extern Node *query_or_expression_tree_mutator(Node *node, Node *(*mutator) (), 72 void *context, int flags); 73 74 extern bool raw_expression_tree_walker(Node *node, bool (*walker) (), 75 void *context); 76 77 struct PlanState; 78 extern bool planstate_tree_walker(struct PlanState *planstate, bool (*walker) (), 79 void *context); 80 81 #endif /* NODEFUNCS_H */ 82