mirror of
https://github.com/aljazceru/turso.git
synced 2026-02-23 00:45:37 +01:00
fix get_column_name() when column name doesn't exist
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -119,7 +119,7 @@ impl ToSqlContext for EmptyContext {
|
||||
&self,
|
||||
_table_id: turso_sqlite3_parser::ast::TableInternalId,
|
||||
_col_idx: usize,
|
||||
) -> &str {
|
||||
) -> String {
|
||||
unreachable!()
|
||||
}
|
||||
|
||||
|
||||
@@ -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)?;
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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!()
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user