Skip to content

Impossible to create multiple prepared statements at onceΒ #46

@weiznich

Description

@weiznich

I would expect that it's possible to create multiple prepared statements for a single connection at once like following:

fn check<'a>(
    conn: &'a mut (dyn Connection + 'static),
) -> (
    Rc<RefCell<dyn Statement + 'a>>,
    Rc<RefCell<dyn Statement + 'a>>,
) {
    let a = conn.prepare("SELECT name, id FROM users").unwrap();
    let b = conn.prepare("SELECT name, id FROM posts").unwrap();

    (a, b)
}

This fails because to create a prepared statement it is required to borrow the connection mutably, which implies that you can only create one prepared statement per connection at one point in time.
This disallows common patterns like a prepared statement cache.

Error message:

error[E0499]: cannot borrow `*conn` as mutable more than once at a time
  --> src/main.rs:16:13
   |
9  | fn check<'a>(
   |          -- lifetime `'a` defined here
...
15 |     let a = conn.prepare("SELECT name, id FROM users").unwrap();
   |             ---- first mutable borrow occurs here
16 |     let b = conn.prepare("SELECT name, id FROM posts").unwrap();
   |             ^^^^ second mutable borrow occurs here
17 | 
18 |     (a, b)
   |     ------ returning this value requires that `*conn` is borrowed for `'a`

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