Cover qualified underscore fields in comment hints
diff --git a/src/tokenizer.rs b/src/tokenizer.rs index 06aeb6a..3aaa20e 100644 --- a/src/tokenizer.rs +++ b/src/tokenizer.rs
@@ -4533,6 +4533,47 @@ } #[test] + fn tokenize_comment_hint_underscore_after_non_word_is_error() { + let sql = "SELECT 1 /*!50110 ._a */ FROM t"; + let dialect = MySqlDialect {}; + let err = Tokenizer::new(&dialect, sql).tokenize().unwrap_err(); + assert_eq!( + err, + TokenizerError { + message: "Unexpected character '_'".to_string(), + location: Location::new(1, 11), + } + ); + } + + #[test] + fn tokenize_into_existing_buffer_keeps_qualified_name_context() { + let dialect = MySqlDialect {}; + let mut tokens = Tokenizer::new(&dialect, "SELECT t ") + .tokenize_with_location() + .unwrap(); + Tokenizer::new(&dialect, "._col FROM t") + .tokenize_with_location_into_buf(&mut tokens) + .unwrap(); + let tokens = tokens + .into_iter() + .map(|token| token.token) + .filter(|token| !matches!(token, Token::Whitespace(_))) + .collect(); + compare( + vec![ + Token::make_keyword("SELECT"), + Token::make_word("t", None), + Token::Period, + Token::make_word("_col", None), + Token::make_keyword("FROM"), + Token::make_word("t", None), + ], + tokens, + ); + } + + #[test] fn tokenize_lt() { all_dialects().tokenizes_to( "select a <-50",
diff --git a/tests/sqlparser_common.rs b/tests/sqlparser_common.rs index 263c437..944bd47 100644 --- a/tests/sqlparser_common.rs +++ b/tests/sqlparser_common.rs
@@ -21097,3 +21097,9 @@ assert_eq!(response_id, request_id); result.expect("whitespace-separated qualified name in hint should tokenize"); } + +#[test] +fn parse_qualified_underscore_column_from_comment_hint() { + let dialects = all_dialects_where(|d| d.supports_multiline_comment_hints()); + dialects.one_statement_parses_to("SELECT t /*!50110 ._col */ FROM t", "SELECT t._col FROM t"); +}