From 5175443c76ef38337a423e8bba22c75480f59bf8 Mon Sep 17 00:00:00 2001 From: Fedomn Date: Fri, 7 Oct 2022 11:11:08 +0800 Subject: [PATCH] feat(alias): support alias table Signed-off-by: Fedomn --- src/binder/expression/mod.rs | 6 +++++- src/binder/table/mod.rs | 21 +++++++++++++++------ tests/slt/alias.slt | 26 ++++++++++++++++++++++++++ 3 files changed, 46 insertions(+), 7 deletions(-) diff --git a/src/binder/expression/mod.rs b/src/binder/expression/mod.rs index d68102c..9dc9741 100644 --- a/src/binder/expression/mod.rs +++ b/src/binder/expression/mod.rs @@ -142,7 +142,11 @@ impl Binder { if let Some(table) = table_name { // handle table.col syntax - let table_catalog = self.context.tables.get(table).unwrap(); + let table_catalog = self + .context + .tables + .get(table) + .ok_or_else(|| BindError::InvalidTable(table.clone()))?; let column_catalog = table_catalog .get_column_by_name(column_name) .ok_or_else(|| BindError::InvalidColumn(column_name.clone()))?; diff --git a/src/binder/table/mod.rs b/src/binder/table/mod.rs index 266b7a4..da626fe 100644 --- a/src/binder/table/mod.rs +++ b/src/binder/table/mod.rs @@ -88,7 +88,7 @@ impl Binder { pub fn bind_table_ref(&mut self, table: &TableFactor) -> Result { match table { - TableFactor::Table { name, alias: _, .. } => { + TableFactor::Table { name, alias, .. } => { // ObjectName internal items: db.schema.table let (_database, _schema, table) = match name.0.as_slice() { [table] => ( @@ -114,18 +114,27 @@ impl Binder { .catalog .get_table_by_name(table) .ok_or_else(|| BindError::InvalidTable(table_name.clone()))?; - self.context - .tables - .insert(table_name, table_catalog.clone()); - + if let Some(alias) = alias { + let table_alias = alias.to_string().to_lowercase(); + self.context + .tables + .insert(table_alias, table_catalog.clone()); + } else { + self.context + .tables + .insert(table_name, table_catalog.clone()); + } Ok(BoundTableRef::Table(table_catalog)) } TableFactor::Derived { lateral: _, subquery, - alias: _, + alias, } => { let table = self.bind_select(subquery)?; + if let Some(alias) = alias { + todo!("alias for subquery {}", alias) + } Ok(BoundTableRef::Subquery(Box::new(table))) } _other => panic!("unsupported table factor: {:?}", _other), diff --git a/tests/slt/alias.slt b/tests/slt/alias.slt index 4d0f46a..620044b 100644 --- a/tests/slt/alias.slt +++ b/tests/slt/alias.slt @@ -1,3 +1,4 @@ +# expression alias query I select a as c1 from t1 order by c1 desc limit 1; ---- @@ -14,3 +15,28 @@ select sum(b) as c1, a as c2 from t1 group by c2 order by c1 desc; 15 2 5 1 4 0 + +# table alias +query I +select t.a from t1 t where t.b > 1 order by t.a desc limit 1; +---- +2 + +query I +select sum(t.a) as c1 from t1 as t +---- +5 + +query I +select t.* from t1 t where t.b > 1 order by t.a desc limit 1; +---- +2 7 9 + +query I +select t_1.a from t1 t_1 left join t2 t_2 on t_1.a=t_2.b and t_1.c > t_2.c; +---- +2 +2 +0 +1 +2