From bad33e7d9cd9a093144683cbc8cce18f0e0eb125 Mon Sep 17 00:00:00 2001 From: Dmitry Patsura Date: Fri, 21 Aug 2026 15:46:20 +0200 Subject: [PATCH 1/3] v1.7.25 --- CHANGELOG.md | 12 ++++ lerna.json | 2 +- packages/cubejs-api-gateway/CHANGELOG.md | 4 ++ packages/cubejs-api-gateway/package.json | 10 ++-- packages/cubejs-athena-driver/CHANGELOG.md | 4 ++ packages/cubejs-athena-driver/package.json | 10 ++-- packages/cubejs-backend-cloud/CHANGELOG.md | 4 ++ packages/cubejs-backend-cloud/package.json | 6 +- packages/cubejs-backend-maven/CHANGELOG.md | 4 ++ packages/cubejs-backend-maven/package.json | 6 +- packages/cubejs-backend-native/CHANGELOG.md | 4 ++ packages/cubejs-backend-native/package.json | 8 +-- packages/cubejs-backend-shared/CHANGELOG.md | 4 ++ packages/cubejs-backend-shared/package.json | 4 +- packages/cubejs-base-driver/CHANGELOG.md | 4 ++ packages/cubejs-base-driver/package.json | 6 +- packages/cubejs-bigquery-driver/CHANGELOG.md | 4 ++ packages/cubejs-bigquery-driver/package.json | 8 +-- packages/cubejs-cli/CHANGELOG.md | 4 ++ packages/cubejs-cli/package.json | 12 ++-- .../cubejs-clickhouse-driver/CHANGELOG.md | 4 ++ .../cubejs-clickhouse-driver/package.json | 10 ++-- packages/cubejs-client-core/CHANGELOG.md | 4 ++ packages/cubejs-client-core/package.json | 4 +- packages/cubejs-client-dx/CHANGELOG.md | 4 ++ packages/cubejs-client-dx/package.json | 2 +- packages/cubejs-client-ngx/CHANGELOG.md | 4 ++ packages/cubejs-client-ngx/package.json | 2 +- packages/cubejs-client-react/CHANGELOG.md | 4 ++ packages/cubejs-client-react/package.json | 4 +- packages/cubejs-client-vue3/CHANGELOG.md | 4 ++ packages/cubejs-client-vue3/package.json | 4 +- .../cubejs-client-ws-transport/CHANGELOG.md | 4 ++ .../cubejs-client-ws-transport/package.json | 6 +- packages/cubejs-crate-driver/CHANGELOG.md | 4 ++ packages/cubejs-crate-driver/package.json | 10 ++-- packages/cubejs-cubestore-driver/CHANGELOG.md | 4 ++ packages/cubejs-cubestore-driver/package.json | 12 ++-- .../CHANGELOG.md | 6 ++ .../package.json | 12 ++-- .../cubejs-dbt-schema-extension/CHANGELOG.md | 4 ++ .../cubejs-dbt-schema-extension/package.json | 8 +-- packages/cubejs-docker/CHANGELOG.md | 4 ++ packages/cubejs-docker/package.json | 58 +++++++++---------- packages/cubejs-dremio-driver/CHANGELOG.md | 4 ++ packages/cubejs-dremio-driver/package.json | 12 ++-- packages/cubejs-druid-driver/CHANGELOG.md | 4 ++ packages/cubejs-druid-driver/package.json | 10 ++-- packages/cubejs-duckdb-driver/CHANGELOG.md | 6 ++ packages/cubejs-duckdb-driver/package.json | 12 ++-- packages/cubejs-firebolt-driver/CHANGELOG.md | 4 ++ packages/cubejs-firebolt-driver/package.json | 12 ++-- packages/cubejs-hive-driver/CHANGELOG.md | 4 ++ packages/cubejs-hive-driver/package.json | 8 +-- packages/cubejs-jdbc-driver/CHANGELOG.md | 4 ++ packages/cubejs-jdbc-driver/package.json | 8 +-- packages/cubejs-ksql-driver/CHANGELOG.md | 4 ++ packages/cubejs-ksql-driver/package.json | 10 ++-- packages/cubejs-linter/CHANGELOG.md | 4 ++ packages/cubejs-linter/package.json | 2 +- .../cubejs-materialize-driver/CHANGELOG.md | 4 ++ .../cubejs-materialize-driver/package.json | 12 ++-- packages/cubejs-mongobi-driver/CHANGELOG.md | 4 ++ packages/cubejs-mongobi-driver/package.json | 8 +-- packages/cubejs-mssql-driver/CHANGELOG.md | 4 ++ packages/cubejs-mssql-driver/package.json | 6 +- .../CHANGELOG.md | 4 ++ .../package.json | 8 +-- packages/cubejs-mysql-driver/CHANGELOG.md | 4 ++ packages/cubejs-mysql-driver/package.json | 10 ++-- packages/cubejs-oracle-driver/CHANGELOG.md | 4 ++ packages/cubejs-oracle-driver/package.json | 6 +- packages/cubejs-pinot-driver/CHANGELOG.md | 4 ++ packages/cubejs-pinot-driver/package.json | 10 ++-- packages/cubejs-playground/CHANGELOG.md | 4 ++ packages/cubejs-playground/package.json | 6 +- packages/cubejs-postgres-driver/CHANGELOG.md | 4 ++ packages/cubejs-postgres-driver/package.json | 10 ++-- packages/cubejs-prestodb-driver/CHANGELOG.md | 4 ++ packages/cubejs-prestodb-driver/package.json | 8 +-- .../cubejs-query-orchestrator/CHANGELOG.md | 6 ++ .../cubejs-query-orchestrator/package.json | 10 ++-- packages/cubejs-questdb-driver/CHANGELOG.md | 4 ++ packages/cubejs-questdb-driver/package.json | 12 ++-- packages/cubejs-redshift-driver/CHANGELOG.md | 4 ++ packages/cubejs-redshift-driver/package.json | 10 ++-- packages/cubejs-schema-compiler/CHANGELOG.md | 6 ++ packages/cubejs-schema-compiler/package.json | 12 ++-- packages/cubejs-server-core/CHANGELOG.md | 4 ++ packages/cubejs-server-core/package.json | 24 ++++---- packages/cubejs-server/CHANGELOG.md | 4 ++ packages/cubejs-server/package.json | 14 ++--- packages/cubejs-snowflake-driver/CHANGELOG.md | 4 ++ packages/cubejs-snowflake-driver/package.json | 8 +-- packages/cubejs-sqlite-driver/CHANGELOG.md | 4 ++ packages/cubejs-sqlite-driver/package.json | 8 +-- packages/cubejs-templates/CHANGELOG.md | 4 ++ packages/cubejs-templates/package.json | 6 +- packages/cubejs-testing-drivers/CHANGELOG.md | 4 ++ packages/cubejs-testing-drivers/package.json | 46 +++++++-------- packages/cubejs-testing-shared/CHANGELOG.md | 4 ++ packages/cubejs-testing-shared/package.json | 10 ++-- packages/cubejs-testing/CHANGELOG.md | 4 ++ packages/cubejs-testing/package.json | 22 +++---- packages/cubejs-trino-driver/CHANGELOG.md | 4 ++ packages/cubejs-trino-driver/package.json | 12 ++-- packages/cubejs-vertica-driver/CHANGELOG.md | 4 ++ packages/cubejs-vertica-driver/package.json | 14 ++--- rust/cubesql/CHANGELOG.md | 6 ++ rust/cubesql/package.json | 2 +- rust/cubestore/CHANGELOG.md | 6 ++ rust/cubestore/Cargo.lock | 2 +- rust/cubestore/cubestore/Cargo.toml | 2 +- rust/cubestore/package.json | 6 +- 114 files changed, 535 insertions(+), 291 deletions(-) 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/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-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-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/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" }, From e9f540774f049e329b8133ee2451686b34684991 Mon Sep 17 00:00:00 2001 From: waralexrom <108349432+waralexrom@users.noreply.github.com> Date: Fri, 21 Aug 2026 16:42:06 +0200 Subject: [PATCH 2/3] fix(tesseract): parenthesize member SQL spliced into filter templates (#11502) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(tesseract): parenthesize member SQL spliced into filter templates A filter template places its own operator next to the member's rendered SQL (`{{ column }} = {{ value }}`, `{{ column }} IS NOT NULL`, …). A member whose `sql` is a bare expression then re-associates: when its own top-level operator binds weaker than the template's, that operator captures only the tail of the member expression. A measure `sql: "{total} IS NOT NULL"` filtered by `equals true` rendered `HAVING (sum(...) IS NOT NULL = CAST(? AS BOOLEAN))`, which Trino and Athena reject. Aggregate-typed measures were safe by accident, being wrapped in their own function call. Where the member's top level is `AND`/`OR` the mis-parse stays valid SQL and silently returns a different row set — in `WHERE` over a dimension as much as in `HAVING` over a measure. Render the member as one operand when `FilterSqlContext` is built, so every operator receives it already pinned, and keep the field private so a new call site cannot bypass it. Atomicity is decided by the existing expression scanner: plain columns, aggregates, casts and CASE keep their shape, so the wrapping does not spread through filters that never had the hazard. An expression ending in a line comment gets its closing parenthesis on a line of its own — on the same line the comment would swallow it. Co-Authored-By: Claude Opus 5 (1M context) * fix(tesseract): wrap a filter member whose SQL ends in a line comment Deciding atomicity first left the line-comment guard unreachable for the case that needs it just as much: `sql: "amount -- note"` has no top-level operator, so it went in bare and the template appended its operator to the commented line — `amount -- note > $1`, where the predicate silently disappears. Ask the comment question first and let it force the wrapping regardless of atomicity, since the reason is the closing parenthesis rather than precedence. Gate the test file on the planner once at the describe level: a bare `return` per test reported as a pass under the legacy planner, so a regression that read the flag as false everywhere would have turned the file green instead of red. Co-Authored-By: Claude Opus 5 (1M context) * test(tesseract): pin the filter operand contract in the crate `as_operand` decides the comment question before the atomicity one, and that ordering is what keeps a trailing line comment from swallowing the closing parenthesis. Only the Postgres integration suite covered it, so swapping the two blocks back would compile and pass `cargo test`. The function is a pure `&str -> String`, so state the contract next to it: atomic stays bare, compound gets wrapped, and a trailing line comment forces the wrap with the parenthesis on a line of its own however atomic the expression is. Drop the data table from the integration test's header comment. It restated the inline `VALUES` twenty lines below, plus the per-row truth values derived from them — three copies of one fact, and the copy nobody runs is the one that rots. Co-Authored-By: Claude Opus 5 (1M context) * test(tesseract): cover the filter member operand in the crate The fix was only exercised from the JS side, behind a native rebuild and an env-gated Postgres suite. Two crate-level layers cover it where it lives. `tests/filter/member_operand.rs` pins the rendered filter SQL per operator over a compound member — equality, IN lists, nullability, comparison, LIKE, date range, and the reported model's calculated boolean in HAVING — plus the two members that must stay bare and the one ending in a line comment. No database, so it runs in every `cargo test`. `tests/integration/filter_member_operand.rs` checks rows instead, because the dangerous form of the mis-parse is valid SQL over a different row set and the emitted text cannot tell it from the intended reading. The AND member returns 5 rows where the mis-parse silently returns none, and the OR member under `notSet` returns the one customer whose expression is NULL where the mis-parse returns the two it degenerates to. Both row sets were derived independently against the seed before the snapshots were accepted. The AND member carries parentheses around its second operand on purpose: without them the mis-parse chains two comparisons, which Postgres rejects outright, and the test would prove the error case the comparison member already covers instead of the silent one. Co-Authored-By: Claude Opus 5 (1M context) --------- Co-authored-by: Claude Opus 5 (1M context) --- .../postgres/filter-member-sql-parens.test.ts | 336 ++++++++++++++++++ .../test/unit/base-query.test.ts | 2 +- .../filter/operators/comparison.rs | 8 +- .../filter/operators/date_range.rs | 4 +- .../filter/operators/date_single.rs | 8 +- .../filter/operators/equality.rs | 4 +- .../filter/operators/filter_sql_context.rs | 81 ++++- .../physical_plan/filter/operators/in_list.rs | 9 +- .../physical_plan/filter/operators/like.rs | 4 +- .../filter/operators/nullability.rs | 5 +- .../filter/operators/rolling_window.rs | 4 +- .../operators/to_date_rolling_window.rs | 2 +- .../src/physical_plan/filter/typed_filter.rs | 28 +- .../yaml_files/common/filter_operand.yaml | 64 ++++ .../yaml_files/common/integration_basic.yaml | 19 + .../src/tests/filter/member_operand.rs | 290 +++++++++++++++ .../cubesqlplanner/src/tests/filter/mod.rs | 1 + .../integration/filter_member_operand.rs | 122 +++++++ .../src/tests/integration/mod.rs | 1 + ...perand__equals_false_on_and_dimension.snap | 7 + ..._equals_on_calculated_boolean_measure.snap | 9 + ...__equals_true_on_comparison_dimension.snap | 7 + ...mber_operand__not_set_on_or_dimension.snap | 7 + .../src/utils/sql_expression_scanner.rs | 51 ++- 24 files changed, 1029 insertions(+), 44 deletions(-) create mode 100644 packages/cubejs-schema-compiler/test/integration/postgres/filter-member-sql-parens.test.ts create mode 100644 rust/cube/cubesqlplanner/cubesqlplanner/src/test_fixtures/schemas/yaml_files/common/filter_operand.yaml create mode 100644 rust/cube/cubesqlplanner/cubesqlplanner/src/tests/filter/member_operand.rs create mode 100644 rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/filter_member_operand.rs create mode 100644 rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/snapshots/cubesqlplanner__tests__integration__filter_member_operand__equals_false_on_and_dimension.snap create mode 100644 rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/snapshots/cubesqlplanner__tests__integration__filter_member_operand__equals_on_calculated_boolean_measure.snap create mode 100644 rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/snapshots/cubesqlplanner__tests__integration__filter_member_operand__equals_true_on_comparison_dimension.snap create mode 100644 rust/cube/cubesqlplanner/cubesqlplanner/src/tests/integration/snapshots/cubesqlplanner__tests__integration__filter_member_operand__not_set_on_or_dimension.snap 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/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( From 725c0457602d668550e9c2118718ba28dfedd87f Mon Sep 17 00:00:00 2001 From: Dmitry Patsura Date: Fri, 21 Aug 2026 16:57:33 +0200 Subject: [PATCH 3/3] refactor(query-orchestrator): split QueryQueue.processQuery into claim and execute (#11616) --- .../cubejs-query-orchestrator/DEVELOPMENT.md | 50 +- .../src/orchestrator/QueryQueue.ts | 486 ++++++++++-------- .../test/unit/QueryQueue.abstract.ts | 4 +- 3 files changed, 318 insertions(+), 222 deletions(-) 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/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));