From 8239f0a3b156ba168ab97a94ce21cac831c8f1b4 Mon Sep 17 00:00:00 2001 From: Sascha John Hesse Date: Fri, 22 May 2026 09:44:52 +0200 Subject: [PATCH 1/3] feat(cubesql): expose database name from SQL startup message in LoadRequestMeta The PostgreSQL wire protocol startup message includes a `database` parameter, which is already parsed and stored on SessionState. However, it was never included in LoadRequestMeta, making it inaccessible to JS configuration callbacks like extendContext. This is needed for multi-tenant setups where the database name carries the tenant identifier (e.g. a UUID), allowing checkSqlAuth or extendContext to resolve tenant context from the client-supplied dbname. Changes: - Add `database: Option` field to LoadRequestMeta (Rust) - Populate it from SessionState::database() in get_load_request_meta - Add `database?: string` to BaseMeta TypeScript interface Co-Authored-By: Claude Opus 4.6 (1M context) --- packages/cubejs-backend-native/js/index.ts | 2 ++ rust/cubesql/cubesql/src/sql/session.rs | 6 ++++-- rust/cubesql/cubesql/src/transport/service.rs | 7 +++++++ 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/packages/cubejs-backend-native/js/index.ts b/packages/cubejs-backend-native/js/index.ts index b5dbf3cdc4ad2..d6f5a919b0566 100644 --- a/packages/cubejs-backend-native/js/index.ts +++ b/packages/cubejs-backend-native/js/index.ts @@ -15,6 +15,8 @@ export interface BaseMeta { apiType: string, // Application name, for example Metabase appName?: string, + // Database name from the client startup message (e.g. psql dbname parameter) + database?: string, } export interface LoadRequestMeta extends BaseMeta { diff --git a/rust/cubesql/cubesql/src/sql/session.rs b/rust/cubesql/cubesql/src/sql/session.rs index 610d4c77c5f19..eb2c3167bc70d 100644 --- a/rust/cubesql/cubesql/src/sql/session.rs +++ b/rust/cubesql/cubesql/src/sql/session.rs @@ -409,11 +409,13 @@ impl SessionState { None }; - LoadRequestMeta::new( + let mut meta = LoadRequestMeta::new( self.protocol.get_name().to_string(), api_type.to_string(), application_name, - ) + ); + meta.set_database(self.database()); + meta } } diff --git a/rust/cubesql/cubesql/src/transport/service.rs b/rust/cubesql/cubesql/src/transport/service.rs index 364306be5298d..9b613ffdca08f 100644 --- a/rust/cubesql/cubesql/src/transport/service.rs +++ b/rust/cubesql/cubesql/src/transport/service.rs @@ -51,6 +51,8 @@ pub struct LoadRequestMeta { // Optional fields #[serde(rename = "changeUser", skip_serializing_if = "Option::is_none")] change_user: Option, + #[serde(skip_serializing_if = "Option::is_none")] + database: Option, } impl LoadRequestMeta { @@ -61,6 +63,7 @@ impl LoadRequestMeta { api_type, app_name, change_user: None, + database: None, } } @@ -71,6 +74,10 @@ impl LoadRequestMeta { pub fn set_change_user(&mut self, change_user: Option) { self.change_user = change_user; } + + pub fn set_database(&mut self, database: Option) { + self.database = database; + } } #[derive(Debug, Deserialize)] From a90ae3c88abb42b3ca6b30ae66183d7b51a2c9b0 Mon Sep 17 00:00:00 2001 From: Sascha John Hesse Date: Fri, 22 May 2026 10:49:15 +0200 Subject: [PATCH 2/3] feat(load-request-meta): add database name handling and tests for LoadRequestMeta --- rust/cubesql/cubesql/src/compile/test/mod.rs | 2 + .../src/compile/test/test_database_meta.rs | 59 +++++++++++++++++++ rust/cubesql/cubesql/src/transport/service.rs | 4 ++ 3 files changed, 65 insertions(+) create mode 100644 rust/cubesql/cubesql/src/compile/test/test_database_meta.rs diff --git a/rust/cubesql/cubesql/src/compile/test/mod.rs b/rust/cubesql/cubesql/src/compile/test/mod.rs index 75bd04812e53f..a2a4f5bf45918 100644 --- a/rust/cubesql/cubesql/src/compile/test/mod.rs +++ b/rust/cubesql/cubesql/src/compile/test/mod.rs @@ -31,6 +31,8 @@ pub mod test_bi_workarounds; #[cfg(test)] pub mod test_cube_join; #[cfg(test)] +pub mod test_database_meta; +#[cfg(test)] pub mod test_cube_join_grouped; #[cfg(test)] pub mod test_cube_scan; diff --git a/rust/cubesql/cubesql/src/compile/test/test_database_meta.rs b/rust/cubesql/cubesql/src/compile/test/test_database_meta.rs new file mode 100644 index 0000000000000..b22a532ec890a --- /dev/null +++ b/rust/cubesql/cubesql/src/compile/test/test_database_meta.rs @@ -0,0 +1,59 @@ +//! Tests that check database name propagation through LoadRequestMeta + +use pretty_assertions::assert_eq; + +use crate::compile::{ + test::{init_testing_logger, TestContext}, + DatabaseProtocol, Rewriter, +}; +use crate::transport::LoadRequestMeta; + +#[tokio::test] +async fn test_database_propagates_through_load_request_meta() { + if !Rewriter::sql_push_down_enabled() { + return; + } + init_testing_logger(); + + let context = TestContext::new(DatabaseProtocol::PostgreSQL).await; + + context + .execute_query( + // language=PostgreSQL + r#" +SELECT + COALESCE(customer_gender, 'N/A'), + AVG(avgPrice) +FROM + KibanaSampleDataEcommerce +WHERE + LOWER(customer_gender) = 'test' +GROUP BY 1 +; + "# + .to_string(), + ) + .await + .expect_err("Test transport does not support load with SQL"); + + let load_calls = context.load_calls().await; + assert_eq!(load_calls.len(), 1); + assert_eq!(load_calls[0].meta.database(), Some("cubedb".to_string())); +} + +#[test] +fn test_load_request_meta_database_serialization() { + let mut meta = LoadRequestMeta::new( + "postgres".to_string(), + "sql".to_string(), + Some("test-app".to_string()), + ); + + let json = serde_json::to_value(&meta).unwrap(); + assert!(json.get("database").is_none()); + + meta.set_database(Some("mydb".to_string())); + let json = serde_json::to_value(&meta).unwrap(); + assert_eq!(json["database"], "mydb"); + assert_eq!(meta.database(), Some("mydb".to_string())); +} diff --git a/rust/cubesql/cubesql/src/transport/service.rs b/rust/cubesql/cubesql/src/transport/service.rs index 9b613ffdca08f..f7e431fdbd682 100644 --- a/rust/cubesql/cubesql/src/transport/service.rs +++ b/rust/cubesql/cubesql/src/transport/service.rs @@ -75,6 +75,10 @@ impl LoadRequestMeta { self.change_user = change_user; } + pub fn database(&self) -> Option { + self.database.clone() + } + pub fn set_database(&mut self, database: Option) { self.database = database; } From 85933927db85baea2a96c178da6f81c833956093 Mon Sep 17 00:00:00 2001 From: Sascha John Hesse Date: Fri, 22 May 2026 10:52:23 +0200 Subject: [PATCH 3/3] fix(tests): reorder test module declarations for consistency after linting --- rust/cubesql/cubesql/src/compile/test/mod.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rust/cubesql/cubesql/src/compile/test/mod.rs b/rust/cubesql/cubesql/src/compile/test/mod.rs index a2a4f5bf45918..7db5fcd79f2dc 100644 --- a/rust/cubesql/cubesql/src/compile/test/mod.rs +++ b/rust/cubesql/cubesql/src/compile/test/mod.rs @@ -31,12 +31,12 @@ pub mod test_bi_workarounds; #[cfg(test)] pub mod test_cube_join; #[cfg(test)] -pub mod test_database_meta; -#[cfg(test)] pub mod test_cube_join_grouped; #[cfg(test)] pub mod test_cube_scan; #[cfg(test)] +pub mod test_database_meta; +#[cfg(test)] pub mod test_df_execution; #[cfg(test)] pub mod test_filters;