On 28.02.23 20:15, Alvaro Herrera wrote:
So I reworked this to use a new contype value for the NOT NULL
pg_constraint rows; I attach it here.  I think it's fairly clean.

0001 is just a trivial change that seemed obvious as soon as I ran into
the problem.

This looks harmless enough, but I wonder what the reason for it is. What command can cause this error (no test case?)? Is there ever a confusion about what table is in play?

0002 is the most interesting part.

Where did this syntax come from:

--- a/doc/src/sgml/ref/create_table.sgml
+++ b/doc/src/sgml/ref/create_table.sgml
@@ -77,6 +77,7 @@ CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXI

[ CONSTRAINT <replaceable class="parameter">constraint_name</replaceable> ] { CHECK ( <replaceable class="parameter">expression</replaceable> ) [ NO INHERIT ] |
+  NOT NULL <replaceable class="parameter">column_name</replaceable> |
UNIQUE [ NULLS [ NOT ] DISTINCT ] ( <replaceable class="parameter">column_name</replaceable> [, ... ] ) <replaceable class="parameter">in> PRIMARY KEY ( <replaceable class="parameter">column_name</replaceable> [, ... ] ) <replaceable class="parameter">index_parameters</replac> EXCLUDE [ USING <replaceable class="parameter">index_method</replaceable> ] ( <replaceable class="parameter">exclude_element</replaceable>

I don't see that in the standard.

If we need it for something, we should at least document that it's an extension.

The test tables in foreign_key.sql are declared with columns like

    id bigint NOT NULL PRIMARY KEY,

which is a bit weird and causes expected output diffs in your patch. Is that interesting for this patch? Otherwise I suggest dropping the NOT NULL from those table definitions to avoid these extra diffs.

0003:
Since nobody liked the idea of listing the constraints in psql \d's
footer, I changed \d+ so that the "not null" column shows the name of
the constraint if there is one, or the string "(primary key)" if the
attnotnull marking for the column comes from the primary key.  The new
column is going to be quite wide in some cases; if we want to hide it
further, we could add the mythical \d++ and have *that* list the
constraint name, keeping \d+ as current.

I think my rough preference here would be to leave the existing output style (column header "Nullable", content "not null") alone and display the constraint name somewhere in the footer optionally. In practice, the name of the constraint is rarely needed.

I do like the idea of mentioning primary key-ness inside the table somehow.

As you wrote elsewhere, we can leave this patch alone for now.



Reply via email to