Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions content/references/datatypes/_index.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ The complete list of supported data types in CedarDB is as follows:
* [`date`](date)
* [`decimal`](numeric)
* [`double precision`](float)
* [`enum`](enums)
* [`float`](float)
* [`integer`](integer)
* [`json`](json)
Expand Down
96 changes: 96 additions & 0 deletions content/references/datatypes/enums.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
# Enum Types

Just like in many programming languages, an enum types consist of a static, ordered set of labels defined by the user.
They combine the clarity of text with the compactness of numerics, when the inherent meaning of a value is more than should be encoded by a single number, but the number of possible values is relatively small.

## Creation of Enum types

Enum types can be created via the Create Type command.

```sql
create type enum_name as enum (['label' [,...]]);
```

An example usage could look like this:

```sql
create type importance as enum ('minor', 'major', 'critical');
```

## Usage of Enum types

Enums can be used just like any other type inside of tables, views, queries, etc. .

```sql
create table tasks (id int, priority importance);
insert into tasks values (1, 'major'), (2, 'minor'), (3, 'critical'), (4, 'major');
```

The enum labels are case sensitive, whereas the enum names are not.

This does not work:
```sql
select 'mInOr'::importance;
```
```
ERROR: invalid input value for enum importance: "mInOr"
```

This works:
```sql
select 'minor'::iMpOrTaNcE;
```
```
enum importance
---------------
minor
```

## Comparison of Enum types

Values of the same enum type are comparable. Their ordering corresponds the order in which they were listed at creation time. Values of different enum types are incomparable. Similarly, an enum cannot be compared with a builtin type.


In this example ID2 gets filtered out as its corresponding priority is too low in the enum ordering.
```sql
select id, priority from tasks where priority >= 'major';
```

```
id | priority
-------------
1 | major
3 | critical
4 | major
```

```sql
select id from tasks where priority > 1;
```
```
ERROR: cannot compare enum importance and integer
```
## Deletion of Enum types

Enum types can be removed via the Drop Type command.

```sql
drop type [if exists] name;
```
The deletion of an enum type is not possible, when any other object still depends on it. Trying to do so regardless results in an error.

## Alter Enum types

### Add new label
A new label can be added to an existing enum via
```sql
alter type enum_name add value [if not exists] added_enum_label;
```
The newly inserted label is the new maximum in this enum type. Inserting a new label at another location is currently not supported.
If the label is already present, the insertion fails with an error. Specifying "if not exists" suppresses this error.

### Change ownership
The owner of an enum can be changed via
```sql
alter type enum_name owner to new_owner;
```
Comment on lines +92 to +96
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am unsure if we should maybe add some info about necessary permissions. Or should we only add this once the permissions are done? @ChrisWint

Copy link
Contributor Author

@penguincarol penguincarol Jan 13, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In a previous draft of this page I explained the permissions as such:

This change can only be performed by the current owner or a superuser. The user requires permissions to SET ROLE to the new owner aswell as USAGE on the schema of the enum.
The new owner requires CREATE on the previously mentioned schema.

However, I removed this before opening the PR as I do not describe the required permissions for the other statements either.

2 changes: 1 addition & 1 deletion content/references/sqlreference/expressions/_index.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ CedarDB supports many expressions that manipulate data:
* At time zone
* Between, between symmetric
* Bit and (`&`) on [bitsrings](/docs/references/sqlreference/functions/bitstring#bit--bit)
* Bit or (`|`) on [bitstrings]](/docs/references/sqlreference/functions/bitstring#bit--bit-1)
* Bit or (`|`) on [bitstrings](/docs/references/sqlreference/functions/bitstring#bit--bit-1)
* Bit xor (`#`) on [bitstrings](/docs/references/sqlreference/functions/bitstring#bit--bit-2)
* Case-insensitive like (`ilike`, `~~*`), negated (`not ilike`, `!~~*`)
* Case-insensitive regular expression (`~*`), negated (`!~*`)
Expand Down
9 changes: 9 additions & 0 deletions content/references/sqlreference/statements/_index.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@ The complete list of supported SQL statements in CedarDB is as follows:
Alter table
: modify a table definition

[Alter type](/docs/references/datatypes/enums/#alter-enum-types)
: modify a user-defined type

[Alter table rename column](altertable)
: rename a column of a given table

Expand Down Expand Up @@ -66,6 +69,9 @@ Create sequence
[Create table as](createtableas)
: create and populate a new table with contents from a query

[Create type](/docs/references/datatypes/enums/#creation-of-enum-types)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The create type statement is not only used for enums but we can also change this once we have implemented more of it.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, I was thinking the same thing. Currently it makes sense, to simply refer to the enum page for this, but as more types become available, this would be highly confusing. I guess that's also why the postgres docu has its own entry for all the statements (for example create type), while the entry for Enums does not really touch on all of the statements acting on enums.
So at some point, we may have to push around the content a bit.

: define a new datatype

[Create user](createrole)
: create a new database role

Expand All @@ -84,6 +90,9 @@ Create sequence
Drop
: remove schema definitions

[Drop Type](/docs/references/datatypes/enums/#deletion-of-enum-types)
: remove a user-defined type

[End](/docs/references/sqlreference/transaction)
: commit the transaction

Expand Down