builder/builder_union.go
Nperson 6e0d98fc36 Update From & more tests (#35)
* add more test cases & replace some err in errors.New(...) style & add some built-in err types

* update From & related test cases

* add test cases & fix bug

* fix issues

* update readme

* replace postgres placeholder

* Update From & add more tests

* fix issues

* compatibility with sql.NamedArg & ref test case

* compatibility with sql.NamedArg & ref test case

* update bench test

* enhance placeholder: in case of sql.NamedArg in args

* enhance ToSQL: compatible with different sql drivers
2018-08-26 14:58:53 +08:00

48 lines
982 B
Go

// Copyright 2018 The Xorm Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package builder
import (
"fmt"
"strings"
)
func (b *Builder) unionWriteTo(w Writer) error {
if b.limitation != nil || b.cond.IsValid() ||
b.orderBy != "" || b.having != "" || b.groupBy != "" {
return ErrNotUnexpectedUnionConditions
}
for idx, u := range b.unions {
current := u.builder
if current.optype != selectType {
return ErrUnsupportedUnionMembers
}
if len(b.unions) == 1 {
if err := current.selectWriteTo(w); err != nil {
return err
}
} else {
if b.dialect != "" && b.dialect != current.dialect {
return ErrInconsistentDialect
}
if idx != 0 {
fmt.Fprint(w, fmt.Sprintf(" UNION %v ", strings.ToUpper(u.unionType)))
}
fmt.Fprint(w, "(")
if err := current.selectWriteTo(w); err != nil {
return err
}
fmt.Fprint(w, ")")
}
}
return nil
}