Skip to content

Commit a6e9efa

Browse files
committed
Merge branch 'select-all' into visitor
2 parents 676d832 + 5298909 commit a6e9efa

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
@@ -1383,7 +1383,11 @@ impl Parser {
13831383
/// Parse a restricted `SELECT` statement (no CTEs / `UNION` / `ORDER BY`),
13841384
/// assuming the initial `SELECT` was already consumed
13851385
pub fn parse_select(&mut self) -> Result<SQLSelect, ParserError> {
1386+
let all = self.parse_keyword("ALL");
13861387
let distinct = self.parse_keyword("DISTINCT");
1388+
if all && distinct {
1389+
return parser_err!("Cannot specify both ALL and DISTINCT in SELECT");
1390+
}
13871391
let projection = self.parse_select_list()?;
13881392

13891393
let (relation, joins) = if self.parse_keyword("FROM") {
@@ -1413,6 +1417,7 @@ impl Parser {
14131417
};
14141418

14151419
Ok(SQLSelect {
1420+
all,
14161421
distinct,
14171422
projection,
14181423
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)