(2014/12/12 10:37), Tom Lane wrote:
> Yeah, this is clearly a thinko: really, nothing in the planner should
> be using get_parse_rowmark().  I looked around for other errors of the
> same type and found that postgresGetForeignPlan() is also using
> get_parse_rowmark().  While that's harmless at the moment because we
> don't support foreign tables as children, it's still wrong.  Will
> fix that too.

I don't think we need to fix that too.  In order to support that, I'm
proposing to modify postgresGetForeignPlan() in the following way [1]
(see fdw-inh-5.patch).

*** a/contrib/postgres_fdw/postgres_fdw.c
--- b/contrib/postgres_fdw/postgres_fdw.c
***************
*** 824,834 **** postgresGetForeignPlan(PlannerInfo *root,
        {
                RowMarkClause *rc = get_parse_rowmark(root->parse, 
baserel->relid);

                if (rc)
                {
                        /*
!                        * Relation is specified as a FOR UPDATE/SHARE target, 
so handle
!                        * that.
                         *
                         * For now, just ignore any [NO] KEY specification, 
since (a) it's
                         * not clear what that means for a remote table that we 
don't have
--- 824,847 ----
        {
                RowMarkClause *rc = get_parse_rowmark(root->parse, 
baserel->relid);

+               /*
+                * It's possible that relation is contained in an inheritance 
set and
+                * that parent relation is selected FOR UPDATE/SHARE.  If so, 
get the
+                * RowMarkClause for parent relation.
+                */
+               if (rc == NULL)
+               {
+                       PlanRowMark *prm = get_plan_rowmark(root->rowMarks, 
baserel->relid);
+
+                       if (prm && prm->rti != prm->prti)
+                               rc = get_parse_rowmark(root->parse, prm->prti);
+               }
+
                if (rc)
                {
                        /*
!                        * Relation or parent relation is specified as a FOR 
UPDATE/SHARE
!                        * target, so handle that.
                         *
                         * For now, just ignore any [NO] KEY specification, 
since (a) it's
                         * not clear what that means for a remote table that we 
don't have

[1] http://www.postgresql.org/message-id/5487bb9d.7070...@lab.ntt.co.jp

Thanks,

Best regards,
Etsuro Fujita


-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to