Re: [HACKERS] SQL99, CREATE CAST, and initdb

2002-06-27 Thread Hannu Krosing

On Thu, 2002-06-27 at 02:10, Tom Lane wrote:
 Peter Eisentraut [EMAIL PROTECTED] writes:
  Perhaps it wouldn't be such a terrible idea after all to store the casting
  paths separately, such as in a system table pg_cast (from, to, func,
  implicit).  This would implement the SQL99 spec fairly exactly.
 
 Well, maybe.  One question is how that would fit in with schemas.
 Thomas appears to want your schema search path to have some effect on
 which casts you can see --- which I'm not at all sure I agree with,

I hope that schema search path has some effect on other user-defined
stuff like simple functions and operators.

 but if that's the requirement then the above doesn't do it either.

What is and what is not affected by schemas ?

Are the docs on our schema usage already available someplace ?


-
Hannu



---(end of broadcast)---
TIP 2: you can get off all lists at once with the unregister command
(send unregister YourEmailAddressHere to [EMAIL PROTECTED])





Re: [HACKERS] SQL99, CREATE CAST, and initdb

2002-06-27 Thread Tom Lane

Hannu Krosing [EMAIL PROTECTED] writes:
 Are the docs on our schema usage already available someplace ?

Yes, although there's not a pulled-together introduction (someone needs
to write a section for the tutorial, I think).  Try
http://developer.postgresql.org/docs/postgres/sql-naming.html
and see the SEARCH_PATH variable at
http://developer.postgresql.org/docs/postgres/runtime-config.html#RUNTIME-CONFIG-GENERAL
as well as the schema-aware rules for resolution of overloaded functions
and operators:
http://developer.postgresql.org/docs/postgres/typeconv-func.html
http://developer.postgresql.org/docs/postgres/typeconv-oper.html
also various new functions at
http://developer.postgresql.org/docs/postgres/functions-misc.html
http://developer.postgresql.org/docs/postgres/datatype-oid.html

regards, tom lane



---(end of broadcast)---
TIP 4: Don't 'kill -9' the postmaster





Re: [HACKERS] SQL99, CREATE CAST, and initdb

2002-06-27 Thread Peter Eisentraut

Tom Lane writes:

 Thomas appears to want your schema search path to have some effect on
 which casts you can see --- which I'm not at all sure I agree with,
 but if that's the requirement then the above doesn't do it either.

If I understand this right, this would be nearly analogous to determining
an operator's underlying function by schema path.  That smells an awful
lot like dynamic scoping, a.k.a. a bad idea, and completely inconsistent
with the rest of the system.

 If we just want to get out from under the coupling of function name to
 cast status, the above would do it ... and also break existing
 applications that aren't expecting to have to do something special to
 make a function of the right name become a cast function.  Perhaps there
 could be a GUC variable to allow created functions matching the old
 naming convention to be automatically made into casts?  We could default
 it to 'true' for a release or two and then default to 'false'.

Sure.  However, AFAIK, the current development progress has already broken
the previous expectations slightly by requiring that implicit casting
paths be explicitly declared.

-- 
Peter Eisentraut   [EMAIL PROTECTED]





---(end of broadcast)---
TIP 6: Have you searched our list archives?

http://archives.postgresql.org





Re: [HACKERS] SQL99, CREATE CAST, and initdb

2002-06-27 Thread Tom Lane

Peter Eisentraut [EMAIL PROTECTED] writes:
 Tom Lane writes:
 Thomas appears to want your schema search path to have some effect on
 which casts you can see --- which I'm not at all sure I agree with,
 but if that's the requirement then the above doesn't do it either.

 If I understand this right, this would be nearly analogous to determining
 an operator's underlying function by schema path.  That smells an awful
 lot like dynamic scoping, a.k.a. a bad idea, and completely inconsistent
 with the rest of the system.

I don't like it either.  ISTM that the casting relationship between two
types is a property of those types and should *not* be affected by your
search path.  Maybe you referenced one or both types by qualified
schema names, rather than by finding them in your path, but should that
keep you from seeing the cast?  Especially since there's no obvious
place in the CAST syntax to attach a schema qualification, if we try
to insist that one might be needed to get at the desired cast function.

An extreme case is binary-equivalence, which as I mentioned maps nicely
into the sort of pg_cast table you suggested.  It doesn't map nicely
into anything that involves schema visibility --- there is no cast
function to hide or make visible.  Even more to the point, if types A
and B are binary-equivalent, should changing my search path make them
stop being so?  Doesn't make sense to me.

 Sure.  However, AFAIK, the current development progress has already broken
 the previous expectations slightly by requiring that implicit casting
 paths be explicitly declared.

True.  If we wanted to maintain the old behavior exactly then we could
allow this hypothetical GUC variable to also cause old-convention cast
functions to be automatically marked IMPLICIT CAST.  (I suppose the
IMPLICIT CAST bit would actually stop being a property of functions at
all, and would become a column of pg_cast.)

regards, tom lane



---(end of broadcast)---
TIP 1: subscribe and unsubscribe commands go to [EMAIL PROTECTED]





Re: [HACKERS] SQL99, CREATE CAST, and initdb

2002-06-26 Thread Peter Eisentraut

Tom Lane writes:

 IIRC, a function is only considered to be a cast function if it matches
 by name *and schema* with the target type.  So if you, for example,
 make a function public.int4(something), it'll never be considered a
 cast function for pg_catalog.int4.  I had some doubts about that rule
 when I put it in, but so far have not thought of an alternative I like
 better.

Perhaps it wouldn't be such a terrible idea after all to store the casting
paths separately, such as in a system table pg_cast (from, to, func,
implicit).  This would implement the SQL99 spec fairly exactly.

-- 
Peter Eisentraut   [EMAIL PROTECTED]




---(end of broadcast)---
TIP 6: Have you searched our list archives?

http://archives.postgresql.org





Re: [HACKERS] SQL99, CREATE CAST, and initdb

2002-06-26 Thread Tom Lane

Peter Eisentraut [EMAIL PROTECTED] writes:
 Perhaps it wouldn't be such a terrible idea after all to store the casting
 paths separately, such as in a system table pg_cast (from, to, func,
 implicit).  This would implement the SQL99 spec fairly exactly.

Well, maybe.  One question is how that would fit in with schemas.
Thomas appears to want your schema search path to have some effect on
which casts you can see --- which I'm not at all sure I agree with,
but if that's the requirement then the above doesn't do it either.

If we just want to get out from under the coupling of function name to
cast status, the above would do it ... and also break existing
applications that aren't expecting to have to do something special to
make a function of the right name become a cast function.  Perhaps there
could be a GUC variable to allow created functions matching the old
naming convention to be automatically made into casts?  We could default
it to 'true' for a release or two and then default to 'false'.

BTW, the above would also provide a place to encode binary compatibility
associations in the DB, rather than hard-wired, which would be a Good
Thing.  You could say that func == 0 means that no actual function call
is needed to transform type 'from' to 'to'.

regards, tom lane



---(end of broadcast)---
TIP 5: Have you checked our extensive FAQ?

http://www.postgresql.org/users-lounge/docs/faq.html





Re: [HACKERS] SQL99, CREATE CAST, and initdb

2002-06-25 Thread Thomas Lockhart

 Another possibility is that you got burnt by some schema-related issue;
 cf the updated conversion docs at
 http://developer.postgresql.org/docs/postgres/typeconv-func.html

I'll bet that is it, though possible differences in CAST() behaviors are
not explained. I'll see if I can reproduce them...

 IIRC, a function is only considered to be a cast function if it matches
 by name *and schema* with the target type.  So if you, for example,
 make a function public.int4(something), it'll never be considered a
 cast function for pg_catalog.int4.  I had some doubts about that rule
 when I put it in, but so far have not thought of an alternative I like
 better.

Well, istm that we should choose something different. The example I was
using might be a good use case for a situation we should handle: I
implemented a function to convert Unix system time to PG timestamp, and
wanted it to respond to an explicit cast but *not* an implicit cast.

I got it to work at some point (not sure how, given your description of
the schema, uh, scheme) but istm that we definitely do not want to
*require* modifications to pg_catalog for any and every change in
feature or behavior for built-in types. The schema settings are
important, and should have some influence over behavior; that is, if
someone extends PG in one schema then if that schema is in the chain it
should be able to influence the session, and if it is not then it should
only be able to influence the session if there are side-effects from
previous definitions.

btw, how *do* I control the default schema? Is it always the schema at
the front of the search list, or are there other more direct knobs to
help determine this other than explicitly qualifying names in queries?

 - Thomas



---(end of broadcast)---
TIP 5: Have you checked our extensive FAQ?

http://www.postgresql.org/users-lounge/docs/faq.html





Re: [HACKERS] SQL99, CREATE CAST, and initdb

2002-06-25 Thread Tom Lane

Thomas Lockhart [EMAIL PROTECTED] writes:
 IIRC, a function is only considered to be a cast function if it matches
 by name *and schema* with the target type.  So if you, for example,
 make a function public.int4(something), it'll never be considered a
 cast function for pg_catalog.int4.  I had some doubts about that rule
 when I put it in, but so far have not thought of an alternative I like
 better.

 Well, istm that we should choose something different.

Well, let's see an alternate proposal.

 I got it to work at some point (not sure how, given your description of
 the schema, uh, scheme) but istm that we definitely do not want to
 *require* modifications to pg_catalog for any and every change in
 feature or behavior for built-in types.

If we just look for anything named int4() in the current search path
then I think we will have some unpleasantnesses of a different sort,
namely unexpected conflicts between similarly-named types in different
schemas.

 btw, how *do* I control the default schema? Is it always the schema at
 the front of the search list,

If you mean the default schema for creating things, yes, it's whatever
is at the front of the search list.  Should it be different?

regards, tom lane



---(end of broadcast)---
TIP 3: if posting/reading through Usenet, please send an appropriate
subscribe-nomail command to [EMAIL PROTECTED] so that your
message can get through to the mailing list cleanly





Re: [HACKERS] SQL99, CREATE CAST, and initdb

2002-06-24 Thread Peter Eisentraut

Rod Taylor writes:

  I'm also looking at the SQL99 INFORMATION_SCHEMA views. Is anyone
  already defining these? Is someone interested in picking this up?
 I've
  got some definitions in a contrib-style directory but have not yet
  mapped them to PostgreSQL.

 I have a few of the basics done, but nothing really significant.

I guess I'll polish what I have and will commit it so that the group can
fill in the rest at convenience.

-- 
Peter Eisentraut   [EMAIL PROTECTED]




---(end of broadcast)---
TIP 1: subscribe and unsubscribe commands go to [EMAIL PROTECTED]





Re: [HACKERS] SQL99, CREATE CAST, and initdb

2002-06-24 Thread Thomas Lockhart

  It doesn't match perfectly in that one field is ignored as being
  (afaict) redundant for us. The basic definition from SQL99 is
  CREATE CAST(from AS to) WITH FUNCTION func(args) [AS ASSIGNMENT]
  I can map this to something equivalent to
  CREATE FUNCTION to(from) RETURNS to AS 'select func($1)' LANGUAGE 'sql';
  with another clause or two to get the implicit coersion enabled, and
  ignoring the args field(s).
 I think this is wrong.  When you call CREATE CAST ... WITH FUNCTION
 func(args)  then func(args) must already exist.

Right. And that is what is required for SQL99 also afaict. There are not
enough clauses in the SQL99 syntax to allow anything else!

 So the closest you could
 map it to would be
 ALTER FUNCTION to(from) IMPLICIT CAST

That would require that the function to be used as the cast have the
same name as the underlying PostgreSQL conventions for casting
functions. The implementation I've done does not require this; it
basically defines a new SQL function with a body of

select func($1)

where func is the name specified in the WITH FUNCTION func(args)
clause. It does hang together in the way SQL99 intends and in a way
which is consistant with PostgreSQL's view of the world.

But, I've also implemented alternate forms which would allow one not
define a separate function beforehand. So the nice PostgreSQL feature of
allowing function names to be different than the entry points can be
used.

 iff the name of the function and the target data type agree.  (Of course
 this command doesn't exit, but you get the idea.)  The SQL99 feature is
 more general than ours, but in order to use if effectively we would need
 to maintain another index on pg_proc.  Tom Lane once opined that that
 would be too costly.

I don't follow you here, but the implementation I have is consistant
with SQL99 (or at least with the way I'm interpreting it :)

 - Thomas



---(end of broadcast)---
TIP 4: Don't 'kill -9' the postmaster





Re: [HACKERS] SQL99, CREATE CAST, and initdb

2002-06-24 Thread Peter Eisentraut

Thomas Lockhart writes:

 It doesn't match perfectly in that one field is ignored as being
 (afaict) redundant for us. The basic definition from SQL99 is

 CREATE CAST(from AS to) WITH FUNCTION func(args) [AS ASSIGNMENT]

 I can map this to something equivalent to

 CREATE FUNCTION to(from) RETURNS to AS 'select func($1)' LANGUAGE 'sql';

 with another clause or two to get the implicit coersion enabled, and
 ignoring the args field(s).

I think this is wrong.  When you call CREATE CAST ... WITH FUNCTION
func(args)  then func(args) must already exist.  So the closest you could
map it to would be

ALTER FUNCTION to(from) IMPLICIT CAST

iff the name of the function and the target data type agree.  (Of course
this command doesn't exit, but you get the idea.)  The SQL99 feature is
more general than ours, but in order to use if effectively we would need
to maintain another index on pg_proc.  Tom Lane once opined that that
would be too costly.

-- 
Peter Eisentraut   [EMAIL PROTECTED]




---(end of broadcast)---
TIP 1: subscribe and unsubscribe commands go to [EMAIL PROTECTED]





Re: [HACKERS] SQL99, CREATE CAST, and initdb

2002-06-24 Thread Tom Lane

Thomas Lockhart [EMAIL PROTECTED] writes:
 So the closest you could
 map it to would be
 ALTER FUNCTION to(from) IMPLICIT CAST

 That would require that the function to be used as the cast have the
 same name as the underlying PostgreSQL conventions for casting
 functions. The implementation I've done does not require this; it
 basically defines a new SQL function with a body of
 select func($1)
 where func is the name specified in the WITH FUNCTION func(args)
 clause. It does hang together in the way SQL99 intends and in a way
 which is consistant with PostgreSQL's view of the world.

Urk.  Do you realize how expensive SQL functions are for such uses?
(I have had a to-do item for awhile to teach the planner to inline
trivial SQL functions, but it seems unlikely to happen for another
release or three.)

I see no real reason why we should not require casting functions to
follow the Postgres naming convention --- after all, what else would
you name a casting function?

So I'm with Peter on this one: make the SQL99 syntax a mere wrapper
for setting the IMPLICIT CAST bit on an existing function.  Otherwise,
people will avoid it as soon as they discover what it's costing them.

regards, tom lane



---(end of broadcast)---
TIP 6: Have you searched our list archives?

http://archives.postgresql.org





Re: [HACKERS] SQL99, CREATE CAST, and initdb

2002-06-24 Thread Tom Lane

Thomas Lockhart [EMAIL PROTECTED] writes:
 I've got another issue with casting which I've run into while testing
 this feature; afaict invoking an explicit CAST() in SQL does not
 guarantee that the function of the expected name would be called, if
 that function does not have the implicit flag set.

[ scratches head ]  Whether the flag is set or not shouldn't matter;
if the cast function is needed it will be called.  Were you perhaps
testing binary-compatible cases?  Note the order of cases specified in
http://www.ca.postgresql.org/users-lounge/docs/7.2/postgres/typeconv-func.html

I recall we changed what is now case 2 to be higher priority than it
used to be; I do not recall the examples that motivated that change,
but I'm pretty sure moving it down in the priority list would be bad.

regards, tom lane



---(end of broadcast)---
TIP 3: if posting/reading through Usenet, please send an appropriate
subscribe-nomail command to [EMAIL PROTECTED] so that your
message can get through to the mailing list cleanly





Re: [HACKERS] SQL99, CREATE CAST, and initdb

2002-06-24 Thread Thomas Lockhart

 I see no real reason why we should not require casting functions to
 follow the Postgres naming convention --- after all, what else would
 you name a casting function?

We do require casting functions to follow the Postgres naming
convention. istm to be a waste of time to have the CREATE CAST() feature
*only* set a bit on an existing function, especially given the SQL99
syntax which implies that it can define a cast operation for an
arbitrarily named function. It also supposes that the only allowed casts
are *implicit casts* (see below for a new issue) which is not quite
right. I've defined alternate forms which draw on the general PostgreSQL
feature set and capabilities, but if we can fit the SQL99 model then we
should go ahead and do that too.

I've got another issue with casting which I've run into while testing
this feature; afaict invoking an explicit CAST() in SQL does not
guarantee that the function of the expected name would be called, if
that function does not have the implicit flag set. Seems that it should
be willing to do the conversion even if the function is not marked as
allowing implicit casts; after all, this is an *explicit* cast!

I'm pretty sure that this is the behavior I've been seeing, but will
publish a test case to confirm it when I have a chance.

 - Thomas



---(end of broadcast)---
TIP 6: Have you searched our list archives?

http://archives.postgresql.org





Re: [HACKERS] SQL99, CREATE CAST, and initdb

2002-06-24 Thread Tom Lane

I said:
 Thomas Lockhart [EMAIL PROTECTED] writes:
 I've got another issue with casting which I've run into while testing
 this feature; afaict invoking an explicit CAST() in SQL does not
 guarantee that the function of the expected name would be called, if
 that function does not have the implicit flag set.

 [ scratches head ]  Whether the flag is set or not shouldn't matter;
 if the cast function is needed it will be called.  Were you perhaps
 testing binary-compatible cases?

Another possibility is that you got burnt by some schema-related issue;
cf the updated conversion docs at
http://developer.postgresql.org/docs/postgres/typeconv-func.html

IIRC, a function is only considered to be a cast function if it matches
by name *and schema* with the target type.  So if you, for example,
make a function public.int4(something), it'll never be considered a
cast function for pg_catalog.int4.  I had some doubts about that rule
when I put it in, but so far have not thought of an alternative I like
better.

regards, tom lane



---(end of broadcast)---
TIP 4: Don't 'kill -9' the postmaster





Re: [HACKERS] SQL99, CREATE CAST, and initdb

2002-06-21 Thread Thomas Lockhart

  I've got patches for the CREATE CAST/DROP CAST feature (just a
  rearrangement of our existing function declaration syntax). The SQL99
  form assumes that an existing function will be used for the cast
  definition, so I've extended the syntax to allow that and to have an
  alternate form which has more of our CREATE FUNCTION functionality.
 Could you provide more precise details?  I've thought of this before, when
 the new may be a cast function feature was added, and this feature
 didn't match very well.

It doesn't match perfectly in that one field is ignored as being
(afaict) redundant for us. The basic definition from SQL99 is

CREATE CAST(from AS to) WITH FUNCTION func(args) [AS ASSIGNMENT]

I can map this to something equivalent to

CREATE FUNCTION to(from) RETURNS to AS 'select func($1)' LANGUAGE 'sql';

with another clause or two to get the implicit coersion enabled, and
ignoring the args field(s).

This supposes that a coersion function of some other name already
exists, and if I define one it seems to work nicely. I defined two
alternate forms, one resembling the SQL99 clauses and one resembling the
existing PostgreSQL CREATE FUNCTION clauses, as follows:

CREATE CAST(from AS to) WITH FUNCTION func(args) AS 'path' WITH ...

and

CREATE CAST(from AS to) AS 'path' WITH ...

and both of these latter forms allow one to eliminate a corresponding
CREATE FUNCTION.

  I'm also looking at the SQL99 INFORMATION_SCHEMA views. Is anyone
  already defining these?
 Yes.  I'm done through section 20.18 (COLUMNS view).

Great. I'll stop looking at it then.

  The initdb folks may want to start thinking about the best way to
  support a larger number of views; currently they are embedded directly
  into the initdb script but that would get unwieldy with more of them
  (and some of them are *really* fat definitions!).
 I think they can be loaded from an external file.

Sounds good.

 - Thomas

---(end of broadcast)---
TIP 5: Have you checked our extensive FAQ?

http://www.postgresql.org/users-lounge/docs/faq.html



Re: [HACKERS] SQL99, CREATE CAST, and initdb

2002-06-21 Thread Thomas Lockhart

I've gone ahead and committed patches for CREATE CAST/DROP CAST, as well
as for a few other SQL99 clauses in other statements. Details below...

- Thomas

Implement SQL99 CREATE CAST and DROP CAST statements.
 Also implement alternative forms to expose the PostgreSQL CREATE
FUNCTION
 features.
Implement syntax for READ ONLY and READ WRITE clauses in SET
TRANSACTION.
 READ WRITE is already implemented (of course).
Implement syntax for LIKE table clause in CREATE TABLE. Should be
fairly
 easy to complete since it resembles SELECT INTO.
Implement MATCH SIMPLE clause for foreign key definitions. This is
explicit
 SQL99 syntax for the default behavior, so we now support it :)
Start implementation of shorthand for national character literals in
 scanner. For now, just swallow the leading N, but sometime soon let's
 figure out how to pass leading type info from the scanner to the
parser.
 We should use the same technique for binary and hex bit string
literals,
 though it might be unusual to have two apparently independent literal
 types fold into the same storage type.

---(end of broadcast)---
TIP 6: Have you searched our list archives?

http://archives.postgresql.org



[HACKERS] SQL99, CREATE CAST, and initdb

2002-06-20 Thread Thomas Lockhart

I've got patches for the CREATE CAST/DROP CAST feature (just a
rearrangement of our existing function declaration syntax). The SQL99
form assumes that an existing function will be used for the cast
definition, so I've extended the syntax to allow that and to have an
alternate form which has more of our CREATE FUNCTION functionality.

I'm also looking at the SQL99 INFORMATION_SCHEMA views. Is anyone
already defining these? Is someone interested in picking this up? I've
got some definitions in a contrib-style directory but have not yet
mapped them to PostgreSQL.

The initdb folks may want to start thinking about the best way to
support a larger number of views; currently they are embedded directly
into the initdb script but that would get unwieldy with more of them
(and some of them are *really* fat definitions!).

   - Thomas

---(end of broadcast)---
TIP 1: subscribe and unsubscribe commands go to [EMAIL PROTECTED]



Re: [HACKERS] SQL99, CREATE CAST, and initdb

2002-06-20 Thread Peter Eisentraut

Thomas Lockhart writes:

 I've got patches for the CREATE CAST/DROP CAST feature (just a
 rearrangement of our existing function declaration syntax). The SQL99
 form assumes that an existing function will be used for the cast
 definition, so I've extended the syntax to allow that and to have an
 alternate form which has more of our CREATE FUNCTION functionality.

Could you provide more precise details?  I've thought of this before, when
the new may be a cast function feature was added, and this feature
didn't match very well.

 I'm also looking at the SQL99 INFORMATION_SCHEMA views. Is anyone
 already defining these?

Yes.  I'm done through section 20.18 (COLUMNS view).

 The initdb folks may want to start thinking about the best way to
 support a larger number of views; currently they are embedded directly
 into the initdb script but that would get unwieldy with more of them
 (and some of them are *really* fat definitions!).

I think they can be loaded from an external file.

-- 
Peter Eisentraut   [EMAIL PROTECTED]


---(end of broadcast)---
TIP 3: if posting/reading through Usenet, please send an appropriate
subscribe-nomail command to [EMAIL PROTECTED] so that your
message can get through to the mailing list cleanly



Re: [HACKERS] SQL99, CREATE CAST, and initdb

2002-06-20 Thread Rod Taylor

 I'm also looking at the SQL99 INFORMATION_SCHEMA views. Is anyone
 already defining these? Is someone interested in picking this up?
I've
 got some definitions in a contrib-style directory but have not yet
 mapped them to PostgreSQL.

I have a few of the basics done, but nothing really significant.

Once I get domains fairly fixed (don't think I'll get check
constraints done), I was going to attempt to finish off the small
group (triggeres, views, schemata, domains, etc.) for early July.

If your interested, send me a note and I'll forward the view
definitions and the patch for functions -- against fairly old source
(early 7.3).


---(end of broadcast)---
TIP 5: Have you checked our extensive FAQ?

http://www.postgresql.org/users-lounge/docs/faq.html