Skip to Content
We are live but in Staging 🎉
Data EnginesSQLCLI Guidedodil data table

dodil data table — lifecycle

Manage tables. Create, inspect and drop them, browse the template catalog, and bind a table to a pipeline. Mirrors Tables — API Reference.

Persistent flag on the whole group: --bucket / -b.

These are SQL verbs, not a separate API. list, get and describe build one SQL statement and send it through dodil.tables.v1.Tables/Execute on the tables-gateway (cli-shell/cli-k3/cmd/table_helpers.go:39). There is no ListTables, GetTable, DescribeTable or ListPartitions RPC — those never shipped. Anything the typed subcommands don’t cover, you write as SQL and send with dodil data sql.

dodil data table create

dodil data table create [name] -b BUCKET [flags]
FlagShortTypeDefaultDescription
--description-dstringTable description
--columns-jsonstringJSON array of column descriptors
--partition-columnstring list (repeat)[]Partition columns. Repeat for multi-column partitioning.
--merge-keystring list (repeat)[]Primary-key columns. Repeat for a composite PK. Drives keyed write routing.
CREATE TABLE events ( id BIGINT NOT NULL, user_id VARCHAR NOT NULL, occurred_at TIMESTAMP NOT NULL, event_type VARCHAR NOT NULL, payload JSON, PRIMARY KEY (id, user_id) ) PARTITIONED BY (event_type);

Column type is a SQL type string, not an enum — there is no COLUMN_TYPE_* vocabulary. The CLI normalizes a few aliases (int/integer/long/int64BIGINT, string/textVARCHAR, float/realDOUBLE, boolBOOLEAN, bytesBLOB) and passes anything else through uppercased, so VECTOR(768) and DECIMAL(18,2) work. Full list: SQL Compatibility → Column types.

--merge-key populates TableSpec.pk_columns. Omit it and the table has no primary key — which means no WAL, and writes that append straight to Delta.

There is no --source or --pipeline-template-id flag. Pipeline-bound tables are a different command — see table pipeline create below.

dodil data table list

dodil data table list -b BUCKET

Runs SHOW TABLES. Returns the table names and each one’s primary-key columns:

table pk_columns audit_tags id clients id contacts id products id (4 rows)
dodil data table list -b kb-prod -o json | jq '.rows[] | .table'

dodil data table describe (and get)

dodil data table describe [name] -b BUCKET dodil data table get [name] -b BUCKET # alias — identical code path

Runs DESCRIBE "<name>". get is an alias of describe, not a lighter-weight metadata read — both execute the same statement and print the same thing.

column type nullable pk default id long false true name string true false industry string true false created_day long true false

Note the type column reports the stored vocabulary type (long, string, timestamp, json, …), not the SQL spelling you declared. A column created as INTEGER describes as long — the integer family is 64-bit throughout.

dodil data table describe events -b kb-prod -o json | jq '.rows[] | select(.pk)'

For storage, WAL backlog, residency and reject counters — the numbers the old describe page promised — use GetDatabaseStats. See Schema → Database stats.

dodil data table delete

dodil data table delete [name] -b BUCKET

Runs DROP TABLE. Permanently removes the table — Delta directory and catalog row. Does not cascade to a pipeline-bound table’s pipeline or its ingest rule; clean those up separately via the Pipelines API.

dodil data table templates

dodil data table templates [--search TEXT] [--label KEY=VALUE]

Browse the warehouse-compatible subset of the Scriptum template catalog — the templates you can pass to dodil data table pipeline create -t <id>. Server-side filtered to the table facet.

FlagTypeDescription
--searchstringFree-text match against name + description
--labelstring list (repeat)Filter by label key=value. Repeat for multiple — all must match (AND).

There is no --category flag on this subcommand; category filtering lives on the org-wide dodil data template list. The catalog is org-scoped — -b is inherited from the parent group and ignored here, so you can omit it.

# All warehouse-compatible templates dodil data table templates # Free-text search dodil data table templates --search invoice # Label filter dodil data table templates --label modality=pdf

The catalog with one-line descriptions lives at API Reference → Templates.

dodil data template list vs dodil data table templates — the top-level template list returns all templates across pillars and accepts --category; this Tables variant pre-filters to warehouse-compatible only and does not. Both are org-scoped.

dodil data table pipeline

dodil data table pipeline create [name] -b BUCKET -t TEMPLATE_ID [--folder-prefix PREFIX] dodil data table pipeline list -b BUCKET

Creates a pipeline-bound table: a Scriptum template owns the schema, and rows materialize as matching documents land in the bucket.

FlagShortDescription
--template-tTable pipeline template id (required) — see table templates
--description-dDescription
--folder-prefixOnly files under this prefix trigger the pipeline (default: all)
dodil data table pipeline create entities -b kb-prod \ --description "Auto-extracted entities + PII" \ -t entity_pii_extraction \ --folder-prefix intake/

This does not start ingesting. Creating the pipeline binds the template to a table; it does not create an ingest rule. Scope one at the pipeline as a separate, mandatory step — see Templates → Using a template. dodil data recipe install is the exception: it creates the collection and binds the rule.

dodil data table view-url

dodil data table view-url [name] -b BUCKET [--sql SQL] [--console-base ORIGIN]

Prints a console deep-link that opens the table’s spreadsheet editor. --sql pre-fills a statement — and auto-runs it if it’s read-shaped.

dodil data table view-url events -b kb-prod \ --sql "SELECT * FROM events WHERE event_type = 'purchase' LIMIT 100"

Large results spool

Any of these commands can return a spooled result instead of inline rows: above a size threshold the plane writes the result parts to object storage and returns a manifest of presigned GETs. The CLI prints

(result spooled to object storage: N rows across M part(s); re-run with a LIMIT or fetch the presigned parts)

rather than a table. Add a LIMIT, or pull the parts yourself. See Execute → Spooled results.

Operations with no typed subcommand

Each of these is a SQL statement — send it with dodil data sql -b BUCKET "<sql>".

OperationStatement
Add / drop / widen a columnALTER TABLE t ADD COLUMN … · DROP COLUMN … · ALTER COLUMN … SET DATA TYPE …
Clear a tableTRUNCATE TABLE t
Create a table from a queryCREATE TABLE t2 AS SELECT … (CTAS)
Replace a table atomicallyCREATE OR REPLACE TABLE t AS SELECT …
Secondary indexCREATE INDEX …
Time travelSELECT … VERSION AS OF n
RestoreRESTORE TABLE t TO VERSION AS OF ndestroys the tail, see Maintenance → RESTORE

There is no Materialize RPC — persisting a SELECT is CTAS, CREATE OR REPLACE, or INSERT … SELECT.


See also