diff --git a/go/client.go b/go/client.go index cb7005d..06cb3ba 100644 --- a/go/client.go +++ b/go/client.go @@ -168,7 +168,7 @@ func (client *Client) ClosePrepared(preparedStmt *flightsql.PreparedStatement) e func (client *Client) doGet(ticket *flight.Ticket) ([]arrow.Record, error) { ctx, cancel := client.timeoutContext() reader, err := client.inner.DoGet(ctx, ticket) - cancel() + defer cancel() if err != nil { return nil, fmt.Errorf("failed to perform DoGet: %v", err) } diff --git a/go/main.go b/go/main.go index 7710b79..0ad1fff 100644 --- a/go/main.go +++ b/go/main.go @@ -28,7 +28,7 @@ func main() { } // Creates a database `go`. - sql := "CREATE DATABASE go;" + sql := "CREATE DATABASE if not exists go;" result, err := client.Execute(sql) if err != nil { fmt.Println("Failed to create database: ", err) @@ -46,7 +46,7 @@ func main() { // Creates a table `demo` within the database `go`. sql = ` - CREATE TABLE go.demo ( + CREATE TABLE if not exists go.demo ( ts TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, sid INT32, value REAL, @@ -148,6 +148,21 @@ func main() { // 2024-09-02 10:05:00 +0800 CST 2 15.30 1 PrintRecords(result) + sql = "SELECT * FROM go.demo WHERE sid in (?, ?, ?)" + preparedStmt, err = dbClient.Prepare(sql) + if err != nil { + fmt.Println("Failed to create a select prepared statement: ", err) + return + } + // Retrieves all rows where `sid` in (1, 2, 3). + binding = MakeMultiBinding([]int32{1, 2, 3}) + result, err = dbClient.ExecutePrepared(preparedStmt, binding) + if err != nil { + fmt.Println("Failed to execute a select prepared statement: ", err) + return + } + PrintRecords(result) + // Closes the prepared statement to notify releasing resources on server side. if err = dbClient.ClosePrepared(preparedStmt); err != nil { fmt.Println("Failed to close a prepared statement: ", err) diff --git a/go/util.go b/go/util.go index 7981a1d..f661897 100644 --- a/go/util.go +++ b/go/util.go @@ -132,6 +132,31 @@ func MakeQueryBinding(sid int32) arrow.Record { return record } +func MakeMultiBinding(sids []int32) arrow.Record { + sidBuilder := array.NewInt32Builder(memory.NewGoAllocator()) + defer sidBuilder.Release() + sidBuilder.Append(1) + sidArray1 := sidBuilder.NewArray() + + sidBuilder = array.NewInt32Builder(memory.NewGoAllocator()) + defer sidBuilder.Release() + sidBuilder.Append(2) + sidArray2 := sidBuilder.NewArray() + + sidBuilder = array.NewInt32Builder(memory.NewGoAllocator()) + defer sidBuilder.Release() + sidBuilder.Append(3) + sidArray3 := sidBuilder.NewArray() + + schema := arrow.NewSchema([]arrow.Field{ + {Name: "sid", Type: arrow.PrimitiveTypes.Int32, Nullable: true}, + {Name: "sid", Type: arrow.PrimitiveTypes.Int32, Nullable: true}, + {Name: "sid", Type: arrow.PrimitiveTypes.Int32, Nullable: true}, + }, nil) + record := array.NewRecord(schema, []arrow.Array{sidArray1, sidArray2, sidArray3}, 1) + return record +} + func releaseRecords(records []arrow.Record) { for _, record := range records { record.Release()