← All examples
example JDBCSQL
options
jdbc_quote_char = ""
always_reload = true
#jdbc_default_string = "jdbc:postgresql://localhost:5432/postgres?user=postgres&password=password"
#docker run --rm --name cql-fun -p 5432:5432 -e POSTGRES_PASSWORD=password -d postgres
#to try postgres, be sure to replace the jdbcURL for the load command directly below
#create some example data in a local temporary sql database. (close delay keeps H2 database alive across connections)
command load = exec_jdbc "jdbc:h2:mem:db1;DB_CLOSE_DELAY=-1" {
"DROP TABLE IF EXISTS Employee CASCADE;
DROP TABLE IF EXISTS Department CASCADE;
DROP TABLE IF EXISTS ExportedEmployee CASCADE;
DROP TABLE IF EXISTS ExportedDepartment CASCADE;
DROP TABLE IF EXISTS ExportedTransEmployee CASCADE;
DROP TABLE IF EXISTS ExportedTransDepartment CASCADE;"
#multiple statements can be used, but many SQL engines (such as H2, CQL's internal engine) will only print the output of the first statement, and some require ?allowMultiQueries=true in the jdbc string
"CREATE TABLE Employee(
id INT PRIMARY KEY,
name VARCHAR(255),
manager INT,
worksIn INT)"
"CREATE TABLE Department(
id INT PRIMARY KEY,
name VARCHAR(255),
secretary INT)"
"INSERT INTO Employee VALUES
(101, 'Alan', 103, 10),
(102, 'Camille', 102, 2),
(103, 'Andrey', 103, 10)"
"INSERT INTO Department VALUES
(10, 'Applied Math', 101),
(2, 'Pure Math', 102)"
"ALTER TABLE Employee ADD CONSTRAINT e1
FOREIGN KEY (manager) REFERENCES Employee (id)"
"ALTER TABLE Employee ADD CONSTRAINT e2
FOREIGN KEY (worksIn) REFERENCES Department (id)"
"ALTER TABLE Department ADD CONSTRAINT d1
FOREIGN KEY (secretary) REFERENCES Employee (id)"
# options always_reload = true #true forces pragmas to not be cached between runs (i.e., always run)
}
# When the JDBC class name and string are left blank, CQL uses the value of the option
# jdbc_default_string. These can be set globally by placing,
# at the beginning of the file, for example:
#
# options
#
# jdbc_default_string = "jdbc:h2:mem:db1;DB_CLOSE_DELAY=-1"
#
#look at the example data
command view0 = exec_jdbc "" { #see note above!!!
"SELECT * FROM Department"
"SELECT * FROM Employee"
}
####################################################
schema S = literal : sql {
entities
Employee
Department
attributes
id : Employee -> Varchar
id : Department -> Varchar
first last manager worksIn : Employee -> Varchar
age : Employee -> Integer
name secretary : Department -> Varchar
}
#import an instance by providing queries for each entity
instance J = import_jdbc "" : sql {
#use name as first name
#use null as last name
#use id as age
Employee -> "SELECT id, manager, worksIn, name AS first, 'lname' as last, id AS age FROM Employee"
Department -> "SELECT id, secretary, name FROM Department"
options
#aql by default prepends the entity to each imported ID, to get uniqueness across entities.
#to import the IDs verbatim, set the option below to false
prepend_entity_on_ids = false
}
#export the instance to SQL
command store1 = export_jdbc_instance J "" "Exported"
{ options start_ids_at = 100 }
#view exported SQL instance
command view1 = exec_jdbc "" {
"SELECT * FROM ExportedEmployee"
"SELECT * FROM ExportedDepartment"
}
##########
#direct method to land sql data
schema S_direct2 = import_jdbc_all "" {
options allow_sql_import_all_unsafe=true
}
schema S_direct = literal : sql {
entities
Employee
Department
attributes
manager name : Employee -> Other
worksIn : Employee -> Other
secretary : Department -> Other
name : Department -> Other
}
instance I = import_jdbc_direct "" "ROW_NUMBER() OVER ()" : S_direct
instance J2 = import_jdbc_direct "" "ROW_NUMBER() OVER ()" : S_direct2
##############################
#
#execute command line actions as follows
#pragma cmdline1 = exec_cmdline {
#"ls -ltr"
#"echo hi"
#}
#
#execute actions as follows
#pragma js1 = exec_js {
#"javax.swing.JOptionPane.showMessageDialog(null, \"hello1\")"
#"javax.swing.JOptionPane.showMessageDialog(null, \"hello2\")"
#}
instance I
Department| ID | SECRETARY | NAME | CQL_ROW_ID |
|---|
| 0 | 102 | Pure Math | 1 |
| 1 | 101 | Applied Math | 2 |
Employee| ID | MANAGER | NAME | WORKSIN | CQL_ROW_ID |
|---|
| 2 | 103 | Alan | 10 | 1 |
| 3 | 102 | Camille | 2 | 2 |
| 4 | 103 | Andrey | 10 | 3 |
instance J
Department| ID | ID | SECRETARY | NAME |
|---|
| 0 | 2 | 102 | Pure Math |
| 1 | 10 | 101 | Applied Math |
Employee| ID | ID | MANAGER | WORKSIN | NAME | LAST |
|---|
| 2 | 101 | 103 | 10 | Alan | lname |
| 3 | 102 | 102 | 2 | Camille | lname |
| 4 | 103 | 103 | 10 | Andrey | lname |
instance J2
INFORMATION_SCHEMA.CONSTANTS| ID | CONSTANT_CATALOG | CONSTANT_SCHEMA | CONSTANT_NAME | VALUE_DEFINITION | DATA_TYPE | CHARACTER_MAXIMUM_LENGTH | CHARACTER_OCTET_LENGTH | CHARACTER_SET_CATALOG | CHARACTER_SET_SCHEMA | CHARACTER_SET_NAME | COLLATION_CATALOG | COLLATION_SCHEMA | COLLATION_NAME | NUMERIC_PRECISION | NUMERIC_PRECISION_RADIX | NUMERIC_SCALE | DATETIME_PRECISION | INTERVAL_TYPE | INTERVAL_PRECISION | MAXIMUM_CARDINALITY | DTD_IDENTIFIER | DECLARED_DATA_TYPE | DECLARED_NUMERIC_PRECISION | DECLARED_NUMERIC_SCALE | GEOMETRY_TYPE | GEOMETRY_SRID | REMARKS | CQL_ROW_ID |
|---|
INFORMATION_SCHEMA.ENUM_VALUES| ID | OBJECT_CATALOG | OBJECT_SCHEMA | OBJECT_NAME | OBJECT_TYPE | ENUM_IDENTIFIER | VALUE_NAME | VALUE_ORDINAL | CQL_ROW_ID |
|---|
INFORMATION_SCHEMA.INDEXES| ID | INDEX_CATALOG | INDEX_SCHEMA | INDEX_NAME | TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | INDEX_TYPE_NAME | NULLS_DISTINCT | IS_GENERATED | REMARKS | INDEX_CLASS | CQL_ROW_ID |
|---|
| 0 | DB1 | PUBLIC | PRIMARY_KEY_7 | DB1 | PUBLIC | EMPLOYEE | PRIMARY KEY | | true | | org.h2.mvstore.db.MVDelegateIndex | 1 |
| 1 | DB1 | PUBLIC | E1_INDEX_7 | DB1 | PUBLIC | EMPLOYEE | INDEX | | true | | org.h2.mvstore.db.MVSecondaryIndex | 2 |
| 2 | DB1 | PUBLIC | E2_INDEX_7 | DB1 | PUBLIC | EMPLOYEE | INDEX | | true | | org.h2.mvstore.db.MVSecondaryIndex | 3 |
| 3 | DB1 | PUBLIC | PRIMARY_KEY_4 | DB1 | PUBLIC | DEPARTMENT | PRIMARY KEY | | true | | org.h2.mvstore.db.MVDelegateIndex | 4 |
| 4 | DB1 | PUBLIC | D1_INDEX_4 | DB1 | PUBLIC | DEPARTMENT | INDEX | | true | | org.h2.mvstore.db.MVSecondaryIndex | 5 |
INFORMATION_SCHEMA.INDEX_COLUMNS| ID | INDEX_CATALOG | INDEX_SCHEMA | INDEX_NAME | TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | COLUMN_NAME | ORDINAL_POSITION | ORDERING_SPECIFICATION | NULL_ORDERING | IS_UNIQUE | CQL_ROW_ID |
|---|
| 5 | DB1 | PUBLIC | PRIMARY_KEY_7 | DB1 | PUBLIC | EMPLOYEE | ID | 1 | ASC | | true | 1 |
| 6 | DB1 | PUBLIC | E1_INDEX_7 | DB1 | PUBLIC | EMPLOYEE | MANAGER | 1 | ASC | FIRST | false | 2 |
| 7 | DB1 | PUBLIC | E2_INDEX_7 | DB1 | PUBLIC | EMPLOYEE | WORKSIN | 1 | ASC | FIRST | false | 3 |
| 8 | DB1 | PUBLIC | PRIMARY_KEY_4 | DB1 | PUBLIC | DEPARTMENT | ID | 1 | ASC | | true | 4 |
| 9 | DB1 | PUBLIC | D1_INDEX_4 | DB1 | PUBLIC | DEPARTMENT | SECRETARY | 1 | ASC | FIRST | false | 5 |
INFORMATION_SCHEMA.INFORMATION_SCHEMA_CATALOG_NAME| ID | CATALOG_NAME | CQL_ROW_ID |
|---|
| 10 | DB1 | 1 |
INFORMATION_SCHEMA.IN_DOUBT| ID | TRANSACTION_NAME | TRANSACTION_STATE | CQL_ROW_ID |
|---|
INFORMATION_SCHEMA.LOCKS| ID | TABLE_SCHEMA | TABLE_NAME | SESSION_ID | LOCK_TYPE | CQL_ROW_ID |
|---|
INFORMATION_SCHEMA.QUERY_STATISTICS| ID | SQL_STATEMENT | EXECUTION_COUNT | MIN_EXECUTION_TIME | MAX_EXECUTION_TIME | CUMULATIVE_EXECUTION_TIME | AVERAGE_EXECUTION_TIME | STD_DEV_EXECUTION_TIME | MIN_ROW_COUNT | MAX_ROW_COUNT | CUMULATIVE_ROW_COUNT | AVERAGE_ROW_COUNT | STD_DEV_ROW_COUNT | CQL_ROW_ID |
|---|
INFORMATION_SCHEMA.RIGHTS| ID | GRANTEE | GRANTEETYPE | GRANTEDROLE | RIGHTS | TABLE_SCHEMA | TABLE_NAME | CQL_ROW_ID |
|---|
INFORMATION_SCHEMA.ROLES| ID | ROLE_NAME | REMARKS | CQL_ROW_ID |
|---|
| 11 | PUBLIC | | 1 |
INFORMATION_SCHEMA.SESSIONS| ID | SESSION_ID | USER_NAME | SERVER | CLIENT_ADDR | CLIENT_INFO | SESSION_START | ISOLATION_LEVEL | EXECUTING_STATEMENT | EXECUTING_STATEMENT_START | CONTAINS_UNCOMMITTED | SESSION_STATE | BLOCKER_ID | SLEEP_SINCE | CQL_ROW_ID |
|---|
| 12 | 10 | | | | | 2026-06-20T17:23:19.129761088Z | READ COMMITTED | SELECT SESSION_ID, USER_NAME, SERVER, CLIENT_ADDR, CLIENT_INFO, SESSION_START, ISOLATION_LEVEL, EXECUTING_STATEMENT, EXECUTING_STATEMENT_START, CONTAINS_UNCOMMITTED, SESSION_STATE, BLOCKER_ID, SLEEP_SINCE, ROW_NUMBER() OVER () AS CQL_ROW_ID FROM INFORMATION_SCHEMA.SESSIONS, (SELECT '0' AS CQL_ZERO) AS CQL_ZERO | 2026-06-20T17:23:19.164510024Z | false | RUNNING | | | 1 |
INFORMATION_SCHEMA.SESSION_STATE| ID | STATE_KEY | STATE_COMMAND | CQL_ROW_ID |
|---|
| 13 | SCHEMA | SET SCHEMA "PUBLIC" | 1 |
INFORMATION_SCHEMA.SETTINGS| ID | SETTING_NAME | SETTING_VALUE | CQL_ROW_ID |
|---|
| 14 | DB_CLOSE_DELAY | -1 | 1 |
| 15 | CREATE_BUILD | 232 | 2 |
| 16 | info.BUILD_ID | 232 | 3 |
| 17 | info.VERSION_MAJOR | 2 | 4 |
| 18 | info.VERSION_MINOR | 3 | 5 |
| 19 | info.VERSION | 2.3.232 (2024-08-11) | 6 |
| 20 | property.java.runtime.version | 21.0.11+10-LTS | 7 |
| 21 | property.java.vm.name | OpenJDK 64-Bit Server VM | 8 |
| 22 | property.java.vendor | Eclipse Adoptium | 9 |
| 23 | property.os.name | Linux | 10 |
| 24 | property.os.arch | amd64 | 11 |
| 25 | property.os.version | 6.17.0-1018-azure | 12 |
| 26 | property.sun.os.patch.level | | 13 |
| 27 | property.file.separator | / | 14 |
| 28 | property.path.separator | : | 15 |
| 29 | property.line.separator |
| 16 |
| 30 | property.user.country | | 17 |
| 31 | property.user.language | en | 18 |
| 32 | property.user.variant | | 19 |
| 33 | property.file.encoding | UTF-8 | 20 |
| 34 | DEFAULT_NULL_ORDERING | LOW | 21 |
| 35 | EXCLUSIVE | FALSE | 22 |
| 36 | MODE | REGULAR | 23 |
| 37 | QUERY_TIMEOUT | 0 | 24 |
| 38 | TIME ZONE | UTC | 25 |
| 39 | TRUNCATE_LARGE_LENGTH | FALSE | 26 |
| 40 | VARIABLE_BINARY | FALSE | 27 |
| 41 | OLD_INFORMATION_SCHEMA | FALSE | 28 |
| 42 | RETENTION_TIME | 0 | 29 |
| 43 | WRITE_DELAY | 0 | 30 |
| 44 | ANALYZE_AUTO | 2000 | 31 |
| 45 | ANALYZE_SAMPLE | 10000 | 32 |
| 46 | AUTO_COMPACT_FILL_RATE | 90 | 33 |
| 47 | CASE_INSENSITIVE_IDENTIFIERS | false | 34 |
| 48 | COMPRESS | false | 35 |
| 49 | DATABASE_TO_LOWER | false | 36 |
| 50 | DATABASE_TO_UPPER | true | 37 |
| 51 | DEFAULT_CONNECTION | false | 38 |
| 52 | DEFAULT_ESCAPE | \ | 39 |
| 53 | DEFAULT_TABLE_ENGINE | | 40 |
| 54 | DEFRAG_ALWAYS | false | 41 |
| 55 | DROP_RESTRICT | true | 42 |
| 56 | ESTIMATED_FUNCTION_TABLE_ROWS | 1000 | 43 |
| 57 | IGNORE_CATALOGS | false | 44 |
| 58 | LOB_TIMEOUT | 300000 | 45 |
| 59 | MAX_COMPACT_TIME | 200 | 46 |
| 60 | MAX_QUERY_TIMEOUT | 0 | 47 |
| 61 | MV_STORE | true | 48 |
| 62 | OPTIMIZE_DISTINCT | true | 49 |
| 63 | OPTIMIZE_EVALUATABLE_SUBQUERIES | true | 50 |
| 64 | OPTIMIZE_INSERT_FROM_SELECT | true | 51 |
| 65 | OPTIMIZE_IN_LIST | true | 52 |
| 66 | OPTIMIZE_IN_SELECT | true | 53 |
| 67 | OPTIMIZE_OR | true | 54 |
| 68 | OPTIMIZE_SIMPLE_SINGLE_ROW_SUBQUERIES | true | 55 |
| 69 | OPTIMIZE_TWO_EQUALS | true | 56 |
| 70 | QUERY_CACHE_SIZE | 8 | 57 |
| 71 | RECOMPILE_ALWAYS | false | 58 |
| 72 | REUSE_SPACE | true | 59 |
| 73 | SHARE_LINKED_CONNECTIONS | true | 60 |
| 74 | ZERO_BASED_ENUMS | false | 61 |
| 75 | info.UPDATE_FAILURE_PERCENT | 0.00% | 62 |
| 76 | info.LEAF_RATIO | 0 | 63 |
INFORMATION_SCHEMA.SYNONYMS| ID | SYNONYM_CATALOG | SYNONYM_SCHEMA | SYNONYM_NAME | SYNONYM_FOR | SYNONYM_FOR_SCHEMA | TYPE_NAME | STATUS | REMARKS | CQL_ROW_ID |
|---|
INFORMATION_SCHEMA.USERS| ID | USER_NAME | IS_ADMIN | REMARKS | CQL_ROW_ID |
|---|
| 77 | | true | | 1 |
PUBLIC.DEPARTMENT| ID | ID | NAME | SECRETARY | CQL_ROW_ID |
|---|
| 78 | 2 | Pure Math | 102 | 1 |
| 79 | 10 | Applied Math | 101 | 2 |
PUBLIC.EMPLOYEE| ID | ID | NAME | MANAGER | WORKSIN | CQL_ROW_ID |
|---|
| 80 | 101 | Alan | 103 | 10 | 1 |
| 81 | 102 | Camille | 102 | 2 | 2 |
| 82 | 103 | Andrey | 103 | 10 | 3 |
PUBLIC.EXPORTEDDEPARTMENT| ID | ID | NAME | SECRETARY | CQL_ROW_ID |
|---|
| 83 | 10 | Applied Math | 101 | 1 |
| 84 | 2 | Pure Math | 102 | 2 |
PUBLIC.EXPORTEDEMPLOYEE| ID | ID | LAST | MANAGER | NAME | WORKSIN | CQL_ROW_ID |
|---|
| 85 | 103 | lname | 103 | Andrey | 10 | 1 |
| 86 | 102 | lname | 102 | Camille | 2 | 2 |
| 87 | 101 | lname | 103 | Alan | 10 | 3 |
command load
START
DROP TABLE IF EXISTS Employee CASCADE;
DROP TABLE IF EXISTS Department CASCADE;
DROP TABLE IF EXISTS ExportedEmployee CASCADE;
DROP TABLE IF EXISTS ExportedDepartment CASCADE;
DROP TABLE IF EXISTS ExportedTransEmployee CASCADE;
DROP TABLE IF EXISTS ExportedTransDepartment CASCADE;
Updated 0 rows.
END
START
CREATE TABLE Employee(
id INT PRIMARY KEY,
name VARCHAR(255),
manager INT,
worksIn INT)
Updated 0 rows.
END
START
CREATE TABLE Department(
id INT PRIMARY KEY,
name VARCHAR(255),
secretary INT)
Updated 0 rows.
END
START
INSERT INTO Employee VALUES
(101, 'Alan', 103, 10),
(102, 'Camille', 102, 2),
(103, 'Andrey', 103, 10)
Updated 3 rows.
END
START
INSERT INTO Department VALUES
(10, 'Applied Math', 101),
(2, 'Pure Math', 102)
Updated 2 rows.
END
START
ALTER TABLE Employee ADD CONSTRAINT e1
FOREIGN KEY (manager) REFERENCES Employee (id)
Updated 0 rows.
END
START
ALTER TABLE Employee ADD CONSTRAINT e2
FOREIGN KEY (worksIn) REFERENCES Department (id)
Updated 0 rows.
END
START
ALTER TABLE Department ADD CONSTRAINT d1
FOREIGN KEY (secretary) REFERENCES Employee (id)
Updated 0 rows.
END
command store1
Exported 5 rows.
command view0
START
SELECT * FROM Department
ID 2, NAME Pure Math, SECRETARY 102
ID 10, NAME Applied Math, SECRETARY 101
END
START
SELECT * FROM Employee
ID 101, NAME Alan, MANAGER 103, WORKSIN 10
ID 102, NAME Camille, MANAGER 102, WORKSIN 2
ID 103, NAME Andrey, MANAGER 103, WORKSIN 10
END
command view1
START
SELECT * FROM ExportedEmployee
ID 103, LAST lname, MANAGER 103, NAME Andrey, WORKSIN 10
ID 102, LAST lname, MANAGER 102, NAME Camille, WORKSIN 2
ID 101, LAST lname, MANAGER 103, NAME Alan, WORKSIN 10
END
START
SELECT * FROM ExportedDepartment
ID 10, NAME Applied Math, SECRETARY 101
ID 2, NAME Pure Math, SECRETARY 102
END