@@ -31,6 +31,10 @@ enum NameRefContext {
3131 InsertColumn ,
3232 DeleteTable ,
3333 DeleteWhereColumn ,
34+ UpdateTable ,
35+ UpdateWhereColumn ,
36+ UpdateSetColumn ,
37+ UpdateFromTable ,
3438 SchemaQualifier ,
3539}
3640
@@ -42,7 +46,8 @@ pub(crate) fn resolve_name_ref(binder: &Binder, name_ref: &ast::NameRef) -> Opti
4246 | NameRefContext :: Table
4347 | NameRefContext :: CreateIndex
4448 | NameRefContext :: InsertTable
45- | NameRefContext :: DeleteTable => {
49+ | NameRefContext :: DeleteTable
50+ | NameRefContext :: UpdateTable => {
4651 let path = find_containing_path ( name_ref) ?;
4752 let table_name = extract_table_name ( & path) ?;
4853 let schema = extract_schema_name ( & path) ;
@@ -201,6 +206,29 @@ pub(crate) fn resolve_name_ref(binder: &Binder, name_ref: &ast::NameRef) -> Opti
201206 NameRefContext :: SelectQualifiedColumn => resolve_select_qualified_column ( binder, name_ref) ,
202207 NameRefContext :: InsertColumn => resolve_insert_column ( binder, name_ref) ,
203208 NameRefContext :: DeleteWhereColumn => resolve_delete_where_column ( binder, name_ref) ,
209+ NameRefContext :: UpdateWhereColumn => resolve_update_where_column ( binder, name_ref) ,
210+ NameRefContext :: UpdateSetColumn => resolve_update_set_column ( binder, name_ref) ,
211+ NameRefContext :: UpdateFromTable => {
212+ let table_name = Name :: from_node ( name_ref) ;
213+ let schema = if let Some ( parent) = name_ref. syntax ( ) . parent ( )
214+ && let Some ( field_expr) = ast:: FieldExpr :: cast ( parent)
215+ && let Some ( base) = field_expr. base ( )
216+ && let Some ( schema_name_ref) = ast:: NameRef :: cast ( base. syntax ( ) . clone ( ) )
217+ {
218+ Some ( Schema ( Name :: from_node ( & schema_name_ref) ) )
219+ } else {
220+ None
221+ } ;
222+
223+ if schema. is_none ( )
224+ && let Some ( cte_ptr) = resolve_cte_table ( name_ref, & table_name)
225+ {
226+ return Some ( cte_ptr) ;
227+ }
228+
229+ let position = name_ref. syntax ( ) . text_range ( ) . start ( ) ;
230+ resolve_table ( binder, & table_name, & schema, position)
231+ }
204232 }
205233}
206234
@@ -211,6 +239,7 @@ fn classify_name_ref_context(name_ref: &ast::NameRef) -> Option<NameRefContext>
211239 let mut in_column_list = false ;
212240 let mut in_where_clause = false ;
213241 let mut in_from_clause = false ;
242+ let mut in_set_clause = false ;
214243
215244 // TODO: can we combine this if and the one that follows?
216245 if let Some ( parent) = name_ref. syntax ( ) . parent ( )
@@ -368,12 +397,27 @@ fn classify_name_ref_context(name_ref: &ast::NameRef) -> Option<NameRefContext>
368397 if ast:: WhereClause :: can_cast ( ancestor. kind ( ) ) {
369398 in_where_clause = true ;
370399 }
400+ if ast:: SetClause :: can_cast ( ancestor. kind ( ) ) {
401+ in_set_clause = true ;
402+ }
371403 if ast:: Delete :: can_cast ( ancestor. kind ( ) ) {
372404 if in_where_clause {
373405 return Some ( NameRefContext :: DeleteWhereColumn ) ;
374406 }
375407 return Some ( NameRefContext :: DeleteTable ) ;
376408 }
409+ if ast:: Update :: can_cast ( ancestor. kind ( ) ) {
410+ if in_where_clause {
411+ return Some ( NameRefContext :: UpdateWhereColumn ) ;
412+ }
413+ if in_set_clause {
414+ return Some ( NameRefContext :: UpdateSetColumn ) ;
415+ }
416+ if in_from_clause {
417+ return Some ( NameRefContext :: UpdateFromTable ) ;
418+ }
419+ return Some ( NameRefContext :: UpdateTable ) ;
420+ }
377421 }
378422
379423 None
@@ -930,6 +974,70 @@ fn resolve_delete_where_column(binder: &Binder, name_ref: &ast::NameRef) -> Opti
930974 None
931975}
932976
977+ fn resolve_update_where_column ( binder : & Binder , name_ref : & ast:: NameRef ) -> Option < SyntaxNodePtr > {
978+ let column_name = Name :: from_node ( name_ref) ;
979+
980+ let update = name_ref. syntax ( ) . ancestors ( ) . find_map ( ast:: Update :: cast) ?;
981+ let relation_name = update. relation_name ( ) ?;
982+ let path = relation_name. path ( ) ?;
983+
984+ let table_name = extract_table_name ( & path) ?;
985+ let schema = extract_schema_name ( & path) ;
986+ let position = name_ref. syntax ( ) . text_range ( ) . start ( ) ;
987+
988+ let table_ptr = resolve_table ( binder, & table_name, & schema, position) ?;
989+
990+ let root = & name_ref. syntax ( ) . ancestors ( ) . last ( ) ?;
991+ let table_name_node = table_ptr. to_node ( root) ;
992+
993+ let create_table = table_name_node
994+ . ancestors ( )
995+ . find_map ( ast:: CreateTable :: cast) ?;
996+
997+ for arg in create_table. table_arg_list ( ) ?. args ( ) {
998+ if let ast:: TableArg :: Column ( column) = arg
999+ && let Some ( col_name) = column. name ( )
1000+ && Name :: from_node ( & col_name) == column_name
1001+ {
1002+ return Some ( SyntaxNodePtr :: new ( col_name. syntax ( ) ) ) ;
1003+ }
1004+ }
1005+
1006+ None
1007+ }
1008+
1009+ fn resolve_update_set_column ( binder : & Binder , name_ref : & ast:: NameRef ) -> Option < SyntaxNodePtr > {
1010+ let column_name = Name :: from_node ( name_ref) ;
1011+
1012+ let update = name_ref. syntax ( ) . ancestors ( ) . find_map ( ast:: Update :: cast) ?;
1013+ let relation_name = update. relation_name ( ) ?;
1014+ let path = relation_name. path ( ) ?;
1015+
1016+ let table_name = extract_table_name ( & path) ?;
1017+ let schema = extract_schema_name ( & path) ;
1018+ let position = name_ref. syntax ( ) . text_range ( ) . start ( ) ;
1019+
1020+ let table_ptr = resolve_table ( binder, & table_name, & schema, position) ?;
1021+
1022+ let root = & name_ref. syntax ( ) . ancestors ( ) . last ( ) ?;
1023+ let table_name_node = table_ptr. to_node ( root) ;
1024+
1025+ let create_table = table_name_node
1026+ . ancestors ( )
1027+ . find_map ( ast:: CreateTable :: cast) ?;
1028+
1029+ for arg in create_table. table_arg_list ( ) ?. args ( ) {
1030+ if let ast:: TableArg :: Column ( column) = arg
1031+ && let Some ( col_name) = column. name ( )
1032+ && Name :: from_node ( & col_name) == column_name
1033+ {
1034+ return Some ( SyntaxNodePtr :: new ( col_name. syntax ( ) ) ) ;
1035+ }
1036+ }
1037+
1038+ None
1039+ }
1040+
9331041fn resolve_fn_call_column ( binder : & Binder , name_ref : & ast:: NameRef ) -> Option < SyntaxNodePtr > {
9341042 let column_name = Name :: from_node ( name_ref) ;
9351043
0 commit comments