diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2011-02-22 19:23:23 -0500 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2011-02-22 19:24:40 -0500 |
commit | bdca82f44d0e0168dece56cbd53b54ba142f328f (patch) | |
tree | 0a627b98d399ddce7b4523cf1d138e721a860f9d /src/backend/parser | |
parent | 1c51c7d5ffd407426f314b2cd317ef77f14efb1f (diff) | |
download | postgresql-bdca82f44d0e0168dece56cbd53b54ba142f328f.tar.gz postgresql-bdca82f44d0e0168dece56cbd53b54ba142f328f.zip |
Add a relkind field to RangeTblEntry to avoid some syscache lookups.
The recent additions for FDW support required checking foreign-table-ness
in several places in the parse/plan chain. While it's not clear whether
that would really result in a noticeable slowdown, it seems best to avoid
any performance risk by keeping a copy of the relation's relkind in
RangeTblEntry. That might have some other uses later, anyway.
Per discussion.
Diffstat (limited to 'src/backend/parser')
-rw-r--r-- | src/backend/parser/analyze.c | 23 | ||||
-rw-r--r-- | src/backend/parser/parse_relation.c | 2 | ||||
-rw-r--r-- | src/backend/parser/parse_target.c | 2 |
3 files changed, 9 insertions, 18 deletions
diff --git a/src/backend/parser/analyze.c b/src/backend/parser/analyze.c index c7a7a230767..7f28d9df4f5 100644 --- a/src/backend/parser/analyze.c +++ b/src/backend/parser/analyze.c @@ -40,7 +40,6 @@ #include "parser/parse_target.h" #include "parser/parsetree.h" #include "rewrite/rewriteManip.h" -#include "utils/lsyscache.h" #include "utils/rel.h" @@ -2178,13 +2177,11 @@ transformLockingClause(ParseState *pstate, Query *qry, LockingClause *lc, { case RTE_RELATION: /* ignore foreign tables */ - if (get_rel_relkind(rte->relid) != RELKIND_FOREIGN_TABLE) - { - applyLockingClause(qry, i, - lc->forUpdate, lc->noWait, - pushedDown); - rte->requiredPerms |= ACL_SELECT_FOR_UPDATE; - } + if (rte->relkind == RELKIND_FOREIGN_TABLE) + break; + applyLockingClause(qry, i, + lc->forUpdate, lc->noWait, pushedDown); + rte->requiredPerms |= ACL_SELECT_FOR_UPDATE; break; case RTE_SUBQUERY: applyLockingClause(qry, i, @@ -2231,11 +2228,11 @@ transformLockingClause(ParseState *pstate, Query *qry, LockingClause *lc, switch (rte->rtekind) { case RTE_RELATION: - if (get_rel_relkind(rte->relid) == RELKIND_FOREIGN_TABLE) + if (rte->relkind == RELKIND_FOREIGN_TABLE) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("SELECT FOR UPDATE/SHARE cannot be used with foreign table \"%s\"", - get_rel_name(rte->relid)), + rte->eref->aliasname), parser_errposition(pstate, thisrel->location))); applyLockingClause(qry, i, lc->forUpdate, lc->noWait, @@ -2256,12 +2253,6 @@ transformLockingClause(ParseState *pstate, Query *qry, LockingClause *lc, errmsg("SELECT FOR UPDATE/SHARE cannot be applied to a join"), parser_errposition(pstate, thisrel->location))); break; - case RTE_SPECIAL: - ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("SELECT FOR UPDATE/SHARE cannot be applied to NEW or OLD"), - parser_errposition(pstate, thisrel->location))); - break; case RTE_FUNCTION: ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), diff --git a/src/backend/parser/parse_relation.c b/src/backend/parser/parse_relation.c index 497c726f314..033ed411fde 100644 --- a/src/backend/parser/parse_relation.c +++ b/src/backend/parser/parse_relation.c @@ -894,6 +894,7 @@ addRangeTableEntry(ParseState *pstate, lockmode = isLockedRefname(pstate, refname) ? RowShareLock : AccessShareLock; rel = parserOpenTable(pstate, relation, lockmode); rte->relid = RelationGetRelid(rel); + rte->relkind = rel->rd_rel->relkind; /* * Build the list of effective column names using user-supplied aliases @@ -956,6 +957,7 @@ addRangeTableEntryForRelation(ParseState *pstate, rte->rtekind = RTE_RELATION; rte->alias = alias; rte->relid = RelationGetRelid(rel); + rte->relkind = rel->rd_rel->relkind; /* * Build the list of effective column names using user-supplied aliases diff --git a/src/backend/parser/parse_target.c b/src/backend/parser/parse_target.c index a0761da875b..e9ace37e2d8 100644 --- a/src/backend/parser/parse_target.c +++ b/src/backend/parser/parse_target.c @@ -305,7 +305,6 @@ markTargetListOrigin(ParseState *pstate, TargetEntry *tle, markTargetListOrigin(pstate, tle, aliasvar, netlevelsup); } break; - case RTE_SPECIAL: case RTE_FUNCTION: case RTE_VALUES: /* not a simple relation, leave it unmarked */ @@ -1357,7 +1356,6 @@ expandRecordVariable(ParseState *pstate, Var *var, int levelsup) switch (rte->rtekind) { case RTE_RELATION: - case RTE_SPECIAL: case RTE_VALUES: /* |