@@ -54,6 +54,7 @@ impl<'a> TypeChecker<'a> {
5454 Ascii :: new ( "current_role" ) ,
5555 Ascii :: new ( "current_secondary_roles" ) ,
5656 Ascii :: new ( "current_available_roles" ) ,
57+ Ascii :: new ( "is_role_in_session" ) ,
5758 Ascii :: new ( "connection_id" ) ,
5859 Ascii :: new ( "client_session_id" ) ,
5960 Ascii :: new ( "timezone" ) ,
@@ -181,6 +182,49 @@ impl<'a> TypeChecker<'a> {
181182 ) ) ) ) ,
182183 }
183184 }
185+ ( "is_role_in_session" , & [ role] ) => {
186+ let effective_roles = match self . ctx . get_all_effective_roles ( ) . await {
187+ Ok ( roles) => roles,
188+ Err ( err) => return Some ( Err ( err) ) ,
189+ } ;
190+ let ( role_expr, _) = match self . resolve ( role) {
191+ Ok ( res) => * res,
192+ Err ( err) => return Some ( Err ( err) ) ,
193+ } ;
194+
195+ let mut predicate_levels =
196+ Vec :: with_capacity ( effective_roles. len ( ) . max ( 1 ) . ilog2 ( ) as usize + 1 ) ;
197+ for effective_role in effective_roles {
198+ let role_literal = ScalarExpr :: ConstantExpr ( ConstantExpr {
199+ span,
200+ value : Scalar :: String ( effective_role. name ) ,
201+ } ) ;
202+ let predicate =
203+ match self . resolve_scalar_function_call ( span, "eq" , vec ! [ ] , vec ! [
204+ role_expr. clone( ) ,
205+ role_literal,
206+ ] ) {
207+ Ok ( res) => {
208+ let ( predicate, _) = * res;
209+ predicate
210+ }
211+ Err ( err) => return Some ( Err ( err) ) ,
212+ } ;
213+ if let Err ( err) = self . merge_or_level ( span, & mut predicate_levels, predicate) {
214+ return Some ( Err ( err) ) ;
215+ }
216+ }
217+
218+ let predicate = match self . fold_or_levels ( span, predicate_levels) {
219+ Ok ( Some ( predicate) ) => predicate,
220+ Ok ( None ) => ScalarExpr :: ConstantExpr ( ConstantExpr {
221+ span,
222+ value : Scalar :: Boolean ( false ) ,
223+ } ) ,
224+ Err ( err) => return Some ( Err ( err) ) ,
225+ } ;
226+ Some ( self . resolve_scalar_function_call ( span, "is_true" , vec ! [ ] , vec ! [ predicate] ) )
227+ }
184228 ( "connection_id" , & [ ] ) => Some ( self . resolve ( & Expr :: Literal {
185229 span,
186230 value : Literal :: String ( self . ctx . get_connection_id ( ) ) ,
0 commit comments