Skip to content

Commit 90a66ac

Browse files
authored
Merge pull request #2529 from dolthub/daylon/any-binding
Fixed ANY using bindings
2 parents 9992192 + b3928b2 commit 90a66ac

2 files changed

Lines changed: 48 additions & 2 deletions

File tree

server/expression/any.go

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -237,9 +237,19 @@ func (a *AnyExpr) WithChildren(children ...sql.Expression) (sql.Expression, erro
237237
return nil, sql.ErrInvalidChildrenNumber.New(a, len(children), 2)
238238
}
239239

240+
leftExpr := children[0]
241+
rightExpr := children[1]
242+
// Unmodified BindVars use deferred type resolution, so we replace the deference with the left's type in array form
243+
if bv, ok := rightExpr.(*expression.BindVar); ok {
244+
if _, ok = bv.Typ.(*pgtypes.DoltgresType); !ok {
245+
if leftType, ok := leftExpr.Type().(*pgtypes.DoltgresType); ok {
246+
bv.Typ = leftType.ToArrayType()
247+
}
248+
}
249+
}
240250
anyExpr := &AnyExpr{
241-
leftExpr: children[0],
242-
rightExpr: children[1],
251+
leftExpr: leftExpr,
252+
rightExpr: rightExpr,
243253
subOperator: a.subOperator,
244254
name: a.name,
245255
}

testing/go/binding_test.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,42 @@ func TestBindingWithOidZero(t *testing.T) {
5353
require.NoError(t, result.Err)
5454
}
5555

56+
func TestIssue2386(t *testing.T) {
57+
// https://github.com/dolthub/doltgresql/issues/2386
58+
ctx, connection, controller := CreateServer(t, "postgres")
59+
defer controller.Stop()
60+
conn := connection.Default
61+
_, err := connection.Exec(ctx, "CREATE TABLE users (id INT PRIMARY KEY, name TEXT NOT NULL);")
62+
require.NoError(t, err)
63+
_, err = connection.Exec(ctx, "INSERT INTO users VALUES (1, 'alice'), (2, 'bob'), (3, 'carol'), (4, 'dave');")
64+
require.NoError(t, err)
65+
targetIDs := []int32{1, 3}
66+
rows, err := conn.Query(ctx,
67+
`SELECT id, name FROM users WHERE id = ANY($1)`,
68+
targetIDs,
69+
)
70+
require.NoError(t, err)
71+
defer rows.Close()
72+
i := 0
73+
for rows.Next() {
74+
var id int32
75+
var name string
76+
err = rows.Scan(&id, &name)
77+
require.NoError(t, err)
78+
switch i {
79+
case 0:
80+
require.Equal(t, int32(1), id)
81+
require.Equal(t, "alice", name)
82+
case 1:
83+
require.Equal(t, int32(3), id)
84+
require.Equal(t, "carol", name)
85+
default:
86+
t.FailNow()
87+
}
88+
i++
89+
}
90+
}
91+
5692
func TestBindingWithTextArray(t *testing.T) {
5793
ctx, connection, controller := CreateServer(t, "postgres")
5894
defer func() {

0 commit comments

Comments
 (0)