On 4/18/17, Peter Eisentraut <peter.eisentr...@2ndquadrant.com> wrote: > On 4/7/17 01:26, Vitaly Burovoy wrote: >> I've implement SET GENERATED ... IF NOT EXISTS. It must be placed >> before other SET options but fortunately it conforms with the >> standard. >> Since that form always changes the sequence behind the column, I >> decided to explicitly write "[NO] CACHE" in pg_dump. >> >> As a plus now it is possible to rename the sequence behind the column >> by specifying SEQUENCE NAME in SET GENERATED. >> >> I hope it is still possible to get rid of the "ADD GENERATED" syntax. > > I am still not fond of this change. There is precedent all over the > place for having separate commands for creating a structure, changing a > structure, and removing a structure. I don't understand what the > problem with that is. > > -- > Peter Eisentraut http://www.2ndQuadrant.com/ > PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
OK. Let's go through it again. IDENTITY is a property of a column. There are no syntax to change any property of any DB object via the "ADD" syntax. Yes, a structure (a sequence) is created. But in fact it cannot be independent from the column at all (I remind you that according to the standard it should be unnamed sequence and there are really no way to do something with it but via the column's DDL). It is even hard to detect which sequence (since they have names) is owned by the column: postgres=# CREATE TABLE xxx(i int generated always as identity, j serial); CREATE TABLE postgres=# \d xxx* Table "public.xxx" Column | Type | Collation | Nullable | Default --------+---------+-----------+----------+-------------------------------- i | integer | | not null | generated always as identity j | integer | | not null | nextval('xxx_j_seq'::regclass) Sequence "public.xxx_i_seq" Column | Type | Value ------------+---------+------- last_value | bigint | 1 log_cnt | bigint | 0 is_called | boolean | f Sequence "public.xxx_j_seq" Column | Type | Value ------------+---------+------- last_value | bigint | 1 log_cnt | bigint | 0 is_called | boolean | f Owned by: public.xxx.j I can only guess that "public.xxx_i_seq" is owned by "public.xxx.i", nothing proves that. Whereas for regular sequence there are two evidences ("Default" and "Owned by"). Also the created sequence cannot be deleted (only with the column) or left after the column is deleted. Everywhere else the "ADD" syntax is used where you can add more than one object to the altered one: ALTER TABLE ... ADD COLUMN /* there can be many added columns differing by names in the table */ ALTER TABLE ... ADD CONSTRAINT /* there can be many added constraints differing by names in the table */ ALTER TYPE ... ADD VALUE /* many values in an enum differing by names in the enum */ ALTER TYPE ... ADD ATTRIBUTE /* many attributes in a composite differing by names in the enum */ etc. But what is for "ALTER TABLE ... ALTER COLUMN ... ADD GENERATED"? Whether a property's name is used for a distinction between them in a column? Whether it is possible to have more than one such property to the altering column? The "SET GENERATED" (without "IF NOT EXISTS") syntax conforms to the standard for those who want it. The "SET GENERATED ... IF NOT EXISTS" syntax allows users to have the column be in a required state (IDENTITY with set options) without paying attention whether it is already set as IDENTITY or not. The "[ NOT ] EXISTS" is a common Postgres' syntax extension for creating/updating objects in many places. That's why I think it should be used instead of introducing the new "ADD" syntax which contradicts the users' current experience. -- Best regards, Vitaly Burovoy -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers