@@ -360,19 +360,25 @@ defmodule Ecto.Query.Builder do
360
360
361
361
if is_nil ( left ) or is_nil ( right ) do
362
362
error! (
363
- "comparison with nil is forbidden as it is unsafe. " <>
363
+ "comparison with nil in ` #{ Macro . to_string ( expr ) } ` is forbidden as it is unsafe. " <>
364
364
"If you want to check if a value is nil, use is_nil/1 instead"
365
365
)
366
366
end
367
367
368
368
ltype = quoted_type ( right , vars )
369
369
rtype = quoted_type ( left , vars )
370
370
371
- { left , params_acc } = escape ( left , ltype , params_acc , vars , env )
372
- { right , params_acc } = escape ( right , rtype , params_acc , vars , env )
371
+ { escaped_left , params_acc } = escape ( left , ltype , params_acc , vars , env )
372
+ { escaped_right , params_acc } = escape ( right , rtype , params_acc , vars , env )
373
373
374
374
{ params , acc } = params_acc
375
- { { :{} , [ ] , [ comp_op , [ ] , [ left , right ] ] } , { params |> wrap_nil ( left ) |> wrap_nil ( right ) , acc } }
375
+
376
+ params =
377
+ params
378
+ |> wrap_nil ( escaped_left , Macro . to_string ( right ) )
379
+ |> wrap_nil ( escaped_right , Macro . to_string ( left ) )
380
+
381
+ { { :{} , [ ] , [ comp_op , [ ] , [ escaped_left , escaped_right ] ] } , { params , acc } }
376
382
end
377
383
378
384
# mathematical operators
@@ -585,18 +591,18 @@ defmodule Ecto.Query.Builder do
585
591
defp validate_json_field! ( unsupported_field ) ,
586
592
do: error! ( "`#{ Macro . to_string ( unsupported_field ) } ` is not a valid json field" )
587
593
588
- defp wrap_nil ( params , { :{} , _ , [ :^ , _ , [ ix ] ] } ) ,
589
- do: wrap_nil ( params , length ( params ) - ix - 1 , [ ] )
594
+ defp wrap_nil ( params , { :{} , _ , [ :^ , _ , [ ix ] ] } , compare_str ) ,
595
+ do: wrap_nil ( params , length ( params ) - ix - 1 , compare_str , [ ] )
590
596
591
- defp wrap_nil ( params , _other ) , do: params
597
+ defp wrap_nil ( params , _other , _compare_str ) , do: params
592
598
593
- defp wrap_nil ( [ { val , type } | params ] , 0 , acc ) do
594
- val = quote do: Ecto.Query.Builder . not_nil! ( unquote ( val ) )
599
+ defp wrap_nil ( [ { val , type } | params ] , 0 , compare_str , acc ) do
600
+ val = quote do: Ecto.Query.Builder . not_nil! ( unquote ( val ) , unquote ( compare_str ) )
595
601
Enum . reverse ( acc , [ { val , type } | params ] )
596
602
end
597
603
598
- defp wrap_nil ( [ pair | params ] , i , acc ) do
599
- wrap_nil ( params , i - 1 , [ pair | acc ] )
604
+ defp wrap_nil ( [ pair | params ] , i , compare_str , acc ) do
605
+ wrap_nil ( params , i - 1 , compare_str , [ pair | acc ] )
600
606
end
601
607
602
608
defp expand_and_split_fragment ( query , env ) do
@@ -1184,13 +1190,13 @@ defmodule Ecto.Query.Builder do
1184
1190
@ doc """
1185
1191
Called by escaper at runtime to verify that a value is not nil.
1186
1192
"""
1187
- def not_nil! ( nil ) do
1193
+ def not_nil! ( nil , compare_str ) do
1188
1194
raise ArgumentError ,
1189
- "comparison with nil is forbidden as it is unsafe. " <>
1195
+ "comparing ` #{ compare_str } ` with ` nil` is forbidden as it is unsafe. " <>
1190
1196
"If you want to check if a value is nil, use is_nil/1 instead"
1191
1197
end
1192
1198
1193
- def not_nil! ( not_nil ) do
1199
+ def not_nil! ( not_nil , _compare_str ) do
1194
1200
not_nil
1195
1201
end
1196
1202
0 commit comments