From 4d2b33432b02d51eaba025f0673ba3e3480604db Mon Sep 17 00:00:00 2001 From: lovasoa Date: Mon, 12 Feb 2024 18:10:17 +0100 Subject: [PATCH] add support for insert into select returning "insert into test select 1 returning 2" now parses correctly "select 1 as returning" which is valid in MySQL and used to parse without error still parses without error (and is now tested) "select 1 returning", which is a syntax error in postgres, sqlite and MariaDB, but is valid in MySQL, and SQL Server, used to parse without error, and now returns a syntax error. --- src/keywords.rs | 1 + tests/sqlparser_common.rs | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/src/keywords.rs b/src/keywords.rs index 2de36562f2..0794faf3f3 100644 --- a/src/keywords.rs +++ b/src/keywords.rs @@ -772,6 +772,7 @@ pub const RESERVED_FOR_COLUMN_ALIAS: &[Keyword] = &[ Keyword::INTERSECT, Keyword::CLUSTER, Keyword::DISTRIBUTE, + Keyword::RETURNING, // Reserved only as a column alias in the `SELECT` clause Keyword::FROM, Keyword::INTO, diff --git a/tests/sqlparser_common.rs b/tests/sqlparser_common.rs index 1d0923b4f4..bcded54da5 100644 --- a/tests/sqlparser_common.rs +++ b/tests/sqlparser_common.rs @@ -212,6 +212,25 @@ fn parse_insert_default_values() { ); } +#[test] +fn parse_insert_select_returning() { + verified_stmt("INSERT INTO t SELECT 1 RETURNING 2"); + let stmt = verified_stmt("INSERT INTO t SELECT x RETURNING x AS y"); + match stmt { + Statement::Insert { + returning: Some(ret), + source: Some(_), + .. + } => assert_eq!(ret.len(), 1), + _ => unreachable!(), + } +} + +#[test] +fn parse_returning_as_column_alias() { + verified_stmt("SELECT 1 AS RETURNING"); +} + #[test] fn parse_insert_sqlite() { let dialect = SQLiteDialect {};