Cube Core v0.30 release brings major new features, such as:

  • Support for using dbt metrics with Cube. Check out this blog post to learn more.
  • Support for Databricks, including the export bucket feature for enhanced pre-aggregation support.
  • Support for Materialize databases.
  • Support for QuestDB databases. To learn more about how to get started with QuestDB and Cube, check out our recent blog post on the topic.

Cube Store has also seen a massive number of improvements in both its stability and performance, and the Cube SQL API has been vastly improved since its' launch in v0.29. We've improved the existing support for Apache Superset and added support for Jupyter, Streamlit and Hex notebooks. We've also done a lot of work in preparation for extending support to other visualization tools, so stay tuned.

The Developer Playground has also seen a number of quality-of-life improvements, and we hope you’ll find them useful.

Breaking changes and deprecations

This release we have two breaking changes that should only affect older users. We’re deprecating the CUBEJS_EXTERNAL_DEFAULT and CUBEJS_SCHEDULED_REFRESH_DEFAULT environment variables. These were introduced to smooth the migration to Cube Store; we doubt most users will be affected but please ensure nothing depends on the above.

Cube Store

  • Added: Support Docker images for ARM64 platform (#3841)
  • Added: Split batching upload of pre-aggregations into multiple files to enhance performance and avoid load balancer
  • Added: Support quarter granularity in date_trunc (#4011)
  • Added: Decimal partition pruning (#4089)
  • Added: Unwinds select worker panics to provide descriptive error messages (#4097)
  • Added: Introduce CUBESTORE_EVENT_LOOP_WORKER_THREADS to allow setting Tokio worker threads and processes explicitly
  • Added: Repartition single chunks instead of partition as a whole to speed up ingestion of big tables (#4125)
  • Added: Add CUBEJS_GH_API_TOKEN environment variable to download script (#4282)
  • Added: Add EXPLAIN implementation (#4303)
  • Added: IN operator support for decimal type (#4306)
  • Added: Support space-separated binary strings for HyperLogLog fields in CSV, resolves issue with countDistinctApprox in AWS Athena (#4383)
  • Fixed: Reduce excessive startup memory usage
  • Fixed: Re-parent chunks on compaction instead of repartitioning
  • Fixed: Silence errors for not uploaded chunks scheduled for removal
  • Fixed: Respect pending chunks for compaction
  • Fixed: Do not fail scheduler loop on lagged broadcast receive
  • Fixed: Provide better messages for CSV parsing error
  • Fixed: Decimals without integral parts are now respecting sign
  • Fixed: Schema type mismatch when in memory chunks are queried (#4024)
  • Fixed: Ensure file size matches during downloads to localize any remote filesystem consistency issues (#4054)
  • Fixed: Deactivate tables on data corruption to allow refresh worker to reconcile failing partitions (#4092)
  • Fixed: Add list file size validation after file upload to check upload consistency (#4093)
  • Fixed: Postpone deletion of partitions and chunks after metastore log commits to avoid missing files on sudden metastore loss (#4094)
  • Fixed: Do not spawn select workers for router nodes
  • Fixed: Jobs are fetched only once every 5 seconds if there's a queue
  • Fixed: Do not warmup chunks on table creation to avoid stuck on warmup of unpartitioned chunks situation
  • Fixed: Leading decimal zeros are truncated during formatting
  • Fixed: Empty tables in Cube Store if index is being used (#4170)
  • Fixed: Add compaction and chunk writing guards to cleanup uploads folder on any failures to minimize storage bloating
  • Fixed: Filters are now included in index choosing
  • Fixed: Empty CUBESTORE_S3_SUB_PATH leads to can't list file error (#4324)
  • Fixed: Inactive partition compaction: replace error with warn (#4337)

Cube SQL

  • Added: Support for SUBSTRING()
  • Added: Support UCASE()
  • Added: Support LOCATE()
  • Added: Support DATE() , DATE_ADD() , NOW() functions & INTERVAL s
  • Added: Introduce information_schema for MySQL compatibility
  • Added: Improved selection finder for ORDER BY
  • Added: Ignore KILL statement without error
  • Added: Improved error messages (#3829)
  • Added: Support for ARM64 Linux (#3865)
  • Added: Support USE 'db'
  • Added: Support SHOW COLUMNS (#3995)
  • Added: Support SHOW TABLES (#4001)
  • Added: Support COUNT(1) (#4004)
  • Added: Support prepared statements (#4005)
  • Added: Support binary expression for measures (#4009)
  • Added: Support SHOW COLLATION (#4025)
  • Added: Query execution now uses DataFusion-based Query Engine
  • Added: Support SHOW processlist
  • Added: Split variables for session and server (#4255)
  • Added: Support pg_catalog.* tables
  • Added: Support SET variables (#4266)
  • Added: Improved error messages (#4515)
  • Fixed: LIKE '%(%)%' comparators
  • Fixed: Support for IF()
  • Fixed: SUBSTRING() with negative count now returns an empty string
  • Fixed: Return Cube errors to the SQL client
  • Fixed: Fixed an alias binding problem with escapes
  • Fixed: Ignore case-sensitive search for usage of identifiers
  • Fixed: Unique filtering for measures/dimensions/segments in Request
  • Fixed: Allow using a measure as an argument in COUNT() (#4063)
  • Fixed: Add numeric_scale field for information_schema.columns
  • Fixed: Table columns should take precedence over projection to mimic database behavior
  • Fixed: Allow quoted variables with SHOW <variable> syntax (#4313)
  • Fixed: Correct MySQL types in response headers (#4362)
  • Fixed: Support boolean column type

AWS Athena

  • Added: Batching and export support (#4039)
  • Fixed: Fixes export bucket location and column order (#4183)
  • Fixed: Support plain bucket (instead of a path) for CUBEJS_DB_EXPORT_BUCKET (#4390)

BigQuery

  • Fixed: Cancel queries on polling timeout so they aren't dangling around indefinitely

Databricks

  • Added: Export bucket support on S3/Azure (#4430)

JDBC

  • Fixed: Handle Maven error for empty Java dependencies (#4307)

Materialize

  • Added: New driver for Materialize (#4320)

MS SQL

  • Fixed: Add uniqueidentifier type support (#4386)

Postgres

  • Added: Enums now supported in pre-aggregations (#3957)

QuestDB

  • Added: New driver for QuestDB (#4096)

Snowflake

  • Added: New environment variable CUBEJS_DB_SNOWFLAKE_PRIVATE_KEY for setting private keys
  • Fixed: Fixed OperationFailedError: SQL compilation error: invalid value [?] for parameter 'STATEMENT_TIMEOUT_IN_SECONDS'

Playground

  • Added: A message now displays when using non-additive measures (#4236)
  • Added: A message now displays when using count distinct (#4309)
  • Added: Display error stack traces (#4438)
  • Fixed: Filter groups now correctly display the full field name (#3816)
  • Fixed: Adjust chart to fill the window (#4042)
  • Fixed: Use security context in GraphQL sandbox
  • Fixed: Fixed an issue rollup designer undefined key
  • Fixed: Tab close button styles (#4047)
  • Fixed: Fixed an issue that caused parameters to shift around when removing filters

Server

  • Added: New environment variable CUBEJS_ALLOW_UNGROUPED_WITHOUT_PRIMARY_KEY (#2941)
  • Added: Allow configuring allowNodeRequire for DataSchemaCompiler (#4235)
  • Fixed: Timestamp for quarter range in time series has incorrect ending period of 23:59:99 (#4162)
  • Fixed: TypeError when requesting /cubejs-api/v1/run-scheduled-refresh without auth params
  • Fixed: Validate contextToAppId() is in place when COMPILE_CONTEXT is used
  • Fixed: Improved defaults in RefreshScheduler

API gateway

  • Added: Compact JSON array-based response data format support (#4046)
  • Added: A new property total is available in the JSON query. If true , the query also returns the total number of rows for that query (#4134)
  • Fixed: Fix a type issue where queries did not properly support logical and / or operators (#4016)
  • Fixed: Skip GraphQL types generation for empty cubes
  • Fixed: GraphQL cannot read property findIndex of undefined
  • Fixed: Allow HTTP POST requests for /sql endpoint (#4180)

Query orchestrator

  • Added: New environment variable to control database timeouts: CUBEJS_DB_QUERY_TIMEOUT (#3864)
  • Fixed: Refresh process for useOriginalSqlPreAggregations (#3826)
  • Fixed: Table cache incorrectly invalidated in multitenant configurations (#3828)
  • Fixed: Cannot read property last_updated_at of undefined (#3980)
  • Fixed: Improve error message on missing partitions
  • Fixed: Remove orphaned tables on error while pre-aggregation creation (#3996)
  • Fixed: An out-of-memory error when an empty table was used to build partitioned pre-aggregations (#4021)

Schema compiler

  • Added: Allow filtering with or / and in FILTER_PARAMS (#4253)
  • Added: Support for compound primary keys (#4370)
  • Fixed: Handle null values in security context (#3868)
  • Fixed: An error when using subQuery for a rollingWindow measure
  • Fixed: Do not instantiate SqlParser if rewriteQueries is false to save cache memory
  • Fixed: refreshKey is evaluated ten times more frequently if sql and every are simultaneously defined (#3873)
  • Fixed: Use prototype name matching instead of classes to allow exact version mismatches for AbstractExtension
  • Fixed: Use a cube's alias when generating join aliases (#4010)
  • Fixed: Add strictness to booleans (#4157)

Client libraries

Angular

  • Fixed: cubejs.watch() is now producing errors (#3974)

Core

  • Added: Support for compact response data format (#4046)
  • Added: Accept immutable queries (#4366)
  • Added: Add HTTP status code to RequestError (#4412)
  • Fixed: Add meta field to TypeScript TCubeMember type (#3815)
  • Fixed: Allow any filter types in and / or (#4343)
  • Fixed: HTTP poll not working if Cube API stops and recovers (#3506)

Vue

  • Added: Boolean filters support (#4314)
  • Fixed: Fix error when deleting a member in QueryBuilder (#3806)

Documentation & examples

  • Fixed: Frontend Integration API Reference generation
  • Fixed: CodeSandbox examples in documentation
  • Fixed: Kubernetes examples