Thread: Per-database/schema settings

Per-database/schema settings

From
Thomas Lockhart
Date:
I've done a little work on enabling session-specific default behavior
for transaction isolation level. I'm thinking about how to extend this
to default "database-specific" behaviors which persist between sessions
(such as "DateStyle", character encoding, etc), perhaps using the ALTER
SCHEMA command from SQL99. btw, this capability enables, overlaps or
impacts upcoming work to support general character encodings (which may
also be impacted by the current work on TOAST; we'll see).

Anyway, if these kinds of things can be set via SQL (they are required
to in SQL99) then istm that they could/should be stored in tables just
like everything else. My initial thought was to add columns to
pg_database for each setting, but this is not very extensible. Another
possibility might be to add routines somewhere as "trigger-able events"
which happen when, say, a row is selected from pg_database. I'll guess
that this in particular won't work, since pg_database is not opened from
within a fully functioning Postgres backend.

Any thoughts on how to go about this? I assume that Peter's recent
"options" work does not apply, since it is not directly accessible
though SQL. But I haven't looked to verify this assumption.
                   - Thomas


Re: Per-database/schema settings

From
Tom Lane
Date:
Thomas Lockhart <lockhart@alumni.caltech.edu> writes:
> My initial thought was to add columns to
> pg_database for each setting, but this is not very extensible. Another
> possibility might be to add routines somewhere as "trigger-able events"
> which happen when, say, a row is selected from pg_database. I'll guess
> that this in particular won't work, since pg_database is not opened from
> within a fully functioning Postgres backend.

IIRC, pg_database is rechecked as soon as a new backend is up and
running.  So it'd be easy enough to extract additional values from
the pg_database row at that instant.  A trigger wouldn't help though,
it'd have to be hardwired code.  (Even if we tweaked the backend to
fire a trigger at that point, where would the trigger get the data
from?  You'd still need to add columns to pg_database.)

I agree that adding columns to pg_database is a painful way of creating
per-database options, but I'm not sure what would be better.

> Any thoughts on how to go about this? I assume that Peter's recent
> "options" work does not apply, since it is not directly accessible
> though SQL. But I haven't looked to verify this assumption.

AFAIR his options stuff does not support per-database settings.
But perhaps it could be made to do so ... Peter, any thoughts?
        regards, tom lane


Re: Per-database/schema settings

From
Thomas Lockhart
Date:
> > I've done a little work on enabling session-specific default behavior
> > for transaction isolation level.
> Is this the START TRANSACTION [ ISOLATION LEVEL ] command?

afaict, SQL99 calls it

SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL ...;

> > I'm thinking about how to extend this to default "database-specific"
> > behaviors which persist between sessions (such as "DateStyle",
> > character encoding, etc), perhaps using the ALTER SCHEMA command from
> > SQL99. btw,
> What about something like ALTER DATABASE ... SET DEFAULT foo TO bar; The
> ALTER SCHEMA command should be reserved to schema alerations.

afaik character collation is a "schema" property, but it has been quite
a while since I've looked. If my recollection is true, then there is a
pretty big grey area between "database" and "schema" imho.

> > My initial thought was to add columns to pg_database for each setting,
> > but this is not very extensible.
> If it's an attribute of a database, then it should be a pg_database
> column. Notice how the language I chose virtually forces you to do
> that. :) And what's so non-extensible about that?

Any time a new attribute needs to be set, a new column needs to be
added, requiring a dump/initdb/reload. It would be pretty neat to be
able to execute arbitrary code during database startup, which could
set/unset global variables and ?? I guess that was what I was asking
about.

> What kind of settings are you talking about, besides default character set
> and date style? I would assume that the default charset is the one to be
> used by the NCHAR type?

Transaction isolation level is one. And presumably several other things
we haven't yet thought through.

> About datestyle, I had thought that this setting
> should really be deprecated, with the arrival of the to_char() family. If
> you like a default datestyle, then you can define a view based on
> to_char().

Even if we agree that various *output* date styles are not useful, the
DateStyle setting also affects the interpretation of input date/time
(e.g. month/day or day/month conventions). istm that a lot of apps do
need some flexibility in date/time inputs.
                      - Thomas


Re: Per-database/schema settings

From
eisentrp@csis.gvsu.edu
Date:
On Wed, 5 Jul 2000, Thomas Lockhart wrote:

> I've done a little work on enabling session-specific default behavior
> for transaction isolation level.

Is this the START TRANSACTION [ ISOLATION LEVEL ] command?

> I'm thinking about how to extend this to default "database-specific"
> behaviors which persist between sessions (such as "DateStyle",
> character encoding, etc), perhaps using the ALTER SCHEMA command from
> SQL99. btw,

What about something like ALTER DATABASE ... SET DEFAULT foo TO bar; The
ALTER SCHEMA command should be reserved to schema alerations.

> My initial thought was to add columns to pg_database for each setting,
> but this is not very extensible.

If it's an attribute of a database, then it should be a pg_database
column. Notice how the language I chose virtually forces you to do
that. :) And what's so non-extensible about that?

> I assume that Peter's recent "options" work does not apply, since it
> is not directly accessible though SQL.

The SHOW command continues to work like it always has. But most, if not
all, of these options are not really per-database material. They are
either debugging or developing aids that you turn on temporarily, or
choices that the site administrator does only once. These options really
don't have a lot to do with the SQL environment.

(Btw: http://www.postgresql.org/docs/admin/runtime-config.htm)

What kind of settings are you talking about, besides default character set
and date style? I would assume that the default charset is the one to be
used by the NCHAR type? About datestyle, I had thought that this setting
should really be deprecated, with the arrival of the to_char() family. If
you like a default datestyle, then you can define a view based on
to_char().


-- 
Peter Eisentraut                  Sernanders vaeg 10:115
peter_e@gmx.net                   75262 Uppsala
http://yi.org/peter-e/            Sweden



Re: Per-database/schema settings

From
Roland Roberts
Date:
>>>>> "eisentrp" == eisentrp  <eisentrp@csis.gvsu.edu> writes:
   eisentrp> About datestyle, I had thought that this setting should   eisentrp> really be deprecated, with the arrival
ofthe to_char()   eisentrp> family. If you like a default datestyle, then you can   eisentrp> define a view based on
to_char().

As far as datestyle goes, I like Oracle's
   alter session set nls_date_format='MON DD, YYYY HH24:MI:SS';

This doesn't really deal with default for a database, but I've longed
fr this in Postgres....

roland
--            PGP Key ID: 66 BC 3B CD
Roland B. Roberts, PhD                    Unix Software Solutions
roberts@panix.com                      76-15 113th Street, Apt 3B
rbroberts@acm.org                          Forest Hills, NY 11375


Re: Per-database/schema settings

From
Peter Eisentraut
Date:
Thomas Lockhart writes:

> afaict, SQL99 calls it
> 
> SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL ...;

I see. Then we'd need a per-transaction isolation level that goes away
after the transaction, and a default transaction isolation level that each
new transaction starts out with.

> It would be pretty neat to be able to execute arbitrary code during
> database startup, which could set/unset global variables and ??

Didn't you say that the default characters set is a schema-property? I
don't think there's anything like a schema "startup".

Anyway, I could think of a way to hook this into my work (or vice versa).
We already have the SET command. All you need to do is to execute a number
of SET commands for each new connection. It actually does that already,
only that the input comes from the PGOPTIONS variable from the client
side. We'd just have to add one pass that reads the database default
settings from somewhere (to be determined, I guess :) and sets these. In
fact, this should be pretty easy.

I could see a commandSET DATABASE DEFAULT "name" TO value;
or, following your lead,ALTER DATABASE(SCHEMA?) SET DEFAULT "name" TO value;

I guess we could make a global table pg_databasedefaults:dboid oid,optname text,optval text
and when you start up database "dboid", then you loop through all matching
rows and effectively execute SET optname = optval for each.


> Even if we agree that various *output* date styles are not useful, the
> DateStyle setting also affects the interpretation of input date/time
> (e.g. month/day or day/month conventions). istm that a lot of apps do
> need some flexibility in date/time inputs.

I've been meaning to ask about that, might as well do it now. As you say,
the DateStyle setting is overloaded for two separate things: default
output style (ISO, "SQL", Postgres, German), and month/day vs day/month
setting. This has always confused me (and presumably not only me) and it
is quite tricky to integrate this into my options work -- there is no
family of settings for "takes a string input and sets two integer
variables".

Maybe we could split this up:

* datetime_output_style: one of ISO, SQL, Postgres, German

(In fact, if we wanted, we could also make this an arbitrary to_char()
format string. If it's empty we default to ISO, if it's set then we pass
it right on to to_char. I guess then we'd need separate parameters for
date and time though.)

* day_before_month: true/false

We can provide backward compatibility by still accepting SET DateStyle,
but internally parsing it apart into these two.


-- 
Peter Eisentraut                  Sernanders väg 10:115
peter_e@gmx.net                   75262 Uppsala
http://yi.org/peter-e/            Sweden



Re: Per-database/schema settings

From
Thomas Lockhart
Date:
> I've been meaning to ask about that, might as well do it now. As you say,
> the DateStyle setting is overloaded for two separate things: default
> output style (ISO, "SQL", Postgres, German), and month/day vs day/month
> setting. This has always confused me (and presumably not only me) and it
> is quite tricky to integrate this into my options work -- there is no
> family of settings for "takes a string input and sets two integer
> variables".

Perhaps it is confusing because it tries to cover (regional) cases we
aren't all familiar with?

> Maybe we could split this up:
> * datetime_output_style: one of ISO, SQL, Postgres, German
> (In fact, if we wanted, we could also make this an arbitrary to_char()
> format string. If it's empty we default to ISO, if it's set then we pass
> it right on to to_char. I guess then we'd need separate parameters for
> date and time though.)

I've been pretty resistant to having a fully-tailorable native output
capability, since it would be possible to generate date strings which
can not be correctly interpreted on input. It might interact badly with
pg_dump, for example. It might be a bit slower than the current
hard-coded technique.

> * day_before_month: true/false
> We can provide backward compatibility by still accepting SET DateStyle,
> but internally parsing it apart into these two.

"German" doesn't have much meaning with a flipped month/day field. So
these aren't entirely decoupled. We could vote quickly to get rid of it
and hope that those Germans aren't paying attention ;)

I guess that my letting go of what *I* think is important could be or is
or will be necessary for continued progress on the date/time handling.
But stability and predictability is pretty important. Eventually,
perhaps we should get rid of all of the options, insist on ISO-8601 as
the input and output format, and insist that people use to_char() if
they want anything more. But that seems a bit extreme.
                   - Thomas


DateStyle (was Re: Per-database/schema settings)

From
Peter Eisentraut
Date:
Thomas Lockhart writes:

> I've been pretty resistant to having a fully-tailorable native output
> capability, since it would be possible to generate date strings which
> can not be correctly interpreted on input.

Good point. Let them use to_char().

> "German" doesn't have much meaning with a flipped month/day field.

The only DateStyle "major mode" that cares about the month/day is
"SQL". German, Postgres, and ISO are not affected, AFAICT.

> We could vote quickly to get rid of it and hope that those Germans
> aren't paying attention ;)

Well, I'm German, but ... :-)

No, I'm not proposing to get rid of this, at least not right now. All I'm
saying is that there should perhaps be two separate settings:

1. Major output mode

2. Should month-before-day or day-before-month be *preferred* where
*applicable*? (It's not "applicable" in any output mode but SQL, and it's
not "applicable" on input like '99/12/31'. -- I always thought of it as
"tie-breaker".)


-- 
Peter Eisentraut                  Sernanders väg 10:115
peter_e@gmx.net                   75262 Uppsala
http://yi.org/peter-e/            Sweden



Re: DateStyle (was Re: Per-database/schema settings)

From
Thomas Lockhart
Date:
> 1. Major output mode
> 2. Should month-before-day or day-before-month be *preferred* where
> *applicable*? (It's not "applicable" in any output mode but SQL, and it's
> not "applicable" on input like '99/12/31'. -- I always thought of it as
> "tie-breaker".)

Yes, for input it is a "tie-breaker"; that's how I've thought of it too.

Sure, let's try to break this into two orthogonal attributes. Can you
think of a good name or keyword? "European" and "US" sure isn't saying
things as clearly as "day-before-month" or "month-before-day", but they
are easier to type and make a better shorthand.

Let's find a good syntax for this setting before we go too far...
                 - Thomas


Re: Per-database/schema settings

From
Thomas Lockhart
Date:
>  This solution can forever stop all discussion about styles that PG
> must/can support.

This is one thing I'm *not* certain about. The problems with a fully
general, templated formatting function for the backend include

1) It is easy to make a date/time template which *cannot* be used to
read data back in. So, for example, pg_dump could be fundamentally
broken just be this setting. Currently, input and output are always
compatible (more or less ;)

2) There may be a performance hit to *always* use a fully general
template for formatting.

3) If the template is used for output, it should probably be used for
input (to minimize the possibility of (1)). But then we would be able to
accept fewer date/time variations than we do now.
                      - Thomas


Re: DateStyle (was Re: Per-database/schema settings)

From
Karel Zak
Date:

On Thu, 6 Jul 2000, Peter Eisentraut wrote:

> Thomas Lockhart writes:
> 
> > I've been pretty resistant to having a fully-tailorable native output
> > capability, since it would be possible to generate date strings which
> > can not be correctly interpreted on input.
> 
> Good point. Let them use to_char().
> 
Small note, to_char() has good friend to_timestamp() and this second
routine must allow interpret all output from to_char() to PG internal
datetype.

test=# select to_timestamp( to_char( now(), '"perverse date/time: "Y,YYY  
FMMonth-DD HH24:MI:SS'), '"perverse date/time: "Y,YYY FMMonth-DD
HH24:MI:SS') = now();?column?
----------t
(1 row)  
                    Karel



Re: Per-database/schema settings

From
Karel Zak
Date:
On Thu, 6 Jul 2000, Peter Eisentraut wrote:
> 
> > Even if we agree that various *output* date styles are not useful, the
> > DateStyle setting also affects the interpretation of input date/time
> > (e.g. month/day or day/month conventions). istm that a lot of apps do
> > need some flexibility in date/time inputs.
> 
> I've been meaning to ask about that, might as well do it now. As you say,
> the DateStyle setting is overloaded for two separate things: default
> output style (ISO, "SQL", Postgres, German), and month/day vs day/month
> setting. This has always confused me (and presumably not only me) and it
> is quite tricky to integrate this into my options work -- there is no
> family of settings for "takes a string input and sets two integer
> variables".
> 
> Maybe we could split this up:
> 
> * datetime_output_style: one of ISO, SQL, Postgres, German
> 
> (In fact, if we wanted, we could also make this an arbitrary to_char()
> format string. If it's empty we default to ISO, if it's set then we pass
> it right on to to_char. I guess then we'd need separate parameters for
> date and time though.)
I not sure, but if I good remember for example Oracle has something like
SET DATESTYLE TO 'arbitrary style', where style is defined via to_char
templates. For example: 
SET DATESTYLE TO 'YYYY Month-DD HH:MI:SS'
and all date/time (like now()) outputs will formatted via this setting in 
to_char "engine". IMHO create support for this is possible. I will think 
about it for 7.2
This solution can forever stop all discussion about styles that PG 
must/can support.
                Karel



Re: Per-database/schema settings

From
Karel Zak
Date:
On Fri, 7 Jul 2000, Thomas Lockhart wrote:

> >  This solution can forever stop all discussion about styles that PG
> > must/can support.
> 
> This is one thing I'm *not* certain about. The problems with a fully
> general, templated formatting function for the backend include
> 
> 1) It is easy to make a date/time template which *cannot* be used to
> read data back in. So, for example, pg_dump could be fundamentally
> broken just be this setting. Currently, input and output are always
> compatible (more or less ;)
full support for in/out is expect in this idea, and we can add check
that conterol if defined template is right for timestamp interpretation.

> 2) There may be a performance hit to *always* use a fully general
> template for formatting.
Not sure. The to_char/timestamp is fast and parsed template is cached, 
IMHO is not big (speed) differention between to_char/timestamp and standard 
date/time formatting.

> 3) If the template is used for output, it should probably be used for
> input (to minimize the possibility of (1)). But then we would be able to
> accept fewer date/time variations than we do now.
With this setting is all in user's hands...

I don't know how much problematic it is, but the oracle has this feature
(NSL_DATE_FORMAT in ALTER SESSION, etc)

But I not say that we must implement this, it is still open thema :-)
                Karel



Re: Per-database/schema settings

From
Karel Zak
Date:
On Mon, 10 Jul 2000, Karel Zak wrote:
> 
> I don't know how much problematic it is, but the oracle has this feature
> (NSL_DATE_FORMAT in ALTER SESSION, etc)
Note, I see Oracle's docs, and NSL_DATE_FORMAT is probably used as
default format template for to_char/to_date, and it allowe
SELECT TO_CHAR(sysdate) FROM DUAL;

(is possible in Oracle formatting/parsing datetime without to_char(), like
postgresql timestamp_in/out?)
Hmm, PG and Oracle date/time design is probably more different. I was not
total right in the previous letter.                    Karel