Skip to content

Binding signed/unsigned integer causes different results #313

Closed

Description

@rongcuid

For instance a query like so:

SELECT * FROM table WHERE x = ?

Binding 0x1000 (which is UInt16) and Int(0x1000) yield different results.

Activity

  1. metab0t commented on Nov 30, 2022

    @metab0t
    Collaborator

    Please give a reproducible example.

  2. rongcuid commented on Nov 30, 2022

    @rongcuid
    Author
    db = SQLite.DB()
    DBInterface.execute(db, "CREATE TABLE t(x INTEGER)")
    DBInterface.execute(db, "INSERT INTO t(x) VALUES (1000)")

    Then:

    julia> using DataFrames
    
    julia> DBInterface.execute(db, "SELECT * FROM t WHERE x  = 1000") |> DataFrame
    1×1 DataFrame
     Row │ x     
         │ Int64 
    ─────┼───────
       1 │  1000
    
    julia> DBInterface.execute(db, "SELECT * FROM t WHERE x  = ?", (1000,)) |> DataFrame
    1×1 DataFrame
     Row │ x     
         │ Int64 
    ─────┼───────
       1 │  1000
    
    julia> DBInterface.execute(db, "SELECT * FROM t WHERE x  = ?", (UInt16(1000),)) |> DataFrame
    0×1 DataFrame
     Row │ x      
         │ Int64? 
    ─────┴────────
    julia> DBInterface.execute(db, "SELECT * FROM t WHERE x  = ?", (UInt32(1000),)) |> DataFrame
    0×1 DataFrame
     Row │ x      
         │ Int64? 
    ─────┴────────
    
    julia> DBInterface.execute(db, "SELECT * FROM t WHERE x  = ?", (UInt64(1000),)) |> DataFrame
    0×1 DataFrame
     Row │ x      
         │ Int64? 
    ─────┴────────
    
  3. quinnj commented on Nov 30, 2022

    @quinnj
    Member

    I think this is because we don't have a direct dispatch for UInt types, so they go through the fallback which does the full serialize(x) and bound as blobs. We should probably have a fallback for Integer that converts to Int64 and does the bind, though that may mean we get a weird truncation issue for some UInt64. Or maybe we explicitly error and say you can only bind signed integers since sqlite doesn't ahve explicit bind functions for unsigned.

  4. Zentrik commented on Jun 21, 2024

    @Zentrik

    This also seems to be an issue if you load a DataFrame with UInt64s in it into a database. Everything works fine on Julia, but sqlite3 and other libraries see a string.

  5. quinnj commented on Sep 30, 2026

    @quinnj
    Member

    Fixed on master by #356: integer parameters of any width now bind as SQLite integers, so WHERE x = ? with UInt16(1000) matches, and load! stores UInt64 columns as integers. Values SQLite can't represent, like typemax(UInt64), throw InexactError instead of being stored as blobs. This ships in the next release (1.9.0).

  6. added a commit that references this issue on Sep 30, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions