@@ -2,11 +2,13 @@ use std::sync::Arc;
22
33use neon:: prelude:: * ;
44
5- use cubesql:: compile:: convert_sql_to_cube_query;
65use cubesql:: compile:: datafusion:: logical_plan:: LogicalPlan ;
6+ use cubesql:: compile:: datafusion:: scalar:: ScalarValue ;
7+ use cubesql:: compile:: datafusion:: variable:: VarType ;
78use cubesql:: compile:: engine:: df:: scan:: CubeScanNode ;
89use cubesql:: compile:: engine:: df:: wrapper:: { CubeScanWrappedSqlNode , CubeScanWrapperNode } ;
9- use cubesql:: sql:: Session ;
10+ use cubesql:: compile:: { convert_sql_to_cube_query, DatabaseVariable } ;
11+ use cubesql:: sql:: { Session , CUBESQL_PENALIZE_POST_PROCESSING_VAR } ;
1012use cubesql:: transport:: MetaContext ;
1113use cubesql:: CubeError ;
1214
@@ -157,8 +159,20 @@ async fn handle_sql4sql_query(
157159 services : Arc < NodeCubeServices > ,
158160 native_auth_ctx : Arc < NativeAuthContext > ,
159161 sql_query : & str ,
162+ disable_post_processing : bool ,
160163) -> Result < Sql4SqlResponse , CubeError > {
161164 with_session ( & services, native_auth_ctx. clone ( ) , |session| async move {
165+ if disable_post_processing {
166+ let v = DatabaseVariable {
167+ name : CUBESQL_PENALIZE_POST_PROCESSING_VAR . to_string ( ) ,
168+ value : ScalarValue :: Boolean ( Some ( true ) ) ,
169+ var_type : VarType :: UserDefined ,
170+ readonly : false ,
171+ additional_params : None ,
172+ } ;
173+ session. state . set_variables ( vec ! [ v] ) ;
174+ }
175+
162176 let transport = session. server . transport . clone ( ) ;
163177 // todo: can we use compiler_cache?
164178 let meta_context = transport
@@ -176,8 +190,9 @@ async fn handle_sql4sql_query(
176190pub fn sql4sql ( mut cx : FunctionContext ) -> JsResult < JsValue > {
177191 let interface = cx. argument :: < JsBox < crate :: node_export:: SQLInterface > > ( 0 ) ?;
178192 let sql_query = cx. argument :: < JsString > ( 1 ) ?. value ( & mut cx) ;
193+ let disable_post_processing = cx. argument :: < JsBoolean > ( 2 ) ?. value ( & mut cx) ;
179194
180- let security_context: Option < serde_json:: Value > = match cx. argument :: < JsValue > ( 2 ) {
195+ let security_context: Option < serde_json:: Value > = match cx. argument :: < JsValue > ( 3 ) {
181196 Ok ( string) => match string. downcast :: < JsString , _ > ( & mut cx) {
182197 Ok ( v) => v. value ( & mut cx) . parse :: < serde_json:: Value > ( ) . ok ( ) ,
183198 Err ( _) => None ,
@@ -208,7 +223,13 @@ pub fn sql4sql(mut cx: FunctionContext) -> JsResult<JsValue> {
208223 // can do it relatively rare, and in a single loop for all JoinHandles
209224 // this is just a watchdog for a Very Bad case, so latency requirement can be quite relaxed
210225 runtime. spawn ( async move {
211- let result = handle_sql4sql_query ( services, native_auth_ctx, & sql_query) . await ;
226+ let result = handle_sql4sql_query (
227+ services,
228+ native_auth_ctx,
229+ & sql_query,
230+ disable_post_processing,
231+ )
232+ . await ;
212233
213234 if let Err ( err) = deferred. try_settle_with ( & channel, move |mut cx| {
214235 // `neon::result::ResultExt` is implemented only for Result<Handle, Handle>, even though Ok variant is not touched
0 commit comments