0

I am trying to read the results from a SQL query, iterate over the returned Vector, and transform the Row into a domain object. I'm passing the row by reference, so I am not sure where the temporary value is being returned back from the function.

What am I doing wrong here?

use postgres::{Client, Error, Row}; // 0.17.1

#[derive(Debug)]
pub struct SomeTable<'a> {
    id: i32,
    value: &'a str,
}

impl SomeTable<'_> {
    pub fn new(row: &Row) -> Result<SomeTable, Error> {
        let id_value: i32 = match row.try_get(0) {
            Ok(n) => n,
            Err(e) => return Err(e),
        };

        let some_value: &str = match row.try_get(1) {
            Ok(n) => n,
            Err(e) => return Err(e),
        };

        Ok(SomeTable {
            id: id_value,
            value: some_value,
        })
    }
}

pub fn get_values(client: &mut Client, value: String) -> Result<Vec<SomeTable>, Error> {
    let mut vec = Vec::new();

    let results = client
        .query("select * from some_table where value=$1", &[&value])?
        .iter();

    for row in results {
        let details = SomeTable::new(&row)?;
        vec.push(details);
    }

    Ok(vec)
}

I keep getting this error

error[E0515]: cannot return value referencing temporary value
  --> src/lib.rs:40:5
   |
31 |       let results = client
   |  ___________________-
32 | |         .query("select * from some_table where value=$1", &[&value])?
   | |_____________________________________________________________________- temporary value created here
...
40 |       Ok(vec)
   |       ^^^^^^^ returns a value referencing data owned by the current function
Shepmaster
  • 388,571
  • 95
  • 1,107
  • 1,366
  • Your `SomeTable` contains a reference to data owned by `results`. You are attempting to return that reference outside of `get_values`, but leaving `get_values` will cause the data to be deallocated. Rust has prevented you from introducing memory unsafety. – Shepmaster Feb 25 '20 at 01:30
  • 1
    The duplicates (and other fixes) [applied to your code](https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=eef2455df137ab3a96d63084bd6a33a3). – Shepmaster Feb 25 '20 at 01:32

0 Answers0