| 3 | - There are five forms of CREATE TYPE, as shown in the syntax synopsis above. |
| 4 | - They respectively create a composite type, an enum type, a range type, a base type, or a **shell type**. |
| 5 | - The first four of these are discussed in turn below. |
| 6 | - A **shell type** is simply a placeholder for a type to be defined later; it is created by issuing CREATE TYPE with no parameters except for the type name. |
| 7 | - **Shell types** are needed as forward references when creating range types and base types, as discussed in those sections. |
4 | | There are five forms of CREATE TYPE, as shown in the syntax synopsis above. They respectively create a composite type, an enum type, a range type, a base type, or a **shell type**. The first four of these are discussed in turn below. A **shell type** is simply a placeholder for a type to be defined later; it is created by issuing CREATE TYPE with no parameters except for the type name. **Shell types** are needed as forward references when creating range types and base types, as discussed in those sections. |
| 9 | NOTE: https://stackoverflow.com/questions/45055852/postgres-type-field-type-is-only-a-shell |
| 10 | - In short: Some types require functions that in turn require that type with is to be declared, so neither can be created - normally. |
| 11 | - In order to workaround that problem, Postgres will create shell types that are pretty much placeholder just to satisfy validation. |
| 12 | |