Skip to content

Commit 0c5581d

Browse files
authored
Allow map query params (#614)
1 parent 34935bb commit 0c5581d

File tree

4 files changed

+51
-6
lines changed

4 files changed

+51
-6
lines changed

lib/ecto/adapters/myxql/connection.ex

+12
Original file line numberDiff line numberDiff line change
@@ -16,23 +16,28 @@ if Code.ensure_loaded?(MyXQL) do
1616

1717
@impl true
1818
def prepare_execute(conn, name, sql, params, opts) do
19+
ensure_list_params!(params)
1920
MyXQL.prepare_execute(conn, name, sql, params, opts)
2021
end
2122

2223
@impl true
2324
def query(conn, sql, params, opts) do
25+
ensure_list_params!(params)
2426
opts = Keyword.put_new(opts, :query_type, :binary_then_text)
2527
MyXQL.query(conn, sql, params, opts)
2628
end
2729

2830
@impl true
2931
def query_many(conn, sql, params, opts) do
32+
ensure_list_params!(params)
3033
opts = Keyword.put_new(opts, :query_type, :text)
3134
MyXQL.query_many(conn, sql, params, opts)
3235
end
3336

3437
@impl true
3538
def execute(conn, query, params, opts) do
39+
ensure_list_params!(params)
40+
3641
case MyXQL.execute(conn, query, params, opts) do
3742
{:ok, _, result} -> {:ok, result}
3843
{:error, _} = error -> error
@@ -41,9 +46,16 @@ if Code.ensure_loaded?(MyXQL) do
4146

4247
@impl true
4348
def stream(conn, sql, params, opts) do
49+
ensure_list_params!(params)
4450
MyXQL.stream(conn, sql, params, opts)
4551
end
4652

53+
defp ensure_list_params!(params) do
54+
unless is_list(params) do
55+
raise ArgumentError, "expected params to be a list, got: #{inspect(params)}"
56+
end
57+
end
58+
4759
@quotes ~w(" ' `)
4860

4961
@impl true

lib/ecto/adapters/postgres/connection.ex

+12
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,8 @@ if Code.ensure_loaded?(Postgrex) do
9999

100100
@impl true
101101
def prepare_execute(conn, name, sql, params, opts) do
102+
ensure_list_params!(params)
103+
102104
case Postgrex.prepare_execute(conn, name, sql, params, opts) do
103105
{:error, %Postgrex.Error{postgres: %{pg_code: "22P02", message: message}} = error} ->
104106
context = """
@@ -121,6 +123,7 @@ if Code.ensure_loaded?(Postgrex) do
121123

122124
@impl true
123125
def query(conn, sql, params, opts) do
126+
ensure_list_params!(params)
124127
Postgrex.query(conn, sql, params, opts)
125128
end
126129

@@ -131,6 +134,8 @@ if Code.ensure_loaded?(Postgrex) do
131134

132135
@impl true
133136
def execute(conn, %{ref: ref} = query, params, opts) do
137+
ensure_list_params!(params)
138+
134139
case Postgrex.execute(conn, query, params, opts) do
135140
{:ok, %{ref: ^ref}, result} ->
136141
{:ok, result}
@@ -151,9 +156,16 @@ if Code.ensure_loaded?(Postgrex) do
151156

152157
@impl true
153158
def stream(conn, sql, params, opts) do
159+
ensure_list_params!(params)
154160
Postgrex.stream(conn, sql, params, opts)
155161
end
156162

163+
defp ensure_list_params!(params) do
164+
unless is_list(params) do
165+
raise ArgumentError, "expected params to be a list, got: #{inspect(params)}"
166+
end
167+
end
168+
157169
@parent_as __MODULE__
158170
alias Ecto.Query.{BooleanExpr, ByExpr, JoinExpr, QueryExpr, WithExpr}
159171

lib/ecto/adapters/sql.ex

+23-6
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,8 @@ defmodule Ecto.Adapters.SQL do
102102
optional(atom) => any
103103
}
104104

105+
@type query_params :: [term] | %{(atom | String.t()) => term}
106+
105107
@doc false
106108
defmacro __using__(opts) do
107109
quote do
@@ -335,7 +337,7 @@ defmodule Ecto.Adapters.SQL do
335337
336338
"""
337339
@spec to_sql(:all | :update_all | :delete_all, Ecto.Repo.t(), Ecto.Queryable.t()) ::
338-
{String.t(), [term]}
340+
{String.t(), query_params}
339341
def to_sql(kind, repo, queryable) do
340342
case Ecto.Adapter.Queryable.prepare_query(kind, repo, queryable) do
341343
{{:cached, _update, _reset, {_id, cached}}, params} ->
@@ -510,7 +512,7 @@ defmodule Ecto.Adapters.SQL do
510512
[%{rows: [[42]], num_rows: 1}]
511513
512514
"""
513-
@spec stream(Ecto.Repo.t(), String.t(), [term], Keyword.t()) :: Enum.t()
515+
@spec stream(Ecto.Repo.t(), String.t(), query_params, Keyword.t()) :: Enum.t()
514516
def stream(repo, sql, params \\ [], opts \\ []) do
515517
repo
516518
|> Ecto.Adapter.lookup_meta()
@@ -520,7 +522,12 @@ defmodule Ecto.Adapters.SQL do
520522
@doc """
521523
Same as `query/4` but raises on invalid queries.
522524
"""
523-
@spec query!(pid() | Ecto.Repo.t() | Ecto.Adapter.adapter_meta(), iodata, [term], Keyword.t()) ::
525+
@spec query!(
526+
pid() | Ecto.Repo.t() | Ecto.Adapter.adapter_meta(),
527+
iodata,
528+
query_params,
529+
Keyword.t()
530+
) ::
524531
query_result
525532
def query!(repo, sql, params \\ [], opts \\ []) do
526533
case query(repo, sql, params, opts) do
@@ -558,7 +565,12 @@ defmodule Ecto.Adapters.SQL do
558565
{:ok, %{rows: [[42]], num_rows: 1}}
559566
560567
"""
561-
@spec query(pid() | Ecto.Repo.t() | Ecto.Adapter.adapter_meta(), iodata, [term], Keyword.t()) ::
568+
@spec query(
569+
pid() | Ecto.Repo.t() | Ecto.Adapter.adapter_meta(),
570+
iodata,
571+
query_params,
572+
Keyword.t()
573+
) ::
562574
{:ok, query_result} | {:error, Exception.t()}
563575
def query(repo, sql, params \\ [], opts \\ [])
564576

@@ -573,7 +585,12 @@ defmodule Ecto.Adapters.SQL do
573585
@doc """
574586
Same as `query_many/4` but raises on invalid queries.
575587
"""
576-
@spec query_many!(Ecto.Repo.t() | Ecto.Adapter.adapter_meta(), iodata, [term], Keyword.t()) ::
588+
@spec query_many!(
589+
Ecto.Repo.t() | Ecto.Adapter.adapter_meta(),
590+
iodata,
591+
query_params,
592+
Keyword.t()
593+
) ::
577594
[query_result]
578595
def query_many!(repo, sql, params \\ [], opts \\ []) do
579596
case query_many(repo, sql, params, opts) do
@@ -614,7 +631,7 @@ defmodule Ecto.Adapters.SQL do
614631
@spec query_many(
615632
pid() | Ecto.Repo.t() | Ecto.Adapter.adapter_meta(),
616633
iodata,
617-
[term],
634+
query_params,
618635
Keyword.t()
619636
) :: {:ok, [query_result]} | {:error, Exception.t()}
620637
def query_many(repo, sql, params \\ [], opts \\ [])

lib/ecto/adapters/tds/connection.ex

+4
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,10 @@ if Code.ensure_loaded?(Tds) do
7979
def to_constraints(_, _opts), do: []
8080

8181
def prepare_params(params) do
82+
unless is_list(params) do
83+
raise ArgumentError, "expected params to be a list, got: #{inspect(params)}"
84+
end
85+
8286
{params, _} =
8387
Enum.map_reduce(params, 1, fn param, acc ->
8488
case prepare_param(param) do

0 commit comments

Comments
 (0)