From 6d3df1469c831c26fc09f39c3417b0254911e2c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=9D=A8=E6=96=87?= Date: Wed, 5 May 2021 22:09:55 +0800 Subject: [PATCH] dialect/sql: include nested builder errors on join (#1533) * sql.Builder Join include Querier's error * sql.Builder Join ignore nil error Co-authored-by: Ariel Mashraki <7413593+a8m@users.noreply.github.com> Co-authored-by: Ariel Mashraki <7413593+a8m@users.noreply.github.com> --- dialect/sql/builder.go | 16 +++++++++++++++- dialect/sql/builder_test.go | 5 +++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/dialect/sql/builder.go b/dialect/sql/builder.go index ef2ea5a80..61a71d508 100644 --- a/dialect/sql/builder.go +++ b/dialect/sql/builder.go @@ -29,6 +29,11 @@ type Querier interface { Query() (string, []interface{}) } +// querierErr allowed propagate Querier's inner error +type querierErr interface { + Err() error +} + // ColumnBuilder is a builder for column definition in table creation. type ColumnBuilder struct { Builder @@ -2091,6 +2096,7 @@ func (s *Selector) Query() (string, []interface{}) { b.WriteString(strconv.Itoa(*s.offset)) } s.total = b.total + s.AddError(b.Err()) return b.String(), b.args } @@ -2326,7 +2332,10 @@ func (b *Builder) Reset() *Builder { // AddError appends an error to the builder errors. func (b *Builder) AddError(err error) *Builder { - b.errs = append(b.errs, err) + // allowed nil error make build process easier + if err != nil { + b.errs = append(b.errs, err) + } return b } @@ -2488,6 +2497,11 @@ func (b *Builder) join(qs []Querier, sep string) *Builder { b.WriteString(query) b.args = append(b.args, args...) b.total += len(args) + if qe, ok := q.(querierErr); ok { + if err := qe.Err(); err != nil { + b.AddError(err) + } + } } return b } diff --git a/dialect/sql/builder_test.go b/dialect/sql/builder_test.go index 610f4020c..99f66ad6f 100644 --- a/dialect/sql/builder_test.go +++ b/dialect/sql/builder_test.go @@ -1490,6 +1490,11 @@ func TestBuilder_Err(t *testing.T) { require.EqualError(t, b.Err(), "invalid") b.AddError(fmt.Errorf("unexpected")) require.EqualError(t, b.Err(), "invalid; unexpected") + b.Where(P(func(builder *Builder) { + builder.AddError(fmt.Errorf("inner")) + })) + _, _ = b.Query() + require.EqualError(t, b.Err(), "invalid; unexpected; inner") } func TestSelector_OrderByExpr(t *testing.T) {