On 10/5/16, Andres Freund <and...@anarazel.de> wrote: > On 2016-10-05 15:44:56 -0700, Jeff Janes wrote: >> On Wed, Oct 5, 2016 at 3:29 PM, Andres Freund <and...@anarazel.de> wrote: >> > ALTER TABLE foo ALTER COLUMN withdefault DROP DEFAULT; >> > INSERT id = 1; >> > ALTER TABLE foo ALTER COLUMN withdefault SET DEFAULT 1; >> > ALTER TABLE foo ALTER COLUMN withdefault DROP DEFAULT; >> > INSERT id = 2; >> > ALTER TABLE foo ALTER COLUMN withdefault SET DEFAULT 2; >> > ALTER TABLE foo ALTER COLUMN withdefault DROP DEFAULT; >> > INSERT id = 3; >> > ALTER TABLE foo ALTER COLUMN withdefault SET DEFAULT 3; >> > >> > The result here would be that there's three rows with a default value >> > for foo that's the same as their id. None of them has that column >> > present in the row. >> > >> >> My understanding is that all of those would be materialized. > > But that'd require a table rewrite, as none of the above INSERTs were > done when a default was in place.
Since they did not have the default value, that tuples are written with actual TupleDesc.natts where att_isnull for "withdefault" column is set (actually the column does not have default for inserted tuples in your case). > But each has a different "applicable" default value. No, their values are constructed "from scratch", not fetched from a heap, so "pre-alter-add-column" default is not applicable for them. >> The only >> default that isn't materialized is the one in effect in the same >> statement >> in which that column was added. Since a column can only be added once, >> the >> default in effect at the time the column was added can never change, no >> matter what you do to the default later on. > > DROP DEFAULT pretty much does that, because it allows multiple (set of) > rows with no value (or a NULL) for a specific column, but with differing > applicable default values. DROP DEFAULT is for "post-alter-add-column" tuples, it does not affects "pre-alter-add-column" ones. -- Best regards, Vitaly Burovoy -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers