From 3a786d608d07fef3418d02ebdb720141a5e4cdc7 Mon Sep 17 00:00:00 2001 From: Alexis Montagne Date: Mon, 23 Sep 2024 14:42:31 -0700 Subject: [PATCH] x/sqlbuilder: Handle iter.Seq in the In clause --- x/migration/fs_source.go | 2 +- x/sqlbuilder/predicate_clause.go | 2 +- x/sqlbuilder/predicate_clause_go_1_22.go | 7 ++++++ x/sqlbuilder/predicate_clause_go_1_23.go | 22 +++++++++++++++++ x/sqlbuilder/predicate_clause_go_1_23_test.go | 24 +++++++++++++++++++ 5 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 x/sqlbuilder/predicate_clause_go_1_22.go create mode 100644 x/sqlbuilder/predicate_clause_go_1_23.go create mode 100644 x/sqlbuilder/predicate_clause_go_1_23_test.go diff --git a/x/migration/fs_source.go b/x/migration/fs_source.go index 4ad3950..3513413 100644 --- a/x/migration/fs_source.go +++ b/x/migration/fs_source.go @@ -1,4 +1,4 @@ -// +build go1.16 +//go:build go1.16 package migration diff --git a/x/sqlbuilder/predicate_clause.go b/x/sqlbuilder/predicate_clause.go index 45273da..0192b06 100644 --- a/x/sqlbuilder/predicate_clause.go +++ b/x/sqlbuilder/predicate_clause.go @@ -318,7 +318,7 @@ func (bc *basicClause) WriteTo(w QueryWriter, vs map[string]interface{}) error { return bc.fn(w, vv, bc.m.ToSQL()) } -func writeInClause(w QueryWriter, vv interface{}, k string) error { +func writeInClauseBasic(w QueryWriter, vv interface{}, k string) error { v := reflect.ValueOf(vv) if k := v.Kind(); k != reflect.Slice && k != reflect.Array { diff --git a/x/sqlbuilder/predicate_clause_go_1_22.go b/x/sqlbuilder/predicate_clause_go_1_22.go new file mode 100644 index 0000000..fb44af3 --- /dev/null +++ b/x/sqlbuilder/predicate_clause_go_1_22.go @@ -0,0 +1,7 @@ +//go:build !go1.23 + +package sqlbuilder + +func writeInClause(w QueryWriter, vv interface{}, k string) error { + return writeInClauseBasic(w, vv, k) +} diff --git a/x/sqlbuilder/predicate_clause_go_1_23.go b/x/sqlbuilder/predicate_clause_go_1_23.go new file mode 100644 index 0000000..48f9515 --- /dev/null +++ b/x/sqlbuilder/predicate_clause_go_1_23.go @@ -0,0 +1,22 @@ +//go:build go1.23 + +package sqlbuilder + +import "reflect" + +func writeInClause(w QueryWriter, vv interface{}, k string) error { + v := reflect.ValueOf(vv) + t := v.Type() + + if t.CanSeq() && t.Kind() != reflect.Slice && t.Kind() != reflect.Array { + var vs []interface{} + + for v := range v.Seq() { + vs = append(vs, v.Interface()) + } + + return writeInClauseBasic(w, vs, k) + } + + return writeInClauseBasic(w, vv, k) +} diff --git a/x/sqlbuilder/predicate_clause_go_1_23_test.go b/x/sqlbuilder/predicate_clause_go_1_23_test.go new file mode 100644 index 0000000..40fe40a --- /dev/null +++ b/x/sqlbuilder/predicate_clause_go_1_23_test.go @@ -0,0 +1,24 @@ +//go:build go1.23 + +package sqlbuilder + +import ( + "slices" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestSeqIN(t *testing.T) { + var w queryWriter + + err := StaticIn( + Column("foo"), + slices.Values([]int{4, 5, 6}), + ).WriteTo(&w, nil) + + require.NoError(t, err) + assert.Equal(t, "foo IN ($1, $2, $3)", w.String()) + assert.Equal(t, []any{4, 5, 6}, w.vs) +}