Re: BUG #11638: Transaction safety fails when constraints are dropped and analyze is done

From: Andres Freund <andres(at)2ndquadrant(dot)com>
To: cg(at)osss(dot)net
Cc: pgsql-bugs(at)postgresql(dot)org
Subject: Re: BUG #11638: Transaction safety fails when constraints are dropped and analyze is done
Date: 2014-10-10 19:14:01
Message-ID: 20141010191401.GA18020@awork2.anarazel.de
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-bugs

Hi,

On 2014-10-10 18:14:33 +0000, cg(at)osss(dot)net wrote:
> The following bug has been logged on the website:
>
> Bug reference: 11638
> Logged by: Casey Allen Shobe
> Email address: cg(at)osss(dot)net
> PostgreSQL version: 9.3.5
> Operating system: Linux (RHEL 5)
> Description:
>
> Discovered on 8.4.5, reproducible on 9.3.5.
>
> The paste pretty much explains it all:
> http://pgsql.privatepaste.com/162682d176

Please attach - the paste will expire in a couple days. That makes
researching issues later quite annoying.

> When, within a transaction:
> * I drop a foreign key (or any) constraint.
> * Load some data to the table which won't fit the constraint.
> * Analyze the table.
> * Attempt to re-add the constraint which fails and should roll back the
> whole transaction.
>
> The constraint is still missing after rollback.
>
> If I take out the analyze step, it works as expected.

Yuck. This is ugly. The problem is this nice bit:

void
vac_update_relstats(Relation relation,
BlockNumber num_pages, double num_tuples,
BlockNumber num_all_visible_pages,
bool hasindex, TransactionId frozenxid,
{ MultiXactId minmulti)
...
if (pgcform->relhastriggers && relation->trigdesc == NULL)
{
pgcform->relhastriggers = false;
dirty = true;
}
...
/* If anything changed, write out the tuple. */
if (dirty)
heap_inplace_update(rd, ctup);
}

That's, like, a *seriously* bad idea. The current xact doesn't see a
trigger, so we remove relhastriggers (and similarly other relhas*
stuff). The kicker is that we do so *nontransactionally*.

That's fine enough for VACUUM because that doesn't run in a
transaction. But vac_update_relstats is also run for ANALYZE.

I've no time to think this through right now, but my current thinking is
that we should use a transactional update for ANALYZE.

Greetings,

Andres Freund

--
Andres Freund http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

In response to

Responses

Browse pgsql-bugs by date

  From Date Subject
Next Message Casey & Gina 2014-10-10 19:22:57 Re: BUG #11638: Transaction safety fails when constraints are dropped and analyze is done
Previous Message Will Glynn 2014-10-10 18:35:10 Re: BUG #11637: SQL function volatility is ignored on index creation