1 /*-------------------------------------------------------------------------
2  *
3  * parse_relation.h
4  *	  prototypes for parse_relation.c.
5  *
6  *
7  * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
8  * Portions Copyright (c) 1994, Regents of the University of California
9  *
10  * src/include/parser/parse_relation.h
11  *
12  *-------------------------------------------------------------------------
13  */
14 #ifndef PARSE_RELATION_H
15 #define PARSE_RELATION_H
16 
17 #include "parser/parse_node.h"
18 
19 
20 /*
21  * Support for fuzzily matching column.
22  *
23  * This is for building diagnostic messages, where non-exact matching
24  * attributes are suggested to the user.  The struct's fields may be facets of
25  * a particular RTE, or of an entire range table, depending on context.
26  */
27 typedef struct
28 {
29 	int			distance;		/* Weighted distance (lowest so far) */
30 	RangeTblEntry *rfirst;		/* RTE of first */
31 	AttrNumber	first;			/* Closest attribute so far */
32 	RangeTblEntry *rsecond;		/* RTE of second */
33 	AttrNumber	second;			/* Second closest attribute so far */
34 } FuzzyAttrMatchState;
35 
36 
37 extern RangeTblEntry *refnameRangeTblEntry(ParseState *pstate,
38 					 const char *schemaname,
39 					 const char *refname,
40 					 int location,
41 					 int *sublevels_up);
42 extern CommonTableExpr *scanNameSpaceForCTE(ParseState *pstate,
43 					const char *refname,
44 					Index *ctelevelsup);
45 extern void checkNameSpaceConflicts(ParseState *pstate, List *namespace1,
46 						List *namespace2);
47 extern int RTERangeTablePosn(ParseState *pstate,
48 				  RangeTblEntry *rte,
49 				  int *sublevels_up);
50 extern RangeTblEntry *GetRTEByRangeTablePosn(ParseState *pstate,
51 					   int varno,
52 					   int sublevels_up);
53 extern CommonTableExpr *GetCTEForRTE(ParseState *pstate, RangeTblEntry *rte,
54 			 int rtelevelsup);
55 extern Node *scanRTEForColumn(ParseState *pstate, RangeTblEntry *rte,
56 				 char *colname, int location,
57 				 int fuzzy_rte_penalty, FuzzyAttrMatchState *fuzzystate);
58 extern Node *colNameToVar(ParseState *pstate, char *colname, bool localonly,
59 			 int location);
60 extern void markVarForSelectPriv(ParseState *pstate, Var *var,
61 					 RangeTblEntry *rte);
62 extern Relation parserOpenTable(ParseState *pstate, const RangeVar *relation,
63 				int lockmode);
64 extern RangeTblEntry *addRangeTableEntry(ParseState *pstate,
65 				   RangeVar *relation,
66 				   Alias *alias,
67 				   bool inh,
68 				   bool inFromCl);
69 extern RangeTblEntry *addRangeTableEntryForRelation(ParseState *pstate,
70 							  Relation rel,
71 							  Alias *alias,
72 							  bool inh,
73 							  bool inFromCl);
74 extern RangeTblEntry *addRangeTableEntryForSubquery(ParseState *pstate,
75 							  Query *subquery,
76 							  Alias *alias,
77 							  bool lateral,
78 							  bool inFromCl);
79 extern RangeTblEntry *addRangeTableEntryForFunction(ParseState *pstate,
80 							  List *funcnames,
81 							  List *funcexprs,
82 							  List *coldeflists,
83 							  RangeFunction *rangefunc,
84 							  bool lateral,
85 							  bool inFromCl);
86 extern RangeTblEntry *addRangeTableEntryForValues(ParseState *pstate,
87 							List *exprs,
88 							List *collations,
89 							Alias *alias,
90 							bool lateral,
91 							bool inFromCl);
92 extern RangeTblEntry *addRangeTableEntryForJoin(ParseState *pstate,
93 						  List *colnames,
94 						  JoinType jointype,
95 						  List *aliasvars,
96 						  Alias *alias,
97 						  bool inFromCl);
98 extern RangeTblEntry *addRangeTableEntryForCTE(ParseState *pstate,
99 						 CommonTableExpr *cte,
100 						 Index levelsup,
101 						 RangeVar *rv,
102 						 bool inFromCl);
103 extern bool isLockedRefname(ParseState *pstate, const char *refname);
104 extern void addRTEtoQuery(ParseState *pstate, RangeTblEntry *rte,
105 			  bool addToJoinList,
106 			  bool addToRelNameSpace, bool addToVarNameSpace);
107 extern void errorMissingRTE(ParseState *pstate, RangeVar *relation) pg_attribute_noreturn();
108 extern void errorMissingColumn(ParseState *pstate,
109 		 char *relname, char *colname, int location) pg_attribute_noreturn();
110 extern void expandRTE(RangeTblEntry *rte, int rtindex, int sublevels_up,
111 		  int location, bool include_dropped,
112 		  List **colnames, List **colvars);
113 extern List *expandRelAttrs(ParseState *pstate, RangeTblEntry *rte,
114 			   int rtindex, int sublevels_up, int location);
115 extern int	attnameAttNum(Relation rd, const char *attname, bool sysColOK);
116 extern Name attnumAttName(Relation rd, int attid);
117 extern Oid	attnumTypeId(Relation rd, int attid);
118 extern Oid	attnumCollationId(Relation rd, int attid);
119 extern bool isQueryUsingTempRelation(Query *query);
120 
121 #endif   /* PARSE_RELATION_H */
122