----------------
Identity Columns
----------------

Author:
    Adriano dos Santos Fernandes <adrianosf@gmail.com>

Description:
    An identity column is a column associated with an internal sequence generator and has it value
    automatically set when omitted in an INSERT statement.

Syntax:
    <column definition> ::=
        <name> <type> GENERATED BY DEFAULT AS IDENTITY [ (START WITH <value>) ] <constraints>

    <alter column definition> ::=
        <name> RESTART [ WITH <value> ]

Syntax rules:
    - The type of an identity column must be an exact number type with zero scale. That includes:
    smallint, integer, bigint, numeric(x, 0) and decimal(x, 0).
    - Identity columns can't have DEFAULT or COMPUTED value.

Notes:
    - You cannot alter a identity column to normal column and vice versa.
    - Identity columns are implicitly NOT NULL.
    - Identity columns don't enforce uniqueness automatically. Use UNIQUE or PRIMARY key for that.

Implementation:
    Two columns have been inserted in RDB$RELATION_FIELDS: RDB$GENERATOR_NAME and RDB$IDENTITY_TYPE.
    RDB$GENERATOR_NAME stores the automatically created generator for the column. In RDB$GENERATORS,
    the value of RDB$SYSTEM_FLAG of that generator will be 6. RDB$IDENTITY_TYPE will currently
    always store the value 1 (by default) for identity columns and NULL for non-identity columns.
    In the future this column will store the value 0, too (for ALWAYS) when Firebird support this type
    of identity column.

Example:

create table objects (
  id integer generated by default as identity primary key,
  name varchar(15)
);

insert into objects (name) values ('Table');
insert into objects (name) values ('Book');
insert into objects (id, name) values (10, 'Computer');

select * from objects order by id;

commit;

          ID NAME
============ ===============
           1 Table
           2 Book
          10 Computer

alter table objects
  alter id restart with 14;

insert into objects (name) values ('Pencil');

select * from objects order by id;

          ID NAME
============ ===============
           1 Table
           2 Book
          10 Computer
          15 Pencil
