@@ -35,6 +35,7 @@ fn do_query(sql: &'static str) -> Diagnostic {
3535 collect_spans : true ,
3636 ..ParserOptions :: default ( )
3737 } ;
38+
3839 let state = MockSessionState :: default ( ) ;
3940 let context = MockContextProvider { state } ;
4041 let sql_to_rel = SqlToRel :: new_with_options ( & context, options) ;
@@ -200,14 +201,8 @@ fn test_ambiguous_reference() -> Result<()> {
200201 let diag = do_query ( query) ;
201202 assert_eq ! ( diag. message, "column 'first_name' is ambiguous" ) ;
202203 assert_eq ! ( diag. span, Some ( spans[ "a" ] ) ) ;
203- assert_eq ! (
204- diag. notes[ 0 ] . message,
205- "possible reference to 'first_name' in table 'a'"
206- ) ;
207- assert_eq ! (
208- diag. notes[ 1 ] . message,
209- "possible reference to 'first_name' in table 'b'"
210- ) ;
204+ assert_eq ! ( diag. notes[ 0 ] . message, "possible column a.first_name" ) ;
205+ assert_eq ! ( diag. notes[ 1 ] . message, "possible column b.first_name" ) ;
211206 Ok ( ( ) )
212207}
213208
@@ -225,3 +220,57 @@ fn test_incompatible_types_binary_arithmetic() -> Result<()> {
225220 assert_eq ! ( diag. notes[ 1 ] . span, Some ( spans[ "right" ] ) ) ;
226221 Ok ( ( ) )
227222}
223+
224+ #[ test]
225+ fn test_field_not_found_suggestion ( ) -> Result < ( ) > {
226+ let query = "SELECT /*whole*/first_na/*whole*/ FROM person" ;
227+ let spans = get_spans ( query) ;
228+ let diag = do_query ( query) ;
229+ assert_eq ! ( diag. message, "column 'first_na' not found" ) ;
230+ assert_eq ! ( diag. span, Some ( spans[ "whole" ] ) ) ;
231+ assert_eq ! ( diag. notes. len( ) , 1 ) ;
232+
233+ let mut suggested_fields: Vec < String > = diag
234+ . notes
235+ . iter ( )
236+ . filter_map ( |note| {
237+ if note. message . starts_with ( "possible column" ) {
238+ Some ( note. message . replace ( "possible column " , "" ) )
239+ } else {
240+ None
241+ }
242+ } )
243+ . collect ( ) ;
244+ suggested_fields. sort ( ) ;
245+ assert_eq ! ( suggested_fields[ 0 ] , "person.first_name" ) ;
246+ Ok ( ( ) )
247+ }
248+
249+ #[ test]
250+ fn test_ambiguous_column_suggestion ( ) -> Result < ( ) > {
251+ let query = "SELECT /*whole*/id/*whole*/ FROM test_decimal, person" ;
252+ let spans = get_spans ( query) ;
253+ let diag = do_query ( query) ;
254+
255+ assert_eq ! ( diag. message, "column 'id' is ambiguous" ) ;
256+ assert_eq ! ( diag. span, Some ( spans[ "whole" ] ) ) ;
257+
258+ assert_eq ! ( diag. notes. len( ) , 2 ) ;
259+
260+ let mut suggested_fields: Vec < String > = diag
261+ . notes
262+ . iter ( )
263+ . filter_map ( |note| {
264+ if note. message . starts_with ( "possible column" ) {
265+ Some ( note. message . replace ( "possible column " , "" ) )
266+ } else {
267+ None
268+ }
269+ } )
270+ . collect ( ) ;
271+
272+ suggested_fields. sort ( ) ;
273+ assert_eq ! ( suggested_fields, vec![ "person.id" , "test_decimal.id" ] ) ;
274+
275+ Ok ( ( ) )
276+ }
0 commit comments