From bb742407947ad1cbf19355d24282380d576e7654 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sun, 20 Feb 2011 00:17:18 -0500 Subject: Implement an API to let foreign-data wrappers actually be functional. This commit provides the core code and documentation needed. A contrib module test case will follow shortly. Shigeru Hanada, Jan Urbanski, Heikki Linnakangas --- src/backend/parser/analyze.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) (limited to 'src/backend/parser/analyze.c') diff --git a/src/backend/parser/analyze.c b/src/backend/parser/analyze.c index 22447f92a2e..c7a7a230767 100644 --- a/src/backend/parser/analyze.c +++ b/src/backend/parser/analyze.c @@ -40,6 +40,7 @@ #include "parser/parse_target.h" #include "parser/parsetree.h" #include "rewrite/rewriteManip.h" +#include "utils/lsyscache.h" #include "utils/rel.h" @@ -2176,9 +2177,14 @@ transformLockingClause(ParseState *pstate, Query *qry, LockingClause *lc, switch (rte->rtekind) { case RTE_RELATION: - applyLockingClause(qry, i, - lc->forUpdate, lc->noWait, pushedDown); - rte->requiredPerms |= ACL_SELECT_FOR_UPDATE; + /* 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; + } break; case RTE_SUBQUERY: applyLockingClause(qry, i, @@ -2225,6 +2231,12 @@ transformLockingClause(ParseState *pstate, Query *qry, LockingClause *lc, switch (rte->rtekind) { case RTE_RELATION: + if (get_rel_relkind(rte->relid) == 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)), + parser_errposition(pstate, thisrel->location))); applyLockingClause(qry, i, lc->forUpdate, lc->noWait, pushedDown); -- cgit v1.2.3