Re: DROP COLUMN Proposal - Mailing list pgsql-hackers

From Hannu Krosing
Subject Re: DROP COLUMN Proposal
Date
Msg-id 1025519488.3646.30.camel@taru.tm.ee
Whole thread Raw
In response to DROP COLUMN Proposal  ("Christopher Kings-Lynne" <chriskl@familyhealth.com.au>)
Responses Re: DROP COLUMN Proposal
List pgsql-hackers
On Mon, 2002-07-01 at 09:47, Christopher Kings-Lynne wrote:
> Hi All,
> 
> I've been thinking about this DROP COLUMN business (sorry to start another
> spammy, flamey thread!).  I'm taking ideas from lots of sources here.
> 
> How does this sound for a process?
> 
> 1.
> A new column is added to pg_attribute called 'attisdropped'.  It, of course,
> defaults to false.
> 
> 2.
> The column expansion (*) code and the code that checks for valid column
> references everywhere in the codebase is changed to also check the
> attisdropped field.  Does someone have a comprehensive list of places to be
> changed?

It seems at least easy to test/debug incrementally:

i.e put in the 'attisdropped' column with default 0 and _not_ the actual
DROP COLUMN command. then test by manually setting and unsetting it
until everything works, then switch on the command.

> 3.
> The DROP COLUMN command does nothing but set the attisdropped of a column to
> true, 

This will probably require a full lock on system tables to avoid nasty
border conditions when updating caches. But we probably have something
like it for drop table already.

> and rename the column to something like DELETED_old_col_name.

With some number appended for the case when we want to drop several
columns with the same same name.

The name might be '-old_col_name' to save space ( not to overrun
MAX_IDENTIFIER_LENGTH ) or even '-ld_col_name'

> The
> column renaming will help people using non-attisdropped aware admin programs
> see what's what, plus it will allow people to create a new column with the
> same name as the column just dropped.
> 
> Now the dropped column will be invisible.  As you update rows, etc. the
> space will be reclaimed in the table as NULLs are put in where the old value
> used to be. 

You probably have to set DEFAULT for this column to NULL to achieve it.
And dropping / modifying indexes and constraints that reference the
deleted column .

> Is this correct?
> 
> 4.
> A new command, something like "ALTER TABLE tab RECLAIM;" will be able to be
> run on tables.  It will basically go through the entire table and rewrite
> every row as is, NULLifying all dropped columns in the table.  This gives
> the DBA the option of recovering his/her space if they want.

Could it not just be an oprion to "VACUUM table "?

> Notes
> -----
> a. What happens with TOASTed columns that are dropped?

What happens currently when rows with TOASTed cols are deleted/updated ?

> b. Would it be worth implementing an 'UNDROP' command...?

I don't think so. Better to resurrect some form of limited time travel
on system level, so that one can get back the data if it is really
needed.

> c. Do we need an 'attisreclaimed' field in pg_attribute to indicate that a
> field as been fully reclaimed, or do we just let people run it whenever they
> want (even if it has no effect other than to waste time)?
> d. Are there any other comments?
> 
> Basically, I would like to come up with a 'white paper' implementation that
> we can all agree on.  Then, I will try to code some parts myself, and
> solicit help from others for other parts.  Hopefully, together we can get a
> DROP COLUMN implementation.  The most important step, however, is to agree
> on an implementation spec.

Ironically, often the most important step in reaching agreement is
showing clean working  code ;)

> Hopefully I can get the www person to set up a project page (like the
> proposed win32 project page) to coordinate things.

---------------
Hannu






pgsql-hackers by date:

Previous
From: "Christopher Kings-Lynne"
Date:
Subject: Re: DROP COLUMN Proposal
Next
From: Manfred Koizar
Date:
Subject: HeapTupleHeader withoud oid