*: add more clause type

This commit is contained in:
siddontang
2015-10-17 22:57:51 +08:00
parent 9e091caef6
commit a260bbb6c8
4 changed files with 19 additions and 23 deletions

View File

@ -124,24 +124,6 @@ func (s *SelectList) UpdateAggFields(expr expression.Expression) (expression.Exp
return &expression.Position{N: index + 1, Name: name}, nil
}
// CloneHiddenField checks and clones field and result field from table fields,
// and adds them to hidden field of select list.
func (s *SelectList) CloneHiddenField(name string, tableFields []*field.ResultField) bool {
// Check and add hidden field.
if field.ContainFieldName(name, tableFields, field.CheckFieldFlag) {
resultField, _ := field.CloneFieldByName(name, tableFields, field.CheckFieldFlag)
f := &field.Field{
Expr: &expression.Ident{
CIStr: resultField.ColumnInfo.Name,
},
}
s.AddField(f, resultField)
return true
}
return false
}
// CheckReferAmbiguous checks whether an identifier reference is ambiguous or not in select list.
// e,g, "select c1 as a, c2 as a from t group by a" is ambiguous,
// but "select c1 as a, c1 as a from t group by a" is not.
@ -235,6 +217,7 @@ func ResolveSelectList(selectFields []*field.Field, srcFields []*field.ResultFie
continue
}
// TODO: use fromIdentVisitor to cleanup.
var result *field.ResultField
for _, name := range names {
idx := field.GetResultFieldIndex(name, srcFields, field.DefaultFieldFlag)

View File

@ -40,7 +40,7 @@ type SelectFieldsRset struct {
}
func updateSelectFieldsRefer(selectList *plans.SelectList) error {
visitor := newFromIdentVisitor(selectList.FromFields)
visitor := newFromIdentVisitor(selectList.FromFields, fieldListClause)
// we only fix un-hidden fields here, for hidden fields, it should be
// handled in their own clause, in order by or having.

View File

@ -50,13 +50,22 @@ type clauseType int
const (
noneClause clauseType = iota
onClause
whereClause
groupByClause
orderByClause
fieldListClause
havingClause
orderByClause
)
func (clause clauseType) String() string {
switch clause {
case onClause:
return "on clause"
case fieldListClause:
return "field list"
case whereClause:
return "where clause"
case groupByClause:
return "group statement"
case orderByClause:
@ -138,24 +147,28 @@ func checkIdent(i *expression.Ident, selectList *plans.SelectList, clause clause
type fromIdentVisitor struct {
expression.BaseVisitor
fromFields []*field.ResultField
clause clauseType
}
func (v *fromIdentVisitor) VisitIdent(i *expression.Ident) (expression.Expression, error) {
idx := field.GetResultFieldIndex(i.L, v.fromFields, field.DefaultFieldFlag)
if len(idx) > 0 {
if len(idx) == 1 {
i.ReferScope = expression.IdentReferFromTable
i.ReferIndex = idx[0]
return i, nil
} else if len(idx) > 1 {
return nil, errors.Errorf("Column '%s' in %s is ambiguous", i, v.clause)
}
// TODO: check in outer query
return i, nil
}
func newFromIdentVisitor(fromFields []*field.ResultField) *fromIdentVisitor {
func newFromIdentVisitor(fromFields []*field.ResultField, clause clauseType) *fromIdentVisitor {
visitor := &fromIdentVisitor{}
visitor.BaseVisitor.V = visitor
visitor.fromFields = fromFields
visitor.clause = clause
return visitor
}

View File

@ -180,7 +180,7 @@ func (r *WhereRset) planStatic(ctx context.Context, e expression.Expression) (pl
}
func (r *WhereRset) updateWhereFieldsRefer() error {
visitor := newFromIdentVisitor(r.Src.GetFields())
visitor := newFromIdentVisitor(r.Src.GetFields(), whereClause)
e, err := r.Expr.Accept(visitor)
if err != nil {