diff --git a/.github/workflows/claude-code-review.yml b/.github/workflows/claude-code-review.yml index d0ce2a974e247..790090c8c7483 100644 --- a/.github/workflows/claude-code-review.yml +++ b/.github/workflows/claude-code-review.yml @@ -168,7 +168,7 @@ jobs: # Tools for comprehensive PR review claude_args: | --allowedTools "mcp__github_inline_comment__create_inline_comment,mcp__github__get_issue_comments,Bash(gh pr comment:*),Bash(gh pr diff:*),Bash(gh pr view:*),Bash(gh list-review-threads:*),Bash(gh resolve-thread:*)" - --model "claude-opus-4-7" + --model "claude-opus-5" --effort ${{ inputs.effort || 'medium' }} - name: Write run summary diff --git a/CHANGELOG.md b/CHANGELOG.md index 84c7975772c57..decba58229c39 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.7.12](https://github.com/cube-js/cube/compare/v1.7.11...v1.7.12) (2026-07-27) + +### Bug Fixes + +- **athena-driver:** Correct SQL parameter escaping ([#11370](https://github.com/cube-js/cube/issues/11370)) ([5ad0041](https://github.com/cube-js/cube/commit/5ad0041a1aa7820d16e2566f7ea50ca2227f21c3)) +- **pinot/dremio/ksql/databriks/hive/jdbc-driver:** Сorrect SQL parameter escaping ([#11374](https://github.com/cube-js/cube/issues/11374)) ([a743790](https://github.com/cube-js/cube/commit/a7437904411cbf268a30bc985c6d5b3b8bbe0e2c)) +- **trino/prestodb-driver:** Сorrect SQL parameter escaping ([#11345](https://github.com/cube-js/cube/issues/11345)) ([463e602](https://github.com/cube-js/cube/commit/463e60284a5a4073eb7b7d2f11c4b315deaa2d94)) + ## [1.7.11](https://github.com/cube-js/cube/compare/v1.7.8...v1.7.11) (2026-07-26) ### Bug Fixes diff --git a/docs-mintlify/docs/integrations/dbt.mdx b/docs-mintlify/docs/integrations/dbt.mdx index e7a032c27fd7b..9391d211ae6f6 100644 --- a/docs-mintlify/docs/integrations/dbt.mdx +++ b/docs-mintlify/docs/integrations/dbt.mdx @@ -42,10 +42,12 @@ Cube spins up a short-lived, isolated sandbox and: 5. **Commits the generated files** to a branch for review, then tears the sandbox down. -**No connection to your data warehouse is made during a pull.** Cube uses +**By default, no connection to your data warehouse is made during a pull.** Cube uses `dbt parse`, not `dbt run` or `dbt compile`, so it reads your project's structure without ever querying your warehouse. dbt pull generates cube definitions; it assumes -the underlying tables were already built by your own production `dbt run`. +the underlying tables were already built by your own production `dbt run`. The one +exception is [Infer column types from dbt catalog](#infer-column-types-from-dbt-catalog), +an opt-in option that reads real column types from your warehouse. ## Prerequisites @@ -146,6 +148,33 @@ automated — uses the same configuration: | **Add default measures** | On | Adds a `count` measure to every cube, and `sum` measures for additive numeric columns. | | **Include descriptions** | On | Carries dbt model and column descriptions into cubes and dimensions. | | **Generate joins** | On | Infers joins between cubes from dbt `relationships` tests and foreign-key constraints. | +| **Infer column types from dbt catalog** | Off | Reads real warehouse column types from dbt's `catalog.json` instead of guessing from column names. See [below](#infer-column-types-from-dbt-catalog). | + +### Infer column types from dbt catalog + + + +This option is currently in preview, and its behavior may still change. Reach out to the +[Cube support team](/admin/account-billing/support) if you run into issues. + + + +Without it, a dimension's type comes from a `data_type` declared in your dbt YAML, and — +when none is declared — from a column-name heuristic (`*_id` → `number`, `created_at` → +`time`, …). Enable this option and the pull additionally runs `dbt docs generate` to +produce dbt's `catalog.json`, which carries the **actual warehouse column types**. + +Type precedence becomes: **declared `data_type` → catalog type → column-name heuristic**. +An explicit `data_type` in your dbt YAML still wins; the catalog only fills the gaps. + +- **This step connects to your warehouse** (`dbt docs generate` queries the warehouse + metadata), unlike the rest of the pull. The models must already be built. +- **Supported on Snowflake, Amazon Redshift, and PostgreSQL.** It's skipped on Google + BigQuery, Databricks, and Amazon Athena, whose sandbox profiles can't open a + connection. +- **Best-effort.** If catalog generation or the catalog read fails — no connectivity, + unbuilt models, unreadable file — it's logged and skipped, and the pull completes on + declared and name-based types exactly as it would with the option off. ## Pass environment variables to dbt @@ -302,15 +331,22 @@ For each dbt model in your project: value of the deployment's `CUBEJS_DB_DATABRICKS_CATALOG` environment variable, or `hive_metastore` if it isn't set. - **Each column becomes a dimension.** The dimension type is inferred from the - column's `data_type` where available, otherwise from the column name: + column's `data_type` where available, then — if + [Infer column types from dbt catalog](#infer-column-types-from-dbt-catalog) is + enabled — from the warehouse type in `catalog.json`, and otherwise from the column + name: - | dbt `data_type` | Cube dimension type | + | Column type | Cube dimension type | | --- | --- | - | `varchar`, `text`, `string`, `char` | `string` | - | `integer`, `int`, `bigint`, `smallint`, `decimal`, `numeric`, `float`, `double`, `real` | `number` | + | `varchar`, `text`, `string`, `char`, and non-scalar types (`json`, `variant`, `array`, …) | `string` | + | `integer`, `int`, `bigint`, `smallint`, `decimal`, `numeric`, `number`, `float`, `double`, `real` | `number` | | `date`, `datetime`, `timestamp`, `timestamptz`, `time` | `time` | | `boolean`, `bool` | `boolean` | + Vendor spellings and parameters are normalized, so `NUMBER(38,0)`, + `character varying(256)`, `TIMESTAMP_NTZ(9)`, `INT64`, and `double precision` all map + as expected. + - **Model and column descriptions** from your dbt project are carried over to the cubes and dimensions. - **A `count` measure** is added to every cube. @@ -503,7 +539,10 @@ Each push creates exactly two new files: - **Pull is one-directional** — dbt pull never writes back to your dbt repository. Promoting cubes into dbt is the [dbt push](#push-cubes-to-dbt) direction (in preview). - **No warehouse connection** — a pull doesn't trigger a `dbt run`; it assumes your - tables are already built. + tables are already built. The only exception is the opt-in + [Infer column types from dbt catalog](#infer-column-types-from-dbt-catalog) option + (in preview), which runs `dbt docs generate` on Snowflake, Amazon Redshift, and + PostgreSQL. - **One dbt project per deployment.** ## Troubleshooting diff --git a/lerna.json b/lerna.json index ea0bcb65b00bf..f386f0cb57ef8 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "1.7.11", + "version": "1.7.12", "npmClient": "yarn", "command": { "bootstrap": { diff --git a/packages/cubejs-api-gateway/CHANGELOG.md b/packages/cubejs-api-gateway/CHANGELOG.md index d7a72fe08a754..861e1525e13cc 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.12](https://github.com/cube-js/cube/compare/v1.7.11...v1.7.12) (2026-07-27) + +**Note:** Version bump only for package @cubejs-backend/api-gateway + ## [1.7.11](https://github.com/cube-js/cube/compare/v1.7.8...v1.7.11) (2026-07-26) ### Bug Fixes diff --git a/packages/cubejs-api-gateway/package.json b/packages/cubejs-api-gateway/package.json index d6742caab3151..d42710554fb91 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.11", + "version": "1.7.12", "repository": { "type": "git", "url": "https://github.com/cube-js/cube.git", @@ -27,9 +27,9 @@ "dist/src/*" ], "dependencies": { - "@cubejs-backend/native": "1.7.11", - "@cubejs-backend/query-orchestrator": "1.7.11", - "@cubejs-backend/shared": "1.7.11", + "@cubejs-backend/native": "1.7.12", + "@cubejs-backend/query-orchestrator": "1.7.12", + "@cubejs-backend/shared": "1.7.12", "@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.11", + "@cubejs-backend/linter": "1.7.12", "@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 2484f9ae42583..6195063e0430c 100644 --- a/packages/cubejs-athena-driver/CHANGELOG.md +++ b/packages/cubejs-athena-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.12](https://github.com/cube-js/cube/compare/v1.7.11...v1.7.12) (2026-07-27) + +### Bug Fixes + +- **athena-driver:** Correct SQL parameter escaping ([#11370](https://github.com/cube-js/cube/issues/11370)) ([5ad0041](https://github.com/cube-js/cube/commit/5ad0041a1aa7820d16e2566f7ea50ca2227f21c3)) + ## [1.7.11](https://github.com/cube-js/cube/compare/v1.7.8...v1.7.11) (2026-07-26) **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 bf0055755756b..8d8aae74856e0 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.11", + "version": "1.7.12", "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.11", - "@cubejs-backend/shared": "1.7.11" + "@cubejs-backend/base-driver": "1.7.12", + "@cubejs-backend/shared": "1.7.12" }, "devDependencies": { - "@cubejs-backend/linter": "1.7.11", - "@cubejs-backend/testing-shared": "1.7.11", + "@cubejs-backend/linter": "1.7.12", + "@cubejs-backend/testing-shared": "1.7.12", "@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 1df1f9ae53528..4404ad279d4fa 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.12](https://github.com/cube-js/cube/compare/v1.7.11...v1.7.12) (2026-07-27) + +**Note:** Version bump only for package @cubejs-backend/cloud + ## [1.7.11](https://github.com/cube-js/cube/compare/v1.7.8...v1.7.11) (2026-07-26) **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 20fcafc714279..3624112d199d5 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.11", + "version": "1.7.12", "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.11", + "@cubejs-backend/linter": "1.7.12", "@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.11", + "@cubejs-backend/shared": "1.7.12", "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 7aecc2866723a..4114fdcb8104d 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.12](https://github.com/cube-js/cube/compare/v1.7.11...v1.7.12) (2026-07-27) + +**Note:** Version bump only for package @cubejs-backend/maven + ## [1.7.11](https://github.com/cube-js/cube/compare/v1.7.8...v1.7.11) (2026-07-26) **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 533813cfd955e..21c42cdba3d67 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.11", + "version": "1.7.12", "license": "Apache-2.0", "repository": { "type": "git", @@ -31,12 +31,12 @@ "dist/src/*" ], "dependencies": { - "@cubejs-backend/shared": "1.7.11", + "@cubejs-backend/shared": "1.7.12", "source-map-support": "^0.5.19", "xmlbuilder2": "^2.4.0" }, "devDependencies": { - "@cubejs-backend/linter": "1.7.11", + "@cubejs-backend/linter": "1.7.12", "@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 edc9257a88b2e..916976bda54e1 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.12](https://github.com/cube-js/cube/compare/v1.7.11...v1.7.12) (2026-07-27) + +**Note:** Version bump only for package @cubejs-backend/native + ## [1.7.11](https://github.com/cube-js/cube/compare/v1.7.8...v1.7.11) (2026-07-26) ### Bug Fixes diff --git a/packages/cubejs-backend-native/Cargo.lock b/packages/cubejs-backend-native/Cargo.lock index fcd1c702353b5..42e2739068e80 100644 --- a/packages/cubejs-backend-native/Cargo.lock +++ b/packages/cubejs-backend-native/Cargo.lock @@ -897,7 +897,7 @@ dependencies = [ [[package]] name = "cube-ext" version = "1.0.0" -source = "git+https://github.com/cube-js/arrow-datafusion.git?rev=d203d8771a9673fb676b44dce1f99e91634b4080#d203d8771a9673fb676b44dce1f99e91634b4080" +source = "git+https://github.com/cube-js/arrow-datafusion.git?rev=ee20ad38796f4a9966ff58b9ace425c7488459e9#ee20ad38796f4a9966ff58b9ace425c7488459e9" dependencies = [ "arrow 13.0.0", "chrono", @@ -1073,7 +1073,7 @@ checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" [[package]] name = "datafusion" version = "7.0.0" -source = "git+https://github.com/cube-js/arrow-datafusion.git?rev=d203d8771a9673fb676b44dce1f99e91634b4080#d203d8771a9673fb676b44dce1f99e91634b4080" +source = "git+https://github.com/cube-js/arrow-datafusion.git?rev=ee20ad38796f4a9966ff58b9ace425c7488459e9#ee20ad38796f4a9966ff58b9ace425c7488459e9" dependencies = [ "ahash 0.7.8", "arrow 13.0.0", @@ -1106,7 +1106,7 @@ dependencies = [ [[package]] name = "datafusion-common" version = "7.0.0" -source = "git+https://github.com/cube-js/arrow-datafusion.git?rev=d203d8771a9673fb676b44dce1f99e91634b4080#d203d8771a9673fb676b44dce1f99e91634b4080" +source = "git+https://github.com/cube-js/arrow-datafusion.git?rev=ee20ad38796f4a9966ff58b9ace425c7488459e9#ee20ad38796f4a9966ff58b9ace425c7488459e9" dependencies = [ "arrow 13.0.0", "ordered-float 2.10.1", @@ -1117,7 +1117,7 @@ dependencies = [ [[package]] name = "datafusion-data-access" version = "1.0.0" -source = "git+https://github.com/cube-js/arrow-datafusion.git?rev=d203d8771a9673fb676b44dce1f99e91634b4080#d203d8771a9673fb676b44dce1f99e91634b4080" +source = "git+https://github.com/cube-js/arrow-datafusion.git?rev=ee20ad38796f4a9966ff58b9ace425c7488459e9#ee20ad38796f4a9966ff58b9ace425c7488459e9" dependencies = [ "async-trait", "chrono", @@ -1130,7 +1130,7 @@ dependencies = [ [[package]] name = "datafusion-expr" version = "7.0.0" -source = "git+https://github.com/cube-js/arrow-datafusion.git?rev=d203d8771a9673fb676b44dce1f99e91634b4080#d203d8771a9673fb676b44dce1f99e91634b4080" +source = "git+https://github.com/cube-js/arrow-datafusion.git?rev=ee20ad38796f4a9966ff58b9ace425c7488459e9#ee20ad38796f4a9966ff58b9ace425c7488459e9" dependencies = [ "ahash 0.7.8", "arrow 13.0.0", @@ -1141,7 +1141,7 @@ dependencies = [ [[package]] name = "datafusion-physical-expr" version = "7.0.0" -source = "git+https://github.com/cube-js/arrow-datafusion.git?rev=d203d8771a9673fb676b44dce1f99e91634b4080#d203d8771a9673fb676b44dce1f99e91634b4080" +source = "git+https://github.com/cube-js/arrow-datafusion.git?rev=ee20ad38796f4a9966ff58b9ace425c7488459e9#ee20ad38796f4a9966ff58b9ace425c7488459e9" dependencies = [ "ahash 0.7.8", "arrow 13.0.0", diff --git a/packages/cubejs-backend-native/package.json b/packages/cubejs-backend-native/package.json index 771cf257169ed..9b5d6a9078ecd 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.11", + "version": "1.7.12", "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.11", + "@cubejs-backend/linter": "1.7.12", "@types/jest": "^29", "@types/node": "^22", "cargo-cp-artifact": "^0.1.9", @@ -50,8 +50,8 @@ "uuid": "^8.3.2" }, "dependencies": { - "@cubejs-backend/cubesql": "1.7.11", - "@cubejs-backend/shared": "1.7.11", + "@cubejs-backend/cubesql": "1.7.12", + "@cubejs-backend/shared": "1.7.12", "@cubejs-infra/post-installer": "^0.0.7" }, "resources": { diff --git a/packages/cubejs-backend-shared/CHANGELOG.md b/packages/cubejs-backend-shared/CHANGELOG.md index 486046ff3b094..adf4bc3d12c5d 100644 --- a/packages/cubejs-backend-shared/CHANGELOG.md +++ b/packages/cubejs-backend-shared/CHANGELOG.md @@ -3,6 +3,13 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.7.12](https://github.com/cube-js/cube/compare/v1.7.11...v1.7.12) (2026-07-27) + +### Bug Fixes + +- **pinot/dremio/ksql/databriks/hive/jdbc-driver:** Сorrect SQL parameter escaping ([#11374](https://github.com/cube-js/cube/issues/11374)) ([a743790](https://github.com/cube-js/cube/commit/a7437904411cbf268a30bc985c6d5b3b8bbe0e2c)) +- **trino/prestodb-driver:** Сorrect SQL parameter escaping ([#11345](https://github.com/cube-js/cube/issues/11345)) ([463e602](https://github.com/cube-js/cube/commit/463e60284a5a4073eb7b7d2f11c4b315deaa2d94)) + ## [1.7.11](https://github.com/cube-js/cube/compare/v1.7.8...v1.7.11) (2026-07-26) **Note:** Version bump only for package @cubejs-backend/shared diff --git a/packages/cubejs-backend-shared/package.json b/packages/cubejs-backend-shared/package.json index 8f7ac451b71b8..bbc78a2dd50e7 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.11", + "version": "1.7.12", "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.11", + "@cubejs-backend/linter": "1.7.12", "@types/bytes": "^3.1.5", "@types/cli-progress": "^3.9.1", "@types/decompress": "^4.2.7", diff --git a/packages/cubejs-backend-shared/src/sql-escape.ts b/packages/cubejs-backend-shared/src/sql-escape.ts index 83aa18704aa59..6a6f30b5294c4 100644 --- a/packages/cubejs-backend-shared/src/sql-escape.ts +++ b/packages/cubejs-backend-shared/src/sql-escape.ts @@ -30,6 +30,19 @@ const MySqlDialect: SqlDialectEscapeRules = { identifierQuoteChar: '`', }; +/** + * Spark SQL / Hive / Databricks. Their lexers know backslash escapes only — a + * doubled quote is NOT an escape, it closes the literal and opens the next one. + * Because adjacent literals are concatenated, `'O''Brien'` silently evaluates to + * `OBrien` instead of raising, so quotes MUST be escaped as `\'` here. + */ +const SparkSqlDialect: SqlDialectEscapeRules = { + stringQuoteChar: '\'', + doubleQuoteToEscape: false, + escapeBackslash: true, + identifierQuoteChar: '`', +}; + class SqlEscaper { public constructor(public readonly rules: SqlDialectEscapeRules) {} @@ -46,6 +59,7 @@ class SqlEscaper { if (escapeBackslash) { escaped = escaped.split('\\').join('\\\\'); } + escaped = doubleQuoteToEscape ? escaped.split(stringQuoteChar).join(stringQuoteChar + stringQuoteChar) : escaped.split(stringQuoteChar).join(`\\${stringQuoteChar}`); @@ -164,12 +178,34 @@ class SqlEscaper { } } +/** + * Escaping dialect of the target engine: + * - `ansi` — standard SQL: Presto, Trino, Athena, Dremio, ksqlDB, Pinot, ... + * - `mysql` — MySQL / MariaDB: quotes doubled, backslash is an escape char + * - `spark` — Spark SQL / Hive / Databricks: backslash escapes only + */ +export type EscapeDialect = 'ansi' | 'mysql' | 'spark'; + +const Dialects: Record = { + ansi: AnsiSqlDialect, + mysql: MySqlDialect, + spark: SparkSqlDialect, +}; + +/** + * Format a query for the given engine dialect: `?` -> escaped value, + * `??` -> escaped identifier. + */ +export function format(dialect: EscapeDialect, sql: string, values?: unknown): string { + return new SqlEscaper(Dialects[dialect]).format(sql, values); +} + /** * Format a query for standard-SQL engines (Presto, Trino, Postgres, ...): * `?` -> escaped value, `??` -> escaped identifier. */ export function formatAnsi(sql: string, values?: unknown): string { - return new SqlEscaper(AnsiSqlDialect).format(sql, values); + return format('ansi', sql, values); } /** @@ -177,5 +213,17 @@ export function formatAnsi(sql: string, values?: unknown): string { * identifier. */ export function formatMySql(sql: string, values?: unknown): string { - return new SqlEscaper(MySqlDialect).format(sql, values); + return format('mysql', sql, values); +} + +/** + * Format a query for Spark SQL / Hive / Databricks: `?` -> escaped value, + * `??` -> escaped identifier. + */ +export function formatSparkSql(sql: string, values?: unknown): string { + return format('spark', sql, values); +} + +export function escapeStringLiteral(value: string): string { + return new SqlEscaper(AnsiSqlDialect).escapeString(String(value)); } diff --git a/packages/cubejs-backend-shared/test/sql-escape.test.ts b/packages/cubejs-backend-shared/test/sql-escape.test.ts index e6218228b5f17..16866e4945e42 100644 --- a/packages/cubejs-backend-shared/test/sql-escape.test.ts +++ b/packages/cubejs-backend-shared/test/sql-escape.test.ts @@ -1,7 +1,10 @@ /* eslint-disable quotes */ import { + escapeStringLiteral, + format, formatAnsi, formatMySql, + formatSparkSql, } from '../src/sql-escape'; const injectionPayloads: Array<[string, string]> = [ @@ -65,6 +68,38 @@ function decodeMySqlLiteral(literal: string): string { return decoded; } +/** + * Parses the subset of Spark SQL / Hive string-literal syntax emitted by + * SqlEscaper. A doubled quote is not an escape there, so any quote in the body + * must be backslash-prefixed — an unescaped one means the escaper let the + * literal close early (and Spark would concatenate whatever follows). + */ +function decodeSparkLiteral(literal: string): string { + if (literal.length < 2 || literal[0] !== "'" || literal[literal.length - 1] !== "'") { + throw new Error('Not a quoted Spark string literal'); + } + + const body = literal.slice(1, -1); + let decoded = ''; + for (let i = 0; i < body.length; i++) { + const char = body[i]; + if (char === "'") { + throw new Error('Unescaped quote in Spark string literal'); + } + if (char === '\\') { + const next = body[i + 1]; + if (next !== '\\' && next !== "'") { + throw new Error('Unescaped backslash in Spark string literal'); + } + decoded += next; + i++; + } else { + decoded += char; + } + } + return decoded; +} + function stringsUpToLength(alphabet: string[], maxLength: number): string[] { const values = ['']; let current = ['']; @@ -90,6 +125,12 @@ describe('sql-escape', () => { escapeValue: (value: unknown) => formatMySql('?', [value]), format: formatMySql, }; + const spark = { + escapeString: (value: string) => formatSparkSql('?', [value]), + escapeIdentifier: (value: string) => formatSparkSql('??', [value]), + escapeValue: (value: unknown) => formatSparkSql('?', [value]), + format: formatSparkSql, + }; describe('escapeString — ANSI/Presto (double quotes, backslash literal)', () => { it('doubles single quotes', () => { @@ -193,10 +234,59 @@ describe('sql-escape', () => { }); }); + describe('escapeString — Spark SQL/Hive/Databricks (backslash escapes only)', () => { + it('escapes quotes with a backslash instead of doubling them', () => { + // Verified against apache/spark:3.5.1 — `SELECT 'O''Brien'` returns OBrien + // (two adjacent literals, silently concatenated), while `'O\'Brien'` + // returns O'Brien. Hive 2.3.5 concatenates the same way by grammar. + expect(spark.escapeString("O'Brien")).toBe("'O\\'Brien'"); + expect(spark.escapeString("O'Brien")).not.toContain("''"); + }); + + it('doubles backslashes', () => { + expect(spark.escapeString('a\\b')).toBe("'a\\\\b'"); + }); + + it('neutralizes a trailing backslash + quote payload', () => { + expect(spark.escapeString("\\'")).toBe("'\\\\\\''"); + }); + + it.each(injectionPayloads)('keeps the %s payload inside one literal', (_name, payload) => { + expect(decodeSparkLiteral(spark.escapeString(payload))).toBe(payload); + }); + + it('round-trips every short combination of dangerous characters', () => { + const candidates = stringsUpToLength(["'", '\\', '\0', '\n', '\r', 'a'], 4); + + for (const candidate of candidates) { + expect(decodeSparkLiteral(spark.escapeString(candidate))).toBe(candidate); + } + }); + + it('escapes alternating backslashes and quote runs without changing their value', () => { + const value = "\\''\\\\'''"; + expect(decodeSparkLiteral(spark.escapeString(value))).toBe(value); + }); + + it('preserves representative Unicode and invisible characters', () => { + const values = [ + 'Café 日本語 👨‍👩‍👧‍👦', + 'cafe\u0301', + 'مرحبا بالعالم', + 'left\u200Dright', + ]; + + for (const value of values) { + expect(decodeSparkLiteral(spark.escapeString(value))).toBe(value); + } + }); + }); + describe('escapeIdentifier', () => { it('quotes with the dialect identifier char and doubles it', () => { expect(presto.escapeIdentifier('my"col')).toBe('"my""col"'); expect(mysql.escapeIdentifier('my`col')).toBe('`my``col`'); + expect(spark.escapeIdentifier('my`col')).toBe('`my``col`'); }); it('keeps identifier injection payloads within the quoted identifier', () => { @@ -388,6 +478,30 @@ describe('sql-escape', () => { }); }); + describe('format (dialect-driven entry point)', () => { + it('escapes according to the requested dialect', () => { + const value = "a\\b'c"; + + expect(format('ansi', 'WHERE a = ?', [value])).toBe("WHERE a = 'a\\b''c'"); + expect(format('mysql', 'WHERE a = ?', [value])).toBe("WHERE a = 'a\\\\b''c'"); + expect(format('spark', 'WHERE a = ?', [value])).toBe("WHERE a = 'a\\\\b\\'c'"); + }); + + it('escapes identifiers according to the requested dialect', () => { + expect(format('ansi', 'SELECT ??', ['col'])).toBe('SELECT "col"'); + expect(format('mysql', 'SELECT ??', ['col'])).toBe('SELECT `col`'); + expect(format('spark', 'SELECT ??', ['col'])).toBe('SELECT `col`'); + }); + + it('backs the per-dialect convenience helpers', () => { + const args: [string, unknown[]] = ['WHERE a = ? AND b = ??', ["it's", 'col']]; + + expect(formatAnsi(...args)).toBe(format('ansi', ...args)); + expect(formatMySql(...args)).toBe(format('mysql', ...args)); + expect(formatSparkSql(...args)).toBe(format('spark', ...args)); + }); + }); + describe('formatAnsi / formatMySql convenience helpers', () => { it('formatAnsi escapes as standard SQL (quotes doubled, backslash literal)', () => { expect(formatAnsi('WHERE a = ? AND b = ?', ["a\\b'c", 5])) @@ -414,4 +528,32 @@ describe('sql-escape', () => { expect(formatMySql('SELECT ?', false)).toBe('SELECT FALSE'); }); }); + + describe('escapeStringLiteral', () => { + it('wraps the value in quotes', () => { + expect(escapeStringLiteral('orders_rollup')).toBe("'orders_rollup'"); + }); + + it('doubles an embedded quote so the literal cannot be escaped', () => { + expect(escapeStringLiteral("pre_agg_x'; DROP TABLE victim; --")) + .toBe("'pre_agg_x''; DROP TABLE victim; --'"); + }); + + it('leaves a backslash as data', () => { + expect(escapeStringLiteral('folder\\name')).toBe("'folder\\name'"); + expect(escapeStringLiteral('trailing\\')).toBe("'trailing\\'"); + }); + + it.each(injectionPayloads)('neutralizes the %s payload', (_name, payload) => { + expect(decodeAnsiLiteral(escapeStringLiteral(payload))).toBe(payload); + }); + + it('round-trips every short combination of dangerous characters', () => { + const candidates = stringsUpToLength(["'", '\\', '\0', '\n', '\r', 'a'], 4); + + for (const candidate of candidates) { + expect(decodeAnsiLiteral(escapeStringLiteral(candidate))).toBe(candidate); + } + }); + }); }); diff --git a/packages/cubejs-base-driver/CHANGELOG.md b/packages/cubejs-base-driver/CHANGELOG.md index 4b2753870d71f..32b0d21ae330b 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.12](https://github.com/cube-js/cube/compare/v1.7.11...v1.7.12) (2026-07-27) + +**Note:** Version bump only for package @cubejs-backend/base-driver + ## [1.7.11](https://github.com/cube-js/cube/compare/v1.7.8...v1.7.11) (2026-07-26) **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 911b246257185..b4252aaad162a 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.11", + "version": "1.7.12", "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.11", + "@cubejs-backend/shared": "1.7.12", "@google-cloud/storage": "^7.13.0" }, "devDependencies": { - "@cubejs-backend/linter": "1.7.11", + "@cubejs-backend/linter": "1.7.12", "@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 38996f52d6791..b210a59c6e983 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.12](https://github.com/cube-js/cube/compare/v1.7.11...v1.7.12) (2026-07-27) + +**Note:** Version bump only for package @cubejs-backend/bigquery-driver + ## [1.7.11](https://github.com/cube-js/cube/compare/v1.7.8...v1.7.11) (2026-07-26) **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 bed873f6c2f39..e025a4c130cf6 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.11", + "version": "1.7.12", "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.11", + "@cubejs-backend/base-driver": "1.7.12", "@cubejs-backend/dotenv": "^9.0.2", - "@cubejs-backend/shared": "1.7.11", + "@cubejs-backend/shared": "1.7.12", "@google-cloud/bigquery": "^7.7.0", "@google-cloud/storage": "^7.13.0", "ramda": "^0.27.2" }, "devDependencies": { - "@cubejs-backend/testing-shared": "1.7.11", + "@cubejs-backend/testing-shared": "1.7.12", "@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 b9254ce727fb6..dfedfaaaca43f 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.12](https://github.com/cube-js/cube/compare/v1.7.11...v1.7.12) (2026-07-27) + +**Note:** Version bump only for package cubejs-cli + ## [1.7.11](https://github.com/cube-js/cube/compare/v1.7.8...v1.7.11) (2026-07-26) **Note:** Version bump only for package cubejs-cli diff --git a/packages/cubejs-cli/package.json b/packages/cubejs-cli/package.json index 13ab25427065f..002ab7ef24048 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.11", + "version": "1.7.12", "repository": { "type": "git", "url": "https://github.com/cube-js/cube.git", @@ -30,10 +30,10 @@ "LICENSE" ], "dependencies": { - "@cubejs-backend/cloud": "1.7.11", + "@cubejs-backend/cloud": "1.7.12", "@cubejs-backend/dotenv": "^9.0.2", - "@cubejs-backend/schema-compiler": "1.7.11", - "@cubejs-backend/shared": "1.7.11", + "@cubejs-backend/schema-compiler": "1.7.12", + "@cubejs-backend/shared": "1.7.12", "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.11", - "@cubejs-backend/server": "1.7.11", + "@cubejs-backend/linter": "1.7.12", + "@cubejs-backend/server": "1.7.12", "@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 c506cd10b5040..75e810798d8a9 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.12](https://github.com/cube-js/cube/compare/v1.7.11...v1.7.12) (2026-07-27) + +**Note:** Version bump only for package @cubejs-backend/clickhouse-driver + ## [1.7.11](https://github.com/cube-js/cube/compare/v1.7.8...v1.7.11) (2026-07-26) **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 e0732961054ef..cac265a361d75 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.11", + "version": "1.7.12", "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.11", - "@cubejs-backend/shared": "1.7.11", + "@cubejs-backend/base-driver": "1.7.12", + "@cubejs-backend/shared": "1.7.12", "moment": "^2.24.0", "sqlstring": "^2.3.1", "uuid": "^8.3.2" }, "license": "Apache-2.0", "devDependencies": { - "@cubejs-backend/linter": "1.7.11", - "@cubejs-backend/testing-shared": "1.7.11", + "@cubejs-backend/linter": "1.7.12", + "@cubejs-backend/testing-shared": "1.7.12", "@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 fe14f3959221d..bbee9735a64b7 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.12](https://github.com/cube-js/cube/compare/v1.7.11...v1.7.12) (2026-07-27) + +**Note:** Version bump only for package @cubejs-client/core + ## [1.7.11](https://github.com/cube-js/cube/compare/v1.7.8...v1.7.11) (2026-07-26) **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 6244e8ff9d9e5..ff966b5660b20 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.11", + "version": "1.7.12", "engines": {}, "type": "module", "repository": { @@ -57,7 +57,7 @@ ], "license": "MIT", "devDependencies": { - "@cubejs-backend/linter": "1.7.11", + "@cubejs-backend/linter": "1.7.12", "@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 24e9d6d6c3441..8def13c2a7258 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.12](https://github.com/cube-js/cube/compare/v1.7.11...v1.7.12) (2026-07-27) + +**Note:** Version bump only for package @cubejs-client/dx + ## [1.7.11](https://github.com/cube-js/cube/compare/v1.7.8...v1.7.11) (2026-07-26) **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 ac18b8caae14b..02cae07ef57fd 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.11", + "version": "1.7.12", "engines": {}, "repository": { "type": "git", diff --git a/packages/cubejs-client-ngx/CHANGELOG.md b/packages/cubejs-client-ngx/CHANGELOG.md index 9e832df98638b..58ca35668a6e5 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.12](https://github.com/cube-js/cube/compare/v1.7.11...v1.7.12) (2026-07-27) + +**Note:** Version bump only for package @cubejs-client/ngx + ## [1.7.11](https://github.com/cube-js/cube/compare/v1.7.8...v1.7.11) (2026-07-26) **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 6428213ffdd04..aaa1799da0ffc 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.11", + "version": "1.7.12", "author": "Cube Dev, Inc.", "engines": {}, "repository": { diff --git a/packages/cubejs-client-react/CHANGELOG.md b/packages/cubejs-client-react/CHANGELOG.md index 321406496ef67..e7df10fd6a726 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.12](https://github.com/cube-js/cube/compare/v1.7.11...v1.7.12) (2026-07-27) + +**Note:** Version bump only for package @cubejs-client/react + ## [1.7.11](https://github.com/cube-js/cube/compare/v1.7.8...v1.7.11) (2026-07-26) **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 2c3596f16500d..73489b80aa5f6 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.11", + "version": "1.7.12", "author": "Cube Dev, Inc.", "license": "MIT", "engines": {}, @@ -24,7 +24,7 @@ ], "dependencies": { "@babel/runtime": "^7.1.2", - "@cubejs-client/core": "1.7.11", + "@cubejs-client/core": "1.7.12", "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 a04b37d0bb72f..35d7306b084be 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.12](https://github.com/cube-js/cube/compare/v1.7.11...v1.7.12) (2026-07-27) + +**Note:** Version bump only for package @cubejs-client/vue3 + ## [1.7.11](https://github.com/cube-js/cube/compare/v1.7.8...v1.7.11) (2026-07-26) **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 09ebb252a44b1..9246fcafc4a8d 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.11", + "version": "1.7.12", "engines": {}, "repository": { "type": "git", @@ -27,7 +27,7 @@ "src" ], "dependencies": { - "@cubejs-client/core": "1.7.11", + "@cubejs-client/core": "1.7.12", "ramda": "^0.27.0" }, "devDependencies": { diff --git a/packages/cubejs-client-ws-transport/CHANGELOG.md b/packages/cubejs-client-ws-transport/CHANGELOG.md index d82444255833a..96f5d3d1f8b34 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.12](https://github.com/cube-js/cube/compare/v1.7.11...v1.7.12) (2026-07-27) + +**Note:** Version bump only for package @cubejs-client/ws-transport + ## [1.7.11](https://github.com/cube-js/cube/compare/v1.7.8...v1.7.11) (2026-07-26) **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 65a22da33482c..5d2cb7fdff214 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.11", + "version": "1.7.12", "engines": {}, "repository": { "type": "git", @@ -20,7 +20,7 @@ }, "dependencies": { "@babel/runtime": "^7.1.2", - "@cubejs-client/core": "1.7.11", + "@cubejs-client/core": "1.7.12", "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.11", + "@cubejs-backend/linter": "1.7.12", "@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 f919c34eb140e..c7fdc184c0fe5 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.12](https://github.com/cube-js/cube/compare/v1.7.11...v1.7.12) (2026-07-27) + +**Note:** Version bump only for package @cubejs-backend/crate-driver + ## [1.7.11](https://github.com/cube-js/cube/compare/v1.7.8...v1.7.11) (2026-07-26) **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 c7c670ab940f5..fc778e3efc585 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.11", + "version": "1.7.12", "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.11", - "@cubejs-backend/shared": "1.7.11" + "@cubejs-backend/postgres-driver": "1.7.12", + "@cubejs-backend/shared": "1.7.12" }, "license": "Apache-2.0", "devDependencies": { - "@cubejs-backend/linter": "1.7.11", - "@cubejs-backend/testing-shared": "1.7.11", + "@cubejs-backend/linter": "1.7.12", + "@cubejs-backend/testing-shared": "1.7.12", "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 380975987a496..cd3eaec838ec9 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.12](https://github.com/cube-js/cube/compare/v1.7.11...v1.7.12) (2026-07-27) + +**Note:** Version bump only for package @cubejs-backend/cubestore-driver + ## [1.7.11](https://github.com/cube-js/cube/compare/v1.7.8...v1.7.11) (2026-07-26) **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 6d55a9b2d90ad..581fcb8db2bf3 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.11", + "version": "1.7.12", "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.11", - "@cubejs-backend/cubestore": "1.7.11", - "@cubejs-backend/native": "1.7.11", - "@cubejs-backend/shared": "1.7.11", + "@cubejs-backend/base-driver": "1.7.12", + "@cubejs-backend/cubestore": "1.7.12", + "@cubejs-backend/native": "1.7.12", + "@cubejs-backend/shared": "1.7.12", "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.11", + "@cubejs-backend/linter": "1.7.12", "@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 dee2e1eaf30db..de060e2168679 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.12](https://github.com/cube-js/cube/compare/v1.7.11...v1.7.12) (2026-07-27) + +### Bug Fixes + +- **pinot/dremio/ksql/databriks/hive/jdbc-driver:** Сorrect SQL parameter escaping ([#11374](https://github.com/cube-js/cube/issues/11374)) ([a743790](https://github.com/cube-js/cube/commit/a7437904411cbf268a30bc985c6d5b3b8bbe0e2c)) + ## [1.7.11](https://github.com/cube-js/cube/compare/v1.7.8...v1.7.11) (2026-07-26) ### Bug Fixes diff --git a/packages/cubejs-databricks-jdbc-driver/package.json b/packages/cubejs-databricks-jdbc-driver/package.json index 66b0eae4271b3..6571c22b0dd4a 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.11", + "version": "1.7.12", "license": "Apache-2.0", "repository": { "type": "git", @@ -30,17 +30,17 @@ "bin" ], "dependencies": { - "@cubejs-backend/base-driver": "1.7.11", - "@cubejs-backend/jdbc-driver": "1.7.11", - "@cubejs-backend/schema-compiler": "1.7.11", - "@cubejs-backend/shared": "1.7.11", + "@cubejs-backend/base-driver": "1.7.12", + "@cubejs-backend/jdbc-driver": "1.7.12", + "@cubejs-backend/schema-compiler": "1.7.12", + "@cubejs-backend/shared": "1.7.12", "node-fetch": "^2.6.1", "ramda": "^0.27.2", "source-map-support": "^0.5.19", "uuid": "^8.3.2" }, "devDependencies": { - "@cubejs-backend/linter": "1.7.11", + "@cubejs-backend/linter": "1.7.12", "@types/jest": "^29", "@types/node": "^22", "@types/ramda": "^0.27.34", diff --git a/packages/cubejs-databricks-jdbc-driver/src/DatabricksDriver.ts b/packages/cubejs-databricks-jdbc-driver/src/DatabricksDriver.ts index c40d6c08d3136..95a5f4b452099 100644 --- a/packages/cubejs-databricks-jdbc-driver/src/DatabricksDriver.ts +++ b/packages/cubejs-databricks-jdbc-driver/src/DatabricksDriver.ts @@ -17,7 +17,7 @@ import { TableColumn, UnloadOptions, } from '@cubejs-backend/base-driver'; -import { JDBCDriver, JDBCDriverConfiguration, } from '@cubejs-backend/jdbc-driver'; +import { EscapeDialect, JDBCDriver, JDBCDriverConfiguration, } from '@cubejs-backend/jdbc-driver'; import { DatabricksQuery } from './DatabricksQuery'; import { extractAndRemoveUidPwdFromJdbcUrl, @@ -687,6 +687,10 @@ export class DatabricksDriver extends JDBCDriver { return result; } + protected escapeDialect(): EscapeDialect { + return 'spark'; + } + /** * Returns query columns types. */ diff --git a/packages/cubejs-dbt-schema-extension/CHANGELOG.md b/packages/cubejs-dbt-schema-extension/CHANGELOG.md index 66db41fbff272..74f3eb2fd5694 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.12](https://github.com/cube-js/cube/compare/v1.7.11...v1.7.12) (2026-07-27) + +**Note:** Version bump only for package @cubejs-backend/dbt-schema-extension + ## [1.7.11](https://github.com/cube-js/cube/compare/v1.7.8...v1.7.11) (2026-07-26) **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 47609c75a02b4..e372d1002c5a7 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.11", + "version": "1.7.12", "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.11", + "@cubejs-backend/schema-compiler": "1.7.12", "fs-extra": "^9.1.0", "inflection": "^1.12.0", "node-fetch": "^2.6.1" }, "devDependencies": { - "@cubejs-backend/linter": "1.7.11", - "@cubejs-backend/testing": "1.7.11", + "@cubejs-backend/linter": "1.7.12", + "@cubejs-backend/testing": "1.7.12", "@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 63be9cadfac1b..9e0e6102d3c2a 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.12](https://github.com/cube-js/cube/compare/v1.7.11...v1.7.12) (2026-07-27) + +**Note:** Version bump only for package @cubejs-backend/docker + ## [1.7.11](https://github.com/cube-js/cube/compare/v1.7.8...v1.7.11) (2026-07-26) **Note:** Version bump only for package @cubejs-backend/docker diff --git a/packages/cubejs-docker/package.json b/packages/cubejs-docker/package.json index 1e314cf6a409f..6c081cbc7210c 100644 --- a/packages/cubejs-docker/package.json +++ b/packages/cubejs-docker/package.json @@ -1,6 +1,6 @@ { "name": "@cubejs-backend/docker", - "version": "1.7.11", + "version": "1.7.12", "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.11", - "@cubejs-backend/bigquery-driver": "1.7.11", - "@cubejs-backend/clickhouse-driver": "1.7.11", - "@cubejs-backend/crate-driver": "1.7.11", - "@cubejs-backend/databricks-jdbc-driver": "1.7.11", - "@cubejs-backend/dbt-schema-extension": "1.7.11", - "@cubejs-backend/dremio-driver": "1.7.11", - "@cubejs-backend/druid-driver": "1.7.11", - "@cubejs-backend/duckdb-driver": "1.7.11", - "@cubejs-backend/firebolt-driver": "1.7.11", - "@cubejs-backend/hive-driver": "1.7.11", - "@cubejs-backend/ksql-driver": "1.7.11", - "@cubejs-backend/materialize-driver": "1.7.11", - "@cubejs-backend/mongobi-driver": "1.7.11", - "@cubejs-backend/mssql-driver": "1.7.11", - "@cubejs-backend/mysql-driver": "1.7.11", - "@cubejs-backend/oracle-driver": "1.7.11", - "@cubejs-backend/pinot-driver": "1.7.11", - "@cubejs-backend/postgres-driver": "1.7.11", - "@cubejs-backend/prestodb-driver": "1.7.11", - "@cubejs-backend/questdb-driver": "1.7.11", - "@cubejs-backend/redshift-driver": "1.7.11", - "@cubejs-backend/server": "1.7.11", - "@cubejs-backend/snowflake-driver": "1.7.11", - "@cubejs-backend/sqlite-driver": "1.7.11", - "@cubejs-backend/trino-driver": "1.7.11", - "@cubejs-backend/vertica-driver": "1.7.11", - "cubejs-cli": "1.7.11", + "@cubejs-backend/athena-driver": "1.7.12", + "@cubejs-backend/bigquery-driver": "1.7.12", + "@cubejs-backend/clickhouse-driver": "1.7.12", + "@cubejs-backend/crate-driver": "1.7.12", + "@cubejs-backend/databricks-jdbc-driver": "1.7.12", + "@cubejs-backend/dbt-schema-extension": "1.7.12", + "@cubejs-backend/dremio-driver": "1.7.12", + "@cubejs-backend/druid-driver": "1.7.12", + "@cubejs-backend/duckdb-driver": "1.7.12", + "@cubejs-backend/firebolt-driver": "1.7.12", + "@cubejs-backend/hive-driver": "1.7.12", + "@cubejs-backend/ksql-driver": "1.7.12", + "@cubejs-backend/materialize-driver": "1.7.12", + "@cubejs-backend/mongobi-driver": "1.7.12", + "@cubejs-backend/mssql-driver": "1.7.12", + "@cubejs-backend/mysql-driver": "1.7.12", + "@cubejs-backend/oracle-driver": "1.7.12", + "@cubejs-backend/pinot-driver": "1.7.12", + "@cubejs-backend/postgres-driver": "1.7.12", + "@cubejs-backend/prestodb-driver": "1.7.12", + "@cubejs-backend/questdb-driver": "1.7.12", + "@cubejs-backend/redshift-driver": "1.7.12", + "@cubejs-backend/server": "1.7.12", + "@cubejs-backend/snowflake-driver": "1.7.12", + "@cubejs-backend/sqlite-driver": "1.7.12", + "@cubejs-backend/trino-driver": "1.7.12", + "@cubejs-backend/vertica-driver": "1.7.12", + "cubejs-cli": "1.7.12", "typescript": "~5.2.2" }, "resolutions": { diff --git a/packages/cubejs-dremio-driver/CHANGELOG.md b/packages/cubejs-dremio-driver/CHANGELOG.md index a59b0cb1917e8..ad671f2dfef42 100644 --- a/packages/cubejs-dremio-driver/CHANGELOG.md +++ b/packages/cubejs-dremio-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.12](https://github.com/cube-js/cube/compare/v1.7.11...v1.7.12) (2026-07-27) + +### Bug Fixes + +- **pinot/dremio/ksql/databriks/hive/jdbc-driver:** Сorrect SQL parameter escaping ([#11374](https://github.com/cube-js/cube/issues/11374)) ([a743790](https://github.com/cube-js/cube/commit/a7437904411cbf268a30bc985c6d5b3b8bbe0e2c)) + ## [1.7.11](https://github.com/cube-js/cube/compare/v1.7.8...v1.7.11) (2026-07-26) **Note:** Version bump only for package @cubejs-backend/dremio-driver diff --git a/packages/cubejs-dremio-driver/driver/DremioDriver.js b/packages/cubejs-dremio-driver/driver/DremioDriver.js index 2db10384dd684..b973687d4114d 100644 --- a/packages/cubejs-dremio-driver/driver/DremioDriver.js +++ b/packages/cubejs-dremio-driver/driver/DremioDriver.js @@ -7,10 +7,10 @@ const { getEnv, assertDataSource, + formatAnsi, pausePromise, } = require('@cubejs-backend/shared'); const axios = require('axios'); -const SqlString = require('sqlstring'); const { BaseDriver } = require('@cubejs-backend/base-driver'); const DremioQuery = require('./DremioQuery'); @@ -18,7 +18,7 @@ const DremioQuery = require('./DremioQuery'); // @see https://docs.dremio.com/rest-api/jobs/get-job.html const DREMIO_JOB_LIMIT = 500; -const applyParams = (query, params) => SqlString.format(query, params); +const applyParams = (query, params) => formatAnsi(query, params); /** * Dremio driver class. @@ -208,12 +208,7 @@ class DremioDriver extends BaseDriver { } async query(query, values) { - const queryString = applyParams( - query, - (values || []).map(s => (typeof s === 'string' ? { - toSqlString: () => SqlString.escape(s).replace(/\\\\([_%])/g, '\\$1').replace(/\\'/g, '\'\'') - } : s)) - ); + const queryString = applyParams(query, values || []); await this.getToken(); const jobId = await this.executeQuery(queryString); @@ -281,3 +276,4 @@ class DremioDriver extends BaseDriver { } module.exports = DremioDriver; +module.exports.applyParams = applyParams; diff --git a/packages/cubejs-dremio-driver/package.json b/packages/cubejs-dremio-driver/package.json index 050570ea5ca54..70bff5e181b14 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.11", + "version": "1.7.12", "repository": { "type": "git", "url": "https://github.com/cube-js/cube.git", @@ -16,21 +16,21 @@ "tsc": "tsc", "watch": "tsc -w", "test": "yarn integration", + "unit": "jest --verbose dist/test/unit", "integration": "npm run integration:dremio", "integration:dremio": "jest --verbose dist/test", "lint": "eslint driver/*.js", "lint:fix": "eslint driver/*.js" }, "dependencies": { - "@cubejs-backend/base-driver": "1.7.11", - "@cubejs-backend/schema-compiler": "1.7.11", - "@cubejs-backend/shared": "1.7.11", - "axios": "^1.8.3", - "sqlstring": "^2.3.1" + "@cubejs-backend/base-driver": "1.7.12", + "@cubejs-backend/schema-compiler": "1.7.12", + "@cubejs-backend/shared": "1.7.12", + "axios": "^1.8.3" }, "devDependencies": { - "@cubejs-backend/linter": "1.7.11", - "@cubejs-backend/testing-shared": "1.7.11", + "@cubejs-backend/linter": "1.7.12", + "@cubejs-backend/testing-shared": "1.7.12", "jest": "^29" }, "license": "Apache-2.0", diff --git a/packages/cubejs-dremio-driver/test/unit/params-escaping.test.ts b/packages/cubejs-dremio-driver/test/unit/params-escaping.test.ts new file mode 100644 index 0000000000000..14584509596a9 --- /dev/null +++ b/packages/cubejs-dremio-driver/test/unit/params-escaping.test.ts @@ -0,0 +1,88 @@ +/* eslint-disable quotes */ +const { applyParams } = require('../../../driver/DremioDriver'); + +// Dremio is a Calcite-based, standard-SQL engine: a quote inside a string +// literal is escaped by doubling it and a backslash is plain data. +describe('DremioDriver SQL parameter escaping', () => { + it('preserves LIKE escape sequences emitted by the schema compiler', () => { + const sql = applyParams( + `SELECT * FROM orders WHERE LOWER(name) LIKE '%' || LOWER(?) || '%' ESCAPE '\\'`, + ['new\\_order\\%'], + ); + + expect(sql).toBe( + `SELECT * FROM orders WHERE LOWER(name) LIKE '%' || LOWER('new\\_order\\%') || '%' ESCAPE '\\'` + ); + }); + + it('does not double literal backslashes in LIKE parameters', () => { + const sql = applyParams( + `SELECT * FROM orders WHERE LOWER(name) LIKE '%' || LOWER(?) || '%' ESCAPE '\\'`, + ['folder\\\\name'], + ); + + expect(sql).toBe( + `SELECT * FROM orders WHERE LOWER(name) LIKE '%' || LOWER('folder\\\\name') || '%' ESCAPE '\\'` + ); + }); + + it('doubles quotes so a value cannot break out of the literal', () => { + const sql = applyParams( + 'SELECT * FROM orders WHERE name = ?', + [`o'reilly'); DROP TABLE orders; --`], + ); + + expect(sql).toBe( + `SELECT * FROM orders WHERE name = 'o''reilly''); DROP TABLE orders; --'` + ); + }); + + it('keeps the literal closed for a backslash-then-quote payload', () => { + // In a backslash-escaping dialect `\'` would smuggle a quote through; on + // Dremio the backslash is data and only the quote needs doubling. + const sql = applyParams( + 'SELECT * FROM orders WHERE name = ?', + [`foo\\' OR 1=1 --`], + ); + + expect(sql).toBe(`SELECT * FROM orders WHERE name = 'foo\\'' OR 1=1 --'`); + }); + + it('keeps the literal closed for a value ending in a backslash', () => { + const sql = applyParams( + 'SELECT * FROM orders WHERE name = ? AND status = ?', + ['payload\\', 'new'], + ); + + expect(sql).toBe(`SELECT * FROM orders WHERE name = 'payload\\' AND status = 'new'`); + }); + + it('keeps a literal percent sign in an equality parameter verbatim', () => { + const sql = applyParams( + 'SELECT * FROM orders WHERE discount_label = ?', + ['100% cotton'], + ); + + expect(sql).toBe(`SELECT * FROM orders WHERE discount_label = '100% cotton'`); + }); + + it('escapes every element of an array parameter', () => { + const sql = applyParams( + 'SELECT * FROM orders WHERE status IN (?)', + [[`it's`, 'b']], + ); + + expect(sql).toBe(`SELECT * FROM orders WHERE status IN ('it''s', 'b')`); + }); + + it('substitutes multiple placeholders in order', () => { + const sql = applyParams( + `SELECT * FROM orders WHERE LOWER(name) LIKE '%' || LOWER(?) || '%' ESCAPE '\\' AND status = ? AND amount > ?`, + ['pending\\_review', 'new', 100], + ); + + expect(sql).toBe( + `SELECT * FROM orders WHERE LOWER(name) LIKE '%' || LOWER('pending\\_review') || '%' ESCAPE '\\' AND status = 'new' AND amount > 100` + ); + }); +}); diff --git a/packages/cubejs-druid-driver/CHANGELOG.md b/packages/cubejs-druid-driver/CHANGELOG.md index 34471651a634c..a6d8e3f72f59a 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.12](https://github.com/cube-js/cube/compare/v1.7.11...v1.7.12) (2026-07-27) + +**Note:** Version bump only for package @cubejs-backend/druid-driver + ## [1.7.11](https://github.com/cube-js/cube/compare/v1.7.8...v1.7.11) (2026-07-26) ### Features diff --git a/packages/cubejs-druid-driver/package.json b/packages/cubejs-druid-driver/package.json index 2f348ab55a0b0..2e2144bc30e6d 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.11", + "version": "1.7.12", "license": "Apache-2.0", "repository": { "type": "git", @@ -28,13 +28,13 @@ "dist/src/*" ], "dependencies": { - "@cubejs-backend/base-driver": "1.7.11", - "@cubejs-backend/schema-compiler": "1.7.11", - "@cubejs-backend/shared": "1.7.11", + "@cubejs-backend/base-driver": "1.7.12", + "@cubejs-backend/schema-compiler": "1.7.12", + "@cubejs-backend/shared": "1.7.12", "axios": "^1.8.3" }, "devDependencies": { - "@cubejs-backend/linter": "1.7.11", + "@cubejs-backend/linter": "1.7.12", "@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 73a634fb3b857..ebbb5d2f9aa0f 100644 --- a/packages/cubejs-duckdb-driver/CHANGELOG.md +++ b/packages/cubejs-duckdb-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.12](https://github.com/cube-js/cube/compare/v1.7.11...v1.7.12) (2026-07-27) + +**Note:** Version bump only for package @cubejs-backend/duckdb-driver + ## [1.7.11](https://github.com/cube-js/cube/compare/v1.7.8...v1.7.11) (2026-07-26) ### Bug Fixes diff --git a/packages/cubejs-duckdb-driver/package.json b/packages/cubejs-duckdb-driver/package.json index f0377e747506b..ef3c304763e95 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.11", + "version": "1.7.12", "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.11", - "@cubejs-backend/schema-compiler": "1.7.11", - "@cubejs-backend/shared": "1.7.11", + "@cubejs-backend/base-driver": "1.7.12", + "@cubejs-backend/schema-compiler": "1.7.12", + "@cubejs-backend/shared": "1.7.12", "duckdb": "^1.4.1" }, "license": "Apache-2.0", "devDependencies": { - "@cubejs-backend/linter": "1.7.11", - "@cubejs-backend/testing-shared": "1.7.11", + "@cubejs-backend/linter": "1.7.12", + "@cubejs-backend/testing-shared": "1.7.12", "@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 1cf19e9dbcbac..06453c6a09742 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.12](https://github.com/cube-js/cube/compare/v1.7.11...v1.7.12) (2026-07-27) + +**Note:** Version bump only for package @cubejs-backend/firebolt-driver + ## [1.7.11](https://github.com/cube-js/cube/compare/v1.7.8...v1.7.11) (2026-07-26) ### Features diff --git a/packages/cubejs-firebolt-driver/package.json b/packages/cubejs-firebolt-driver/package.json index b7ace7d955d76..4c98661f27048 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.11", + "version": "1.7.12", "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.11", - "@cubejs-backend/schema-compiler": "1.7.11", - "@cubejs-backend/shared": "1.7.11", + "@cubejs-backend/base-driver": "1.7.12", + "@cubejs-backend/schema-compiler": "1.7.12", + "@cubejs-backend/shared": "1.7.12", "firebolt-sdk": "1.10.0" }, "license": "Apache-2.0", "devDependencies": { - "@cubejs-backend/linter": "1.7.11", - "@cubejs-backend/testing-shared": "1.7.11", + "@cubejs-backend/linter": "1.7.12", + "@cubejs-backend/testing-shared": "1.7.12", "typescript": "~5.2.2" }, "publishConfig": { diff --git a/packages/cubejs-hive-driver/CHANGELOG.md b/packages/cubejs-hive-driver/CHANGELOG.md index 17547cd81a895..a315d18eae23d 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.12](https://github.com/cube-js/cube/compare/v1.7.11...v1.7.12) (2026-07-27) + +**Note:** Version bump only for package @cubejs-backend/hive-driver + ## [1.7.11](https://github.com/cube-js/cube/compare/v1.7.8...v1.7.11) (2026-07-26) **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 7505978c1178b..7f0c46f2757e2 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.11", + "version": "1.7.12", "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.11", - "@cubejs-backend/shared": "1.7.11", + "@cubejs-backend/base-driver": "1.7.12", + "@cubejs-backend/shared": "1.7.12", "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.11" + "@cubejs-backend/linter": "1.7.12" }, "publishConfig": { "access": "public" diff --git a/packages/cubejs-jdbc-driver/CHANGELOG.md b/packages/cubejs-jdbc-driver/CHANGELOG.md index aaee5ef2a588d..a8026dea99e38 100644 --- a/packages/cubejs-jdbc-driver/CHANGELOG.md +++ b/packages/cubejs-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.12](https://github.com/cube-js/cube/compare/v1.7.11...v1.7.12) (2026-07-27) + +### Bug Fixes + +- **pinot/dremio/ksql/databriks/hive/jdbc-driver:** Сorrect SQL parameter escaping ([#11374](https://github.com/cube-js/cube/issues/11374)) ([a743790](https://github.com/cube-js/cube/commit/a7437904411cbf268a30bc985c6d5b3b8bbe0e2c)) + ## [1.7.11](https://github.com/cube-js/cube/compare/v1.7.8...v1.7.11) (2026-07-26) **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 b9f6fe7c4ce27..50f067b305153 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.11", + "version": "1.7.12", "repository": { "type": "git", "url": "https://github.com/cube-js/cube.git", @@ -17,6 +17,7 @@ "build": "rm -rf dist && npm run tsc", "tsc": "tsc", "watch": "tsc -w", + "unit": "jest --verbose dist/test/unit", "lint": "eslint src/* --ext .ts", "lint:fix": "eslint --fix src/* --ext .ts" }, @@ -25,10 +26,9 @@ "index.js" ], "dependencies": { - "@cubejs-backend/base-driver": "1.7.11", + "@cubejs-backend/base-driver": "1.7.12", "@cubejs-backend/node-java-maven": "^0.1.3", - "@cubejs-backend/shared": "1.7.11", - "sqlstring": "^2.3.0" + "@cubejs-backend/shared": "1.7.12" }, "optionalDependencies": { "@cubejs-backend/jdbc": "^0.9.0", @@ -42,9 +42,8 @@ "testEnvironment": "node" }, "devDependencies": { - "@cubejs-backend/linter": "1.7.11", + "@cubejs-backend/linter": "1.7.12", "@types/node": "^22", - "@types/sqlstring": "^2.3.0", "typescript": "~5.2.2" } } diff --git a/packages/cubejs-jdbc-driver/src/JDBCDriver.ts b/packages/cubejs-jdbc-driver/src/JDBCDriver.ts index 5b6ea4ac1d095..3b4736e7c523a 100644 --- a/packages/cubejs-jdbc-driver/src/JDBCDriver.ts +++ b/packages/cubejs-jdbc-driver/src/JDBCDriver.ts @@ -8,6 +8,7 @@ import { getEnv, assertDataSource, CancelablePromise, + format, Pool, } from '@cubejs-backend/shared'; import { @@ -17,12 +18,11 @@ import { DownloadQueryResultsResult, StreamOptions, } from '@cubejs-backend/base-driver'; -import * as SqlString from 'sqlstring'; import { promisify } from 'util'; import path from 'path'; import { SupportedDrivers } from './supported-drivers'; -import type { DriverOptionsInterface } from './supported-drivers'; +import type { DriverOptionsInterface, EscapeDialect } from './supported-drivers'; import type { JDBCDriverConfiguration } from './types'; import { QueryStream, transformRow } from './QueryStream'; import type { nextFn } from './QueryStream'; @@ -65,8 +65,6 @@ const initMvn = (customClassPath: any) => { return mvnPromise; }; -const applyParams = (query: string, params: object | any[]) => SqlString.format(query, params); - // promisify Connection methods Connection.prototype.getMetaDataAsync = promisify(Connection.prototype.getMetaData); // promisify DatabaseMetaData methods @@ -237,8 +235,23 @@ export class JDBCDriver extends BaseDriver { []; } + protected escapeDialect(): EscapeDialect { + const dbTypeDescription = JDBCDriver.dbTypeDescription(this.config.dbType); + if (dbTypeDescription?.escapeDialect) { + return dbTypeDescription.escapeDialect; + } + + throw new Error( + `Unable to detect SQL escaping rules for db type "${this.config.dbType}"` + ); + } + + protected prepareQueryWithParams(query: string, values: unknown[]): string { + return format(this.escapeDialect(), query, values || []); + } + public async query(query: string, values: unknown[]): Promise { - const queryWithParams = applyParams(query, values); + const queryWithParams = this.prepareQueryWithParams(query, values); const cancelObj: {cancel?: Function} = {}; const promise = this.queryPromised(queryWithParams, cancelObj, this.prepareConnectionQueries()); (promise as CancelablePromise).cancel = @@ -282,9 +295,11 @@ export class JDBCDriver extends BaseDriver { public async stream(sql: string, values: unknown[], { highWaterMark }: StreamOptions): Promise { const conn = await this.pool.acquire(); - const query = applyParams(sql, values); - const cancelObj: {cancel?: Function} = {}; + try { + const query = this.prepareQueryWithParams(sql, values); + const cancelObj: {cancel?: Function} = {}; + const createStatement = promisify(conn.createStatement.bind(conn)); const statement = await createStatement(); @@ -325,6 +340,7 @@ export class JDBCDriver extends BaseDriver { })); } catch (ex: any) { await this.pool.release(conn); + if (ex.cause) { throw new Error(ex.cause.getMessageSync()); } else { diff --git a/packages/cubejs-jdbc-driver/src/index.ts b/packages/cubejs-jdbc-driver/src/index.ts index d857170a7dd99..fa5b11fabf17e 100644 --- a/packages/cubejs-jdbc-driver/src/index.ts +++ b/packages/cubejs-jdbc-driver/src/index.ts @@ -1,2 +1,3 @@ export * from './JDBCDriver'; +export * from './supported-drivers'; export * from './types'; diff --git a/packages/cubejs-jdbc-driver/src/supported-drivers.ts b/packages/cubejs-jdbc-driver/src/supported-drivers.ts index 3dbf6a2a87ca3..b789124bdf03b 100644 --- a/packages/cubejs-jdbc-driver/src/supported-drivers.ts +++ b/packages/cubejs-jdbc-driver/src/supported-drivers.ts @@ -1,13 +1,19 @@ +import type { EscapeDialect } from '@cubejs-backend/shared'; + +export type { EscapeDialect }; + export interface DriverOptionsInterface { driverClass: string; prepareConnectionQueries: string[]; mavenDependency: Record; properties: Record; jdbcUrl: () => string; + escapeDialect: EscapeDialect; } export const SupportedDrivers: Record = { mysql: { + escapeDialect: 'mysql', driverClass: 'com.mysql.jdbc.Driver', prepareConnectionQueries: ['SET time_zone = \'+00:00\''], mavenDependency: { @@ -22,6 +28,7 @@ export const SupportedDrivers: Record = { jdbcUrl: () => `jdbc:mysql://${process.env.CUBEJS_DB_HOST}:3306/${process.env.CUBEJS_DB_NAME}` }, athena: { + escapeDialect: 'ansi', driverClass: 'com.qubole.jdbc.jdbc41.core.QDriver', prepareConnectionQueries: [], mavenDependency: { @@ -37,6 +44,7 @@ export const SupportedDrivers: Record = { } }, sparksql: { + escapeDialect: 'spark', driverClass: 'org.apache.hive.jdbc.HiveDriver', prepareConnectionQueries: [], mavenDependency: { @@ -51,6 +59,7 @@ export const SupportedDrivers: Record = { } }, hive: { + escapeDialect: 'spark', driverClass: 'org.apache.hive.jdbc.HiveDriver', prepareConnectionQueries: [], mavenDependency: { diff --git a/packages/cubejs-jdbc-driver/test/unit/escape-dialect.test.ts b/packages/cubejs-jdbc-driver/test/unit/escape-dialect.test.ts new file mode 100644 index 0000000000000..24d77afc6e4a6 --- /dev/null +++ b/packages/cubejs-jdbc-driver/test/unit/escape-dialect.test.ts @@ -0,0 +1,46 @@ +import { SupportedDrivers } from '../../src/supported-drivers'; + +// Keep the JVM out of the unit test: escaping rules are pure logic. +jest.mock('@cubejs-backend/jdbc/lib/drivermanager', () => ({ + getConnection: () => { /* stub */ }, +}), { virtual: true }); +jest.mock('@cubejs-backend/jdbc/lib/connection', () => class Connection { + public getMetaData() { /* stub */ } +}, { virtual: true }); +jest.mock('@cubejs-backend/jdbc/lib/databasemetadata', () => class DatabaseMetaData { + public getSchemas() { /* stub */ } + + public getTables() { /* stub */ } +}, { virtual: true }); +jest.mock('@cubejs-backend/jdbc/lib/jinst', () => ({ isJvmCreated: () => true }), { virtual: true }); +jest.mock('@cubejs-backend/node-java-maven', () => () => { /* stub */ }, { virtual: true }); + +// eslint-disable-next-line import/first +import { JDBCDriver } from '../../src/JDBCDriver'; + +// The constructor requires a JVM-backed pool, while the escaping rules only +// depend on the configured db type. +const driverFor = (dbType: string): any => { + const driver = Object.create(JDBCDriver.prototype); + driver.config = { dbType }; + return driver; +}; + +describe('JDBC escape dialect', () => { + it('declares a dialect for every supported engine', () => { + for (const [name, options] of Object.entries(SupportedDrivers)) { + expect([name, options.escapeDialect]).toEqual([name, expect.stringMatching(/^(ansi|mysql|spark)$/)]); + } + }); + + it('escapes params with the dialect of the configured engine', () => { + expect(driverFor('mysql').prepareQueryWithParams('SELECT ?', ['a\\b'])).toEqual('SELECT \'a\\\\b\''); + expect(driverFor('athena').prepareQueryWithParams('SELECT ?', ['a\\b'])).toEqual('SELECT \'a\\b\''); + expect(driverFor('sparksql').prepareQueryWithParams('SELECT ?', ['a\\b'])).toEqual('SELECT \'a\\\\b\''); + }); + + it('throws for an unknown engine instead of guessing the dialect', () => { + expect(() => driverFor('kekdb').prepareQueryWithParams('SELECT ?', ['a\'b'])) + .toThrow(/Unable to detect SQL escaping rules/); + }); +}); diff --git a/packages/cubejs-ksql-driver/CHANGELOG.md b/packages/cubejs-ksql-driver/CHANGELOG.md index 0eb53e414da81..637bc9d9a6690 100644 --- a/packages/cubejs-ksql-driver/CHANGELOG.md +++ b/packages/cubejs-ksql-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.12](https://github.com/cube-js/cube/compare/v1.7.11...v1.7.12) (2026-07-27) + +### Bug Fixes + +- **pinot/dremio/ksql/databriks/hive/jdbc-driver:** Сorrect SQL parameter escaping ([#11374](https://github.com/cube-js/cube/issues/11374)) ([a743790](https://github.com/cube-js/cube/commit/a7437904411cbf268a30bc985c6d5b3b8bbe0e2c)) + ## [1.7.11](https://github.com/cube-js/cube/compare/v1.7.8...v1.7.11) (2026-07-26) ### Features diff --git a/packages/cubejs-ksql-driver/package.json b/packages/cubejs-ksql-driver/package.json index 392e7c9d04c0e..42c6f5cc4acf5 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.11", + "version": "1.7.12", "repository": { "type": "git", "url": "https://github.com/cube-js/cube.git", @@ -21,17 +21,17 @@ "build": "rm -rf dist && npm run tsc", "tsc": "tsc", "watch": "tsc -w", + "unit": "jest --verbose dist/test/unit", "lint": "eslint src/* --ext .ts", "lint:fix": "eslint --fix src/* --ext .ts" }, "dependencies": { - "@cubejs-backend/base-driver": "1.7.11", - "@cubejs-backend/schema-compiler": "1.7.11", - "@cubejs-backend/shared": "1.7.11", + "@cubejs-backend/base-driver": "1.7.12", + "@cubejs-backend/schema-compiler": "1.7.12", + "@cubejs-backend/shared": "1.7.12", "async-mutex": "0.3.2", "axios": "^1.8.3", - "kafkajs": "^2.2.3", - "sqlstring": "^2.3.1" + "kafkajs": "^2.2.3" }, "license": "Apache-2.0", "publishConfig": { @@ -41,7 +41,7 @@ "extends": "../cubejs-linter" }, "devDependencies": { - "@cubejs-backend/linter": "1.7.11", + "@cubejs-backend/linter": "1.7.12", "typescript": "~5.2.2" } } diff --git a/packages/cubejs-ksql-driver/src/KsqlDriver.ts b/packages/cubejs-ksql-driver/src/KsqlDriver.ts index f4feab1a8a63c..bd8d15e080018 100644 --- a/packages/cubejs-ksql-driver/src/KsqlDriver.ts +++ b/packages/cubejs-ksql-driver/src/KsqlDriver.ts @@ -7,13 +7,13 @@ import { getEnv, assertDataSource, + formatAnsi, } from '@cubejs-backend/shared'; import { BaseDriver, DriverCapabilities, DriverInterface, TableColumn, } from '@cubejs-backend/base-driver'; import { Kafka } from 'kafkajs'; -import sqlstring, { format as formatSql } from 'sqlstring'; import axios, { AxiosResponse } from 'axios'; import { Mutex } from 'async-mutex'; import { KsqlQuery } from './KsqlQuery'; @@ -70,13 +70,7 @@ type KsqlQueryOptions = { selectStatement?: string, }; -/** - * KSQL driver class. - */ export class KsqlDriver extends BaseDriver implements DriverInterface { - /** - * Returns default concurrency value. - */ public static getDefaultConcurrency(): number { return 1; } @@ -87,9 +81,6 @@ export class KsqlDriver extends BaseDriver implements DriverInterface { private readonly kafkaClient?: Kafka; - /** - * Class constructor. - */ public constructor( config: Partial & { /** @@ -175,12 +166,17 @@ export class KsqlDriver extends BaseDriver implements DriverInterface { } } + protected prepareQueryWithParams(query: string, values?: unknown[]): string { + return formatAnsi(query, values || []); + } + public async query(query: string, values?: unknown[], options: KsqlQueryOptions = {}): Promise { if (query.toLowerCase().startsWith('select')) { throw new Error('Select queries for ksql allowed only from Cube Store. In order to query ksql create pre-aggregation first.'); } + const { data } = await this.apiQuery('/ksql', { - ksql: `${formatSql(query, values)};`, + ksql: `${this.prepareQueryWithParams(query, values)};`, ...(options.streamOffset ? { streamsProperties: { 'ksql.streams.auto.offset.reset': options.streamOffset @@ -199,8 +195,7 @@ export class KsqlDriver extends BaseDriver implements DriverInterface { } } - // eslint-disable-next-line @typescript-eslint/no-unused-vars - public async createSchemaIfNotExists(schemaName: string): Promise { + public async createSchemaIfNotExists(_schemaName: string): Promise { // do nothing as there are no schemas in ksql } @@ -293,7 +288,7 @@ export class KsqlDriver extends BaseDriver implements DriverInterface { throw new Error('Unable to detect a source table for ksql download query. In order to query ksql use "SELECT * FROM "'); } - const selectStatement = sqlstring.format(query, params); + const selectStatement = this.prepareQueryWithParams(query, params); const { streamOffset, outputColumnTypes } = options || {}; return this.getStreamingTableData(table, { selectStatement, streamOffset, outputColumnTypes }); } diff --git a/packages/cubejs-ksql-driver/test/unit/params-escaping.test.ts b/packages/cubejs-ksql-driver/test/unit/params-escaping.test.ts new file mode 100644 index 0000000000000..e6491659b0a33 --- /dev/null +++ b/packages/cubejs-ksql-driver/test/unit/params-escaping.test.ts @@ -0,0 +1,88 @@ +/* eslint-disable quotes */ +import { KsqlDriver } from '../../src/KsqlDriver'; + +class TestKsqlDriver extends KsqlDriver { + public override prepareQueryWithParams(query: string, values?: unknown[]): string { + return super.prepareQueryWithParams(query, values); + } +} + +// ksqlDB's grammar descends from Presto's: a quote inside a string literal is +// escaped by doubling it and a backslash is plain data. +describe('KsqlDriver SQL parameter escaping', () => { + let driver: TestKsqlDriver; + + beforeAll(() => { + driver = new TestKsqlDriver({ url: 'http://localhost:8088' }); + }); + + it('doubles quotes so a value cannot break out of the literal', () => { + const sql = driver.prepareQueryWithParams( + 'CREATE TABLE t AS SELECT * FROM s WHERE status = ?', + [`a' OR 1=1 --`], + ); + + expect(sql).toBe( + `CREATE TABLE t AS SELECT * FROM s WHERE status = 'a'' OR 1=1 --'` + ); + }); + + it('keeps the literal closed for a value ending in a backslash', () => { + const sql = driver.prepareQueryWithParams( + 'CREATE TABLE t AS SELECT * FROM s WHERE name = ? AND status = ?', + ['payload\\', 'new'], + ); + + expect(sql).toBe( + `CREATE TABLE t AS SELECT * FROM s WHERE name = 'payload\\' AND status = 'new'` + ); + }); + + it('keeps the literal closed for a backslash-then-quote payload', () => { + const sql = driver.prepareQueryWithParams( + 'CREATE TABLE t AS SELECT * FROM s WHERE name = ?', + [`foo\\' OR 1=1 --`], + ); + + expect(sql).toBe( + `CREATE TABLE t AS SELECT * FROM s WHERE name = 'foo\\'' OR 1=1 --'` + ); + }); + + it('does not double literal backslashes', () => { + const sql = driver.prepareQueryWithParams( + 'CREATE TABLE t AS SELECT * FROM s WHERE path = ?', + ['folder\\\\name'], + ); + + expect(sql).toBe( + `CREATE TABLE t AS SELECT * FROM s WHERE path = 'folder\\\\name'` + ); + }); + + it('escapes every element of an array parameter', () => { + const sql = driver.prepareQueryWithParams( + 'CREATE TABLE t AS SELECT * FROM s WHERE status IN (?)', + [[`it's`, 'b']], + ); + + expect(sql).toBe( + `CREATE TABLE t AS SELECT * FROM s WHERE status IN ('it''s', 'b')` + ); + }); + + it('substitutes multiple placeholders in order', () => { + const sql = driver.prepareQueryWithParams( + 'CREATE TABLE t AS SELECT * FROM s WHERE status = ? AND amount > ?', + ['new', 100], + ); + + expect(sql).toBe( + `CREATE TABLE t AS SELECT * FROM s WHERE status = 'new' AND amount > 100` + ); + }); + + it('leaves a query without parameters untouched', () => { + expect(driver.prepareQueryWithParams('SHOW VARIABLES', [])).toBe('SHOW VARIABLES'); + }); +}); diff --git a/packages/cubejs-linter/CHANGELOG.md b/packages/cubejs-linter/CHANGELOG.md index d5f9e6f808837..312f0f000f8b7 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.12](https://github.com/cube-js/cube/compare/v1.7.11...v1.7.12) (2026-07-27) + +**Note:** Version bump only for package @cubejs-backend/linter + ## [1.7.11](https://github.com/cube-js/cube/compare/v1.7.8...v1.7.11) (2026-07-26) **Note:** Version bump only for package @cubejs-backend/linter diff --git a/packages/cubejs-linter/package.json b/packages/cubejs-linter/package.json index 16dd18ca2a97b..2d2ef42d0639a 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.11", + "version": "1.7.12", "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 c2b47f5ba3aa6..7d23909dd5e16 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.12](https://github.com/cube-js/cube/compare/v1.7.11...v1.7.12) (2026-07-27) + +**Note:** Version bump only for package @cubejs-backend/materialize-driver + ## [1.7.11](https://github.com/cube-js/cube/compare/v1.7.8...v1.7.11) (2026-07-26) **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 19ad7c5653acb..1e1baa11012f6 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.11", + "version": "1.7.12", "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.11", - "@cubejs-backend/postgres-driver": "1.7.11", - "@cubejs-backend/shared": "1.7.11", + "@cubejs-backend/base-driver": "1.7.12", + "@cubejs-backend/postgres-driver": "1.7.12", + "@cubejs-backend/shared": "1.7.12", "semver": "^7.6.3" }, "license": "Apache-2.0", "devDependencies": { - "@cubejs-backend/linter": "1.7.11", - "@cubejs-backend/testing": "1.7.11", + "@cubejs-backend/linter": "1.7.12", + "@cubejs-backend/testing": "1.7.12", "typescript": "~5.2.2" }, "publishConfig": { diff --git a/packages/cubejs-mongobi-driver/CHANGELOG.md b/packages/cubejs-mongobi-driver/CHANGELOG.md index d5d8a2afc69f9..aa32c6786beec 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.12](https://github.com/cube-js/cube/compare/v1.7.11...v1.7.12) (2026-07-27) + +**Note:** Version bump only for package @cubejs-backend/mongobi-driver + ## [1.7.11](https://github.com/cube-js/cube/compare/v1.7.8...v1.7.11) (2026-07-26) **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 4e9fe98563e3f..3b29d500e0b98 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.11", + "version": "1.7.12", "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.11", - "@cubejs-backend/shared": "1.7.11", + "@cubejs-backend/base-driver": "1.7.12", + "@cubejs-backend/shared": "1.7.12", "@types/node": "^22", "moment": "^2.29.1", "mysql2": "^3.11.5" @@ -38,7 +38,7 @@ "access": "public" }, "devDependencies": { - "@cubejs-backend/linter": "1.7.11", + "@cubejs-backend/linter": "1.7.12", "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 16d00a8e55f10..c470260648aae 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.12](https://github.com/cube-js/cube/compare/v1.7.11...v1.7.12) (2026-07-27) + +**Note:** Version bump only for package @cubejs-backend/mssql-driver + ## [1.7.11](https://github.com/cube-js/cube/compare/v1.7.8...v1.7.11) (2026-07-26) **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 726cd75493a93..e8a2ce2b8aa5e 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.11", + "version": "1.7.12", "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.11", - "@cubejs-backend/shared": "1.7.11", + "@cubejs-backend/base-driver": "1.7.12", + "@cubejs-backend/shared": "1.7.12", "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 6b6ce44114859..6e71e8bc258f2 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.12](https://github.com/cube-js/cube/compare/v1.7.11...v1.7.12) (2026-07-27) + +**Note:** Version bump only for package @cubejs-backend/mysql-aurora-serverless-driver + ## [1.7.11](https://github.com/cube-js/cube/compare/v1.7.8...v1.7.11) (2026-07-26) **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 73a3582fb2b20..9285ce4f3e954 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.11", + "version": "1.7.12", "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.11", - "@cubejs-backend/shared": "1.7.11", + "@cubejs-backend/base-driver": "1.7.12", + "@cubejs-backend/shared": "1.7.12", "@types/mysql": "^2.15.15", "aws-sdk": "^2.787.0", "data-api-client": "^1.1.0" }, "devDependencies": { - "@cubejs-backend/linter": "1.7.11", + "@cubejs-backend/linter": "1.7.12", "@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 bd187f8b85959..650a7bcda531a 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.12](https://github.com/cube-js/cube/compare/v1.7.11...v1.7.12) (2026-07-27) + +**Note:** Version bump only for package @cubejs-backend/mysql-driver + ## [1.7.11](https://github.com/cube-js/cube/compare/v1.7.8...v1.7.11) (2026-07-26) **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 3c2810f9ccd55..3d9c58e296c18 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.11", + "version": "1.7.12", "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.11", - "@cubejs-backend/shared": "1.7.11", + "@cubejs-backend/base-driver": "1.7.12", + "@cubejs-backend/shared": "1.7.12", "mysql2": "^3.16.1" }, "devDependencies": { - "@cubejs-backend/linter": "1.7.11", - "@cubejs-backend/testing-shared": "1.7.11", + "@cubejs-backend/linter": "1.7.12", + "@cubejs-backend/testing-shared": "1.7.12", "@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 969d1b402923a..fc4b2e5496184 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.12](https://github.com/cube-js/cube/compare/v1.7.11...v1.7.12) (2026-07-27) + +**Note:** Version bump only for package @cubejs-backend/oracle-driver + ## [1.7.11](https://github.com/cube-js/cube/compare/v1.7.8...v1.7.11) (2026-07-26) **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 82d4af080ce87..5a8108af9d659 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.11", + "version": "1.7.12", "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.11", - "@cubejs-backend/shared": "1.7.11", + "@cubejs-backend/base-driver": "1.7.12", + "@cubejs-backend/shared": "1.7.12", "ramda": "^0.27.0" }, "devDependencies": { diff --git a/packages/cubejs-pinot-driver/CHANGELOG.md b/packages/cubejs-pinot-driver/CHANGELOG.md index 67eb655ed6188..a106da841bd12 100644 --- a/packages/cubejs-pinot-driver/CHANGELOG.md +++ b/packages/cubejs-pinot-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.12](https://github.com/cube-js/cube/compare/v1.7.11...v1.7.12) (2026-07-27) + +### Bug Fixes + +- **pinot/dremio/ksql/databriks/hive/jdbc-driver:** Сorrect SQL parameter escaping ([#11374](https://github.com/cube-js/cube/issues/11374)) ([a743790](https://github.com/cube-js/cube/commit/a7437904411cbf268a30bc985c6d5b3b8bbe0e2c)) + ## [1.7.11](https://github.com/cube-js/cube/compare/v1.7.8...v1.7.11) (2026-07-26) ### Bug Fixes diff --git a/packages/cubejs-pinot-driver/package.json b/packages/cubejs-pinot-driver/package.json index 17ea66ac14fc2..7836ea21ca949 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.11", + "version": "1.7.12", "repository": { "type": "git", "url": "https://github.com/cube-js/cube.git", @@ -21,25 +21,25 @@ "build": "rm -rf dist && npm run tsc", "tsc": "tsc", "watch": "tsc -w", + "unit": "jest --verbose dist/test/unit", "integration": "npm run integration:pinot", "integration:pinot": "jest --verbose dist/test", "lint": "eslint src/* --ext .ts", "lint:fix": "eslint --fix src/* --ext .ts" }, "dependencies": { - "@cubejs-backend/base-driver": "1.7.11", - "@cubejs-backend/schema-compiler": "1.7.11", - "@cubejs-backend/shared": "1.7.11", + "@cubejs-backend/base-driver": "1.7.12", + "@cubejs-backend/schema-compiler": "1.7.12", + "@cubejs-backend/shared": "1.7.12", "node-fetch": "^2.6.1", - "ramda": "^0.27.2", - "sqlstring": "^2.3.3" + "ramda": "^0.27.2" }, "license": "Apache-2.0", "publishConfig": { "access": "public" }, "devDependencies": { - "@cubejs-backend/linter": "1.7.11", + "@cubejs-backend/linter": "1.7.12", "@types/jest": "^29", "jest": "^29", "should": "^13.2.3", diff --git a/packages/cubejs-pinot-driver/src/PinotDriver.ts b/packages/cubejs-pinot-driver/src/PinotDriver.ts index 432cba778d7ca..38bdd5fb39038 100644 --- a/packages/cubejs-pinot-driver/src/PinotDriver.ts +++ b/packages/cubejs-pinot-driver/src/PinotDriver.ts @@ -8,6 +8,7 @@ import { import { getEnv, assertDataSource, + formatAnsi, Required, } from '@cubejs-backend/shared'; @@ -16,7 +17,6 @@ import type { ConnectionOptions as TLSConnectionOptions } from 'tls'; import { map, zipObj } from 'ramda'; -import SqlString from 'sqlstring'; import fetch, { Headers, Request, Response } from 'node-fetch'; import { PinotQuery } from './PinotQuery'; @@ -133,9 +133,7 @@ export class PinotDriver extends BaseDriver implements DriverInterface { } public testConnection() { - const query = SqlString.format('select 1'); - - return (> this.queryPromised(query)) + return (> this.queryPromised('select 1')) .then(response => { if (response.length === 0) { throw new Error('Unable to connect to your Pinot instance'); @@ -147,10 +145,8 @@ export class PinotDriver extends BaseDriver implements DriverInterface { return > this.queryPromised(this.prepareQueryWithParams(query, values)); } - public prepareQueryWithParams(query: string, values: unknown[]) { - return SqlString.format(query, (values || []).map(value => (typeof value === 'string' ? { - toSqlString: () => SqlString.escape(value).replace(/\\\\([_%])/g, '\\$1'), - } : value))); + protected prepareQueryWithParams(query: string, values: unknown[]) { + return formatAnsi(query, values || []); } public authorizationHeaders(): AuthorizationHeaders | {} { diff --git a/packages/cubejs-pinot-driver/test/unit/params-escaping.test.ts b/packages/cubejs-pinot-driver/test/unit/params-escaping.test.ts new file mode 100644 index 0000000000000..ae60914a31051 --- /dev/null +++ b/packages/cubejs-pinot-driver/test/unit/params-escaping.test.ts @@ -0,0 +1,105 @@ +/* eslint-disable quotes */ +import { PinotDriver } from '../../src/PinotDriver'; + +class TestPinotDriver extends PinotDriver { + public override prepareQueryWithParams(query: string, values: unknown[]) { + return super.prepareQueryWithParams(query, values); + } +} + +// Apache Pinot parses SQL with Calcite: a quote inside a string literal is +// escaped by doubling it and a backslash is plain data. +describe('PinotDriver SQL parameter escaping', () => { + let driver: TestPinotDriver; + + beforeAll(() => { + driver = new TestPinotDriver({ + host: 'localhost', + port: '8099', + dataSource: 'default', + }); + }); + + it('preserves LIKE escape sequences emitted by the schema compiler', () => { + const sql = driver.prepareQueryWithParams( + `SELECT * FROM orders WHERE LOWER(name) LIKE CONCAT('%', LOWER(?), '%') ESCAPE '\\'`, + ['new\\_order\\%'], + ); + + expect(sql).toBe( + `SELECT * FROM orders WHERE LOWER(name) LIKE CONCAT('%', LOWER('new\\_order\\%'), '%') ESCAPE '\\'` + ); + }); + + it('does not double literal backslashes in LIKE parameters', () => { + const sql = driver.prepareQueryWithParams( + `SELECT * FROM orders WHERE LOWER(name) LIKE CONCAT('%', LOWER(?), '%') ESCAPE '\\'`, + ['folder\\\\name'], + ); + + expect(sql).toBe( + `SELECT * FROM orders WHERE LOWER(name) LIKE CONCAT('%', LOWER('folder\\\\name'), '%') ESCAPE '\\'` + ); + }); + + it('doubles quotes so a value cannot break out of the literal', () => { + const sql = driver.prepareQueryWithParams( + 'SELECT * FROM orders WHERE name = ?', + [`o'reilly'); DROP TABLE orders; --`], + ); + + expect(sql).toBe( + `SELECT * FROM orders WHERE name = 'o''reilly''); DROP TABLE orders; --'` + ); + }); + + it('keeps the literal closed for a quote payload', () => { + // sqlstring rendered this as 'a\'' — Calcite reads the backslash as data, + // so the doubled quote became an escaped quote and the literal ran on, + // swallowing the rest of the statement. + const sql = driver.prepareQueryWithParams( + 'SELECT * FROM orders WHERE name = ? AND status = ?', + [`a'`, 'new'], + ); + + expect(sql).toBe(`SELECT * FROM orders WHERE name = 'a''' AND status = 'new'`); + }); + + it('keeps the literal closed for a value ending in a backslash', () => { + const sql = driver.prepareQueryWithParams( + 'SELECT * FROM orders WHERE name = ? AND status = ?', + ['payload\\', 'new'], + ); + + expect(sql).toBe(`SELECT * FROM orders WHERE name = 'payload\\' AND status = 'new'`); + }); + + it('keeps a literal percent sign in an equality parameter verbatim', () => { + const sql = driver.prepareQueryWithParams( + 'SELECT * FROM orders WHERE discount_label = ?', + ['100% cotton'], + ); + + expect(sql).toBe(`SELECT * FROM orders WHERE discount_label = '100% cotton'`); + }); + + it('escapes every element of an array parameter', () => { + const sql = driver.prepareQueryWithParams( + 'SELECT * FROM orders WHERE status IN (?)', + [[`it's`, 'b']], + ); + + expect(sql).toBe(`SELECT * FROM orders WHERE status IN ('it''s', 'b')`); + }); + + it('substitutes multiple placeholders in order', () => { + const sql = driver.prepareQueryWithParams( + `SELECT * FROM orders WHERE LOWER(name) LIKE CONCAT('%', LOWER(?), '%') ESCAPE '\\' AND status = ? AND amount > ?`, + ['pending\\_review', 'new', 100], + ); + + expect(sql).toBe( + `SELECT * FROM orders WHERE LOWER(name) LIKE CONCAT('%', LOWER('pending\\_review'), '%') ESCAPE '\\' AND status = 'new' AND amount > 100` + ); + }); +}); diff --git a/packages/cubejs-playground/CHANGELOG.md b/packages/cubejs-playground/CHANGELOG.md index a0382a22034dc..d2077f08ee8d9 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.12](https://github.com/cube-js/cube/compare/v1.7.11...v1.7.12) (2026-07-27) + +**Note:** Version bump only for package @cubejs-client/playground + ## [1.7.11](https://github.com/cube-js/cube/compare/v1.7.8...v1.7.11) (2026-07-26) **Note:** Version bump only for package @cubejs-client/playground diff --git a/packages/cubejs-playground/package.json b/packages/cubejs-playground/package.json index 2dd598406c3cb..213258f5c41c2 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.11", + "version": "1.7.12", "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.11", - "@cubejs-client/react": "1.7.11", + "@cubejs-client/core": "1.7.12", + "@cubejs-client/react": "1.7.12", "@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 5cd120fff1ce2..d368183fd083e 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.12](https://github.com/cube-js/cube/compare/v1.7.11...v1.7.12) (2026-07-27) + +**Note:** Version bump only for package @cubejs-backend/postgres-driver + ## [1.7.11](https://github.com/cube-js/cube/compare/v1.7.8...v1.7.11) (2026-07-26) **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 173731069e370..34ac56d84879f 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.11", + "version": "1.7.12", "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.11", - "@cubejs-backend/shared": "1.7.11", + "@cubejs-backend/base-driver": "1.7.12", + "@cubejs-backend/shared": "1.7.12", "@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.11", - "@cubejs-backend/testing-shared": "1.7.11", + "@cubejs-backend/linter": "1.7.12", + "@cubejs-backend/testing-shared": "1.7.12", "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 6cd10fcb65fc8..0bc8f34ac7ec9 100644 --- a/packages/cubejs-prestodb-driver/CHANGELOG.md +++ b/packages/cubejs-prestodb-driver/CHANGELOG.md @@ -3,6 +3,13 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [1.7.12](https://github.com/cube-js/cube/compare/v1.7.11...v1.7.12) (2026-07-27) + +### Bug Fixes + +- **pinot/dremio/ksql/databriks/hive/jdbc-driver:** Сorrect SQL parameter escaping ([#11374](https://github.com/cube-js/cube/issues/11374)) ([a743790](https://github.com/cube-js/cube/commit/a7437904411cbf268a30bc985c6d5b3b8bbe0e2c)) +- **trino/prestodb-driver:** Сorrect SQL parameter escaping ([#11345](https://github.com/cube-js/cube/issues/11345)) ([463e602](https://github.com/cube-js/cube/commit/463e60284a5a4073eb7b7d2f11c4b315deaa2d94)) + ## [1.7.11](https://github.com/cube-js/cube/compare/v1.7.8...v1.7.11) (2026-07-26) **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 c3c08214300a3..ce3b86fa77e71 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.11", + "version": "1.7.12", "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.11", - "@cubejs-backend/shared": "1.7.11", + "@cubejs-backend/base-driver": "1.7.12", + "@cubejs-backend/shared": "1.7.12", "presto-client": "1.2.0", "ramda": "^0.27.0" }, @@ -38,7 +38,7 @@ "access": "public" }, "devDependencies": { - "@cubejs-backend/linter": "1.7.11", + "@cubejs-backend/linter": "1.7.12", "@types/jest": "^29", "jest": "^29", "should": "^13.2.3", diff --git a/packages/cubejs-prestodb-driver/src/PrestoDriver.ts b/packages/cubejs-prestodb-driver/src/PrestoDriver.ts index 7eea140606536..3fb05c790d479 100644 --- a/packages/cubejs-prestodb-driver/src/PrestoDriver.ts +++ b/packages/cubejs-prestodb-driver/src/PrestoDriver.ts @@ -215,7 +215,7 @@ export class PrestoDriver extends BaseDriver implements DriverInterface { return > this.queryPromised(this.prepareQueryWithParams(query, values), false); } - public prepareQueryWithParams(query: string, values: unknown[]) { + protected prepareQueryWithParams(query: string, values: unknown[]) { return formatAnsi(query, values || []); } diff --git a/packages/cubejs-prestodb-driver/test/unit/params-escaping.test.ts b/packages/cubejs-prestodb-driver/test/unit/params-escaping.test.ts index ff7578f8701e3..198aeab5a0343 100644 --- a/packages/cubejs-prestodb-driver/test/unit/params-escaping.test.ts +++ b/packages/cubejs-prestodb-driver/test/unit/params-escaping.test.ts @@ -1,11 +1,17 @@ /* eslint-disable quotes */ import { PrestoDriver } from '../../src/PrestoDriver'; +class TestPrestoDriver extends PrestoDriver { + public override prepareQueryWithParams(query: string, values: unknown[]) { + return super.prepareQueryWithParams(query, values); + } +} + describe('PrestoDriver SQL parameter escaping', () => { - let driver: PrestoDriver; + let driver: TestPrestoDriver; beforeAll(() => { - driver = new PrestoDriver({ + driver = new TestPrestoDriver({ host: 'localhost', port: '8080', catalog: 'test', diff --git a/packages/cubejs-query-orchestrator/CHANGELOG.md b/packages/cubejs-query-orchestrator/CHANGELOG.md index 7d52b36bc1727..88aadaf09ae2d 100644 --- a/packages/cubejs-query-orchestrator/CHANGELOG.md +++ b/packages/cubejs-query-orchestrator/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.12](https://github.com/cube-js/cube/compare/v1.7.11...v1.7.12) (2026-07-27) + +**Note:** Version bump only for package @cubejs-backend/query-orchestrator + ## [1.7.11](https://github.com/cube-js/cube/compare/v1.7.8...v1.7.11) (2026-07-26) **Note:** Version bump only for package @cubejs-backend/query-orchestrator diff --git a/packages/cubejs-query-orchestrator/package.json b/packages/cubejs-query-orchestrator/package.json index 81183b9b9cec1..80b4f2ba999b8 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.11", + "version": "1.7.12", "repository": { "type": "git", "url": "https://github.com/cube-js/cube.git", @@ -29,15 +29,15 @@ "dist/src/*" ], "dependencies": { - "@cubejs-backend/base-driver": "1.7.11", - "@cubejs-backend/cubestore-driver": "1.7.11", - "@cubejs-backend/shared": "1.7.11", + "@cubejs-backend/base-driver": "1.7.12", + "@cubejs-backend/cubestore-driver": "1.7.12", + "@cubejs-backend/shared": "1.7.12", "csv-write-stream": "^2.0.0", "lru-cache": "^11.1.0", "ramda": "^0.27.2" }, "devDependencies": { - "@cubejs-backend/linter": "1.7.11", + "@cubejs-backend/linter": "1.7.12", "@types/jest": "^29", "@types/node": "^22", "@types/ramda": "^0.27.32", diff --git a/packages/cubejs-questdb-driver/CHANGELOG.md b/packages/cubejs-questdb-driver/CHANGELOG.md index fdea7643a0fcb..2c6493d10b6ba 100644 --- a/packages/cubejs-questdb-driver/CHANGELOG.md +++ b/packages/cubejs-questdb-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.12](https://github.com/cube-js/cube/compare/v1.7.11...v1.7.12) (2026-07-27) + +### Bug Fixes + +- **pinot/dremio/ksql/databriks/hive/jdbc-driver:** Сorrect SQL parameter escaping ([#11374](https://github.com/cube-js/cube/issues/11374)) ([a743790](https://github.com/cube-js/cube/commit/a7437904411cbf268a30bc985c6d5b3b8bbe0e2c)) + ## [1.7.11](https://github.com/cube-js/cube/compare/v1.7.8...v1.7.11) (2026-07-26) **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 a9e6170193051..35786b3038d61 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.11", + "version": "1.7.12", "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.11", - "@cubejs-backend/schema-compiler": "1.7.11", - "@cubejs-backend/shared": "1.7.11", + "@cubejs-backend/base-driver": "1.7.12", + "@cubejs-backend/schema-compiler": "1.7.12", + "@cubejs-backend/shared": "1.7.12", "@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.11", - "@cubejs-backend/testing-shared": "1.7.11", + "@cubejs-backend/linter": "1.7.12", + "@cubejs-backend/testing-shared": "1.7.12", "testcontainers": "^10.28.0", "typescript": "~5.2.2" }, diff --git a/packages/cubejs-questdb-driver/src/QuestDriver.ts b/packages/cubejs-questdb-driver/src/QuestDriver.ts index 3117b2fbf256c..d0f43f04e72af 100644 --- a/packages/cubejs-questdb-driver/src/QuestDriver.ts +++ b/packages/cubejs-questdb-driver/src/QuestDriver.ts @@ -7,6 +7,7 @@ import { getEnv, assertDataSource, + escapeStringLiteral, } from '@cubejs-backend/shared'; import { types, Pool, PoolConfig, FieldDef } from 'pg'; // eslint-disable-next-line import/no-extraneous-dependencies @@ -217,7 +218,7 @@ export class QuestDriver { - const response: any[] = await this.query(`SHOW COLUMNS FROM '${table}'`, []); + const response: any[] = await this.query(`SHOW COLUMNS FROM ${escapeStringLiteral(table)}`, []); return response.map((row) => ({ name: row.column, type: this.toGenericType(row.type) })); } @@ -237,7 +238,7 @@ export class QuestDriver this.quoteIdentifier(c.name)).join(', ')}) VALUES (${columns.map((c, paramIndex) => this.param(paramIndex)).join(', ')})`, columns.map(c => this.toColumnValue(tableData.rows[i][c.name] as string, c.type)) diff --git a/packages/cubejs-redshift-driver/CHANGELOG.md b/packages/cubejs-redshift-driver/CHANGELOG.md index 1aecfaad10353..45ac6b3521801 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.12](https://github.com/cube-js/cube/compare/v1.7.11...v1.7.12) (2026-07-27) + +**Note:** Version bump only for package @cubejs-backend/redshift-driver + ## [1.7.11](https://github.com/cube-js/cube/compare/v1.7.8...v1.7.11) (2026-07-26) **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 7eba03872532f..756a9e35b249c 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.11", + "version": "1.7.12", "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.11", - "@cubejs-backend/postgres-driver": "1.7.11", - "@cubejs-backend/shared": "1.7.11" + "@cubejs-backend/base-driver": "1.7.12", + "@cubejs-backend/postgres-driver": "1.7.12", + "@cubejs-backend/shared": "1.7.12" }, "license": "Apache-2.0", "devDependencies": { - "@cubejs-backend/linter": "1.7.11", + "@cubejs-backend/linter": "1.7.12", "typescript": "~5.2.2" }, "publishConfig": { diff --git a/packages/cubejs-schema-compiler/CHANGELOG.md b/packages/cubejs-schema-compiler/CHANGELOG.md index 79e2a1026e658..70b5474877b44 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.12](https://github.com/cube-js/cube/compare/v1.7.11...v1.7.12) (2026-07-27) + +### Bug Fixes + +- **trino/prestodb-driver:** Сorrect SQL parameter escaping ([#11345](https://github.com/cube-js/cube/issues/11345)) ([463e602](https://github.com/cube-js/cube/commit/463e60284a5a4073eb7b7d2f11c4b315deaa2d94)) + ## [1.7.11](https://github.com/cube-js/cube/compare/v1.7.8...v1.7.11) (2026-07-26) ### Bug Fixes diff --git a/packages/cubejs-schema-compiler/package.json b/packages/cubejs-schema-compiler/package.json index 79e5fc119d019..8d2e372af116b 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.11", + "version": "1.7.12", "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.11", - "@cubejs-backend/shared": "1.7.11", + "@cubejs-backend/native": "1.7.12", + "@cubejs-backend/shared": "1.7.12", "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.11", - "@cubejs-backend/mssql-driver": "1.7.11", - "@cubejs-backend/query-orchestrator": "1.7.11", + "@cubejs-backend/linter": "1.7.12", + "@cubejs-backend/mssql-driver": "1.7.12", + "@cubejs-backend/query-orchestrator": "1.7.12", "@types/babel__code-frame": "^7.0.6", "@types/babel__generator": "^7.6.8", "@types/babel__traverse": "^7.20.5", diff --git a/packages/cubejs-server-core/CHANGELOG.md b/packages/cubejs-server-core/CHANGELOG.md index f6572a276eb8c..958d0901a03fe 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.12](https://github.com/cube-js/cube/compare/v1.7.11...v1.7.12) (2026-07-27) + +**Note:** Version bump only for package @cubejs-backend/server-core + ## [1.7.11](https://github.com/cube-js/cube/compare/v1.7.8...v1.7.11) (2026-07-26) ### Bug Fixes diff --git a/packages/cubejs-server-core/package.json b/packages/cubejs-server-core/package.json index 59eb07defabc3..58f5d01d18f82 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.11", + "version": "1.7.12", "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.11", - "@cubejs-backend/base-driver": "1.7.11", - "@cubejs-backend/cloud": "1.7.11", - "@cubejs-backend/cubestore-driver": "1.7.11", + "@cubejs-backend/api-gateway": "1.7.12", + "@cubejs-backend/base-driver": "1.7.12", + "@cubejs-backend/cloud": "1.7.12", + "@cubejs-backend/cubestore-driver": "1.7.12", "@cubejs-backend/dotenv": "^9.0.2", - "@cubejs-backend/native": "1.7.11", - "@cubejs-backend/query-orchestrator": "1.7.11", - "@cubejs-backend/schema-compiler": "1.7.11", - "@cubejs-backend/shared": "1.7.11", - "@cubejs-backend/templates": "1.7.11", + "@cubejs-backend/native": "1.7.12", + "@cubejs-backend/query-orchestrator": "1.7.12", + "@cubejs-backend/schema-compiler": "1.7.12", + "@cubejs-backend/shared": "1.7.12", + "@cubejs-backend/templates": "1.7.12", "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.11", - "@cubejs-client/playground": "1.7.11", + "@cubejs-backend/linter": "1.7.12", + "@cubejs-client/playground": "1.7.12", "@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 a0115a0512a5f..96e618fd7c75f 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.12](https://github.com/cube-js/cube/compare/v1.7.11...v1.7.12) (2026-07-27) + +**Note:** Version bump only for package @cubejs-backend/server + ## [1.7.11](https://github.com/cube-js/cube/compare/v1.7.8...v1.7.11) (2026-07-26) **Note:** Version bump only for package @cubejs-backend/server diff --git a/packages/cubejs-server/package.json b/packages/cubejs-server/package.json index df83f109f8327..a0ff6b19500ad 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.11", + "version": "1.7.12", "types": "index.d.ts", "repository": { "type": "git", @@ -40,11 +40,11 @@ "jest:shapshot": "jest --updateSnapshot test" }, "dependencies": { - "@cubejs-backend/cubestore-driver": "1.7.11", + "@cubejs-backend/cubestore-driver": "1.7.12", "@cubejs-backend/dotenv": "^9.0.2", - "@cubejs-backend/native": "1.7.11", - "@cubejs-backend/server-core": "1.7.11", - "@cubejs-backend/shared": "1.7.11", + "@cubejs-backend/native": "1.7.12", + "@cubejs-backend/server-core": "1.7.12", + "@cubejs-backend/shared": "1.7.12", "@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.11", - "@cubejs-backend/query-orchestrator": "1.7.11", + "@cubejs-backend/linter": "1.7.12", + "@cubejs-backend/query-orchestrator": "1.7.12", "@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 77c5319ce8e00..c8c703889a9f7 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.12](https://github.com/cube-js/cube/compare/v1.7.11...v1.7.12) (2026-07-27) + +**Note:** Version bump only for package @cubejs-backend/snowflake-driver + ## [1.7.11](https://github.com/cube-js/cube/compare/v1.7.8...v1.7.11) (2026-07-26) **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 48e9399229d46..9ea2206e10202 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.11", + "version": "1.7.12", "repository": { "type": "git", "url": "https://github.com/cube-js/cube.git", @@ -28,8 +28,8 @@ }, "dependencies": { "@aws-sdk/client-s3": "^3.726.0", - "@cubejs-backend/base-driver": "1.7.11", - "@cubejs-backend/shared": "1.7.11", + "@cubejs-backend/base-driver": "1.7.12", + "@cubejs-backend/shared": "1.7.12", "snowflake-sdk": "^2.4.0" }, "license": "Apache-2.0", @@ -40,7 +40,7 @@ "extends": "../cubejs-linter" }, "devDependencies": { - "@cubejs-backend/linter": "1.7.11", + "@cubejs-backend/linter": "1.7.12", "typescript": "~5.2.2", "vitest": "^4" } diff --git a/packages/cubejs-sqlite-driver/CHANGELOG.md b/packages/cubejs-sqlite-driver/CHANGELOG.md index 999008bb105c1..bd6fe5baa2c8d 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.12](https://github.com/cube-js/cube/compare/v1.7.11...v1.7.12) (2026-07-27) + +**Note:** Version bump only for package @cubejs-backend/sqlite-driver + ## [1.7.11](https://github.com/cube-js/cube/compare/v1.7.8...v1.7.11) (2026-07-26) **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 f30de7b3214fc..10f241ffb34b9 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.11", + "version": "1.7.12", "repository": { "type": "git", "url": "https://github.com/cube-js/cube.git", @@ -18,13 +18,13 @@ "unit": "jest" }, "dependencies": { - "@cubejs-backend/base-driver": "1.7.11", - "@cubejs-backend/shared": "1.7.11", + "@cubejs-backend/base-driver": "1.7.12", + "@cubejs-backend/shared": "1.7.12", "sqlite3": "^5.1.7" }, "license": "Apache-2.0", "devDependencies": { - "@cubejs-backend/linter": "1.7.11", + "@cubejs-backend/linter": "1.7.12", "jest": "^29" }, "publishConfig": { diff --git a/packages/cubejs-templates/CHANGELOG.md b/packages/cubejs-templates/CHANGELOG.md index 2da03fcea45c9..29727fa77ea90 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.12](https://github.com/cube-js/cube/compare/v1.7.11...v1.7.12) (2026-07-27) + +**Note:** Version bump only for package @cubejs-backend/templates + ## [1.7.11](https://github.com/cube-js/cube/compare/v1.7.8...v1.7.11) (2026-07-26) **Note:** Version bump only for package @cubejs-backend/templates diff --git a/packages/cubejs-templates/package.json b/packages/cubejs-templates/package.json index b9e9575df190d..41f0eb6a4c61e 100644 --- a/packages/cubejs-templates/package.json +++ b/packages/cubejs-templates/package.json @@ -1,6 +1,6 @@ { "name": "@cubejs-backend/templates", - "version": "1.7.11", + "version": "1.7.12", "description": "Cube.js Templates helpers", "author": "Cube Dev, Inc.", "repository": { @@ -31,7 +31,7 @@ "extends": "../cubejs-linter" }, "dependencies": { - "@cubejs-backend/shared": "1.7.11", + "@cubejs-backend/shared": "1.7.12", "cross-spawn": "^7.0.3", "decompress": "^4.2.1", "decompress-targz": "^4.1.1", @@ -41,7 +41,7 @@ "source-map-support": "^0.5.19" }, "devDependencies": { - "@cubejs-backend/linter": "1.7.11", + "@cubejs-backend/linter": "1.7.12", "typescript": "~5.2.2" } } diff --git a/packages/cubejs-testing-drivers/CHANGELOG.md b/packages/cubejs-testing-drivers/CHANGELOG.md index f4bc6007d5a2c..34df77f6478f7 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.12](https://github.com/cube-js/cube/compare/v1.7.11...v1.7.12) (2026-07-27) + +**Note:** Version bump only for package @cubejs-backend/testing-drivers + ## [1.7.11](https://github.com/cube-js/cube/compare/v1.7.8...v1.7.11) (2026-07-26) **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 434d89b49ac2b..7c7e399060d88 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.11", + "version": "1.7.12", "description": "Cube.js drivers test suite", "author": "Cube Dev, Inc.", "repository": { @@ -86,28 +86,28 @@ "dist/src" ], "dependencies": { - "@cubejs-backend/athena-driver": "1.7.11", - "@cubejs-backend/base-driver": "1.7.11", - "@cubejs-backend/bigquery-driver": "1.7.11", - "@cubejs-backend/clickhouse-driver": "1.7.11", - "@cubejs-backend/crate-driver": "1.7.11", - "@cubejs-backend/cubestore-driver": "1.7.11", - "@cubejs-backend/databricks-jdbc-driver": "1.7.11", + "@cubejs-backend/athena-driver": "1.7.12", + "@cubejs-backend/base-driver": "1.7.12", + "@cubejs-backend/bigquery-driver": "1.7.12", + "@cubejs-backend/clickhouse-driver": "1.7.12", + "@cubejs-backend/crate-driver": "1.7.12", + "@cubejs-backend/cubestore-driver": "1.7.12", + "@cubejs-backend/databricks-jdbc-driver": "1.7.12", "@cubejs-backend/dotenv": "^9.0.2", - "@cubejs-backend/linter": "1.7.11", - "@cubejs-backend/mssql-driver": "1.7.11", - "@cubejs-backend/mysql-driver": "1.7.11", - "@cubejs-backend/oracle-driver": "1.7.11", - "@cubejs-backend/pinot-driver": "1.7.11", - "@cubejs-backend/postgres-driver": "1.7.11", - "@cubejs-backend/query-orchestrator": "1.7.11", - "@cubejs-backend/questdb-driver": "1.7.11", - "@cubejs-backend/server-core": "1.7.11", - "@cubejs-backend/shared": "1.7.11", - "@cubejs-backend/snowflake-driver": "1.7.11", - "@cubejs-backend/testing-shared": "1.7.11", - "@cubejs-client/core": "1.7.11", - "@cubejs-client/ws-transport": "1.7.11", + "@cubejs-backend/linter": "1.7.12", + "@cubejs-backend/mssql-driver": "1.7.12", + "@cubejs-backend/mysql-driver": "1.7.12", + "@cubejs-backend/oracle-driver": "1.7.12", + "@cubejs-backend/pinot-driver": "1.7.12", + "@cubejs-backend/postgres-driver": "1.7.12", + "@cubejs-backend/query-orchestrator": "1.7.12", + "@cubejs-backend/questdb-driver": "1.7.12", + "@cubejs-backend/server-core": "1.7.12", + "@cubejs-backend/shared": "1.7.12", + "@cubejs-backend/snowflake-driver": "1.7.12", + "@cubejs-backend/testing-shared": "1.7.12", + "@cubejs-client/core": "1.7.12", + "@cubejs-client/ws-transport": "1.7.12", "@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 c4f000d1d4ce3..4a3c9f443bd82 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.12](https://github.com/cube-js/cube/compare/v1.7.11...v1.7.12) (2026-07-27) + +**Note:** Version bump only for package @cubejs-backend/testing-shared + ## [1.7.11](https://github.com/cube-js/cube/compare/v1.7.8...v1.7.11) (2026-07-26) **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 89a55892f5bdb..77bd8352e76c5 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.11", + "version": "1.7.12", "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.11", - "@cubejs-backend/schema-compiler": "1.7.11", - "@cubejs-backend/shared": "1.7.11", + "@cubejs-backend/query-orchestrator": "1.7.12", + "@cubejs-backend/schema-compiler": "1.7.12", + "@cubejs-backend/shared": "1.7.12", "@testcontainers/kafka": "~10.28.0", "dedent": "^0.7.0", "node-fetch": "^2.6.7", "testcontainers": "^10.28.0" }, "devDependencies": { - "@cubejs-backend/linter": "1.7.11", + "@cubejs-backend/linter": "1.7.12", "@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 b3ec6644fc6c2..91992eb484415 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.12](https://github.com/cube-js/cube/compare/v1.7.11...v1.7.12) (2026-07-27) + +**Note:** Version bump only for package @cubejs-backend/testing + ## [1.7.11](https://github.com/cube-js/cube/compare/v1.7.8...v1.7.11) (2026-07-26) ### Features diff --git a/packages/cubejs-testing/package.json b/packages/cubejs-testing/package.json index 79963135abf4a..f4496b434566d 100644 --- a/packages/cubejs-testing/package.json +++ b/packages/cubejs-testing/package.json @@ -1,6 +1,6 @@ { "name": "@cubejs-backend/testing", - "version": "1.7.11", + "version": "1.7.12", "description": "Cube.js e2e tests", "author": "Cube Dev, Inc.", "repository": { @@ -91,15 +91,15 @@ "birdbox-fixtures" ], "dependencies": { - "@cubejs-backend/cubestore-driver": "1.7.11", + "@cubejs-backend/cubestore-driver": "1.7.12", "@cubejs-backend/dotenv": "^9.0.2", - "@cubejs-backend/ksql-driver": "1.7.11", - "@cubejs-backend/postgres-driver": "1.7.11", - "@cubejs-backend/query-orchestrator": "1.7.11", - "@cubejs-backend/schema-compiler": "1.7.11", - "@cubejs-backend/shared": "1.7.11", - "@cubejs-backend/testing-shared": "1.7.11", - "@cubejs-client/ws-transport": "1.7.11", + "@cubejs-backend/ksql-driver": "1.7.12", + "@cubejs-backend/postgres-driver": "1.7.12", + "@cubejs-backend/query-orchestrator": "1.7.12", + "@cubejs-backend/schema-compiler": "1.7.12", + "@cubejs-backend/shared": "1.7.12", + "@cubejs-backend/testing-shared": "1.7.12", + "@cubejs-client/ws-transport": "1.7.12", "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.11", - "@cubejs-client/core": "1.7.11", + "@cubejs-backend/linter": "1.7.12", + "@cubejs-client/core": "1.7.12", "@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 0b62fcf72ddb5..f74083da36b8e 100644 --- a/packages/cubejs-trino-driver/CHANGELOG.md +++ b/packages/cubejs-trino-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.12](https://github.com/cube-js/cube/compare/v1.7.11...v1.7.12) (2026-07-27) + +### Bug Fixes + +- **pinot/dremio/ksql/databriks/hive/jdbc-driver:** Сorrect SQL parameter escaping ([#11374](https://github.com/cube-js/cube/issues/11374)) ([a743790](https://github.com/cube-js/cube/commit/a7437904411cbf268a30bc985c6d5b3b8bbe0e2c)) + ## [1.7.11](https://github.com/cube-js/cube/compare/v1.7.8...v1.7.11) (2026-07-26) **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 208a05fe3d5fb..7b56e49abb317 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.11", + "version": "1.7.12", "repository": { "type": "git", "url": "https://github.com/cube-js/cube.git", @@ -28,20 +28,19 @@ "lint:fix": "eslint --fix src/* --ext .ts" }, "dependencies": { - "@cubejs-backend/base-driver": "1.7.11", - "@cubejs-backend/prestodb-driver": "1.7.11", - "@cubejs-backend/schema-compiler": "1.7.11", - "@cubejs-backend/shared": "1.7.11", + "@cubejs-backend/base-driver": "1.7.12", + "@cubejs-backend/prestodb-driver": "1.7.12", + "@cubejs-backend/schema-compiler": "1.7.12", + "@cubejs-backend/shared": "1.7.12", "node-fetch": "^2.6.1", - "presto-client": "^1.2.0", - "sqlstring": "^2.3.1" + "presto-client": "^1.2.0" }, "license": "Apache-2.0", "publishConfig": { "access": "public" }, "devDependencies": { - "@cubejs-backend/linter": "1.7.11", + "@cubejs-backend/linter": "1.7.12", "@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 aeb1d8541760e..3163e6585fe45 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.12](https://github.com/cube-js/cube/compare/v1.7.11...v1.7.12) (2026-07-27) + +**Note:** Version bump only for package @cubejs-backend/vertica-driver + ## [1.7.11](https://github.com/cube-js/cube/compare/v1.7.8...v1.7.11) (2026-07-26) **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 d9a3fdd50aae9..590fc1cdb8b68 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.11", + "version": "1.7.12", "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.11", - "@cubejs-backend/query-orchestrator": "1.7.11", - "@cubejs-backend/schema-compiler": "1.7.11", - "@cubejs-backend/shared": "1.7.11", + "@cubejs-backend/base-driver": "1.7.12", + "@cubejs-backend/query-orchestrator": "1.7.12", + "@cubejs-backend/schema-compiler": "1.7.12", + "@cubejs-backend/shared": "1.7.12", "vertica-nodejs": "^1.0.3" }, "license": "Apache-2.0", "devDependencies": { - "@cubejs-backend/linter": "1.7.11", - "@cubejs-backend/testing-shared": "1.7.11", + "@cubejs-backend/linter": "1.7.12", + "@cubejs-backend/testing-shared": "1.7.12", "@types/jest": "^29", "jest": "^29", "testcontainers": "^10.28.0" diff --git a/rust/cubesql/CHANGELOG.md b/rust/cubesql/CHANGELOG.md index 057bde3eee716..53f73ed822619 100644 --- a/rust/cubesql/CHANGELOG.md +++ b/rust/cubesql/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.12](https://github.com/cube-js/cube/compare/v1.7.11...v1.7.12) (2026-07-27) + +**Note:** Version bump only for package @cubejs-backend/cubesql + ## [1.7.11](https://github.com/cube-js/cube/compare/v1.7.8...v1.7.11) (2026-07-26) ### Bug Fixes diff --git a/rust/cubesql/Cargo.lock b/rust/cubesql/Cargo.lock index f703f45b452d7..b2d84e1ef6d7b 100644 --- a/rust/cubesql/Cargo.lock +++ b/rust/cubesql/Cargo.lock @@ -698,7 +698,7 @@ dependencies = [ [[package]] name = "cube-ext" version = "1.0.0" -source = "git+https://github.com/cube-js/arrow-datafusion.git?rev=d203d8771a9673fb676b44dce1f99e91634b4080#d203d8771a9673fb676b44dce1f99e91634b4080" +source = "git+https://github.com/cube-js/arrow-datafusion.git?rev=ee20ad38796f4a9966ff58b9ace425c7488459e9#ee20ad38796f4a9966ff58b9ace425c7488459e9" dependencies = [ "arrow", "chrono", @@ -822,7 +822,7 @@ dependencies = [ [[package]] name = "datafusion" version = "7.0.0" -source = "git+https://github.com/cube-js/arrow-datafusion.git?rev=d203d8771a9673fb676b44dce1f99e91634b4080#d203d8771a9673fb676b44dce1f99e91634b4080" +source = "git+https://github.com/cube-js/arrow-datafusion.git?rev=ee20ad38796f4a9966ff58b9ace425c7488459e9#ee20ad38796f4a9966ff58b9ace425c7488459e9" dependencies = [ "ahash 0.7.8", "arrow", @@ -855,7 +855,7 @@ dependencies = [ [[package]] name = "datafusion-common" version = "7.0.0" -source = "git+https://github.com/cube-js/arrow-datafusion.git?rev=d203d8771a9673fb676b44dce1f99e91634b4080#d203d8771a9673fb676b44dce1f99e91634b4080" +source = "git+https://github.com/cube-js/arrow-datafusion.git?rev=ee20ad38796f4a9966ff58b9ace425c7488459e9#ee20ad38796f4a9966ff58b9ace425c7488459e9" dependencies = [ "arrow", "ordered-float 2.10.0", @@ -866,7 +866,7 @@ dependencies = [ [[package]] name = "datafusion-data-access" version = "1.0.0" -source = "git+https://github.com/cube-js/arrow-datafusion.git?rev=d203d8771a9673fb676b44dce1f99e91634b4080#d203d8771a9673fb676b44dce1f99e91634b4080" +source = "git+https://github.com/cube-js/arrow-datafusion.git?rev=ee20ad38796f4a9966ff58b9ace425c7488459e9#ee20ad38796f4a9966ff58b9ace425c7488459e9" dependencies = [ "async-trait", "chrono", @@ -879,7 +879,7 @@ dependencies = [ [[package]] name = "datafusion-expr" version = "7.0.0" -source = "git+https://github.com/cube-js/arrow-datafusion.git?rev=d203d8771a9673fb676b44dce1f99e91634b4080#d203d8771a9673fb676b44dce1f99e91634b4080" +source = "git+https://github.com/cube-js/arrow-datafusion.git?rev=ee20ad38796f4a9966ff58b9ace425c7488459e9#ee20ad38796f4a9966ff58b9ace425c7488459e9" dependencies = [ "ahash 0.7.8", "arrow", @@ -890,7 +890,7 @@ dependencies = [ [[package]] name = "datafusion-physical-expr" version = "7.0.0" -source = "git+https://github.com/cube-js/arrow-datafusion.git?rev=d203d8771a9673fb676b44dce1f99e91634b4080#d203d8771a9673fb676b44dce1f99e91634b4080" +source = "git+https://github.com/cube-js/arrow-datafusion.git?rev=ee20ad38796f4a9966ff58b9ace425c7488459e9#ee20ad38796f4a9966ff58b9ace425c7488459e9" dependencies = [ "ahash 0.7.8", "arrow", diff --git a/rust/cubesql/cubesql/Cargo.toml b/rust/cubesql/cubesql/Cargo.toml index 6dedf834d8ab5..feb7240a25c6b 100644 --- a/rust/cubesql/cubesql/Cargo.toml +++ b/rust/cubesql/cubesql/Cargo.toml @@ -10,7 +10,7 @@ homepage = "https://cube.dev" [dependencies] arc-swap = "1" -datafusion = { git = 'https://github.com/cube-js/arrow-datafusion.git', rev = "d203d8771a9673fb676b44dce1f99e91634b4080", default-features = false, features = [ +datafusion = { git = 'https://github.com/cube-js/arrow-datafusion.git', rev = "ee20ad38796f4a9966ff58b9ace425c7488459e9", default-features = false, features = [ "regex_expressions", "unicode_expressions", ] } diff --git a/rust/cubesql/cubesql/src/compile/test/test_cube_scan.rs b/rust/cubesql/cubesql/src/compile/test/test_cube_scan.rs index 0b6143ff0cc1a..c8686e4da883f 100644 --- a/rust/cubesql/cubesql/src/compile/test/test_cube_scan.rs +++ b/rust/cubesql/cubesql/src/compile/test/test_cube_scan.rs @@ -1,4 +1,4 @@ -use cubeclient::models::V1LoadRequestQuery; +use cubeclient::models::{V1LoadRequestQuery, V1LoadRequestQueryFilterItem}; use pretty_assertions::assert_eq; use crate::compile::{ @@ -224,3 +224,49 @@ async fn cubescan_limit_offset_limit_offset() { ); } } + +/// GROUP BY () is an empty grouping set, equivalent to aggregation without GROUP BY +#[tokio::test] +async fn cubescan_empty_group_by_tuple() { + init_testing_logger(); + + let query_plan = convert_select_to_query_plan( + // language=PostgreSQL + r#" + SELECT + MEASURE(count), + MEASURE(maxPrice) + FROM + KibanaSampleDataEcommerce + WHERE customer_gender = 'female' + GROUP BY () + LIMIT 100 + "# + .to_string(), + DatabaseProtocol::PostgreSQL, + ) + .await; + + let logical_plan = query_plan.as_logical_plan(); + assert_eq!( + logical_plan.find_cube_scan().request, + V1LoadRequestQuery { + measures: Some(vec![ + "KibanaSampleDataEcommerce.count".to_string(), + "KibanaSampleDataEcommerce.maxPrice".to_string(), + ]), + dimensions: Some(vec![]), + segments: Some(vec![]), + order: Some(vec![]), + limit: Some(100), + filters: Some(vec![V1LoadRequestQueryFilterItem { + member: Some("KibanaSampleDataEcommerce.customer_gender".to_string()), + operator: Some("equals".to_string()), + values: Some(vec!["female".to_string()]), + or: None, + and: None, + }]), + ..Default::default() + } + ); +} diff --git a/rust/cubesql/package.json b/rust/cubesql/package.json index 75a58b08f3215..264b789a86f4b 100644 --- a/rust/cubesql/package.json +++ b/rust/cubesql/package.json @@ -1,6 +1,6 @@ { "name": "@cubejs-backend/cubesql", - "version": "1.7.11", + "version": "1.7.12", "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 6211c581eeb65..d97efb9fc1440 100644 --- a/rust/cubestore/CHANGELOG.md +++ b/rust/cubestore/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.12](https://github.com/cube-js/cube/compare/v1.7.11...v1.7.12) (2026-07-27) + +**Note:** Version bump only for package @cubejs-backend/cubestore + ## [1.7.11](https://github.com/cube-js/cube/compare/v1.7.8...v1.7.11) (2026-07-26) **Note:** Version bump only for package @cubejs-backend/cubestore diff --git a/rust/cubestore/Cargo.lock b/rust/cubestore/Cargo.lock index dbb438ce6a2de..4163a1842ac6c 100644 --- a/rust/cubestore/Cargo.lock +++ b/rust/cubestore/Cargo.lock @@ -1558,7 +1558,7 @@ dependencies = [ [[package]] name = "cubestore" -version = "1.7.11" +version = "1.7.12" dependencies = [ "actix-rt", "anyhow", diff --git a/rust/cubestore/cubestore/Cargo.toml b/rust/cubestore/cubestore/Cargo.toml index 3ec0fd73354e1..cad9367d17506 100644 --- a/rust/cubestore/cubestore/Cargo.toml +++ b/rust/cubestore/cubestore/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cubestore" -version = "1.7.11" +version = "1.7.12" authors = ["Cube Dev, Inc."] edition = "2021" license = "Apache-2.0" diff --git a/rust/cubestore/package.json b/rust/cubestore/package.json index 40fa730f9cd38..4dba3800651d9 100644 --- a/rust/cubestore/package.json +++ b/rust/cubestore/package.json @@ -1,6 +1,6 @@ { "name": "@cubejs-backend/cubestore", - "version": "1.7.11", + "version": "1.7.12", "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.11", + "@cubejs-backend/linter": "1.7.12", "@types/jest": "^29", "@types/node": "^18", "jest": "^29", @@ -43,7 +43,7 @@ "access": "public" }, "dependencies": { - "@cubejs-backend/shared": "1.7.11", + "@cubejs-backend/shared": "1.7.12", "@octokit/core": "^3.2.5", "source-map-support": "^0.5.19" }, diff --git a/yarn.lock b/yarn.lock index 1a31bd19d08bc..b79cf7d85d62c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -22567,7 +22567,7 @@ sqlstring@2.3.1: resolved "https://registry.yarnpkg.com/sqlstring/-/sqlstring-2.3.1.tgz#475393ff9e91479aea62dcaf0ca3d14983a7fb40" integrity sha512-ooAzh/7dxIG5+uDik1z/Rd1vli0+38izZhGzSa34FwR7IbelPWCCKSNIl8jlL/F7ERvy8CB2jNeM1E9i9mXMAQ== -sqlstring@^2.3.0, sqlstring@^2.3.1, sqlstring@^2.3.2, sqlstring@^2.3.3: +sqlstring@^2.3.1, sqlstring@^2.3.2, sqlstring@^2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/sqlstring/-/sqlstring-2.3.3.tgz#2ddc21f03bce2c387ed60680e739922c65751d0c" integrity sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==