mirror of
https://github.com/postgres/postgres.git
synced 2026-02-03 20:40:14 -05:00
Instead of passing around a pointer to the RangeTblEntry that provides the desired column, pass a pointer to the associated ParseNamespaceItem. The RTE is trivially reachable from the nsitem, and having the ParseNamespaceItem allows access to additional information. As proof of concept for that, add the rangetable index to ParseNamespaceItem, and use that to get rid of RTERangeTablePosn searches. (I have in mind to teach the parser to generate some different representation for Vars that are nullable by outer joins, and keeping the necessary information in ParseNamespaceItems seems like a reasonable approach to that. But whether that ever happens or not, this seems like good cleanup.) Also refactor the code around scanRTEForColumn so that the "fuzzy match" stuff does not leak out of parse_relation.c. Discussion: https://postgr.es/m/26144.1576858373@sss.pgh.pa.us
116 lines
4.6 KiB
C
116 lines
4.6 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* parse_relation.h
|
|
* prototypes for parse_relation.c.
|
|
*
|
|
*
|
|
* Portions Copyright (c) 1996-2019, PostgreSQL Global Development Group
|
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
*
|
|
* src/include/parser/parse_relation.h
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
#ifndef PARSE_RELATION_H
|
|
#define PARSE_RELATION_H
|
|
|
|
#include "parser/parse_node.h"
|
|
|
|
|
|
extern ParseNamespaceItem *refnameNamespaceItem(ParseState *pstate,
|
|
const char *schemaname,
|
|
const char *refname,
|
|
int location,
|
|
int *sublevels_up);
|
|
extern CommonTableExpr *scanNameSpaceForCTE(ParseState *pstate,
|
|
const char *refname,
|
|
Index *ctelevelsup);
|
|
extern bool scanNameSpaceForENR(ParseState *pstate, const char *refname);
|
|
extern void checkNameSpaceConflicts(ParseState *pstate, List *namespace1,
|
|
List *namespace2);
|
|
extern ParseNamespaceItem *GetNSItemByRangeTablePosn(ParseState *pstate,
|
|
int varno,
|
|
int sublevels_up);
|
|
extern RangeTblEntry *GetRTEByRangeTablePosn(ParseState *pstate,
|
|
int varno,
|
|
int sublevels_up);
|
|
extern CommonTableExpr *GetCTEForRTE(ParseState *pstate, RangeTblEntry *rte,
|
|
int rtelevelsup);
|
|
extern Node *scanNSItemForColumn(ParseState *pstate, ParseNamespaceItem *nsitem,
|
|
int sublevels_up, const char *colname,
|
|
int location);
|
|
extern Node *colNameToVar(ParseState *pstate, const char *colname, bool localonly,
|
|
int location);
|
|
extern void markVarForSelectPriv(ParseState *pstate, Var *var,
|
|
RangeTblEntry *rte);
|
|
extern Relation parserOpenTable(ParseState *pstate, const RangeVar *relation,
|
|
int lockmode);
|
|
extern RangeTblEntry *addRangeTableEntry(ParseState *pstate,
|
|
RangeVar *relation,
|
|
Alias *alias,
|
|
bool inh,
|
|
bool inFromCl);
|
|
extern RangeTblEntry *addRangeTableEntryForRelation(ParseState *pstate,
|
|
Relation rel,
|
|
int lockmode,
|
|
Alias *alias,
|
|
bool inh,
|
|
bool inFromCl);
|
|
extern RangeTblEntry *addRangeTableEntryForSubquery(ParseState *pstate,
|
|
Query *subquery,
|
|
Alias *alias,
|
|
bool lateral,
|
|
bool inFromCl);
|
|
extern RangeTblEntry *addRangeTableEntryForFunction(ParseState *pstate,
|
|
List *funcnames,
|
|
List *funcexprs,
|
|
List *coldeflists,
|
|
RangeFunction *rangefunc,
|
|
bool lateral,
|
|
bool inFromCl);
|
|
extern RangeTblEntry *addRangeTableEntryForValues(ParseState *pstate,
|
|
List *exprs,
|
|
List *coltypes,
|
|
List *coltypmods,
|
|
List *colcollations,
|
|
Alias *alias,
|
|
bool lateral,
|
|
bool inFromCl);
|
|
extern RangeTblEntry *addRangeTableEntryForTableFunc(ParseState *pstate,
|
|
TableFunc *tf,
|
|
Alias *alias,
|
|
bool lateral,
|
|
bool inFromCl);
|
|
extern RangeTblEntry *addRangeTableEntryForJoin(ParseState *pstate,
|
|
List *colnames,
|
|
JoinType jointype,
|
|
List *aliasvars,
|
|
Alias *alias,
|
|
bool inFromCl);
|
|
extern RangeTblEntry *addRangeTableEntryForCTE(ParseState *pstate,
|
|
CommonTableExpr *cte,
|
|
Index levelsup,
|
|
RangeVar *rv,
|
|
bool inFromCl);
|
|
extern RangeTblEntry *addRangeTableEntryForENR(ParseState *pstate,
|
|
RangeVar *rv,
|
|
bool inFromCl);
|
|
extern bool isLockedRefname(ParseState *pstate, const char *refname);
|
|
extern void addRTEtoQuery(ParseState *pstate, RangeTblEntry *rte,
|
|
bool addToJoinList,
|
|
bool addToRelNameSpace, bool addToVarNameSpace);
|
|
extern void errorMissingRTE(ParseState *pstate, RangeVar *relation) pg_attribute_noreturn();
|
|
extern void errorMissingColumn(ParseState *pstate,
|
|
const char *relname, const char *colname, int location) pg_attribute_noreturn();
|
|
extern void expandRTE(RangeTblEntry *rte, int rtindex, int sublevels_up,
|
|
int location, bool include_dropped,
|
|
List **colnames, List **colvars);
|
|
extern List *expandNSItemAttrs(ParseState *pstate, ParseNamespaceItem *nsitem,
|
|
int sublevels_up, int location);
|
|
extern int attnameAttNum(Relation rd, const char *attname, bool sysColOK);
|
|
extern const NameData *attnumAttName(Relation rd, int attid);
|
|
extern Oid attnumTypeId(Relation rd, int attid);
|
|
extern Oid attnumCollationId(Relation rd, int attid);
|
|
extern bool isQueryUsingTempRelation(Query *query);
|
|
|
|
#endif /* PARSE_RELATION_H */
|