|
@@ -55,7 +55,9 @@ func decorateStmt(s *ast.SelectStatement, store kv.KeyValue) ([]*streamInfo, []*
|
|
|
return nil, nil, nil, fmt.Errorf("select fields have cycled alias")
|
|
|
}
|
|
|
if !isSchemaless {
|
|
|
- aliasFieldTopoSort(s, streamStmts)
|
|
|
+ if err := aliasFieldTopoSort(s, streamStmts); err != nil {
|
|
|
+ return nil, nil, nil, err
|
|
|
+ }
|
|
|
}
|
|
|
dsn := ast.DefaultStream
|
|
|
if len(streamsFromStmt) == 1 {
|
|
@@ -294,7 +296,7 @@ func dfsRef(aliasRef map[string]map[string]struct{}, walked map[string]struct{},
|
|
|
return false
|
|
|
}
|
|
|
|
|
|
-func aliasFieldTopoSort(s *ast.SelectStatement, streamStmts []*streamInfo) {
|
|
|
+func aliasFieldTopoSort(s *ast.SelectStatement, streamStmts []*streamInfo) error {
|
|
|
nonAliasFields := make([]ast.Field, 0)
|
|
|
aliasDegreeMap := make(map[string]*aliasTopoDegree)
|
|
|
for _, field := range s.Fields {
|
|
@@ -311,7 +313,7 @@ func aliasFieldTopoSort(s *ast.SelectStatement, streamStmts []*streamInfo) {
|
|
|
for !isAliasFieldTopoSortFinish(aliasDegreeMap) {
|
|
|
for _, field := range s.Fields {
|
|
|
if field.AName != "" && aliasDegreeMap[field.AName].degree < 0 {
|
|
|
- skip := false
|
|
|
+ unknownFieldRefName := ""
|
|
|
degree := 0
|
|
|
ast.WalkFunc(field.Expr, func(node ast.Node) bool {
|
|
|
switch f := node.(type) {
|
|
@@ -323,15 +325,30 @@ func aliasFieldTopoSort(s *ast.SelectStatement, streamStmts []*streamInfo) {
|
|
|
return true
|
|
|
}
|
|
|
if !isFieldRefNameExists(f.Name, streamStmts) {
|
|
|
- skip = true
|
|
|
+ unknownFieldRefName = f.Name
|
|
|
return false
|
|
|
}
|
|
|
}
|
|
|
return true
|
|
|
})
|
|
|
- if !skip {
|
|
|
- aliasDegreeMap[field.AName].degree = degree
|
|
|
+
|
|
|
+ if len(unknownFieldRefName) > 0 {
|
|
|
+ unknownField := true
|
|
|
+ for _, otherField := range s.Fields {
|
|
|
+ if field == otherField {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ // the unknownFieldRef name belongs to a alias
|
|
|
+ if otherField.AName == unknownFieldRefName {
|
|
|
+ unknownField = false
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if unknownField {
|
|
|
+ return fmt.Errorf("unknown field %s", unknownFieldRefName)
|
|
|
+ }
|
|
|
}
|
|
|
+ aliasDegreeMap[field.AName].degree = degree
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -345,6 +362,7 @@ func aliasFieldTopoSort(s *ast.SelectStatement, streamStmts []*streamInfo) {
|
|
|
s.Fields = append(s.Fields, d.field)
|
|
|
}
|
|
|
s.Fields = append(s.Fields, nonAliasFields...)
|
|
|
+ return nil
|
|
|
}
|
|
|
|
|
|
func isFieldRefNameExists(name string, streamStmts []*streamInfo) bool {
|