Skip to content

Commit 52e49a2

Browse files
Fix fallback generic with no query parameters (#605)
1 parent e40eab3 commit 52e49a2

File tree

2 files changed

+16
-6
lines changed

2 files changed

+16
-6
lines changed

integration_test/pg/explain_test.exs

+3
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ defmodule Ecto.Integration.ExplainTest do
3737

3838
assert explain =~ "p0.visits = $1"
3939
assert explain =~ "(p0.title)::text = $2"
40+
41+
# Works when no parameters are given
42+
TestRepo.explain(:all, Post, plan: :fallback_generic, verbose: true, timeout: 20000)
4043
end
4144

4245
test "explain with fallback generic plan cannot use analyze" do

lib/ecto/adapters/postgres/connection.ex

+13-6
Original file line numberDiff line numberDiff line change
@@ -397,28 +397,35 @@ if Code.ensure_loaded?(Postgrex) do
397397
end
398398

399399
def build_fallback_generic_queries(query, num_params, opts) do
400+
prepare_args =
401+
if num_params > 0,
402+
do: ["( ", Enum.map_intersperse(1..num_params, ", ", fn _ -> "unknown" end), " )"],
403+
else: []
404+
400405
prepare =
401406
[
402407
"PREPARE ",
403408
@explain_prepared_statement_name,
404-
"(",
405-
Enum.map_intersperse(1..num_params, ", ", fn _ -> "unknown" end),
406-
") AS ",
409+
prepare_args,
410+
" AS ",
407411
query
408412
]
409413
|> IO.iodata_to_binary()
410414

411415
set = "SET LOCAL plan_cache_mode = force_generic_plan"
412416

417+
execute_args =
418+
if num_params > 0,
419+
do: ["( ", Enum.map_intersperse(1..num_params, ", ", fn _ -> "NULL" end), " )"],
420+
else: []
421+
413422
execute =
414423
[
415424
"EXPLAIN ",
416425
build_explain_opts(opts),
417426
"EXECUTE ",
418427
@explain_prepared_statement_name,
419-
"(",
420-
Enum.map_intersperse(1..num_params, ", ", fn _ -> "NULL" end),
421-
")"
428+
execute_args
422429
]
423430
|> IO.iodata_to_binary()
424431

0 commit comments

Comments
 (0)