This page describes Calíope 1.5, the version I am building right now. 1.4 is on the App Store for the Mac, iPad, iPhone, Apple Watch, Apple TV and Apple Vision Pro. The changelog says which version each feature landed in.
Adds an “Open in Calíope” button to every topic. It only works with the app installed.
Display the CREATE TABLE, CREATE VIEW, or CREATE PROCEDURE and edit it interactively.
Where it is: Catalogs › right-click › View DDL
Right-click on any object in the catalogs list and select View DDL. The bottom panel shows the full DDL with syntax highlighting and text selection on all three.
Editing the DDL:
Press Open in ItemEditor (button at the top of the DDL panel) to open the editor in a modal sheet with the DDL pre-loaded:
- macOS:SQLTextEditor with syntax highlighting and full text manipulation.
- iPad:TextEditor with monospaced font and touch keyboard.
Modify the DDL as needed and press Apply to send it to the server. The Reset button discards your changes and reverts to the original DDL. If the ALTER or CREATE fails, a red message appears in the bottom bar with the server's error.
Create a table directly from the Catalogs toolbar.
Where it is: Catalogs › New table
In the Catalogs toolbar, use the New table button to open the Table Builder in a new tab. You can also open the context menu on an existing table — right-click on macOS, press and hold on iPad — and choose Design table to edit it.
The builder is divided into four sections accessible from its tab bar:
- Columns — define the name, data type, and constraints for each column. Select a row in the list to edit its properties in the panel below (Identification, Constraints, Default value, Character set).
- Indexes — manage PRIMARY, UNIQUE, INDEX, and FULLTEXT indexes.
- Foreign keys — configure relationships between tables with ON DELETE/ON UPDATE actions.
- Options — adjust the engine (ENGINE), character set, and table comment.
The SQL Preview section at the bottom shows the DDL that will be executed in real time. Click Create table (or Apply changes in edit mode) to send the DDL to the server.
Access the visual editors for each object type from the toolbar.
Where it is: Catalogs › New view / New index / New routine / New trigger / New event
The Catalogs toolbar includes dedicated buttons to create each object type:
- New view — opens the view editor
- New index — opens the index editor
- New routine — opens the function and stored procedure editor
- New trigger — opens the trigger editor
MySQLMariaDBAurora
- New event — in the Events tab, opens the event scheduler editor
SQL ServerPostgreSQL
There is no Events tab and no New event: the server has no event scheduler.
Each editor generates the corresponding DDL (CREATE VIEW, CREATE INDEX, CREATE PROCEDURE, etc.) in the dialect of the server you are connected to, and executes it on the server upon confirmation. Each one only offers what that server can write: the next topics say what changes from one engine to another.
Modify existing objects with the visual editor or directly in the SQL editor.
Where it is: Catalogs › right-click › Edit (visual form) / Open in ItemEditor
Open the context menu on a view, routine, trigger, or event in its corresponding Catalogs tab — right-click on macOS, press and hold on iPad. Besides View DDL, it offers two ways to edit:
- Edit (visual form) — opens the graphical editor with pre-filled fields
- Open in ItemEditor — opens the full DDL of the object in the SQL editor for manual modification
Changes made in the visual form generate an ALTER or DROP + CREATE depending on the object type.
Where it is: Catalogs › right-click › Populate with dummy data
Open the context menu on a table in the Tables tab of Catalogs — right-click on macOS, press and hold on iPad — and select Populate with dummy data. Calíope will generate sample INSERT statements adapted to the table's column types.
Keywords: dummy data, seed, test data, populate, fake data
Create or modify a view; the options it offers depend on the engine.
Where it is: Catalogs › New view / Edit view
The View Editor opens when you press New view, or from the context menu of an existing view — right-click on macOS, press and hold on iPad — with Edit (visual form). It automatically generates the CREATE VIEW DDL.
Available fields:
- Name — name of the view in the selected database.
- The replace toggle — when enabled, the generated DDL replaces the view if it already exists, without dropping it first. The toggle is named after the clause it writes:
MySQLMariaDBAuroraPostgreSQL
OR REPLACE — CREATE OR REPLACE VIEW.
SQL Server
OR ALTER — CREATE OR ALTER VIEW.
MySQLMariaDBAurora
- Algorithm — controls how the server processes the view:
- UNDEFINED (default) — the server chooses the optimal algorithm.
- MERGE — merges the view query with the outer query. More efficient.
- TEMPTABLE — materializes the view into a temporary table before applying external filters.
- SQL Security — defines the privileges under which the view executes:
- DEFINER (default) — executes with the privileges of the user who created it.
- INVOKER — executes with the privileges of the user querying it.
- CHECK OPTION — validates that rows modified through the view remain visible in it:
- LOCAL — only checks the condition of this view.
- CASCADED — also checks conditions of underlying views.
- SQL SELECT — the text editor with the SELECT query that defines the view's content.
Press Apply to execute the DDL on the server.
SQL ServerPostgreSQL
There is no Algorithm or SQL Security: the sheet doesn't show them.
SQL Server
WITH CHECK OPTION has a single form, the one CASCADED describes: choosing LOCAL writes that one, and the sheet says so.
Create or modify stored procedures and functions with a visual interface.
Where it is: Catalogs › New routine / Edit routine
The Routine Editor opens when you press New routine or edit an existing routine from the Routines tab of Catalogs. It generates the DDL that creates the procedure or function, or replaces the one with that name:
MySQLMariaDBAurora
Two statements, run one after the other: DROP PROCEDURE IF EXISTS and CREATE PROCEDURE (or DROP FUNCTION IF EXISTS and CREATE FUNCTION). MySQL has no CREATE OR REPLACE for routines, so the existing routine is dropped first: if the creation fails, it is no longer there.
PostgreSQL
CREATE OR REPLACE PROCEDURE or CREATE OR REPLACE FUNCTION.
SQL Server
CREATE OR ALTER PROCEDURE or CREATE OR ALTER FUNCTION.
Available fields:
- Name — name of the procedure or function.
- Type — select between PROCEDURE (procedure) or FUNCTION (function).
- Parameters — add parameters with the + button. Each parameter has:
- Mode: IN (input), OUT (output), INOUT (input and output). Only available for procedures.
- Name of the parameter.
- Data type (e.g. INT, VARCHAR(100), DATETIME).
- Return type (functions only) — the data type returned by the function (e.g. INT, VARCHAR(255)).
- Body — text editor with the code of the routine. It starts as an empty BEGIN … END block to write inside.
The Options section only shows what the server can write:
MySQLMariaDBAurora
- Deterministic — writes DETERMINISTIC if the routine always returns the same result for the same input parameters. Important for replication.
- Data access — declares the routine's behavior regarding the database:
- CONTAINS SQL — may contain SQL but does not read or write data.
- NO SQL — contains no SQL statements.
- READS SQL DATA — reads data but does not modify it.
- MODIFIES SQL DATA — may insert, update, or delete data.
PostgreSQL
Only Deterministic, and only for functions: it writes IMMUTABLE —the function always returns the same result for the same arguments and doesn't read the database—. A procedure has no such option, and there is no Data access: PostgreSQL has no such clause. The body is written in PL/pgSQL (LANGUAGE plpgsql).
SQL Server
There is no Options section: SQL Server works out by itself whether a function is deterministic, and has no data access clause. A parameter that is not IN is written @name type OUTPUT, and the @ is added if you leave it out.
Press Apply to execute the DDL on the server.
Keywords: routine, procedure, function, PROCEDURE, FUNCTION, parameters, IN, OUT, INOUT, deterministic, CONTAINS SQL, CREATE PROCEDURE, CREATE FUNCTION
Where it is: Catalogs › New trigger / Edit trigger
The Trigger Editor opens when you press New trigger in the Catalogs toolbar, or from the context menu of an existing trigger — right-click on macOS, press and hold on iPad — with Edit (visual form). The schema tree does not open it: its context menu only offers SELECT * FROM, Import data… and Build WHERE….
Available fields:
- Name — name of the trigger.
- Timing — when the trigger fires relative to the operation:
MySQLMariaDBAuroraPostgreSQL
- BEFORE — executes before the operation. Allows modifying NEW values before they are written.
- AFTER — executes after the operation.
SQL Server
- AFTER — executes after the operation.
- INSTEAD OF — replaces the operation with the trigger's code.
There is no BEFORE.
- Event — the operation that fires the trigger:
- INSERT — when a row is inserted.
- UPDATE — when a row is updated.
- DELETE — when a row is deleted.
- Body — text editor with the trigger code. The starter body says, in comments, where the new and previous rows are.
Press Apply to execute the DDL on the server.
MySQLMariaDBAuroraPostgreSQL
The trigger fires once per row: NEW.column is the new value (in INSERT and UPDATE) and OLD.column the previous one (in UPDATE and DELETE).
PostgreSQL
A trigger's code lives in a function: Calíope creates the function <name>_fn with the body and the trigger that calls it, FOR EACH ROW. The body ends with RETURN: in a BEFORE trigger the row it returns is the one written, and NULL skips the row. The starter body returns COALESCE(NEW, OLD), which is right for the three events.
SQL Server
The trigger fires once per statement, not once per row, and the new and previous rows are in the inserted and deleted tables, not in NEW and OLD: the starter body says so.
The Event Editor opens when you press New event in the Catalogs toolbar or edit an existing event. Requires the MySQL Event Scheduler to be enabled (SET GLOBAL event_scheduler = ON).
Available fields:
- Name — name of the event.
- Status — controls whether the event is active:
- ENABLE — the event executes according to its schedule.
- DISABLE — the event is paused.
- SLAVESIDE_DISABLED — disabled on a replication replica.
- Schedule type:
- One-time (AT) — executes at a specific date and time. Use the date/time picker to set the moment.
- Recurring (EVERY) — repeats every N time units. Configure the number and unit (SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUARTER, YEAR).
- Start date (recurring) — when the recurring event begins executing.
- End date (recurring, optional) — enable the toggle to define when it stops executing.
- Body — SQL code executed by the event. Can be a BEGIN … END block with multiple statements.
Create an index on a table with configurable type, method, and columns.
Where it is: Catalogs › New index / Create index
The Index Editor opens from the Indexes tab of Catalogs: with a table selected, the New index button in the toolbar; on an index that already exists, the context menu — right-click on macOS, press and hold on iPad — with Edit (visual form). The schema tree does not open it.
Available fields:
- Name — name of the index on the table.
- Type:
- INDEX — standard index, allows duplicates.
- UNIQUE — unique index, rejects duplicate values in the indexed column or column combination.
MySQLMariaDBAurora
- FULLTEXT — full-text search. Only for CHAR, VARCHAR, or TEXT columns and the MyISAM/InnoDB engine (MySQL 5.6+).
- SPATIAL — geospatial data. Only for spatial-type columns and the MyISAM engine.
MySQLMariaDBAuroraPostgreSQL
- Method (for INDEX and UNIQUE):
- BTREE — B-tree, the most common method. Supports range comparisons, LIKE 'abc%', ORDER BY.
- HASH — hash table, only supports exact equality comparisons.
MySQLMariaDBAurora
HASH is only honoured by the MEMORY engine.
PostgreSQL
A UNIQUE index can't be HASH, so with UNIQUE the method is BTREE. Other methods (gin, gist, brin) are not offered.
SQL Server
There is no Method: CREATE INDEX has no USING clause.
- Columns — add the columns that make up the index with the name field and, optionally, the prefix length (number of characters to index; useful for long TEXT or VARCHAR columns).
SQL ServerPostgreSQL
There is no index prefix: the whole column is indexed, and the generated DDL says so in a comment.
The primary key is managed from the Columns tab of the Table Builder, not from this editor.
Press Apply to execute CREATE INDEX on the server.
Keywords: index, CREATE INDEX, UNIQUE, FULLTEXT, SPATIAL, BTREE, HASH, columns, prefix, ALTER TABLE, index editor