From 310d63b2527983885c0ea9e3aa057d2e65dec28a Mon Sep 17 00:00:00 2001 From: Dmitry Patsura Date: Thu, 26 Jun 2025 15:09:05 +0200 Subject: [PATCH] fix(native): Handle null correctly as JsNull, not as JsString --- packages/cubejs-backend-native/src/orchestrator.rs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/cubejs-backend-native/src/orchestrator.rs b/packages/cubejs-backend-native/src/orchestrator.rs index 00ab47b16be06..a997a99868e11 100644 --- a/packages/cubejs-backend-native/src/orchestrator.rs +++ b/packages/cubejs-backend-native/src/orchestrator.rs @@ -1,9 +1,7 @@ use crate::node_obj_deserializer::JsValueDeserializer; use crate::transport::MapCubeErrExt; use cubeorchestrator::query_message_parser::QueryResult; -use cubeorchestrator::query_result_transform::{ - DBResponsePrimitive, RequestResultData, RequestResultDataMulti, TransformedData, -}; +use cubeorchestrator::query_result_transform::{DBResponsePrimitive, DBResponseValue, RequestResultData, RequestResultDataMulti, TransformedData}; use cubeorchestrator::transport::{JsRawData, TransformDataRequest}; use cubesql::compile::engine::df::scan::{FieldValue, ValueObject}; use cubesql::CubeError; @@ -258,7 +256,12 @@ pub fn get_cubestore_result(mut cx: FunctionContext) -> JsResult { let js_row = JsObject::new(&mut cx); for (key, value) in result.columns.iter().zip(row.iter()) { let js_key = cx.string(key); - let js_value = cx.string(value.to_string()); + let js_value: Handle<'_, JsValue> = match value { + DBResponseValue::Primitive(DBResponsePrimitive::Null) => cx.null().upcast(), + // For compatibility, we convert all primitives to strings + other => cx.string(other.to_string()).upcast(), + }; + js_row.set(&mut cx, js_key, js_value)?; } Ok(js_row)