diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6e11e837d82dd..527a385770cb1 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,18 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [1.7.25](https://github.com/cube-js/cube/compare/v1.7.24...v1.7.25) (2026-08-21)
+
+### Bug Fixes
+
+- **cubesql:** Support `DATE_ADD` SQL pushdown ([#11539](https://github.com/cube-js/cube/issues/11539)) ([3051ccd](https://github.com/cube-js/cube/commit/3051ccd8c634941dce80235a0e6e823fa8586355))
+
+### Features
+
+- **cube-cli:** reintroduce `cube validate` as a Cloud data-model check ([#11595](https://github.com/cube-js/cube/issues/11595)) ([efeaee3](https://github.com/cube-js/cube/commit/efeaee324c2bd3958682bf502750c9a29bad675e))
+- **cube-cli:** suggest updating the CLI when a request fails on the API ([#11592](https://github.com/cube-js/cube/issues/11592)) ([96eaca5](https://github.com/cube-js/cube/commit/96eaca552d1f24d962c6e0d88b4d2de50403fd6c))
+- **cubestore:** Support QUEUE ADD_AND_RETRIEVE command ([#11590](https://github.com/cube-js/cube/issues/11590)) ([73ec070](https://github.com/cube-js/cube/commit/73ec070d55edf2c2fa4d70bbce1f37d735ce40cd))
+
## [1.7.24](https://github.com/cube-js/cube/compare/v1.7.23...v1.7.24) (2026-08-19)
### Bug Fixes
diff --git a/lerna.json b/lerna.json
index 26fd90b31fd2e..02e0977acbb53 100644
--- a/lerna.json
+++ b/lerna.json
@@ -1,5 +1,5 @@
{
- "version": "1.7.24",
+ "version": "1.7.25",
"npmClient": "yarn",
"command": {
"bootstrap": {
diff --git a/packages/cubejs-api-gateway/CHANGELOG.md b/packages/cubejs-api-gateway/CHANGELOG.md
index 2379ddd3d6dd0..4c93302d9f37d 100644
--- a/packages/cubejs-api-gateway/CHANGELOG.md
+++ b/packages/cubejs-api-gateway/CHANGELOG.md
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [1.7.25](https://github.com/cube-js/cube/compare/v1.7.24...v1.7.25) (2026-08-21)
+
+**Note:** Version bump only for package @cubejs-backend/api-gateway
+
## [1.7.24](https://github.com/cube-js/cube/compare/v1.7.23...v1.7.24) (2026-08-19)
### Bug Fixes
diff --git a/packages/cubejs-api-gateway/package.json b/packages/cubejs-api-gateway/package.json
index 8c35cadb6df51..6afe6e8f02f00 100644
--- a/packages/cubejs-api-gateway/package.json
+++ b/packages/cubejs-api-gateway/package.json
@@ -2,7 +2,7 @@
"name": "@cubejs-backend/api-gateway",
"description": "Cube API Gateway",
"author": "Cube Dev, Inc.",
- "version": "1.7.24",
+ "version": "1.7.25",
"repository": {
"type": "git",
"url": "https://github.com/cube-js/cube.git",
@@ -27,9 +27,9 @@
"dist/src/*"
],
"dependencies": {
- "@cubejs-backend/native": "1.7.24",
- "@cubejs-backend/query-orchestrator": "1.7.24",
- "@cubejs-backend/shared": "1.7.24",
+ "@cubejs-backend/native": "1.7.25",
+ "@cubejs-backend/query-orchestrator": "1.7.25",
+ "@cubejs-backend/shared": "1.7.25",
"@ungap/structured-clone": "^0.3.4",
"assert-never": "^1.4.0",
"body-parser": "^1.19.0",
@@ -53,7 +53,7 @@
"zod": "^4.1.13"
},
"devDependencies": {
- "@cubejs-backend/linter": "1.7.24",
+ "@cubejs-backend/linter": "1.7.25",
"@types/express": "^4.17.21",
"@types/jest": "^29",
"@types/jsonwebtoken": "^9.0.2",
diff --git a/packages/cubejs-athena-driver/CHANGELOG.md b/packages/cubejs-athena-driver/CHANGELOG.md
index 94391d89cf777..f14b43906c1fb 100644
--- a/packages/cubejs-athena-driver/CHANGELOG.md
+++ b/packages/cubejs-athena-driver/CHANGELOG.md
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [1.7.25](https://github.com/cube-js/cube/compare/v1.7.24...v1.7.25) (2026-08-21)
+
+**Note:** Version bump only for package @cubejs-backend/athena-driver
+
## [1.7.24](https://github.com/cube-js/cube/compare/v1.7.23...v1.7.24) (2026-08-19)
**Note:** Version bump only for package @cubejs-backend/athena-driver
diff --git a/packages/cubejs-athena-driver/package.json b/packages/cubejs-athena-driver/package.json
index 4c6890e712d8c..c3a684a442d29 100644
--- a/packages/cubejs-athena-driver/package.json
+++ b/packages/cubejs-athena-driver/package.json
@@ -2,7 +2,7 @@
"name": "@cubejs-backend/athena-driver",
"description": "Cube.js Athena database driver",
"author": "Cube Dev, Inc.",
- "version": "1.7.24",
+ "version": "1.7.25",
"repository": {
"type": "git",
"url": "https://github.com/cube-js/cube.git",
@@ -31,12 +31,12 @@
"dependencies": {
"@aws-sdk/client-athena": "^3.22.0",
"@aws-sdk/credential-providers": "^3.22.0",
- "@cubejs-backend/base-driver": "1.7.24",
- "@cubejs-backend/shared": "1.7.24"
+ "@cubejs-backend/base-driver": "1.7.25",
+ "@cubejs-backend/shared": "1.7.25"
},
"devDependencies": {
- "@cubejs-backend/linter": "1.7.24",
- "@cubejs-backend/testing-shared": "1.7.24",
+ "@cubejs-backend/linter": "1.7.25",
+ "@cubejs-backend/testing-shared": "1.7.25",
"@types/ramda": "^0.27.40",
"typescript": "~5.2.2"
},
diff --git a/packages/cubejs-backend-cloud/CHANGELOG.md b/packages/cubejs-backend-cloud/CHANGELOG.md
index 80ed686cade75..bf9cfb1aaa960 100644
--- a/packages/cubejs-backend-cloud/CHANGELOG.md
+++ b/packages/cubejs-backend-cloud/CHANGELOG.md
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [1.7.25](https://github.com/cube-js/cube/compare/v1.7.24...v1.7.25) (2026-08-21)
+
+**Note:** Version bump only for package @cubejs-backend/cloud
+
## [1.7.24](https://github.com/cube-js/cube/compare/v1.7.23...v1.7.24) (2026-08-19)
**Note:** Version bump only for package @cubejs-backend/cloud
diff --git a/packages/cubejs-backend-cloud/package.json b/packages/cubejs-backend-cloud/package.json
index 94a6feefc1b28..4bef15099519e 100644
--- a/packages/cubejs-backend-cloud/package.json
+++ b/packages/cubejs-backend-cloud/package.json
@@ -1,6 +1,6 @@
{
"name": "@cubejs-backend/cloud",
- "version": "1.7.24",
+ "version": "1.7.25",
"description": "Cube Cloud package",
"main": "dist/src/index.js",
"typings": "dist/src/index.d.ts",
@@ -30,7 +30,7 @@
"devDependencies": {
"@babel/core": "^7.24.5",
"@babel/preset-env": "^7.24.5",
- "@cubejs-backend/linter": "1.7.24",
+ "@cubejs-backend/linter": "1.7.25",
"@types/fs-extra": "^9.0.8",
"@types/jest": "^29",
"jest": "^29",
@@ -38,7 +38,7 @@
},
"dependencies": {
"@cubejs-backend/dotenv": "^9.0.2",
- "@cubejs-backend/shared": "1.7.24",
+ "@cubejs-backend/shared": "1.7.25",
"chokidar": "^3.5.1",
"env-var": "^6.3.0",
"form-data": "^4.0.0",
diff --git a/packages/cubejs-backend-maven/CHANGELOG.md b/packages/cubejs-backend-maven/CHANGELOG.md
index 02610d11ad12d..db8f1e3d33122 100644
--- a/packages/cubejs-backend-maven/CHANGELOG.md
+++ b/packages/cubejs-backend-maven/CHANGELOG.md
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [1.7.25](https://github.com/cube-js/cube/compare/v1.7.24...v1.7.25) (2026-08-21)
+
+**Note:** Version bump only for package @cubejs-backend/maven
+
## [1.7.24](https://github.com/cube-js/cube/compare/v1.7.23...v1.7.24) (2026-08-19)
**Note:** Version bump only for package @cubejs-backend/maven
diff --git a/packages/cubejs-backend-maven/package.json b/packages/cubejs-backend-maven/package.json
index 2e400c81b9382..78aad08df1e0d 100644
--- a/packages/cubejs-backend-maven/package.json
+++ b/packages/cubejs-backend-maven/package.json
@@ -2,7 +2,7 @@
"name": "@cubejs-backend/maven",
"description": "Cube.js Maven Wrapper for java dependencies downloading",
"author": "Cube Dev, Inc.",
- "version": "1.7.24",
+ "version": "1.7.25",
"license": "Apache-2.0",
"repository": {
"type": "git",
@@ -31,12 +31,12 @@
"dist/src/*"
],
"dependencies": {
- "@cubejs-backend/shared": "1.7.24",
+ "@cubejs-backend/shared": "1.7.25",
"source-map-support": "^0.5.19",
"xmlbuilder2": "^2.4.0"
},
"devDependencies": {
- "@cubejs-backend/linter": "1.7.24",
+ "@cubejs-backend/linter": "1.7.25",
"@types/jest": "^29",
"@types/node": "^22",
"jest": "^29",
diff --git a/packages/cubejs-backend-native/CHANGELOG.md b/packages/cubejs-backend-native/CHANGELOG.md
index 6d2c0d622f7a2..aaea0ce2474bf 100644
--- a/packages/cubejs-backend-native/CHANGELOG.md
+++ b/packages/cubejs-backend-native/CHANGELOG.md
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [1.7.25](https://github.com/cube-js/cube/compare/v1.7.24...v1.7.25) (2026-08-21)
+
+**Note:** Version bump only for package @cubejs-backend/native
+
## [1.7.24](https://github.com/cube-js/cube/compare/v1.7.23...v1.7.24) (2026-08-19)
**Note:** Version bump only for package @cubejs-backend/native
diff --git a/packages/cubejs-backend-native/package.json b/packages/cubejs-backend-native/package.json
index 63a38723d2034..9fd4dfaaf4792 100644
--- a/packages/cubejs-backend-native/package.json
+++ b/packages/cubejs-backend-native/package.json
@@ -1,6 +1,6 @@
{
"name": "@cubejs-backend/native",
- "version": "1.7.24",
+ "version": "1.7.25",
"author": "Cube Dev, Inc.",
"description": "Native module for Cube.js (binding to Rust codebase)",
"main": "dist/js/index.js",
@@ -39,7 +39,7 @@
"dist/js"
],
"devDependencies": {
- "@cubejs-backend/linter": "1.7.24",
+ "@cubejs-backend/linter": "1.7.25",
"@types/jest": "^29",
"@types/node": "^22",
"cargo-cp-artifact": "^0.1.9",
@@ -50,8 +50,8 @@
"uuid": "^11.1.1"
},
"dependencies": {
- "@cubejs-backend/cubesql": "1.7.24",
- "@cubejs-backend/shared": "1.7.24",
+ "@cubejs-backend/cubesql": "1.7.25",
+ "@cubejs-backend/shared": "1.7.25",
"@cubejs-infra/post-installer": "^0.1.2"
},
"resources": {
diff --git a/packages/cubejs-backend-shared/CHANGELOG.md b/packages/cubejs-backend-shared/CHANGELOG.md
index c52824da94934..b53e0b3a5e21c 100644
--- a/packages/cubejs-backend-shared/CHANGELOG.md
+++ b/packages/cubejs-backend-shared/CHANGELOG.md
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [1.7.25](https://github.com/cube-js/cube/compare/v1.7.24...v1.7.25) (2026-08-21)
+
+**Note:** Version bump only for package @cubejs-backend/shared
+
## [1.7.24](https://github.com/cube-js/cube/compare/v1.7.23...v1.7.24) (2026-08-19)
### Bug Fixes
diff --git a/packages/cubejs-backend-shared/package.json b/packages/cubejs-backend-shared/package.json
index 1f8ce1bd70bca..308c966b73494 100644
--- a/packages/cubejs-backend-shared/package.json
+++ b/packages/cubejs-backend-shared/package.json
@@ -1,6 +1,6 @@
{
"name": "@cubejs-backend/shared",
- "version": "1.7.24",
+ "version": "1.7.25",
"description": "Shared code for Cube.js backend packages",
"main": "dist/src/index.js",
"typings": "dist/src/index.d.ts",
@@ -27,7 +27,7 @@
},
"license": "Apache-2.0",
"devDependencies": {
- "@cubejs-backend/linter": "1.7.24",
+ "@cubejs-backend/linter": "1.7.25",
"@types/bytes": "^3.1.5",
"@types/cli-progress": "^3.9.1",
"@types/jest": "^29",
diff --git a/packages/cubejs-base-driver/CHANGELOG.md b/packages/cubejs-base-driver/CHANGELOG.md
index 4eaf322b1b00c..537abc1952c77 100644
--- a/packages/cubejs-base-driver/CHANGELOG.md
+++ b/packages/cubejs-base-driver/CHANGELOG.md
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [1.7.25](https://github.com/cube-js/cube/compare/v1.7.24...v1.7.25) (2026-08-21)
+
+**Note:** Version bump only for package @cubejs-backend/base-driver
+
## [1.7.24](https://github.com/cube-js/cube/compare/v1.7.23...v1.7.24) (2026-08-19)
**Note:** Version bump only for package @cubejs-backend/base-driver
diff --git a/packages/cubejs-base-driver/package.json b/packages/cubejs-base-driver/package.json
index 89c8a2cf65d88..dce3407313999 100644
--- a/packages/cubejs-base-driver/package.json
+++ b/packages/cubejs-base-driver/package.json
@@ -2,7 +2,7 @@
"name": "@cubejs-backend/base-driver",
"description": "Cube.js Base Driver",
"author": "Cube Dev, Inc.",
- "version": "1.7.24",
+ "version": "1.7.25",
"repository": {
"type": "git",
"url": "https://github.com/cube-js/cube.git",
@@ -33,11 +33,11 @@
"@aws-sdk/s3-request-presigner": "^3.49.0",
"@azure/identity": "^4.4.1",
"@azure/storage-blob": "^12.9.0",
- "@cubejs-backend/shared": "1.7.24",
+ "@cubejs-backend/shared": "1.7.25",
"@google-cloud/storage": "^7.13.0"
},
"devDependencies": {
- "@cubejs-backend/linter": "1.7.24",
+ "@cubejs-backend/linter": "1.7.25",
"@types/jest": "^29",
"@types/node": "^22",
"jest": "^29",
diff --git a/packages/cubejs-bigquery-driver/CHANGELOG.md b/packages/cubejs-bigquery-driver/CHANGELOG.md
index 0623b9bcba3e3..3a310805edc0e 100644
--- a/packages/cubejs-bigquery-driver/CHANGELOG.md
+++ b/packages/cubejs-bigquery-driver/CHANGELOG.md
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [1.7.25](https://github.com/cube-js/cube/compare/v1.7.24...v1.7.25) (2026-08-21)
+
+**Note:** Version bump only for package @cubejs-backend/bigquery-driver
+
## [1.7.24](https://github.com/cube-js/cube/compare/v1.7.23...v1.7.24) (2026-08-19)
**Note:** Version bump only for package @cubejs-backend/bigquery-driver
diff --git a/packages/cubejs-bigquery-driver/package.json b/packages/cubejs-bigquery-driver/package.json
index b4302fe96a224..d258fbc55376d 100644
--- a/packages/cubejs-bigquery-driver/package.json
+++ b/packages/cubejs-bigquery-driver/package.json
@@ -2,7 +2,7 @@
"name": "@cubejs-backend/bigquery-driver",
"description": "Cube.js BigQuery database driver",
"author": "Cube Dev, Inc.",
- "version": "1.7.24",
+ "version": "1.7.25",
"repository": {
"type": "git",
"url": "https://github.com/cube-js/cube.git",
@@ -29,15 +29,15 @@
"main": "index.js",
"types": "dist/src/index.d.ts",
"dependencies": {
- "@cubejs-backend/base-driver": "1.7.24",
+ "@cubejs-backend/base-driver": "1.7.25",
"@cubejs-backend/dotenv": "^9.0.2",
- "@cubejs-backend/shared": "1.7.24",
+ "@cubejs-backend/shared": "1.7.25",
"@google-cloud/bigquery": "^7.7.0",
"@google-cloud/storage": "^7.13.0",
"ramda": "^0.27.2"
},
"devDependencies": {
- "@cubejs-backend/testing-shared": "1.7.24",
+ "@cubejs-backend/testing-shared": "1.7.25",
"@types/big.js": "^6.2.2",
"@types/dedent": "^0.7.0",
"@types/jest": "^29",
diff --git a/packages/cubejs-cli/CHANGELOG.md b/packages/cubejs-cli/CHANGELOG.md
index a700f1dfb6825..5a651fb64f4ad 100644
--- a/packages/cubejs-cli/CHANGELOG.md
+++ b/packages/cubejs-cli/CHANGELOG.md
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [1.7.25](https://github.com/cube-js/cube/compare/v1.7.24...v1.7.25) (2026-08-21)
+
+**Note:** Version bump only for package cubejs-cli
+
## [1.7.24](https://github.com/cube-js/cube/compare/v1.7.23...v1.7.24) (2026-08-19)
**Note:** Version bump only for package cubejs-cli
diff --git a/packages/cubejs-cli/package.json b/packages/cubejs-cli/package.json
index 817dc791f5063..8c894c4312572 100644
--- a/packages/cubejs-cli/package.json
+++ b/packages/cubejs-cli/package.json
@@ -2,7 +2,7 @@
"name": "cubejs-cli",
"description": "Cube.js Command Line Interface",
"author": "Cube Dev, Inc.",
- "version": "1.7.24",
+ "version": "1.7.25",
"repository": {
"type": "git",
"url": "https://github.com/cube-js/cube.git",
@@ -30,10 +30,10 @@
"LICENSE"
],
"dependencies": {
- "@cubejs-backend/cloud": "1.7.24",
+ "@cubejs-backend/cloud": "1.7.25",
"@cubejs-backend/dotenv": "^9.0.2",
- "@cubejs-backend/schema-compiler": "1.7.24",
- "@cubejs-backend/shared": "1.7.24",
+ "@cubejs-backend/schema-compiler": "1.7.25",
+ "@cubejs-backend/shared": "1.7.25",
"chalk": "^2.4.2",
"cli-progress": "^3.10",
"commander": "^2.19.0",
@@ -50,8 +50,8 @@
"colors": "1.4.0"
},
"devDependencies": {
- "@cubejs-backend/linter": "1.7.24",
- "@cubejs-backend/server": "1.7.24",
+ "@cubejs-backend/linter": "1.7.25",
+ "@cubejs-backend/server": "1.7.25",
"@oclif/command": "^1.8.0",
"@types/cli-progress": "^3.8.0",
"@types/cross-spawn": "^6.0.2",
diff --git a/packages/cubejs-clickhouse-driver/CHANGELOG.md b/packages/cubejs-clickhouse-driver/CHANGELOG.md
index 906874cf0b7a6..662093620d205 100644
--- a/packages/cubejs-clickhouse-driver/CHANGELOG.md
+++ b/packages/cubejs-clickhouse-driver/CHANGELOG.md
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [1.7.25](https://github.com/cube-js/cube/compare/v1.7.24...v1.7.25) (2026-08-21)
+
+**Note:** Version bump only for package @cubejs-backend/clickhouse-driver
+
## [1.7.24](https://github.com/cube-js/cube/compare/v1.7.23...v1.7.24) (2026-08-19)
**Note:** Version bump only for package @cubejs-backend/clickhouse-driver
diff --git a/packages/cubejs-clickhouse-driver/package.json b/packages/cubejs-clickhouse-driver/package.json
index c5340fcb4e5bd..ae4658e11e198 100644
--- a/packages/cubejs-clickhouse-driver/package.json
+++ b/packages/cubejs-clickhouse-driver/package.json
@@ -2,7 +2,7 @@
"name": "@cubejs-backend/clickhouse-driver",
"description": "Cube.js ClickHouse database driver",
"author": "Cube Dev, Inc.",
- "version": "1.7.24",
+ "version": "1.7.25",
"repository": {
"type": "git",
"url": "https://github.com/cube-js/cube.git",
@@ -29,16 +29,16 @@
},
"dependencies": {
"@clickhouse/client": "^1.12.0",
- "@cubejs-backend/base-driver": "1.7.24",
- "@cubejs-backend/shared": "1.7.24",
+ "@cubejs-backend/base-driver": "1.7.25",
+ "@cubejs-backend/shared": "1.7.25",
"moment": "^2.24.0",
"sqlstring": "^2.3.1",
"uuid": "^11.1.1"
},
"license": "Apache-2.0",
"devDependencies": {
- "@cubejs-backend/linter": "1.7.24",
- "@cubejs-backend/testing-shared": "1.7.24",
+ "@cubejs-backend/linter": "1.7.25",
+ "@cubejs-backend/testing-shared": "1.7.25",
"@types/jest": "^29",
"jest": "^29",
"typescript": "~5.2.2"
diff --git a/packages/cubejs-client-core/CHANGELOG.md b/packages/cubejs-client-core/CHANGELOG.md
index 0edd436f82b64..741e9ee74a8f2 100644
--- a/packages/cubejs-client-core/CHANGELOG.md
+++ b/packages/cubejs-client-core/CHANGELOG.md
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [1.7.25](https://github.com/cube-js/cube/compare/v1.7.24...v1.7.25) (2026-08-21)
+
+**Note:** Version bump only for package @cubejs-client/core
+
## [1.7.24](https://github.com/cube-js/cube/compare/v1.7.23...v1.7.24) (2026-08-19)
**Note:** Version bump only for package @cubejs-client/core
diff --git a/packages/cubejs-client-core/package.json b/packages/cubejs-client-core/package.json
index 8dc3c0b93f17c..c506c173ceb61 100644
--- a/packages/cubejs-client-core/package.json
+++ b/packages/cubejs-client-core/package.json
@@ -1,6 +1,6 @@
{
"name": "@cubejs-client/core",
- "version": "1.7.24",
+ "version": "1.7.25",
"engines": {},
"type": "module",
"repository": {
@@ -58,7 +58,7 @@
],
"license": "MIT",
"devDependencies": {
- "@cubejs-backend/linter": "1.7.24",
+ "@cubejs-backend/linter": "1.7.25",
"@types/d3-format": "^3",
"@types/d3-time-format": "^4",
"@types/moment-range": "^4.0.0",
diff --git a/packages/cubejs-client-dx/CHANGELOG.md b/packages/cubejs-client-dx/CHANGELOG.md
index 3ab90dcf1dcb8..ab06247b1ebef 100644
--- a/packages/cubejs-client-dx/CHANGELOG.md
+++ b/packages/cubejs-client-dx/CHANGELOG.md
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [1.7.25](https://github.com/cube-js/cube/compare/v1.7.24...v1.7.25) (2026-08-21)
+
+**Note:** Version bump only for package @cubejs-client/dx
+
## [1.7.24](https://github.com/cube-js/cube/compare/v1.7.23...v1.7.24) (2026-08-19)
**Note:** Version bump only for package @cubejs-client/dx
diff --git a/packages/cubejs-client-dx/package.json b/packages/cubejs-client-dx/package.json
index 220dcc851dfb8..891f55ecb4259 100644
--- a/packages/cubejs-client-dx/package.json
+++ b/packages/cubejs-client-dx/package.json
@@ -1,6 +1,6 @@
{
"name": "@cubejs-client/dx",
- "version": "1.7.24",
+ "version": "1.7.25",
"engines": {},
"repository": {
"type": "git",
diff --git a/packages/cubejs-client-ngx/CHANGELOG.md b/packages/cubejs-client-ngx/CHANGELOG.md
index 5c7e8ffa76e52..74a959a80da11 100644
--- a/packages/cubejs-client-ngx/CHANGELOG.md
+++ b/packages/cubejs-client-ngx/CHANGELOG.md
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [1.7.25](https://github.com/cube-js/cube/compare/v1.7.24...v1.7.25) (2026-08-21)
+
+**Note:** Version bump only for package @cubejs-client/ngx
+
## [1.7.24](https://github.com/cube-js/cube/compare/v1.7.23...v1.7.24) (2026-08-19)
**Note:** Version bump only for package @cubejs-client/ngx
diff --git a/packages/cubejs-client-ngx/package.json b/packages/cubejs-client-ngx/package.json
index 230f050ccb0b7..f4003a1a544cd 100644
--- a/packages/cubejs-client-ngx/package.json
+++ b/packages/cubejs-client-ngx/package.json
@@ -1,6 +1,6 @@
{
"name": "@cubejs-client/ngx",
- "version": "1.7.24",
+ "version": "1.7.25",
"author": "Cube Dev, Inc.",
"engines": {},
"repository": {
diff --git a/packages/cubejs-client-react/CHANGELOG.md b/packages/cubejs-client-react/CHANGELOG.md
index 7091cbf2a4f16..618355999271d 100644
--- a/packages/cubejs-client-react/CHANGELOG.md
+++ b/packages/cubejs-client-react/CHANGELOG.md
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [1.7.25](https://github.com/cube-js/cube/compare/v1.7.24...v1.7.25) (2026-08-21)
+
+**Note:** Version bump only for package @cubejs-client/react
+
## [1.7.24](https://github.com/cube-js/cube/compare/v1.7.23...v1.7.24) (2026-08-19)
**Note:** Version bump only for package @cubejs-client/react
diff --git a/packages/cubejs-client-react/package.json b/packages/cubejs-client-react/package.json
index 8d311afcd728c..645faa37839cd 100644
--- a/packages/cubejs-client-react/package.json
+++ b/packages/cubejs-client-react/package.json
@@ -1,6 +1,6 @@
{
"name": "@cubejs-client/react",
- "version": "1.7.24",
+ "version": "1.7.25",
"author": "Cube Dev, Inc.",
"license": "MIT",
"engines": {},
@@ -26,7 +26,7 @@
],
"dependencies": {
"@babel/runtime": "^7.1.2",
- "@cubejs-client/core": "1.7.24",
+ "@cubejs-client/core": "1.7.25",
"core-js": "^3.6.5",
"ramda": "^0.27.2"
},
diff --git a/packages/cubejs-client-vue3/CHANGELOG.md b/packages/cubejs-client-vue3/CHANGELOG.md
index f1738ed1206ea..22206db11d959 100644
--- a/packages/cubejs-client-vue3/CHANGELOG.md
+++ b/packages/cubejs-client-vue3/CHANGELOG.md
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [1.7.25](https://github.com/cube-js/cube/compare/v1.7.24...v1.7.25) (2026-08-21)
+
+**Note:** Version bump only for package @cubejs-client/vue3
+
## [1.7.24](https://github.com/cube-js/cube/compare/v1.7.23...v1.7.24) (2026-08-19)
**Note:** Version bump only for package @cubejs-client/vue3
diff --git a/packages/cubejs-client-vue3/package.json b/packages/cubejs-client-vue3/package.json
index 58c779e4c562c..6366dbaf08521 100644
--- a/packages/cubejs-client-vue3/package.json
+++ b/packages/cubejs-client-vue3/package.json
@@ -1,6 +1,6 @@
{
"name": "@cubejs-client/vue3",
- "version": "1.7.24",
+ "version": "1.7.25",
"engines": {},
"repository": {
"type": "git",
@@ -27,7 +27,7 @@
"src"
],
"dependencies": {
- "@cubejs-client/core": "1.7.24",
+ "@cubejs-client/core": "1.7.25",
"ramda": "^0.27.0"
},
"devDependencies": {
diff --git a/packages/cubejs-client-ws-transport/CHANGELOG.md b/packages/cubejs-client-ws-transport/CHANGELOG.md
index 4725b9b6b91b4..02d4e63fe3ba7 100644
--- a/packages/cubejs-client-ws-transport/CHANGELOG.md
+++ b/packages/cubejs-client-ws-transport/CHANGELOG.md
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [1.7.25](https://github.com/cube-js/cube/compare/v1.7.24...v1.7.25) (2026-08-21)
+
+**Note:** Version bump only for package @cubejs-client/ws-transport
+
## [1.7.24](https://github.com/cube-js/cube/compare/v1.7.23...v1.7.24) (2026-08-19)
**Note:** Version bump only for package @cubejs-client/ws-transport
diff --git a/packages/cubejs-client-ws-transport/package.json b/packages/cubejs-client-ws-transport/package.json
index 420df0188a657..ff186e843e21b 100644
--- a/packages/cubejs-client-ws-transport/package.json
+++ b/packages/cubejs-client-ws-transport/package.json
@@ -1,6 +1,6 @@
{
"name": "@cubejs-client/ws-transport",
- "version": "1.7.24",
+ "version": "1.7.25",
"engines": {},
"repository": {
"type": "git",
@@ -20,7 +20,7 @@
},
"dependencies": {
"@babel/runtime": "^7.1.2",
- "@cubejs-client/core": "1.7.24",
+ "@cubejs-client/core": "1.7.25",
"core-js": "^3.6.5",
"isomorphic-ws": "^4.0.1",
"ws": "^7.3.1"
@@ -33,7 +33,7 @@
"@babel/core": "^7.3.3",
"@babel/preset-env": "^7.3.1",
"@babel/preset-typescript": "^7.12.1",
- "@cubejs-backend/linter": "1.7.24",
+ "@cubejs-backend/linter": "1.7.25",
"@types/ws": "^7.2.9",
"typescript": "~5.2.2"
},
diff --git a/packages/cubejs-crate-driver/CHANGELOG.md b/packages/cubejs-crate-driver/CHANGELOG.md
index 4350bc7b30a03..81ad065312429 100644
--- a/packages/cubejs-crate-driver/CHANGELOG.md
+++ b/packages/cubejs-crate-driver/CHANGELOG.md
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [1.7.25](https://github.com/cube-js/cube/compare/v1.7.24...v1.7.25) (2026-08-21)
+
+**Note:** Version bump only for package @cubejs-backend/crate-driver
+
## [1.7.24](https://github.com/cube-js/cube/compare/v1.7.23...v1.7.24) (2026-08-19)
**Note:** Version bump only for package @cubejs-backend/crate-driver
diff --git a/packages/cubejs-crate-driver/package.json b/packages/cubejs-crate-driver/package.json
index bcf3bb83a7381..6c54977f1f721 100644
--- a/packages/cubejs-crate-driver/package.json
+++ b/packages/cubejs-crate-driver/package.json
@@ -2,7 +2,7 @@
"name": "@cubejs-backend/crate-driver",
"description": "Cube.js Crate database driver",
"author": "Cube Dev, Inc.",
- "version": "1.7.24",
+ "version": "1.7.25",
"repository": {
"type": "git",
"url": "https://github.com/cube-js/cube.git",
@@ -29,13 +29,13 @@
"lint:fix": "eslint --fix src/* --ext .ts"
},
"dependencies": {
- "@cubejs-backend/postgres-driver": "1.7.24",
- "@cubejs-backend/shared": "1.7.24"
+ "@cubejs-backend/postgres-driver": "1.7.25",
+ "@cubejs-backend/shared": "1.7.25"
},
"license": "Apache-2.0",
"devDependencies": {
- "@cubejs-backend/linter": "1.7.24",
- "@cubejs-backend/testing-shared": "1.7.24",
+ "@cubejs-backend/linter": "1.7.25",
+ "@cubejs-backend/testing-shared": "1.7.25",
"testcontainers": "^10.28.0",
"typescript": "~5.2.2"
},
diff --git a/packages/cubejs-cubestore-driver/CHANGELOG.md b/packages/cubejs-cubestore-driver/CHANGELOG.md
index 6104adc6f8539..fdea4e28c1480 100644
--- a/packages/cubejs-cubestore-driver/CHANGELOG.md
+++ b/packages/cubejs-cubestore-driver/CHANGELOG.md
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [1.7.25](https://github.com/cube-js/cube/compare/v1.7.24...v1.7.25) (2026-08-21)
+
+**Note:** Version bump only for package @cubejs-backend/cubestore-driver
+
## [1.7.24](https://github.com/cube-js/cube/compare/v1.7.23...v1.7.24) (2026-08-19)
**Note:** Version bump only for package @cubejs-backend/cubestore-driver
diff --git a/packages/cubejs-cubestore-driver/package.json b/packages/cubejs-cubestore-driver/package.json
index 3a161b14a18df..230fb58a28a6f 100644
--- a/packages/cubejs-cubestore-driver/package.json
+++ b/packages/cubejs-cubestore-driver/package.json
@@ -2,7 +2,7 @@
"name": "@cubejs-backend/cubestore-driver",
"description": "Cube Store driver",
"author": "Cube Dev, Inc.",
- "version": "1.7.24",
+ "version": "1.7.25",
"repository": {
"type": "git",
"url": "https://github.com/cube-js/cube.git",
@@ -26,10 +26,10 @@
"lint:fix": "eslint --fix src/*.ts"
},
"dependencies": {
- "@cubejs-backend/base-driver": "1.7.24",
- "@cubejs-backend/cubestore": "1.7.24",
- "@cubejs-backend/native": "1.7.24",
- "@cubejs-backend/shared": "1.7.24",
+ "@cubejs-backend/base-driver": "1.7.25",
+ "@cubejs-backend/cubestore": "1.7.25",
+ "@cubejs-backend/native": "1.7.25",
+ "@cubejs-backend/shared": "1.7.25",
"csv-write-stream": "^2.0.0",
"flatbuffers": "25.9.23",
"fs-extra": "^9.1.0",
@@ -40,7 +40,7 @@
"ws": "^7.4.3"
},
"devDependencies": {
- "@cubejs-backend/linter": "1.7.24",
+ "@cubejs-backend/linter": "1.7.25",
"@types/csv-write-stream": "^2.0.0",
"@types/jest": "^29",
"@types/node": "^22",
diff --git a/packages/cubejs-databricks-jdbc-driver/CHANGELOG.md b/packages/cubejs-databricks-jdbc-driver/CHANGELOG.md
index cc09670398bd3..d45c387fd3d29 100644
--- a/packages/cubejs-databricks-jdbc-driver/CHANGELOG.md
+++ b/packages/cubejs-databricks-jdbc-driver/CHANGELOG.md
@@ -3,6 +3,12 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [1.7.25](https://github.com/cube-js/cube/compare/v1.7.24...v1.7.25) (2026-08-21)
+
+### Bug Fixes
+
+- **cubesql:** Support `DATE_ADD` SQL pushdown ([#11539](https://github.com/cube-js/cube/issues/11539)) ([3051ccd](https://github.com/cube-js/cube/commit/3051ccd8c634941dce80235a0e6e823fa8586355))
+
## [1.7.24](https://github.com/cube-js/cube/compare/v1.7.23...v1.7.24) (2026-08-19)
**Note:** Version bump only for package @cubejs-backend/databricks-jdbc-driver
diff --git a/packages/cubejs-databricks-jdbc-driver/package.json b/packages/cubejs-databricks-jdbc-driver/package.json
index 153c654025409..b61c0dbacf42b 100644
--- a/packages/cubejs-databricks-jdbc-driver/package.json
+++ b/packages/cubejs-databricks-jdbc-driver/package.json
@@ -2,7 +2,7 @@
"name": "@cubejs-backend/databricks-jdbc-driver",
"description": "Cube.js Databricks database driver",
"author": "Cube Dev, Inc.",
- "version": "1.7.24",
+ "version": "1.7.25",
"license": "Apache-2.0",
"repository": {
"type": "git",
@@ -30,17 +30,17 @@
"bin"
],
"dependencies": {
- "@cubejs-backend/base-driver": "1.7.24",
- "@cubejs-backend/jdbc-driver": "1.7.24",
- "@cubejs-backend/schema-compiler": "1.7.24",
- "@cubejs-backend/shared": "1.7.24",
+ "@cubejs-backend/base-driver": "1.7.25",
+ "@cubejs-backend/jdbc-driver": "1.7.25",
+ "@cubejs-backend/schema-compiler": "1.7.25",
+ "@cubejs-backend/shared": "1.7.25",
"node-fetch": "^2.6.1",
"ramda": "^0.27.2",
"source-map-support": "^0.5.19",
"uuid": "^11.1.1"
},
"devDependencies": {
- "@cubejs-backend/linter": "1.7.24",
+ "@cubejs-backend/linter": "1.7.25",
"@types/jest": "^29",
"@types/node": "^22",
"@types/ramda": "^0.27.34",
diff --git a/packages/cubejs-dbt-schema-extension/CHANGELOG.md b/packages/cubejs-dbt-schema-extension/CHANGELOG.md
index 3290a75859299..4c12353dd41c2 100644
--- a/packages/cubejs-dbt-schema-extension/CHANGELOG.md
+++ b/packages/cubejs-dbt-schema-extension/CHANGELOG.md
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [1.7.25](https://github.com/cube-js/cube/compare/v1.7.24...v1.7.25) (2026-08-21)
+
+**Note:** Version bump only for package @cubejs-backend/dbt-schema-extension
+
## [1.7.24](https://github.com/cube-js/cube/compare/v1.7.23...v1.7.24) (2026-08-19)
**Note:** Version bump only for package @cubejs-backend/dbt-schema-extension
diff --git a/packages/cubejs-dbt-schema-extension/package.json b/packages/cubejs-dbt-schema-extension/package.json
index 81cf1f142b5b4..26d26168eebeb 100644
--- a/packages/cubejs-dbt-schema-extension/package.json
+++ b/packages/cubejs-dbt-schema-extension/package.json
@@ -2,7 +2,7 @@
"name": "@cubejs-backend/dbt-schema-extension",
"description": "Cube.js dbt Schema Extension",
"author": "Cube Dev, Inc.",
- "version": "1.7.24",
+ "version": "1.7.25",
"repository": {
"type": "git",
"url": "https://github.com/cube-js/cube.git",
@@ -25,14 +25,14 @@
"lint:fix": "eslint --fix src/* --ext .ts,.js"
},
"dependencies": {
- "@cubejs-backend/schema-compiler": "1.7.24",
+ "@cubejs-backend/schema-compiler": "1.7.25",
"fs-extra": "^9.1.0",
"inflection": "^1.12.0",
"node-fetch": "^2.6.1"
},
"devDependencies": {
- "@cubejs-backend/linter": "1.7.24",
- "@cubejs-backend/testing": "1.7.24",
+ "@cubejs-backend/linter": "1.7.25",
+ "@cubejs-backend/testing": "1.7.25",
"@types/jest": "^29",
"jest": "^29",
"stream-to-array": "^2.3.0",
diff --git a/packages/cubejs-docker/CHANGELOG.md b/packages/cubejs-docker/CHANGELOG.md
index 9c2bd1fb571f0..013b51f2f89e6 100644
--- a/packages/cubejs-docker/CHANGELOG.md
+++ b/packages/cubejs-docker/CHANGELOG.md
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [1.7.25](https://github.com/cube-js/cube/compare/v1.7.24...v1.7.25) (2026-08-21)
+
+**Note:** Version bump only for package @cubejs-backend/docker
+
## [1.7.24](https://github.com/cube-js/cube/compare/v1.7.23...v1.7.24) (2026-08-19)
**Note:** Version bump only for package @cubejs-backend/docker
diff --git a/packages/cubejs-docker/package.json b/packages/cubejs-docker/package.json
index 76506fa2d59b8..9256cb63fe245 100644
--- a/packages/cubejs-docker/package.json
+++ b/packages/cubejs-docker/package.json
@@ -1,6 +1,6 @@
{
"name": "@cubejs-backend/docker",
- "version": "1.7.24",
+ "version": "1.7.25",
"description": "Cube.js In Docker (virtual package)",
"author": "Cube Dev, Inc.",
"license": "Apache-2.0",
@@ -9,34 +9,34 @@
"node": ">=20.0.0"
},
"dependencies": {
- "@cubejs-backend/athena-driver": "1.7.24",
- "@cubejs-backend/bigquery-driver": "1.7.24",
- "@cubejs-backend/clickhouse-driver": "1.7.24",
- "@cubejs-backend/crate-driver": "1.7.24",
- "@cubejs-backend/databricks-jdbc-driver": "1.7.24",
- "@cubejs-backend/dbt-schema-extension": "1.7.24",
- "@cubejs-backend/dremio-driver": "1.7.24",
- "@cubejs-backend/druid-driver": "1.7.24",
- "@cubejs-backend/duckdb-driver": "1.7.24",
- "@cubejs-backend/firebolt-driver": "1.7.24",
- "@cubejs-backend/hive-driver": "1.7.24",
- "@cubejs-backend/ksql-driver": "1.7.24",
- "@cubejs-backend/materialize-driver": "1.7.24",
- "@cubejs-backend/mongobi-driver": "1.7.24",
- "@cubejs-backend/mssql-driver": "1.7.24",
- "@cubejs-backend/mysql-driver": "1.7.24",
- "@cubejs-backend/oracle-driver": "1.7.24",
- "@cubejs-backend/pinot-driver": "1.7.24",
- "@cubejs-backend/postgres-driver": "1.7.24",
- "@cubejs-backend/prestodb-driver": "1.7.24",
- "@cubejs-backend/questdb-driver": "1.7.24",
- "@cubejs-backend/redshift-driver": "1.7.24",
- "@cubejs-backend/server": "1.7.24",
- "@cubejs-backend/snowflake-driver": "1.7.24",
- "@cubejs-backend/sqlite-driver": "1.7.24",
- "@cubejs-backend/trino-driver": "1.7.24",
- "@cubejs-backend/vertica-driver": "1.7.24",
- "cubejs-cli": "1.7.24",
+ "@cubejs-backend/athena-driver": "1.7.25",
+ "@cubejs-backend/bigquery-driver": "1.7.25",
+ "@cubejs-backend/clickhouse-driver": "1.7.25",
+ "@cubejs-backend/crate-driver": "1.7.25",
+ "@cubejs-backend/databricks-jdbc-driver": "1.7.25",
+ "@cubejs-backend/dbt-schema-extension": "1.7.25",
+ "@cubejs-backend/dremio-driver": "1.7.25",
+ "@cubejs-backend/druid-driver": "1.7.25",
+ "@cubejs-backend/duckdb-driver": "1.7.25",
+ "@cubejs-backend/firebolt-driver": "1.7.25",
+ "@cubejs-backend/hive-driver": "1.7.25",
+ "@cubejs-backend/ksql-driver": "1.7.25",
+ "@cubejs-backend/materialize-driver": "1.7.25",
+ "@cubejs-backend/mongobi-driver": "1.7.25",
+ "@cubejs-backend/mssql-driver": "1.7.25",
+ "@cubejs-backend/mysql-driver": "1.7.25",
+ "@cubejs-backend/oracle-driver": "1.7.25",
+ "@cubejs-backend/pinot-driver": "1.7.25",
+ "@cubejs-backend/postgres-driver": "1.7.25",
+ "@cubejs-backend/prestodb-driver": "1.7.25",
+ "@cubejs-backend/questdb-driver": "1.7.25",
+ "@cubejs-backend/redshift-driver": "1.7.25",
+ "@cubejs-backend/server": "1.7.25",
+ "@cubejs-backend/snowflake-driver": "1.7.25",
+ "@cubejs-backend/sqlite-driver": "1.7.25",
+ "@cubejs-backend/trino-driver": "1.7.25",
+ "@cubejs-backend/vertica-driver": "1.7.25",
+ "cubejs-cli": "1.7.25",
"typescript": "~5.2.2"
},
"resolutions": {
diff --git a/packages/cubejs-dremio-driver/CHANGELOG.md b/packages/cubejs-dremio-driver/CHANGELOG.md
index 35c10e4a887d0..7b3ffcc23a2e1 100644
--- a/packages/cubejs-dremio-driver/CHANGELOG.md
+++ b/packages/cubejs-dremio-driver/CHANGELOG.md
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [1.7.25](https://github.com/cube-js/cube/compare/v1.7.24...v1.7.25) (2026-08-21)
+
+**Note:** Version bump only for package @cubejs-backend/dremio-driver
+
## [1.7.24](https://github.com/cube-js/cube/compare/v1.7.23...v1.7.24) (2026-08-19)
**Note:** Version bump only for package @cubejs-backend/dremio-driver
diff --git a/packages/cubejs-dremio-driver/package.json b/packages/cubejs-dremio-driver/package.json
index c95be6ba90ce2..3521343d56864 100644
--- a/packages/cubejs-dremio-driver/package.json
+++ b/packages/cubejs-dremio-driver/package.json
@@ -2,7 +2,7 @@
"name": "@cubejs-backend/dremio-driver",
"description": "Cube.js Dremio driver",
"author": "Cube Dev, Inc.",
- "version": "1.7.24",
+ "version": "1.7.25",
"repository": {
"type": "git",
"url": "https://github.com/cube-js/cube.git",
@@ -23,14 +23,14 @@
"lint:fix": "eslint driver/*.js"
},
"dependencies": {
- "@cubejs-backend/base-driver": "1.7.24",
- "@cubejs-backend/schema-compiler": "1.7.24",
- "@cubejs-backend/shared": "1.7.24",
+ "@cubejs-backend/base-driver": "1.7.25",
+ "@cubejs-backend/schema-compiler": "1.7.25",
+ "@cubejs-backend/shared": "1.7.25",
"axios": "^1.8.3"
},
"devDependencies": {
- "@cubejs-backend/linter": "1.7.24",
- "@cubejs-backend/testing-shared": "1.7.24",
+ "@cubejs-backend/linter": "1.7.25",
+ "@cubejs-backend/testing-shared": "1.7.25",
"jest": "^29"
},
"license": "Apache-2.0",
diff --git a/packages/cubejs-druid-driver/CHANGELOG.md b/packages/cubejs-druid-driver/CHANGELOG.md
index 3f0267dd71712..e234d04827434 100644
--- a/packages/cubejs-druid-driver/CHANGELOG.md
+++ b/packages/cubejs-druid-driver/CHANGELOG.md
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [1.7.25](https://github.com/cube-js/cube/compare/v1.7.24...v1.7.25) (2026-08-21)
+
+**Note:** Version bump only for package @cubejs-backend/druid-driver
+
## [1.7.24](https://github.com/cube-js/cube/compare/v1.7.23...v1.7.24) (2026-08-19)
**Note:** Version bump only for package @cubejs-backend/druid-driver
diff --git a/packages/cubejs-druid-driver/package.json b/packages/cubejs-druid-driver/package.json
index 91b9b5751902c..25a54edfd1ea0 100644
--- a/packages/cubejs-druid-driver/package.json
+++ b/packages/cubejs-druid-driver/package.json
@@ -2,7 +2,7 @@
"name": "@cubejs-backend/druid-driver",
"description": "Cube.js Druid database driver",
"author": "Cube Dev, Inc.",
- "version": "1.7.24",
+ "version": "1.7.25",
"license": "Apache-2.0",
"repository": {
"type": "git",
@@ -28,13 +28,13 @@
"dist/src/*"
],
"dependencies": {
- "@cubejs-backend/base-driver": "1.7.24",
- "@cubejs-backend/schema-compiler": "1.7.24",
- "@cubejs-backend/shared": "1.7.24",
+ "@cubejs-backend/base-driver": "1.7.25",
+ "@cubejs-backend/schema-compiler": "1.7.25",
+ "@cubejs-backend/shared": "1.7.25",
"axios": "^1.8.3"
},
"devDependencies": {
- "@cubejs-backend/linter": "1.7.24",
+ "@cubejs-backend/linter": "1.7.25",
"@types/jest": "^29",
"@types/node": "^22",
"jest": "^29",
diff --git a/packages/cubejs-duckdb-driver/CHANGELOG.md b/packages/cubejs-duckdb-driver/CHANGELOG.md
index e789cc5a3df8c..d6f349f5f56fe 100644
--- a/packages/cubejs-duckdb-driver/CHANGELOG.md
+++ b/packages/cubejs-duckdb-driver/CHANGELOG.md
@@ -3,6 +3,12 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [1.7.25](https://github.com/cube-js/cube/compare/v1.7.24...v1.7.25) (2026-08-21)
+
+### Bug Fixes
+
+- **cubesql:** Support `DATE_ADD` SQL pushdown ([#11539](https://github.com/cube-js/cube/issues/11539)) ([3051ccd](https://github.com/cube-js/cube/commit/3051ccd8c634941dce80235a0e6e823fa8586355))
+
## [1.7.24](https://github.com/cube-js/cube/compare/v1.7.23...v1.7.24) (2026-08-19)
**Note:** Version bump only for package @cubejs-backend/duckdb-driver
diff --git a/packages/cubejs-duckdb-driver/package.json b/packages/cubejs-duckdb-driver/package.json
index 31195c8a7bcec..3dcf19a9ffbe4 100644
--- a/packages/cubejs-duckdb-driver/package.json
+++ b/packages/cubejs-duckdb-driver/package.json
@@ -2,7 +2,7 @@
"name": "@cubejs-backend/duckdb-driver",
"description": "Cube DuckDB database driver",
"author": "Cube Dev, Inc.",
- "version": "1.7.24",
+ "version": "1.7.25",
"repository": {
"type": "git",
"url": "https://github.com/cube-js/cube.git",
@@ -28,15 +28,15 @@
"lint:fix": "eslint --fix src/* --ext .ts"
},
"dependencies": {
- "@cubejs-backend/base-driver": "1.7.24",
- "@cubejs-backend/schema-compiler": "1.7.24",
- "@cubejs-backend/shared": "1.7.24",
+ "@cubejs-backend/base-driver": "1.7.25",
+ "@cubejs-backend/schema-compiler": "1.7.25",
+ "@cubejs-backend/shared": "1.7.25",
"duckdb": "^1.4.1"
},
"license": "Apache-2.0",
"devDependencies": {
- "@cubejs-backend/linter": "1.7.24",
- "@cubejs-backend/testing-shared": "1.7.24",
+ "@cubejs-backend/linter": "1.7.25",
+ "@cubejs-backend/testing-shared": "1.7.25",
"@types/jest": "^29",
"@types/node": "^22",
"jest": "^29",
diff --git a/packages/cubejs-firebolt-driver/CHANGELOG.md b/packages/cubejs-firebolt-driver/CHANGELOG.md
index 1dc433e3bd68e..139b966ab7d7f 100644
--- a/packages/cubejs-firebolt-driver/CHANGELOG.md
+++ b/packages/cubejs-firebolt-driver/CHANGELOG.md
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [1.7.25](https://github.com/cube-js/cube/compare/v1.7.24...v1.7.25) (2026-08-21)
+
+**Note:** Version bump only for package @cubejs-backend/firebolt-driver
+
## [1.7.24](https://github.com/cube-js/cube/compare/v1.7.23...v1.7.24) (2026-08-19)
**Note:** Version bump only for package @cubejs-backend/firebolt-driver
diff --git a/packages/cubejs-firebolt-driver/package.json b/packages/cubejs-firebolt-driver/package.json
index b20a745c561e4..3363e309f15b5 100644
--- a/packages/cubejs-firebolt-driver/package.json
+++ b/packages/cubejs-firebolt-driver/package.json
@@ -2,7 +2,7 @@
"name": "@cubejs-backend/firebolt-driver",
"description": "Cube.js Firebolt database driver",
"author": "Cube Dev, Inc.",
- "version": "1.7.24",
+ "version": "1.7.25",
"repository": {
"type": "git",
"url": "https://github.com/cube-js/cube.git",
@@ -28,15 +28,15 @@
"lint:fix": "eslint --fix src/* --ext .ts"
},
"dependencies": {
- "@cubejs-backend/base-driver": "1.7.24",
- "@cubejs-backend/schema-compiler": "1.7.24",
- "@cubejs-backend/shared": "1.7.24",
+ "@cubejs-backend/base-driver": "1.7.25",
+ "@cubejs-backend/schema-compiler": "1.7.25",
+ "@cubejs-backend/shared": "1.7.25",
"firebolt-sdk": "1.10.0"
},
"license": "Apache-2.0",
"devDependencies": {
- "@cubejs-backend/linter": "1.7.24",
- "@cubejs-backend/testing-shared": "1.7.24",
+ "@cubejs-backend/linter": "1.7.25",
+ "@cubejs-backend/testing-shared": "1.7.25",
"typescript": "~5.2.2"
},
"publishConfig": {
diff --git a/packages/cubejs-hive-driver/CHANGELOG.md b/packages/cubejs-hive-driver/CHANGELOG.md
index dd8910338677b..a75b30a65e1df 100644
--- a/packages/cubejs-hive-driver/CHANGELOG.md
+++ b/packages/cubejs-hive-driver/CHANGELOG.md
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [1.7.25](https://github.com/cube-js/cube/compare/v1.7.24...v1.7.25) (2026-08-21)
+
+**Note:** Version bump only for package @cubejs-backend/hive-driver
+
## [1.7.24](https://github.com/cube-js/cube/compare/v1.7.23...v1.7.24) (2026-08-19)
**Note:** Version bump only for package @cubejs-backend/hive-driver
diff --git a/packages/cubejs-hive-driver/package.json b/packages/cubejs-hive-driver/package.json
index b8d45847a8007..cb0f4bc7a89ab 100644
--- a/packages/cubejs-hive-driver/package.json
+++ b/packages/cubejs-hive-driver/package.json
@@ -2,7 +2,7 @@
"name": "@cubejs-backend/hive-driver",
"description": "Cube.js Hive database driver",
"author": "Cube Dev, Inc.",
- "version": "1.7.24",
+ "version": "1.7.25",
"repository": {
"type": "git",
"url": "https://github.com/cube-js/cube.git",
@@ -17,8 +17,8 @@
"lint:fix": "eslint --fix src/* --ext .ts"
},
"dependencies": {
- "@cubejs-backend/base-driver": "1.7.24",
- "@cubejs-backend/shared": "1.7.24",
+ "@cubejs-backend/base-driver": "1.7.25",
+ "@cubejs-backend/shared": "1.7.25",
"jshs2": "^0.4.4",
"sasl-plain": "^0.1.0",
"saslmechanisms": "^0.1.1",
@@ -27,7 +27,7 @@
},
"license": "Apache-2.0",
"devDependencies": {
- "@cubejs-backend/linter": "1.7.24"
+ "@cubejs-backend/linter": "1.7.25"
},
"publishConfig": {
"access": "public"
diff --git a/packages/cubejs-jdbc-driver/CHANGELOG.md b/packages/cubejs-jdbc-driver/CHANGELOG.md
index 75a7b81ec1839..31aad128f7f12 100644
--- a/packages/cubejs-jdbc-driver/CHANGELOG.md
+++ b/packages/cubejs-jdbc-driver/CHANGELOG.md
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [1.7.25](https://github.com/cube-js/cube/compare/v1.7.24...v1.7.25) (2026-08-21)
+
+**Note:** Version bump only for package @cubejs-backend/jdbc-driver
+
## [1.7.24](https://github.com/cube-js/cube/compare/v1.7.23...v1.7.24) (2026-08-19)
**Note:** Version bump only for package @cubejs-backend/jdbc-driver
diff --git a/packages/cubejs-jdbc-driver/package.json b/packages/cubejs-jdbc-driver/package.json
index 504d30f435dec..95191bb392601 100644
--- a/packages/cubejs-jdbc-driver/package.json
+++ b/packages/cubejs-jdbc-driver/package.json
@@ -2,7 +2,7 @@
"name": "@cubejs-backend/jdbc-driver",
"description": "Cube.js JDBC database driver",
"author": "Cube Dev, Inc.",
- "version": "1.7.24",
+ "version": "1.7.25",
"repository": {
"type": "git",
"url": "https://github.com/cube-js/cube.git",
@@ -26,9 +26,9 @@
"index.js"
],
"dependencies": {
- "@cubejs-backend/base-driver": "1.7.24",
+ "@cubejs-backend/base-driver": "1.7.25",
"@cubejs-backend/node-java-maven": "^0.1.3",
- "@cubejs-backend/shared": "1.7.24"
+ "@cubejs-backend/shared": "1.7.25"
},
"optionalDependencies": {
"@cubejs-backend/jdbc": "^0.9.0",
@@ -42,7 +42,7 @@
"testEnvironment": "node"
},
"devDependencies": {
- "@cubejs-backend/linter": "1.7.24",
+ "@cubejs-backend/linter": "1.7.25",
"@types/node": "^22",
"typescript": "~5.2.2"
}
diff --git a/packages/cubejs-ksql-driver/CHANGELOG.md b/packages/cubejs-ksql-driver/CHANGELOG.md
index dcde5d94af76a..54ae6efb70db5 100644
--- a/packages/cubejs-ksql-driver/CHANGELOG.md
+++ b/packages/cubejs-ksql-driver/CHANGELOG.md
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [1.7.25](https://github.com/cube-js/cube/compare/v1.7.24...v1.7.25) (2026-08-21)
+
+**Note:** Version bump only for package @cubejs-backend/ksql-driver
+
## [1.7.24](https://github.com/cube-js/cube/compare/v1.7.23...v1.7.24) (2026-08-19)
**Note:** Version bump only for package @cubejs-backend/ksql-driver
diff --git a/packages/cubejs-ksql-driver/package.json b/packages/cubejs-ksql-driver/package.json
index 74ff137299d30..c59e7579067c2 100644
--- a/packages/cubejs-ksql-driver/package.json
+++ b/packages/cubejs-ksql-driver/package.json
@@ -2,7 +2,7 @@
"name": "@cubejs-backend/ksql-driver",
"description": "Cube.js ksql database driver",
"author": "Cube Dev, Inc.",
- "version": "1.7.24",
+ "version": "1.7.25",
"repository": {
"type": "git",
"url": "https://github.com/cube-js/cube.git",
@@ -26,9 +26,9 @@
"lint:fix": "eslint --fix src/* --ext .ts"
},
"dependencies": {
- "@cubejs-backend/base-driver": "1.7.24",
- "@cubejs-backend/schema-compiler": "1.7.24",
- "@cubejs-backend/shared": "1.7.24",
+ "@cubejs-backend/base-driver": "1.7.25",
+ "@cubejs-backend/schema-compiler": "1.7.25",
+ "@cubejs-backend/shared": "1.7.25",
"async-mutex": "0.3.2",
"axios": "^1.8.3",
"kafkajs": "^2.2.3"
@@ -41,7 +41,7 @@
"extends": "../cubejs-linter"
},
"devDependencies": {
- "@cubejs-backend/linter": "1.7.24",
+ "@cubejs-backend/linter": "1.7.25",
"typescript": "~5.2.2"
}
}
diff --git a/packages/cubejs-linter/CHANGELOG.md b/packages/cubejs-linter/CHANGELOG.md
index 852a5043e649f..af812e06c480c 100644
--- a/packages/cubejs-linter/CHANGELOG.md
+++ b/packages/cubejs-linter/CHANGELOG.md
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [1.7.25](https://github.com/cube-js/cube/compare/v1.7.24...v1.7.25) (2026-08-21)
+
+**Note:** Version bump only for package @cubejs-backend/linter
+
## [1.7.24](https://github.com/cube-js/cube/compare/v1.7.23...v1.7.24) (2026-08-19)
**Note:** Version bump only for package @cubejs-backend/linter
diff --git a/packages/cubejs-linter/package.json b/packages/cubejs-linter/package.json
index 0350cceba50ea..0511d8771b5cc 100644
--- a/packages/cubejs-linter/package.json
+++ b/packages/cubejs-linter/package.json
@@ -2,7 +2,7 @@
"name": "@cubejs-backend/linter",
"description": "Cube.js ESLint (virtual package) for linting code",
"author": "Cube Dev, Inc.",
- "version": "1.7.24",
+ "version": "1.7.25",
"repository": {
"type": "git",
"url": "https://github.com/cube-js/cube.git",
diff --git a/packages/cubejs-materialize-driver/CHANGELOG.md b/packages/cubejs-materialize-driver/CHANGELOG.md
index f03f8344bfd9d..90c2e0dc1f773 100644
--- a/packages/cubejs-materialize-driver/CHANGELOG.md
+++ b/packages/cubejs-materialize-driver/CHANGELOG.md
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [1.7.25](https://github.com/cube-js/cube/compare/v1.7.24...v1.7.25) (2026-08-21)
+
+**Note:** Version bump only for package @cubejs-backend/materialize-driver
+
## [1.7.24](https://github.com/cube-js/cube/compare/v1.7.23...v1.7.24) (2026-08-19)
**Note:** Version bump only for package @cubejs-backend/materialize-driver
diff --git a/packages/cubejs-materialize-driver/package.json b/packages/cubejs-materialize-driver/package.json
index 62da36bedaeb9..8ccae773bc8c4 100644
--- a/packages/cubejs-materialize-driver/package.json
+++ b/packages/cubejs-materialize-driver/package.json
@@ -2,7 +2,7 @@
"name": "@cubejs-backend/materialize-driver",
"description": "Cube.js Materialize database driver",
"author": "Cube Dev, Inc.",
- "version": "1.7.24",
+ "version": "1.7.25",
"repository": {
"type": "git",
"url": "https://github.com/cube-js/cube.git",
@@ -27,15 +27,15 @@
"lint:fix": "eslint --fix src/* --ext .ts"
},
"dependencies": {
- "@cubejs-backend/base-driver": "1.7.24",
- "@cubejs-backend/postgres-driver": "1.7.24",
- "@cubejs-backend/shared": "1.7.24",
+ "@cubejs-backend/base-driver": "1.7.25",
+ "@cubejs-backend/postgres-driver": "1.7.25",
+ "@cubejs-backend/shared": "1.7.25",
"semver": "^7.6.3"
},
"license": "Apache-2.0",
"devDependencies": {
- "@cubejs-backend/linter": "1.7.24",
- "@cubejs-backend/testing": "1.7.24",
+ "@cubejs-backend/linter": "1.7.25",
+ "@cubejs-backend/testing": "1.7.25",
"typescript": "~5.2.2"
},
"publishConfig": {
diff --git a/packages/cubejs-mongobi-driver/CHANGELOG.md b/packages/cubejs-mongobi-driver/CHANGELOG.md
index c3395ab27c9ba..27fa6a45f27fd 100644
--- a/packages/cubejs-mongobi-driver/CHANGELOG.md
+++ b/packages/cubejs-mongobi-driver/CHANGELOG.md
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [1.7.25](https://github.com/cube-js/cube/compare/v1.7.24...v1.7.25) (2026-08-21)
+
+**Note:** Version bump only for package @cubejs-backend/mongobi-driver
+
## [1.7.24](https://github.com/cube-js/cube/compare/v1.7.23...v1.7.24) (2026-08-19)
**Note:** Version bump only for package @cubejs-backend/mongobi-driver
diff --git a/packages/cubejs-mongobi-driver/package.json b/packages/cubejs-mongobi-driver/package.json
index a157a3678dcb3..a090a7a686f9d 100644
--- a/packages/cubejs-mongobi-driver/package.json
+++ b/packages/cubejs-mongobi-driver/package.json
@@ -2,7 +2,7 @@
"name": "@cubejs-backend/mongobi-driver",
"description": "Cube.js MongoBI driver",
"author": "krunalsabnis@gmail.com",
- "version": "1.7.24",
+ "version": "1.7.25",
"repository": {
"type": "git",
"url": "https://github.com/cube-js/cube.git",
@@ -27,8 +27,8 @@
"integration:mongobi": "jest dist/test"
},
"dependencies": {
- "@cubejs-backend/base-driver": "1.7.24",
- "@cubejs-backend/shared": "1.7.24",
+ "@cubejs-backend/base-driver": "1.7.25",
+ "@cubejs-backend/shared": "1.7.25",
"@types/node": "^22",
"moment": "^2.29.1",
"mysql2": "^3.11.5"
@@ -38,7 +38,7 @@
"access": "public"
},
"devDependencies": {
- "@cubejs-backend/linter": "1.7.24",
+ "@cubejs-backend/linter": "1.7.25",
"testcontainers": "^10.28.0",
"typescript": "~5.2.2"
},
diff --git a/packages/cubejs-mssql-driver/CHANGELOG.md b/packages/cubejs-mssql-driver/CHANGELOG.md
index c917cf88369d8..bd10b7b10a04d 100644
--- a/packages/cubejs-mssql-driver/CHANGELOG.md
+++ b/packages/cubejs-mssql-driver/CHANGELOG.md
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [1.7.25](https://github.com/cube-js/cube/compare/v1.7.24...v1.7.25) (2026-08-21)
+
+**Note:** Version bump only for package @cubejs-backend/mssql-driver
+
## [1.7.24](https://github.com/cube-js/cube/compare/v1.7.23...v1.7.24) (2026-08-19)
**Note:** Version bump only for package @cubejs-backend/mssql-driver
diff --git a/packages/cubejs-mssql-driver/package.json b/packages/cubejs-mssql-driver/package.json
index 47865653991bb..f86ec159d774b 100644
--- a/packages/cubejs-mssql-driver/package.json
+++ b/packages/cubejs-mssql-driver/package.json
@@ -2,7 +2,7 @@
"name": "@cubejs-backend/mssql-driver",
"description": "Cube.js MS SQL database driver",
"author": "Cube Dev, Inc.",
- "version": "1.7.24",
+ "version": "1.7.25",
"repository": {
"type": "git",
"url": "https://github.com/cube-js/cube.git",
@@ -25,8 +25,8 @@
"lint:fix": "eslint --fix src/* --ext .ts,.js"
},
"dependencies": {
- "@cubejs-backend/base-driver": "1.7.24",
- "@cubejs-backend/shared": "1.7.24",
+ "@cubejs-backend/base-driver": "1.7.25",
+ "@cubejs-backend/shared": "1.7.25",
"mssql": "^11.0.1"
},
"devDependencies": {
diff --git a/packages/cubejs-mysql-aurora-serverless-driver/CHANGELOG.md b/packages/cubejs-mysql-aurora-serverless-driver/CHANGELOG.md
index eff43e5794f1f..b9327bd3202e3 100644
--- a/packages/cubejs-mysql-aurora-serverless-driver/CHANGELOG.md
+++ b/packages/cubejs-mysql-aurora-serverless-driver/CHANGELOG.md
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [1.7.25](https://github.com/cube-js/cube/compare/v1.7.24...v1.7.25) (2026-08-21)
+
+**Note:** Version bump only for package @cubejs-backend/mysql-aurora-serverless-driver
+
## [1.7.24](https://github.com/cube-js/cube/compare/v1.7.23...v1.7.24) (2026-08-19)
**Note:** Version bump only for package @cubejs-backend/mysql-aurora-serverless-driver
diff --git a/packages/cubejs-mysql-aurora-serverless-driver/package.json b/packages/cubejs-mysql-aurora-serverless-driver/package.json
index 5e092d3f31388..833091710c909 100644
--- a/packages/cubejs-mysql-aurora-serverless-driver/package.json
+++ b/packages/cubejs-mysql-aurora-serverless-driver/package.json
@@ -2,7 +2,7 @@
"name": "@cubejs-backend/mysql-aurora-serverless-driver",
"description": "Cube.js Aurora Serverless Mysql database driver",
"author": "Cube Dev, Inc.",
- "version": "1.7.24",
+ "version": "1.7.25",
"repository": {
"type": "git",
"url": "https://github.com/cube-js/cube.git",
@@ -21,14 +21,14 @@
"lint": "eslint driver/*.js test/*.js"
},
"dependencies": {
- "@cubejs-backend/base-driver": "1.7.24",
- "@cubejs-backend/shared": "1.7.24",
+ "@cubejs-backend/base-driver": "1.7.25",
+ "@cubejs-backend/shared": "1.7.25",
"@types/mysql": "^2.15.15",
"aws-sdk": "^2.787.0",
"data-api-client": "^1.1.0"
},
"devDependencies": {
- "@cubejs-backend/linter": "1.7.24",
+ "@cubejs-backend/linter": "1.7.25",
"@types/data-api-client": "^1.2.1",
"@types/jest": "^29",
"jest": "^29",
diff --git a/packages/cubejs-mysql-driver/CHANGELOG.md b/packages/cubejs-mysql-driver/CHANGELOG.md
index cd68d1846f0cd..eeb334167e223 100644
--- a/packages/cubejs-mysql-driver/CHANGELOG.md
+++ b/packages/cubejs-mysql-driver/CHANGELOG.md
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [1.7.25](https://github.com/cube-js/cube/compare/v1.7.24...v1.7.25) (2026-08-21)
+
+**Note:** Version bump only for package @cubejs-backend/mysql-driver
+
## [1.7.24](https://github.com/cube-js/cube/compare/v1.7.23...v1.7.24) (2026-08-19)
**Note:** Version bump only for package @cubejs-backend/mysql-driver
diff --git a/packages/cubejs-mysql-driver/package.json b/packages/cubejs-mysql-driver/package.json
index cd8e559995d13..eb614be98e987 100644
--- a/packages/cubejs-mysql-driver/package.json
+++ b/packages/cubejs-mysql-driver/package.json
@@ -2,7 +2,7 @@
"name": "@cubejs-backend/mysql-driver",
"description": "Cube.js Mysql database driver",
"author": "Cube Dev, Inc.",
- "version": "1.7.24",
+ "version": "1.7.25",
"repository": {
"type": "git",
"url": "https://github.com/cube-js/cube.git",
@@ -27,13 +27,13 @@
"lint:fix": "eslint --fix src/* test/* --ext .ts,.js"
},
"dependencies": {
- "@cubejs-backend/base-driver": "1.7.24",
- "@cubejs-backend/shared": "1.7.24",
+ "@cubejs-backend/base-driver": "1.7.25",
+ "@cubejs-backend/shared": "1.7.25",
"mysql2": "^3.16.1"
},
"devDependencies": {
- "@cubejs-backend/linter": "1.7.24",
- "@cubejs-backend/testing-shared": "1.7.24",
+ "@cubejs-backend/linter": "1.7.25",
+ "@cubejs-backend/testing-shared": "1.7.25",
"@types/jest": "^29",
"jest": "^29",
"stream-to-array": "^2.3.0",
diff --git a/packages/cubejs-oracle-driver/CHANGELOG.md b/packages/cubejs-oracle-driver/CHANGELOG.md
index 9b068c6b0ddd7..1bd3112b1bf8e 100644
--- a/packages/cubejs-oracle-driver/CHANGELOG.md
+++ b/packages/cubejs-oracle-driver/CHANGELOG.md
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [1.7.25](https://github.com/cube-js/cube/compare/v1.7.24...v1.7.25) (2026-08-21)
+
+**Note:** Version bump only for package @cubejs-backend/oracle-driver
+
## [1.7.24](https://github.com/cube-js/cube/compare/v1.7.23...v1.7.24) (2026-08-19)
**Note:** Version bump only for package @cubejs-backend/oracle-driver
diff --git a/packages/cubejs-oracle-driver/package.json b/packages/cubejs-oracle-driver/package.json
index 1a826f5b543dd..b71b31ed9d08f 100644
--- a/packages/cubejs-oracle-driver/package.json
+++ b/packages/cubejs-oracle-driver/package.json
@@ -2,7 +2,7 @@
"name": "@cubejs-backend/oracle-driver",
"description": "Cube.js oracle database driver",
"author": "Cube Dev, Inc.",
- "version": "1.7.24",
+ "version": "1.7.25",
"repository": {
"type": "git",
"url": "https://github.com/cube-js/cube.git",
@@ -13,8 +13,8 @@
},
"main": "driver/OracleDriver.js",
"dependencies": {
- "@cubejs-backend/base-driver": "1.7.24",
- "@cubejs-backend/shared": "1.7.24",
+ "@cubejs-backend/base-driver": "1.7.25",
+ "@cubejs-backend/shared": "1.7.25",
"ramda": "^0.27.0"
},
"devDependencies": {
diff --git a/packages/cubejs-pinot-driver/CHANGELOG.md b/packages/cubejs-pinot-driver/CHANGELOG.md
index a927c123c0bf3..855837b1868a4 100644
--- a/packages/cubejs-pinot-driver/CHANGELOG.md
+++ b/packages/cubejs-pinot-driver/CHANGELOG.md
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [1.7.25](https://github.com/cube-js/cube/compare/v1.7.24...v1.7.25) (2026-08-21)
+
+**Note:** Version bump only for package @cubejs-backend/pinot-driver
+
## [1.7.24](https://github.com/cube-js/cube/compare/v1.7.23...v1.7.24) (2026-08-19)
**Note:** Version bump only for package @cubejs-backend/pinot-driver
diff --git a/packages/cubejs-pinot-driver/package.json b/packages/cubejs-pinot-driver/package.json
index 19d39f6f17ea4..ee7afdfc71c01 100644
--- a/packages/cubejs-pinot-driver/package.json
+++ b/packages/cubejs-pinot-driver/package.json
@@ -2,7 +2,7 @@
"name": "@cubejs-backend/pinot-driver",
"description": "Cube.js Pinot database driver",
"author": "Julian Ronsse, InTheMemory, Cube Dev, Inc.",
- "version": "1.7.24",
+ "version": "1.7.25",
"repository": {
"type": "git",
"url": "https://github.com/cube-js/cube.git",
@@ -28,9 +28,9 @@
"lint:fix": "eslint --fix src/* --ext .ts"
},
"dependencies": {
- "@cubejs-backend/base-driver": "1.7.24",
- "@cubejs-backend/schema-compiler": "1.7.24",
- "@cubejs-backend/shared": "1.7.24",
+ "@cubejs-backend/base-driver": "1.7.25",
+ "@cubejs-backend/schema-compiler": "1.7.25",
+ "@cubejs-backend/shared": "1.7.25",
"node-fetch": "^2.6.1",
"ramda": "^0.27.2"
},
@@ -39,7 +39,7 @@
"access": "public"
},
"devDependencies": {
- "@cubejs-backend/linter": "1.7.24",
+ "@cubejs-backend/linter": "1.7.25",
"@types/jest": "^29",
"jest": "^29",
"should": "^13.2.3",
diff --git a/packages/cubejs-playground/CHANGELOG.md b/packages/cubejs-playground/CHANGELOG.md
index 59c19a217feb5..082bd415132d1 100644
--- a/packages/cubejs-playground/CHANGELOG.md
+++ b/packages/cubejs-playground/CHANGELOG.md
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [1.7.25](https://github.com/cube-js/cube/compare/v1.7.24...v1.7.25) (2026-08-21)
+
+**Note:** Version bump only for package @cubejs-client/playground
+
## [1.7.24](https://github.com/cube-js/cube/compare/v1.7.23...v1.7.24) (2026-08-19)
**Note:** Version bump only for package @cubejs-client/playground
diff --git a/packages/cubejs-playground/package.json b/packages/cubejs-playground/package.json
index f9068563d0cd1..978ba4a4a5cbc 100644
--- a/packages/cubejs-playground/package.json
+++ b/packages/cubejs-playground/package.json
@@ -1,7 +1,7 @@
{
"name": "@cubejs-client/playground",
"author": "Cube Dev, Inc.",
- "version": "1.7.24",
+ "version": "1.7.25",
"engines": {},
"repository": {
"type": "git",
@@ -68,8 +68,8 @@
"@ant-design/compatible": "^1.0.1",
"@ant-design/icons": "^5.3.5",
"@cube-dev/ui-kit": "0.52.3",
- "@cubejs-client/core": "1.7.24",
- "@cubejs-client/react": "1.7.24",
+ "@cubejs-client/core": "1.7.25",
+ "@cubejs-client/react": "1.7.25",
"@types/flexsearch": "^0.7.3",
"@types/node": "^22",
"@types/react": "^18.3.4",
diff --git a/packages/cubejs-postgres-driver/CHANGELOG.md b/packages/cubejs-postgres-driver/CHANGELOG.md
index c214d4b4b7db5..448bd9768a069 100644
--- a/packages/cubejs-postgres-driver/CHANGELOG.md
+++ b/packages/cubejs-postgres-driver/CHANGELOG.md
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [1.7.25](https://github.com/cube-js/cube/compare/v1.7.24...v1.7.25) (2026-08-21)
+
+**Note:** Version bump only for package @cubejs-backend/postgres-driver
+
## [1.7.24](https://github.com/cube-js/cube/compare/v1.7.23...v1.7.24) (2026-08-19)
**Note:** Version bump only for package @cubejs-backend/postgres-driver
diff --git a/packages/cubejs-postgres-driver/package.json b/packages/cubejs-postgres-driver/package.json
index 1c463f6ff58fe..9256f839d4f87 100644
--- a/packages/cubejs-postgres-driver/package.json
+++ b/packages/cubejs-postgres-driver/package.json
@@ -2,7 +2,7 @@
"name": "@cubejs-backend/postgres-driver",
"description": "Cube.js Postgres database driver",
"author": "Cube Dev, Inc.",
- "version": "1.7.24",
+ "version": "1.7.25",
"repository": {
"type": "git",
"url": "https://github.com/cube-js/cube.git",
@@ -27,8 +27,8 @@
"lint:fix": "eslint --fix src/* --ext .ts"
},
"dependencies": {
- "@cubejs-backend/base-driver": "1.7.24",
- "@cubejs-backend/shared": "1.7.24",
+ "@cubejs-backend/base-driver": "1.7.25",
+ "@cubejs-backend/shared": "1.7.25",
"@types/pg": "^8.16.0",
"@types/pg-query-stream": "^1.0.3",
"pg": "^8.18.0",
@@ -36,8 +36,8 @@
},
"license": "Apache-2.0",
"devDependencies": {
- "@cubejs-backend/linter": "1.7.24",
- "@cubejs-backend/testing-shared": "1.7.24",
+ "@cubejs-backend/linter": "1.7.25",
+ "@cubejs-backend/testing-shared": "1.7.25",
"testcontainers": "^10.28.0",
"typescript": "~5.2.2"
},
diff --git a/packages/cubejs-prestodb-driver/CHANGELOG.md b/packages/cubejs-prestodb-driver/CHANGELOG.md
index 79dbc118c043c..23614f006c4e2 100644
--- a/packages/cubejs-prestodb-driver/CHANGELOG.md
+++ b/packages/cubejs-prestodb-driver/CHANGELOG.md
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [1.7.25](https://github.com/cube-js/cube/compare/v1.7.24...v1.7.25) (2026-08-21)
+
+**Note:** Version bump only for package @cubejs-backend/prestodb-driver
+
## [1.7.24](https://github.com/cube-js/cube/compare/v1.7.23...v1.7.24) (2026-08-19)
**Note:** Version bump only for package @cubejs-backend/prestodb-driver
diff --git a/packages/cubejs-prestodb-driver/package.json b/packages/cubejs-prestodb-driver/package.json
index 7a1a48ba4116f..4dc4dfeeaa17a 100644
--- a/packages/cubejs-prestodb-driver/package.json
+++ b/packages/cubejs-prestodb-driver/package.json
@@ -2,7 +2,7 @@
"name": "@cubejs-backend/prestodb-driver",
"description": "Cube.js Presto database driver",
"author": "Cube Dev, Inc.",
- "version": "1.7.24",
+ "version": "1.7.25",
"repository": {
"type": "git",
"url": "https://github.com/cube-js/cube.git",
@@ -28,8 +28,8 @@
"lint:fix": "eslint --fix src/* --ext .ts"
},
"dependencies": {
- "@cubejs-backend/base-driver": "1.7.24",
- "@cubejs-backend/shared": "1.7.24",
+ "@cubejs-backend/base-driver": "1.7.25",
+ "@cubejs-backend/shared": "1.7.25",
"presto-client": "1.2.0",
"ramda": "^0.27.0"
},
@@ -38,7 +38,7 @@
"access": "public"
},
"devDependencies": {
- "@cubejs-backend/linter": "1.7.24",
+ "@cubejs-backend/linter": "1.7.25",
"@types/jest": "^29",
"jest": "^29",
"should": "^13.2.3",
diff --git a/packages/cubejs-query-orchestrator/CHANGELOG.md b/packages/cubejs-query-orchestrator/CHANGELOG.md
index ed11211cf1dc1..97b0115011eed 100644
--- a/packages/cubejs-query-orchestrator/CHANGELOG.md
+++ b/packages/cubejs-query-orchestrator/CHANGELOG.md
@@ -3,6 +3,12 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [1.7.25](https://github.com/cube-js/cube/compare/v1.7.24...v1.7.25) (2026-08-21)
+
+### Features
+
+- **cubestore:** Support QUEUE ADD_AND_RETRIEVE command ([#11590](https://github.com/cube-js/cube/issues/11590)) ([73ec070](https://github.com/cube-js/cube/commit/73ec070d55edf2c2fa4d70bbce1f37d735ce40cd))
+
## [1.7.24](https://github.com/cube-js/cube/compare/v1.7.23...v1.7.24) (2026-08-19)
**Note:** Version bump only for package @cubejs-backend/query-orchestrator
diff --git a/packages/cubejs-query-orchestrator/DEVELOPMENT.md b/packages/cubejs-query-orchestrator/DEVELOPMENT.md
index 97ae5a6b5b8c1..640f7043dfc3f 100644
--- a/packages/cubejs-query-orchestrator/DEVELOPMENT.md
+++ b/packages/cubejs-query-orchestrator/DEVELOPMENT.md
@@ -10,9 +10,13 @@ Two participants matter when reading the diagrams:
- **QueryQueue** — the request side. It enqueues and then waits for a result.
- **BackgroundQueryQueue** — the same `QueryQueue` object, but the code paths reached
- through `processQuery`, which run detached from the request (in cluster mode they can
+ through `executeQuery`, which run detached from the request (in cluster mode they can
even run on another node).
+Claiming and executing are two separate steps: `processQuery` claims an item and then hands
+the claim to `sendProcessMessageFn`, which executes it through `executeQuery`. See
+"Background execution" below.
+
## Cube Store responses as TS types
```typescript
@@ -169,29 +173,52 @@ sequenceDiagram
Note over QueryQueue: toProcessLimit = active >= concurrency
? 1 : concurrency - active
Persistent queries: only own processUid
loop for every query within toProcessLimit
- QueryQueue-)Background: processQuery
- Note over QueryQueue,Background: Detached call, reconcile does not
wait for the query to finish
+ QueryQueue->>QueryQueue: processQuery
+ Note over QueryQueue,Background: Awaits the claim only, not the execution
end
end
```
-## Background execution: `processQuery`
+## Background execution: `processQuery` → `executeQuery`
+
+`processQuery` claims the item and nothing else. What it hands to `sendProcessMessageFn` is a
+`ClaimedQuery` — `{ queryKeyHash, queueId, processingId, queueSize, query }`, plain data on
+purpose, so a custom implementation can serialize it and let another process run
+`executeQuery`. The default implementation calls `executeQuery` in-process.
+
+`sendProcessMessageFn` must resolve once the hand-off is done, **not** once the query is
+executed: reconcile awaits it, and `executeQuery` ends with `reconcileQueue`, which is
+single-flight — awaiting the execution from inside reconcile deadlocks.
+
+Two consequences of claiming before the hand-off:
+
+- Stream queries have to be executed by the process that claimed them, their streams live in
+ the in-process `QueryQueue.streams` map. Reconcile only picks up persistent keys whose
+ `@` suffix matches, so `sendProcessMessageFn` is always called on the owning
+ process for them — it just must not route them elsewhere.
+- A claimed item is already active. If a custom hand-off loses the message, the item is only
+ recovered by the stalled-heartbeat / `TO_CANCEL` path; `freeProcessingLock` is a no-op on
+ Cube Store, so the claim cannot be cheaply undone.
```mermaid
sequenceDiagram
autonumber
+ participant QueryQueue
participant BackgroundQueryQueue as Background
participant QueueDriverInterface as QueueDriver
participant CubeStore
participant QueryOrchestrator
- Background->>QueueDriver: retrieveForProcessing
+ QueryQueue->>QueueDriver: retrieveForProcessing
QueueDriver->>CubeStore: QUEUE RETRIEVE EXTENDED CONCURRENCY ?n ?path
CubeStore-->>QueueDriver: RetrieveResponse
- QueueDriver-->>Background: [added, queueId, activeKeys, queueSize, def, lockAcquired]
+ QueueDriver-->>QueryQueue: [added, queueId, activeKeys, queueSize, def, lockAcquired]
Note over QueueDriver,CubeStore: The claim is atomic in Cube Store:
only one node moves the item to active
alt def && added && activeKeys includes our key && lockAcquired
+ QueryQueue-)Background: sendProcessMessageFn(ClaimedQuery)
+ Note over QueryQueue,Background: Detached from here on: the hand-off returns,
the execution keeps running
+
Background->>QueueDriver: optimisticQueryUpdate
QueueDriver->>CubeStore: QUEUE MERGE_EXTRA ?queueId {"startQueryTime"}
@@ -217,8 +244,8 @@ sequenceDiagram
Background->>Background: reconcileQueue
Note over Background: The freed concurrency slot is
immediately given to the next query
else the claim did not succeed
- Background->>QueueDriver: freeProcessingLock
- Note over Background,QueueDriver: Another node is running it, or the
concurrency budget is full. No-op for Cube Store
+ QueryQueue->>QueueDriver: freeProcessingLock
+ Note over QueryQueue,QueueDriver: Another node is running it, or the
concurrency budget is full. No-op for Cube Store
end
```
@@ -265,7 +292,7 @@ sequenceDiagram
QueueDriver-->>QueryQueue: [added, queueId, queueSize, addedToQueueTime, def?]
alt fast track: payload is not NULL, we own the item
- QueryQueue-)Background: processQuery, already claimed
+ QueryQueue-)Background: sendProcessMessageFn(ClaimedQuery)
Note over QueryQueue,Background: No reconcile, no QUEUE RETRIEVE.
The payload from the response is the QueryDef
Background->>QueryOrchestrator: execute
else payload IS NULL, the item stays pending
@@ -306,5 +333,6 @@ budget is exhausted, which is exactly when the condition should stop firing.
> **Status:** the `QUEUE ADD_AND_RETRIEVE` command exists in Cube Store. The driver still
> emits `QUEUE ADD`; wiring the fast track into `CubeStoreQueueDriver.addToQueue` needs a
-> capability gate (the same version negotiation as `queueExclusive` / `queueExternalId`)
-> plus the `QueryQueue` change that hands the claimed `QueryDef` straight to `processQuery`.
+> capability gate (the same version negotiation as `queueExclusive` / `queueExternalId`).
+> The `QueryQueue` side is in place: `executeInQueue` can build a `ClaimedQuery` out of the
+> response and hand it to `sendProcessMessageFn` without going through reconcile.
diff --git a/packages/cubejs-query-orchestrator/package.json b/packages/cubejs-query-orchestrator/package.json
index 0dbd33eec1942..11d22bce84448 100644
--- a/packages/cubejs-query-orchestrator/package.json
+++ b/packages/cubejs-query-orchestrator/package.json
@@ -2,7 +2,7 @@
"name": "@cubejs-backend/query-orchestrator",
"description": "Cube.js Query Orchestrator and Cache",
"author": "Cube Dev, Inc.",
- "version": "1.7.24",
+ "version": "1.7.25",
"repository": {
"type": "git",
"url": "https://github.com/cube-js/cube.git",
@@ -29,15 +29,15 @@
"dist/src/*"
],
"dependencies": {
- "@cubejs-backend/base-driver": "1.7.24",
- "@cubejs-backend/cubestore-driver": "1.7.24",
- "@cubejs-backend/shared": "1.7.24",
+ "@cubejs-backend/base-driver": "1.7.25",
+ "@cubejs-backend/cubestore-driver": "1.7.25",
+ "@cubejs-backend/shared": "1.7.25",
"csv-write-stream": "^2.0.0",
"lru-cache": "^11.1.0",
"ramda": "^0.27.2"
},
"devDependencies": {
- "@cubejs-backend/linter": "1.7.24",
+ "@cubejs-backend/linter": "1.7.25",
"@types/jest": "^29",
"@types/node": "^22",
"@types/ramda": "^0.27.32",
diff --git a/packages/cubejs-query-orchestrator/src/orchestrator/QueryQueue.ts b/packages/cubejs-query-orchestrator/src/orchestrator/QueryQueue.ts
index df761e22ef41c..16fa5ff0f7b1b 100644
--- a/packages/cubejs-query-orchestrator/src/orchestrator/QueryQueue.ts
+++ b/packages/cubejs-query-orchestrator/src/orchestrator/QueryQueue.ts
@@ -7,7 +7,8 @@ import {
QueueId,
QueryDef,
QueryStageStateResponse,
- AddToQueueOptions
+ AddToQueueOptions,
+ ProcessingId
} from '@cubejs-backend/base-driver';
import { CubeStoreQueueDriver } from '@cubejs-backend/cubestore-driver';
@@ -23,7 +24,15 @@ export type QueryHandlerFn = (query: QueryDef, cancelHandler: CancelHandlerFn) =
export type StreamHandlerFn = (query: QueryDef, stream: QueryStream) => Promise;
export type QueryHandlersMap = Record;
-export type SendProcessMessageFn = (queryKeyHash: QueryKeyHash, queueId: QueueId | null) => Promise | void;
+export type ClaimedQuery = {
+ queryKeyHash: QueryKeyHash;
+ queueId: QueueId | null;
+ processingId: ProcessingId;
+ queueSize: number;
+ query: QueryDef;
+};
+
+export type SendProcessMessageFn = (claimed: ClaimedQuery) => Promise | void;
export type SendCancelMessageFn = (query: QueryDef, queueId: QueueId | null) => Promise | void;
export type ExecuteInQueueOptions = Omit & {
@@ -117,7 +126,7 @@ export class QueryQueue {
this.orphanedTimeout = options.orphanedTimeout || 120;
this.heartBeatInterval = options.heartBeatInterval || 30;
- this.sendProcessMessageFn = options.sendProcessMessageFn || ((queryKey, queryId) => { this.processQuery(queryKey, queryId); });
+ this.sendProcessMessageFn = options.sendProcessMessageFn || ((claimed) => { this.executeQuery(claimed); });
this.sendCancelMessageFn = options.sendCancelMessageFn || ((query, queueId) => { this.processCancel(query, queueId); });
this.queryHandlers = options.queryHandlers;
this.streamHandler = options.streamHandler;
@@ -590,8 +599,9 @@ export class QueryQueue {
}
})
.slice(0, toProcessLimit)
- .map(([queryKey, queueId]) => this.sendProcessMessageFn(queryKey, queueId));
+ .map(([queryKey, queueId]) => this.processQuery(queryKey, queueId));
+ // Awaits the claim of every picked query, not their execution.
await Promise.all(tasks);
} finally {
this.queueDriver.release(queueConnection);
@@ -736,10 +746,33 @@ export class QueryQueue {
}
/**
- * Processing query specified by the `queryKey`. This method encapsulates most
- * of the logic related to the queue updates, heartbeat, etc.
+ * Claims the query specified by the `queryKeyHashed` and hands it over for execution.
*/
protected async processQuery(queryKeyHashed: QueryKeyHash, queueId: QueueId | null): Promise {
+ const claimed = await this.claimQueryForProcessing(queryKeyHashed, queueId);
+ if (!claimed) {
+ return;
+ }
+
+ try {
+ await this.sendProcessMessageFn(claimed);
+ } catch (e: any) {
+ this.logger('Error while sending process message', {
+ queueId: claimed.queueId,
+ queryKey: claimed.query.queryKey,
+ requestId: claimed.query.requestId,
+ error: (e.stack || e).toString(),
+ queuePrefix: this.redisQueuePrefix
+ });
+ }
+ }
+
+ /**
+ * Acquires the processing lock for the query specified by the `queryKeyHashed` and moves it to
+ * the active set. Returns `null` when the claim didn't succeed, which means another node is
+ * already running the query or the concurrency budget is full.
+ */
+ protected async claimQueryForProcessing(queryKeyHashed: QueryKeyHash, queueId: QueueId | null): Promise {
const queueConnection = await this.queueDriver.createConnection();
let insertedCount;
@@ -768,46 +801,134 @@ export class QueryQueue {
query = await queueConnection.getQueryDef(queryKeyHashed, null);
}
- if (query && insertedCount && activated && processingLockAcquired) {
- let executionResult;
- let queryExecutionFinished = false;
- // Set by the query handler's setCancelHandler callback once execution begins.
- // Not available on the original query def from retrieveForProcessing.
- let localCancelHandler: unknown = null;
- const startQueryTime = (new Date()).getTime();
- const timeInQueue = (new Date()).getTime() - query.addedToQueueTime;
- this.logger('Performing query', {
+ if (!query || !insertedCount || !activated || !processingLockAcquired) {
+ // TODO Ideally streaming queries should reconcile queue here after waiting on open slot however in practice continue wait timeout reconciles faster CPU-wise
+ // if (query?.queryHandler === 'stream') {
+ // const [active] = await queueConnection.getQueryStageState(true);
+ // if (active && active.length > 0) {
+ // await Promise.race(active.map(keyHash => queueConnection.getResultBlocking(keyHash)));
+ // await this.reconcileQueue();
+ // }
+ // }
+
+ this.logger('Skip processing', {
queueId,
processingId,
- queueSize,
- queryKey: query.queryKey,
+ queryKey: query && query.queryKey || queryKeyHashed,
+ requestId: query && query.requestId,
queuePrefix: this.redisQueuePrefix,
- requestId: query.requestId,
- timeInQueue,
- metadata: query.query?.metadata,
- preAggregationId: query.query?.preAggregation?.preAggregationId,
- newVersionEntry: query.query?.newVersionEntry,
- preAggregation: query.query?.preAggregation,
- addedToQueueTime: query.addedToQueueTime,
+ processingLockAcquired,
+ query,
+ insertedCount,
+ activeKeys,
+ activated,
+ queryExists: !!query
});
- await queueConnection.optimisticQueryUpdate(queryKeyHashed, { startQueryTime }, processingId, queueId);
+ await queueConnection.freeProcessingLock(queryKeyHashed, processingId, activated);
- let queryProcessHeartbeat = Date.now();
- const heartBeatTimer = setInterval(
- async () => {
- if ((Date.now() - queryProcessHeartbeat) > 5 * 60 * 1000) {
- this.logger('Query processing heartbeat', {
- queueId,
- queryKey: query.queryKey,
- requestId: query.requestId,
- });
- queryProcessHeartbeat = Date.now();
- }
+ return null;
+ }
+
+ return {
+ queryKeyHash: queryKeyHashed,
+ queueId,
+ processingId,
+ queueSize,
+ query,
+ };
+ } catch (e: any) {
+ this.logger('Queue storage error', {
+ queueId,
+ queryKey: query && query.queryKey || queryKeyHashed,
+ requestId: query && query.requestId,
+ error: (e.stack || e).toString(),
+ queuePrefix: this.redisQueuePrefix
+ });
+
+ return null;
+ } finally {
+ this.queueDriver.release(queueConnection);
+ }
+ }
+
+ /**
+ * Executes a claimed query: runs its handler while keeping the queue heartbeat alive, then acks
+ * the result. It's the counterpart of `sendProcessMessageFn` and the entry point for a custom
+ * implementation which hands the query over to another process.
+ */
+ public async executeQuery(claimed: ClaimedQuery): Promise {
+ const { queryKeyHash: queryKeyHashed, queueId, processingId, queueSize, query } = claimed;
+
+ const queueConnection = await this.queueDriver.createConnection();
+ try {
+ let executionResult;
+ let queryExecutionFinished = false;
+ // Set by the query handler's setCancelHandler callback once execution begins.
+ // Not available on the original query def from retrieveForProcessing.
+ let localCancelHandler: unknown = null;
+ const startQueryTime = (new Date()).getTime();
+ const timeInQueue = (new Date()).getTime() - query.addedToQueueTime;
+ this.logger('Performing query', {
+ queueId,
+ processingId,
+ queueSize,
+ queryKey: query.queryKey,
+ queuePrefix: this.redisQueuePrefix,
+ requestId: query.requestId,
+ timeInQueue,
+ metadata: query.query?.metadata,
+ preAggregationId: query.query?.preAggregation?.preAggregationId,
+ newVersionEntry: query.query?.newVersionEntry,
+ preAggregation: query.query?.preAggregation,
+ addedToQueueTime: query.addedToQueueTime,
+ });
+ await queueConnection.optimisticQueryUpdate(queryKeyHashed, { startQueryTime }, processingId, queueId);
+
+ let queryProcessHeartbeat = Date.now();
+ const heartBeatTimer = setInterval(
+ async () => {
+ if ((Date.now() - queryProcessHeartbeat) > 5 * 60 * 1000) {
+ this.logger('Query processing heartbeat', {
+ queueId,
+ queryKey: query.queryKey,
+ requestId: query.requestId,
+ });
+ queryProcessHeartbeat = Date.now();
+ }
+
+ try {
+ await queueConnection.updateHeartBeat(queryKeyHashed, queueId);
+ } catch (e: any) {
+ this.logger('Error updating heartbeat', {
+ queueId,
+ queryKey: query.queryKey,
+ error: e.stack || e,
+ queuePrefix: this.redisQueuePrefix,
+ requestId: query.requestId,
+ });
+ }
+
+ if (!queryExecutionFinished && localCancelHandler !== null) {
try {
- await queueConnection.updateHeartBeat(queryKeyHashed, queueId);
+ const currentDef = await queueConnection.getQueryDef(queryKeyHashed, queueId);
+ if (!currentDef && !queryExecutionFinished) {
+ this.logger('Cancelling query due to external cancellation', {
+ queueId,
+ queryKey: query.queryKey,
+ queuePrefix: this.redisQueuePrefix,
+ requestId: query.requestId,
+ metadata: query.query?.metadata,
+ preAggregationId: query.query?.preAggregation?.preAggregationId,
+ newVersionEntry: query.query?.newVersionEntry,
+ preAggregation: query.query?.preAggregation,
+ addedToQueueTime: query.addedToQueueTime,
+ });
+ const cancelQuery = { ...query, cancelHandler: localCancelHandler };
+ await this.processCancel(cancelQuery, queueId);
+ }
} catch (e: any) {
- this.logger('Error updating heartbeat', {
+ this.logger('Error checking for external cancellation', {
queueId,
queryKey: query.queryKey,
error: e.stack || e,
@@ -815,193 +936,140 @@ export class QueryQueue {
requestId: query.requestId,
});
}
+ }
+ },
+ this.heartBeatInterval * 1000
+ );
+ try {
+ const handler = query?.queryHandler;
+ switch (handler) {
+ case 'stream':
+ // eslint-disable-next-line no-case-declarations
+ const queryStream = this.createQueryStream(queryKeyHashed, query.query?.aliasNameToMember);
- if (!queryExecutionFinished && localCancelHandler !== null) {
- try {
- const currentDef = await queueConnection.getQueryDef(queryKeyHashed, queueId);
- if (!currentDef && !queryExecutionFinished) {
- this.logger('Cancelling query due to external cancellation', {
- queueId,
- queryKey: query.queryKey,
- queuePrefix: this.redisQueuePrefix,
- requestId: query.requestId,
- metadata: query.query?.metadata,
- preAggregationId: query.query?.preAggregation?.preAggregationId,
- newVersionEntry: query.query?.newVersionEntry,
- preAggregation: query.query?.preAggregation,
- addedToQueueTime: query.addedToQueueTime,
- });
- const cancelQuery = { ...query, cancelHandler: localCancelHandler };
- await this.processCancel(cancelQuery, queueId);
- }
- } catch (e: any) {
- this.logger('Error checking for external cancellation', {
- queueId,
- queryKey: query.queryKey,
- error: e.stack || e,
- queuePrefix: this.redisQueuePrefix,
- requestId: query.requestId,
- });
- }
- }
- },
- this.heartBeatInterval * 1000
- );
- try {
- const handler = query?.queryHandler;
- switch (handler) {
- case 'stream':
- // eslint-disable-next-line no-case-declarations
- const queryStream = this.createQueryStream(queryKeyHashed, query.query?.aliasNameToMember);
-
- try {
- await this.streamHandler(query.query, queryStream);
- // CubeStore has special handling for null
- executionResult = {
- streamResult: true
- };
- } finally {
- if (this.streams.get(queryKeyHashed) === queryStream) {
- this.streams.delete(queryKeyHashed);
- }
- }
- break;
- default:
+ try {
+ await this.streamHandler(query.query, queryStream);
+ // CubeStore has special handling for null
executionResult = {
- result: await this.queryTimeout(
- this.queryHandlers[handler](
- query.query,
- async (cancelHandler) => {
- localCancelHandler = cancelHandler;
- try {
- await queueConnection.optimisticQueryUpdate(queryKeyHashed, { cancelHandler }, processingId, queueId);
- } catch (e: any) {
- this.logger('Error while query update', {
- queueId,
- queryKey: query.queryKey,
- error: e.stack || e,
- queuePrefix: this.redisQueuePrefix,
- requestId: query.requestId,
- metadata: query.query?.metadata,
- preAggregationId: query.query?.preAggregation?.preAggregationId,
- newVersionEntry: query.query?.newVersionEntry,
- preAggregation: query.query?.preAggregation,
- addedToQueueTime: query.addedToQueueTime,
- });
- }
- },
- )
- )
+ streamResult: true
};
- break;
- }
-
- this.logger('Performing query completed', {
- queueId,
- processingId,
- queueSize,
- duration: ((new Date()).getTime() - startQueryTime),
- queryKey: query.queryKey,
- queuePrefix: this.redisQueuePrefix,
- requestId: query.requestId,
- timeInQueue,
- metadata: query.query?.metadata,
- preAggregationId: query.query?.preAggregation?.preAggregationId,
- newVersionEntry: query.query?.newVersionEntry,
- preAggregation: query.query?.preAggregation,
- addedToQueueTime: query.addedToQueueTime,
- });
- } catch (e: any) {
- executionResult = {
- error: (e.message || e).toString() // TODO error handling
- };
- this.logger('Error while querying', {
- queueId,
- processingId,
- queueSize,
- duration: ((new Date()).getTime() - startQueryTime),
- queryKey: query.queryKey,
- queuePrefix: this.redisQueuePrefix,
- requestId: query.requestId,
- timeInQueue,
- metadata: query.query?.metadata,
- preAggregationId: query.query?.preAggregation?.preAggregationId,
- newVersionEntry: query.query?.newVersionEntry,
- preAggregation: query.query?.preAggregation,
- addedToQueueTime: query.addedToQueueTime,
- error: (e.stack || e).toString()
- });
- if (e instanceof TimeoutError) {
- const queryWithCancelHandle = await queueConnection.getQueryDef(queryKeyHashed, queueId);
- if (queryWithCancelHandle) {
- this.logger('Cancelling query due to timeout', {
- queueId,
- processingId,
- queryKey: queryWithCancelHandle.queryKey,
- queuePrefix: this.redisQueuePrefix,
- requestId: queryWithCancelHandle.requestId,
- metadata: queryWithCancelHandle.query?.metadata,
- preAggregationId: queryWithCancelHandle.query?.preAggregation?.preAggregationId,
- newVersionEntry: queryWithCancelHandle.query?.newVersionEntry,
- preAggregation: queryWithCancelHandle.query?.preAggregation,
- addedToQueueTime: queryWithCancelHandle.addedToQueueTime,
- });
-
- await this.sendCancelMessageFn(queryWithCancelHandle, queueId);
+ } finally {
+ if (this.streams.get(queryKeyHashed) === queryStream) {
+ this.streams.delete(queryKeyHashed);
+ }
}
- }
- } finally {
- queryExecutionFinished = true;
- clearInterval(heartBeatTimer);
+ break;
+ default:
+ executionResult = {
+ result: await this.queryTimeout(
+ this.queryHandlers[handler](
+ query.query,
+ async (cancelHandler) => {
+ localCancelHandler = cancelHandler;
+ try {
+ await queueConnection.optimisticQueryUpdate(queryKeyHashed, { cancelHandler }, processingId, queueId);
+ } catch (e: any) {
+ this.logger('Error while query update', {
+ queueId,
+ queryKey: query.queryKey,
+ error: e.stack || e,
+ queuePrefix: this.redisQueuePrefix,
+ requestId: query.requestId,
+ metadata: query.query?.metadata,
+ preAggregationId: query.query?.preAggregation?.preAggregationId,
+ newVersionEntry: query.query?.newVersionEntry,
+ preAggregation: query.query?.preAggregation,
+ addedToQueueTime: query.addedToQueueTime,
+ });
+ }
+ },
+ )
+ )
+ };
+ break;
}
- if (!(await queueConnection.setResultAndRemoveQuery(queryKeyHashed, executionResult, processingId, queueId))) {
- this.logger('Orphaned execution result', {
- queueId,
- processingId,
- warn: 'Result for query was not set due to processing lock wasn\'t acquired',
- queryKey: query.queryKey,
- queuePrefix: this.redisQueuePrefix,
- requestId: query.requestId,
- metadata: query.query?.metadata,
- preAggregationId: query.query?.preAggregation?.preAggregationId,
- newVersionEntry: query.query?.newVersionEntry,
- preAggregation: query.query?.preAggregation,
- addedToQueueTime: query.addedToQueueTime,
- });
+ this.logger('Performing query completed', {
+ queueId,
+ processingId,
+ queueSize,
+ duration: ((new Date()).getTime() - startQueryTime),
+ queryKey: query.queryKey,
+ queuePrefix: this.redisQueuePrefix,
+ requestId: query.requestId,
+ timeInQueue,
+ metadata: query.query?.metadata,
+ preAggregationId: query.query?.preAggregation?.preAggregationId,
+ newVersionEntry: query.query?.newVersionEntry,
+ preAggregation: query.query?.preAggregation,
+ addedToQueueTime: query.addedToQueueTime,
+ });
+ } catch (e: any) {
+ executionResult = {
+ error: (e.message || e).toString() // TODO error handling
+ };
+ this.logger('Error while querying', {
+ queueId,
+ processingId,
+ queueSize,
+ duration: ((new Date()).getTime() - startQueryTime),
+ queryKey: query.queryKey,
+ queuePrefix: this.redisQueuePrefix,
+ requestId: query.requestId,
+ timeInQueue,
+ metadata: query.query?.metadata,
+ preAggregationId: query.query?.preAggregation?.preAggregationId,
+ newVersionEntry: query.query?.newVersionEntry,
+ preAggregation: query.query?.preAggregation,
+ addedToQueueTime: query.addedToQueueTime,
+ error: (e.stack || e).toString()
+ });
+ if (e instanceof TimeoutError) {
+ const queryWithCancelHandle = await queueConnection.getQueryDef(queryKeyHashed, queueId);
+ if (queryWithCancelHandle) {
+ this.logger('Cancelling query due to timeout', {
+ queueId,
+ processingId,
+ queryKey: queryWithCancelHandle.queryKey,
+ queuePrefix: this.redisQueuePrefix,
+ requestId: queryWithCancelHandle.requestId,
+ metadata: queryWithCancelHandle.query?.metadata,
+ preAggregationId: queryWithCancelHandle.query?.preAggregation?.preAggregationId,
+ newVersionEntry: queryWithCancelHandle.query?.newVersionEntry,
+ preAggregation: queryWithCancelHandle.query?.preAggregation,
+ addedToQueueTime: queryWithCancelHandle.addedToQueueTime,
+ });
+
+ await this.sendCancelMessageFn(queryWithCancelHandle, queueId);
+ }
}
+ } finally {
+ queryExecutionFinished = true;
+ clearInterval(heartBeatTimer);
+ }
- await this.reconcileQueue();
- } else {
- // TODO Ideally streaming queries should reconcile queue here after waiting on open slot however in practice continue wait timeout reconciles faster CPU-wise
- // if (query?.queryHandler === 'stream') {
- // const [active] = await queueConnection.getQueryStageState(true);
- // if (active && active.length > 0) {
- // await Promise.race(active.map(keyHash => queueConnection.getResultBlocking(keyHash)));
- // await this.reconcileQueue();
- // }
- // }
-
- this.logger('Skip processing', {
+ if (!(await queueConnection.setResultAndRemoveQuery(queryKeyHashed, executionResult, processingId, queueId))) {
+ this.logger('Orphaned execution result', {
queueId,
processingId,
- queryKey: query && query.queryKey || queryKeyHashed,
- requestId: query && query.requestId,
+ warn: 'Result for query was not set due to processing lock wasn\'t acquired',
+ queryKey: query.queryKey,
queuePrefix: this.redisQueuePrefix,
- processingLockAcquired,
- query,
- insertedCount,
- activeKeys,
- activated,
- queryExists: !!query
+ requestId: query.requestId,
+ metadata: query.query?.metadata,
+ preAggregationId: query.query?.preAggregation?.preAggregationId,
+ newVersionEntry: query.query?.newVersionEntry,
+ preAggregation: query.query?.preAggregation,
+ addedToQueueTime: query.addedToQueueTime,
});
- await queueConnection.freeProcessingLock(queryKeyHashed, processingId, activated);
}
+
+ await this.reconcileQueue();
} catch (e: any) {
this.logger('Queue storage error', {
queueId,
- queryKey: query && query.queryKey || queryKeyHashed,
- requestId: query && query.requestId,
+ queryKey: query.queryKey,
+ requestId: query.requestId,
error: (e.stack || e).toString(),
queuePrefix: this.redisQueuePrefix
});
diff --git a/packages/cubejs-query-orchestrator/test/unit/QueryQueue.abstract.ts b/packages/cubejs-query-orchestrator/test/unit/QueryQueue.abstract.ts
index 8c9d202516685..8f3244eb98400 100644
--- a/packages/cubejs-query-orchestrator/test/unit/QueryQueue.abstract.ts
+++ b/packages/cubejs-query-orchestrator/test/unit/QueryQueue.abstract.ts
@@ -66,8 +66,8 @@ export const QueryQueueTest = (name: string, options: QueryQueueTestOptions) =>
readable.pipe(stream);
});
},
- sendProcessMessageFn: async (queryKeyHashed, queueId) => {
- processMessagePromises.push(queue.processQuery.bind(queue)(queryKeyHashed, queueId));
+ sendProcessMessageFn: async (claimed) => {
+ processMessagePromises.push(queue.executeQuery(claimed));
},
sendCancelMessageFn: async (query) => {
processCancelPromises.push(queue.processCancel.bind(queue)(query));
diff --git a/packages/cubejs-questdb-driver/CHANGELOG.md b/packages/cubejs-questdb-driver/CHANGELOG.md
index d4cd9a9e81b7c..0ed0d4940efc8 100644
--- a/packages/cubejs-questdb-driver/CHANGELOG.md
+++ b/packages/cubejs-questdb-driver/CHANGELOG.md
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [1.7.25](https://github.com/cube-js/cube/compare/v1.7.24...v1.7.25) (2026-08-21)
+
+**Note:** Version bump only for package @cubejs-backend/questdb-driver
+
## [1.7.24](https://github.com/cube-js/cube/compare/v1.7.23...v1.7.24) (2026-08-19)
**Note:** Version bump only for package @cubejs-backend/questdb-driver
diff --git a/packages/cubejs-questdb-driver/package.json b/packages/cubejs-questdb-driver/package.json
index 8ef51add01498..dc2ee1602a924 100644
--- a/packages/cubejs-questdb-driver/package.json
+++ b/packages/cubejs-questdb-driver/package.json
@@ -2,7 +2,7 @@
"name": "@cubejs-backend/questdb-driver",
"description": "Cube.js QuestDB database driver",
"author": "Cube Dev, Inc.",
- "version": "1.7.24",
+ "version": "1.7.25",
"repository": {
"type": "git",
"url": "https://github.com/cube-js/cube.git",
@@ -27,9 +27,9 @@
"lint:fix": "eslint --fix src/* --ext .ts"
},
"dependencies": {
- "@cubejs-backend/base-driver": "1.7.24",
- "@cubejs-backend/schema-compiler": "1.7.24",
- "@cubejs-backend/shared": "1.7.24",
+ "@cubejs-backend/base-driver": "1.7.25",
+ "@cubejs-backend/schema-compiler": "1.7.25",
+ "@cubejs-backend/shared": "1.7.25",
"@types/pg": "^8.6.0",
"moment": "^2.24.0",
"pg": "^8.7.0",
@@ -37,8 +37,8 @@
},
"license": "Apache-2.0",
"devDependencies": {
- "@cubejs-backend/linter": "1.7.24",
- "@cubejs-backend/testing-shared": "1.7.24",
+ "@cubejs-backend/linter": "1.7.25",
+ "@cubejs-backend/testing-shared": "1.7.25",
"testcontainers": "^10.28.0",
"typescript": "~5.2.2"
},
diff --git a/packages/cubejs-redshift-driver/CHANGELOG.md b/packages/cubejs-redshift-driver/CHANGELOG.md
index 9abd558b4ce64..059cd628b6708 100644
--- a/packages/cubejs-redshift-driver/CHANGELOG.md
+++ b/packages/cubejs-redshift-driver/CHANGELOG.md
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [1.7.25](https://github.com/cube-js/cube/compare/v1.7.24...v1.7.25) (2026-08-21)
+
+**Note:** Version bump only for package @cubejs-backend/redshift-driver
+
## [1.7.24](https://github.com/cube-js/cube/compare/v1.7.23...v1.7.24) (2026-08-19)
**Note:** Version bump only for package @cubejs-backend/redshift-driver
diff --git a/packages/cubejs-redshift-driver/package.json b/packages/cubejs-redshift-driver/package.json
index eaaa2d4ac453c..82feb3f51231d 100644
--- a/packages/cubejs-redshift-driver/package.json
+++ b/packages/cubejs-redshift-driver/package.json
@@ -2,7 +2,7 @@
"name": "@cubejs-backend/redshift-driver",
"description": "Cube.js Redshift database driver",
"author": "Cube Dev, Inc.",
- "version": "1.7.24",
+ "version": "1.7.25",
"repository": {
"type": "git",
"url": "https://github.com/cube-js/cube.git",
@@ -27,13 +27,13 @@
"dependencies": {
"@aws-sdk/client-redshift": "^3.22.0",
"@aws-sdk/credential-providers": "^3.22.0",
- "@cubejs-backend/base-driver": "1.7.24",
- "@cubejs-backend/postgres-driver": "1.7.24",
- "@cubejs-backend/shared": "1.7.24"
+ "@cubejs-backend/base-driver": "1.7.25",
+ "@cubejs-backend/postgres-driver": "1.7.25",
+ "@cubejs-backend/shared": "1.7.25"
},
"license": "Apache-2.0",
"devDependencies": {
- "@cubejs-backend/linter": "1.7.24",
+ "@cubejs-backend/linter": "1.7.25",
"typescript": "~5.2.2"
},
"publishConfig": {
diff --git a/packages/cubejs-schema-compiler/CHANGELOG.md b/packages/cubejs-schema-compiler/CHANGELOG.md
index 1f25fde1550a6..98410d904056c 100644
--- a/packages/cubejs-schema-compiler/CHANGELOG.md
+++ b/packages/cubejs-schema-compiler/CHANGELOG.md
@@ -3,6 +3,12 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [1.7.25](https://github.com/cube-js/cube/compare/v1.7.24...v1.7.25) (2026-08-21)
+
+### Bug Fixes
+
+- **cubesql:** Support `DATE_ADD` SQL pushdown ([#11539](https://github.com/cube-js/cube/issues/11539)) ([3051ccd](https://github.com/cube-js/cube/commit/3051ccd8c634941dce80235a0e6e823fa8586355))
+
## [1.7.24](https://github.com/cube-js/cube/compare/v1.7.23...v1.7.24) (2026-08-19)
### Bug Fixes
diff --git a/packages/cubejs-schema-compiler/package.json b/packages/cubejs-schema-compiler/package.json
index 4f603607df8db..ae5915f071a04 100644
--- a/packages/cubejs-schema-compiler/package.json
+++ b/packages/cubejs-schema-compiler/package.json
@@ -2,7 +2,7 @@
"name": "@cubejs-backend/schema-compiler",
"description": "Cube schema compiler",
"author": "Cube Dev, Inc.",
- "version": "1.7.24",
+ "version": "1.7.25",
"repository": {
"type": "git",
"url": "https://github.com/cube-js/cube.git",
@@ -40,8 +40,8 @@
"@babel/standalone": "^7.24",
"@babel/traverse": "^7.24",
"@babel/types": "^7.24",
- "@cubejs-backend/native": "1.7.24",
- "@cubejs-backend/shared": "1.7.24",
+ "@cubejs-backend/native": "1.7.25",
+ "@cubejs-backend/shared": "1.7.25",
"antlr4": "^4.13.2",
"camelcase": "^6.2.0",
"cron-parser": "^4.9.0",
@@ -60,9 +60,9 @@
},
"devDependencies": {
"@clickhouse/client": "^1.12.0",
- "@cubejs-backend/linter": "1.7.24",
- "@cubejs-backend/mssql-driver": "1.7.24",
- "@cubejs-backend/query-orchestrator": "1.7.24",
+ "@cubejs-backend/linter": "1.7.25",
+ "@cubejs-backend/mssql-driver": "1.7.25",
+ "@cubejs-backend/query-orchestrator": "1.7.25",
"@types/babel__code-frame": "^7.0.6",
"@types/babel__generator": "^7.6.8",
"@types/babel__traverse": "^7.20.5",
diff --git a/packages/cubejs-schema-compiler/test/integration/postgres/filter-member-sql-parens.test.ts b/packages/cubejs-schema-compiler/test/integration/postgres/filter-member-sql-parens.test.ts
new file mode 100644
index 0000000000000..3ed1794fab559
--- /dev/null
+++ b/packages/cubejs-schema-compiler/test/integration/postgres/filter-member-sql-parens.test.ts
@@ -0,0 +1,336 @@
+import { getEnv } from '@cubejs-backend/shared';
+import { PostgresQuery } from '../../../src/adapter';
+import { prepareYamlCompiler } from '../../unit/PrepareCompiler';
+import { dbRunner } from './PostgresDBRunner';
+
+// A member's `sql` is an arbitrary expression, and a filter template splices it
+// next to an operator of its own. When the member's own top-level operator binds
+// weaker than the filter's, the unparenthesized splice re-associates: the filter
+// operator captures only the tail of the member expression. That is a syntax
+// error on some dialects and — for `AND`/`OR` members — valid SQL over a
+// different row set on all of them.
+
+// The fix lives in the Tesseract planner; the legacy planner is out of scope.
+const tesseract = getEnv('nativeSqlPlanner');
+
+(tesseract ? describe : describe.skip)('Filter member SQL parenthesization', () => {
+ jest.setTimeout(200000);
+
+ const compilers = prepareYamlCompiler(`
+cubes:
+ - name: orders
+ sql: >
+ SELECT * FROM (VALUES
+ (1, 'g1', 100, TRUE, 'alpha', '2024-01-01'::timestamp),
+ (2, 'g1', 10, TRUE, NULL, '2024-01-02'::timestamp),
+ (3, 'g2', 200, FALSE, 'beta', '2024-01-03'::timestamp),
+ (4, 'g2', 10, FALSE, NULL, '2024-01-04'::timestamp),
+ (5, 'g3', 100, NULL, 'gamma', '2024-01-05'::timestamp),
+ (6, 'g3', 10, NULL, NULL, '2024-01-06'::timestamp)
+ ) AS t(id, grp, amount, flag, note, created_at)
+
+ dimensions:
+ - name: id
+ sql: id
+ type: number
+ primary_key: true
+ public: true
+
+ - name: grp
+ sql: grp
+ type: string
+
+ - name: amount
+ sql: amount
+ type: number
+
+ # Top-level AND — binds weaker than every filter operator.
+ - name: big_and_flag
+ sql: "amount > 50 AND flag"
+ type: boolean
+
+ # Top-level OR — same, and keeps NULL propagation visible.
+ - name: big_or_flag
+ sql: "amount > 50 OR flag"
+ type: boolean
+
+ # Top-level comparison — Postgres rejects a second comparison next to it.
+ - name: big
+ sql: "amount > 50"
+ type: boolean
+
+ - name: amount_plus
+ sql: "amount + 1"
+ type: number
+
+ - name: note_tagged
+ sql: "note || '-tag'"
+ type: string
+
+ - name: amount_plus_commented
+ sql: "amount + 1 -- one more"
+ type: number
+
+ # Atomic, but still swallows whatever a template appends on that line.
+ - name: amount_commented
+ sql: "amount -- as is"
+ type: number
+
+ - name: shifted_at
+ sql: "created_at + interval '1 day'"
+ type: time
+
+ measures:
+ - name: count
+ type: count
+
+ - name: total
+ sql: amount
+ type: sum
+
+ - name: flag_any
+ sql: "bool_or(flag)"
+ type: boolean
+
+ # Top-level AND over two aggregates.
+ - name: busy
+ sql: "{total} > 150 AND {flag_any}"
+ type: boolean
+
+ # Top-level comparison over an aggregate.
+ - name: total_over_150
+ sql: "{total} > 150"
+ type: boolean
+
+ # The reported model's shape: a calculated boolean over a plain measure.
+ - name: total_is_set
+ sql: "{total} IS NOT NULL"
+ type: boolean
+ `);
+
+ async function buildSql(q: any): Promise<[string, any[]]> {
+ await compilers.compiler.compile();
+ const query = new PostgresQuery(compilers, {
+ ...q,
+ timezone: 'UTC',
+ preAggregationsSchema: '',
+ });
+ return query.buildSqlAndParams() as [string, any[]];
+ }
+
+ // Executes the query and compares the row set. Returns the generated SQL so a
+ // caller can additionally assert its shape.
+ async function expectRows(q: any, expected: any[]): Promise {
+ const sqlAndParams = await buildSql(q);
+ const res = await dbRunner.testQuery(sqlAndParams);
+ expect(res).toEqual(expected);
+ return sqlAndParams[0];
+ }
+
+ const idRows = (...ids: number[]) => ids.map(id => ({ orders__id: id, orders__count: '1' }));
+
+ const byId = (filters: any[]) => ({
+ measures: ['orders.count'],
+ dimensions: ['orders.id'],
+ filters,
+ order: [{ id: 'orders.id' }],
+ });
+
+ describe('WHERE — dimension whose SQL is a top-level AND/OR', () => {
+ it('equals', async () => {
+ await expectRows(
+ byId([{ member: 'orders.big_and_flag', operator: 'equals', values: ['false'] }]),
+ idRows(2, 3, 4, 6)
+ );
+ });
+
+ it('notEquals', async () => {
+ await expectRows(
+ byId([{ member: 'orders.big_and_flag', operator: 'notEquals', values: ['true'] }]),
+ idRows(2, 3, 4, 5, 6)
+ );
+ });
+
+ it('equals with several values (IN list)', async () => {
+ await expectRows(
+ byId([{ member: 'orders.big_and_flag', operator: 'equals', values: ['true', 'false'] }]),
+ idRows(1, 2, 3, 4, 6)
+ );
+ });
+
+ it('notEquals with several values (NOT IN list)', async () => {
+ await expectRows(
+ byId([{ member: 'orders.big_or_flag', operator: 'notEquals', values: ['true', 'false'] }]),
+ idRows(6)
+ );
+ });
+
+ it('set', async () => {
+ await expectRows(
+ byId([{ member: 'orders.big_and_flag', operator: 'set' }]),
+ idRows(1, 2, 3, 4, 6)
+ );
+ });
+
+ it('notSet', async () => {
+ await expectRows(
+ byId([{ member: 'orders.big_or_flag', operator: 'notSet' }]),
+ idRows(6)
+ );
+ });
+ });
+
+ describe('WHERE — dimension whose SQL is a top-level comparison', () => {
+ // Unparenthesized this renders `amount > 50 = CAST($1 AS BOOLEAN)`, which
+ // Postgres rejects outright ("syntax error at or near =").
+ it('equals', async () => {
+ await expectRows(
+ byId([{ member: 'orders.big', operator: 'equals', values: ['false'] }]),
+ idRows(2, 4, 6)
+ );
+ });
+
+ it('notEquals', async () => {
+ await expectRows(
+ byId([{ member: 'orders.big', operator: 'notEquals', values: ['true'] }]),
+ idRows(2, 4, 6)
+ );
+ });
+ });
+
+ describe('HAVING — measure whose SQL is a top-level AND/comparison', () => {
+ const byGrp = (filters: any[]) => ({
+ measures: ['orders.total'],
+ dimensions: ['orders.grp'],
+ filters,
+ order: [{ id: 'orders.grp' }],
+ });
+
+ it('equals on a top-level AND measure', async () => {
+ await expectRows(
+ byGrp([{ member: 'orders.busy', operator: 'equals', values: ['false'] }]),
+ [
+ { orders__grp: 'g1', orders__total: '110' },
+ { orders__grp: 'g2', orders__total: '210' },
+ { orders__grp: 'g3', orders__total: '110' },
+ ]
+ );
+ });
+
+ it('equals on a top-level comparison measure', async () => {
+ await expectRows(
+ byGrp([{ member: 'orders.total_over_150', operator: 'equals', values: ['true'] }]),
+ [{ orders__grp: 'g2', orders__total: '210' }]
+ );
+ });
+
+ // The reported model: `sum(...) IS NOT NULL = CAST($1 AS BOOLEAN)` is a
+ // syntax error on Trino/Athena. Postgres happens to parse it the intended
+ // way, so only the emitted shape can be asserted here.
+ it('equals on a top-level IS NOT NULL measure', async () => {
+ const sql = await expectRows(
+ byGrp([{ member: 'orders.total_is_set', operator: 'equals', values: ['true'] }]),
+ [
+ { orders__grp: 'g1', orders__total: '110' },
+ { orders__grp: 'g2', orders__total: '210' },
+ { orders__grp: 'g3', orders__total: '110' },
+ ]
+ );
+ expect(sql).toContain('(sum("orders".amount) IS NOT NULL) =');
+ });
+ });
+
+ // The remaining operators cannot be made to diverge on Postgres — its
+ // precedence happens to agree with the intended reading — but they splice the
+ // member the same way, so the wrapping is asserted on the emitted SQL.
+ describe('emitted SQL wraps a compound member for every operator', () => {
+ // Each expectation is the whole rendered predicate, so a case also pins the
+ // operator and pattern it belongs to rather than only the parentheses.
+ const NUM = '(amount + 1)';
+ const STR = '(note || \'-tag\')';
+ const TS = '(created_at + interval \'1 day\')';
+
+ const cases: Array<[string, any, string]> = [
+ ['gt', { member: 'orders.amount_plus', operator: 'gt', values: ['10'] }, `WHERE (${NUM} > $1)`],
+ ['gte', { member: 'orders.amount_plus', operator: 'gte', values: ['10'] }, `WHERE (${NUM} >= $1)`],
+ ['lt', { member: 'orders.amount_plus', operator: 'lt', values: ['10'] }, `WHERE (${NUM} < $1)`],
+ ['lte', { member: 'orders.amount_plus', operator: 'lte', values: ['10'] }, `WHERE (${NUM} <= $1)`],
+ ['contains', { member: 'orders.note_tagged', operator: 'contains', values: ['alpha'] },
+ `WHERE ((${STR} ILIKE '%' || $1|| '%'))`],
+ ['notContains', { member: 'orders.note_tagged', operator: 'notContains', values: ['alpha'] },
+ `WHERE ((${STR} NOT ILIKE '%' || $1|| '%') OR ${STR} IS NULL)`],
+ ['startsWith', { member: 'orders.note_tagged', operator: 'startsWith', values: ['alpha'] },
+ `WHERE ((${STR} ILIKE $1|| '%'))`],
+ ['endsWith', { member: 'orders.note_tagged', operator: 'endsWith', values: ['tag'] },
+ `WHERE ((${STR} ILIKE '%' || $1))`],
+ ['inDateRange', {
+ member: 'orders.shifted_at',
+ operator: 'inDateRange',
+ values: ['2024-01-01T00:00:00.000', '2024-01-31T23:59:59.999'],
+ }, `WHERE (${TS} >= $1::timestamptz AND ${TS} <= $2::timestamptz)`],
+ ['notInDateRange', {
+ member: 'orders.shifted_at',
+ operator: 'notInDateRange',
+ values: ['2024-01-01T00:00:00.000', '2024-01-31T23:59:59.999'],
+ }, `WHERE (${TS} < $1::timestamptz OR ${TS} > $2::timestamptz)`],
+ ['beforeDate', {
+ member: 'orders.shifted_at',
+ operator: 'beforeDate',
+ values: ['2024-01-31T23:59:59.999'],
+ }, `WHERE (${TS} < $1::timestamptz)`],
+ ['afterDate', {
+ member: 'orders.shifted_at',
+ operator: 'afterDate',
+ values: ['2024-01-01T00:00:00.000'],
+ }, `WHERE (${TS} > $1::timestamptz)`],
+ ];
+
+ it.each(cases)('%s', async (_name, filter, expected) => {
+ const [sql] = await buildSql(byId([filter]));
+ expect(sql).toContain(expected);
+ });
+ });
+
+ // A member SQL ending in a line comment swallows whatever the template
+ // appends on that line, so the closing parenthesis gets a line of its own —
+ // and an atomic expression needs the wrapping for that reason alone.
+ describe('member SQL ending in a line comment', () => {
+ it('compound expression', async () => {
+ const sql = await expectRows(
+ byId([{ member: 'orders.amount_plus_commented', operator: 'gt', values: ['50'] }]),
+ idRows(1, 3, 5)
+ );
+ expect(sql).toContain('(amount + 1 -- one more\n) > $1');
+ });
+
+ it('atomic expression', async () => {
+ const sql = await expectRows(
+ byId([{ member: 'orders.amount_commented', operator: 'gt', values: ['50'] }]),
+ idRows(1, 3, 5)
+ );
+ expect(sql).toContain('(amount -- as is\n) > $1');
+ });
+ });
+
+ // The wrapping must stay off atomic members, or every filter in every model
+ // would change shape.
+ describe('atomic members stay unwrapped', () => {
+ it('plain column dimension', async () => {
+ const [sql] = await buildSql(byId([
+ { member: 'orders.amount', operator: 'equals', values: ['100'] },
+ ]));
+ expect(sql).toContain('"orders".amount = ');
+ expect(sql).not.toContain('("orders".amount) = ');
+ });
+
+ it('aggregate measure', async () => {
+ const [sql] = await buildSql({
+ measures: ['orders.total'],
+ dimensions: ['orders.grp'],
+ filters: [{ member: 'orders.total', operator: 'gt', values: ['100'] }],
+ });
+ expect(sql).toContain('sum("orders".amount) > ');
+ expect(sql).not.toContain('(sum("orders".amount)) > ');
+ });
+ });
+});
diff --git a/packages/cubejs-schema-compiler/test/unit/base-query.test.ts b/packages/cubejs-schema-compiler/test/unit/base-query.test.ts
index cbc7352d841c0..10ef064f06814 100644
--- a/packages/cubejs-schema-compiler/test/unit/base-query.test.ts
+++ b/packages/cubejs-schema-compiler/test/unit/base-query.test.ts
@@ -2175,7 +2175,7 @@ describe('SQL Generation', () => {
const queryString = queryAndParams[0];
expect(queryString).toContain('1 = 1 "order__proxied"');
expect(queryString).toContain('(select * from order where 1 = 1) AS "order"');
- expect(queryString).toContain('WHERE (1 = 1 = ?)');
+ expect(queryString).toContain('WHERE ((1 = 1) = ?)');
});
it('correctly substitute filter params in cube\'s query measure used in filter', async () => {
diff --git a/packages/cubejs-server-core/CHANGELOG.md b/packages/cubejs-server-core/CHANGELOG.md
index f0c49783cf028..7e8cd40d1e07a 100644
--- a/packages/cubejs-server-core/CHANGELOG.md
+++ b/packages/cubejs-server-core/CHANGELOG.md
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [1.7.25](https://github.com/cube-js/cube/compare/v1.7.24...v1.7.25) (2026-08-21)
+
+**Note:** Version bump only for package @cubejs-backend/server-core
+
## [1.7.24](https://github.com/cube-js/cube/compare/v1.7.23...v1.7.24) (2026-08-19)
### Bug Fixes
diff --git a/packages/cubejs-server-core/package.json b/packages/cubejs-server-core/package.json
index 22b7e7387d888..f2357d6cb3d5a 100644
--- a/packages/cubejs-server-core/package.json
+++ b/packages/cubejs-server-core/package.json
@@ -2,7 +2,7 @@
"name": "@cubejs-backend/server-core",
"description": "Cube.js base component to wire all backend components together",
"author": "Cube Dev, Inc.",
- "version": "1.7.24",
+ "version": "1.7.25",
"repository": {
"type": "git",
"url": "https://github.com/cube-js/cube.git",
@@ -29,16 +29,16 @@
"unit": "jest --runInBand --forceExit --coverage dist/test"
},
"dependencies": {
- "@cubejs-backend/api-gateway": "1.7.24",
- "@cubejs-backend/base-driver": "1.7.24",
- "@cubejs-backend/cloud": "1.7.24",
- "@cubejs-backend/cubestore-driver": "1.7.24",
+ "@cubejs-backend/api-gateway": "1.7.25",
+ "@cubejs-backend/base-driver": "1.7.25",
+ "@cubejs-backend/cloud": "1.7.25",
+ "@cubejs-backend/cubestore-driver": "1.7.25",
"@cubejs-backend/dotenv": "^9.0.2",
- "@cubejs-backend/native": "1.7.24",
- "@cubejs-backend/query-orchestrator": "1.7.24",
- "@cubejs-backend/schema-compiler": "1.7.24",
- "@cubejs-backend/shared": "1.7.24",
- "@cubejs-backend/templates": "1.7.24",
+ "@cubejs-backend/native": "1.7.25",
+ "@cubejs-backend/query-orchestrator": "1.7.25",
+ "@cubejs-backend/schema-compiler": "1.7.25",
+ "@cubejs-backend/shared": "1.7.25",
+ "@cubejs-backend/templates": "1.7.25",
"codesandbox-import-utils": "^2.1.12",
"cross-spawn": "^7.0.1",
"fs-extra": "^8.1.0",
@@ -62,8 +62,8 @@
"ws": "^7.5.3"
},
"devDependencies": {
- "@cubejs-backend/linter": "1.7.24",
- "@cubejs-client/playground": "1.7.24",
+ "@cubejs-backend/linter": "1.7.25",
+ "@cubejs-client/playground": "1.7.25",
"@types/cross-spawn": "^6.0.2",
"@types/express": "^4.17.21",
"@types/fs-extra": "^9.0.8",
diff --git a/packages/cubejs-server/CHANGELOG.md b/packages/cubejs-server/CHANGELOG.md
index f811fc3ba4e12..03ec3b8410173 100644
--- a/packages/cubejs-server/CHANGELOG.md
+++ b/packages/cubejs-server/CHANGELOG.md
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [1.7.25](https://github.com/cube-js/cube/compare/v1.7.24...v1.7.25) (2026-08-21)
+
+**Note:** Version bump only for package @cubejs-backend/server
+
## [1.7.24](https://github.com/cube-js/cube/compare/v1.7.23...v1.7.24) (2026-08-19)
**Note:** Version bump only for package @cubejs-backend/server
diff --git a/packages/cubejs-server/package.json b/packages/cubejs-server/package.json
index 2d9243dadff50..a7dd6ddef3231 100644
--- a/packages/cubejs-server/package.json
+++ b/packages/cubejs-server/package.json
@@ -2,7 +2,7 @@
"name": "@cubejs-backend/server",
"description": "Cube.js all-in-one server",
"author": "Cube Dev, Inc.",
- "version": "1.7.24",
+ "version": "1.7.25",
"types": "index.d.ts",
"repository": {
"type": "git",
@@ -40,11 +40,11 @@
"jest:shapshot": "jest --updateSnapshot test"
},
"dependencies": {
- "@cubejs-backend/cubestore-driver": "1.7.24",
+ "@cubejs-backend/cubestore-driver": "1.7.25",
"@cubejs-backend/dotenv": "^9.0.2",
- "@cubejs-backend/native": "1.7.24",
- "@cubejs-backend/server-core": "1.7.24",
- "@cubejs-backend/shared": "1.7.24",
+ "@cubejs-backend/native": "1.7.25",
+ "@cubejs-backend/server-core": "1.7.25",
+ "@cubejs-backend/shared": "1.7.25",
"@oclif/color": "^1.0.0",
"@oclif/command": "^1.8.13",
"@oclif/config": "^1.18.2",
@@ -61,8 +61,8 @@
"ws": "^7.1.2"
},
"devDependencies": {
- "@cubejs-backend/linter": "1.7.24",
- "@cubejs-backend/query-orchestrator": "1.7.24",
+ "@cubejs-backend/linter": "1.7.25",
+ "@cubejs-backend/query-orchestrator": "1.7.25",
"@oclif/dev-cli": "^1.23.1",
"@types/body-parser": "^1.19.0",
"@types/cors": "^2.8.8",
diff --git a/packages/cubejs-snowflake-driver/CHANGELOG.md b/packages/cubejs-snowflake-driver/CHANGELOG.md
index 88b6f39c35ad1..d8f6a1e2d4acb 100644
--- a/packages/cubejs-snowflake-driver/CHANGELOG.md
+++ b/packages/cubejs-snowflake-driver/CHANGELOG.md
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [1.7.25](https://github.com/cube-js/cube/compare/v1.7.24...v1.7.25) (2026-08-21)
+
+**Note:** Version bump only for package @cubejs-backend/snowflake-driver
+
## [1.7.24](https://github.com/cube-js/cube/compare/v1.7.23...v1.7.24) (2026-08-19)
**Note:** Version bump only for package @cubejs-backend/snowflake-driver
diff --git a/packages/cubejs-snowflake-driver/package.json b/packages/cubejs-snowflake-driver/package.json
index dfd637ebe7d44..0ee9f6d9fd227 100644
--- a/packages/cubejs-snowflake-driver/package.json
+++ b/packages/cubejs-snowflake-driver/package.json
@@ -2,7 +2,7 @@
"name": "@cubejs-backend/snowflake-driver",
"description": "Cube.js Snowflake database driver",
"author": "Cube Dev, Inc.",
- "version": "1.7.24",
+ "version": "1.7.25",
"repository": {
"type": "git",
"url": "https://github.com/cube-js/cube.git",
@@ -29,8 +29,8 @@
},
"dependencies": {
"@aws-sdk/client-s3": "^3.726.0",
- "@cubejs-backend/base-driver": "1.7.24",
- "@cubejs-backend/shared": "1.7.24",
+ "@cubejs-backend/base-driver": "1.7.25",
+ "@cubejs-backend/shared": "1.7.25",
"snowflake-sdk": "^2.4.0"
},
"license": "Apache-2.0",
@@ -41,7 +41,7 @@
"extends": "../cubejs-linter"
},
"devDependencies": {
- "@cubejs-backend/linter": "1.7.24",
+ "@cubejs-backend/linter": "1.7.25",
"typescript": "~5.2.2",
"vitest": "^4"
}
diff --git a/packages/cubejs-sqlite-driver/CHANGELOG.md b/packages/cubejs-sqlite-driver/CHANGELOG.md
index 24ab1719cfd82..587328503c0e0 100644
--- a/packages/cubejs-sqlite-driver/CHANGELOG.md
+++ b/packages/cubejs-sqlite-driver/CHANGELOG.md
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [1.7.25](https://github.com/cube-js/cube/compare/v1.7.24...v1.7.25) (2026-08-21)
+
+**Note:** Version bump only for package @cubejs-backend/sqlite-driver
+
## [1.7.24](https://github.com/cube-js/cube/compare/v1.7.23...v1.7.24) (2026-08-19)
**Note:** Version bump only for package @cubejs-backend/sqlite-driver
diff --git a/packages/cubejs-sqlite-driver/package.json b/packages/cubejs-sqlite-driver/package.json
index 05ad10c9fffd5..1d8c4cecdf425 100644
--- a/packages/cubejs-sqlite-driver/package.json
+++ b/packages/cubejs-sqlite-driver/package.json
@@ -2,7 +2,7 @@
"name": "@cubejs-backend/sqlite-driver",
"description": "Cube.js Sqlite database driver",
"author": "Cube Dev, Inc.",
- "version": "1.7.24",
+ "version": "1.7.25",
"repository": {
"type": "git",
"url": "https://github.com/cube-js/cube.git",
@@ -18,13 +18,13 @@
"unit": "jest"
},
"dependencies": {
- "@cubejs-backend/base-driver": "1.7.24",
- "@cubejs-backend/shared": "1.7.24",
+ "@cubejs-backend/base-driver": "1.7.25",
+ "@cubejs-backend/shared": "1.7.25",
"sqlite3": "^5.1.7"
},
"license": "Apache-2.0",
"devDependencies": {
- "@cubejs-backend/linter": "1.7.24",
+ "@cubejs-backend/linter": "1.7.25",
"jest": "^29"
},
"publishConfig": {
diff --git a/packages/cubejs-templates/CHANGELOG.md b/packages/cubejs-templates/CHANGELOG.md
index 10de40ce15788..7eb3a00580eef 100644
--- a/packages/cubejs-templates/CHANGELOG.md
+++ b/packages/cubejs-templates/CHANGELOG.md
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [1.7.25](https://github.com/cube-js/cube/compare/v1.7.24...v1.7.25) (2026-08-21)
+
+**Note:** Version bump only for package @cubejs-backend/templates
+
## [1.7.24](https://github.com/cube-js/cube/compare/v1.7.23...v1.7.24) (2026-08-19)
**Note:** Version bump only for package @cubejs-backend/templates
diff --git a/packages/cubejs-templates/package.json b/packages/cubejs-templates/package.json
index 389d002095c21..7c2a29dfaec51 100644
--- a/packages/cubejs-templates/package.json
+++ b/packages/cubejs-templates/package.json
@@ -1,6 +1,6 @@
{
"name": "@cubejs-backend/templates",
- "version": "1.7.24",
+ "version": "1.7.25",
"description": "Cube.js Templates helpers",
"author": "Cube Dev, Inc.",
"repository": {
@@ -31,7 +31,7 @@
"extends": "../cubejs-linter"
},
"dependencies": {
- "@cubejs-backend/shared": "1.7.24",
+ "@cubejs-backend/shared": "1.7.25",
"cross-spawn": "^7.0.3",
"fs-extra": "^9.1.0",
"node-fetch": "^2.6.1",
@@ -40,7 +40,7 @@
"tar": "^7.5.22"
},
"devDependencies": {
- "@cubejs-backend/linter": "1.7.24",
+ "@cubejs-backend/linter": "1.7.25",
"typescript": "~5.2.2"
}
}
diff --git a/packages/cubejs-testing-drivers/CHANGELOG.md b/packages/cubejs-testing-drivers/CHANGELOG.md
index ef835cf207476..42f6524df1715 100644
--- a/packages/cubejs-testing-drivers/CHANGELOG.md
+++ b/packages/cubejs-testing-drivers/CHANGELOG.md
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [1.7.25](https://github.com/cube-js/cube/compare/v1.7.24...v1.7.25) (2026-08-21)
+
+**Note:** Version bump only for package @cubejs-backend/testing-drivers
+
## [1.7.24](https://github.com/cube-js/cube/compare/v1.7.23...v1.7.24) (2026-08-19)
**Note:** Version bump only for package @cubejs-backend/testing-drivers
diff --git a/packages/cubejs-testing-drivers/package.json b/packages/cubejs-testing-drivers/package.json
index 73a6fa15d78e8..7cc37ce5b83f2 100644
--- a/packages/cubejs-testing-drivers/package.json
+++ b/packages/cubejs-testing-drivers/package.json
@@ -1,6 +1,6 @@
{
"name": "@cubejs-backend/testing-drivers",
- "version": "1.7.24",
+ "version": "1.7.25",
"description": "Cube.js drivers test suite",
"author": "Cube Dev, Inc.",
"repository": {
@@ -87,29 +87,29 @@
"dist/src"
],
"dependencies": {
- "@cubejs-backend/athena-driver": "1.7.24",
- "@cubejs-backend/base-driver": "1.7.24",
- "@cubejs-backend/bigquery-driver": "1.7.24",
- "@cubejs-backend/clickhouse-driver": "1.7.24",
- "@cubejs-backend/crate-driver": "1.7.24",
- "@cubejs-backend/cubestore-driver": "1.7.24",
- "@cubejs-backend/databricks-jdbc-driver": "1.7.24",
+ "@cubejs-backend/athena-driver": "1.7.25",
+ "@cubejs-backend/base-driver": "1.7.25",
+ "@cubejs-backend/bigquery-driver": "1.7.25",
+ "@cubejs-backend/clickhouse-driver": "1.7.25",
+ "@cubejs-backend/crate-driver": "1.7.25",
+ "@cubejs-backend/cubestore-driver": "1.7.25",
+ "@cubejs-backend/databricks-jdbc-driver": "1.7.25",
"@cubejs-backend/dotenv": "^9.0.2",
- "@cubejs-backend/linter": "1.7.24",
- "@cubejs-backend/mssql-driver": "1.7.24",
- "@cubejs-backend/mysql-driver": "1.7.24",
- "@cubejs-backend/oracle-driver": "1.7.24",
- "@cubejs-backend/pinot-driver": "1.7.24",
- "@cubejs-backend/postgres-driver": "1.7.24",
- "@cubejs-backend/query-orchestrator": "1.7.24",
- "@cubejs-backend/questdb-driver": "1.7.24",
- "@cubejs-backend/server-core": "1.7.24",
- "@cubejs-backend/shared": "1.7.24",
- "@cubejs-backend/snowflake-driver": "1.7.24",
- "@cubejs-backend/testing-shared": "1.7.24",
- "@cubejs-backend/trino-driver": "1.7.24",
- "@cubejs-client/core": "1.7.24",
- "@cubejs-client/ws-transport": "1.7.24",
+ "@cubejs-backend/linter": "1.7.25",
+ "@cubejs-backend/mssql-driver": "1.7.25",
+ "@cubejs-backend/mysql-driver": "1.7.25",
+ "@cubejs-backend/oracle-driver": "1.7.25",
+ "@cubejs-backend/pinot-driver": "1.7.25",
+ "@cubejs-backend/postgres-driver": "1.7.25",
+ "@cubejs-backend/query-orchestrator": "1.7.25",
+ "@cubejs-backend/questdb-driver": "1.7.25",
+ "@cubejs-backend/server-core": "1.7.25",
+ "@cubejs-backend/shared": "1.7.25",
+ "@cubejs-backend/snowflake-driver": "1.7.25",
+ "@cubejs-backend/testing-shared": "1.7.25",
+ "@cubejs-backend/trino-driver": "1.7.25",
+ "@cubejs-client/core": "1.7.25",
+ "@cubejs-client/ws-transport": "1.7.25",
"@jest/globals": "^29",
"@types/jest": "^29",
"@types/node": "^22",
diff --git a/packages/cubejs-testing-shared/CHANGELOG.md b/packages/cubejs-testing-shared/CHANGELOG.md
index 205d72a8e7940..eab54380c1244 100644
--- a/packages/cubejs-testing-shared/CHANGELOG.md
+++ b/packages/cubejs-testing-shared/CHANGELOG.md
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [1.7.25](https://github.com/cube-js/cube/compare/v1.7.24...v1.7.25) (2026-08-21)
+
+**Note:** Version bump only for package @cubejs-backend/testing-shared
+
## [1.7.24](https://github.com/cube-js/cube/compare/v1.7.23...v1.7.24) (2026-08-19)
**Note:** Version bump only for package @cubejs-backend/testing-shared
diff --git a/packages/cubejs-testing-shared/package.json b/packages/cubejs-testing-shared/package.json
index 81a6ac59c32d2..def1ce97a25d7 100644
--- a/packages/cubejs-testing-shared/package.json
+++ b/packages/cubejs-testing-shared/package.json
@@ -1,6 +1,6 @@
{
"name": "@cubejs-backend/testing-shared",
- "version": "1.7.24",
+ "version": "1.7.25",
"description": "Cube.js Testing Helpers",
"author": "Cube Dev, Inc.",
"repository": {
@@ -26,16 +26,16 @@
],
"dependencies": {
"@cubejs-backend/dotenv": "^9.0.2",
- "@cubejs-backend/query-orchestrator": "1.7.24",
- "@cubejs-backend/schema-compiler": "1.7.24",
- "@cubejs-backend/shared": "1.7.24",
+ "@cubejs-backend/query-orchestrator": "1.7.25",
+ "@cubejs-backend/schema-compiler": "1.7.25",
+ "@cubejs-backend/shared": "1.7.25",
"@testcontainers/kafka": "~10.28.0",
"dedent": "^0.7.0",
"node-fetch": "^2.6.7",
"testcontainers": "^10.28.0"
},
"devDependencies": {
- "@cubejs-backend/linter": "1.7.24",
+ "@cubejs-backend/linter": "1.7.25",
"@jest/globals": "^29",
"@types/dedent": "^0.7.0",
"@types/jest": "^29",
diff --git a/packages/cubejs-testing/CHANGELOG.md b/packages/cubejs-testing/CHANGELOG.md
index e2d0dfef7945c..5f26145de3def 100644
--- a/packages/cubejs-testing/CHANGELOG.md
+++ b/packages/cubejs-testing/CHANGELOG.md
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [1.7.25](https://github.com/cube-js/cube/compare/v1.7.24...v1.7.25) (2026-08-21)
+
+**Note:** Version bump only for package @cubejs-backend/testing
+
## [1.7.24](https://github.com/cube-js/cube/compare/v1.7.23...v1.7.24) (2026-08-19)
**Note:** Version bump only for package @cubejs-backend/testing
diff --git a/packages/cubejs-testing/package.json b/packages/cubejs-testing/package.json
index b1359b80e57ae..ae7820dbdf655 100644
--- a/packages/cubejs-testing/package.json
+++ b/packages/cubejs-testing/package.json
@@ -1,6 +1,6 @@
{
"name": "@cubejs-backend/testing",
- "version": "1.7.24",
+ "version": "1.7.25",
"description": "Cube.js e2e tests",
"author": "Cube Dev, Inc.",
"repository": {
@@ -91,15 +91,15 @@
"birdbox-fixtures"
],
"dependencies": {
- "@cubejs-backend/cubestore-driver": "1.7.24",
+ "@cubejs-backend/cubestore-driver": "1.7.25",
"@cubejs-backend/dotenv": "^9.0.2",
- "@cubejs-backend/ksql-driver": "1.7.24",
- "@cubejs-backend/postgres-driver": "1.7.24",
- "@cubejs-backend/query-orchestrator": "1.7.24",
- "@cubejs-backend/schema-compiler": "1.7.24",
- "@cubejs-backend/shared": "1.7.24",
- "@cubejs-backend/testing-shared": "1.7.24",
- "@cubejs-client/ws-transport": "1.7.24",
+ "@cubejs-backend/ksql-driver": "1.7.25",
+ "@cubejs-backend/postgres-driver": "1.7.25",
+ "@cubejs-backend/query-orchestrator": "1.7.25",
+ "@cubejs-backend/schema-compiler": "1.7.25",
+ "@cubejs-backend/shared": "1.7.25",
+ "@cubejs-backend/testing-shared": "1.7.25",
+ "@cubejs-client/ws-transport": "1.7.25",
"dedent": "^0.7.0",
"fs-extra": "^8.1.0",
"http-proxy": "^1.18.1",
@@ -110,8 +110,8 @@
},
"devDependencies": {
"@4tw/cypress-drag-drop": "^1.6.0",
- "@cubejs-backend/linter": "1.7.24",
- "@cubejs-client/core": "1.7.24",
+ "@cubejs-backend/linter": "1.7.25",
+ "@cubejs-client/core": "1.7.25",
"@jest/globals": "^29",
"@types/dedent": "^0.7.0",
"@types/http-proxy": "^1.17.5",
diff --git a/packages/cubejs-trino-driver/CHANGELOG.md b/packages/cubejs-trino-driver/CHANGELOG.md
index 69604cebada66..57e7f1ea498be 100644
--- a/packages/cubejs-trino-driver/CHANGELOG.md
+++ b/packages/cubejs-trino-driver/CHANGELOG.md
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [1.7.25](https://github.com/cube-js/cube/compare/v1.7.24...v1.7.25) (2026-08-21)
+
+**Note:** Version bump only for package @cubejs-backend/trino-driver
+
## [1.7.24](https://github.com/cube-js/cube/compare/v1.7.23...v1.7.24) (2026-08-19)
**Note:** Version bump only for package @cubejs-backend/trino-driver
diff --git a/packages/cubejs-trino-driver/package.json b/packages/cubejs-trino-driver/package.json
index 70baaf14e3a89..404bdb48b9c79 100644
--- a/packages/cubejs-trino-driver/package.json
+++ b/packages/cubejs-trino-driver/package.json
@@ -2,7 +2,7 @@
"name": "@cubejs-backend/trino-driver",
"description": "Cube.js Trino database driver",
"author": "Cube Dev, Inc.",
- "version": "1.7.24",
+ "version": "1.7.25",
"repository": {
"type": "git",
"url": "https://github.com/cube-js/cube.git",
@@ -28,10 +28,10 @@
"lint:fix": "eslint --fix src/* --ext .ts"
},
"dependencies": {
- "@cubejs-backend/base-driver": "1.7.24",
- "@cubejs-backend/prestodb-driver": "1.7.24",
- "@cubejs-backend/schema-compiler": "1.7.24",
- "@cubejs-backend/shared": "1.7.24",
+ "@cubejs-backend/base-driver": "1.7.25",
+ "@cubejs-backend/prestodb-driver": "1.7.25",
+ "@cubejs-backend/schema-compiler": "1.7.25",
+ "@cubejs-backend/shared": "1.7.25",
"node-fetch": "^2.6.1",
"presto-client": "^1.2.0"
},
@@ -40,7 +40,7 @@
"access": "public"
},
"devDependencies": {
- "@cubejs-backend/linter": "1.7.24",
+ "@cubejs-backend/linter": "1.7.25",
"@types/jest": "^29",
"jest": "^29",
"testcontainers": "^10.28.0",
diff --git a/packages/cubejs-vertica-driver/CHANGELOG.md b/packages/cubejs-vertica-driver/CHANGELOG.md
index 09f5e4053f4f9..62605afed081f 100644
--- a/packages/cubejs-vertica-driver/CHANGELOG.md
+++ b/packages/cubejs-vertica-driver/CHANGELOG.md
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [1.7.25](https://github.com/cube-js/cube/compare/v1.7.24...v1.7.25) (2026-08-21)
+
+**Note:** Version bump only for package @cubejs-backend/vertica-driver
+
## [1.7.24](https://github.com/cube-js/cube/compare/v1.7.23...v1.7.24) (2026-08-19)
**Note:** Version bump only for package @cubejs-backend/vertica-driver
diff --git a/packages/cubejs-vertica-driver/package.json b/packages/cubejs-vertica-driver/package.json
index b1ec02da8332c..d7bca527d2e9d 100644
--- a/packages/cubejs-vertica-driver/package.json
+++ b/packages/cubejs-vertica-driver/package.json
@@ -2,7 +2,7 @@
"name": "@cubejs-backend/vertica-driver",
"description": "Cube.js Vertica database driver",
"author": "Eduard Karacharov, Tim Brown, Cube Dev, Inc.",
- "version": "1.7.24",
+ "version": "1.7.25",
"repository": {
"type": "git",
"url": "https://github.com/cube-js/cube.git",
@@ -19,16 +19,16 @@
"lint:fix": "eslint --fix **/*.js"
},
"dependencies": {
- "@cubejs-backend/base-driver": "1.7.24",
- "@cubejs-backend/query-orchestrator": "1.7.24",
- "@cubejs-backend/schema-compiler": "1.7.24",
- "@cubejs-backend/shared": "1.7.24",
+ "@cubejs-backend/base-driver": "1.7.25",
+ "@cubejs-backend/query-orchestrator": "1.7.25",
+ "@cubejs-backend/schema-compiler": "1.7.25",
+ "@cubejs-backend/shared": "1.7.25",
"vertica-nodejs": "^1.0.3"
},
"license": "Apache-2.0",
"devDependencies": {
- "@cubejs-backend/linter": "1.7.24",
- "@cubejs-backend/testing-shared": "1.7.24",
+ "@cubejs-backend/linter": "1.7.25",
+ "@cubejs-backend/testing-shared": "1.7.25",
"@types/jest": "^29",
"jest": "^29",
"testcontainers": "^10.28.0"
diff --git a/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan/filter/operators/comparison.rs b/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan/filter/operators/comparison.rs
index 084b748dbe81a..f7522f5ad6c24 100644
--- a/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan/filter/operators/comparison.rs
+++ b/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan/filter/operators/comparison.rs
@@ -6,10 +6,10 @@ impl FilterOperationSql for ComparisonOp {
fn to_sql(&self, ctx: &FilterSqlContext) -> Result {
let param = ctx.allocate_and_cast(&self.value, &self.member_type)?;
match self.kind {
- ComparisonKind::Gt => ctx.plan_templates.gt(ctx.member_sql.to_string(), param),
- ComparisonKind::Gte => ctx.plan_templates.gte(ctx.member_sql.to_string(), param),
- ComparisonKind::Lt => ctx.plan_templates.lt(ctx.member_sql.to_string(), param),
- ComparisonKind::Lte => ctx.plan_templates.lte(ctx.member_sql.to_string(), param),
+ ComparisonKind::Gt => ctx.plan_templates.gt(ctx.member_sql().to_string(), param),
+ ComparisonKind::Gte => ctx.plan_templates.gte(ctx.member_sql().to_string(), param),
+ ComparisonKind::Lt => ctx.plan_templates.lt(ctx.member_sql().to_string(), param),
+ ComparisonKind::Lte => ctx.plan_templates.lte(ctx.member_sql().to_string(), param),
}
}
}
diff --git a/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan/filter/operators/date_range.rs b/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan/filter/operators/date_range.rs
index e9d53c851642c..0ffcccb0ac84c 100644
--- a/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan/filter/operators/date_range.rs
+++ b/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan/filter/operators/date_range.rs
@@ -8,12 +8,12 @@ impl FilterOperationSql for DateRangeOp {
let to_param = ctx.format_and_allocate_to_date(&self.to)?;
match self.kind {
DateRangeKind::InRange => ctx.plan_templates.time_range_filter(
- ctx.member_sql.to_string(),
+ ctx.member_sql().to_string(),
from_param,
to_param,
),
DateRangeKind::NotInRange => ctx.plan_templates.time_not_in_range_filter(
- ctx.member_sql.to_string(),
+ ctx.member_sql().to_string(),
from_param,
to_param,
),
diff --git a/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan/filter/operators/date_single.rs b/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan/filter/operators/date_single.rs
index 803f27cd65816..39d724297b2ed 100644
--- a/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan/filter/operators/date_single.rs
+++ b/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan/filter/operators/date_single.rs
@@ -9,10 +9,10 @@ impl FilterOperationSql for DateSingleOp {
let param = ctx.format_and_allocate_from_date(&self.value)?;
match self.kind {
DateSingleKind::Before => {
- ctx.plan_templates.lt(ctx.member_sql.to_string(), param)
+ ctx.plan_templates.lt(ctx.member_sql().to_string(), param)
}
DateSingleKind::AfterOrOn => {
- ctx.plan_templates.gte(ctx.member_sql.to_string(), param)
+ ctx.plan_templates.gte(ctx.member_sql().to_string(), param)
}
_ => unreachable!(),
}
@@ -21,10 +21,10 @@ impl FilterOperationSql for DateSingleOp {
let param = ctx.format_and_allocate_to_date(&self.value)?;
match self.kind {
DateSingleKind::BeforeOrOn => {
- ctx.plan_templates.lte(ctx.member_sql.to_string(), param)
+ ctx.plan_templates.lte(ctx.member_sql().to_string(), param)
}
DateSingleKind::After => {
- ctx.plan_templates.gt(ctx.member_sql.to_string(), param)
+ ctx.plan_templates.gt(ctx.member_sql().to_string(), param)
}
_ => unreachable!(),
}
diff --git a/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan/filter/operators/equality.rs b/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan/filter/operators/equality.rs
index 52ed6682cc146..2d6a049eb8f21 100644
--- a/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan/filter/operators/equality.rs
+++ b/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan/filter/operators/equality.rs
@@ -9,10 +9,10 @@ impl FilterOperationSql for EqualityOp {
let need_null_check = self.negated;
if self.negated {
ctx.plan_templates
- .not_equals(ctx.member_sql.to_string(), param, need_null_check)
+ .not_equals(ctx.member_sql().to_string(), param, need_null_check)
} else {
ctx.plan_templates
- .equals(ctx.member_sql.to_string(), param, false)
+ .equals(ctx.member_sql().to_string(), param, false)
}
}
}
diff --git a/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan/filter/operators/filter_sql_context.rs b/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan/filter/operators/filter_sql_context.rs
index 1fac6523df484..473a5f8db9804 100644
--- a/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan/filter/operators/filter_sql_context.rs
+++ b/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan/filter/operators/filter_sql_context.rs
@@ -2,6 +2,7 @@ use crate::cube_bridge::base_query_options::FilterValue;
use crate::planner::query_tools::QueryTools;
use crate::planner::sql_templates::{PlanSqlTemplates, TemplateProjectionColumn};
use crate::planner::QueryDateTimeHelper;
+use crate::utils::sql_expression_scanner::{ends_in_line_comment, is_top_level_compound};
use cubenativeutils::CubeError;
use std::rc::Rc;
@@ -15,7 +16,7 @@ enum DateBound {
}
pub struct FilterSqlContext<'a> {
- pub member_sql: &'a str,
+ member_sql: String,
pub query_tools: &'a Rc,
pub plan_templates: &'a PlanSqlTemplates,
pub use_db_time_zone: bool,
@@ -23,6 +24,47 @@ pub struct FilterSqlContext<'a> {
}
impl<'a> FilterSqlContext<'a> {
+ pub fn new(
+ member_sql: &str,
+ query_tools: &'a Rc,
+ plan_templates: &'a PlanSqlTemplates,
+ use_db_time_zone: bool,
+ use_raw_values: bool,
+ ) -> Self {
+ Self {
+ member_sql: Self::as_operand(member_sql),
+ query_tools,
+ plan_templates,
+ use_db_time_zone,
+ use_raw_values,
+ }
+ }
+
+ /// The member's SQL as a single operand: safe to place next to an operator
+ /// of any precedence.
+ pub fn member_sql(&self) -> &str {
+ &self.member_sql
+ }
+
+ // A member's SQL is an expression of unknown shape. When its own top-level
+ // operator binds weaker than the operator a filter template puts beside it,
+ // the bare splice re-associates and that operator captures only the tail of
+ // the member expression — a syntax error on some dialects, a silently
+ // different predicate on the rest. Parentheses pin the whole expression as
+ // one operand; an atomic expression needs none and keeps its shape.
+ fn as_operand(member_sql: &str) -> String {
+ // An expression ending in a line comment swallows whatever the template
+ // appends on that line, so it needs the wrapping — and a line of its own
+ // for the closing parenthesis — however atomic it otherwise is.
+ if ends_in_line_comment(member_sql) {
+ return format!("({}\n)", member_sql);
+ }
+ if !is_top_level_compound(member_sql) {
+ return member_sql.to_string();
+ }
+ format!("({})", member_sql)
+ }
+
pub fn allocate_param(&self, value: &str) -> String {
self.query_tools.allocate_param(value)
}
@@ -218,3 +260,40 @@ impl<'a> FilterSqlContext<'a> {
pub trait FilterOperationSql {
fn to_sql(&self, ctx: &FilterSqlContext) -> Result;
}
+
+#[cfg(test)]
+mod tests {
+ use super::FilterSqlContext;
+
+ fn as_operand(member_sql: &str) -> String {
+ FilterSqlContext::as_operand(member_sql)
+ }
+
+ #[test]
+ fn atomic_expression_stays_bare() {
+ assert_eq!(as_operand("amount"), "amount");
+ assert_eq!(as_operand("sum(amount)"), "sum(amount)");
+ assert_eq!(as_operand(""), "");
+ }
+
+ #[test]
+ fn compound_expression_is_wrapped() {
+ assert_eq!(as_operand("amount > 50"), "(amount > 50)");
+ assert_eq!(
+ as_operand("sum(amount) IS NOT NULL"),
+ "(sum(amount) IS NOT NULL)"
+ );
+ }
+
+ // The closing parenthesis, not precedence, is what a trailing line comment
+ // threatens, so the comment decides before atomicity does.
+ #[test]
+ fn trailing_line_comment_wraps_on_its_own_line() {
+ assert_eq!(as_operand("amount -- as is"), "(amount -- as is\n)");
+ assert_eq!(
+ as_operand("amount + 1 -- one more"),
+ "(amount + 1 -- one more\n)"
+ );
+ assert_eq!(as_operand("amount -- note\n + 1"), "(amount -- note\n + 1)");
+ }
+}
diff --git a/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan/filter/operators/in_list.rs b/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan/filter/operators/in_list.rs
index bf75934571463..1845c8764f4d7 100644
--- a/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan/filter/operators/in_list.rs
+++ b/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan/filter/operators/in_list.rs
@@ -9,11 +9,14 @@ impl FilterOperationSql for InListOp {
let allocated = ctx.allocate_and_cast_values(&self.values, &self.member_type)?;
if self.negated {
- ctx.plan_templates
- .not_in_where(ctx.member_sql.to_string(), allocated, need_null_check)
+ ctx.plan_templates.not_in_where(
+ ctx.member_sql().to_string(),
+ allocated,
+ need_null_check,
+ )
} else {
ctx.plan_templates
- .in_where(ctx.member_sql.to_string(), allocated, need_null_check)
+ .in_where(ctx.member_sql().to_string(), allocated, need_null_check)
}
}
}
diff --git a/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan/filter/operators/like.rs b/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan/filter/operators/like.rs
index 1c8f491a6c11b..f94500c74a9e5 100644
--- a/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan/filter/operators/like.rs
+++ b/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan/filter/operators/like.rs
@@ -20,7 +20,7 @@ impl FilterOperationSql for LikeOp {
.into_iter()
.map(|v| {
ctx.plan_templates.ilike(
- ctx.member_sql,
+ ctx.member_sql(),
&v,
self.start_wild,
self.end_wild,
@@ -37,7 +37,7 @@ impl FilterOperationSql for LikeOp {
};
let null_check = if need_null_check {
ctx.plan_templates
- .or_is_null_check(ctx.member_sql.to_string())?
+ .or_is_null_check(ctx.member_sql().to_string())?
} else {
"".to_string()
};
diff --git a/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan/filter/operators/nullability.rs b/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan/filter/operators/nullability.rs
index 5ee721955a062..6d7c295b17063 100644
--- a/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan/filter/operators/nullability.rs
+++ b/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan/filter/operators/nullability.rs
@@ -5,9 +5,10 @@ use cubenativeutils::CubeError;
impl FilterOperationSql for NullabilityOp {
fn to_sql(&self, ctx: &FilterSqlContext) -> Result {
if self.negated {
- ctx.plan_templates.not_set_where(ctx.member_sql.to_string())
+ ctx.plan_templates
+ .not_set_where(ctx.member_sql().to_string())
} else {
- ctx.plan_templates.set_where(ctx.member_sql.to_string())
+ ctx.plan_templates.set_where(ctx.member_sql().to_string())
}
}
}
diff --git a/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan/filter/operators/rolling_window.rs b/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan/filter/operators/rolling_window.rs
index c77063dfde259..88d62d5e7f8b3 100644
--- a/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan/filter/operators/rolling_window.rs
+++ b/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan/filter/operators/rolling_window.rs
@@ -11,7 +11,7 @@ impl FilterOperationSql for RegularRollingWindowOp {
let from = ctx.extend_date_range_bound(from, &self.trailing, true)?;
let to = ctx.extend_date_range_bound(to, &self.leading, false)?;
- let date_field = ctx.convert_tz(ctx.member_sql)?;
+ let date_field = ctx.convert_tz(ctx.member_sql())?;
match (&from, &to) {
(Some(from), Some(to)) => {
@@ -28,7 +28,7 @@ impl FilterOperationSql for RegularRollingWindowOp {
impl FilterOperationSql for RollingWindowOffsetOp {
fn to_sql(&self, ctx: &FilterSqlContext) -> Result {
let from_start = self.offset == "start";
- let member = ctx.member_sql.to_string();
+ let member = ctx.member_sql().to_string();
// Anchor: range start (formatted to start-of-day) for offset 'start',
// range end (formatted to end-of-day) for 'end'. Both bounds share it.
diff --git a/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan/filter/operators/to_date_rolling_window.rs b/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan/filter/operators/to_date_rolling_window.rs
index e3a1b2f5883f6..69ea9a7bb1144 100644
--- a/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan/filter/operators/to_date_rolling_window.rs
+++ b/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan/filter/operators/to_date_rolling_window.rs
@@ -10,7 +10,7 @@ impl FilterOperationSql for ToDateRollingWindowOp {
.granularity
.apply_to_input_sql(ctx.plan_templates, from)?;
- let date_field = ctx.convert_tz(ctx.member_sql)?;
+ let date_field = ctx.convert_tz(ctx.member_sql())?;
ctx.plan_templates.time_range_filter(date_field, from, to)
}
}
diff --git a/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan/filter/typed_filter.rs b/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan/filter/typed_filter.rs
index bb9acc21f293e..237608a105a94 100644
--- a/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan/filter/typed_filter.rs
+++ b/rust/cube/cubesqlplanner/cubesqlplanner/src/physical_plan/filter/typed_filter.rs
@@ -34,13 +34,13 @@ impl ToSql for TypedFilter {
let resolved = resolve_base_symbol(self.member_evaluator());
let member_sql = visitor.apply_for_filter(&resolved, node_processor, templates)?;
- let ctx = FilterSqlContext {
- member_sql: &member_sql,
- query_tools: &query_tools,
- plan_templates: templates,
- use_db_time_zone: !filters_ctx.use_local_tz,
- use_raw_values: self.use_raw_values(),
- };
+ let ctx = FilterSqlContext::new(
+ &member_sql,
+ &query_tools,
+ templates,
+ !filters_ctx.use_local_tz,
+ self.use_raw_values(),
+ );
dispatch_to_sql(self.operation(), &ctx)
}
@@ -76,13 +76,13 @@ impl TypedFilter {
} else {
column_sql.as_str()
};
- let ctx = FilterSqlContext {
+ let ctx = FilterSqlContext::new(
member_sql,
query_tools,
plan_templates,
use_db_time_zone,
- use_raw_values: self.use_raw_values(),
- };
+ self.use_raw_values(),
+ );
dispatch_to_sql(self.operation(), &ctx)
}
FilterParamsColumn::Compiled(compiled) => {
@@ -141,13 +141,13 @@ impl TypedFilter {
// RollingWindowOffset carries [from, to, trailing, leading, offset];
// only the from/to dates are filter-param args for the callback.
FilterOp::DateRange(_) | FilterOp::DateSingle(_) | FilterOp::RollingWindowOffset(_) => {
- let ctx = FilterSqlContext {
- member_sql: "",
+ let ctx = FilterSqlContext::new(
+ "",
query_tools,
plan_templates,
use_db_time_zone,
- use_raw_values: self.use_raw_values(),
- };
+ self.use_raw_values(),
+ );
let from = self
.values()
.first()
diff --git a/rust/cube/cubesqlplanner/cubesqlplanner/src/test_fixtures/schemas/yaml_files/common/filter_operand.yaml b/rust/cube/cubesqlplanner/cubesqlplanner/src/test_fixtures/schemas/yaml_files/common/filter_operand.yaml
new file mode 100644
index 0000000000000..7fe1d35d36883
--- /dev/null
+++ b/rust/cube/cubesqlplanner/cubesqlplanner/src/test_fixtures/schemas/yaml_files/common/filter_operand.yaml
@@ -0,0 +1,64 @@
+cubes:
+ - name: orders
+ sql: "SELECT * FROM orders"
+ dimensions:
+ - name: id
+ type: number
+ sql: id
+ primary_key: true
+ - name: amount
+ type: number
+ sql: amount
+ - name: flag
+ type: boolean
+ sql: flag
+ - name: note
+ type: string
+ sql: note
+ - name: created_at
+ type: time
+ sql: created_at
+
+ # Top-level AND/OR — bind weaker than every filter operator.
+ - name: big_and_flag
+ type: boolean
+ sql: "{CUBE}.amount > 50 AND {CUBE}.flag"
+ - name: big_or_flag
+ type: boolean
+ sql: "{CUBE}.amount > 50 OR {CUBE}.flag"
+
+ # Top-level comparison — a second one next to it is a syntax error on
+ # Postgres and Trino alike.
+ - name: big
+ type: boolean
+ sql: "{CUBE}.amount > 50"
+
+ - name: amount_plus
+ type: number
+ sql: "{CUBE}.amount + 1"
+ - name: note_tagged
+ type: string
+ sql: "{CUBE}.note || '-tag'"
+ - name: shifted_at
+ type: time
+ sql: "{CUBE}.created_at + INTERVAL '1 day'"
+
+ # Atomic, but a trailing line comment still swallows whatever the
+ # template appends on that line.
+ - name: amount_commented
+ type: number
+ sql: "{CUBE}.amount -- as is"
+
+ measures:
+ - name: count
+ type: count
+ - name: total
+ type: sum
+ sql: amount
+ # The reported model's shape: a calculated boolean over a plain measure.
+ - name: total_is_set
+ type: boolean
+ sql: "{total} IS NOT NULL"
+ - name: total_over_150
+ type: boolean
+ sql: "{total} > 150"
diff --git a/rust/cube/cubesqlplanner/cubesqlplanner/src/test_fixtures/schemas/yaml_files/common/integration_basic.yaml b/rust/cube/cubesqlplanner/cubesqlplanner/src/test_fixtures/schemas/yaml_files/common/integration_basic.yaml
index 88ee2c318db8d..11d26426fe97e 100644
--- a/rust/cube/cubesqlplanner/cubesqlplanner/src/test_fixtures/schemas/yaml_files/common/integration_basic.yaml
+++ b/rust/cube/cubesqlplanner/cubesqlplanner/src/test_fixtures/schemas/yaml_files/common/integration_basic.yaml
@@ -15,6 +15,11 @@ cubes:
- name: full_location
type: string
sql: "CONCAT({CUBE}.name, ' from ', {CUBE}.city)"
+ # Top-level OR over a nullable column, so the whole expression can be
+ # NULL while neither operand's own IS NULL is true.
+ - name: is_ny_or_alice
+ type: boolean
+ sql: "{CUBE}.city = 'New York' OR {CUBE}.name LIKE 'Alice%'"
measures:
- name: count
type: count
@@ -51,12 +56,26 @@ cubes:
- name: customer_id
type: number
sql: customer_id
+ # Top-level AND — binds weaker than the filter's own operator. The
+ # second operand carries its own parentheses so the mis-parse stays
+ # valid SQL and shows up as wrong rows rather than a syntax error.
+ - name: is_big_completed
+ type: boolean
+ sql: "{CUBE}.amount > 100 AND ({CUBE}.status = 'completed')"
+ # Top-level comparison — a second one next to it is a syntax error.
+ - name: is_big
+ type: boolean
+ sql: "{CUBE}.amount > 100"
measures:
- name: count
type: count
- name: total_amount
type: sum
sql: amount
+ # The reported model's shape: a calculated boolean over a measure.
+ - name: total_amount_is_set
+ type: boolean
+ sql: "{total_amount} IS NOT NULL"
- name: avg_amount
type: avg
sql: amount
diff --git a/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/filter/member_operand.rs b/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/filter/member_operand.rs
new file mode 100644
index 0000000000000..7de56350e0c7c
--- /dev/null
+++ b/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/filter/member_operand.rs
@@ -0,0 +1,290 @@
+//! A filter template splices the member's rendered SQL next to an operator of
+//! its own, so the member has to arrive as a single operand. These tests pin the
+//! parenthesization per operator: a compound member is wrapped, an atomic one is
+//! left alone, and a trailing line comment forces the wrap on its own line.
+
+use super::assert_filter;
+use crate::cube_bridge::base_query_options::FilterValue;
+use crate::test_fixtures::cube_bridge::MockSchema;
+use crate::test_fixtures::test_utils::TestContext;
+use indoc::indoc;
+
+fn build(filter_yaml: &str) -> (String, Vec) {
+ let schema = MockSchema::from_yaml_file("common/filter_operand.yaml");
+ let ctx = TestContext::new(schema).unwrap();
+ let query = format!("measures:\n - orders.count\n{}", filter_yaml);
+ ctx.build_filter_sql(&query)
+ .expect("Should generate filter SQL")
+}
+
+const AND_MEMBER: &str = r#"("orders".amount > 50 AND "orders".flag)"#;
+const NUM_MEMBER: &str = r#"("orders".amount + 1)"#;
+const STR_MEMBER: &str = r#"("orders".note || '-tag')"#;
+const TS_MEMBER: &str = r#"("orders".created_at + INTERVAL '1 day')"#;
+
+// ── equality ────────────────────────────────────────────────────────────────
+
+#[test]
+fn test_equals_compound_member() {
+ let result = build(indoc! {"
+ filters:
+ - dimension: orders.big_and_flag
+ operator: equals
+ values:
+ - \"true\"
+ "});
+ assert_filter(
+ &result,
+ &format!("({AND_MEMBER} = $_0_$::boolean)"),
+ &["true"],
+ );
+}
+
+#[test]
+fn test_not_equals_compound_member() {
+ let result = build(indoc! {"
+ filters:
+ - dimension: orders.big_and_flag
+ operator: notEquals
+ values:
+ - \"true\"
+ "});
+ assert_filter(
+ &result,
+ &format!("({AND_MEMBER} <> $_0_$::boolean OR {AND_MEMBER} IS NULL)"),
+ &["true"],
+ );
+}
+
+#[test]
+fn test_in_list_compound_member() {
+ let result = build(indoc! {"
+ filters:
+ - dimension: orders.big_and_flag
+ operator: equals
+ values:
+ - \"true\"
+ - \"false\"
+ "});
+ assert_filter(
+ &result,
+ &format!("({AND_MEMBER} IN ($_0_$::boolean, $_1_$::boolean))"),
+ &["true", "false"],
+ );
+}
+
+#[test]
+fn test_not_in_list_compound_member() {
+ let result = build(indoc! {"
+ filters:
+ - dimension: orders.big_and_flag
+ operator: notEquals
+ values:
+ - \"true\"
+ - \"false\"
+ "});
+ assert_filter(
+ &result,
+ &format!("({AND_MEMBER} NOT IN ($_0_$::boolean, $_1_$::boolean) OR {AND_MEMBER} IS NULL)"),
+ &["true", "false"],
+ );
+}
+
+// ── nullability ─────────────────────────────────────────────────────────────
+
+#[test]
+fn test_set_compound_member() {
+ let result = build(indoc! {"
+ filters:
+ - dimension: orders.big_and_flag
+ operator: set
+ "});
+ assert_filter(&result, &format!("({AND_MEMBER} IS NOT NULL)"), &[]);
+}
+
+#[test]
+fn test_not_set_compound_member() {
+ let result = build(indoc! {"
+ filters:
+ - dimension: orders.big_or_flag
+ operator: notSet
+ "});
+ assert_filter(
+ &result,
+ r#"(("orders".amount > 50 OR "orders".flag) IS NULL)"#,
+ &[],
+ );
+}
+
+// ── comparison ──────────────────────────────────────────────────────────────
+
+#[test]
+fn test_gt_compound_member() {
+ let result = build(indoc! {"
+ filters:
+ - dimension: orders.amount_plus
+ operator: gt
+ values:
+ - \"10\"
+ "});
+ assert_filter(
+ &result,
+ &format!("({NUM_MEMBER} > $_0_$::numeric)"),
+ &["10"],
+ );
+}
+
+#[test]
+fn test_lte_compound_member() {
+ let result = build(indoc! {"
+ filters:
+ - dimension: orders.amount_plus
+ operator: lte
+ values:
+ - \"10\"
+ "});
+ assert_filter(
+ &result,
+ &format!("({NUM_MEMBER} <= $_0_$::numeric)"),
+ &["10"],
+ );
+}
+
+// ── like ────────────────────────────────────────────────────────────────────
+
+#[test]
+fn test_contains_compound_member() {
+ let result = build(indoc! {"
+ filters:
+ - dimension: orders.note_tagged
+ operator: contains
+ values:
+ - alpha
+ "});
+ assert_filter(
+ &result,
+ &format!("(({STR_MEMBER} ILIKE '%' || $_0_$|| '%'))"),
+ &["alpha"],
+ );
+}
+
+#[test]
+fn test_starts_with_compound_member() {
+ let result = build(indoc! {"
+ filters:
+ - dimension: orders.note_tagged
+ operator: startsWith
+ values:
+ - alpha
+ "});
+ assert_filter(
+ &result,
+ &format!("(({STR_MEMBER} ILIKE $_0_$|| '%'))"),
+ &["alpha"],
+ );
+}
+
+// ── date ────────────────────────────────────────────────────────────────────
+
+#[test]
+fn test_in_date_range_compound_member() {
+ let result = build(indoc! {"
+ filters:
+ - dimension: orders.shifted_at
+ operator: inDateRange
+ values:
+ - '2024-01-01T00:00:00.000'
+ - '2024-01-31T23:59:59.999'
+ "});
+ assert_filter(
+ &result,
+ &format!("({TS_MEMBER} >= $_0_$::timestamptz AND {TS_MEMBER} <= $_1_$::timestamptz)"),
+ &["2024-01-01T00:00:00.000", "2024-01-31T23:59:59.999"],
+ );
+}
+
+// ── HAVING: measures ────────────────────────────────────────────────────────
+
+// The reported model: unparenthesized this is `sum(...) IS NOT NULL = ...`,
+// which Trino and Athena reject.
+#[test]
+fn test_equals_compound_measure() {
+ let result = build(indoc! {"
+ filters:
+ - member: orders.total_is_set
+ operator: equals
+ values:
+ - \"true\"
+ "});
+ assert_filter(
+ &result,
+ r#"((sum("orders".amount) IS NOT NULL) = $_0_$::boolean)"#,
+ &["true"],
+ );
+}
+
+#[test]
+fn test_equals_comparison_measure() {
+ let result = build(indoc! {"
+ filters:
+ - member: orders.total_over_150
+ operator: equals
+ values:
+ - \"true\"
+ "});
+ assert_filter(
+ &result,
+ r#"((sum("orders".amount) > 150) = $_0_$::boolean)"#,
+ &["true"],
+ );
+}
+
+// ── members that must NOT be wrapped ────────────────────────────────────────
+
+#[test]
+fn test_atomic_dimension_is_not_wrapped() {
+ let result = build(indoc! {"
+ filters:
+ - dimension: orders.amount
+ operator: equals
+ values:
+ - \"100\"
+ "});
+ assert_filter(&result, r#"("orders".amount = $_0_$::numeric)"#, &["100"]);
+}
+
+#[test]
+fn test_aggregate_measure_is_not_wrapped() {
+ let result = build(indoc! {"
+ filters:
+ - member: orders.total
+ operator: gt
+ values:
+ - \"100\"
+ "});
+ assert_filter(
+ &result,
+ r#"(sum("orders".amount) > $_0_$::numeric)"#,
+ &["100"],
+ );
+}
+
+// ── trailing line comment ───────────────────────────────────────────────────
+
+// The closing parenthesis, not precedence, is what the comment threatens, so an
+// atomic member needs the wrap too — with the parenthesis on its own line.
+#[test]
+fn test_atomic_member_ending_in_line_comment() {
+ let result = build(indoc! {"
+ filters:
+ - dimension: orders.amount_commented
+ operator: gt
+ values:
+ - \"50\"
+ "});
+ assert_filter(
+ &result,
+ "((\"orders\".amount -- as is\n) > $_0_$::numeric)",
+ &["50"],
+ );
+}
diff --git a/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/filter/mod.rs b/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/filter/mod.rs
index debdf0463eebe..3362a5d4c0539 100644
--- a/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/filter/mod.rs
+++ b/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/filter/mod.rs
@@ -1,3 +1,4 @@
+mod member_operand;
mod partition_range;
mod to_sql;
mod to_sql_timezone;
diff --git a/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/filter_member_operand.rs b/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/filter_member_operand.rs
new file mode 100644
index 0000000000000..52909cb381a55
--- /dev/null
+++ b/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/filter_member_operand.rs
@@ -0,0 +1,122 @@
+//! A filter template splices the member's rendered SQL next to an operator of
+//! its own. Left unparenthesized, a member whose own top-level operator binds
+//! weaker re-associates: the filter operator captures only the tail of the
+//! member expression. These tests check the rows rather than the SQL, because
+//! the dangerous form of the mis-parse is valid SQL over a different row set —
+//! the emitted text alone cannot tell that one from the intended reading. The
+//! parentheses themselves are pinned per operator in
+//! `tests/filter/member_operand.rs`.
+
+use crate::test_fixtures::cube_bridge::MockSchema;
+use crate::test_fixtures::test_utils::TestContext;
+use indoc::indoc;
+
+const SEED: &str = "integration_basic_tables.sql";
+
+fn create_context() -> TestContext {
+ let schema = MockSchema::from_yaml_file("common/integration_basic.yaml");
+ TestContext::new(schema).unwrap()
+}
+
+// `is_big_completed` = `amount > 100 AND (status = 'completed')` is false for
+// orders 1, 3, 5, 7, 9 → count=5. The mis-parse reads `amount > 100 AND
+// ((status = 'completed') = false)`, i.e. big-but-not-completed, which matches
+// nothing — valid SQL, silently zero rows.
+#[tokio::test(flavor = "multi_thread")]
+async fn test_equals_false_on_and_dimension() {
+ let ctx = create_context();
+
+ let query = indoc! {r#"
+ measures:
+ - orders.count
+ filters:
+ - member: orders.is_big_completed
+ operator: equals
+ values:
+ - "false"
+ "#};
+
+ ctx.build_sql(query).unwrap();
+
+ if let Some(result) = ctx.try_execute_pg(query, SEED).await {
+ insta::assert_snapshot!(result);
+ }
+}
+
+// `is_ny_or_alice` = `city = 'New York' OR name LIKE 'Alice%'` is NULL only for
+// Charlie Brown, whose city is NULL and whose name does not match → customer 3.
+// The mis-parse reads `city = 'New York' OR (name LIKE 'Alice%') IS NULL`, whose
+// right side is never NULL, so it degenerates to the New York customers.
+#[tokio::test(flavor = "multi_thread")]
+async fn test_not_set_on_or_dimension() {
+ let ctx = create_context();
+
+ let query = indoc! {r#"
+ dimensions:
+ - customers.id
+ filters:
+ - member: customers.is_ny_or_alice
+ operator: notSet
+ order:
+ - id: customers.id
+ "#};
+
+ ctx.build_sql(query).unwrap();
+
+ if let Some(result) = ctx.try_execute_pg(query, SEED).await {
+ insta::assert_snapshot!(result);
+ }
+}
+
+// `is_big` = `amount > 100`. Unparenthesized this renders
+// `amount > 100 = $1::boolean`, which Postgres rejects outright — comparison
+// operators do not associate — so reaching any rows at all is the assertion.
+#[tokio::test(flavor = "multi_thread")]
+async fn test_equals_true_on_comparison_dimension() {
+ let ctx = create_context();
+
+ let query = indoc! {r#"
+ measures:
+ - orders.count
+ filters:
+ - member: orders.is_big
+ operator: equals
+ values:
+ - "true"
+ "#};
+
+ ctx.build_sql(query).unwrap();
+
+ if let Some(result) = ctx.try_execute_pg(query, SEED).await {
+ insta::assert_snapshot!(result);
+ }
+}
+
+// The HAVING counterpart of the reported model: `sum(...) IS NOT NULL` compared
+// to a boolean, which is what Trino and Athena reject. Postgres happens to parse
+// the unparenthesized form the intended way, so this one cannot tell the two
+// apart on rows — it guards the shape against a future regression that would
+// reach further than precedence, and the operator matrix in
+// `tests/filter/member_operand.rs` is what pins the parentheses here.
+#[tokio::test(flavor = "multi_thread")]
+async fn test_equals_on_calculated_boolean_measure() {
+ let ctx = create_context();
+
+ let query = indoc! {r#"
+ dimensions:
+ - orders.status
+ filters:
+ - member: orders.total_amount_is_set
+ operator: equals
+ values:
+ - "true"
+ order:
+ - id: orders.status
+ "#};
+
+ ctx.build_sql(query).unwrap();
+
+ if let Some(result) = ctx.try_execute_pg(query, SEED).await {
+ insta::assert_snapshot!(result);
+ }
+}
diff --git a/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/mod.rs b/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/mod.rs
index c2c09b60c98de..6a85e4341d90b 100644
--- a/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/mod.rs
+++ b/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/mod.rs
@@ -7,6 +7,7 @@ mod chained_subquery;
mod combinations;
mod cubestore;
mod custom_granularities;
+mod filter_member_operand;
mod filtered_measures;
mod filters_segments;
mod joins;
diff --git a/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/snapshots/cubesqlplanner__tests__integration__filter_member_operand__equals_false_on_and_dimension.snap b/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/snapshots/cubesqlplanner__tests__integration__filter_member_operand__equals_false_on_and_dimension.snap
new file mode 100644
index 0000000000000..23c794675209b
--- /dev/null
+++ b/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/snapshots/cubesqlplanner__tests__integration__filter_member_operand__equals_false_on_and_dimension.snap
@@ -0,0 +1,7 @@
+---
+source: cubesqlplanner/cubesqlplanner/src/tests/integration/filter_member_operand.rs
+expression: result
+---
+orders__count
+-------------
+5
diff --git a/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/snapshots/cubesqlplanner__tests__integration__filter_member_operand__equals_on_calculated_boolean_measure.snap b/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/snapshots/cubesqlplanner__tests__integration__filter_member_operand__equals_on_calculated_boolean_measure.snap
new file mode 100644
index 0000000000000..49007ad6b3021
--- /dev/null
+++ b/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/snapshots/cubesqlplanner__tests__integration__filter_member_operand__equals_on_calculated_boolean_measure.snap
@@ -0,0 +1,9 @@
+---
+source: cubesqlplanner/cubesqlplanner/src/tests/integration/filter_member_operand.rs
+expression: result
+---
+orders__status
+--------------
+cancelled
+completed
+pending
diff --git a/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/snapshots/cubesqlplanner__tests__integration__filter_member_operand__equals_true_on_comparison_dimension.snap b/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/snapshots/cubesqlplanner__tests__integration__filter_member_operand__equals_true_on_comparison_dimension.snap
new file mode 100644
index 0000000000000..6f751708f8bf1
--- /dev/null
+++ b/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/snapshots/cubesqlplanner__tests__integration__filter_member_operand__equals_true_on_comparison_dimension.snap
@@ -0,0 +1,7 @@
+---
+source: cubesqlplanner/cubesqlplanner/src/tests/integration/filter_member_operand.rs
+expression: result
+---
+orders__count
+-------------
+4
diff --git a/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/snapshots/cubesqlplanner__tests__integration__filter_member_operand__not_set_on_or_dimension.snap b/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/snapshots/cubesqlplanner__tests__integration__filter_member_operand__not_set_on_or_dimension.snap
new file mode 100644
index 0000000000000..787dd9f9e2f2d
--- /dev/null
+++ b/rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/snapshots/cubesqlplanner__tests__integration__filter_member_operand__not_set_on_or_dimension.snap
@@ -0,0 +1,7 @@
+---
+source: cubesqlplanner/cubesqlplanner/src/tests/integration/filter_member_operand.rs
+expression: result
+---
+customers__id
+-------------
+3
diff --git a/rust/cube/cubesqlplanner/cubesqlplanner/src/utils/sql_expression_scanner.rs b/rust/cube/cubesqlplanner/cubesqlplanner/src/utils/sql_expression_scanner.rs
index e66ce6e319d8c..7005d3e82c5c2 100644
--- a/rust/cube/cubesqlplanner/cubesqlplanner/src/utils/sql_expression_scanner.rs
+++ b/rust/cube/cubesqlplanner/cubesqlplanner/src/utils/sql_expression_scanner.rs
@@ -57,6 +57,10 @@ struct Tokenizer<'a> {
bytes: &'a [u8],
pos: usize,
depth: usize,
+ // Set when a line comment ran to the end of the input, cleared when one ends
+ // at its newline. Whatever the last line comment left here says whether the
+ // input as a whole ends inside a comment.
+ open_line_comment: bool,
}
impl<'a> Tokenizer<'a> {
@@ -66,6 +70,7 @@ impl<'a> Tokenizer<'a> {
bytes: src.as_bytes(),
pos: 0,
depth: 0,
+ open_line_comment: false,
}
}
@@ -88,16 +93,12 @@ impl<'a> Tokenizer<'a> {
}
b'-' if self.peek(1) == Some(b'-') => {
self.pos += 2;
- while !self.at_eof() && self.peek(0) != Some(b'\n') {
- self.pos += 1;
- }
+ self.skip_to_line_end();
}
b'/' if self.peek(1) == Some(b'/') => {
// Line comment variant in BigQuery and Snowflake.
self.pos += 2;
- while !self.at_eof() && self.peek(0) != Some(b'\n') {
- self.pos += 1;
- }
+ self.skip_to_line_end();
}
b'/' if self.peek(1) == Some(b'*') => {
self.pos += 2;
@@ -122,6 +123,13 @@ impl<'a> Tokenizer<'a> {
}
}
+ fn skip_to_line_end(&mut self) {
+ while !self.at_eof() && self.peek(0) != Some(b'\n') {
+ self.pos += 1;
+ }
+ self.open_line_comment = self.at_eof();
+ }
+
fn next_token(&mut self) -> Option> {
self.skip_trivia();
if self.at_eof() {
@@ -574,6 +582,14 @@ pub fn is_top_level_compound(sql: &str) -> bool {
false
}
+/// Returns `true` if `sql` ends inside a line comment, so anything appended on
+/// the same line would be commented out.
+pub fn ends_in_line_comment(sql: &str) -> bool {
+ let mut tokenizer = Tokenizer::new(sql);
+ while tokenizer.next_token().is_some() {}
+ tokenizer.open_line_comment
+}
+
// ---------- Template analyzer: compile-time placeholder contexts ----------
/// Analyses an `SqlCall` template and returns, for each `{arg:N}` index present,
@@ -857,6 +873,29 @@ mod tests {
assert!(!is_top_level_compound("{user_id:Int64}"));
}
+ // ----- ends_in_line_comment -----
+
+ #[test]
+ fn line_comment_running_to_the_end() {
+ assert!(ends_in_line_comment("a + b -- note"));
+ assert!(ends_in_line_comment("a + b // note"));
+ assert!(ends_in_line_comment("a -- note\n + b -- tail"));
+ }
+
+ #[test]
+ fn line_comment_closed_by_newline() {
+ assert!(!ends_in_line_comment("a -- note\n + b"));
+ assert!(!ends_in_line_comment("a + b -- note\n"));
+ }
+
+ #[test]
+ fn no_line_comment_at_all() {
+ assert!(!ends_in_line_comment("a + b"));
+ assert!(!ends_in_line_comment(""));
+ assert!(!ends_in_line_comment("'-- not a comment'"));
+ assert!(!ends_in_line_comment("a /* block */"));
+ }
+
#[test]
fn nested_case_is_atomic() {
assert!(!is_top_level_compound(
diff --git a/rust/cubesql/CHANGELOG.md b/rust/cubesql/CHANGELOG.md
index 857d50696dfe3..de1e45dc98146 100644
--- a/rust/cubesql/CHANGELOG.md
+++ b/rust/cubesql/CHANGELOG.md
@@ -3,6 +3,12 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [1.7.25](https://github.com/cube-js/cube/compare/v1.7.24...v1.7.25) (2026-08-21)
+
+### Bug Fixes
+
+- **cubesql:** Support `DATE_ADD` SQL pushdown ([#11539](https://github.com/cube-js/cube/issues/11539)) ([3051ccd](https://github.com/cube-js/cube/commit/3051ccd8c634941dce80235a0e6e823fa8586355))
+
## [1.7.24](https://github.com/cube-js/cube/compare/v1.7.23...v1.7.24) (2026-08-19)
**Note:** Version bump only for package @cubejs-backend/cubesql
diff --git a/rust/cubesql/package.json b/rust/cubesql/package.json
index 058f6dd429dee..672db9998edc2 100644
--- a/rust/cubesql/package.json
+++ b/rust/cubesql/package.json
@@ -1,6 +1,6 @@
{
"name": "@cubejs-backend/cubesql",
- "version": "1.7.24",
+ "version": "1.7.25",
"description": "SQL API for Cube as proxy over MySQL protocol.",
"engines": {
"node": "^12.0.0 || ^14.0.0 || >=16.0.0"
diff --git a/rust/cubestore/CHANGELOG.md b/rust/cubestore/CHANGELOG.md
index d8ca7e1d29cae..dd1c9a659daf2 100644
--- a/rust/cubestore/CHANGELOG.md
+++ b/rust/cubestore/CHANGELOG.md
@@ -3,6 +3,12 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
+## [1.7.25](https://github.com/cube-js/cube/compare/v1.7.24...v1.7.25) (2026-08-21)
+
+### Features
+
+- **cubestore:** Support QUEUE ADD_AND_RETRIEVE command ([#11590](https://github.com/cube-js/cube/issues/11590)) ([73ec070](https://github.com/cube-js/cube/commit/73ec070d55edf2c2fa4d70bbce1f37d735ce40cd))
+
## [1.7.24](https://github.com/cube-js/cube/compare/v1.7.23...v1.7.24) (2026-08-19)
**Note:** Version bump only for package @cubejs-backend/cubestore
diff --git a/rust/cubestore/Cargo.lock b/rust/cubestore/Cargo.lock
index 5199ed93f18b8..734bc40c347bc 100644
--- a/rust/cubestore/Cargo.lock
+++ b/rust/cubestore/Cargo.lock
@@ -1445,7 +1445,7 @@ dependencies = [
[[package]]
name = "cubestore"
-version = "1.7.24"
+version = "1.7.25"
dependencies = [
"actix-rt",
"anyhow",
diff --git a/rust/cubestore/cubestore/Cargo.toml b/rust/cubestore/cubestore/Cargo.toml
index 7d9f181e8a3ec..331aa3d610ce9 100644
--- a/rust/cubestore/cubestore/Cargo.toml
+++ b/rust/cubestore/cubestore/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "cubestore"
-version = "1.7.24"
+version = "1.7.25"
authors = ["Cube Dev, Inc."]
edition = "2021"
license = "Apache-2.0"
diff --git a/rust/cubestore/package.json b/rust/cubestore/package.json
index 9bd075823f037..21ba78efad6fe 100644
--- a/rust/cubestore/package.json
+++ b/rust/cubestore/package.json
@@ -1,6 +1,6 @@
{
"name": "@cubejs-backend/cubestore",
- "version": "1.7.24",
+ "version": "1.7.25",
"description": "Cube.js pre-aggregation storage layer.",
"main": "dist/src/index.js",
"typings": "dist/src/index.d.ts",
@@ -33,7 +33,7 @@
},
"license": "Apache-2.0",
"devDependencies": {
- "@cubejs-backend/linter": "1.7.24",
+ "@cubejs-backend/linter": "1.7.25",
"@types/jest": "^29",
"@types/node": "^18",
"jest": "^29",
@@ -43,7 +43,7 @@
"access": "public"
},
"dependencies": {
- "@cubejs-backend/shared": "1.7.24",
+ "@cubejs-backend/shared": "1.7.25",
"@octokit/core": "^3.2.5",
"source-map-support": "^0.5.19"
},