func (nr *nameResolver) resolveColumnInTableSources(cn *ast.ColumnNameExpr, tableSources []*ast.TableSource) (done bool) { var matchedResultField *ast.ResultField tableNameL := cn.Name.Table.L columnNameL := cn.Name.Name.L if tableNameL != "" { var matchedTable ast.ResultSetNode for _, ts := range tableSources { if tableNameL == ts.AsName.L { // different table name. matchedTable = ts break } else if ts.AsName.L != "" { // Table as name shadows table real name. continue } if tn, ok := ts.Source.(*ast.TableName); ok { if cn.Name.Schema.L != "" && cn.Name.Schema.L != tn.Schema.L { continue } if tableNameL == tn.Name.L { matchedTable = ts } } } if matchedTable != nil { resultFields := matchedTable.GetResultFields() for _, rf := range resultFields { if rf.ColumnAsName.L == columnNameL || rf.Column.Name.L == columnNameL { // resolve column. matchedResultField = rf break } } } } else { for _, ts := range tableSources { rfs := ts.GetResultFields() for _, rf := range rfs { matchAsName := rf.ColumnAsName.L != "" && rf.ColumnAsName.L == columnNameL matchColumnName := rf.ColumnAsName.L == "" && rf.Column.Name.L == columnNameL if matchAsName || matchColumnName { if matchedResultField != nil { nr.Err = errors.Errorf("column %s is ambiguous.", cn.Name.Name.O) return true } matchedResultField = rf } } } } if matchedResultField != nil { // Bind column. cn.Refer = matchedResultField matchedResultField.Referenced = true return true } return false }
func (sb *InfoBinder) bindColumnInTableSources(cn *ast.ColumnName, tableSources []*ast.TableSource) (done bool) { var matchedResultField *ast.ResultField if cn.Table.L != "" { var matchedTable ast.ResultSetNode for _, ts := range tableSources { if cn.Table.L == ts.AsName.L { // different table name. matchedTable = ts break } if tn, ok := ts.Source.(*ast.TableName); ok { if cn.Table.L == tn.Name.L { matchedTable = ts } } } if matchedTable != nil { resultFields := matchedTable.GetResultFields() for _, rf := range resultFields { if rf.ColumnAsName.L == cn.Name.L || rf.Column.Name.L == cn.Name.L { // bind column. matchedResultField = rf break } } } } else { for _, ts := range tableSources { rfs := ts.GetResultFields() for _, rf := range rfs { matchAsName := rf.ColumnAsName.L != "" && rf.ColumnAsName.L == cn.Name.L matchColumnName := rf.ColumnAsName.L == "" && rf.Column.Name.L == cn.Name.L if matchAsName || matchColumnName { if matchedResultField != nil { sb.Err = errors.Errorf("column %s is ambiguous.", cn.Name.O) return true } matchedResultField = rf } } } } if matchedResultField != nil { // bind column. cn.ColumnInfo = matchedResultField.Column cn.TableInfo = matchedResultField.Table return true } return false }