From f2d4f91273d1644b51f83dae0f1954ab70267026 Mon Sep 17 00:00:00 2001 From: lovasoa Date: Wed, 14 Feb 2024 13:57:42 +0100 Subject: [PATCH 1/6] accept JSON_TABLE both as an unquoted table name and a table-valued function see https://github.com/sqlparser-rs/sqlparser-rs/pull/1123#issuecomment-1943607093 --- src/parser/mod.rs | 6 +++++- tests/sqlparser_postgres.rs | 20 ++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/parser/mod.rs b/src/parser/mod.rs index 210d157d1..c2397c74a 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -7515,7 +7515,11 @@ impl<'a> Parser<'a> { with_offset, with_offset_alias, }) - } else if self.parse_keyword(Keyword::JSON_TABLE) { + } else if matches!( + self.peek_token().token, Token::Word(w) + if w.keyword == Keyword::JSON_TABLE && self.peek_nth_token(1).token == Token::LParen + ) { + self.expect_keyword(Keyword::JSON_TABLE)?; self.expect_token(&Token::LParen)?; let json_expr = self.parse_expr()?; self.expect_token(&Token::Comma)?; diff --git a/tests/sqlparser_postgres.rs b/tests/sqlparser_postgres.rs index 45a3dbed2..8257ecd52 100644 --- a/tests/sqlparser_postgres.rs +++ b/tests/sqlparser_postgres.rs @@ -2328,6 +2328,26 @@ fn test_json() { ); } +#[test] +fn parse_json_table_is_not_reserved() { + // JSON_TABLE is not a reserved keyword in PostgreSQL, even though it is in SQL:2023 + // see: https://en.wikipedia.org/wiki/List_of_SQL_reserved_words + match pg().verified_only_select("SELECT * FROM JSON_TABLE") { + Select { from, .. } => { + assert_eq!(1, from.len()); + match &from[0].relation { + TableFactor::Table { + name: ObjectName(name), + .. + } => { + assert_eq!("JSON_TABLE", name[0].value); + } + _ => unreachable!(), + } + } + } +} + #[test] fn test_composite_value() { let sql = "SELECT (on_hand.item).name FROM on_hand WHERE (on_hand.item).price > 9"; From 72add932847c439821e181532ac0a1135cb04447 Mon Sep 17 00:00:00 2001 From: lovasoa Date: Wed, 14 Feb 2024 14:03:03 +0100 Subject: [PATCH 2/6] clippy fix --- tests/sqlparser_postgres.rs | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/tests/sqlparser_postgres.rs b/tests/sqlparser_postgres.rs index 8257ecd52..e00947c1a 100644 --- a/tests/sqlparser_postgres.rs +++ b/tests/sqlparser_postgres.rs @@ -2332,19 +2332,16 @@ fn test_json() { fn parse_json_table_is_not_reserved() { // JSON_TABLE is not a reserved keyword in PostgreSQL, even though it is in SQL:2023 // see: https://en.wikipedia.org/wiki/List_of_SQL_reserved_words - match pg().verified_only_select("SELECT * FROM JSON_TABLE") { - Select { from, .. } => { - assert_eq!(1, from.len()); - match &from[0].relation { - TableFactor::Table { - name: ObjectName(name), - .. - } => { - assert_eq!("JSON_TABLE", name[0].value); - } - _ => unreachable!(), - } + let Select { from, .. } = pg().verified_only_select("SELECT * FROM JSON_TABLE"); + assert_eq!(1, from.len()); + match &from[0].relation { + TableFactor::Table { + name: ObjectName(name), + .. + } => { + assert_eq!("JSON_TABLE", name[0].value); } + _ => unreachable!(), } } From 7d81b03d0f1571f414e187d947a06660ad9cb558 Mon Sep 17 00:00:00 2001 From: lovasoa Date: Wed, 14 Feb 2024 14:04:19 +0100 Subject: [PATCH 3/6] fmt --- tests/sqlparser_postgres.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tests/sqlparser_postgres.rs b/tests/sqlparser_postgres.rs index e00947c1a..1d64a7daf 100644 --- a/tests/sqlparser_postgres.rs +++ b/tests/sqlparser_postgres.rs @@ -2338,9 +2338,7 @@ fn parse_json_table_is_not_reserved() { TableFactor::Table { name: ObjectName(name), .. - } => { - assert_eq!("JSON_TABLE", name[0].value); - } + } => assert_eq!("JSON_TABLE", name[0].value), _ => unreachable!(), } } From 37e6b8100bc7afc3a6f96526ea46a145f8c6bc9f Mon Sep 17 00:00:00 2001 From: lovasoa Date: Wed, 14 Feb 2024 14:05:33 +0100 Subject: [PATCH 4/6] better error message --- tests/sqlparser_postgres.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/sqlparser_postgres.rs b/tests/sqlparser_postgres.rs index 1d64a7daf..60e200b0a 100644 --- a/tests/sqlparser_postgres.rs +++ b/tests/sqlparser_postgres.rs @@ -2339,7 +2339,7 @@ fn parse_json_table_is_not_reserved() { name: ObjectName(name), .. } => assert_eq!("JSON_TABLE", name[0].value), - _ => unreachable!(), + _ => panic!("Expected JSON_TABLE to be parsed as a table name"), } } From cf5acf57d69a2bd610ce365c7f2df2b371e105d2 Mon Sep 17 00:00:00 2001 From: lovasoa Date: Wed, 14 Feb 2024 18:25:54 +0100 Subject: [PATCH 5/6] test json_table as a table name in the generic dialect --- tests/sqlparser_postgres.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/sqlparser_postgres.rs b/tests/sqlparser_postgres.rs index 60e200b0a..b5a51492a 100644 --- a/tests/sqlparser_postgres.rs +++ b/tests/sqlparser_postgres.rs @@ -2332,7 +2332,7 @@ fn test_json() { fn parse_json_table_is_not_reserved() { // JSON_TABLE is not a reserved keyword in PostgreSQL, even though it is in SQL:2023 // see: https://en.wikipedia.org/wiki/List_of_SQL_reserved_words - let Select { from, .. } = pg().verified_only_select("SELECT * FROM JSON_TABLE"); + let Select { from, .. } = pg_and_generic().verified_only_select("SELECT * FROM JSON_TABLE"); assert_eq!(1, from.len()); match &from[0].relation { TableFactor::Table { From c0728bd061146977c6cb41f1f0c4e93cce32eaf1 Mon Sep 17 00:00:00 2001 From: lovasoa Date: Wed, 14 Feb 2024 19:01:03 +0100 Subject: [PATCH 6/6] better assertion message --- tests/sqlparser_postgres.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/sqlparser_postgres.rs b/tests/sqlparser_postgres.rs index b5a51492a..c987822b8 100644 --- a/tests/sqlparser_postgres.rs +++ b/tests/sqlparser_postgres.rs @@ -2339,7 +2339,7 @@ fn parse_json_table_is_not_reserved() { name: ObjectName(name), .. } => assert_eq!("JSON_TABLE", name[0].value), - _ => panic!("Expected JSON_TABLE to be parsed as a table name"), + other => panic!("Expected JSON_TABLE to be parsed as a table name, but got {other:?}"), } }