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