Re: [HACKERS] cataloguing NOT NULL constraints

2012-08-16 Thread Alvaro Herrera
Excerpts from Kevin Grittner's message of jue ago 02 10:48:02 -0400 2012:
 
 Kevin Grittner kevin.gritt...@wicourts.gov wrote:
  
  Don't forget the peculiarities of columns with record types. 
  
 I forgot to include the type creation in the example:
  
 test=# create type a as (a1 int, a2 int);
 CREATE TYPE

Thanks for the example.  After playing with this, I think that a NOT
NULL constraint attached to a column with a composite type is equivalent
to a CHECK (col IS DISTINCT FROM NULL); at least they seem to behave
identically.  Is that what you would expect?

This seems a bit complicated to handle with the way I'm doing things
today; at parse analysis time, when my current code is creating the
check constraint, we don't know anything about the type of the column
IIRC.  Maybe I will have to delay creating the constraint until
execution.

-- 
Álvaro Herrerahttp://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training  Services


-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers


Re: [HACKERS] cataloguing NOT NULL constraints

2012-08-16 Thread Kevin Grittner
Alvaro Herrera alvhe...@2ndquadrant.com wrote:
 
 I think that a NOT NULL constraint attached to a column with a
 composite type is equivalent to a CHECK (col IS DISTINCT FROM
 NULL); at least they seem to behave identically.  Is that what you
 would expect?
 
I had not thought about that, but now that you point it out I think
that interpretation makes more sense than any other.  In a quick
test they behaved identically for me.
 
 This seems a bit complicated to handle with the way I'm doing
 things today; at parse analysis time, when my current code is
 creating the check constraint, we don't know anything about the
 type of the column IIRC.  Maybe I will have to delay creating the
 constraint until execution.
 
Why?  CHECK (col IS DISTINCT FROM NULL) works correctly for *any*
type, doesn't it?
 
-Kevin


-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers


Re: [HACKERS] cataloguing NOT NULL constraints

2012-08-04 Thread Bruce Momjian
On Fri, Jul 22, 2011 at 12:14:30PM -0400, Robert Haas wrote:
 On Thu, Jul 21, 2011 at 7:51 PM, Alvaro Herrera
 alvhe...@commandprompt.com wrote:
  I think that there probably ought to be a way to display the NOT NULL
  constraint names (perhaps through \d+). For example, if you're
  planning to support NOT VALID on top of this in the future, then there
  needs to be a way to get the constraint's name to validate it.
 
  Absolutely true.  Another thing that needs to be done here is to let the
  ALTER TABLE and ALTER DOMAIN commands use the constraint names; right
  now, they simply let you add the constraint but not specify the name.
  That should probably be revisited.
 
 That, at least, seems like something that should be fixed before commit.

I have added a URL of this thread to the TODO list.

-- 
  Bruce Momjian  br...@momjian.ushttp://momjian.us
  EnterpriseDB http://enterprisedb.com

  + It's impossible for everything to be true. +

-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers


Re: [HACKERS] cataloguing NOT NULL constraints

2012-08-02 Thread Kevin Grittner
Alvaro Herrera alvhe...@commandprompt.com wrote:
 
 Just over a year ago, I posted a patch (based on a previous patch
 by Bernd Helmle) that attempted to add pg_constraint rows for NOT
 NULL
 constraints.  

http://archives.postgresql.org/message-id/20110707213401.ga27...@alvh.no-ip.org
 That patch was rather long and complex, as it tried to handle all
 the hairy issues directly with a completely new 'contype' value
 for NOT NULL constraints; so the code had to deal with inheritance
 of constraints, pg_dump issues, and a lot of nitty-gritty.  In the
 end it was killed by a simple realization of Peter Eisentraut's:
 Why not just transform these into the equivalent CHECK
 constraints instead?  That ended up being discussing at length,
 and this patch, much smaller than the previous one,  is an attempt
 to do things that way.
 
 This patch is not final yet, because there are some issues still
 open; but the interesting stuff already works.  Simply declaring a
 column as NOT NULL creates a CHECK pg_constraint row; similarly,
 declaring a CHECK (foo IS NOT NULL) constraint sets the
 pg_attribute.attnotnull flag.  If you create a child table, the
 NOT NULL constraint will be inherited.
 
Don't forget the peculiarities of columns with record types. 
Semantically, these three things are different:
 
colname rectype not null
colname rectype check (colname is not null)
colname rectype check (not (colname is null))
 
test=# create table t (id int primary key, v1 a not null, v2 a check
(v2 is not null), v3 a check (not (v3 is null)));
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index
t_pkey for table t
CREATE TABLE
test=# insert into t values (1, (1,1), (1,1), (1,1));
INSERT 0 1
test=# insert into t values (2, (1, null), (1, null), (1,1));
ERROR:  new row for relation t violates check constraint
t_v2_check
DETAIL:  Failing row contains (2, (1,), (1,), (1,1)).
test=# insert into t values (3, (1, null), (1,1), (1, null));
INSERT 0 1
test=# insert into t values (4, (null, null), (1,1), (1, null));
INSERT 0 1
test=# insert into t values (5, (null, null), (1,1), (null, null));
ERROR:  new row for relation t violates check constraint
t_v3_check
DETAIL:  Failing row contains (5, (,), (1,1), (,)).
 
-Kevin

-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers


Re: [HACKERS] cataloguing NOT NULL constraints

2012-08-02 Thread Kevin Grittner
Kevin Grittner kevin.gritt...@wicourts.gov wrote:
 
 Don't forget the peculiarities of columns with record types. 
 
I forgot to include the type creation in the example:
 
test=# create type a as (a1 int, a2 int);
CREATE TYPE
 
-Kevin

-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers


Re: [HACKERS] cataloguing NOT NULL constraints

2011-08-07 Thread Peter Eisentraut
On lör, 2011-08-06 at 12:58 +0100, Dean Rasheed wrote:
 Right now \d gives:
 
   Table public.foo
  Column |  Type   | Modifiers
 +-+---
  a  | integer | not null
  b  | integer |
  c  | integer |
 Check constraints:
 foo_b_check CHECK (b IS NOT NULL)
 foo_c_check CHECK (NOT c IS NULL)
 
 With this approach, one change would be that you'd gain an extra not
 null in the Modifiers column for b.
 
 But how many CHECK constraints would show? I guess it would show 3,
 although it could be changed to just show 1. But it certainly couldn't
 continue to show 2, since nothing in the catalogs could distinguish
 the constraints on a from those on b.

I'd say we would show all (what is currently known as) NOT NULL
constraints under Check constraints:.



-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers


Re: [HACKERS] cataloguing NOT NULL constraints

2011-08-06 Thread Dean Rasheed
On 4 August 2011 18:57, Peter Eisentraut pete...@gmx.net wrote:
 Have you considered just cataloging NOT NULL constraints as CHECK
 constraints and teaching the reverse parser to convert x CHECK (x IS
 NOT NULL) to x NOT NULL.  It seems to me that we're adding a whole
 lot of hoopla here that is essentially identical to the existing CHECK
 constraint support (it must be, per SQL standard), for no additional
 functionality.


With this approach, if the user explicitly wrote CHECK (x IS NOT
NULL) would it end up setting attnotnull? Presumably, since the
pg_constraint entry would be indistinguishable, it would be difficult
to do otherwise. From a performance standpoint that might be a good
thing, but it's going to be bad for compatibility.

What if they wrote CHECK (NOT x IS NULL), or CHECK (x IS DISTINCT
FROM NULL)? How many variants would it reverse parse?

What would this do to error messages when the constraint is violated?

I'm not convinced this simplifies things much; it just moves the
complexity elsewhere, and at the cost of losing compatibility with the
current behaviour.

Regards,
Dean

-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers


Re: [HACKERS] cataloguing NOT NULL constraints

2011-08-06 Thread Dean Rasheed
On 6 August 2011 01:01, Peter Eisentraut pete...@gmx.net wrote:
 Before embarking on rewriting this patch from scratch, I would like to
 know what's your opinion (or the SQL standard's) on the fact that this
 patch separated the PRIMARY KEY from NOT NULL constraints, so that they
 don't act exactly alike (to wit, the not-nullness of a PK does not
 inherit while the one from a NOT NULL constraint does).

 The SQL standard deals with inheritance in terms of composite types,
 which don't have constraints, so that doesn't give any guidance.

 That said, I think the substitutability property of object-oriented
 systems, namely that you can use a child object in place of a parent
 object, requires in principle that we inherit all constraints (by
 default, at least).  We don't inherit primary keys because of
 implementation issues with indexes, but at some point in the future we
 should fix that.  So to some degree, inheriting the not-null property of
 primary keys while not inheriting the rest of it is a bit wrong, but it
 would appear to be a step in the right direction, and changing
 established behavior seems a bit gratuitous to me.


The current behaviour is inconsistent - the not-null property of a PK
is sometimes inherited and sometimes not, depending on whether the PK
is added at table-creation time or later. So a change in either
direction is a change to some current behaviour, unless we leave it
inconsistent, which seems unacceptable.

So I don't think compatibility arguments apply here, and I would tend
to agree that inheriting the not-null property of PKs while not
inheriting the rest seems wrong.

Regards,
Dean

-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers


Re: [HACKERS] cataloguing NOT NULL constraints

2011-08-06 Thread Dean Rasheed
On 6 August 2011 08:17, Dean Rasheed dean.a.rash...@gmail.com wrote:
 The current behaviour is inconsistent - the not-null property of a PK
 is sometimes inherited and sometimes not, depending on whether the PK
 is added at table-creation time or later.


Oops, that should have been depending on whether the PK is defined
before or after the inheritance is set up.

-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers


Re: [HACKERS] cataloguing NOT NULL constraints

2011-08-06 Thread Peter Eisentraut
On lör, 2011-08-06 at 08:04 +0100, Dean Rasheed wrote:
 On 4 August 2011 18:57, Peter Eisentraut pete...@gmx.net wrote:
  Have you considered just cataloging NOT NULL constraints as CHECK
  constraints and teaching the reverse parser to convert x CHECK (x IS
  NOT NULL) to x NOT NULL.  It seems to me that we're adding a whole
  lot of hoopla here that is essentially identical to the existing CHECK
  constraint support (it must be, per SQL standard), for no additional
  functionality.
 
 
 With this approach, if the user explicitly wrote CHECK (x IS NOT
 NULL) would it end up setting attnotnull?

Yes, I would assume so.

 Presumably, since the
 pg_constraint entry would be indistinguishable, it would be difficult
 to do otherwise. From a performance standpoint that might be a good
 thing, but it's going to be bad for compatibility.

What compatibility issue are you concerned about specifically?

 What if they wrote CHECK (NOT x IS NULL), or CHECK (x IS DISTINCT
 FROM NULL)? How many variants would it reverse parse?

Well, it's already the case that the user can write check constraints in
any number of forms that have the effect of restricting null values; and
attnotnull isn't set in those cases.  So in the beginning I'd be quite
happy if we just recognized CHECK (x IS NOT NULL).

Longer term, I think we could tie this in with more general nullability
detection.  For example, it is occasionally asked that we can expose
nullability through views or CREATE TABLE AS.  The SQL standards has
rules for what cases we should detect (which don't include the two you
give).

 What would this do to error messages when the constraint is violated?

That's a reasonable concern, although not a fatal one, and it can be
solved in any case.

 I'm not convinced this simplifies things much; it just moves the
 complexity elsewhere, and at the cost of losing compatibility with the
 current behaviour.

No, I don't think this would lose compatibility (except perhaps in cases
of error message wording).


-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers


Re: [HACKERS] cataloguing NOT NULL constraints

2011-08-06 Thread Peter Eisentraut
On lör, 2011-08-06 at 08:17 +0100, Dean Rasheed wrote:
 The current behaviour is inconsistent - the not-null property of a PK
 is sometimes inherited and sometimes not, depending on whether the PK
 is added at table-creation time or later. So a change in either
 direction is a change to some current behaviour, unless we leave it
 inconsistent, which seems unacceptable. 

Yeah, OK, that's wrong then.


-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers


Re: [HACKERS] cataloguing NOT NULL constraints

2011-08-06 Thread Dean Rasheed
On 6 August 2011 11:03, Peter Eisentraut pete...@gmx.net wrote:
 On lör, 2011-08-06 at 08:04 +0100, Dean Rasheed wrote:
 On 4 August 2011 18:57, Peter Eisentraut pete...@gmx.net wrote:
  Have you considered just cataloging NOT NULL constraints as CHECK
  constraints and teaching the reverse parser to convert x CHECK (x IS
  NOT NULL) to x NOT NULL.  It seems to me that we're adding a whole
  lot of hoopla here that is essentially identical to the existing CHECK
  constraint support (it must be, per SQL standard), for no additional
  functionality.
 

 With this approach, if the user explicitly wrote CHECK (x IS NOT
 NULL) would it end up setting attnotnull?

 Yes, I would assume so.

 Presumably, since the
 pg_constraint entry would be indistinguishable, it would be difficult
 to do otherwise. From a performance standpoint that might be a good
 thing, but it's going to be bad for compatibility.

 What compatibility issue are you concerned about specifically?

 What if they wrote CHECK (NOT x IS NULL), or CHECK (x IS DISTINCT
 FROM NULL)? How many variants would it reverse parse?

 Well, it's already the case that the user can write check constraints in
 any number of forms that have the effect of restricting null values; and
 attnotnull isn't set in those cases.  So in the beginning I'd be quite
 happy if we just recognized CHECK (x IS NOT NULL).

 Longer term, I think we could tie this in with more general nullability
 detection.  For example, it is occasionally asked that we can expose
 nullability through views or CREATE TABLE AS.  The SQL standards has
 rules for what cases we should detect (which don't include the two you
 give).

 What would this do to error messages when the constraint is violated?

 That's a reasonable concern, although not a fatal one, and it can be
 solved in any case.

 I'm not convinced this simplifies things much; it just moves the
 complexity elsewhere, and at the cost of losing compatibility with the
 current behaviour.

 No, I don't think this would lose compatibility (except perhaps in cases
 of error message wording).


Hmm, maybe my compatibility concerns are not so serious. I'm still
trying to work out exactly what user-visible changes this approach
would lead to. Suppose you had:

CREATE TABLE foo
(
  a int NOT NULL,
  b int CHECK (b IS NOT NULL),
  c int CHECK (NOT c IS NULL)
);

Right now \d gives:

  Table public.foo
 Column |  Type   | Modifiers
+-+---
 a  | integer | not null
 b  | integer |
 c  | integer |
Check constraints:
foo_b_check CHECK (b IS NOT NULL)
foo_c_check CHECK (NOT c IS NULL)

With this approach, one change would be that you'd gain an extra not
null in the Modifiers column for b.

But how many CHECK constraints would show? I guess it would show 3,
although it could be changed to just show 1. But it certainly couldn't
continue to show 2, since nothing in the catalogs could distinguish
the constraints on a from those on b.

Regards,
Dean

-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers


Re: [HACKERS] cataloguing NOT NULL constraints

2011-08-06 Thread Tom Lane
Dean Rasheed dean.a.rash...@gmail.com writes:
 [ wonders what psql's \d will do with NOT NULL constraints ]

I think this might be taking the notion of it should be backwards
compatible too far.  We're not expecting this patch to not change
the wording of error messages, for instance (in fact, I think a large
part of the point is to add constraint names to not-null errors).
Why would we expect it to not change what \d shows?

regards, tom lane

-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers


Re: [HACKERS] cataloguing NOT NULL constraints

2011-08-05 Thread Peter Eisentraut
On tor, 2011-08-04 at 16:15 -0400, Alvaro Herrera wrote:
  Have you considered just cataloging NOT NULL constraints as CHECK
  constraints and teaching the reverse parser to convert x CHECK (x IS
  NOT NULL) to x NOT NULL.
 
 Hmm, no, I admit I haven't.  The current approach was suggested very
 early in the history of this patch.

Well, the early patch thought this was a small problem.  Now we know
it's a big problem, so it might be better to solve it terms of another
big problem that is already solved. :-)

  It seems to me that we're adding a whole
  lot of hoopla here that is essentially identical to the existing CHECK
  constraint support (it must be, per SQL standard), for no additional
  functionality.
 
 Yeah, perhaps you're right.  The main reason they were considered
 separately is that we wanted to have them to be optimized via
 pg_attribute.attnotnull, but my patch does away with the need for that
 because it is maintained separately anyway.

Hmm, OK, but in any case you could have kept attnotnull and treated it
as a kind of optimization that indicates whether you can derive
not-nullability from existing CHECK constraints (which you can easily do
in enough cases).

 Before embarking on rewriting this patch from scratch, I would like to
 know what's your opinion (or the SQL standard's) on the fact that this
 patch separated the PRIMARY KEY from NOT NULL constraints, so that they
 don't act exactly alike (to wit, the not-nullness of a PK does not
 inherit while the one from a NOT NULL constraint does).

The SQL standard deals with inheritance in terms of composite types,
which don't have constraints, so that doesn't give any guidance.

That said, I think the substitutability property of object-oriented
systems, namely that you can use a child object in place of a parent
object, requires in principle that we inherit all constraints (by
default, at least).  We don't inherit primary keys because of
implementation issues with indexes, but at some point in the future we
should fix that.  So to some degree, inheriting the not-null property of
primary keys while not inheriting the rest of it is a bit wrong, but it
would appear to be a step in the right direction, and changing
established behavior seems a bit gratuitous to me.



-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers


Re: [HACKERS] cataloguing NOT NULL constraints

2011-08-05 Thread Tom Lane
Peter Eisentraut pete...@gmx.net writes:
 On tor, 2011-08-04 at 16:15 -0400, Alvaro Herrera wrote:
 Yeah, perhaps you're right.  The main reason they were considered
 separately is that we wanted to have them to be optimized via
 pg_attribute.attnotnull, but my patch does away with the need for that
 because it is maintained separately anyway.

 Hmm, OK, but in any case you could have kept attnotnull and treated it
 as a kind of optimization that indicates whether you can derive
 not-nullability from existing CHECK constraints (which you can easily do
 in enough cases).

Yes.  I thought that was how we were going to do it, and I'm rather
distressed to hear of attnotnull going away.  Even if there were not a
performance reason to keep it (and I'll bet there is), you can be sure
that removing that column will break a lot of client-side code.  See
recent complaints about Robert removing relistemp, which has only been
around for a release or two.  attnotnull goes back to the beginning,
more or less.

regards, tom lane

-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers


Re: [HACKERS] cataloguing NOT NULL constraints

2011-08-05 Thread Alvaro Herrera
Excerpts from Tom Lane's message of vie ago 05 21:23:41 -0400 2011:
 Peter Eisentraut pete...@gmx.net writes:
  On tor, 2011-08-04 at 16:15 -0400, Alvaro Herrera wrote:
  Yeah, perhaps you're right.  The main reason they were considered
  separately is that we wanted to have them to be optimized via
  pg_attribute.attnotnull, but my patch does away with the need for that
  because it is maintained separately anyway.
 
  Hmm, OK, but in any case you could have kept attnotnull and treated it
  as a kind of optimization that indicates whether you can derive
  not-nullability from existing CHECK constraints (which you can easily do
  in enough cases).
 
 Yes.  I thought that was how we were going to do it, and I'm rather
 distressed to hear of attnotnull going away.  Even if there were not a
 performance reason to keep it (and I'll bet there is), you can be sure
 that removing that column will break a lot of client-side code.  See
 recent complaints about Robert removing relistemp, which has only been
 around for a release or two.  attnotnull goes back to the beginning,
 more or less.

Err, obviously I didn't express myself very well.  I am not removing the
column.  What I tried to say is that we no longer need to optimize the
representation of NOT NULL as separate entities from CHECK constraints,
because attnotnull is maintained separately from the pg_constraint
entries.  In other words, from that point of view, representing NOT NULL
as CHECK is not a problem from a performance POV, because it is already
taken care of by letting attnotnull continue to represent them as a
cache.

-- 
Álvaro Herrera alvhe...@commandprompt.com
The PostgreSQL Company - Command Prompt, Inc.
PostgreSQL Replication, Consulting, Custom Development, 24x7 support

-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers


Re: [HACKERS] cataloguing NOT NULL constraints

2011-08-04 Thread Dean Rasheed
On 3 August 2011 22:26, Alvaro Herrera alvhe...@commandprompt.com wrote:
 Excerpts from Dean Rasheed's message of sáb jul 23 04:37:06 -0400 2011:
 On 22 July 2011 22:28, Robert Haas robertmh...@gmail.com wrote:

  mine was that we need a command such as
 
  ALTER TABLE foo ALTER COLUMN bar SET NOT NULL name_of_notnull_constr
 
  where the last bit is what's new.
 
  Well, if you don't have that, I don't see how you have any chance of
  pg_dump working correctly.

 Ah yes, pg_dump's dumpConstraint() needs a clause to alter a table
 adding a named NOT NULL constraint (and the DOMAIN case should be
 preserving the constraint's name too). So it looks like some new
 syntax for ALTER TABLE to add named NOT NULL constraints is probably
 needed before this can be committed.

 So after writing the code to handle named NOT NULL constraints for
 tables, I'm thinking that dumpConstraints needs to be fixed thusly:

 @@ -12888,6 +12968,27 @@ dumpConstraint(Archive *fout, ConstraintInfo 
 *coninfo)
                         NULL, NULL);
        }
    }
 +   else if (coninfo-contype == 'n'  tbinfo)
 +   {
 +       /* NOT NULL constraint on a table */
 +       if (coninfo-separate)
 +       {
 +           write_msg(NULL, NOT NULL constraints cannot be dumped separately 
 from their owning table\n);
 +           exit_nicely();
 +       }
 +   }
 +   else if (coninfo-contype == 'n'  tbinfo == NULL)
 +   {
 +       /* NOT NULL constraint on a domain */
 +       TypeInfo   *tyinfo = coninfo-condomain;
 +
 +       /* Ignore if not to be dumped separately */
 +       if (coninfo-separate)
 +       {
 +           write_msg(NULL, NOT NULL constraints cannot be dumped separately 
 from their owning domain\n);
 +           exit_nicely();
 +       }
 +   }
    else
    {
        write_msg(NULL, unrecognized constraint type: %c\n, 
 coninfo-contype);


 There doesn't seem to be any point in giving pg_dump the ability to dump
 such constraints separately; I don't think there's any situation in
 which dependencies between the table/domain and NOT NULL constraints
 would get circular (which is what causes them to acquire the separate
 flag).  I don't want to write code that is going to be always
 unused, particularly not in a beast as hairy such as pg_dump.


Wow. Yes I think you're right - it is a hairy beast :-)

It was the code immediately above that for CHECK constraints that made
me assume NOT NULLs would need similar logic. But I haven't quite
figured out how a CHECK constraint's dependencies could form a loop,
so I don't know if it could happen for a NOT NULL.

Regards,
Dean

-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers


Re: [HACKERS] cataloguing NOT NULL constraints

2011-08-04 Thread Nikhil Sontakke
 So after writing the code to handle named NOT NULL constraints for
 tables, I'm thinking that dumpConstraints needs to be fixed thusly:

 @@ -12888,6 +12968,27 @@ dumpConstraint(Archive *fout, ConstraintInfo 
 *coninfo)
                         NULL, NULL);
        }
    }
 +   else if (coninfo-contype == 'n'  tbinfo)
 +   {
 +       /* NOT NULL constraint on a table */
 +       if (coninfo-separate)
 +       {
 +           write_msg(NULL, NOT NULL constraints cannot be dumped separately 
 from their owning table\n);
 +           exit_nicely();
 +       }
 +   }
 +   else if (coninfo-contype == 'n'  tbinfo == NULL)
 +   {
 +       /* NOT NULL constraint on a domain */
 +       TypeInfo   *tyinfo = coninfo-condomain;
 +
 +       /* Ignore if not to be dumped separately */
 +       if (coninfo-separate)
 +       {
 +           write_msg(NULL, NOT NULL constraints cannot be dumped separately 
 from their owning domain\n);
 +           exit_nicely();
 +       }
 +   }
    else
    {
        write_msg(NULL, unrecognized constraint type: %c\n, 
 coninfo-contype);


Some nit-picking.

AFAICS above, we seem to be only using 'tbinfo' to identify the object
type here - 'table' visavis 'domain'. We could probably reduce the
above two elses to a single one and use the check of tbinfo being not
null to decide which object type name to spit out..

Although, it's difficult to see how we could end up marking NOT NULL
constraints as 'separate' ever. So this code will be rarely exercised,
if ever IMO.

Regards,
Nikhils

-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers


Re: [HACKERS] cataloguing NOT NULL constraints

2011-08-04 Thread Dean Rasheed
On 4 August 2011 09:23, Nikhil Sontakke nikkh...@gmail.com wrote:
 So after writing the code to handle named NOT NULL constraints for
 tables, I'm thinking that dumpConstraints needs to be fixed thusly:

 @@ -12888,6 +12968,27 @@ dumpConstraint(Archive *fout, ConstraintInfo 
 *coninfo)
                         NULL, NULL);
        }
    }
 +   else if (coninfo-contype == 'n'  tbinfo)
 +   {
 +       /* NOT NULL constraint on a table */
 +       if (coninfo-separate)
 +       {
 +           write_msg(NULL, NOT NULL constraints cannot be dumped 
 separately from their owning table\n);
 +           exit_nicely();
 +       }
 +   }
 +   else if (coninfo-contype == 'n'  tbinfo == NULL)
 +   {
 +       /* NOT NULL constraint on a domain */
 +       TypeInfo   *tyinfo = coninfo-condomain;
 +
 +       /* Ignore if not to be dumped separately */
 +       if (coninfo-separate)
 +       {
 +           write_msg(NULL, NOT NULL constraints cannot be dumped 
 separately from their owning domain\n);
 +           exit_nicely();
 +       }
 +   }
    else
    {
        write_msg(NULL, unrecognized constraint type: %c\n, 
 coninfo-contype);


 Some nit-picking.

 AFAICS above, we seem to be only using 'tbinfo' to identify the object
 type here - 'table' visavis 'domain'. We could probably reduce the
 above two elses to a single one and use the check of tbinfo being not
 null to decide which object type name to spit out..

 Although, it's difficult to see how we could end up marking NOT NULL
 constraints as 'separate' ever. So this code will be rarely exercised,
 if ever IMO.


There's a related issue that might affect how this code ends up. I'm
not sure if this has been discussed before, but it seems to be a
problem for CHECK constraints currently, and will affect NOT NULL in
the same way - if the constraint is NOT VALID, and some of the
existing data violates the constraint, then pg_dump needs to dump the
constraint separately, after the table's data, otherwise the restore
will fail.

So it looks like this code will have to support dumping NOT NULLs
ultimately anyway.

BTW, this happens automatically for FK constraints, so I don't think
this is a problem for 9.1.

Regards,
Dean

-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers


Re: [HACKERS] cataloguing NOT NULL constraints

2011-08-04 Thread Alvaro Herrera
Excerpts from Nikhil Sontakke's message of jue ago 04 04:23:59 -0400 2011:

 Some nit-picking.
 
 AFAICS above, we seem to be only using 'tbinfo' to identify the object
 type here - 'table' visavis 'domain'. We could probably reduce the
 above two elses to a single one and use the check of tbinfo being not
 null to decide which object type name to spit out..

Yeah, I considered that, but I rejected the idea on the grounds that all
the preceding blocks use this style.  (Also, if I understand you well,
what you suggest would incur into a translatability problem; we'd have
to create two separate messages for that purpose anyway.)

 Although, it's difficult to see how we could end up marking NOT NULL
 constraints as 'separate' ever. So this code will be rarely exercised,
 if ever IMO.

Well, as Dean points out, as soon as we have NOT VALID constraints it
will be necessary.  I prefer to leave that out for a later patch.

Thanks for looking.

-- 
Álvaro Herrera alvhe...@commandprompt.com
The PostgreSQL Company - Command Prompt, Inc.
PostgreSQL Replication, Consulting, Custom Development, 24x7 support

-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers


Re: [HACKERS] cataloguing NOT NULL constraints

2011-08-04 Thread Peter Eisentraut
On tis, 2011-08-02 at 23:40 -0400, Alvaro Herrera wrote:
 Thanks.  I've done the other changes you suggested, but I don't see that
 it's desirable to have gram.y emit AT_AddConstraint directly.  It seems
 cleaner to be able to turn a NOT NULL constraint into AT_SetNotNull
 in parse_utilcmd instead.  (Maybe I'll have to bite the bullet and make
 AT_AddConstraint work for not null constraints as well, as part of the
 larger patch.  Not sure.)  Currently, the table constraint syntax only
 lets you do a single constraint at a time, but you can do multiple
 constraints with the column constraint syntax.  I am not sure how hard
 it is to rework the grammar so that only a single constraint is
 allowed, but I'm not sure that it's worth the trouble either.
 
 Attached is an updated version, touching the docs and adding a new
 simple regression test.
 
 But ... I just noticed that I need to touch ALTER DOMAIN in a similar
 way as well.

Have you considered just cataloging NOT NULL constraints as CHECK
constraints and teaching the reverse parser to convert x CHECK (x IS
NOT NULL) to x NOT NULL.  It seems to me that we're adding a whole
lot of hoopla here that is essentially identical to the existing CHECK
constraint support (it must be, per SQL standard), for no additional
functionality.


-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers


Re: [HACKERS] cataloguing NOT NULL constraints

2011-08-04 Thread Alvaro Herrera
Excerpts from Peter Eisentraut's message of jue ago 04 13:57:54 -0400 2011:
 On tis, 2011-08-02 at 23:40 -0400, Alvaro Herrera wrote:
  Thanks.  I've done the other changes you suggested, but I don't see that
  it's desirable to have gram.y emit AT_AddConstraint directly.  It seems
  cleaner to be able to turn a NOT NULL constraint into AT_SetNotNull
  in parse_utilcmd instead.  (Maybe I'll have to bite the bullet and make
  AT_AddConstraint work for not null constraints as well, as part of the
  larger patch.  Not sure.)  Currently, the table constraint syntax only
  lets you do a single constraint at a time, but you can do multiple
  constraints with the column constraint syntax.  I am not sure how hard
  it is to rework the grammar so that only a single constraint is
  allowed, but I'm not sure that it's worth the trouble either.

 Have you considered just cataloging NOT NULL constraints as CHECK
 constraints and teaching the reverse parser to convert x CHECK (x IS
 NOT NULL) to x NOT NULL.

Hmm, no, I admit I haven't.  The current approach was suggested very
early in the history of this patch.  (To be honest I didn't know NOT
NULL constraints where special forms of CHECK constraints until you
mentioned the other day regarding the information schema, and then it
didn't occur to me that it might make sense to represent them as such in
the catalog).

 It seems to me that we're adding a whole
 lot of hoopla here that is essentially identical to the existing CHECK
 constraint support (it must be, per SQL standard), for no additional
 functionality.

Yeah, perhaps you're right.  The main reason they were considered
separately is that we wanted to have them to be optimized via
pg_attribute.attnotnull, but my patch does away with the need for that
because it is maintained separately anyway.

Before embarking on rewriting this patch from scratch, I would like to
know what's your opinion (or the SQL standard's) on the fact that this
patch separated the PRIMARY KEY from NOT NULL constraints, so that they
don't act exactly alike (to wit, the not-nullness of a PK does not
inherit while the one from a NOT NULL constraint does).

-- 
Álvaro Herrera alvhe...@commandprompt.com
The PostgreSQL Company - Command Prompt, Inc.
PostgreSQL Replication, Consulting, Custom Development, 24x7 support

-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers


Re: [HACKERS] cataloguing NOT NULL constraints

2011-08-03 Thread Dean Rasheed
On 3 August 2011 04:40, Alvaro Herrera alvhe...@commandprompt.com wrote:
 Excerpts from Dean Rasheed's message of sáb jul 30 18:40:46 -0400 2011:

 Looks pretty good to me (not too dirty). I suppose given that the
 parser transforms AT_ColumnConstraint into one of the existing command
 subtypes, you could just have gram.y emit an AT_AddConstraint with the
 ColumnDef attached, to save adding a new subtype, but there's probably
 not much difference.

 Thanks.  I've done the other changes you suggested, but I don't see that
 it's desirable to have gram.y emit AT_AddConstraint directly.  It seems
 cleaner to be able to turn a NOT NULL constraint into AT_SetNotNull
 in parse_utilcmd instead.

I wasn't proposing getting rid of that bit in parse_utilcmd. I just
meant move the block that calls transformColumnConstraints() to the
AT_AddConstraint case in transformAlterTableStmt(). So it would test
if it has a ColumnDef attached, and either process a table constraint
or a set of column constraints. That would avoid the need for a new
command subtype, and so the changes to tablecmds.c would not be
needed. I think it would also avoid the need to add colname to the
Constraint struct, so none of the parsenodes.h changes would be needed
either.


  (Maybe I'll have to bite the bullet and make
 AT_AddConstraint work for not null constraints as well, as part of the
 larger patch.  Not sure.)  Currently, the table constraint syntax only
 lets you do a single constraint at a time, but you can do multiple
 constraints with the column constraint syntax.  I am not sure how hard
 it is to rework the grammar so that only a single constraint is
 allowed, but I'm not sure that it's worth the trouble either.

 Attached is an updated version, touching the docs and adding a new
 simple regression test.

 But ... I just noticed that I need to touch ALTER DOMAIN in a similar
 way as well.

Oh I keep forgetting about domains. But after a quick glance at the
docs, doesn't it already have syntax for this?

Regards,
Dean

-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers


Re: [HACKERS] cataloguing NOT NULL constraints

2011-08-03 Thread Alvaro Herrera
Excerpts from Dean Rasheed's message of mié ago 03 03:11:32 -0400 2011:
 On 3 August 2011 04:40, Alvaro Herrera alvhe...@commandprompt.com wrote:
  Excerpts from Dean Rasheed's message of sáb jul 30 18:40:46 -0400 2011:
 
  Looks pretty good to me (not too dirty). I suppose given that the
  parser transforms AT_ColumnConstraint into one of the existing command
  subtypes, you could just have gram.y emit an AT_AddConstraint with the
  ColumnDef attached, to save adding a new subtype, but there's probably
  not much difference.
 
  Thanks.  I've done the other changes you suggested, but I don't see that
  it's desirable to have gram.y emit AT_AddConstraint directly.  It seems
  cleaner to be able to turn a NOT NULL constraint into AT_SetNotNull
  in parse_utilcmd instead.
 
 I wasn't proposing getting rid of that bit in parse_utilcmd. I just
 meant move the block that calls transformColumnConstraints() to the
 AT_AddConstraint case in transformAlterTableStmt(). So it would test
 if it has a ColumnDef attached, and either process a table constraint
 or a set of column constraints. That would avoid the need for a new
 command subtype, and so the changes to tablecmds.c would not be
 needed. I think it would also avoid the need to add colname to the
 Constraint struct, so none of the parsenodes.h changes would be needed
 either.

Oh, I see.  Well, the problem is precisely that we don't have a
ColumnDef at that point.

... ah, maybe what we could do is have gram.y create a ColumnDef in the
new production, and stick that in cmd-def instead of the list of
constraints.  So parse_utilcmd would have to know that if that node
IsA(ColumnDef) then it needs to deal with column constraints.  It seems
a bit cleaner overall, though it's still wart-ish.

-- 
Álvaro Herrera alvhe...@commandprompt.com
The PostgreSQL Company - Command Prompt, Inc.
PostgreSQL Replication, Consulting, Custom Development, 24x7 support

-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers


Re: [HACKERS] cataloguing NOT NULL constraints

2011-08-03 Thread Alvaro Herrera
Excerpts from Alvaro Herrera's message of mié ago 03 13:12:38 -0400 2011:

 ... ah, maybe what we could do is have gram.y create a ColumnDef in the
 new production, and stick that in cmd-def instead of the list of
 constraints.  So parse_utilcmd would have to know that if that node
 IsA(ColumnDef) then it needs to deal with column constraints.  It seems
 a bit cleaner overall, though it's still wart-ish.

Yes, this works, thanks for the suggestion.  Attached.

-- 
Álvaro Herrera alvhe...@commandprompt.com
The PostgreSQL Company - Command Prompt, Inc.
PostgreSQL Replication, Consulting, Custom Development, 24x7 support


alter_add-3.patch
Description: Binary data

-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers


Re: [HACKERS] cataloguing NOT NULL constraints

2011-08-03 Thread Alvaro Herrera
Excerpts from Dean Rasheed's message of sáb jul 23 04:37:06 -0400 2011:
 On 22 July 2011 22:28, Robert Haas robertmh...@gmail.com wrote:

  mine was that we need a command such as
 
  ALTER TABLE foo ALTER COLUMN bar SET NOT NULL name_of_notnull_constr
 
  where the last bit is what's new.
 
  Well, if you don't have that, I don't see how you have any chance of
  pg_dump working correctly.
 
 Ah yes, pg_dump's dumpConstraint() needs a clause to alter a table
 adding a named NOT NULL constraint (and the DOMAIN case should be
 preserving the constraint's name too). So it looks like some new
 syntax for ALTER TABLE to add named NOT NULL constraints is probably
 needed before this can be committed.

So after writing the code to handle named NOT NULL constraints for
tables, I'm thinking that dumpConstraints needs to be fixed thusly:

@@ -12888,6 +12968,27 @@ dumpConstraint(Archive *fout, ConstraintInfo *coninfo)
 NULL, NULL);
}
}
+   else if (coninfo-contype == 'n'  tbinfo)
+   {
+   /* NOT NULL constraint on a table */
+   if (coninfo-separate)
+   {
+   write_msg(NULL, NOT NULL constraints cannot be dumped separately 
from their owning table\n);
+   exit_nicely();
+   }
+   }
+   else if (coninfo-contype == 'n'  tbinfo == NULL)
+   {
+   /* NOT NULL constraint on a domain */
+   TypeInfo   *tyinfo = coninfo-condomain;
+
+   /* Ignore if not to be dumped separately */
+   if (coninfo-separate)
+   {
+   write_msg(NULL, NOT NULL constraints cannot be dumped separately 
from their owning domain\n);
+   exit_nicely();
+   }
+   }
else
{
write_msg(NULL, unrecognized constraint type: %c\n, coninfo-contype);


There doesn't seem to be any point in giving pg_dump the ability to dump
such constraints separately; I don't think there's any situation in
which dependencies between the table/domain and NOT NULL constraints
would get circular (which is what causes them to acquire the separate
flag).  I don't want to write code that is going to be always
unused, particularly not in a beast as hairy such as pg_dump.

Note that the code dumps not null constraints along with the table
definition, which includes the constraint name, so it works perfectly
fine already.

-- 
Álvaro Herrera alvhe...@commandprompt.com
The PostgreSQL Company - Command Prompt, Inc.
PostgreSQL Replication, Consulting, Custom Development, 24x7 support

-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers


Re: [HACKERS] cataloguing NOT NULL constraints

2011-08-02 Thread Alvaro Herrera
Excerpts from Dean Rasheed's message of sáb jul 30 18:40:46 -0400 2011:

 Looks pretty good to me (not too dirty). I suppose given that the
 parser transforms AT_ColumnConstraint into one of the existing command
 subtypes, you could just have gram.y emit an AT_AddConstraint with the
 ColumnDef attached, to save adding a new subtype, but there's probably
 not much difference.

Thanks.  I've done the other changes you suggested, but I don't see that
it's desirable to have gram.y emit AT_AddConstraint directly.  It seems
cleaner to be able to turn a NOT NULL constraint into AT_SetNotNull
in parse_utilcmd instead.  (Maybe I'll have to bite the bullet and make
AT_AddConstraint work for not null constraints as well, as part of the
larger patch.  Not sure.)  Currently, the table constraint syntax only
lets you do a single constraint at a time, but you can do multiple
constraints with the column constraint syntax.  I am not sure how hard
it is to rework the grammar so that only a single constraint is
allowed, but I'm not sure that it's worth the trouble either.

Attached is an updated version, touching the docs and adding a new
simple regression test.

But ... I just noticed that I need to touch ALTER DOMAIN in a similar
way as well.

-- 
Álvaro Herrera alvhe...@commandprompt.com
The PostgreSQL Company - Command Prompt, Inc.
PostgreSQL Replication, Consulting, Custom Development, 24x7 support


alter_add-2.patch
Description: Binary data

-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers


Re: [HACKERS] cataloguing NOT NULL constraints

2011-07-30 Thread Dean Rasheed
On 30 July 2011 01:23, Alvaro Herrera alvhe...@commandprompt.com wrote:
 Excerpts from Robert Haas's message of sáb jul 23 07:40:12 -0400 2011:
 On Sat, Jul 23, 2011 at 4:37 AM, Dean Rasheed dean.a.rash...@gmail.com 
 wrote:
  That looks wrong to me, because a NOT NULL constraint is a column
  constraint not a table constraint. The CREATE TABLE syntax explicitly
  distinguishes these 2 cases, and only allows NOT NULLs in column
  constraints. So from a consistency point-of-view, I think that ALTER
  TABLE should follow suit.
 
  So the new syntax could be:
 
  ALTER TABLE table_name ALTER [COLUMN] col_name ADD column_constraint
 
  where column_constraint is the same as in CREATE TABLE (i.e., allowing
  all the other constraint types at the same time).
 
  It looks like that approach would probably lend itself to more
  code-reusability too, especially once we start adding options to the
  constraint.

 So you'd end up with something like this?

 ALTER TABLE foo ALTER COLUMN bar ADD CONSTRAINT somename NOT NULL

 That works for me.  I think sticking the name of the constraint in
 there at the end of the line as Alvaro proposed would be terrible for
 future syntax extensibility - we'll be much less likely to paint
 ourselves into a corner with something like this.

 Here's a patch that does things more or less in this way.  Note that
 this is separate from the other patch, so while you can specify a
 constraint name for the NOT NULL clause, it's not stored anywhere.

 This is preliminary: there's no docs nor new tests.  Here's how it works
 (you can also throw in PRIMARY KEY into the mix, but not EXCLUSION):

 alvherre=# create table bar (a int);
 CREATE TABLE
 alvherre=# alter table bar alter column a add constraint foo_fk references 
 foo initially deferred deferrable check (a  4) constraint a_uq unique 
 constraint fnn not null;
 NOTICE:  ALTER TABLE / ADD UNIQUE creará el índice implícito «a_uq» para la 
 tabla «bar»
 ALTER TABLE
 alvherre=# \d bar
        Tabla «public.bar»
  Columna |  Tipo   | Modificadores
 -+-+---
  a       | integer | not null
 Índices:
    a_uq UNIQUE CONSTRAINT, btree (a)
 Restricciones CHECK:
    bar_a_check CHECK (a  4)
 Restricciones de llave foránea:
    foo_fk FOREIGN KEY (a) REFERENCES foo(a) DEFERRABLE INITIALLY DEFERRED


 The implementation is a bit dirty (at least IMO), but I don't see a way
 around that, mainly because ALTER TABLE / ALTER COLUMN does not have a
 proper ColumnDef to stick the Constraint nodes into; so while the other
 constraints can do fine without that, it isn't very helpful for NOT NULL.
 So it has to create a phony ColumnDef for transformConstraintItems to use.


Looks pretty good to me (not too dirty). I suppose given that the
parser transforms AT_ColumnConstraint into one of the existing command
subtypes, you could just have gram.y emit an AT_AddConstraint with the
ColumnDef attached, to save adding a new subtype, but there's probably
not much difference.

I think you need to be setting skipValidation in
transformAlterTableStmt() if one of the new column constraints is a
FK, so that it gets validated.

Perhaps transformColumnConstraints() is more descriptive of the new
function rather than transformConstraintItems().

Regards,
Dean


 --
 Álvaro Herrera alvhe...@commandprompt.com
 The PostgreSQL Company - Command Prompt, Inc.
 PostgreSQL Replication, Consulting, Custom Development, 24x7 support


-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers


Re: [HACKERS] cataloguing NOT NULL constraints

2011-07-29 Thread Alvaro Herrera
Excerpts from Robert Haas's message of sáb jul 23 07:40:12 -0400 2011:
 On Sat, Jul 23, 2011 at 4:37 AM, Dean Rasheed dean.a.rash...@gmail.com 
 wrote:
  That looks wrong to me, because a NOT NULL constraint is a column
  constraint not a table constraint. The CREATE TABLE syntax explicitly
  distinguishes these 2 cases, and only allows NOT NULLs in column
  constraints. So from a consistency point-of-view, I think that ALTER
  TABLE should follow suit.
 
  So the new syntax could be:
 
  ALTER TABLE table_name ALTER [COLUMN] col_name ADD column_constraint
 
  where column_constraint is the same as in CREATE TABLE (i.e., allowing
  all the other constraint types at the same time).
 
  It looks like that approach would probably lend itself to more
  code-reusability too, especially once we start adding options to the
  constraint.
 
 So you'd end up with something like this?
 
 ALTER TABLE foo ALTER COLUMN bar ADD CONSTRAINT somename NOT NULL
 
 That works for me.  I think sticking the name of the constraint in
 there at the end of the line as Alvaro proposed would be terrible for
 future syntax extensibility - we'll be much less likely to paint
 ourselves into a corner with something like this.

Here's a patch that does things more or less in this way.  Note that
this is separate from the other patch, so while you can specify a
constraint name for the NOT NULL clause, it's not stored anywhere.

This is preliminary: there's no docs nor new tests.  Here's how it works
(you can also throw in PRIMARY KEY into the mix, but not EXCLUSION):

alvherre=# create table bar (a int);
CREATE TABLE
alvherre=# alter table bar alter column a add constraint foo_fk references foo 
initially deferred deferrable check (a  4) constraint a_uq unique constraint 
fnn not null;
NOTICE:  ALTER TABLE / ADD UNIQUE creará el índice implícito «a_uq» para la 
tabla «bar»
ALTER TABLE
alvherre=# \d bar
Tabla «public.bar»
 Columna |  Tipo   | Modificadores 
-+-+---
 a   | integer | not null
Índices:
a_uq UNIQUE CONSTRAINT, btree (a)
Restricciones CHECK:
bar_a_check CHECK (a  4)
Restricciones de llave foránea:
foo_fk FOREIGN KEY (a) REFERENCES foo(a) DEFERRABLE INITIALLY DEFERRED


The implementation is a bit dirty (at least IMO), but I don't see a way
around that, mainly because ALTER TABLE / ALTER COLUMN does not have a
proper ColumnDef to stick the Constraint nodes into; so while the other
constraints can do fine without that, it isn't very helpful for NOT NULL.
So it has to create a phony ColumnDef for transformConstraintItems to use.

-- 
Álvaro Herrera alvhe...@commandprompt.com
The PostgreSQL Company - Command Prompt, Inc.
PostgreSQL Replication, Consulting, Custom Development, 24x7 support


alter_add.patch
Description: Binary data

-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers


Re: [HACKERS] cataloguing NOT NULL constraints

2011-07-23 Thread Dean Rasheed
On 22 July 2011 22:28, Robert Haas robertmh...@gmail.com wrote:
 On Fri, Jul 22, 2011 at 4:39 PM, Alvaro Herrera
 alvhe...@commandprompt.com wrote:
 Excerpts from Robert Haas's message of vie jul 22 12:14:30 -0400 2011:
 On Thu, Jul 21, 2011 at 7:51 PM, Alvaro Herrera
 alvhe...@commandprompt.com wrote:
  I think that there probably ought to be a way to display the NOT NULL
  constraint names (perhaps through \d+). For example, if you're
  planning to support NOT VALID on top of this in the future, then there
  needs to be a way to get the constraint's name to validate it.
 
  Absolutely true.  Another thing that needs to be done here is to let the
  ALTER TABLE and ALTER DOMAIN commands use the constraint names; right
  now, they simply let you add the constraint but not specify the name.
  That should probably be revisited.

 That, at least, seems like something that should be fixed before commit.

 Hmm, which point, Dean's or mine?  Dean was saying that the name should
 be displayed by some flavor of \d;

 That might not be 100% necessary for the initial commit, but seems
 easy to fix, so why not?


Agreed.


 mine was that we need a command such
 as

 ALTER TABLE foo ALTER COLUMN bar SET NOT NULL name_of_notnull_constr

 where the last bit is what's new.

 Well, if you don't have that, I don't see how you have any chance of
 pg_dump working correctly.

Ah yes, pg_dump's dumpConstraint() needs a clause to alter a table
adding a named NOT NULL constraint (and the DOMAIN case should be
preserving the constraint's name too). So it looks like some new
syntax for ALTER TABLE to add named NOT NULL constraints is probably
needed before this can be committed.


  Though I think it should use the table
 constraint syntax:

 CONSTRAINT name_of_notnull_constr constraint_definition

 I'm not exactly sure what to propose for the constraint_definition.
 Perhaps just:

 CONSTRAINT name_of_notnull_constr NOT NULL column_name


That looks wrong to me, because a NOT NULL constraint is a column
constraint not a table constraint. The CREATE TABLE syntax explicitly
distinguishes these 2 cases, and only allows NOT NULLs in column
constraints. So from a consistency point-of-view, I think that ALTER
TABLE should follow suit.

So the new syntax could be:

ALTER TABLE table_name ALTER [COLUMN] col_name ADD column_constraint

where column_constraint is the same as in CREATE TABLE (i.e., allowing
all the other constraint types at the same time).

It looks like that approach would probably lend itself to more
code-reusability too, especially once we start adding options to the
constraint.

Regards,
Dean

-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers


Re: [HACKERS] cataloguing NOT NULL constraints

2011-07-23 Thread Robert Haas
On Sat, Jul 23, 2011 at 4:37 AM, Dean Rasheed dean.a.rash...@gmail.com wrote:
 That looks wrong to me, because a NOT NULL constraint is a column
 constraint not a table constraint. The CREATE TABLE syntax explicitly
 distinguishes these 2 cases, and only allows NOT NULLs in column
 constraints. So from a consistency point-of-view, I think that ALTER
 TABLE should follow suit.

 So the new syntax could be:

 ALTER TABLE table_name ALTER [COLUMN] col_name ADD column_constraint

 where column_constraint is the same as in CREATE TABLE (i.e., allowing
 all the other constraint types at the same time).

 It looks like that approach would probably lend itself to more
 code-reusability too, especially once we start adding options to the
 constraint.

So you'd end up with something like this?

ALTER TABLE foo ALTER COLUMN bar ADD CONSTRAINT somename NOT NULL

That works for me.  I think sticking the name of the constraint in
there at the end of the line as Alvaro proposed would be terrible for
future syntax extensibility - we'll be much less likely to paint
ourselves into a corner with something like this.

-- 
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers


Re: [HACKERS] cataloguing NOT NULL constraints

2011-07-22 Thread Robert Haas
On Thu, Jul 21, 2011 at 7:51 PM, Alvaro Herrera
alvhe...@commandprompt.com wrote:
 I think that there probably ought to be a way to display the NOT NULL
 constraint names (perhaps through \d+). For example, if you're
 planning to support NOT VALID on top of this in the future, then there
 needs to be a way to get the constraint's name to validate it.

 Absolutely true.  Another thing that needs to be done here is to let the
 ALTER TABLE and ALTER DOMAIN commands use the constraint names; right
 now, they simply let you add the constraint but not specify the name.
 That should probably be revisited.

That, at least, seems like something that should be fixed before commit.

-- 
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers


Re: [HACKERS] cataloguing NOT NULL constraints

2011-07-22 Thread Peter Eisentraut
On ons, 2011-07-20 at 13:53 -0400, Alvaro Herrera wrote:
 I checked the check_constraints definition in the standard and it's
 not clear to me that NOT NULL constraints are supposed to be there at
 all.  Are NOT NULL constraints considered to be CHECK constraints too?

Yes, NOT NULL is considered just a notational shorthand for CHECK (x IS
NULL).


-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers



Re: [HACKERS] cataloguing NOT NULL constraints

2011-07-22 Thread Alvaro Herrera
Excerpts from Robert Haas's message of vie jul 22 12:14:30 -0400 2011:
 On Thu, Jul 21, 2011 at 7:51 PM, Alvaro Herrera
 alvhe...@commandprompt.com wrote:
  I think that there probably ought to be a way to display the NOT NULL
  constraint names (perhaps through \d+). For example, if you're
  planning to support NOT VALID on top of this in the future, then there
  needs to be a way to get the constraint's name to validate it.
 
  Absolutely true.  Another thing that needs to be done here is to let the
  ALTER TABLE and ALTER DOMAIN commands use the constraint names; right
  now, they simply let you add the constraint but not specify the name.
  That should probably be revisited.
 
 That, at least, seems like something that should be fixed before commit.

Hmm, which point, Dean's or mine?  Dean was saying that the name should
be displayed by some flavor of \d; mine was that we need a command such
as

ALTER TABLE foo ALTER COLUMN bar SET NOT NULL name_of_notnull_constr

where the last bit is what's new.

-- 
Álvaro Herrera alvhe...@commandprompt.com
The PostgreSQL Company - Command Prompt, Inc.
PostgreSQL Replication, Consulting, Custom Development, 24x7 support

-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers


Re: [HACKERS] cataloguing NOT NULL constraints

2011-07-22 Thread Robert Haas
On Fri, Jul 22, 2011 at 4:39 PM, Alvaro Herrera
alvhe...@commandprompt.com wrote:
 Excerpts from Robert Haas's message of vie jul 22 12:14:30 -0400 2011:
 On Thu, Jul 21, 2011 at 7:51 PM, Alvaro Herrera
 alvhe...@commandprompt.com wrote:
  I think that there probably ought to be a way to display the NOT NULL
  constraint names (perhaps through \d+). For example, if you're
  planning to support NOT VALID on top of this in the future, then there
  needs to be a way to get the constraint's name to validate it.
 
  Absolutely true.  Another thing that needs to be done here is to let the
  ALTER TABLE and ALTER DOMAIN commands use the constraint names; right
  now, they simply let you add the constraint but not specify the name.
  That should probably be revisited.

 That, at least, seems like something that should be fixed before commit.

 Hmm, which point, Dean's or mine?  Dean was saying that the name should
 be displayed by some flavor of \d;

That might not be 100% necessary for the initial commit, but seems
easy to fix, so why not?

 mine was that we need a command such
 as

 ALTER TABLE foo ALTER COLUMN bar SET NOT NULL name_of_notnull_constr

 where the last bit is what's new.

Well, if you don't have that, I don't see how you have any chance of
pg_dump working correctly.  Though I think it should use the table
constraint syntax:

CONSTRAINT name_of_notnull_constr constraint_definition

I'm not exactly sure what to propose for the constraint_definition.
Perhaps just:

CONSTRAINT name_of_notnull_constr NOT NULL column_name

Though Peter seemed to think it should be:

CONSTRAINT name_of_notnull_constr CHECK (column_name IS NOT NULL)

-- 
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers


Re: [HACKERS] cataloguing NOT NULL constraints

2011-07-20 Thread Alvaro Herrera
Excerpts from Peter Eisentraut's message of sáb jul 09 14:45:23 -0400 2011:
 On tor, 2011-07-07 at 17:34 -0400, Alvaro Herrera wrote:
  The attached patch introduces pg_constraint rows for NOT NULL
  column constraints.
 
 The information schema views check_constraints and table_constraints
 currently make up some artificial constraint names for not-null
 constraints.  I suppose this patch removes the underlying cause for
 that, so could you look into updating the information schema as well?
 You could probably just remove the separate union branches for not null
 and adjust the contype conditions.

Fixing table_constraints is pretty trivial, just like you suggest;
already done in my private tree.

I checked the check_constraints definition in the standard and it's not
clear to me that NOT NULL constraints are supposed to be there at all.
Are NOT NULL constraints considered to be CHECK constraints too?

The fix is trivial either way: if they are not to be there we should
just remove the UNION arm that deals with them.  If they are, we do
likewise and then fix the other arm as you suggest.

Thanks for the pointer.

-- 
Álvaro Herrera alvhe...@commandprompt.com
The PostgreSQL Company - Command Prompt, Inc.
PostgreSQL Replication, Consulting, Custom Development, 24x7 support

-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers


Re: [HACKERS] cataloguing NOT NULL constraints

2011-07-13 Thread Dean Rasheed
On 7 July 2011 22:34, Alvaro Herrera alvhe...@commandprompt.com wrote:
 Hi,

 The attached patch introduces pg_constraint rows for NOT NULL
 column constraints.

 This patch is a heavily reworked version of Bernd Helmle's patch here:
 http://archives.postgresql.org/message-id/E57A252DFD60C1FCA91731BD@amenophis

 I fixed a bunch of issues with that patch.  I think the most
 visible one is that NOT NULL constraints are completely separate beasts
 from PRIMARY KEYS.  This has a number of consequences, including
 different inheritance properties (NOT NULL constraints inherit, while
 primary keys do not; and ALTER TABLE commands propagate to children
 correctly and consistently for both of them); if you drop one of them
 but the other remains, the attnotnull marking is not removed from
 pg_attribute; if you drop both or if there's only one of them and you
 drop it, attnotnull is reset.

 Note: if we want to assume the position that PRIMARY KEYS ought to
 inherit (that is to say, the NOT NULL bit of them should), we'd need to
 discuss that.  Not inheriting is a bit of a change in behavior, but
 inheriting seems counterintuitive to some.

 One bit that was present in Bernd's patch and I left as is is support
 for domain NOT NULL constraints.  I didn't check this part very much
 (which is to say at all), so please bear with me if it doesn't work,
 bugs are probably mine because of the way I ripped out the underlying
 implementation.

 I had to invent a new AlterTable command type, because the code to add a
 new primary key was injecting a SET NOT NULL command; this didn't work
 very well because it automatically created a NOT NULL pg_constraint row,
 which obviously isn't what we wanted.  So that's AT_SetAttNotNull for
 you, which only updates attnotnull without creating a pg_constraint
 entry.

 (Another thing I changed is that the code no longer uses
 CookedConstraint for not null constraints.  I invented a new struct to
 carry them over.  The reason was mostly because MergeAttributes needed
 to record attname in some cases and attnum in others, and the Cooked
 struct wasn't letting me; instead of changing it, which wasn't a very
 good fit for other reasons anyway, it seemed better to invent a new
 one more suited to the task.)

 Also, there was some attempt to share code to handle DROP NOT NULL with
 DROP CONSTRAINT (as discussed in the original thread, see message with
 Id D1815DA0B6288201EC1CFAC3@amenophis).  I ripped that out because it
 was rather messy, and since NOT NULL seems to have some particular
 requirements anyway, it seems better to have them separate.  It's
 cleaner and easier to understand anyway.  If someone wants to have a go
 at merging things, be my guest ...

 Note that I'm not adding support for ALTER TABLE / DROP CONSTRAINT to
 drop a not null constraint.  We can do that of course, I don't think
 it's all that hard -- but this patch is large enough already and we can
 add that separately.  (There's no way to display the NOT NULL constraint
 names anyway, though they are preserved on inheritance, per request in
 the original threads).

 One thing I intend to change before committing is moving all the code I
 added to pg_constraint.c back into tablecmds.c (and removing the
 accompanying constraint.h header).  I thought at one point that this was
 better modularity (code that touches pg_constraint should be in the
 eponymous file), but seeing how constraints are thoroughly messed up
 with in tablecmds.c this seems an exercise in futility.  Another change
 is eyeballing the new tests a couple more times to ensure

 I haven't looked at pg_dump at all, either.


Nice work!

It appears to work as expected and I find this behaviour much more intuitive.

I think that there probably ought to be a way to display the NOT NULL
constraint names (perhaps through \d+). For example, if you're
planning to support NOT VALID on top of this in the future, then there
needs to be a way to get the constraint's name to validate it.

You said you haven't looked at pg_dump yet. I'm guessing that the only
change needed is to dump the NOT NULL constraint name along with the
table definition so that it is restored correctly.

I had one thought regarding the code: perhaps the NOT NULL constraints
could be represented using a new struct hanging off the TupleConstr
struct of a TupleDesc, in the same way as CHECK constraints. Then they
could be read in by the relcache code at the same time as CHECK
constraints, rather than by GetRelationNotNullConstraints(), and they
would be more accessible throughout the backend code. For example,
supporting NOT VALID on top of this would require a similar change to
the constraint exclusion code as for CHECK constraints, so the planner
would need to access the constraint details.

Regards,
Dean

-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers


Re: [HACKERS] cataloguing NOT NULL constraints

2011-07-09 Thread Peter Eisentraut
On tor, 2011-07-07 at 17:34 -0400, Alvaro Herrera wrote:
 The attached patch introduces pg_constraint rows for NOT NULL
 column constraints.

The information schema views check_constraints and table_constraints
currently make up some artificial constraint names for not-null
constraints.  I suppose this patch removes the underlying cause for
that, so could you look into updating the information schema as well?
You could probably just remove the separate union branches for not null
and adjust the contype conditions.


-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers


Re: [HACKERS] cataloguing NOT NULL constraints

2011-07-09 Thread Alvaro Herrera
Excerpts from Robert Haas's message of vie jul 08 23:30:10 -0400 2011:
 On Thu, Jul 7, 2011 at 5:34 PM, Alvaro Herrera
 alvhe...@commandprompt.com wrote:
  The attached patch introduces pg_constraint rows for NOT NULL
  column constraints.
 
  This patch is a heavily reworked version of Bernd Helmle's patch here:
  http://archives.postgresql.org/message-id/E57A252DFD60C1FCA91731BD@amenophis

 It would probably be good to add this to the next CommitFest.  Not
 sure about anyone else, but I'm too busy looking at patches that were
 submitted in April, May, and June to look at any new ones right now.

Yeah, that's what I did.

-- 
Álvaro Herrera alvhe...@commandprompt.com
The PostgreSQL Company - Command Prompt, Inc.
PostgreSQL Replication, Consulting, Custom Development, 24x7 support

-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers


Re: [HACKERS] cataloguing NOT NULL constraints

2011-07-08 Thread Robert Haas
On Thu, Jul 7, 2011 at 5:34 PM, Alvaro Herrera
alvhe...@commandprompt.com wrote:
 The attached patch introduces pg_constraint rows for NOT NULL
 column constraints.

 This patch is a heavily reworked version of Bernd Helmle's patch here:
 http://archives.postgresql.org/message-id/E57A252DFD60C1FCA91731BD@amenophis

 I fixed a bunch of issues with that patch.  I think the most
 visible one is that NOT NULL constraints are completely separate beasts
 from PRIMARY KEYS.  This has a number of consequences, including
 different inheritance properties (NOT NULL constraints inherit, while
 primary keys do not; and ALTER TABLE commands propagate to children
 correctly and consistently for both of them); if you drop one of them
 but the other remains, the attnotnull marking is not removed from
 pg_attribute; if you drop both or if there's only one of them and you
 drop it, attnotnull is reset.

 Note: if we want to assume the position that PRIMARY KEYS ought to
 inherit (that is to say, the NOT NULL bit of them should), we'd need to
 discuss that.  Not inheriting is a bit of a change in behavior, but
 inheriting seems counterintuitive to some.

 One bit that was present in Bernd's patch and I left as is is support
 for domain NOT NULL constraints.  I didn't check this part very much
 (which is to say at all), so please bear with me if it doesn't work,
 bugs are probably mine because of the way I ripped out the underlying
 implementation.

 I had to invent a new AlterTable command type, because the code to add a
 new primary key was injecting a SET NOT NULL command; this didn't work
 very well because it automatically created a NOT NULL pg_constraint row,
 which obviously isn't what we wanted.  So that's AT_SetAttNotNull for
 you, which only updates attnotnull without creating a pg_constraint
 entry.

 (Another thing I changed is that the code no longer uses
 CookedConstraint for not null constraints.  I invented a new struct to
 carry them over.  The reason was mostly because MergeAttributes needed
 to record attname in some cases and attnum in others, and the Cooked
 struct wasn't letting me; instead of changing it, which wasn't a very
 good fit for other reasons anyway, it seemed better to invent a new
 one more suited to the task.)

 Also, there was some attempt to share code to handle DROP NOT NULL with
 DROP CONSTRAINT (as discussed in the original thread, see message with
 Id D1815DA0B6288201EC1CFAC3@amenophis).  I ripped that out because it
 was rather messy, and since NOT NULL seems to have some particular
 requirements anyway, it seems better to have them separate.  It's
 cleaner and easier to understand anyway.  If someone wants to have a go
 at merging things, be my guest ...

 Note that I'm not adding support for ALTER TABLE / DROP CONSTRAINT to
 drop a not null constraint.  We can do that of course, I don't think
 it's all that hard -- but this patch is large enough already and we can
 add that separately.  (There's no way to display the NOT NULL constraint
 names anyway, though they are preserved on inheritance, per request in
 the original threads).

 One thing I intend to change before committing is moving all the code I
 added to pg_constraint.c back into tablecmds.c (and removing the
 accompanying constraint.h header).  I thought at one point that this was
 better modularity (code that touches pg_constraint should be in the
 eponymous file), but seeing how constraints are thoroughly messed up
 with in tablecmds.c this seems an exercise in futility.  Another change
 is eyeballing the new tests a couple more times to ensure

 I haven't looked at pg_dump at all, either.

It would probably be good to add this to the next CommitFest.  Not
sure about anyone else, but I'm too busy looking at patches that were
submitted in April, May, and June to look at any new ones right now.

-- 
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers