tursodatabase / tursodatabase/libsql
Prepared queries do not pass parameters correctly
Open
Nobody has claimed this yet.
- Dominant language
- C
- Stars
- 17.2k
- Forks
- 531
- Avg merge
- 1h 12m
- Merged PRs (30d)
- 1
Description
A reproducing example:
use libsql::Builder;
#[tokio::main]
async fn main() {
let database = Builder::new_local(":memory:").build().await.unwrap();
let connection = database.connect().unwrap();
connection
.execute("CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)", ())
.await
.unwrap();
let insert_user = connection
.prepare("INSERT INTO users (id, name) VALUES (?,?)")
.await
.unwrap();
insert_user.execute((1, "John Doe")).await.unwrap();
insert_user.execute((2, "Jane Doe")).await.unwrap(); // Error: UNIQUE constraint failed: users.id
}
If removing the unique constraint, and querying the table, one can also see, that the second insert statement indeed inserts using a 1 for the id.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by running the Rust reproducer against an in-memory database and verify the bound values for both prepared INSERT executions. Trace the prepared-query parameter binding and compare the first and second calls. Done means the second insert stores id 2 and name Jane Doe without a uniqueness error.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- rust, sqlite
- Domain
- databases
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 48/100