From 0f962db60b464d4e2fc4918c3ea0ba5cd59f72f6 Mon Sep 17 00:00:00 2001 From: Jovansonlee Cesar Date: Thu, 21 Sep 2017 20:40:03 +0800 Subject: [PATCH 1/2] Select statement can have multiple table --- src/grammar/statement/select.rs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/grammar/statement/select.rs b/src/grammar/statement/select.rs index 88c480b..1d37589 100644 --- a/src/grammar/statement/select.rs +++ b/src/grammar/statement/select.rs @@ -5,7 +5,7 @@ use grammar::{Buffer, Clause, Condition, Expression, Statement}; /// A `SELECT` statement. #[derive(Debug, Default)] pub struct Select { - table: Option, + table: Vec, columns: Option>, so_that: Option, order_by: Option, @@ -21,7 +21,7 @@ impl Select { /// Set the table. pub fn table(mut self, name: T) -> Self { - self.table = Some(name.to_string()); + self.table.push(name.to_string()); self } @@ -80,7 +80,11 @@ impl Statement for Select { buffer.push("*"); } buffer.push("FROM"); - buffer.push(format!("`{}`", some!(self.table))); + let mut do_comma = false; + for table in &self.table{ + if do_comma{ buffer.push(",");} else{do_comma=true;} + buffer.push(format!("`{}`", table)); + } if let &Some(ref clause) = &self.so_that { buffer.push(try!(clause.compile())); } From de09d4185026a0562378074684a96a9f234d4bfa Mon Sep 17 00:00:00 2001 From: Jovansonlee Cesar Date: Thu, 21 Sep 2017 22:11:16 +0800 Subject: [PATCH 2/2] Make a new macro name first! for use in multiple table Select statement --- src/grammar/mod.rs | 13 +++++++++++++ src/grammar/statement/select.rs | 17 +++++++++++------ 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/grammar/mod.rs b/src/grammar/mod.rs index a4275e8..315f073 100644 --- a/src/grammar/mod.rs +++ b/src/grammar/mod.rs @@ -103,6 +103,19 @@ macro_rules! some( ); ); + +macro_rules! first( + ($arr:expr, $name:expr) => ( + match $arr.first() { + Some(ref value) => value, + _ => raise!(concat!("expected “", stringify!($name), "” to have at least 1 specified")), + } + ); + ($this:ident.$field:ident) => ( + first!($this.$field, $field) + ); +); + macro_rules! push( ($collection:expr, $value:expr) => ( match $collection { diff --git a/src/grammar/statement/select.rs b/src/grammar/statement/select.rs index 1d37589..c32965e 100644 --- a/src/grammar/statement/select.rs +++ b/src/grammar/statement/select.rs @@ -5,7 +5,7 @@ use grammar::{Buffer, Clause, Condition, Expression, Statement}; /// A `SELECT` statement. #[derive(Debug, Default)] pub struct Select { - table: Vec, + tables: Vec, columns: Option>, so_that: Option, order_by: Option, @@ -21,7 +21,7 @@ impl Select { /// Set the table. pub fn table(mut self, name: T) -> Self { - self.table.push(name.to_string()); + self.tables.push(name.to_string()); self } @@ -80,10 +80,9 @@ impl Statement for Select { buffer.push("*"); } buffer.push("FROM"); - let mut do_comma = false; - for table in &self.table{ - if do_comma{ buffer.push(",");} else{do_comma=true;} - buffer.push(format!("`{}`", table)); + buffer.push(format!("`{}`", first!(self.tables) )); + for table in self.tables.iter().skip(1){ + buffer.push(format!(",`{}`", table)); } if let &Some(ref clause) = &self.so_that { buffer.push(try!(clause.compile())); @@ -108,6 +107,12 @@ mod tests { assert_eq!(statement.compile().unwrap(), "SELECT * FROM `foo`"); } + #[test] + fn multiple_tables() { + let statement = select_from("foo").table("bar"); + assert_eq!(statement.compile().unwrap(), "SELECT * FROM `foo` ,`bar`"); + } + #[test] fn columns() { let statement = select_from("foo").columns(&["bar", "baz"]);