Skip to content

Ecto.Adapters.SQL.query/4 does not set correct type for parameters. #119

@CaldwellYSR

Description

@CaldwellYSR

Crossposting from Ecto_SQL: issue#302

Environment

  • Elixir version (elixir -v): 1.10.4
  • Database and version (PostgreSQL 9.4, MongoDB 3.2, etc.): Microsoft SQL Server 2012 (SP4-GDR) (KB4057116) 11.0.7462.6 (X64) Jan 5 2018 22:11:56
  • Ecto version (mix deps): 3.4.5
  • Database adapter and version (mix deps): TDS 2.1.1
  • Operating system: Elixir:1.10.4 Docker Container

Current behavior

We are passing in a string param to be declared as a varchar and Tds seems to think it is money.

iex(32)> Rossi.Repo.query("declare @RaceDate varchar; set @RaceDate = $1; select @RaceDate;", ["somegarbage"], timeout: 480_000)
[debug] QUERY ERROR db=95.1ms queue=46.0ms idle=1416.4ms
declare @RaceDate varchar; set @RaceDate = $1; select @RaceDate; ["somegarbage"]
{:error,                            
 %Tds.Error{ 
   message: nil,
   mssql: %{
     class: 16,                                                                                                                                                                                                      
     line_number: 1,
     msg_text: "There is insufficient result space to convert a money value to varchar.",
     number: 234,
     proc_name: "",
     server_name: "EC2AMAZ-AHVHNC0",
     state: 2
   }
 }}

When passing a string into a variable expecting a smalldatetime it's returning 1 row but then rows shows as nil.

iex(29)> Rossi.Repo.query("declare @RaceDate smalldatetime; set @RaceDate = $1; select @RaceDate;", ["somegarbage"], timeout: 480_000)
[debug] QUERY OK db=91.3ms queue=60.6ms idle=1305.5ms 
declare @RaceDate smalldatetime; set @RaceDate = $1; select @RaceDate; ["somegarbage"]
{:ok, %Tds.Result{columns: nil, num_rows: 1, rows: nil}}

Expected behavior

With Rossi.Repo using Ecto.Adapters.Tds we would expect the following to respond with the parameter input.

iex(32)> Rossi.Repo.query("declare @RaceDate varchar; set @RaceDate = $1; select @RaceDate;", ["somegarbage"], timeout: 480_000)
[debug] QUERY ERROR db=95.1ms queue=46.0ms idle=1416.4ms
declare @RaceDate varchar; set @RaceDate = $1; select @RaceDate; ["somegarbage"]
{:ok,                            
 %Tds.Result{ 
   columns: 1,
   num_rows: 1,
   rows: ["somegarbage"]
 }}

Then we would expect the follow to respond with some type of error.

iex(29)> Rossi.Repo.query("declare @RaceDate smalldatetime; set @RaceDate = $1; select @RaceDate;", ["somegarbage"], timeout: 480_000)
[debug] QUERY OK db=91.3ms queue=60.6ms idle=1305.5ms 
declare @RaceDate smalldatetime; set @RaceDate = $1; select @RaceDate; ["somegarbage"]
{:error, %Tds.Error{mssql: %{
    msg_text: "Something about data types not lining up"
  }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions