@@ -253,10 +253,21 @@ if Code.ensure_loaded?(Postgrex) do
253253 @ impl true
254254 def explain_query ( conn , query , params , opts ) do
255255 { explain_opts , opts } =
256- Keyword . split ( opts , ~w[ analyze verbose costs settings buffers timing summary] a )
256+ Keyword . split ( opts , ~w[ analyze verbose costs settings buffers timing summary format] a )
257+
258+ json_format? = { :format , :json } in explain_opts
259+ map_format? = { :format , :map } in explain_opts
257260
258261 case query ( conn , build_explain_query ( query , explain_opts ) , params , opts ) do
259- { :ok , % Postgrex.Result { rows: rows } } -> { :ok , Enum . map_join ( rows , "\n " , & & 1 ) }
262+ { :ok , % Postgrex.Result { rows: rows } } when json_format? ->
263+ case Jason . encode ( List . flatten ( rows ) ) do
264+ { :ok , json } -> { :ok , json }
265+ { :error , error } -> error
266+ end
267+ { :ok , % Postgrex.Result { rows: rows } } when map_format? ->
268+ { :ok , List . flatten ( rows ) }
269+ { :ok , % Postgrex.Result { rows: rows } } ->
270+ { :ok , Enum . map_join ( rows , "\n " , & & 1 ) }
260271 error -> error
261272 end
262273 end
@@ -289,6 +300,9 @@ if Code.ensure_loaded?(Postgrex) do
289300 { _ , nil } , acc ->
290301 acc
291302
303+ { :format , value } , acc ->
304+ [ String . upcase ( "#{ format_to_sql ( value ) } " ) | acc ]
305+
292306 { opt , value } , acc ->
293307 [ String . upcase ( "#{ opt } #{ quote_boolean ( value ) } " ) | acc ]
294308 end )
@@ -1229,6 +1243,11 @@ if Code.ensure_loaded?(Postgrex) do
12291243 defp quote_boolean ( false ) , do: "FALSE"
12301244 defp quote_boolean ( value ) , do: error! ( nil , "bad boolean value #{ value } " )
12311245
1246+ defp format_to_sql ( :text ) , do: "FORMAT TEXT"
1247+ defp format_to_sql ( :json ) , do: "FORMAT JSON"
1248+ defp format_to_sql ( :map ) , do: "FORMAT JSON"
1249+ defp format_to_sql ( :yaml ) , do: "FORMAT YAML"
1250+
12321251 defp single_quote ( value ) , do: [ ?' , escape_string ( value ) , ?' ]
12331252
12341253 defp intersperse_map ( list , separator , mapper , acc \\ [ ] )
0 commit comments