Skip to content
PtahDocs
v0.25.0

Graphic preview

100%
Page type: reference

What the DuckDB provider refuses

The objects a DuckDB read refuses, the declarations and table changes the provider refuses before a statement is sent, and what it does not support yet.

Before you plan a DuckDB change, check here whether the provider refuses the object or the change, and whether it describes the object yet. A refusal names the object and the reason, and comes before any statement is sent. Ptah plans to create what a read leaves out, so an object the provider cannot describe is refused rather than skipped.

A read fails with a reason, rather than leave out an object it does not describe:

Object in the database Reason
A macro, scalar or table The provider does not model macros yet.
A type made with CREATE TYPE The provider does not model named types yet. A column of such a type holds the type the name stands for and reads as that type.
A UNIQUE constraint over more than one column, for a Ptah that does not read schema.observed-unique-constraints Such a Ptah has no field for it.
Two constraints of one table under one name, such as two CHECKs on the same column DuckDB keeps no constraint names, so a read cannot tell them apart.
A view that names its columns, and a comment on a view’s column The provider does not describe them yet.
An index with a method other than DuckDB’s ART index The provider creates and reads ART indexes only.
A column with a compression The observed column has no field for it.
A schema other than main, for a Ptah that does not read schema.common-namespaces Such a Ptah could not tell it from a schema the database does not have. Select main to read it alone.
Declaration Where it is described
An auto-increment or identity column; declare a sequence and DEFAULT nextval('...') Defaults and generated columns
A STORED generated column Defaults and generated columns
A UNIQUE over an expression, one over several columns for a Ptah that does not read UNIQUE constraints, and a constraint that is not enforced Keys and constraints
A foreign key rule other than NO ACTION or RESTRICT, a deferrable key, MATCH, a key into another schema Keys and constraints
A partial index, another method, an operator class, INCLUDE, storage parameters, a key order or NULLS placement, NULLS NOT DISTINCT, an invisible index Indexes
A materialized view, WITH CHECK OPTION, a sequence with a cache, an owner or another type, a comment on a schema, a role, a grant Views, sequences, schemas and comments
A table collation, a storage engine, a trigger, custom table SQL DuckDB has none of them.

DuckDB refuses many changes of a table that exists. The provider refuses each one by name before a statement is sent, and never plans it as a removal and a new creation, which would lose the table’s rows. Measured on the embedded DuckDB:

Change Refused when
A column’s type, nullability or UNIQUE, a dropped column, an added NOT NULL or UNIQUE column The table keeps an index, or a foreign key of another table references it. A plan may drop the index in the same change, except as in the next row. A default and a plain added column change either way.
A column’s type or a dropped column, in the change that drops an index The index covers the column, or the dropped column comes before a column it covers: DuckDB keeps a dropped index until the transaction commits. Drop the index in a change of its own first.
A column’s type The column is in the primary key, a UNIQUE, a CHECK or a foreign key.
A dropped column The column is in the primary key, a UNIQUE or a foreign key, or a key or UNIQUE column comes after it.
A CHECK or foreign key added or dropped, a UNIQUE dropped, the primary key changed or dropped Always: DuckDB has no statement for it.
A generated column added, a generated expression changed, a collation changed Always.
A dropped table A table the plan keeps references it.
A structural change of a table, with a dropped table and a created table that both reference it, in one plan Always: Ptah creates every table before it drops any. Make the change and the new table in two plans.
Two created tables that reference each other Always: DuckDB creates a foreign key only to a table that exists.
A changed sequence Always: DuckDB alters no sequence, and replacing one would restart its counter.

An index declared under another name is dropped and created under the new one: DuckDB renames no index, and the provider does not ask Ptah for rename steps. The index holds no rows, so nothing is lost.

A migration body that controls a transaction or changes a setting is refused before anything runs, and a replay into a dev database refuses a statement that reaches beyond it or into the session; Migrations on DuckDB lists both. A dev database the operator names must be empty, and a docker://duckdb dev database of a version other than the linked 2.0 is refused.

  • Declared rows and seed files (ptah seed, ptah migrations data): the provider serves no row services.
  • Provider lint rules: ptah migrations lint runs Ptah’s rules only.
  • An opt-in to external access or to an extension DuckDB does not link.
  • Network, MotherDuck, DuckLake and Quack: the provider serves the embedded file and in-memory modes only.
  • duckdb://:memory:<name> as a --db-url or --dev-url: Ptah parses the address as a URL first and refuses it. duckdb://:memory: works.