// findColumn looks up the column described by a QualifiedName. The qname will be normalized. func (qt qvalResolver) findColumn(qname *parser.QualifiedName) (columnRef, error) { ref := columnRef{colIdx: invalidColIdx} if err := qname.NormalizeColumnName(); err != nil { return ref, err } // We can't resolve stars to a single column. if qname.IsStar() { err := fmt.Errorf("qualified name \"%s\" not found", qname) return ref, err } // TODO(radu): when we support multiple FROMs, we will find the node with the correct alias; if // no alias is given, we will search for the column in all FROMs and make sure there is only // one. For now we just check that the name matches (if given). if qname.Base == "" { qname.Base = parser.Name(qt.table.alias) } if equalName(qt.table.alias, string(qname.Base)) { colName := qname.Column() for idx, col := range qt.table.columns { if equalName(col.Name, colName) { ref.table = qt.table ref.colIdx = idx return ref, nil } } } err := fmt.Errorf("qualified name \"%s\" not found", qname) return ref, err }
// findColumn looks up the column described by a QualifiedName. The qname will be normalized. func (qt qvalResolver) findColumn(qname *parser.QualifiedName) (columnRef, error) { ref := columnRef{colIdx: invalidColIdx} if err := qname.NormalizeColumnName(); err != nil { return ref, err } // We can't resolve stars to a single column. if qname.IsStar() { err := fmt.Errorf("qualified name \"%s\" not found", qname) return ref, err } colName := sqlbase.NormalizeName(qname.Column()) for _, table := range qt.tables { if qname.Base == "" || sqlbase.EqualName(table.alias, string(qname.Base)) { for idx, col := range table.columns { if sqlbase.NormalizeName(col.Name) == colName { if ref.colIdx != invalidColIdx { return ref, fmt.Errorf("column reference \"%s\" is ambiguous", qname) } ref.table = table ref.colIdx = idx } } } } if ref.colIdx == invalidColIdx { return ref, fmt.Errorf("qualified name \"%s\" not found", qname) } return ref, nil }