Transport
The SQL API supports the following transports:| Transport | Description | When to use |
|---|---|---|
| Postgres | Same protocol that is used by the psql utility and other Postgres clients | Use by default |
| HTTP | JSON-based protocol that is also used by the REST API | Use when you need to run a SQL API query from an embedded analytics application and REST API is not an option |
Postgres protocol
You can use thepsql utility to connect to the SQL API:
information_schema or using backslash
commands:
HTTP protocol
You can use thecurl utility to run a SQL API query over the HTTP protocol:
/v1/cubesql endpoint reference for more details.
Fundamentals
In the SQL API, each cube or view from the data model is represented as a table. Measures, dimensions, and segments are represented as columns in these tables. SQL API can execute regular queries, queries with post-processing, and queries with pushdown that can reference these tables and columns. Under the hood, the SQL API uses Apache DataFusion as its query engine. It’s responsible for query planning and execution. As part of query planning, the SQL API also uses egg (an e-graph term rewriting library) to analyze incoming SQL queries and find the best query plan out of a wide variety of possible plans to execute.| Query type | In-memory cache | Pre-aggregations | SQL support |
|---|---|---|---|
| Regular queries | ✅ Used | ✅ Used | 🟡 Very limited |
| Queries with post-processing | ✅ Used | ✅ Used | 🟡 Limited |
| Queries with pushdown | ✅ Used | ❌ Not used | ✅ Extensive |
Read more about Query pushdown in the SQL API in the blog.
Configuration
Cube Core
SQL API is disabled by default. To enable the SQL API, setCUBEJS_PG_SQL_PORT
to a port number you’d like to connect to with a Postgres-compatible tool.
| Credential | Environment variable, etc. |
|---|---|
| Host | Host you’re running Cube at |
| Port | Set via CUBEJS_PG_SQL_PORT |
| User name | Set via CUBEJS_SQL_USER |
| Password | Set via CUBEJS_SQL_PASSWORD |
| Database | Any valid string, e.g., cube |
checkSqlAuth,
canSwitchSqlUser, and CUBEJS_SQL_SUPER_USER
to configure custom authentication.
Example
The following Docker Compose file will run Cube with the SQL API enabled on port 15432, accessible usinguser as the user name, password as the password,
and any string as the database name:
docker compose up, you can finally connect and execute
an example request.
Cube Cloud
SQL API is enabled by default. To find your SQL API endpoint and credentials in Cube Cloud, go to the Overview page, click API credentials, and choose the SQL API tab. By default, the SQL API is enabled on port 5432, the user name iscube, and
a random string is generated for the password. You can customize these with
CUBEJS_PG_SQL_PORT, CUBEJS_SQL_USER, and CUBEJS_SQL_PASSWORD environment
variables by navigating to Settings → Configration.
Query planning
The SQL API executes queries as regular queries, queries with post-processing, or queries with pushdown.Streaming
By default, query results are loaded in a single batch. However, a more effective streaming mode can be used for large result sets. To enable it, set theCUBESQL_STREAM_MODE environment variable to true.
When the streaming mode is enabled, the maximum row limit
does not apply to SQL API queries. They can return an unlimited number of rows.
Session limit
Each concurrent connection to the SQL API consumes some resources and attempting to establish too many connections at once can lead to an out-of-memory crash. You can use theCUBEJS_MAX_SESSIONS environment variable to adjust the session
limit.
Cache control
You can use thecube_cache session variable with the SET command
to control in-memory cache behavior.
It works the same way as cache control in the REST API.
Example:
Troubleshooting
Can't find rewrite
Query planning is a resource-intensive task, and sometimes you can get the following
error: Error during rewrite: Can't find rewrite due to 10002 AST node limit reached.
Use the following environment variables to allocate more resources for query planning:
CUBESQL_REWRITE_MAX_NODES, CUBESQL_REWRITE_MAX_ITERATIONS, CUBESQL_REWRITE_TIMEOUT.