mirror of
https://github.com/postgres/postgres.git
synced 2025-06-29 10:41:53 +03:00
for example in WITH w AS (SELECT * FROM foo) SELECT * FROM w, bar ... FOR UPDATE the FOR UPDATE will now affect bar but not foo. This is more useful and consistent than the original 8.4 behavior, which tried to propagate FOR UPDATE into the WITH query but always failed due to assorted implementation restrictions. Even though we are in process of removing those restrictions, it seems correct on philosophical grounds to not let the outer query's FOR UPDATE affect the WITH query. In passing, fix isLockedRel which frequently got things wrong in nested-subquery cases: "FOR UPDATE OF foo" applies to an alias foo in the current query level, not subqueries. This has been broken for a long time, but it doesn't seem worth back-patching further than 8.4 because the actual consequences are minimal. At worst the parser would sometimes get RowShareLock on a relation when it should be AccessShareLock or vice versa. That would only make a difference if someone were using ExclusiveLock concurrently, which no standard operation does, and anyway FOR UPDATE doesn't result in visible changes so it's not clear that the someone would notice any problem. Between that and the fact that FOR UPDATE barely works with subqueries at all in existing releases, I'm not excited about worrying about it.
102 lines
3.6 KiB
C
102 lines
3.6 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* parse_relation.h
|
|
* prototypes for parse_relation.c.
|
|
*
|
|
*
|
|
* Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
|
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
*
|
|
* $PostgreSQL: pgsql/src/include/parser/parse_relation.h,v 1.64.2.1 2009/10/27 17:11:30 tgl Exp $
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
#ifndef PARSE_RELATION_H
|
|
#define PARSE_RELATION_H
|
|
|
|
#include "parser/parse_node.h"
|
|
|
|
extern bool add_missing_from;
|
|
|
|
extern RangeTblEntry *refnameRangeTblEntry(ParseState *pstate,
|
|
const char *schemaname,
|
|
const char *refname,
|
|
int location,
|
|
int *sublevels_up);
|
|
extern CommonTableExpr *scanNameSpaceForCTE(ParseState *pstate,
|
|
const char *refname,
|
|
Index *ctelevelsup);
|
|
extern void checkNameSpaceConflicts(ParseState *pstate, List *namespace1,
|
|
List *namespace2);
|
|
extern int RTERangeTablePosn(ParseState *pstate,
|
|
RangeTblEntry *rte,
|
|
int *sublevels_up);
|
|
extern RangeTblEntry *GetRTEByRangeTablePosn(ParseState *pstate,
|
|
int varno,
|
|
int sublevels_up);
|
|
extern CommonTableExpr *GetCTEForRTE(ParseState *pstate, RangeTblEntry *rte,
|
|
int rtelevelsup);
|
|
extern Node *scanRTEForColumn(ParseState *pstate, RangeTblEntry *rte,
|
|
char *colname, int location);
|
|
extern Node *colNameToVar(ParseState *pstate, char *colname, bool localonly,
|
|
int location);
|
|
extern Node *qualifiedNameToVar(ParseState *pstate,
|
|
char *schemaname,
|
|
char *refname,
|
|
char *colname,
|
|
bool implicitRTEOK,
|
|
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,
|
|
Alias *alias,
|
|
bool inh,
|
|
bool inFromCl);
|
|
extern RangeTblEntry *addRangeTableEntryForSubquery(ParseState *pstate,
|
|
Query *subquery,
|
|
Alias *alias,
|
|
bool inFromCl);
|
|
extern RangeTblEntry *addRangeTableEntryForFunction(ParseState *pstate,
|
|
char *funcname,
|
|
Node *funcexpr,
|
|
RangeFunction *rangefunc,
|
|
bool inFromCl);
|
|
extern RangeTblEntry *addRangeTableEntryForValues(ParseState *pstate,
|
|
List *exprs,
|
|
Alias *alias,
|
|
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,
|
|
Alias *alias,
|
|
bool inFromCl);
|
|
extern bool isLockedRefname(ParseState *pstate, const char *refname);
|
|
extern void addRTEtoQuery(ParseState *pstate, RangeTblEntry *rte,
|
|
bool addToJoinList,
|
|
bool addToRelNameSpace, bool addToVarNameSpace);
|
|
extern RangeTblEntry *addImplicitRTE(ParseState *pstate, RangeVar *relation);
|
|
extern void expandRTE(RangeTblEntry *rte, int rtindex, int sublevels_up,
|
|
int location, bool include_dropped,
|
|
List **colnames, List **colvars);
|
|
extern List *expandRelAttrs(ParseState *pstate, RangeTblEntry *rte,
|
|
int rtindex, int sublevels_up, int location);
|
|
extern int attnameAttNum(Relation rd, const char *attname, bool sysColOK);
|
|
extern Name attnumAttName(Relation rd, int attid);
|
|
extern Oid attnumTypeId(Relation rd, int attid);
|
|
|
|
#endif /* PARSE_RELATION_H */
|