Thread: Open Items

Open Items

From
Bruce Momjian
Date:
I have annotated the open items:

---------------------------------------------------------------------------

                              PostgreSQL 8.0 Open Items                              =========================

Current version at http://candle.pha.pa.us/cgi-bin/pgopenitems.

Changes
-------
* Win32o fix query cancel in psql
This requires a new thread to handle the control-C signal
o fix shared memory on Win2k terminal server
We might be able to just mark this as not supported.
o Handle "lost signals" on backend startup (eg. shutdown,  config file changes, etc);  signals are SIG_DFL on startup
The problem here is that the postmaster might send signals to achild before the signal handlers are installed.  We
don'thavethis problem on unix because we fork and inherit the signalhandlers.
 

* Tablespaceo fix ambiguity for objects using default tablespaces
CREATE TABLE test(a int4) tablespace loc;CREATE UNIQUE INDEX test_a_idx3 ON test(a) tablespace pg_default;
Index test_a_idx3 has a tablespace value of zero.  pg_get_indexdef()thinks the index is in loc even though it is in
pg_default. Andif you move test the index is thought to move too.  The confusionis that there are not separate defaults
fordatabase/schema/table.
 
o fix case where template db already uses target tablespace
-- from database testCREATE tablespace blah location '/bjm/tmp';CREATE TABLE foo (i int) tablespace blah;CREATE
DATABASEfoo tablespace blah template test;ERROR:  could not initialize database directoryDETAIL:  Directory
"/u/pgsql/data/pg_tblspc/17232/17235"already exists.
 
o remove non-portable TABLESPACE clause from CREATE TABLE and  use a new default_tablespace SET variable
This same method is used for WITH/WITHOUT OIDS.

* allow libpq to check parameterized data types
* adjust bgwriter defaults, allow disabling
* synchonize supported encodings and docs

Completed Since Previoius Beta
------------------------------
* cleanup FRONTEND use in /port, malloc, elog
* update encoding list to include win1250
* make pgxs install by default
* Tablespaceo fix error message when creating objects in schema that has a  dropped tablespace as its default
* Win32o disable readline-required psql optionso fix SSL compileso add binary version stampso fix signal-safe socket
handlerfor SSLo start pg_autovacuum easilyo remove log timezone string from log_line_prefix '%t'o fix MinGW libpq to
exportonly required symbolso fix MSVC build to export SSL symbols
 


--  Bruce Momjian                        |  http://candle.pha.pa.us pgman@candle.pha.pa.us               |  (610)
359-1001+  If your life is a hard drive,     |  13 Roberts Road +  Christ can be your backup.        |  Newtown Square,
Pennsylvania19073
 


Re: Open Items

From
Tom Lane
Date:
Bruce Momjian <pgman@candle.pha.pa.us> writes:
>     o fix ambiguity for objects using default tablespaces

>     CREATE TABLE test(a int4) tablespace loc;
>     CREATE UNIQUE INDEX test_a_idx3 ON test(a) tablespace pg_default;

>     Index test_a_idx3 has a tablespace value of zero.  pg_get_indexdef()
>     thinks the index is in loc even though it is in pg_default.  And
>     if you move test the index is thought to move too.  The confusion
>     is that there are not separate defaults for database/schema/table.

I don't think it's nearly as complicated as all that; it's just a thinko
in pg_get_indexdef.

http://developer.postgresql.org/cvsweb.cgi/pgsql/src/backend/utils/adt/ruleutils.c.diff?r1=1.182&r2=1.183
        regards, tom lane


Re: Open Items

From
Tom Lane
Date:
Bruce Momjian <pgman@candle.pha.pa.us> writes:
>     o remove non-portable TABLESPACE clause from CREATE TABLE and
>       use a new default_tablespace SET variable

I'm coming around to the conclusion that this is simply a bad idea.

The problem with having such a SET variable is that it plays hob with
the existing definition about where schemas and tables get a default
tablespace from.  Which source wins (the database or schema default
tablespace, or the SET variable)?  And why?  The only really clean way
to have a SET variable for this is to forget about schema- or
table-based defaults.  Do we want to do that?  (Hey, it'd solve the
problem with schema tablespaces being droppable, because there wouldn't
*be* any such thing as a schema's tablespace anymore.  But on the whole
this seems like a step backward in usability.)

What we might want to do is invent a --notablespace option for pg_dump,
comparable to --noowner, to let someone make a dump that contains no
TABLESPACE clauses.
        regards, tom lane


Re: Open Items

From
Gavin Sherry
Date:
On Sun, 17 Oct 2004, Tom Lane wrote:

> Bruce Momjian <pgman@candle.pha.pa.us> writes:
> >     o remove non-portable TABLESPACE clause from CREATE TABLE and
> >       use a new default_tablespace SET variable
>
> I'm coming around to the conclusion that this is simply a bad idea.

I feel the same way for more or less the reasons you outline.

> What we might want to do is invent a --notablespace option for pg_dump,
> comparable to --noowner, to let someone make a dump that contains no
> TABLESPACE clauses.

That's a useful feature but I'm not sure it solves the problem people
originally put (to me at least). User has data in a tablespace on a
seperate device. The device crashes fatally and the user needs to restore
the database. All the user's dumps contain tablespace clauses because the
user did not anticipate the device dying. This, I think, is why people
wanted to either ignore tablespace clauses, have an override or something
else.

I still think, however, that a workable solution is to bring up a new
system, create the tablespaces on some online partition, and pg_restore
the dump. pg_dump does not dump CREATE TABLESPACE so we wont encounter
problems there.

Have I missed something there? (Highly likely as I am still pre-coffee).

Gavin


Re: Open Items

From
Bruce Momjian
Date:
Tom Lane wrote:
> Bruce Momjian <pgman@candle.pha.pa.us> writes:
> >     o fix ambiguity for objects using default tablespaces
> 
> >     CREATE TABLE test(a int4) tablespace loc;
> >     CREATE UNIQUE INDEX test_a_idx3 ON test(a) tablespace pg_default;
> 
> >     Index test_a_idx3 has a tablespace value of zero.  pg_get_indexdef()
> >     thinks the index is in loc even though it is in pg_default.  And
> >     if you move test the index is thought to move too.  The confusion
> >     is that there are not separate defaults for database/schema/table.
> 
> I don't think it's nearly as complicated as all that; it's just a thinko
> in pg_get_indexdef.
> 
> http://developer.postgresql.org/cvsweb.cgi/pgsql/src/backend/utils/adt/ruleutils.c.diff?r1=1.182&r2=1.183

OK, I see that now.  Item marked as done.

--  Bruce Momjian                        |  http://candle.pha.pa.us pgman@candle.pha.pa.us               |  (610)
359-1001+  If your life is a hard drive,     |  13 Roberts Road +  Christ can be your backup.        |  Newtown Square,
Pennsylvania19073
 


Re: Open Items

From
Bruce Momjian
Date:
Tom Lane wrote:
> Bruce Momjian <pgman@candle.pha.pa.us> writes:
> >     o remove non-portable TABLESPACE clause from CREATE TABLE and
> >       use a new default_tablespace SET variable
> 
> I'm coming around to the conclusion that this is simply a bad idea.
> 
> The problem with having such a SET variable is that it plays hob with
> the existing definition about where schemas and tables get a default
> tablespace from.  Which source wins (the database or schema default
> tablespace, or the SET variable)?  And why?  The only really clean way
> to have a SET variable for this is to forget about schema- or
> table-based defaults.  Do we want to do that?  (Hey, it'd solve the
> problem with schema tablespaces being droppable, because there wouldn't
> *be* any such thing as a schema's tablespace anymore.  But on the whole
> this seems like a step backward in usability.)

Agreed, a step backwards, but see below.

> What we might want to do is invent a --notablespace option for pg_dump,
> comparable to --noowner, to let someone make a dump that contains no
> TABLESPACE clauses.

Yea, that would work, but we went through so much work to allow SQL
standard DDL statements, and it seems a shame to break it just for
tablespaces.  

And, having it be a separate SET would also allow the tablespace
creation to fail and still get the objects created.  (If the
explicit_tablespace doesn't exist during CREATE, we throw a warning. 
This would contrast with a create _failure_ when the tablespace doesn't
exist and you say 'TABLESPACE t1' in CREATE.)  

So there were actually two uses for this, one for standards compliance,
and the other was for flexibility in restoring to a system where the
tablespaces can't be created.  The SET could give us different behavior
(warning vs. error) which would be useful for pg_dump.

Could we call it "explicit_tablespace" and when it is "", it is the
default, but when it isn't it is just like using 'TABLESPACE t1' in the
CREATE, but throws a warning instead of an error if the tablespace
doesn't exist?  

My assumption is that it would not be like the default_with_oids
variable usage by pg_dump because it would be reset to '' (default) by
pg_dump after each time it is used.  I assume explicit_tablespace would
always override the schema or database tablespace because it is
"explicit".

In fact this would partially fix the TODO we have:* Allow database recovery where tablespaces can't be created  When a
pg_dumpis restored, all tablespaces will attempt to be created  in their original locations. If this fails, the user
mustbe able to  adjust the restore process.
 


--  Bruce Momjian                        |  http://candle.pha.pa.us pgman@candle.pha.pa.us               |  (610)
359-1001+  If your life is a hard drive,     |  13 Roberts Road +  Christ can be your backup.        |  Newtown Square,
Pennsylvania19073
 


Re: Open Items

From
Bruce Momjian
Date:
Gavin Sherry wrote:
> On Sun, 17 Oct 2004, Tom Lane wrote:
> 
> > Bruce Momjian <pgman@candle.pha.pa.us> writes:
> > >     o remove non-portable TABLESPACE clause from CREATE TABLE and
> > >       use a new default_tablespace SET variable
> >
> > I'm coming around to the conclusion that this is simply a bad idea.
> 
> I feel the same way for more or less the reasons you outline.
> 
> > What we might want to do is invent a --notablespace option for pg_dump,
> > comparable to --noowner, to let someone make a dump that contains no
> > TABLESPACE clauses.
> 
> That's a useful feature but I'm not sure it solves the problem people
> originally put (to me at least). User has data in a tablespace on a
> seperate device. The device crashes fatally and the user needs to restore
> the database. All the user's dumps contain tablespace clauses because the
> user did not anticipate the device dying. This, I think, is why people
> wanted to either ignore tablespace clauses, have an override or something
> else.

See my posting about using 'explicit_tablespace' and having it issue a
warning if it doesn't exist during create.

> I still think, however, that a workable solution is to bring up a new
> system, create the tablespaces on some online partition, and pg_restore
> the dump. pg_dump does not dump CREATE TABLESPACE so we wont encounter
> problems there.

pg_dumpall does dump CREATE TABLESPACE.  It depends if he is using
pg_dump on individual databases or pg_dumpall.  If he is using pg_dump
he is also pg_dumpall --globals-only and the global restore is where he
can made the adjustments.  Of course, the 'explicit_tablespace' works
with pg_dumpall too because everything destined for a non-existant
tablespace goes into the default for that object.

--  Bruce Momjian                        |  http://candle.pha.pa.us pgman@candle.pha.pa.us               |  (610)
359-1001+  If your life is a hard drive,     |  13 Roberts Road +  Christ can be your backup.        |  Newtown Square,
Pennsylvania19073
 


Using ALTER TABLESPACE in pg_dump

From
Bruce Momjian
Date:
One additional idea for this item is to use CREATE to first create the
object, then move it using ALTER, and the ALTER might fail if the
tablespace doesn't exist.  The only problem with that is this TODO item:
       o Allow databases and schemas to be moved to different tablespaces
       One complexity is whether moving a schema should move all existing       schema objects or just define the
locationfor future object creation.
 

If we add a new SET variable and use it in pg_dump we will have to
support it forever even if there is no practical use for it.

(ALTER was originally part of the open item but I removed it thinking we
might not have space to load the table in the default location, but I
forgot we create it empty and could move it before we load it.)

One interesting side-affect of allowing tablespace specification to fail
is that it might give users enough control that we can mark this item as
done:* Allow database recovery where tablespaces can't be created  When a pg_dump is restored, all tablespaces will
attemptto be created  in their original locations. If this fails, the user must be able to  adjust the restore
process.

One idea would be that users could create any tablespaces or objects
they want to change before they do the restore and the restore would use
their new configuration and just error/skip the items they already
created.  (This would also behave well if you load the dump and say stop
on any errors.)

For example, if you want to eliminate a tablespace, you just don't
create the directory and load your dump.  Tablespace create will fail,
and all objects that use that tablespace will fail their ALTER and will
remain in their default locations.  This actually seems less error-prone
than the idea of them manually changing things in the dump file.

---------------------------------------------------------------------------

Bruce Momjian wrote:
> Tom Lane wrote:
> > Bruce Momjian <pgman@candle.pha.pa.us> writes:
> > >     o remove non-portable TABLESPACE clause from CREATE TABLE and
> > >       use a new default_tablespace SET variable
> > 
> > I'm coming around to the conclusion that this is simply a bad idea.
> > 
> > The problem with having such a SET variable is that it plays hob with
> > the existing definition about where schemas and tables get a default
> > tablespace from.  Which source wins (the database or schema default
> > tablespace, or the SET variable)?  And why?  The only really clean way
> > to have a SET variable for this is to forget about schema- or
> > table-based defaults.  Do we want to do that?  (Hey, it'd solve the
> > problem with schema tablespaces being droppable, because there wouldn't
> > *be* any such thing as a schema's tablespace anymore.  But on the whole
> > this seems like a step backward in usability.)
> 
> Agreed, a step backwards, but see below.
> 
> > What we might want to do is invent a --notablespace option for pg_dump,
> > comparable to --noowner, to let someone make a dump that contains no
> > TABLESPACE clauses.
> 
> Yea, that would work, but we went through so much work to allow SQL
> standard DDL statements, and it seems a shame to break it just for
> tablespaces.  
> 
> And, having it be a separate SET would also allow the tablespace
> creation to fail and still get the objects created.  (If the
> explicit_tablespace doesn't exist during CREATE, we throw a warning. 
> This would contrast with a create _failure_ when the tablespace doesn't
> exist and you say 'TABLESPACE t1' in CREATE.)  
> 
> So there were actually two uses for this, one for standards compliance,
> and the other was for flexibility in restoring to a system where the
> tablespaces can't be created.  The SET could give us different behavior
> (warning vs. error) which would be useful for pg_dump.
> 
> Could we call it "explicit_tablespace" and when it is "", it is the
> default, but when it isn't it is just like using 'TABLESPACE t1' in the
> CREATE, but throws a warning instead of an error if the tablespace
> doesn't exist?  
> 
> My assumption is that it would not be like the default_with_oids
> variable usage by pg_dump because it would be reset to '' (default) by
> pg_dump after each time it is used.  I assume explicit_tablespace would
> always override the schema or database tablespace because it is
> "explicit".
> 
> In fact this would partially fix the TODO we have:
>     
>     * Allow database recovery where tablespaces can't be created
>     
>       When a pg_dump is restored, all tablespaces will attempt to be created
>       in their original locations. If this fails, the user must be able to
>       adjust the restore process.
> 
> 
> -- 
>   Bruce Momjian                        |  http://candle.pha.pa.us
>   pgman@candle.pha.pa.us               |  (610) 359-1001
>   +  If your life is a hard drive,     |  13 Roberts Road
>   +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073
> 
> ---------------------------(end of broadcast)---------------------------
> TIP 1: subscribe and unsubscribe commands go to majordomo@postgresql.org
> 

--  Bruce Momjian                        |  http://candle.pha.pa.us pgman@candle.pha.pa.us               |  (610)
359-1001+  If your life is a hard drive,     |  13 Roberts Road +  Christ can be your backup.        |  Newtown Square,
Pennsylvania19073
 


Re: Open Items

From
Fabien COELHO
Date:
Dear Tom,

>>     o remove non-portable TABLESPACE clause from CREATE TABLE and
>>       use a new default_tablespace SET variable
>
> I'm coming around to the conclusion that this is simply a bad idea.

I agree that the "set" approach is error prone.

Another idea was to issue an "ALTER" after the CREATE.

That would move the empty table from one tablespace to another, at small 
cost. If it fails, it is simply ignored by the restoration process,
but the table was already created so it exists.

> What we might want to do is invent a --notablespace option for pg_dump,
> comparable to --noowner, to let someone make a dump that contains no
> TABLESPACE clauses.

(1) --notablespace would be useful, but it would not fix the problem    I had in mind, i.e. the transfer (possibly
aftera crash) of data    to another base which would not have these tablespaces. If the disk    is crashed, I cannot
redothe pg_dump.
 

(2) thus it would help to be able to decide this at "restore" time.    I think that one of the implementation idea was
tostore the    information into some headers.
 

(3) possible current workaround for the desperate admin:    (a) create fake tablespaces as necessary...    (b)
pg_restore... | sed 's/TABLESPACE .*//' | psql ...
 

Have a nice day,

-- 
Fabien Coelho - coelho@cri.ensmp.fr


Re: Open Items

From
Bruce Momjian
Date:
I just posted this idea with a new heading.  ALTER seems like the right
approach, but notice we need to complete another TODO item to allow
tablespace movement of databases and schemas.

---------------------------------------------------------------------------

Fabien COELHO wrote:
> 
> Dear Tom,
> 
> >>     o remove non-portable TABLESPACE clause from CREATE TABLE and
> >>       use a new default_tablespace SET variable
> >
> > I'm coming around to the conclusion that this is simply a bad idea.
> 
> I agree that the "set" approach is error prone.
> 
> Another idea was to issue an "ALTER" after the CREATE.
> 
> That would move the empty table from one tablespace to another, at small 
> cost. If it fails, it is simply ignored by the restoration process,
> but the table was already created so it exists.
> 
> > What we might want to do is invent a --notablespace option for pg_dump,
> > comparable to --noowner, to let someone make a dump that contains no
> > TABLESPACE clauses.
> 
> (1) --notablespace would be useful, but it would not fix the problem
>      I had in mind, i.e. the transfer (possibly after a crash) of data
>      to another base which would not have these tablespaces. If the disk
>      is crashed, I cannot redo the pg_dump.
> 
> (2) thus it would help to be able to decide this at "restore" time.
>      I think that one of the implementation idea was to store the
>      information into some headers.
> 
> (3) possible current workaround for the desperate admin:
>      (a) create fake tablespaces as necessary...
>      (b) pg_restore ... | sed 's/TABLESPACE .*//' | psql ...
> 
> Have a nice day,
> 
> -- 
> Fabien Coelho - coelho@cri.ensmp.fr
> 
> ---------------------------(end of broadcast)---------------------------
> TIP 3: if posting/reading through Usenet, please send an appropriate
>       subscribe-nomail command to majordomo@postgresql.org so that your
>       message can get through to the mailing list cleanly
> 

--  Bruce Momjian                        |  http://candle.pha.pa.us pgman@candle.pha.pa.us               |  (610)
359-1001+  If your life is a hard drive,     |  13 Roberts Road +  Christ can be your backup.        |  Newtown Square,
Pennsylvania19073
 


Re: Open Items

From
"Zeugswetter Andreas DAZ SD"
Date:
>     o fix shared memory on Win2k terminal server
>
>     We might be able to just mark this as not supported.

I have attached a patch that I think fixes this. The problem I saw
and fixed is, that the shmem created in a terminal services client is not
visible to the console (or services.msc).

It was necessary to differenciate OS versions, this might be better put
elsewhere.

I think in addition the system global name "sharemem.1" should be made more
pg specific, like "PostgreSQL.1". I have not done this since a new compile
would not detect a running old beta. But now would be the time (or never).

Andreas

Attachment

Re: Using ALTER TABLESPACE in pg_dump

From
Tom Lane
Date:
Bruce Momjian <pgman@candle.pha.pa.us> writes:
> One additional idea for this item is to use CREATE to first create the
> object, then move it using ALTER, and the ALTER might fail if the
> tablespace doesn't exist.

This seems fairly impractical, at least for indexes where there is no
way to do the ALTER before the object is filled with data.

> If we add a new SET variable and use it in pg_dump we will have to
> support it forever even if there is no practical use for it.

Yeah, that's one thing that bothers me.

> One interesting side-affect of allowing tablespace specification to fail
> is that it might give users enough control that we can mark this item as
> done:

Hmm, here's a variant idea: how about a GUC variable named something like
"soft_tablespace_specs" which when TRUE would mean that a nonexistent
tablespace name in a TABLESPACE clause is ignored (maybe with a WARNING)
rather than being an error, and so the object is created in whatever the
default tablespace for it would be.  You wouldn't even necessarily want
to have pg_dump set this true for itself, but people could turn it on
when they needed to load a dump with wrong tablespace names in it.
(If we didn't have pg_dump turn it on automatically, then we'd not be
beholden to support it forever.)
        regards, tom lane


Re: [PATCHES] Open Items

From
Bruce Momjian
Date:
Agreed on the memory name change and I will do it when I apply the
patch.

Your patch has been added to the PostgreSQL unapplied patches list at:

    http://momjian.postgresql.org/cgi-bin/pgpatches

It will be applied as soon as one of the PostgreSQL committers reviews
and approves it.

---------------------------------------------------------------------------


Zeugswetter Andreas DAZ SD wrote:
>
> >     o fix shared memory on Win2k terminal server
> >
> >     We might be able to just mark this as not supported.
>
> I have attached a patch that I think fixes this. The problem I saw
> and fixed is, that the shmem created in a terminal services client is not
> visible to the console (or services.msc).
>
> It was necessary to differenciate OS versions, this might be better put
> elsewhere.
>
> I think in addition the system global name "sharemem.1" should be made more
> pg specific, like "PostgreSQL.1". I have not done this since a new compile
> would not detect a running old beta. But now would be the time (or never).
>
> Andreas

Content-Description: shmem.win32.patch

[ Attachment, skipping... ]

>
> ---------------------------(end of broadcast)---------------------------
> TIP 7: don't forget to increase your free space map settings

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073

Re: Using ALTER TABLESPACE in pg_dump

From
Bruce Momjian
Date:
Tom Lane wrote:
> Bruce Momjian <pgman@candle.pha.pa.us> writes:
> > One additional idea for this item is to use CREATE to first create the
> > object, then move it using ALTER, and the ALTER might fail if the
> > tablespace doesn't exist.
> 
> This seems fairly impractical, at least for indexes where there is no
> way to do the ALTER before the object is filled with data.
> 
> > If we add a new SET variable and use it in pg_dump we will have to
> > support it forever even if there is no practical use for it.
> 
> Yeah, that's one thing that bothers me.
> 
> > One interesting side-affect of allowing tablespace specification to fail
> > is that it might give users enough control that we can mark this item as
> > done:
> 
> Hmm, here's a variant idea: how about a GUC variable named something like
> "soft_tablespace_specs" which when TRUE would mean that a nonexistent
> tablespace name in a TABLESPACE clause is ignored (maybe with a WARNING)
> rather than being an error, and so the object is created in whatever the
> default tablespace for it would be.  You wouldn't even necessarily want
> to have pg_dump set this true for itself, but people could turn it on
> when they needed to load a dump with wrong tablespace names in it.
> (If we didn't have pg_dump turn it on automatically, then we'd not be
> beholden to support it forever.)

That's a nice idea in that it doesn't require a SET for every object
that uses tablespace, and allows user control over tablespace failure.

The only downside is that it prevents SQL-compliant CREATE syntax in
dumps.  I was thinking you could use ALTER just for tables but then the
tablespace failure rules would be different for tables and other
objects, which is unacceptable.

--  Bruce Momjian                        |  http://candle.pha.pa.us pgman@candle.pha.pa.us               |  (610)
359-1001+  If your life is a hard drive,     |  13 Roberts Road +  Christ can be your backup.        |  Newtown Square,
Pennsylvania19073
 


Re: Using ALTER TABLESPACE in pg_dump

From
Philip Warner
Date:
At 03:15 AM 19/10/2004, Bruce Momjian wrote:
>The only downside is that it prevents SQL-compliant CREATE syntax in
>dumps.

One idea that may be worth considering: we currently dump a complete SQL 
statement including a TABLESPACE clause, which makes it hard to allow 
pg_restore to have a 'no tablespaces' option (it is fixed by pg_dump).

To solve this, we should dump the table definition as a format string and 
dump the tablespace clause (ie. ' TABLESPACE ts') as a separate part of the 
table definition TOC entry. If the user wants the tablespace to be dumped, 
then we substitute the tablespace clause, otherwise a blank string. This 
could be a useful general approach in the future.

The main issue will be quoting the clause identifiers (if we use 
'%%tablespace%%' then we have to handle columns or tables whose names 
contain '%%tablespace%%'. Simplest would be to backslash quote all '%' and 
'\' then do subs.


Also, I like the option of a soft-tablespace option, but also liked the 
idea of the fake/logical/virtual tablespaces someone suggested earlier; if 
restoring into a database without a required tablespace, then create a 
virtual tablespace that points to pg_default.



----------------------------------------------------------------
Philip Warner                    |     __---_____
Albatross Consulting Pty. Ltd.   |----/       -  \
(A.B.N. 75 008 659 498)          |          /(@)   ______---_
Tel: (+61) 0500 83 82 81         |                 _________  \
Fax: (+61) 03 5330 3172          |                 ___________ |
Http://www.rhyme.com.au          |                /           \|                                 |    --________--
PGP key available upon request,  |  /
and from pgp.mit.edu:11371       |/ 



Re: Using ALTER TABLESPACE in pg_dump

From
Tom Lane
Date:
Philip Warner <pjw@rhyme.com.au> writes:
> To solve this, we should dump the table definition as a format string and 
> dump the tablespace clause (ie. ' TABLESPACE ts') as a separate part of the 
> table definition TOC entry. If the user wants the tablespace to be dumped, 
> then we substitute the tablespace clause, otherwise a blank string. This 
> could be a useful general approach in the future.

I think the tricky part of that would be inserting the tablespace clause
in the right place; for CREATE INDEX this seems to require nontrivial
parsing.  (Both the index column definitions and the WHERE clause could
be arbitrarily complicated expressions.)  If we can get around that part
then this wouldn't be too hard.

> Also, I like the option of a soft-tablespace option, but also liked the 
> idea of the fake/logical/virtual tablespaces someone suggested earlier; if 
> restoring into a database without a required tablespace, then create a 
> virtual tablespace that points to pg_default.

Given that tablespaces are fundamentally only directories, there isn't
any particularly strong reason to not just make a real tablespace.  You
aren't going to constrain space allocation or anything by having another
directory in/alongside $PGDATA.  So I think the "virtual tablespace"
idea is basically pointless.

The real crux of all this, I think, is "what if I want to restore as
a non-superuser, and so I don't have privilege to create tablespaces
to match what the dump wants?"  The soft-failure option provides an
answer here, but creating either real or virtual tablespaces wouldn't
fly.  A "--notablespace" option in pg_restore would solve it too, but
only if you'd done an -Fc or -Ft dump; with a plain text dump you
still got trouble.
        regards, tom lane


Re: Using ALTER TABLESPACE in pg_dump

From
Philip Warner
Date:
At 03:06 AM 20/10/2004, Tom Lane wrote:
>I think the tricky part of that would be inserting the tablespace clause
>in the right place; for CREATE INDEX this seems to require nontrivial
>parsing.  (Both the index column definitions and the WHERE clause could
>be arbitrarily complicated expressions.)  If we can get around that part
>then this wouldn't be too hard.

I may be missing something here; I was assuming that pg_dump would dump 
would build the CREATE INDEX/TABLE/etc commands with the %%tablespace%% 
already embedded. pg_restore would not need to do any parsing. Or is there 
something I don't understand?





----------------------------------------------------------------
Philip Warner                    |     __---_____
Albatross Consulting Pty. Ltd.   |----/       -  \
(A.B.N. 75 008 659 498)          |          /(@)   ______---_
Tel: (+61) 0500 83 82 81         |                 _________  \
Fax: (+61) 03 5330 3172          |                 ___________ |
Http://www.rhyme.com.au          |                /           \|                                 |    --________--
PGP key available upon request,  |  /
and from pgp.mit.edu:11371       |/ 



Re: Using ALTER TABLESPACE in pg_dump

From
Tom Lane
Date:
Philip Warner <pjw@rhyme.com.au> writes:
> At 03:06 AM 20/10/2004, Tom Lane wrote:
>> I think the tricky part of that would be inserting the tablespace clause
>> in the right place; for CREATE INDEX this seems to require nontrivial
>> parsing.  (Both the index column definitions and the WHERE clause could
>> be arbitrarily complicated expressions.)  If we can get around that part
>> then this wouldn't be too hard.

> I may be missing something here; I was assuming that pg_dump would dump 
> would build the CREATE INDEX/TABLE/etc commands with the %%tablespace%% 
> already embedded. pg_restore would not need to do any parsing. Or is there 
> something I don't understand?

Maybe there's something I don't understand.  How are you expecting
pg_restore to control whether it outputs the command with a TABLESPACE
clause embedded or not, if pg_dump has already built the command string
that way?  I thought you were envisioning that pg_restore would insert,
or not insert, a TABLESPACE clause into a command that didn't initially
have one.
        regards, tom lane


Re: Using ALTER TABLESPACE in pg_dump

From
Philip Warner
Date:
At 03:25 AM 20/10/2004, Tom Lane wrote:
>Maybe there's something I don't understand.  How are you expecting
>pg_restore to control whether it outputs the command with a TABLESPACE
>clause embedded or not, if pg_dump has already built the command string
>that way?

This will only work if we modify the dump format (a new version) of 
dump/restore; the TOC entry for a table would have:

DEFINITION: CREATE TABLE fred ... %%tablespace%% ...
TABLESPACE: ' TABLESPACE t'

pg_restore would read these, and use the settings from the command line to 
either substitute an empty string or the TABLESPACE text for %%tablespace%% 
in the DEFINTION.

Same would apply for indexes etc.




----------------------------------------------------------------
Philip Warner                    |     __---_____
Albatross Consulting Pty. Ltd.   |----/       -  \
(A.B.N. 75 008 659 498)          |          /(@)   ______---_
Tel: (+61) 0500 83 82 81         |                 _________  \
Fax: (+61) 03 5330 3172          |                 ___________ |
Http://www.rhyme.com.au          |                /           \|                                 |    --________--
PGP key available upon request,  |  /
and from pgp.mit.edu:11371       |/ 



Re: Using ALTER TABLESPACE in pg_dump

From
Tom Lane
Date:
Philip Warner <pjw@rhyme.com.au> writes:
> DEFINITION: CREATE TABLE fred ... %%tablespace%% ...
> TABLESPACE: ' TABLESPACE t'

> pg_restore would read these, and use the settings from the command line to 
> either substitute an empty string or the TABLESPACE text for %%tablespace%% 
> in the DEFINTION.

Nope.  I can break that trivially, eg:

CREATE INDEX fooi ON foo (f1) WHERE upper(f1) < ' %%tablespace%%';

Not very probable, maybe, but you can't just do a blind sed-style
substitution.

There's also the nontrivial matter of how pg_dump would decide where to
insert the %%tablespace%% string into the CREATE INDEX command in the
first place.  If we're going to add code to parse CREATE INDEX and
insert the tablespace in the correct place, meseems it'd be better to
insert it on the pg_restore side.
        regards, tom lane


Re: Using ALTER TABLESPACE in pg_dump

From
Philip Warner
Date:
At 04:20 AM 20/10/2004, Tom Lane wrote:
>Nope.  I can break that trivially, eg:

Thats why in my first message I mentioned escaping and unescaping all '%' 
in the deinition.


>There's also the nontrivial matter of how pg_dump would decide where to
>insert the %%tablespace%% string into the CREATE INDEX command in the
>first place.

I'd vote against parsing, and add a parameter to get_indexdef.


>If we're going to add code to parse CREATE INDEX and
>insert the tablespace in the correct place, meseems it'd be better to
>insert it on the pg_restore side.

But if we have to parse, I'd add it in pg_dump so all items that are 
relevant can be dumped with '%%tablespace%%'. pg_dump still constructs 
CREATE TABLE statements, so that is the natural place to add the tablespace 
marker and avoid parsing for tables.




----------------------------------------------------------------
Philip Warner                    |     __---_____
Albatross Consulting Pty. Ltd.   |----/       -  \
(A.B.N. 75 008 659 498)          |          /(@)   ______---_
Tel: (+61) 0500 83 82 81         |                 _________  \
Fax: (+61) 03 5330 3172          |                 ___________ |
Http://www.rhyme.com.au          |                /           \|                                 |    --________--
PGP key available upon request,  |  /
and from pgp.mit.edu:11371       |/ 



Re: Using ALTER TABLESPACE in pg_dump

From
Robert Treat
Date:
On Tue, 2004-10-19 at 21:06, Philip Warner wrote:
> At 04:20 AM 20/10/2004, Tom Lane wrote:
> >Nope.  I can break that trivially, eg:
> 
> Thats why in my first message I mentioned escaping and unescaping all '%' 
> in the deinition.
> 
> 
> >There's also the nontrivial matter of how pg_dump would decide where to
> >insert the %%tablespace%% string into the CREATE INDEX command in the
> >first place.
> 
> I'd vote against parsing, and add a parameter to get_indexdef.
> 
> 
> >If we're going to add code to parse CREATE INDEX and
> >insert the tablespace in the correct place, meseems it'd be better to
> >insert it on the pg_restore side.
> 
> But if we have to parse, I'd add it in pg_dump so all items that are 
> relevant can be dumped with '%%tablespace%%'. pg_dump still constructs 
> CREATE TABLE statements, so that is the natural place to add the tablespace 
> marker and avoid parsing for tables.
> 

I've been thinking of an alternative solution that sounds very similar
to this. The idea is to output the CREATE TABLESPACE commands inside
pg_dump to guarantee that all tablespaces used by schema objects would
exist. A couple trouble scenarios would be 
1) tablespace already exists - this causes the CREATE TABLESPACE command
to fail, but since we no longer stop on error during restore, the
restore can continue and subsequent object creation should be fine. 
2) if you have to restore on a machine with a different disk layout,
give pg_restore a --override-tablespace command, which would substitute
pg_default tablespace into the creation command of any tablespaces that
get passed in. The bonus is that we would only have to parse on one
specific command rather than worry about parsing several different
commands. This would allow the tablespace to exist, so any subsequent
commands referring to it would not fail.


** update **

While writing up this email I tried to explain the idea to Kris Jurka on
irc, and may have found fatal flaw... I was thinking that you could
create two logical tablespaces on the same physical directory. So that
tablespace fred and wilma could both be at the same location as
pg_default, but according to the docs I'm not sure this is true:

"The directory that will be used for the tablespace. The directory must
be empty and must be owned by the PostgreSQL system user. The directory
must be specified by an absolute path name." 

OTOH looking at a copy of an 8.0 database I see the following:

template1=# select * from pg_tablespace; spcname   | spcowner | spclocation | spcacl 
------------+----------+-------------+--------pg_default |        1 |             | pg_global  |        1 |
|
 
(2 rows)

so istm there is nothing preventing pg_tablespace from having multiple
spcname using the same spclocation, however the create tablespace
command certainly wont allow it as it stands now. I'm not entirely sure
why we couldn't allow CREATE TABLESPACE to accept a variable of
pg_default which mean to just create the tablespace logically but use
the same physical location of pg_default... or possibly some other
workable solution... istm the idea is 90% of the way there, perhaps
someone can see the last few parts?


Robert Treat
-- 
Build A Brighter Lamp :: Linux Apache {middleware} PostgreSQL



Re: Using ALTER TABLESPACE in pg_dump

From
Philip Warner
Date:
At 05:41 AM 21/10/2004, Robert Treat wrote:

>I've been thinking of an alternative solution that sounds very similar
>to this. The idea is to output the CREATE TABLESPACE commands inside
>pg_dump....
>...
>1) tablespace already exists
>to fail, but since we no longer stop on error during restore,

<soapbox>
A fact I positively loath! Relying on the 'bluder-on-regardless' approach 
is not something I'd like to enshrine.
</soapbox>


>2) if you have to restore on a machine with a different disk layout,
>give pg_restore a --override-tablespace command, which would substitute
>pg_default tablespace into the creation command of any tablespaces that
>get passed in. The bonus is that we would only have to parse on one
>specific command rather than worry about parsing several different
>commands. ...

I'm still inclined to avoid any parsing if at all possible. We should hit 
the code that generates the definitions (90% in pg_dump) and turn the 
definitions into more intelligent templates.



>... I was thinking that you could
>create two logical tablespaces on the same physical directory.

This is basically the virtual/fake tablespace idea.


Sometimes I think it is worth stepping back from a problem and ask what 
would we do if we had a clean slate, then use that to inform our current 
set of decisions. I'd be very interested in other people's ideas, but my 
thinking is:

- we might not have a tablespace clause inside object definitions; we could 
add a STORE TABLE xxx IN   TABLESPACE ts statement. Not really practical 
now; but worth bearing in mind as an approach for future non-standard syntax.
- we'd have a full set of ALTER xxx SET TABLESPACE commands which moved 
relevant data etc. We have most of them.
- pg_dump would issue the alter commands after creating the object; OK, it 
moves files, not very efficient, but using a 'SET MAGIC_TABLESPACE_VAR' has 
previously been discounted as a solution.

*If* you accept this as a good approach in an ideal world, then I think we 
need to ask ourselves if we should implement the remaining ALTER commands 
in 8.0 and be done with it.

The other solutions: magic-tablespace-var, virtual-tablespaces...all seem 
to add clunky functionality that will only be used in pg_dump. If we're 
going to add something, I'd prefer not to add clutter.




----------------------------------------------------------------
Philip Warner                    |     __---_____
Albatross Consulting Pty. Ltd.   |----/       -  \
(A.B.N. 75 008 659 498)          |          /(@)   ______---_
Tel: (+61) 0500 83 82 81         |                 _________  \
Fax: (+61) 03 5330 3172          |                 ___________ |
Http://www.rhyme.com.au          |                /           \|                                 |    --________--
PGP key available upon request,  |  /
and from pgp.mit.edu:11371       |/ 



Re: Using ALTER TABLESPACE in pg_dump

From
Bruce Momjian
Date:
I have read through this thread hoping that a solution would be found
but I see we are still poking.  My ideas:
o  Anything that works only for pg_restore and hence doesn't   work for ASCII dumps isn't an acceptable solutiono
Creatingthe tablespaces before the dump is restored is   a good solution for moving tablespaces, but as Tom pointed
out,it doesn't work well for non-super-user restoreso  Moving the indexes can't be dont easily after they are   created
becausethey are not zero-length fileso  The soft-failure GUC option for non-existant tablespaces   is a hack just for
useby pg_dump.  It doesn't fix the   problem that the tablespace clause makes the SQL nonstandard.
 

And the best quote from the thread:

Philip Warner wrote:
> <soapbox>
> A fact I positively loath! Relying on the 'bluder-on-regardless' approach 
> is not something I'd like to enshrine.
> </soapbox>

The 'bluder-on-regardless' phrase is very funny.

---------------------------------------------------------------------------

Philip Warner wrote:
> At 05:41 AM 21/10/2004, Robert Treat wrote:
> 
> >I've been thinking of an alternative solution that sounds very similar
> >to this. The idea is to output the CREATE TABLESPACE commands inside
> >pg_dump....
> >...
> >1) tablespace already exists
> >to fail, but since we no longer stop on error during restore,
> 
> <soapbox>
> A fact I positively loath! Relying on the 'bluder-on-regardless' approach 
> is not something I'd like to enshrine.
> </soapbox>
> 
> 
> >2) if you have to restore on a machine with a different disk layout,
> >give pg_restore a --override-tablespace command, which would substitute
> >pg_default tablespace into the creation command of any tablespaces that
> >get passed in. The bonus is that we would only have to parse on one
> >specific command rather than worry about parsing several different
> >commands. ...
> 
> I'm still inclined to avoid any parsing if at all possible. We should hit 
> the code that generates the definitions (90% in pg_dump) and turn the 
> definitions into more intelligent templates.
> 
> 
> 
> >... I was thinking that you could
> >create two logical tablespaces on the same physical directory.
> 
> This is basically the virtual/fake tablespace idea.
> 
> 
> Sometimes I think it is worth stepping back from a problem and ask what 
> would we do if we had a clean slate, then use that to inform our current 
> set of decisions. I'd be very interested in other people's ideas, but my 
> thinking is:
> 
> - we might not have a tablespace clause inside object definitions; we could 
> add a STORE TABLE xxx IN   TABLESPACE ts statement. Not really practical 
> now; but worth bearing in mind as an approach for future non-standard syntax.
> - we'd have a full set of ALTER xxx SET TABLESPACE commands which moved 
> relevant data etc. We have most of them.
> - pg_dump would issue the alter commands after creating the object; OK, it 
> moves files, not very efficient, but using a 'SET MAGIC_TABLESPACE_VAR' has 
> previously been discounted as a solution.
> 
> *If* you accept this as a good approach in an ideal world, then I think we 
> need to ask ourselves if we should implement the remaining ALTER commands 
> in 8.0 and be done with it.
> 
> The other solutions: magic-tablespace-var, virtual-tablespaces...all seem 
> to add clunky functionality that will only be used in pg_dump. If we're 
> going to add something, I'd prefer not to add clutter.
> 
> 
> 
> 
> ----------------------------------------------------------------
> Philip Warner                    |     __---_____
> Albatross Consulting Pty. Ltd.   |----/       -  \
> (A.B.N. 75 008 659 498)          |          /(@)   ______---_
> Tel: (+61) 0500 83 82 81         |                 _________  \
> Fax: (+61) 03 5330 3172          |                 ___________ |
> Http://www.rhyme.com.au          |                /           \|
>                                   |    --________--
> PGP key available upon request,  |  /
> and from pgp.mit.edu:11371       |/ 
> 

--  Bruce Momjian                        |  http://candle.pha.pa.us pgman@candle.pha.pa.us               |  (610)
359-1001+  If your life is a hard drive,     |  13 Roberts Road +  Christ can be your backup.        |  Newtown Square,
Pennsylvania19073
 


Re: Using ALTER TABLESPACE in pg_dump

From
Philip Warner
Date:
At 12:38 PM 25/10/2004, Bruce Momjian wrote:

>         o  Anything that works only for pg_restore and hence doesn't
>            work for ASCII dumps isn't an acceptable solution

Agree; but don't forget that an ascii dump is implemented almost 
identically to "pg_dump | pg_restore", so when I refer to using pg_restore 
in this thread it almost certainly applies to ascii dumps as well. Eg. 
extra stuff in the TOC, and using the definition as a template *will* 
produce the requested output in ascii dumps.


>         o  Creating the tablespaces before the dump is restored is
>            a good solution for moving tablespaces, but as Tom pointed
>            out, it doesn't work well for non-super-user restores

And for users who want to create a single database with no extra 
tablespaces (eg. development version vs. production instance).


>         o  Moving the indexes can't be dont easily after they are
>            created because they are not zero-length files

Pity.


>         o  The soft-failure GUC option for non-existant tablespaces
>            is a hack just for use by pg_dump.  It doesn't fix the
>            problem that the tablespace clause makes the SQL nonstandard.

If we can adopt the move-after-create solution, then we really only have 
two options:
 - virtual tablespaces (which do seem kind of useful, especially for   development vs. production config where the
local/personaldev version   can use the same script as a production DB but not need half a dozen TSs)
 
 - magic-tablespace-var that behaves like the schema search path

Are there any others?


>And the best quote from the thread:
>
>Philip Warner wrote:
> > <soapbox>
> > A fact I positively loath! Relying on the 'bluder-on-regardless' approach
> > is not something I'd like to enshrine.
> > </soapbox>
>
>The 'bluder-on-regardless' phrase is very funny.


Fame at last! Even with the typo.




----------------------------------------------------------------
Philip Warner                    |     __---_____
Albatross Consulting Pty. Ltd.   |----/       -  \
(A.B.N. 75 008 659 498)          |          /(@)   ______---_
Tel: (+61) 0500 83 82 81         |                 _________  \
Fax: (+61) 03 5330 3172          |                 ___________ |
Http://www.rhyme.com.au          |                /           \|                                 |    --________--
PGP key available upon request,  |  /
and from pgp.mit.edu:11371       |/ 



Re: Using ALTER TABLESPACE in pg_dump

From
Bruce Momjian
Date:
Philip Warner wrote:
> If we can adopt the move-after-create solution, then we really only have 
> two options:
> 
>   - virtual tablespaces (which do seem kind of useful, especially for
>     development vs. production config where the local/personal dev version
>     can use the same script as a production DB but not need half a dozen TSs)
> 
>   - magic-tablespace-var that behaves like the schema search path

I was thinking we could have a var like schema search path that
specifies where we try to create the object:SET tablespace_path = 'tblspc1, pg_default';CREATE TABLE test(x int);

This combines the idea of pulling the TABLESPACE specification out of
the CREATE, and allows a fallback if the primary tablespace doesn't
exist.

--  Bruce Momjian                        |  http://candle.pha.pa.us pgman@candle.pha.pa.us               |  (610)
359-1001+  If your life is a hard drive,     |  13 Roberts Road +  Christ can be your backup.        |  Newtown Square,
Pennsylvania19073
 


Re: Using ALTER TABLESPACE in pg_dump

From
Tom Lane
Date:
Bruce Momjian <pgman@candle.pha.pa.us> writes:
> I was thinking we could have a var like schema search path that
> specifies where we try to create the object:
>     SET tablespace_path = 'tblspc1, pg_default';
>     CREATE TABLE test(x int);

> This combines the idea of pulling the TABLESPACE specification out of
> the CREATE, and allows a fallback if the primary tablespace doesn't
> exist.

... and takes us even further away from the notion that the default
tablespace is determined by the parent object (database or schema).

I think that we have a clean, understandable, easy-to-use tablespace
behavior now, and we should not muck it up for abstract second-order
goals like having portable dumps for databases that were created
unportably in the first place.
        regards, tom lane


Re: Using ALTER TABLESPACE in pg_dump

From
Fabien COELHO
Date:
Dear Tom,

>> [...]
>> This combines the idea of pulling the TABLESPACE specification out of
>> the CREATE, and allows a fallback if the primary tablespace doesn't
>> exist.
>
> ... and takes us even further away from the notion that the default
> tablespace is determined by the parent object (database or schema).
>
> I think that we have a clean, understandable, easy-to-use tablespace
> behavior now, and we should not muck it up for abstract second-order
> goals like having portable dumps for databases that were created
> unportably in the first place.

I disagree on the view that being able to restore a database on another 
machine after a crash is an "abstract second-order goal";-)

ISTM that the core business of a database is to help organize and protect 
data, and it is plainly that. You just wish you won't need it, so it is 
somehow "abstract", but when and if you need it, it is not "second-order" 
at all;-) and it is much too late to redo the dump.

When a machine crashes, usually I did not foresee how it will crash, and 
whether I will or will not be able to restore on the same machine, with or 
without the same tablespaces... It depends on what went wrong.

Thus ISTM that having the ability to fix that at restore time is simply 
what is needed, when it is needed.

Now I do agree that having a straight behavior is a much better thing.

The "ALTER ... TABLESPACE ..." generated by restore from some headers 
seems the right simple solution to me, but the alter syntax is not fully 
implemented AFAICR:-(

Completing the implementation for the missing parts (ALTER DATABASE... and 
ALTER SCHEMA... ?), feature/beta freeze or not, would seem the reasonnable 
path to me.

I'm sorry I don't have time to develop and submit a patch...

Have a nice day,

-- 
Fabien Coelho - coelho@cri.ensmp.fr


Re: Using ALTER TABLESPACE in pg_dump

From
Tom Lane
Date:
Fabien COELHO <coelho@cri.ensmp.fr> writes:
> I disagree on the view that being able to restore a database on another 
> machine after a crash is an "abstract second-order goal";-)

> ISTM that the core business of a database is to help organize and protect 
> data, and it is plainly that. You just wish you won't need it, so it is 
> somehow "abstract", but when and if you need it, it is not "second-order" 
> at all;-) and it is much too late to redo the dump.

So you create some tablespaces by hand.  Big deal.  This objection is
not strong enough to justify an ugly, klugy definition for where tables
get created.

If tablespaces had to be associated with physically distinct devices
then there would be merit in your concerns, but they are only
directories and so there is no reason that you cannot create the same
set of tablespace names on your new machine that you had on your old.
        regards, tom lane


Re: Using ALTER TABLESPACE in pg_dump

From
Bruce Momjian
Date:
Tom Lane wrote:
> Fabien COELHO <coelho@cri.ensmp.fr> writes:
> > I disagree on the view that being able to restore a database on another 
> > machine after a crash is an "abstract second-order goal";-)
> 
> > ISTM that the core business of a database is to help organize and protect 
> > data, and it is plainly that. You just wish you won't need it, so it is 
> > somehow "abstract", but when and if you need it, it is not "second-order" 
> > at all;-) and it is much too late to redo the dump.
> 
> So you create some tablespaces by hand.  Big deal.  This objection is
> not strong enough to justify an ugly, klugy definition for where tables
> get created.
> 
> If tablespaces had to be associated with physically distinct devices
> then there would be merit in your concerns, but they are only
> directories and so there is no reason that you cannot create the same
> set of tablespace names on your new machine that you had on your old.

I am confused.  I thought Tom's argument was that we shouldn't add an
overly complex tablespace SET variable just to prevent the non-standard
TABLESPACE in CREATE, which I can understand.  However, the text above
seems to indicate we don't need an 'ignore tablespace specification if
it does not exist' which I think we do need for cases where we want to
restore on to a system that doesn't use tablespaces or for
non-super-user restores.

--  Bruce Momjian                        |  http://candle.pha.pa.us pgman@candle.pha.pa.us               |  (610)
359-1001+  If your life is a hard drive,     |  13 Roberts Road +  Christ can be your backup.        |  Newtown Square,
Pennsylvania19073
 


Re: Using ALTER TABLESPACE in pg_dump

From
Tom Lane
Date:
Bruce Momjian <pgman@candle.pha.pa.us> writes:
> I am confused.  I thought Tom's argument was that we shouldn't add an
> overly complex tablespace SET variable just to prevent the non-standard
> TABLESPACE in CREATE, which I can understand.  However, the text above
> seems to indicate we don't need an 'ignore tablespace specification if
> it does not exist' which I think we do need for cases where we want to
> restore on to a system that doesn't use tablespaces or for
> non-super-user restores.

I'm willing to live with a "soft error" type of GUC variable for those
cases.  I don't want a GUC variable that actively changes the default
tablespace; at least not unless you want to abandon the current
mechanisms for default tablespace choices entirely, and go over to
making the GUC variable be the sole arbiter.  (Which would be consistent
with the way we handle selection of which schema to create in, so I'm
not necessarily against it.)  I guess what I'm trying to say is I don't
want a hodgepodge design, because I think it'll be confusing and
unusable.
        regards, tom lane


Re: Using ALTER TABLESPACE in pg_dump

From
Bruce Momjian
Date:
Tom Lane wrote:
> Bruce Momjian <pgman@candle.pha.pa.us> writes:
> > I am confused.  I thought Tom's argument was that we shouldn't add an
> > overly complex tablespace SET variable just to prevent the non-standard
> > TABLESPACE in CREATE, which I can understand.  However, the text above
> > seems to indicate we don't need an 'ignore tablespace specification if
> > it does not exist' which I think we do need for cases where we want to
> > restore on to a system that doesn't use tablespaces or for
> > non-super-user restores.
> 
> I'm willing to live with a "soft error" type of GUC variable for those
> cases.  I don't want a GUC variable that actively changes the default
> tablespace; at least not unless you want to abandon the current
> mechanisms for default tablespace choices entirely, and go over to
> making the GUC variable be the sole arbiter.  (Which would be consistent
> with the way we handle selection of which schema to create in, so I'm
> not necessarily against it.)  I guess what I'm trying to say is I don't
> want a hodgepodge design, because I think it'll be confusing and
> unusable.

Agreed.  My tablespace path idea would be very hard to understand if
combined with the existing db/schema/table default rules.  I can't
decide which is the best approach.  Don't indexes default to the schema
of the table rather than the schema path, so they aren't 100% controlled
by the search path?

--  Bruce Momjian                        |  http://candle.pha.pa.us pgman@candle.pha.pa.us               |  (610)
359-1001+  If your life is a hard drive,     |  13 Roberts Road +  Christ can be your backup.        |  Newtown Square,
Pennsylvania19073
 


Re: Using ALTER TABLESPACE in pg_dump

From
Philip Warner
Date:
At 08:00 AM 26/10/2004, Tom Lane wrote:
>I don't want a GUC variable that actively changes the default
>tablespace; at least not unless you want to abandon the current
>mechanisms for default tablespace choices entirely, and go over to
>making the GUC variable be the sole arbiter.

Something consistent with Schemas does sound good to me; a tablespace 
search path (or just single default), and support for a TABLESPACE clause 
on table and INDEX definitions would be good.

For the three largest databases I work on, the namespace/schema that a 
table resides in is irrelevant to the tablespace that it should be stored 
in. So default tablespaces on the schema are a bit of a pointless feature. 
The ability to have the features of schemas: default tablespace for given 
users, a GUC variable, and ACLs on tablespaces would be far more valuable.




----------------------------------------------------------------
Philip Warner                    |     __---_____
Albatross Consulting Pty. Ltd.   |----/       -  \
(A.B.N. 75 008 659 498)          |          /(@)   ______---_
Tel: (+61) 0500 83 82 81         |                 _________  \
Fax: (+61) 03 5330 3172          |                 ___________ |
Http://www.rhyme.com.au          |                /           \|                                 |    --________--
PGP key available upon request,  |  /
and from pgp.mit.edu:11371       |/ 



Re: Using ALTER TABLESPACE in pg_dump

From
Tom Lane
Date:
Philip Warner <pjw@rhyme.com.au> writes:
> At 08:00 AM 26/10/2004, Tom Lane wrote:
>> I don't want a GUC variable that actively changes the default
>> tablespace; at least not unless you want to abandon the current
>> mechanisms for default tablespace choices entirely, and go over to
>> making the GUC variable be the sole arbiter.

> Something consistent with Schemas does sound good to me; a tablespace 
> search path (or just single default), and support for a TABLESPACE clause 
> on table and INDEX definitions would be good.

I can't see what a search path would be good for.

> For the three largest databases I work on, the namespace/schema that a 
> table resides in is irrelevant to the tablespace that it should be stored 
> in. So default tablespaces on the schema are a bit of a pointless feature. 
> The ability to have the features of schemas: default tablespace for given 
> users, a GUC variable, and ACLs on tablespaces would be far more valuable.

Another nice thing is that not having default tablespaces associated
with schemas eliminates that nasty issue about being able to drop such a
tablespace while the schema is still there.

It seems like we still need some notion of a database's schema, to put
the system catalogs in, but perhaps that need not be the same as the
default schema for user tables created in the database?

I'd be willing to jump this way if we can work out the
default-tablespace inconsistencies that Bruce has on the open items
list.  Does anyone want to draft a concrete proposal?  It seems like the
basic elements are:
* A GUC variable named something like default_tablespace thatcontrols which TS objects are created in when there'sno
explicitTABLESPACE clause.  The factory default for thiswould of course be pg_default.  Otherwise it's settable
justlikeany other GUC var.
 
* Get rid of TABLESPACE clause for CREATE SCHEMA, andpg_namespace.nsptablespace (ooops, another initdb).
* Need to define exactly what TABLESPACE clause for a databasecontrols; location of its catalogs of course, but
anythingelse?
 
* We could possibly say that a TABLESPACE clause attached toCREATE TABLE determines the default tablespace for
indexescreatedby the same command; I'm not sure if this is a goodidea, or if the indexes should go into
default_tablespaceabsenta TABLESPACE clause attached directly to their definingconstraints.  We certainly want
default_tablespaceto controlindexes created by separate commands, so there'd be someinconsistency if we do the former.
 
        regards, tom lane


Re: Using ALTER TABLESPACE in pg_dump

From
Philip Warner
Date:
At 09:28 AM 26/10/2004, Tom Lane wrote:

>I can't see what a search path would be good for.

Nothing at this stage.


>It seems like we still need some notion of a database's schema,

Yes.


>I'd be willing to jump this way if we can work out the
>default-tablespace inconsistencies that Bruce has on the open items
>list.

I'll have a look in the next 18 hours...


>         * A GUC variable named something like default_tablespace that
>         controls which TS objects are created in when there's
>         no explicit TABLESPACE clause.  The factory default for this
>         would of course be pg_default.  Otherwise it's settable just
>         like any other GUC var.

Agree.


>         * Get rid of TABLESPACE clause for CREATE SCHEMA, and
>         pg_namespace.nsptablespace (ooops, another initdb).

Agree.


>         * Need to define exactly what TABLESPACE clause for a database
>         controls; location of its catalogs of course, but anything else?

Nothing else would be my call; make it like the tablespace on tables.


>         * We could possibly say that a TABLESPACE clause attached to
>         CREATE TABLE determines the default tablespace for indexes
>         created by the same command;

This is a hard one. We need ALTER INDEX or STORE INDEX or whatever if we 
can't nicely put each index in it's own tablespace. We're only talking PKs 
aren't we? I'll have to think about this.




----------------------------------------------------------------
Philip Warner                    |     __---_____
Albatross Consulting Pty. Ltd.   |----/       -  \
(A.B.N. 75 008 659 498)          |          /(@)   ______---_
Tel: (+61) 0500 83 82 81         |                 _________  \
Fax: (+61) 03 5330 3172          |                 ___________ |
Http://www.rhyme.com.au          |                /           \|                                 |    --________--
PGP key available upon request,  |  /
and from pgp.mit.edu:11371       |/ 



Re: Using ALTER TABLESPACE in pg_dump

From
Gavin Sherry
Date:
On Mon, 25 Oct 2004, Tom Lane wrote:

> Philip Warner <pjw@rhyme.com.au> writes:
> > At 08:00 AM 26/10/2004, Tom Lane wrote:
> >> I don't want a GUC variable that actively changes the default
> >> tablespace; at least not unless you want to abandon the current
> >> mechanisms for default tablespace choices entirely, and go over to
> >> making the GUC variable be the sole arbiter.
>
> > Something consistent with Schemas does sound good to me; a tablespace
> > search path (or just single default), and support for a TABLESPACE clause
> > on table and INDEX definitions would be good.
>
> I can't see what a search path would be good for.

I agree.

>
> > For the three largest databases I work on, the namespace/schema that a
> > table resides in is irrelevant to the tablespace that it should be stored
> > in. So default tablespaces on the schema are a bit of a pointless feature.
> > The ability to have the features of schemas: default tablespace for given
> > users, a GUC variable, and ACLs on tablespaces would be far more valuable.
>
> Another nice thing is that not having default tablespaces associated
> with schemas eliminates that nasty issue about being able to drop such a
> tablespace while the schema is still there.

Hmmm.. despite that problem, I was rather fond of schema default
tablespaces because they allow DBAs to set a policy for a particular
schema. The cases I've discussed with people so far are things
like creating a schema for a (closed source) application and associating
that with a tablespace. There by, all new objects created will be in that
tablespace without the need for DBA intervention. Its not necessary, but
its nice I think.

> It seems like we still need some notion of a database's schema, to put
> the system catalogs in, but perhaps that need not be the same as the
> default schema for user tables created in the database?

By schema here, do you mean tablespace?

>
> I'd be willing to jump this way if we can work out the
> default-tablespace inconsistencies that Bruce has on the open items
> list.  Does anyone want to draft a concrete proposal?  It seems like the
> basic elements are:
>
>     * A GUC variable named something like default_tablespace that
>     controls which TS objects are created in when there's
>     no explicit TABLESPACE clause.  The factory default for this
>     would of course be pg_default.  Otherwise it's settable just
>     like any other GUC var.
>
>     * Get rid of TABLESPACE clause for CREATE SCHEMA, and
>     pg_namespace.nsptablespace (ooops, another initdb).
>
>     * Need to define exactly what TABLESPACE clause for a database
>     controls; location of its catalogs of course, but anything else?

This could be a bit messy (from a user's point of view). There are two
meanings (according to your plan): 1) the tablespace clause is the default
for the catalogs AND for newly created objects (we set default_tablespace
in datconfig); OR, 2) it only sets the tablespace for the catalogs. (You
could say that it just sets the default tablespace for new objects, but
then how do you set the catalog tablespace).

I guess (1) makes sense but it limits people. If we do (2), we have two
options: a) User needs to ALTER DATABASE SET default_table.. b) we add a
new key work. I think (b) is ugly.

>
>     * We could possibly say that a TABLESPACE clause attached to
>     CREATE TABLE determines the default tablespace for indexes
>     created by the same command; I'm not sure if this is a good
>     idea, or if the indexes should go into default_tablespace
>     absent a TABLESPACE clause attached directly to their defining
>     constraints.  We certainly want default_tablespace to control
>     indexes created by separate commands, so there'd be some
>     inconsistency if we do the former.

I think a viable solution is to go with the latter (ie, for CREATE TABLE
foo(i int primary key) TABLESPACE ts; the index on i is created in
default_tablespace). However, I might be nice to be able to specify the
tablespace as part of the primary key clause. I say nice, but not
necessary.

>
>             regards, tom lane

Thanks,

Gavin



Re: Using ALTER TABLESPACE in pg_dump

From
Tom Lane
Date:
Gavin Sherry <swm@linuxworld.com.au> writes:
> Hmmm.. despite that problem, I was rather fond of schema default
> tablespaces because they allow DBAs to set a policy for a particular
> schema. The cases I've discussed with people so far are things
> like creating a schema for a (closed source) application and associating
> that with a tablespace. There by, all new objects created will be in that
> tablespace without the need for DBA intervention. Its not necessary, but
> its nice I think.

On the other hand, driving it from a GUC variable would allow you to
easily set a per-user default, which might be at least as useful.

>> It seems like we still need some notion of a database's schema, to put
>> the system catalogs in, but perhaps that need not be the same as the
>> default schema for user tables created in the database?

> By schema here, do you mean tablespace?

Sorry, fingers faster than brain obviously.  Time to take a break...

> I think a viable solution is to go with the latter (ie, for CREATE TABLE
> foo(i int primary key) TABLESPACE ts; the index on i is created in
> default_tablespace). However, I might be nice to be able to specify the
> tablespace as part of the primary key clause. I say nice, but not
> necessary.

We already have that don't we?

create table foo (f1 int,                 primary key (f1) using index tablespace its)                 tablespace tts;

The question is where to put foo_pkey when "using index tablespace"
isn't there but "tablespace" is.

(BTW, since we stole that syntax from Oracle, maybe we should check what
they do...)
        regards, tom lane


Re: Using ALTER TABLESPACE in pg_dump

From
Gavin Sherry
Date:
On Mon, 25 Oct 2004, Tom Lane wrote:

> Gavin Sherry <swm@linuxworld.com.au> writes:
> > Hmmm.. despite that problem, I was rather fond of schema default
> > tablespaces because they allow DBAs to set a policy for a particular
> > schema. The cases I've discussed with people so far are things
> > like creating a schema for a (closed source) application and associating
> > that with a tablespace. There by, all new objects created will be in that
> > tablespace without the need for DBA intervention. Its not necessary, but
> > its nice I think.
>
> On the other hand, driving it from a GUC variable would allow you to
> easily set a per-user default, which might be at least as useful.
>
> >> It seems like we still need some notion of a database's schema, to put
> >> the system catalogs in, but perhaps that need not be the same as the
> >> default schema for user tables created in the database?
>
> > By schema here, do you mean tablespace?
>
> Sorry, fingers faster than brain obviously.  Time to take a break...
>
> > I think a viable solution is to go with the latter (ie, for CREATE TABLE
> > foo(i int primary key) TABLESPACE ts; the index on i is created in
> > default_tablespace). However, I might be nice to be able to specify the
> > tablespace as part of the primary key clause. I say nice, but not
> > necessary.
>
> We already have that don't we?
>
> create table foo (f1 int,
>                   primary key (f1) using index tablespace its)
>                   tablespace tts;
>
> The question is where to put foo_pkey when "using index tablespace"
> isn't there but "tablespace" is.

Hah. I wasn't sure if that ever got in -- guess I should have checked.

>
> (BTW, since we stole that syntax from Oracle, maybe we should check what
> they do...)

As an aside -- I'm not quite sure we stole the syntax from Oracle. Oracle
has *a lot* more functionality and nothing like the parent's tablespace
system.

Basically, more than one database object can be stored in a single data
file in oracle. A tablespace is a group of such files. You can have two
files in a tablespace in diferent locations. That is, tablespace foo might
consist of /data1/a.dat and /data2/b.dat.

So, when you create a new database, you can determine where the 'system
catalogs' are by setting the datafile location for the system catalog
tablespaces. You can *also* set a default tablespace for the database --
default in the sense that all newly created objects with no explicit
tablespace clause are created in the tablespace. With an exception as
follows: Oracle relies heavily on the concept of a user's default
tablespace. Interestingly, this is what you just mentioned above :-).

Gavin


Re: Using ALTER TABLESPACE in pg_dump

From
Tom Lane
Date:
Gavin Sherry <swm@linuxworld.com.au> writes:
> [ ... in Oracle: ]
> So, when you create a new database, you can determine where the 'system
> catalogs' are by setting the datafile location for the system catalog
> tablespaces. You can *also* set a default tablespace for the database --
> default in the sense that all newly created objects with no explicit
> tablespace clause are created in the tablespace. With an exception as
> follows: Oracle relies heavily on the concept of a user's default
> tablespace. Interestingly, this is what you just mentioned above :-).

So if we went with a GUC-driven approach, we could emulate both of those
things easily, because people could set the default_tablespace GUC
variable in either ALTER DATABASE or ALTER USER.  This is starting to
sound like a win.
        regards, tom lane


Re: Using ALTER TABLESPACE in pg_dump

From
Bruce Momjian
Date:
Philip Warner wrote:
> At 09:28 AM 26/10/2004, Tom Lane wrote:
> 
> >I can't see what a search path would be good for.
> 
> Nothing at this stage.

The idea of a tablespace search path was that restores could specify a
fallback if the tablespace doesn't exist, but it seems easier for the
SET to just fail because the tablespace doesn't exist and the object
goes into the default location.

--  Bruce Momjian                        |  http://candle.pha.pa.us pgman@candle.pha.pa.us               |  (610)
359-1001+  If your life is a hard drive,     |  13 Roberts Road +  Christ can be your backup.        |  Newtown Square,
Pennsylvania19073
 


Re: Using ALTER TABLESPACE in pg_dump

From
Bruce Momjian
Date:
Tom Lane wrote:
> > I think a viable solution is to go with the latter (ie, for CREATE TABLE
> > foo(i int primary key) TABLESPACE ts; the index on i is created in
> > default_tablespace). However, I might be nice to be able to specify the
> > tablespace as part of the primary key clause. I say nice, but not
> > necessary.
> 
> We already have that don't we?
> 
> create table foo (f1 int,
>                   primary key (f1) using index tablespace its)
>                   tablespace tts;
> 
> The question is where to put foo_pkey when "using index tablespace"
> isn't there but "tablespace" is.

I think that lacking a tablespace clause in the index section the
behavior of least surprise would be to use the outer tablespace
specification if it exists, and if not use the GUC variable for the
tablespace (basically the tablespace of the table for the index).  We
already name the tablespace using our own name if we create it as part
of CREATE TABLE so it seems natural to also use the tablespace of the
table.  The idea that a non-specified value defaults to the outer
level's default (tablespace) is a natural behavior people expect.

--  Bruce Momjian                        |  http://candle.pha.pa.us pgman@candle.pha.pa.us               |  (610)
359-1001+  If your life is a hard drive,     |  13 Roberts Road +  Christ can be your backup.        |  Newtown Square,
Pennsylvania19073
 


Re: Using ALTER TABLESPACE in pg_dump

From
Fabien COELHO
Date:
Dear Tom,

>> ISTM that the core business of a database is to help organize and protect
>> data, and it is plainly that. You just wish you won't need it, so it is
>> somehow "abstract", but when and if you need it, it is not "second-order"
>> at all;-) and it is much too late to redo the dump.
>
> So you create some tablespaces by hand.  Big deal.

I agree that is is doable this way, although not really nice.

> This objection is not strong enough to justify an ugly, klugy definition 
> for where tables get created.

I do also agree about this.

My real point is that while reading the thread quickly, I was afraid the 
problem would not be better addressed at all in the coming release.

It seems that I was wrong as it does not look to be the case.
Any fix instead of nothing is fair enough for me.

Thanks for your answer, have a nice day,

-- 
Fabien Coelho - coelho@cri.ensmp.fr


Re: Using ALTER TABLESPACE in pg_dump

From
Bruce Momjian
Date:
Added to open items list:

* Tablespace       o add new GUC default_tablespace to control object creation when         no explicit TABLESPACE
clauseexists
 
         Use it in pg_dump.
       o Remove tablespace default for databases and schemas
         Place objects as specified by the TABLESPACE clause or         default_tablespace.  The database tablespace
controlsonly         the system objects.
 



---------------------------------------------------------------------------

Tom Lane wrote:
> Philip Warner <pjw@rhyme.com.au> writes:
> > At 08:00 AM 26/10/2004, Tom Lane wrote:
> >> I don't want a GUC variable that actively changes the default
> >> tablespace; at least not unless you want to abandon the current
> >> mechanisms for default tablespace choices entirely, and go over to
> >> making the GUC variable be the sole arbiter.
> 
> > Something consistent with Schemas does sound good to me; a tablespace 
> > search path (or just single default), and support for a TABLESPACE clause 
> > on table and INDEX definitions would be good.
> 
> I can't see what a search path would be good for.
> 
> > For the three largest databases I work on, the namespace/schema that a 
> > table resides in is irrelevant to the tablespace that it should be stored 
> > in. So default tablespaces on the schema are a bit of a pointless feature. 
> > The ability to have the features of schemas: default tablespace for given 
> > users, a GUC variable, and ACLs on tablespaces would be far more valuable.
> 
> Another nice thing is that not having default tablespaces associated
> with schemas eliminates that nasty issue about being able to drop such a
> tablespace while the schema is still there.
> 
> It seems like we still need some notion of a database's schema, to put
> the system catalogs in, but perhaps that need not be the same as the
> default schema for user tables created in the database?
> 
> I'd be willing to jump this way if we can work out the
> default-tablespace inconsistencies that Bruce has on the open items
> list.  Does anyone want to draft a concrete proposal?  It seems like the
> basic elements are:
> 
>     * A GUC variable named something like default_tablespace that
>     controls which TS objects are created in when there's
>     no explicit TABLESPACE clause.  The factory default for this
>     would of course be pg_default.  Otherwise it's settable just
>     like any other GUC var.
> 
>     * Get rid of TABLESPACE clause for CREATE SCHEMA, and
>     pg_namespace.nsptablespace (ooops, another initdb).
> 
>     * Need to define exactly what TABLESPACE clause for a database
>     controls; location of its catalogs of course, but anything else?
> 
>     * We could possibly say that a TABLESPACE clause attached to
>     CREATE TABLE determines the default tablespace for indexes
>     created by the same command; I'm not sure if this is a good
>     idea, or if the indexes should go into default_tablespace
>     absent a TABLESPACE clause attached directly to their defining
>     constraints.  We certainly want default_tablespace to control
>     indexes created by separate commands, so there'd be some
>     inconsistency if we do the former.
> 
>             regards, tom lane
> 

--  Bruce Momjian                        |  http://candle.pha.pa.us pgman@candle.pha.pa.us               |  (610)
359-1001+  If your life is a hard drive,     |  13 Roberts Road +  Christ can be your backup.        |  Newtown Square,
Pennsylvania19073
 


Re: Using ALTER TABLESPACE in pg_dump

From
Tom Lane
Date:
I wrote:
> I'd be willing to jump this way if we can work out the
> default-tablespace inconsistencies that Bruce has on the open items
> list.

After further thought it seems to me that using a default_tablespace
GUC variable doesn't eliminate all the open issues.  In particular
it is no help for the problem of merging two different tablespaces
during CREATE DATABASE, ie, creating a new DB with a dattablespace
that is different from the template DB's default when the template
DB already has some tables explicitly placed into that tablespace.
In this situation we have the problem that the cloned DB would
have pg_class rows with different references to the same tablespace
(either zero for the database default, or the explicit OID of the
tablespace).  Among other things this would make it impossible to
use the cloned DB again as a template for CREATE DATABASE.

AFAICS this problem stems ultimately from the choice to have a
special representation (zero) in pg_class for the database's default
tablespace.  The only way to really get rid of it would be to eliminate
that provision and say that pg_class.reltablespace is always the correct
explicit OID.  What that would mean in turn is that we could not copy a
database and move its tables into a different tablespace, at least not
without very major work on CREATE DATABASE to make it alter pg_class
on-the-fly while copying.

We might want to think about doing that eventually, but for now I'd
say that the restriction on merging tablespaces is just something
we have to live with.  It's less annoying than not being able to
relocate a database, for sure.

Despite this, the default_tablespace GUC variable seems more attractive
than what we have now.  Last call for objections ...
        regards, tom lane


Re: Using ALTER TABLESPACE in pg_dump

From
Bruce Momjian
Date:
Tom Lane wrote:
> I wrote:
> > I'd be willing to jump this way if we can work out the
> > default-tablespace inconsistencies that Bruce has on the open items
> > list.
> 
> After further thought it seems to me that using a default_tablespace
> GUC variable doesn't eliminate all the open issues.  In particular
> it is no help for the problem of merging two different tablespaces
> during CREATE DATABASE, ie, creating a new DB with a dattablespace
> that is different from the template DB's default when the template
> DB already has some tables explicitly placed into that tablespace.
> In this situation we have the problem that the cloned DB would
> have pg_class rows with different references to the same tablespace
> (either zero for the database default, or the explicit OID of the
> tablespace).  Among other things this would make it impossible to
> use the cloned DB again as a template for CREATE DATABASE.

Right.  I would say 99% of people are using template1 as the template
for new databases, and if we clearly give an error message when they use
a database not in the default tablespace (which we do now), it seems
just fine.  Let's see how many people complain and make adjustments in
8.1 if needed.

> AFAICS this problem stems ultimately from the choice to have a
> special representation (zero) in pg_class for the database's default
> tablespace.  The only way to really get rid of it would be to eliminate
> that provision and say that pg_class.reltablespace is always the correct
> explicit OID.  What that would mean in turn is that we could not copy a
> database and move its tables into a different tablespace, at least not
> without very major work on CREATE DATABASE to make it alter pg_class
> on-the-fly while copying.

Agreed.  That is just too much work for so little gain.

> We might want to think about doing that eventually, but for now I'd
> say that the restriction on merging tablespaces is just something
> we have to live with.  It's less annoying than not being able to
> relocate a database, for sure.

One downside that came up yesterday in a discussion is that once shemas
don't have default tablespaces we can't easily have default tablespaces
for toast and temporary table system schemas.  Now we can't actually do
that now anyway because they are created by the system but it might
limit how we can control these in the future.  I am just throwing this
out as a point.

> Despite this, the default_tablespace GUC variable seems more attractive
> than what we have now.  Last call for objections ...

Sounds good.

--  Bruce Momjian                        |  http://candle.pha.pa.us pgman@candle.pha.pa.us               |  (610)
359-1001+  If your life is a hard drive,     |  13 Roberts Road +  Christ can be your backup.        |  Newtown Square,
Pennsylvania19073
 


Re: Using ALTER TABLESPACE in pg_dump

From
Gavin Sherry
Date:
On Sun, 31 Oct 2004, Bruce Momjian wrote:

> Tom Lane wrote:
> > I wrote:
> > > I'd be willing to jump this way if we can work out the
> > > default-tablespace inconsistencies that Bruce has on the open items
> > > list.
> >
> > After further thought it seems to me that using a default_tablespace
> > GUC variable doesn't eliminate all the open issues.  In particular
> > it is no help for the problem of merging two different tablespaces
> > during CREATE DATABASE, ie, creating a new DB with a dattablespace
> > that is different from the template DB's default when the template
> > DB already has some tables explicitly placed into that tablespace.
> > In this situation we have the problem that the cloned DB would
> > have pg_class rows with different references to the same tablespace
> > (either zero for the database default, or the explicit OID of the
> > tablespace).  Among other things this would make it impossible to
> > use the cloned DB again as a template for CREATE DATABASE.
>
> Right.  I would say 99% of people are using template1 as the template
> for new databases, and if we clearly give an error message when they use
> a database not in the default tablespace (which we do now), it seems
> just fine.  Let's see how many people complain and make adjustments in
> 8.1 if needed.

I agree.

>
> > AFAICS this problem stems ultimately from the choice to have a
> > special representation (zero) in pg_class for the database's default
> > tablespace.  The only way to really get rid of it would be to eliminate
> > that provision and say that pg_class.reltablespace is always the correct
> > explicit OID.  What that would mean in turn is that we could not copy a
> > database and move its tables into a different tablespace, at least not
> > without very major work on CREATE DATABASE to make it alter pg_class
> > on-the-fly while copying.
>
> Agreed.  That is just too much work for so little gain.

I agree. Although, I think having a createdb() with transaction semantics
and the ability to modify data on the fly would be useful -- not just for
tablespace handling. As you say, it is a fair bit of work, however.

>
> > We might want to think about doing that eventually, but for now I'd
> > say that the restriction on merging tablespaces is just something
> > we have to live with.  It's less annoying than not being able to
> > relocate a database, for sure.
>
> One downside that came up yesterday in a discussion is that once shemas
> don't have default tablespaces we can't easily have default tablespaces
> for toast and temporary table system schemas.  Now we can't actually do
> that now anyway because they are created by the system but it might
> limit how we can control these in the future.  I am just throwing this
> out as a point.

Neil has been talking to me about being able to set a tablespace for
temporary tables at or after create database time.

I'm not sure about TOAST however. I considered the idea of adding
something to CREATE TABLE like TOASTSPACE <tablespace>, such that all
TOAST tables would be put in the 'toastspace'. But I think the syntax is
ugly and would confuse many users who do not know what toast is.

Thanks,

Gavin


Re: Using ALTER TABLESPACE in pg_dump

From
Bruce Momjian
Date:
Gavin Sherry wrote:
> > One downside that came up yesterday in a discussion is that once shemas
> > don't have default tablespaces we can't easily have default tablespaces
> > for toast and temporary table system schemas.  Now we can't actually do
> > that now anyway because they are created by the system but it might
> > limit how we can control these in the future.  I am just throwing this
> > out as a point.
> 
> Neil has been talking to me about being able to set a tablespace for
> temporary tables at or after create database time.
> 
> I'm not sure about TOAST however. I considered the idea of adding
> something to CREATE TABLE like TOASTSPACE <tablespace>, such that all
> TOAST tables would be put in the 'toastspace'. But I think the syntax is
> ugly and would confuse many users who do not know what toast is.

I think we need to add temp_tablespace and toast_tablespace GUC
variables to deal with this, perhaps for 8.1.

--  Bruce Momjian                        |  http://candle.pha.pa.us pgman@candle.pha.pa.us               |  (610)
359-1001+  If your life is a hard drive,     |  13 Roberts Road +  Christ can be your backup.        |  Newtown Square,
Pennsylvania19073
 


Re: Using ALTER TABLESPACE in pg_dump

From
Bruce Momjian
Date:
Added to open items:
* Add a GUC variable to control temporary and TOAST tablespace usage


---------------------------------------------------------------------------

Gavin Sherry wrote:
> On Sun, 31 Oct 2004, Bruce Momjian wrote:
> 
> > Tom Lane wrote:
> > > I wrote:
> > > > I'd be willing to jump this way if we can work out the
> > > > default-tablespace inconsistencies that Bruce has on the open items
> > > > list.
> > >
> > > After further thought it seems to me that using a default_tablespace
> > > GUC variable doesn't eliminate all the open issues.  In particular
> > > it is no help for the problem of merging two different tablespaces
> > > during CREATE DATABASE, ie, creating a new DB with a dattablespace
> > > that is different from the template DB's default when the template
> > > DB already has some tables explicitly placed into that tablespace.
> > > In this situation we have the problem that the cloned DB would
> > > have pg_class rows with different references to the same tablespace
> > > (either zero for the database default, or the explicit OID of the
> > > tablespace).  Among other things this would make it impossible to
> > > use the cloned DB again as a template for CREATE DATABASE.
> >
> > Right.  I would say 99% of people are using template1 as the template
> > for new databases, and if we clearly give an error message when they use
> > a database not in the default tablespace (which we do now), it seems
> > just fine.  Let's see how many people complain and make adjustments in
> > 8.1 if needed.
> 
> I agree.
> 
> >
> > > AFAICS this problem stems ultimately from the choice to have a
> > > special representation (zero) in pg_class for the database's default
> > > tablespace.  The only way to really get rid of it would be to eliminate
> > > that provision and say that pg_class.reltablespace is always the correct
> > > explicit OID.  What that would mean in turn is that we could not copy a
> > > database and move its tables into a different tablespace, at least not
> > > without very major work on CREATE DATABASE to make it alter pg_class
> > > on-the-fly while copying.
> >
> > Agreed.  That is just too much work for so little gain.
> 
> I agree. Although, I think having a createdb() with transaction semantics
> and the ability to modify data on the fly would be useful -- not just for
> tablespace handling. As you say, it is a fair bit of work, however.
> 
> >
> > > We might want to think about doing that eventually, but for now I'd
> > > say that the restriction on merging tablespaces is just something
> > > we have to live with.  It's less annoying than not being able to
> > > relocate a database, for sure.
> >
> > One downside that came up yesterday in a discussion is that once shemas
> > don't have default tablespaces we can't easily have default tablespaces
> > for toast and temporary table system schemas.  Now we can't actually do
> > that now anyway because they are created by the system but it might
> > limit how we can control these in the future.  I am just throwing this
> > out as a point.
> 
> Neil has been talking to me about being able to set a tablespace for
> temporary tables at or after create database time.
> 
> I'm not sure about TOAST however. I considered the idea of adding
> something to CREATE TABLE like TOASTSPACE <tablespace>, such that all
> TOAST tables would be put in the 'toastspace'. But I think the syntax is
> ugly and would confuse many users who do not know what toast is.
> 
> Thanks,
> 
> Gavin
> 

--  Bruce Momjian                        |  http://candle.pha.pa.us pgman@candle.pha.pa.us               |  (610)
359-1001+  If your life is a hard drive,     |  13 Roberts Road +  Christ can be your backup.        |  Newtown Square,
Pennsylvania19073
 


Re: Using ALTER TABLESPACE in pg_dump

From
Tom Lane
Date:
Bruce Momjian <pgman@candle.pha.pa.us> writes:
> Gavin Sherry wrote:
>> I'm not sure about TOAST however. I considered the idea of adding
>> something to CREATE TABLE like TOASTSPACE <tablespace>, such that all
>> TOAST tables would be put in the 'toastspace'. But I think the syntax is
>> ugly and would confuse many users who do not know what toast is.

> I think we need to add temp_tablespace and toast_tablespace GUC
> variables to deal with this, perhaps for 8.1.

A tablespace for temp tables is okay, but I'm fairly dubious about the
idea of a "toast tablespace".  The current behavior is that a toast
table is automatically placed into the same tablespace as its parent,
and that seems exactly right to me.  It's certainly the right thing from
the point of view of users who do not understand TOAST and expect all of
a table's data to get put where they said to put the table.
        regards, tom lane


Re: Using ALTER TABLESPACE in pg_dump

From
Bruce Momjian
Date:
OK, TODO updated:
* Add a GUC variable to control the tablespace for temporary  objects

---------------------------------------------------------------------------

Tom Lane wrote:
> Bruce Momjian <pgman@candle.pha.pa.us> writes:
> > Gavin Sherry wrote:
> >> I'm not sure about TOAST however. I considered the idea of adding
> >> something to CREATE TABLE like TOASTSPACE <tablespace>, such that all
> >> TOAST tables would be put in the 'toastspace'. But I think the syntax is
> >> ugly and would confuse many users who do not know what toast is.
> 
> > I think we need to add temp_tablespace and toast_tablespace GUC
> > variables to deal with this, perhaps for 8.1.
> 
> A tablespace for temp tables is okay, but I'm fairly dubious about the
> idea of a "toast tablespace".  The current behavior is that a toast
> table is automatically placed into the same tablespace as its parent,
> and that seems exactly right to me.  It's certainly the right thing from
> the point of view of users who do not understand TOAST and expect all of
> a table's data to get put where they said to put the table.
> 
>             regards, tom lane
> 

--  Bruce Momjian                        |  http://candle.pha.pa.us pgman@candle.pha.pa.us               |  (610)
359-1001+  If your life is a hard drive,     |  13 Roberts Road +  Christ can be your backup.        |  Newtown Square,
Pennsylvania19073
 


Re: [PATCHES] Open Items

From
Bruce Momjian
Date:
Where are we on this patch?

---------------------------------------------------------------------------

Zeugswetter Andreas DAZ SD wrote:
>
> >     o fix shared memory on Win2k terminal server
> >
> >     We might be able to just mark this as not supported.
>
> I have attached a patch that I think fixes this. The problem I saw
> and fixed is, that the shmem created in a terminal services client is not
> visible to the console (or services.msc).
>
> It was necessary to differenciate OS versions, this might be better put
> elsewhere.
>
> I think in addition the system global name "sharemem.1" should be made more
> pg specific, like "PostgreSQL.1". I have not done this since a new compile
> would not detect a running old beta. But now would be the time (or never).
>
> Andreas

Content-Description: shmem.win32.patch

[ Attachment, skipping... ]

>
> ---------------------------(end of broadcast)---------------------------
> TIP 7: don't forget to increase your free space map settings

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073

Re: Using ALTER TABLESPACE in pg_dump

From
Tom Lane
Date:
Philip, I've just committed the backend changes involved in setting up a
"default_tablespace" GUC variable for pg_dump to use, but I didn't
do anything to convert pg_dump to doing so instead of using explicit
TABLESPACE clauses.  You had muttered something about wanting to add
a TOC entry field for this --- do you still want to do the work?
You can probably get it done faster than I could, but I dunno if you
have time at the moment.  I'd like to get it in over the weekend so
that we can put out a new beta next week.

BTW, part of the backend changes was to stop emitting TABLESPACE
clauses in pg_get_indexdef() and pg_get_constraintdef() output,
so as of CVS tip pg_dump will in fact fail to restore index tablespaces
accurately.  I assume this is the backend behavior you want, but
holler if not.
        regards, tom lane


Re: Using ALTER TABLESPACE in pg_dump

From
Philip Warner
Date:
At 06:19 AM 6/11/2004, Tom Lane wrote:
>You had muttered something about wanting to add
>a TOC entry field for this --- do you still want to do the work?
>You can probably get it done faster than I could, but I dunno if you
>have time at the moment.  I'd like to get it in over the weekend so
>that we can put out a new beta next week.

Time is at a serious premium for me at the moment (I have several projects 
all due about now); but I wrote a patch for this a few weeks back, so it 
should not be a lot of work (unless pg_dump has changed in the last couple 
of months).

I will *try* to get it done by Monday morning your time, and will let you 
know if I am going to miss this deadline as soon as I know.


>BTW, part of the backend changes was to stop emitting TABLESPACE
>clauses in pg_get_indexdef() and pg_get_constraintdef() output,
>so as of CVS tip pg_dump will in fact fail to restore index tablespaces
>accurately.  I assume this is the backend behavior you want, but
>holler if not.

Excellent. I assume that anything that can have a tablespace (database, 
schema(?), table and index -- anything else?) should emit a 'set 
default_tablespace="ts"' before creation (and that this will affect 
auto-created indexes as appropriate, whatever that means).

Thanks for all the work.



----------------------------------------------------------------
Philip Warner                    |     __---_____
Albatross Consulting Pty. Ltd.   |----/       -  \
(A.B.N. 75 008 659 498)          |          /(@)   ______---_
Tel: (+61) 0500 83 82 81         |                 _________  \
Fax: (+61) 03 5330 3172          |                 ___________ |
Http://www.rhyme.com.au          |                /           \|                                 |    --________--
PGP key available upon request,  |  /
and from pgp.mit.edu:11371       |/ 



Re: Using ALTER TABLESPACE in pg_dump

From
Tom Lane
Date:
Philip Warner <pjw@rhyme.com.au> writes:
> Time is at a serious premium for me at the moment (I have several projects 
> all due about now); but I wrote a patch for this a few weeks back, so it 
> should not be a lot of work (unless pg_dump has changed in the last couple 
> of months).

If you have a preliminary patch, you could pass it along and I'll finish
it up.

> Excellent. I assume that anything that can have a tablespace (database, 
> schema(?), table and index -- anything else?) should emit a 'set 
> default_tablespace="ts"' before creation (and that this will affect 
> auto-created indexes as appropriate, whatever that means).

default_tablespace will affect both tables and auto-created indexes.
But I was under the impression that pg_dump deliberately avoids
auto-creation of indexes... isn't each one split out as an ADD
CONSTRAINT operation?

Schemas don't have tablespaces anymore.
        regards, tom lane


Re: Using ALTER TABLESPACE in pg_dump

From
Bruce Momjian
Date:
TODO item removed:

* Allow database recovery where tablespaces can't be created
 When a pg_dump is restored, all tablespaces will attempt to be created in their original locations. If this fails, the
usermust be able to adjust the restore process.
 

Not done yet, but it will be with SET default_tablespace.

I don't think we need "adjust" but rather default to the default
tablespace is just fine, and they can pre-create tablespaces in
different locations to adjust the restore anyway.

Great!

---------------------------------------------------------------------------

Philip Warner wrote:
> At 06:19 AM 6/11/2004, Tom Lane wrote:
> >You had muttered something about wanting to add
> >a TOC entry field for this --- do you still want to do the work?
> >You can probably get it done faster than I could, but I dunno if you
> >have time at the moment.  I'd like to get it in over the weekend so
> >that we can put out a new beta next week.
> 
> Time is at a serious premium for me at the moment (I have several projects 
> all due about now); but I wrote a patch for this a few weeks back, so it 
> should not be a lot of work (unless pg_dump has changed in the last couple 
> of months).
> 
> I will *try* to get it done by Monday morning your time, and will let you 
> know if I am going to miss this deadline as soon as I know.
> 
> 
> >BTW, part of the backend changes was to stop emitting TABLESPACE
> >clauses in pg_get_indexdef() and pg_get_constraintdef() output,
> >so as of CVS tip pg_dump will in fact fail to restore index tablespaces
> >accurately.  I assume this is the backend behavior you want, but
> >holler if not.
> 
> Excellent. I assume that anything that can have a tablespace (database, 
> schema(?), table and index -- anything else?) should emit a 'set 
> default_tablespace="ts"' before creation (and that this will affect 
> auto-created indexes as appropriate, whatever that means).
> 
> Thanks for all the work.
> 
> 
> 
> ----------------------------------------------------------------
> Philip Warner                    |     __---_____
> Albatross Consulting Pty. Ltd.   |----/       -  \
> (A.B.N. 75 008 659 498)          |          /(@)   ______---_
> Tel: (+61) 0500 83 82 81         |                 _________  \
> Fax: (+61) 03 5330 3172          |                 ___________ |
> Http://www.rhyme.com.au          |                /           \|
>                                   |    --________--
> PGP key available upon request,  |  /
> and from pgp.mit.edu:11371       |/ 
> 
> 
> ---------------------------(end of broadcast)---------------------------
> TIP 8: explain analyze is your friend
> 

--  Bruce Momjian                        |  http://candle.pha.pa.us pgman@candle.pha.pa.us               |  (610)
359-1001+  If your life is a hard drive,     |  13 Roberts Road +  Christ can be your backup.        |  Newtown Square,
Pennsylvania19073
 


Re: Using ALTER TABLESPACE in pg_dump

From
Bruce Momjian
Date:
FYI, we need tablespace_default to control this pg_dump output for a
primary key:
ALTER TABLE ONLY test2    ADD CONSTRAINT test2_pkey PRIMARY KEY (x);

---------------------------------------------------------------------------

Tom Lane wrote:
> Philip Warner <pjw@rhyme.com.au> writes:
> > Time is at a serious premium for me at the moment (I have several projects 
> > all due about now); but I wrote a patch for this a few weeks back, so it 
> > should not be a lot of work (unless pg_dump has changed in the last couple 
> > of months).
> 
> If you have a preliminary patch, you could pass it along and I'll finish
> it up.
> 
> > Excellent. I assume that anything that can have a tablespace (database, 
> > schema(?), table and index -- anything else?) should emit a 'set 
> > default_tablespace="ts"' before creation (and that this will affect 
> > auto-created indexes as appropriate, whatever that means).
> 
> default_tablespace will affect both tables and auto-created indexes.
> But I was under the impression that pg_dump deliberately avoids
> auto-creation of indexes... isn't each one split out as an ADD
> CONSTRAINT operation?
> 
> Schemas don't have tablespaces anymore.
> 
>             regards, tom lane
> 
> ---------------------------(end of broadcast)---------------------------
> TIP 2: you can get off all lists at once with the unregister command
>     (send "unregister YourEmailAddressHere" to majordomo@postgresql.org)
> 

--  Bruce Momjian                        |  http://candle.pha.pa.us pgman@candle.pha.pa.us               |  (610)
359-1001+  If your life is a hard drive,     |  13 Roberts Road +  Christ can be your backup.        |  Newtown Square,
Pennsylvania19073
 


Re: Using ALTER TABLESPACE in pg_dump

From
Tom Lane
Date:
Philip Warner <pjw@rhyme.com.au> writes:
> Attached. It has some trivial-looking rejects on current CVS. Let me know 
> if you would prefer me to do the work, or want some testing done. It was 
> tested (in terms of output validity) with 8.0b1.

Applied with minor cleanups.
        regards, tom lane


Re: Using ALTER TABLESPACE in pg_dump

From
Philip Warner
Date:
At 02:37 PM 6/11/2004, Tom Lane wrote:
>If you have a preliminary patch, you could pass it along and I'll finish
>it up.

Attached. It has some trivial-looking rejects on current CVS. Let me know
if you would prefer me to do the work, or want some testing done. It was
tested (in terms of output validity) with 8.0b1.



----------------------------------------------------------------
Philip Warner                    |     __---_____
Albatross Consulting Pty. Ltd.   |----/       -  \
(A.B.N. 75 008 659 498)          |          /(@)   ______---_
Tel: (+61) 0500 83 82 81         |                 _________  \
Fax: (+61) 03 5330 3172          |                 ___________ |
Http://www.rhyme.com.au          |                /           \|
                                  |    --________--
PGP key available upon request,  |  /
and from pgp.mit.edu:11371       |/
Attachment

Re: Open Items

From
Bruce Momjian
Date:
Zeugswetter Andreas DAZ SD wrote:
> I think in addition the system global name "sharemem.1" should be made more
> pg specific, like "PostgreSQL.1". I have not done this since a new compile
> would not detect a running old beta. But now would be the time (or never).

Change made and attached.  I assume there are other ways we detect an
active backend on Windows and that shared memory name is only one of
them.  I do think we need this fix before we put out a final release so
the next beta is the best time to do it.

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073
Index: src/backend/port/win32/shmem.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/port/win32/shmem.c,v
retrieving revision 1.8
diff -c -c -r1.8 shmem.c
*** src/backend/port/win32/shmem.c    29 Aug 2004 05:06:46 -0000    1.8
--- src/backend/port/win32/shmem.c    12 Nov 2004 16:53:28 -0000
***************
*** 89,95 ****
      DWORD        dwRet;

      s_segsize = size;
!     sprintf(szShareMem, "sharemem.%d", memKey);

      if (flag & IPC_CREAT)
      {
--- 89,95 ----
      DWORD        dwRet;

      s_segsize = size;
!     sprintf(szShareMem, "PostgreSQL.%d", memKey);

      if (flag & IPC_CREAT)
      {

Re: [PATCHES] Open Items

From
Bruce Momjian
Date:
I am going to discard these emails.  We haven't solve the Win32 terminal
server problem and I think it needs to be moved to the TODO list instead.

---------------------------------------------------------------------------

Zeugswetter Andreas DAZ SD wrote:
>
> >     o fix shared memory on Win2k terminal server
> >
> >     We might be able to just mark this as not supported.
>
> I have attached a patch that I think fixes this. The problem I saw
> and fixed is, that the shmem created in a terminal services client is not
> visible to the console (or services.msc).
>
> It was necessary to differenciate OS versions, this might be better put
> elsewhere.
>
> I think in addition the system global name "sharemem.1" should be made more
> pg specific, like "PostgreSQL.1". I have not done this since a new compile
> would not detect a running old beta. But now would be the time (or never).
>
> Andreas

Content-Description: shmem.win32.patch

[ Attachment, skipping... ]

>
> ---------------------------(end of broadcast)---------------------------
> TIP 7: don't forget to increase your free space map settings

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073