Skip to content

Commit e9368bd

Browse files
committed
pass errors to js
1 parent 0965599 commit e9368bd

File tree

4 files changed

+51
-6
lines changed

4 files changed

+51
-6
lines changed

packages/cubejs-backend-native/src/node_export.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -467,6 +467,7 @@ fn build_sql_and_params(cx: FunctionContext) -> JsResult<JsValue> {
467467
//context should be used only inside function
468468
let mut cx = extend_function_context_lifetime(cx);
469469
let options = cx.argument::<JsValue>(0)?;
470+
let options_tmp = options.clone();
470471

471472
let neon_context_holder = ContextHolder::new(cx);
472473

@@ -484,7 +485,7 @@ fn build_sql_and_params(cx: FunctionContext) -> JsResult<JsValue> {
484485
let base_query = BaseQuery::try_new(context_holder.clone(), base_query_options).unwrap();
485486

486487
//arg_clrep.into_js(&mut cx)
487-
let res = base_query.build_sql_and_params().unwrap();
488+
let res = base_query.build_sql_and_params();
488489

489490
let result: NeonObject<'static, FunctionContext<'static>> = res.into_object();
490491
let result = result.into_object();

packages/cubejs-schema-compiler/src/adapter/BaseQuery.js

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -654,7 +654,17 @@ export class BaseQuery {
654654
ungrouped: this.options.ungrouped
655655

656656
};
657-
const res = nativeBuildSqlAndParams(queryParams);
657+
const buildResult = nativeBuildSqlAndParams(queryParams);
658+
659+
if (buildResult.error) {
660+
if (buildResult.error.cause && buildResult.error.cause === 'User') {
661+
throw new UserError(buildResult.error.message);
662+
} else {
663+
throw new Error(buildResult.error.message);
664+
}
665+
}
666+
667+
const res = buildResult.result;
658668
// FIXME
659669
res[1] = [...res[1]];
660670
return res;

rust/cubenativeutils/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
pub mod wrappers;
2-
pub use cubesql::CubeError;
2+
pub use cubesql::{CubeError, CubeErrorCauseType};

rust/cubesqlplanner/cubesqlplanner/src/planner/base_query.rs

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ use cubenativeutils::wrappers::inner_types::InnerTypes;
77
use cubenativeutils::wrappers::object::NativeArray;
88
use cubenativeutils::wrappers::serializer::NativeSerialize;
99
use cubenativeutils::wrappers::NativeType;
10-
use cubenativeutils::wrappers::{NativeContextHolder, NativeObjectHandle};
11-
use cubenativeutils::CubeError;
10+
use cubenativeutils::wrappers::{NativeContextHolder, NativeObjectHandle, NativeStruct};
11+
use cubenativeutils::{CubeError, CubeErrorCauseType};
1212
use std::rc::Rc;
1313

1414
pub struct BaseQuery<IT: InnerTypes> {
@@ -38,7 +38,41 @@ impl<IT: InnerTypes> BaseQuery<IT> {
3838
})
3939
}
4040

41-
pub fn build_sql_and_params(&self) -> Result<NativeObjectHandle<IT>, CubeError> {
41+
pub fn build_sql_and_params(&self) -> NativeObjectHandle<IT> {
42+
let build_result = self.build_sql_and_params_impl();
43+
let result = self.context.empty_struct();
44+
match build_result {
45+
Ok(res) => {
46+
result.set_field("result", res).unwrap();
47+
}
48+
Err(e) => {
49+
let error_descr = self.context.empty_struct();
50+
let error_cause = match &e.cause {
51+
CubeErrorCauseType::User(_) => "User",
52+
CubeErrorCauseType::Internal(_) => "Internal",
53+
};
54+
error_descr
55+
.set_field(
56+
"message",
57+
e.message.to_native(self.context.clone()).unwrap(),
58+
)
59+
.unwrap();
60+
error_descr
61+
.set_field(
62+
"cause",
63+
error_cause.to_native(self.context.clone()).unwrap(),
64+
)
65+
.unwrap();
66+
result
67+
.set_field("error", NativeObjectHandle::new(error_descr.into_object()))
68+
.unwrap();
69+
}
70+
}
71+
72+
NativeObjectHandle::new(result.into_object())
73+
}
74+
75+
fn build_sql_and_params_impl(&self) -> Result<NativeObjectHandle<IT>, CubeError> {
4276
let templates = PlanSqlTemplates::new(self.query_tools.templates_render());
4377
let query_planner = QueryPlanner::new(self.request.clone(), self.query_tools.clone());
4478
let plan = query_planner.plan()?;

0 commit comments

Comments
 (0)