Skip to content

Commit 5298909

Browse files
jamiibenesch
authored andcommitted
Support SELECT ALL
1 parent 4f944dd commit 5298909

File tree

3 files changed

+28
-1
lines changed

3 files changed

+28
-1
lines changed

src/sqlast/query.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ impl ToString for SQLSetOperator {
9696
/// to a set operation like `UNION`.
9797
#[derive(Debug, Clone, PartialEq)]
9898
pub struct SQLSelect {
99+
pub all: bool,
99100
pub distinct: bool,
100101
/// projection expressions
101102
pub projection: Vec<SQLSelectItem>,
@@ -114,7 +115,8 @@ pub struct SQLSelect {
114115
impl ToString for SQLSelect {
115116
fn to_string(&self) -> String {
116117
let mut s = format!(
117-
"SELECT{} {}",
118+
"SELECT{}{} {}",
119+
if self.all { " ALL" } else { "" },
118120
if self.distinct { " DISTINCT" } else { "" },
119121
comma_separated_string(&self.projection)
120122
);

src/sqlparser.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1300,7 +1300,11 @@ impl Parser {
13001300
/// Parse a restricted `SELECT` statement (no CTEs / `UNION` / `ORDER BY`),
13011301
/// assuming the initial `SELECT` was already consumed
13021302
pub fn parse_select(&mut self) -> Result<SQLSelect, ParserError> {
1303+
let all = self.parse_keyword("ALL");
13031304
let distinct = self.parse_keyword("DISTINCT");
1305+
if all && distinct {
1306+
return parser_err!("Cannot specify both ALL and DISTINCT in SELECT");
1307+
}
13041308
let projection = self.parse_select_list()?;
13051309

13061310
let (relation, joins) = if self.parse_keyword("FROM") {
@@ -1330,6 +1334,7 @@ impl Parser {
13301334
};
13311335

13321336
Ok(SQLSelect {
1337+
all,
13331338
distinct,
13341339
projection,
13351340
selection,

tests/sqlparser_common.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,26 @@ fn parse_select_distinct() {
135135
);
136136
}
137137

138+
#[test]
139+
fn parse_select_all() {
140+
let sql = "SELECT ALL name FROM customer";
141+
let select = verified_only_select(sql);
142+
assert_eq!(false, select.distinct);
143+
assert_eq!(
144+
&SQLSelectItem::UnnamedExpression(ASTNode::SQLIdentifier("name".to_string())),
145+
only(&select.projection)
146+
);
147+
}
148+
149+
#[test]
150+
fn parse_select_all_distinct() {
151+
let result = parse_sql_statements("SELECT ALL DISTINCT name FROM customer");
152+
assert_eq!(
153+
ParserError::ParserError("Cannot specify both ALL and DISTINCT in SELECT".to_string()),
154+
result.unwrap_err(),
155+
);
156+
}
157+
138158
#[test]
139159
fn parse_select_wildcard() {
140160
let sql = "SELECT * FROM foo";

0 commit comments

Comments
 (0)