| 1 | /*------------------------------------------------------------------------- |
| 2 | * |
| 3 | * parse_relation.h |
| 4 | * prototypes for parse_relation.c. |
| 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/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 bool scanNameSpaceForENR(ParseState *pstate, const char *refname); |
| 46 | extern void checkNameSpaceConflicts(ParseState *pstate, List *namespace1, |
| 47 | List *namespace2); |
| 48 | extern int RTERangeTablePosn(ParseState *pstate, |
| 49 | RangeTblEntry *rte, |
| 50 | int *sublevels_up); |
| 51 | extern RangeTblEntry *GetRTEByRangeTablePosn(ParseState *pstate, |
| 52 | int varno, |
| 53 | int sublevels_up); |
| 54 | extern CommonTableExpr *GetCTEForRTE(ParseState *pstate, RangeTblEntry *rte, |
| 55 | int rtelevelsup); |
| 56 | extern Node *scanRTEForColumn(ParseState *pstate, RangeTblEntry *rte, |
| 57 | const char *colname, int location, |
| 58 | int fuzzy_rte_penalty, FuzzyAttrMatchState *fuzzystate); |
| 59 | extern Node *colNameToVar(ParseState *pstate, const char *colname, bool localonly, |
| 60 | int location); |
| 61 | extern void markVarForSelectPriv(ParseState *pstate, Var *var, |
| 62 | RangeTblEntry *rte); |
| 63 | extern Relation parserOpenTable(ParseState *pstate, const RangeVar *relation, |
| 64 | int lockmode); |
| 65 | extern RangeTblEntry *addRangeTableEntry(ParseState *pstate, |
| 66 | RangeVar *relation, |
| 67 | Alias *alias, |
| 68 | bool inh, |
| 69 | bool inFromCl); |
| 70 | extern RangeTblEntry *addRangeTableEntryForRelation(ParseState *pstate, |
| 71 | Relation rel, |
| 72 | int lockmode, |
| 73 | Alias *alias, |
| 74 | bool inh, |
| 75 | bool inFromCl); |
| 76 | extern RangeTblEntry *addRangeTableEntryForSubquery(ParseState *pstate, |
| 77 | Query *subquery, |
| 78 | Alias *alias, |
| 79 | bool lateral, |
| 80 | bool inFromCl); |
| 81 | extern RangeTblEntry *addRangeTableEntryForFunction(ParseState *pstate, |
| 82 | List *funcnames, |
| 83 | List *funcexprs, |
| 84 | List *coldeflists, |
| 85 | RangeFunction *rangefunc, |
| 86 | bool lateral, |
| 87 | bool inFromCl); |
| 88 | extern RangeTblEntry *addRangeTableEntryForValues(ParseState *pstate, |
| 89 | List *exprs, |
| 90 | List *coltypes, |
| 91 | List *coltypmods, |
| 92 | List *colcollations, |
| 93 | Alias *alias, |
| 94 | bool lateral, |
| 95 | bool inFromCl); |
| 96 | extern RangeTblEntry *addRangeTableEntryForTableFunc(ParseState *pstate, |
| 97 | TableFunc *tf, |
| 98 | Alias *alias, |
| 99 | bool lateral, |
| 100 | bool inFromCl); |
| 101 | extern RangeTblEntry *addRangeTableEntryForJoin(ParseState *pstate, |
| 102 | List *colnames, |
| 103 | JoinType jointype, |
| 104 | List *aliasvars, |
| 105 | Alias *alias, |
| 106 | bool inFromCl); |
| 107 | extern RangeTblEntry *addRangeTableEntryForCTE(ParseState *pstate, |
| 108 | CommonTableExpr *cte, |
| 109 | Index levelsup, |
| 110 | RangeVar *rv, |
| 111 | bool inFromCl); |
| 112 | extern RangeTblEntry *addRangeTableEntryForENR(ParseState *pstate, |
| 113 | RangeVar *rv, |
| 114 | bool inFromCl); |
| 115 | extern bool isLockedRefname(ParseState *pstate, const char *refname); |
| 116 | extern void addRTEtoQuery(ParseState *pstate, RangeTblEntry *rte, |
| 117 | bool addToJoinList, |
| 118 | bool addToRelNameSpace, bool addToVarNameSpace); |
| 119 | extern void errorMissingRTE(ParseState *pstate, RangeVar *relation) pg_attribute_noreturn(); |
| 120 | extern void errorMissingColumn(ParseState *pstate, |
| 121 | const char *relname, const char *colname, int location) pg_attribute_noreturn(); |
| 122 | extern void expandRTE(RangeTblEntry *rte, int rtindex, int sublevels_up, |
| 123 | int location, bool include_dropped, |
| 124 | List **colnames, List **colvars); |
| 125 | extern List *expandRelAttrs(ParseState *pstate, RangeTblEntry *rte, |
| 126 | int rtindex, int sublevels_up, int location); |
| 127 | extern int attnameAttNum(Relation rd, const char *attname, bool sysColOK); |
| 128 | extern const NameData *attnumAttName(Relation rd, int attid); |
| 129 | extern Oid attnumTypeId(Relation rd, int attid); |
| 130 | extern Oid attnumCollationId(Relation rd, int attid); |
| 131 | extern bool isQueryUsingTempRelation(Query *query); |
| 132 | |
| 133 | #endif /* PARSE_RELATION_H */ |
| 134 | |