diff --git a/.sqlx/query-aced4382cedbfc359bb1c1ab71cf2472fa8afc0b24bf02ee1bfdfdbf111acfc8.json b/.sqlx/query-aced4382cedbfc359bb1c1ab71cf2472fa8afc0b24bf02ee1bfdfdbf111acfc8.json index a32c84237..398f0ee20 100644 --- a/.sqlx/query-aced4382cedbfc359bb1c1ab71cf2472fa8afc0b24bf02ee1bfdfdbf111acfc8.json +++ b/.sqlx/query-aced4382cedbfc359bb1c1ab71cf2472fa8afc0b24bf02ee1bfdfdbf111acfc8.json @@ -67,7 +67,20 @@ "parameters": { "Left": [] }, - "nullable": [null, false, false, false, false, false, null, null, null, null, null, null] + "nullable": [ + null, + false, + false, + false, + false, + false, + null, + null, + null, + null, + null, + null + ] }, "hash": "aced4382cedbfc359bb1c1ab71cf2472fa8afc0b24bf02ee1bfdfdbf111acfc8" } diff --git a/crates/pgt_lexer/src/lexed.rs b/crates/pgt_lexer/src/lexed.rs index 6f0a273f9..08286bbfc 100644 --- a/crates/pgt_lexer/src/lexed.rs +++ b/crates/pgt_lexer/src/lexed.rs @@ -92,7 +92,7 @@ impl Lexed<'_> { } pub(crate) fn text_range(&self, i: usize) -> TextRange { - assert!(i < self.len()); + assert!(i < self.len() - 1); let lo = self.start[i]; let hi = self.start[i + 1]; TextRange::new(lo.into(), hi.into()) diff --git a/crates/pgt_statement_splitter/src/lib.rs b/crates/pgt_statement_splitter/src/lib.rs index c67bc0e97..eacd887b8 100644 --- a/crates/pgt_statement_splitter/src/lib.rs +++ b/crates/pgt_statement_splitter/src/lib.rs @@ -553,4 +553,12 @@ values ('insert', new.id, now());", "select\n email,\n\n\n from\n auth.users;", ]); } + + #[test] + fn does_not_panic_on_eof_expectation() { + Tester::from("insert").expect_errors(vec![SplitDiagnostic::new( + "Expected INTO_KW".to_string(), + TextRange::new(0.into(), 6.into()), + )]); + } } diff --git a/crates/pgt_statement_splitter/src/splitter.rs b/crates/pgt_statement_splitter/src/splitter.rs index 9061999ea..2905a3e7d 100644 --- a/crates/pgt_statement_splitter/src/splitter.rs +++ b/crates/pgt_statement_splitter/src/splitter.rs @@ -168,9 +168,15 @@ impl<'a> Splitter<'a> { if self.current() == kind { self.advance(); } else { + let token = if self.current() == SyntaxKind::EOF { + self.current_pos - 1 + } else { + self.current_pos + }; + self.errors.push(SplitError { msg: format!("Expected {:#?}", kind), - token: self.current_pos, + token, }); } }