fix get_column_name() when column name doesn't exist

This commit is contained in:
meteorgan
2025-07-25 23:47:25 +08:00
parent e0e3c52535
commit b5a18d7dc9
5 changed files with 22 additions and 17 deletions

View File

@@ -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 {

View File

@@ -119,7 +119,7 @@ impl ToSqlContext for EmptyContext {
&self,
_table_id: turso_sqlite3_parser::ast::TableInternalId,
_col_idx: usize,
) -> &str {
) -> String {
unreachable!()
}

View File

@@ -89,8 +89,8 @@ impl<T: fmt::Write> 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)?;

View File

@@ -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 {

View File

@@ -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!()
}