44% %
55% % Copyright (c) 2007-2025 Broadcom. All Rights Reserved. The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. All rights reserved.
66
7- -module (rabbit_amqp_filter_jms ).
7+ -module (rabbit_amqp_filter_sql ).
88-feature (maybe_expr , enable ).
99
1010-include_lib (" amqp10_common/include/amqp10_filter.hrl" ).
1111
1212-type parsed_expression () :: {ApplicationProperties :: boolean (),
13- rabbit_jms_ast :ast ()}.
13+ rabbit_amqp_sql_ast :ast ()}.
1414
1515-export_type ([parsed_expression / 0 ]).
1616
2121-define (MAX_EXPRESSION_LENGTH , 4096 ).
2222-define (MAX_TOKENS , 200 ).
2323
24- % % defined in both AMQP and JMS
2524-define (DEFAULT_MSG_PRIORITY , 4 ).
2625
2726-define (IS_CONTROL_CHAR (C ), C < 32 orelse C =:= 127 ).
2827
2928-spec parse (tuple ()) ->
3029 {ok , parsed_expression ()} | error .
31- parse ({described , Descriptor , {utf8 , JmsSelector }}) ->
30+ parse ({described , Descriptor , {utf8 , SQL }}) ->
3231 maybe
3332 ok ?= check_descriptor (Descriptor ),
34- {ok , String } ?= jms_selector_to_list ( JmsSelector ),
33+ {ok , String } ?= sql_to_list ( SQL ),
3534 ok ?= check_length (String ),
36- {ok , Tokens } ?= tokenize (String , JmsSelector ),
37- ok ?= check_token_count (Tokens , JmsSelector ),
38- {ok , Ast0 } ?= parse (Tokens , JmsSelector ),
39- {ok , Ast } ?= transform_ast (Ast0 , JmsSelector ),
35+ {ok , Tokens } ?= tokenize (String , SQL ),
36+ ok ?= check_token_count (Tokens , SQL ),
37+ {ok , Ast0 } ?= parse (Tokens , SQL ),
38+ {ok , Ast } ?= transform_ast (Ast0 , SQL ),
4039 AppProps = has_binary_identifier (Ast ),
4140 {ok , {AppProps , Ast }}
4241 end .
4342
44- % % Evaluates a parsed JMS message selector expression.
43+ % % Evaluates a parsed SQL expression.
4544-spec eval (parsed_expression (), mc :state ()) -> boolean ().
4645eval ({ApplicationProperties , Ast }, Msg ) ->
4746 State = case ApplicationProperties of
@@ -298,54 +297,54 @@ check_descriptor({ulong, ?DESCRIPTOR_CODE_SQL_FILTER}) ->
298297check_descriptor (_ ) ->
299298 error .
300299
301- jms_selector_to_list ( JmsSelector ) ->
302- case unicode :characters_to_list (JmsSelector ) of
300+ sql_to_list ( SQL ) ->
301+ case unicode :characters_to_list (SQL ) of
303302 String when is_list (String ) ->
304303 {ok , String };
305304 Error ->
306- rabbit_log :warning (" JMS message selector ~p is not UTF-8 encoded: ~p " ,
307- [JmsSelector , Error ]),
305+ rabbit_log :warning (" SQL expression ~p is not UTF-8 encoded: ~p " ,
306+ [SQL , Error ]),
308307 error
309308 end .
310309
311310check_length (String )
312311 when length (String ) > ? MAX_EXPRESSION_LENGTH ->
313- rabbit_log :warning (" JMS message selector length ~b exceeds maximum length ~b " ,
312+ rabbit_log :warning (" SQL expression length ~b exceeds maximum length ~b " ,
314313 [length (String ), ? MAX_EXPRESSION_LENGTH ]),
315314 error ;
316315check_length (_ ) ->
317316 ok .
318317
319- tokenize (String , JmsSelector ) ->
320- case rabbit_jms_selector_lexer :string (String ) of
318+ tokenize (String , SQL ) ->
319+ case rabbit_amqp_sql_lexer :string (String ) of
321320 {ok , Tokens , _EndLocation } ->
322321 {ok , Tokens };
323322 {error , {_Line , _Mod , ErrDescriptor }, _Location } ->
324- rabbit_log :warning (" failed to scan JMS message selector '~ts ': ~tp " ,
325- [JmsSelector , ErrDescriptor ]),
323+ rabbit_log :warning (" failed to scan SQL expression '~ts ': ~tp " ,
324+ [SQL , ErrDescriptor ]),
326325 error
327326 end .
328327
329- check_token_count (Tokens , JmsSelector )
328+ check_token_count (Tokens , SQL )
330329 when length (Tokens ) > ? MAX_TOKENS ->
331- rabbit_log :warning (" JMS message selector '~ts ' with ~b tokens exceeds token limit ~b " ,
332- [JmsSelector , length (Tokens ), ? MAX_TOKENS ]),
330+ rabbit_log :warning (" SQL expression '~ts ' with ~b tokens exceeds token limit ~b " ,
331+ [SQL , length (Tokens ), ? MAX_TOKENS ]),
333332 error ;
334333check_token_count (_ , _ ) ->
335334 ok .
336335
337- parse (Tokens , JmsSelector ) ->
338- case rabbit_jms_selector_parser :parse (Tokens ) of
336+ parse (Tokens , SQL ) ->
337+ case rabbit_amqp_sql_parser :parse (Tokens ) of
339338 {error , Reason } ->
340- rabbit_log :warning (" failed to parse JMS message selector '~ts ': ~p " ,
341- [JmsSelector , Reason ]),
339+ rabbit_log :warning (" failed to parse SQL expression '~ts ': ~p " ,
340+ [SQL , Reason ]),
342341 error ;
343342 Ok ->
344343 Ok
345344 end .
346345
347- transform_ast (Ast0 , JmsSelector ) ->
348- try rabbit_jms_ast :map (
346+ transform_ast (Ast0 , SQL ) ->
347+ try rabbit_amqp_sql_ast :map (
349348 fun ({identifier , Ident })
350349 when is_binary (Ident ) ->
351350 {identifier , rabbit_amqp_util :section_field_name_to_atom (Ident )};
@@ -358,18 +357,18 @@ transform_ast(Ast0, JmsSelector) ->
358357 {ok , Ast }
359358 catch {unsupported_field , Name } ->
360359 rabbit_log :warning (
361- " identifier ~ts in JMS message selector ~tp is unsupported" ,
362- [Name , JmsSelector ]),
360+ " identifier ~ts in SQL expression ~tp is unsupported" ,
361+ [Name , SQL ]),
363362 error ;
364363 {invalid_pattern , Reason } ->
365364 rabbit_log :warning (
366- " failed to parse LIKE pattern for JMS message selector ~tp : ~tp " ,
367- [JmsSelector , Reason ]),
365+ " failed to parse LIKE pattern for SQL expression ~tp : ~tp " ,
366+ [SQL , Reason ]),
368367 error
369368 end .
370369
371370has_binary_identifier (Ast ) ->
372- rabbit_jms_ast :search (fun ({identifier , Val }) ->
371+ rabbit_amqp_sql_ast :search (fun ({identifier , Val }) ->
373372 is_binary (Val );
374373 (_Node ) ->
375374 false
@@ -390,7 +389,7 @@ transform_pattern(Pattern, Escape) ->
390389 {single_percent , Chars , PercentPos } ->
391390 single_percent (Chars , PercentPos );
392391 regex ->
393- Re = jms_pattern_to_regex (Pattern , Escape , []),
392+ Re = pattern_to_regex (Pattern , Escape , []),
394393 case re :compile (" ^" ++ Re ++ " $" , [unicode ]) of
395394 {ok , CompiledRe } ->
396395 CompiledRe ;
@@ -441,23 +440,23 @@ single_percent(Chars, Pos) ->
441440 {{prefix , byte_size (PrefixBin ), PrefixBin },
442441 {suffix , byte_size (SuffixBin ), SuffixBin }}.
443442
444- jms_pattern_to_regex ([], _Escape , Acc ) ->
443+ pattern_to_regex ([], _Escape , Acc ) ->
445444 lists :reverse (Acc );
446- jms_pattern_to_regex ([EscapeChar | Rest ], EscapeChar , Acc ) ->
445+ pattern_to_regex ([EscapeChar | Rest ], EscapeChar , Acc ) ->
447446 case Rest of
448447 [] ->
449448 throw ({invalid_pattern , invalid_escape_at_end });
450449 [NextChar | Rest1 ] ->
451- jms_pattern_to_regex (Rest1 , EscapeChar , escape_regex_char (NextChar ) ++ Acc )
450+ pattern_to_regex (Rest1 , EscapeChar , escape_regex_char (NextChar ) ++ Acc )
452451 end ;
453- jms_pattern_to_regex ([$% | Rest ], Escape , Acc ) ->
452+ pattern_to_regex ([$% | Rest ], Escape , Acc ) ->
454453 % % % matches any sequence of characters (0 or more)
455- jms_pattern_to_regex (Rest , Escape , [$* , $. | Acc ]);
456- jms_pattern_to_regex ([$_ | Rest ], Escape , Acc ) ->
454+ pattern_to_regex (Rest , Escape , [$* , $. | Acc ]);
455+ pattern_to_regex ([$_ | Rest ], Escape , Acc ) ->
457456 % % _ matches exactly one character
458- jms_pattern_to_regex (Rest , Escape , [$. | Acc ]);
459- jms_pattern_to_regex ([Char | Rest ], Escape , Acc ) ->
460- jms_pattern_to_regex (Rest , Escape , escape_regex_char (Char ) ++ Acc ).
457+ pattern_to_regex (Rest , Escape , [$. | Acc ]);
458+ pattern_to_regex ([Char | Rest ], Escape , Acc ) ->
459+ pattern_to_regex (Rest , Escape , escape_regex_char (Char ) ++ Acc ).
461460
462461% % Escape user provided characters that have special meaning in Erlang regex.
463462escape_regex_char (Char0 ) ->
0 commit comments