@@ -269,7 +269,7 @@ defmodule Ecto.Query.Builder do
269
269
def escape ( { :json_extract_path , _ , [ field , path ] } , type , params_acc , vars , env ) do
270
270
validate_json_field! ( field )
271
271
272
- path = escape_json_path ( path )
272
+ path = escape_json_path ( path , vars )
273
273
{ field , params_acc } = escape ( field , type , params_acc , vars , env )
274
274
{ { :{} , [ ] , [ :json_extract_path , [ ] , [ field , path ] ] } , params_acc }
275
275
end
@@ -1194,36 +1194,44 @@ defmodule Ecto.Query.Builder do
1194
1194
end
1195
1195
end
1196
1196
1197
- defp escape_json_path ( path ) when is_list ( path ) do
1198
- Enum . map ( path , & quoted_json_path_element! / 1 )
1197
+ defp escape_json_path ( path , vars ) when is_list ( path ) do
1198
+ Enum . map ( path , & quoted_json_path_element! ( & 1 , vars ) )
1199
1199
end
1200
1200
1201
- defp escape_json_path ( { :^ , _ , [ path ] } ) do
1201
+ defp escape_json_path ( { :^ , _ , [ path ] } , _vars ) do
1202
1202
quote do
1203
1203
path = Ecto.Query.Builder . json_path! ( unquote ( path ) )
1204
1204
Enum . map ( path , & Ecto.Query.Builder . json_path_element! / 1 )
1205
1205
end
1206
1206
end
1207
1207
1208
- defp escape_json_path ( other ) do
1208
+ defp escape_json_path ( other , _vars ) do
1209
1209
error! (
1210
1210
"expected JSON path to be a literal list or interpolated value, got: `#{ Macro . to_string ( other ) } `"
1211
1211
)
1212
1212
end
1213
1213
1214
- defp quoted_json_path_element! ( { :^ , _ , [ expr ] } ) ,
1214
+ defp quoted_json_path_element! ( { :^ , _ , [ expr ] } , _vars ) ,
1215
1215
do: quote ( do: Ecto.Query.Builder . json_path_element! ( unquote ( expr ) ) )
1216
1216
1217
- defp quoted_json_path_element! ( binary ) when is_binary ( binary ) ,
1217
+ defp quoted_json_path_element! ( binary , _vars ) when is_binary ( binary ) ,
1218
1218
do: binary
1219
1219
1220
- defp quoted_json_path_element! ( integer ) when is_integer ( integer ) ,
1220
+ defp quoted_json_path_element! ( integer , _vars ) when is_integer ( integer ) ,
1221
1221
do: integer
1222
1222
1223
- defp quoted_json_path_element! ( other ) ,
1223
+ defp quoted_json_path_element! ( { { :. , _ , [ callee , field ] } , _ , [ ] } , vars ) do
1224
+ escape_field! ( callee , field , vars )
1225
+ end
1226
+
1227
+ defp quoted_json_path_element! ( { :field , _ , [ callee , field ] } , vars ) do
1228
+ escape_field! ( callee , field , vars )
1229
+ end
1230
+
1231
+ defp quoted_json_path_element! ( other , _vars ) ,
1224
1232
do:
1225
1233
error! (
1226
- "expected JSON path to contain literal strings, literal integers, or interpolated values, got: " <>
1234
+ "expected JSON path to contain literal strings, literal integers, fields, or interpolated values, got: " <>
1227
1235
"`#{ Macro . to_string ( other ) } `"
1228
1236
)
1229
1237
0 commit comments