@@ -668,6 +668,45 @@ fn parse_select_with_table_alias() {
668
668
);
669
669
}
670
670
671
+ #[test]
672
+ fn parse_select_with_table_alias_keyword() {
673
+ // note: DECLARE isn't included in RESERVED_FOR_TABLE_ALIAS
674
+ let table_alias_non_reserved_keyword = "SELECT a FROM lineitem DECLARE";
675
+ let statements = all_dialects_requiring_semicolon_statement_delimiter()
676
+ .parse_sql_statements(table_alias_non_reserved_keyword)
677
+ .unwrap();
678
+ assert_eq!(1, statements.len());
679
+ assert_eq!(
680
+ ParserError::ParserError("Expected: identifier, found: EOF".to_string()),
681
+ all_dialects_not_requiring_semicolon_statement_delimiter()
682
+ .parse_sql_statements(table_alias_non_reserved_keyword)
683
+ .unwrap_err()
684
+ );
685
+
686
+ let table_alias_quoted_keyword = "SELECT a FROM lineitem \"DECLARE\"";
687
+ let statements = all_dialects()
688
+ .parse_sql_statements(table_alias_quoted_keyword)
689
+ .unwrap();
690
+ assert_eq!(1, statements.len());
691
+ }
692
+
693
+ #[test]
694
+ fn parse_consecutive_queries() {
695
+ let select_then_exec = "SELECT * FROM deleted; EXECUTE my_sp 'some', 'params'";
696
+ let _ = all_dialects()
697
+ .parse_sql_statements(select_then_exec)
698
+ .unwrap();
699
+ let _ = all_dialects_not_requiring_semicolon_statement_delimiter()
700
+ .statements_without_semicolons_parse_to(select_then_exec, "");
701
+
702
+ let select_then_update = "SELECT 1 FROM x; UPDATE y SET z = 1";
703
+ let _ = all_dialects()
704
+ .parse_sql_statements(select_then_update)
705
+ .unwrap();
706
+ let _ = all_dialects_not_requiring_semicolon_statement_delimiter()
707
+ .statements_without_semicolons_parse_to(select_then_update, "");
708
+ }
709
+
671
710
#[test]
672
711
fn parse_analyze() {
673
712
verified_stmt("ANALYZE TABLE test_table");
@@ -934,7 +973,18 @@ fn parse_limit() {
934
973
935
974
#[test]
936
975
fn parse_invalid_limit_by() {
937
- assert_err_parse_statements("SELECT * FROM user BY name", "name");
976
+ assert_eq!(
977
+ ParserError::ParserError("Expected: end of statement, found: name".to_string()),
978
+ all_dialects_requiring_semicolon_statement_delimiter()
979
+ .parse_sql_statements("SELECT * FROM user BY name")
980
+ .unwrap_err()
981
+ );
982
+ assert_eq!(
983
+ ParserError::ParserError("Expected: an SQL statement, found: BY".to_string()),
984
+ all_dialects_not_requiring_semicolon_statement_delimiter()
985
+ .parse_sql_statements("SELECT * FROM user BY name")
986
+ .unwrap_err()
987
+ );
938
988
}
939
989
940
990
#[test]
@@ -11003,7 +11053,9 @@ fn parse_select_table_with_index_hints() {
11003
11053
11004
11054
// Test that dialects that don't support table hints will keep parsing the USE as table alias
11005
11055
let sql = "SELECT * FROM T USE LIMIT 1";
11006
- let unsupported_dialects = all_dialects_where(|d| !d.supports_table_hints());
11056
+ let unsupported_dialects = all_dialects_where(|d| {
11057
+ !d.supports_table_hints() && !d.supports_statements_without_semicolon_delimiter()
11058
+ });
11007
11059
let select = unsupported_dialects
11008
11060
.verified_only_select_with_canonical(sql, "SELECT * FROM T AS USE LIMIT 1");
11009
11061
assert_eq!(
0 commit comments