Sorry for the delay.

I am attempting to construct a JDBC test case that reproduces the problem. 

I have installed the patch and have not seen the crash since.

On Jan 13, 2010, at 11:58 AM, Tom Lane wrote:

> I wrote:
>> After puzzling over this for many hours, I have a theory that seems to
>> fit the facts.
> 
> I think the attached patch will fix it for you --- please test.
> 
>                       regards, tom lane
> 
> Index: src/backend/utils/cache/plancache.c
> ===================================================================
> RCS file: /cvsroot/pgsql/src/backend/utils/cache/plancache.c,v
> retrieving revision 1.27.2.1
> diff -c -r1.27.2.1 plancache.c
> *** src/backend/utils/cache/plancache.c       14 Jul 2009 15:37:55 -0000      
> 1.27.2.1
> --- src/backend/utils/cache/plancache.c       13 Jan 2010 16:46:07 -0000
> ***************
> *** 1050,1063 ****
>  void
>  ResetPlanCache(void)
>  {
> !     ListCell   *lc;
> 
> !     foreach(lc, cached_plans_list)
>       {
> !             CachedPlanSource *plansource = (CachedPlanSource *) lfirst(lc);
>               CachedPlan *plan = plansource->plan;
> 
> !             if (plan)
> !                     plan->dead = true;
>       }
>  }
> --- 1050,1106 ----
>  void
>  ResetPlanCache(void)
>  {
> !     ListCell   *lc1;
> 
> !     foreach(lc1, cached_plans_list)
>       {
> !             CachedPlanSource *plansource = (CachedPlanSource *) lfirst(lc1);
>               CachedPlan *plan = plansource->plan;
> +             ListCell   *lc2;
> 
> !             /* No work if it's already invalidated */
> !             if (!plan || plan->dead)
> !                     continue;
> ! 
> !             /*
> !              * We *must not* mark transaction control statements as dead,
> !              * particularly not ROLLBACK, because they may need to be 
> executed in
> !              * aborted transactions when we can't revalidate them (cf bug 
> #5269).
> !              * In general there is no point in invalidating utility 
> statements
> !              * since they have no plans anyway.  So mark it dead only if it
> !              * contains at least one non-utility statement.
> !              */
> !             if (plan->fully_planned)
> !             {
> !                     /* Search statement list for non-utility statements */
> !                     foreach(lc2, plan->stmt_list)
> !                     {
> !                             PlannedStmt *plannedstmt = (PlannedStmt *) 
> lfirst(lc2);
> ! 
> !                             Assert(!IsA(plannedstmt, Query));
> !                             if (IsA(plannedstmt, PlannedStmt))
> !                             {
> !                                     /* non-utility statement, so invalidate 
> */
> !                                     plan->dead = true;
> !                                     break;          /* out of stmt_list 
> scan */
> !                             }
> !                     }
> !             }
> !             else
> !             {
> !                     /* Search Query list for non-utility statements */
> !                     foreach(lc2, plan->stmt_list)
> !                     {
> !                             Query      *query = (Query *) lfirst(lc2);
> ! 
> !                             Assert(IsA(query, Query));
> !                             if (query->commandType != CMD_UTILITY)
> !                             {
> !                                     /* non-utility statement, so invalidate 
> */
> !                                     plan->dead = true;
> !                                     break;          /* out of stmt_list 
> scan */
> !                             }
> !                     }
> !             }
>       }
>  }


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

Reply via email to