diff --git a/core/translate/display.rs b/core/translate/display.rs index 295a3dc86..73878f771 100644 --- a/core/translate/display.rs +++ b/core/translate/display.rs @@ -1,6 +1,5 @@ use core::fmt; use std::fmt::{Display, Formatter}; - use turso_sqlite3_parser::{ ast::{ self, @@ -237,19 +236,17 @@ pub struct PlanContext<'a>(pub &'a [&'a TableReferences]); // Definitely not perfect yet impl ToSqlContext for PlanContext<'_> { - fn get_column_name(&self, table_id: TableInternalId, col_idx: usize) -> &str { + fn get_column_name(&self, table_id: TableInternalId, col_idx: usize) -> String { let table = self .0 .iter() - .map(|table_ref| table_ref.find_table_by_internal_id(table_id)) - .reduce(|accum, curr| match (accum, curr) { - (Some(table), _) | (_, Some(table)) => Some(table), - _ => None, - }) - .unwrap() + .find_map(|table_ref| table_ref.find_table_by_internal_id(table_id)) .unwrap(); let cols = table.columns(); - cols.get(col_idx).unwrap().name.as_ref().unwrap() + match cols.get(col_idx).unwrap().name.as_ref() { + None => format!("{col_idx}"), + Some(n) => n.to_string(), + } } fn get_table_name(&self, id: TableInternalId) -> &str { diff --git a/simulator/model/query/mod.rs b/simulator/model/query/mod.rs index 9950a93f1..38e44073e 100644 --- a/simulator/model/query/mod.rs +++ b/simulator/model/query/mod.rs @@ -119,7 +119,7 @@ impl ToSqlContext for EmptyContext { &self, _table_id: turso_sqlite3_parser::ast::TableInternalId, _col_idx: usize, - ) -> &str { + ) -> String { unreachable!() } diff --git a/vendored/sqlite3-parser/src/parser/ast/fmt.rs b/vendored/sqlite3-parser/src/parser/ast/fmt.rs index 17a1080b5..1a2d1b5c3 100644 --- a/vendored/sqlite3-parser/src/parser/ast/fmt.rs +++ b/vendored/sqlite3-parser/src/parser/ast/fmt.rs @@ -89,8 +89,8 @@ impl TokenStream for WriteTokenStream<'_, T> { struct BlankContext; impl ToSqlContext for BlankContext { - fn get_column_name(&self, _table_id: crate::ast::TableInternalId, _col_idx: usize) -> &str { - "" + fn get_column_name(&self, _table_id: crate::ast::TableInternalId, _col_idx: usize) -> String { + "".to_string() } fn get_table_name(&self, _id: crate::ast::TableInternalId) -> &str { @@ -758,7 +758,7 @@ impl ToTokens for Expr { Self::Column { table, column, .. } => { s.append(TK_ID, Some(context.get_table_name(*table)))?; s.append(TK_DOT, None)?; - s.append(TK_ID, Some(context.get_column_name(*table, *column))) + s.append(TK_ID, Some(&context.get_column_name(*table, *column))) } Self::InList { lhs, not, rhs } => { lhs.to_tokens_with_context(s, context)?; diff --git a/vendored/sqlite3-parser/src/to_sql_string/mod.rs b/vendored/sqlite3-parser/src/to_sql_string/mod.rs index 47004a96a..782cc8516 100644 --- a/vendored/sqlite3-parser/src/to_sql_string/mod.rs +++ b/vendored/sqlite3-parser/src/to_sql_string/mod.rs @@ -12,7 +12,7 @@ pub trait ToSqlContext { /// Currently not considering aliases fn get_table_name(&self, id: TableInternalId) -> &str; /// Given a table id and a column index, get the column name - fn get_column_name(&self, table_id: TableInternalId, col_idx: usize) -> &str; + fn get_column_name(&self, table_id: TableInternalId, col_idx: usize) -> String; } #[cfg(test)] @@ -22,8 +22,12 @@ mod tests { struct TestContext; impl ToSqlContext for TestContext { - fn get_column_name(&self, _table_id: crate::ast::TableInternalId, _col_idx: usize) -> &str { - "placeholder_column" + fn get_column_name( + &self, + _table_id: crate::ast::TableInternalId, + _col_idx: usize, + ) -> String { + "placeholder_column".to_string() } fn get_table_name(&self, _id: crate::ast::TableInternalId) -> &str { diff --git a/vendored/sqlite3-parser/src/to_sql_string/stmt/mod.rs b/vendored/sqlite3-parser/src/to_sql_string/stmt/mod.rs index 10d6af66f..b57396e57 100644 --- a/vendored/sqlite3-parser/src/to_sql_string/stmt/mod.rs +++ b/vendored/sqlite3-parser/src/to_sql_string/stmt/mod.rs @@ -54,7 +54,11 @@ mod tests { // Placeholders for compilation // Context only necessary parsing inside turso_core or in the simulator impl ToSqlContext for TestContext { - fn get_column_name(&self, _table_id: crate::ast::TableInternalId, _col_idx: usize) -> &str { + fn get_column_name( + &self, + _table_id: crate::ast::TableInternalId, + _col_idx: usize, + ) -> String { todo!() }