From 160617e727348ff462405b2f6cc67c06b15e7714 Mon Sep 17 00:00:00 2001 From: chenhongxin <306142054@qq.com> Date: Tue, 29 Jul 2025 15:26:12 +0800 Subject: [PATCH 1/3] fix: goroutine leak --- go/client.go | 82 +++++++++++++++++++++++----------- go/go.mod | 36 +++++++-------- go/go.sum | 123 +++++++++++++++++++++++++++++++-------------------- go/main.go | 22 ++++----- go/util.go | 6 +-- 5 files changed, 165 insertions(+), 104 deletions(-) diff --git a/go/client.go b/go/client.go index 6a4c107..90b4ba2 100644 --- a/go/client.go +++ b/go/client.go @@ -6,13 +6,14 @@ import ( "fmt" "os" - "github.com/apache/arrow/go/v17/arrow" - "github.com/apache/arrow/go/v17/arrow/flight" - "github.com/apache/arrow/go/v17/arrow/flight/flightsql" + "github.com/apache/arrow-go/v18/arrow" + "github.com/apache/arrow-go/v18/arrow/flight" + "github.com/apache/arrow-go/v18/arrow/flight/flightsql" "google.golang.org/grpc" "google.golang.org/grpc/credentials" "google.golang.org/grpc/credentials/insecure" "google.golang.org/grpc/metadata" + "time" ) type ClientConfig struct { @@ -24,9 +25,13 @@ type ClientConfig struct { } type Client struct { - inner *flightsql.Client - // Golang uses context to pass Grpc context back and forth. - ctx context.Context + inner flightsql.Client + md metadata.MD +} + +type DbClient struct { + Client + md metadata.MD } // Creates a client for executing SQLs on the Datalayers server. @@ -55,16 +60,19 @@ func MakeClient(config *ClientConfig) (*Client, error) { if err != nil { return nil, fmt.Errorf("failed to create a Arrow Flight SQL client: %v", err) } - // Authenticates with the server. ctx, err := flightSqlClient.Client.AuthenticateBasicToken(context.Background(), config.Username, config.Password) if err != nil { return nil, fmt.Errorf("failed to authenticate with the server: %v", err) } + md, ok := metadata.FromOutgoingContext(ctx) + if !ok { + return nil, fmt.Errorf("failed to authenticate with the server") + } client := &Client{ - inner: flightSqlClient, - ctx: ctx, + inner: *flightSqlClient, + md: md, } return client, nil } @@ -88,55 +96,79 @@ func loadTLSCredentials(tlsCert string) (credentials.TransportCredentials, error return creds, nil } -// Sets the database context for each outgoing request. -func (client *Client) UseDatabase(database string) { - client.ctx = metadata.AppendToOutgoingContext(client.ctx, "database", database) +func (client *Client) timeoutContext() (context.Context, context.CancelFunc) { + ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) + ctx = metadata.NewOutgoingContext(ctx, client.md) + return ctx, cancel } -// Executes the sql on Datalayers and returns the result as a slice of arrow records. +// UseDatabase Sets the database context for each outgoing request. +func (client *Client) UseDatabase(database string) DbClient { + md := client.md.Copy() + md.Set("database", database) + return DbClient{ + Client: *client, + md: md, + } +} + +// Execute the sql on Datalayers and returns the result as a slice of arrow records. func (client *Client) Execute(sql string) ([]arrow.Record, error) { - flightInfo, err := client.inner.Execute(client.ctx, sql) + ctx, cancel := client.timeoutContext() + flightInfo, err := client.inner.Execute(ctx, sql) + cancel() if err != nil { return nil, fmt.Errorf("failed to execute a sql: %v", err) } return client.doGet(flightInfo.GetEndpoint()[0].GetTicket()) } -// Executes the sql on Datalayers and returns the affected rows. +// ExecuteUpdate the sql on Datalayers and returns the affected rows. // The supported sqls are Insert and Delete. Note, the development for supporting Delete is in progress. func (client *Client) ExecuteUpdate(sql string) (int64, error) { - affectedRows, err := client.inner.ExecuteUpdate(client.ctx, sql) + ctx, cancel := client.timeoutContext() + affectedRows, err := client.inner.ExecuteUpdate(ctx, sql) + cancel() if err != nil { return 0, fmt.Errorf("failed to execute a sql: %v", err) } return affectedRows, nil } -// Creates a prepared statement. +// Prepare Creates a prepared statement. func (client *Client) Prepare(sql string) (*flightsql.PreparedStatement, error) { - return client.inner.Prepare(client.ctx, sql) + ctx, cancel := client.timeoutContext() + stmt, err := client.inner.Prepare(ctx, sql) + cancel() + return stmt, err } -// Binds the record to the prepared statement and executes it on the server. +// ExecutePrepared binds the record to the prepared statement and executes it on the server. func (client *Client) ExecutePrepared(preparedStmt *flightsql.PreparedStatement, binding arrow.Record) ([]arrow.Record, error) { - defer binding.Release() - + ctx, cancel := client.timeoutContext() preparedStmt.SetParameters(binding) - flightInfo, err := preparedStmt.Execute(client.ctx) + flightInfo, err := preparedStmt.Execute(ctx) + cancel() + binding.Release() if err != nil { return nil, fmt.Errorf("failed to execute a prepared statement: %v", err) } return client.doGet(flightInfo.GetEndpoint()[0].GetTicket()) } -// Closes the prepared statement. +// ClosePrepared closes the prepared statement. func (client *Client) ClosePrepared(preparedStmt *flightsql.PreparedStatement) error { - return preparedStmt.Close(client.ctx) + ctx, cancel := client.timeoutContext() + err := preparedStmt.Close(ctx) + cancel() + return err } // Calls the `DoGet` method of the FlightSQL client. func (client *Client) doGet(ticket *flight.Ticket) ([]arrow.Record, error) { - reader, err := client.inner.DoGet(client.ctx, ticket) + ctx, cancel := client.timeoutContext() + reader, err := client.inner.DoGet(ctx, ticket) + cancel() if err != nil { return nil, fmt.Errorf("failed to perform DoGet: %v", err) } diff --git a/go/go.mod b/go/go.mod index baf4af9..3754a44 100644 --- a/go/go.mod +++ b/go/go.mod @@ -1,27 +1,27 @@ module example.com/main -go 1.22.3 +go 1.24.5 require ( - github.com/apache/arrow/go/v17 v17.0.0 - google.golang.org/grpc v1.67.0 + github.com/apache/arrow-go/v18 v18.4.0 + google.golang.org/grpc v1.74.2 ) require ( - github.com/goccy/go-json v0.10.3 // indirect - github.com/google/flatbuffers v24.3.25+incompatible // indirect - github.com/klauspost/compress v1.17.9 // indirect - github.com/klauspost/cpuid/v2 v2.2.8 // indirect - github.com/pierrec/lz4/v4 v4.1.21 // indirect + github.com/goccy/go-json v0.10.5 // indirect + github.com/google/flatbuffers v25.2.10+incompatible // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.11 // indirect + github.com/pierrec/lz4/v4 v4.1.22 // indirect github.com/zeebo/xxh3 v1.0.2 // indirect - golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 // indirect - golang.org/x/mod v0.18.0 // indirect - golang.org/x/net v0.28.0 // indirect - golang.org/x/sync v0.8.0 // indirect - golang.org/x/sys v0.24.0 // indirect - golang.org/x/text v0.17.0 // indirect - golang.org/x/tools v0.22.0 // indirect - golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 // indirect - google.golang.org/protobuf v1.34.2 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.25.0 // indirect + golang.org/x/net v0.41.0 // indirect + golang.org/x/sync v0.15.0 // indirect + golang.org/x/sys v0.33.0 // indirect + golang.org/x/text v0.26.0 // indirect + golang.org/x/tools v0.34.0 // indirect + golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250528174236-200df99c418a // indirect + google.golang.org/protobuf v1.36.6 // indirect ) diff --git a/go/go.sum b/go/go.sum index d98b038..f09913b 100644 --- a/go/go.sum +++ b/go/go.sum @@ -1,66 +1,95 @@ -github.com/apache/arrow/go/v17 v17.0.0 h1:RRR2bdqKcdbss9Gxy2NS/hK8i4LDMh23L6BbkN5+F54= -github.com/apache/arrow/go/v17 v17.0.0/go.mod h1:jR7QHkODl15PfYyjM2nU+yTLScZ/qfj7OSUZmJ8putc= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= +github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= +github.com/apache/arrow-go/v18 v18.4.0 h1:/RvkGqH517iY8bZKc4FD5/kkdwXJGjxf28JIXbJ/oB0= +github.com/apache/arrow-go/v18 v18.4.0/go.mod h1:Aawvwhj8x2jURIzD9Moy72cF0FyJXOpkYpdmGRHcw14= +github.com/apache/thrift v0.22.0 h1:r7mTJdj51TMDe6RtcmNdQxgn9XcyfGDOzegMDRg47uc= +github.com/apache/thrift v0.22.0/go.mod h1:1e7J/O1Ae6ZQMTYdy9xa3w9k+XHWPfRvdPyJeynQ+/g= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA= -github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= -github.com/google/flatbuffers v24.3.25+incompatible h1:CX395cjN9Kke9mmalRoL3d81AtFUxJM+yDthflgJGkI= -github.com/google/flatbuffers v24.3.25+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= +github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= +github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/flatbuffers v25.2.10+incompatible h1:F3vclr7C3HpB1k9mxCGRMXq6FdUalZ6H/pNX4FP1v0Q= +github.com/google/flatbuffers v25.2.10+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= -github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= -github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= -github.com/klauspost/cpuid/v2 v2.2.8 h1:+StwCXwm9PdpiEkPyzBXIy+M9KUb4ODm0Zarf1kS5BM= -github.com/klauspost/cpuid/v2 v2.2.8/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= -github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= -github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK4= +github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.11 h1:0OwqZRYI2rFrjS4kvkDnqJkKHdHaRnCm68/DY4OxRzU= +github.com/klauspost/cpuid/v2 v2.2.11/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 h1:AMFGa4R4MiIpspGNG7Z948v4n35fFGB3RR3G/ry4FWs= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 h1:+n/aFZefKZp7spd8DFdX7uMikMLXX4oubIzJF4kv/wI= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4= github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= -github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= -github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU= +github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= -golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 h1:LfspQV/FYTatPTr/3HzIcmiUFH7PGP+OQ6mgDYo3yuQ= -golang.org/x/exp v0.0.0-20240222234643-814bf88cf225/go.mod h1:CxmFvTBINI24O/j8iY7H1xHzx2i4OsyguNBmN/uPtqc= -golang.org/x/mod v0.18.0 h1:5+9lSbEzPSdWkH32vYPBwEpX8KwDbM52Ud9xBUvNlb0= -golang.org/x/mod v0.18.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE= -golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg= -golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= -golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.24.0 h1:Twjiwq9dn6R1fQcyiK+wQyHWfaz/BJB+YIpzU/Cv3Xg= -golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc= -golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= -golang.org/x/tools v0.22.0 h1:gqSGLZqv+AI9lIQzniJ0nZDRG5GBPsSi+DRNHWNz6yA= -golang.org/x/tools v0.22.0/go.mod h1:aCwcsjqvq7Yqt6TNyX7QMU2enbQ/Gt0bo6krSeEri+c= -golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= -golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= -gonum.org/v1/gonum v0.15.0 h1:2lYxjRbTYyxkJxlhC+LvJIx3SsANPdRybu1tGj9/OrQ= -gonum.org/v1/gonum v0.15.0/go.mod h1:xzZVBJBtS+Mz4q0Yl2LJTk+OxOg4jiXZ7qBoM0uISGo= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 h1:e7S5W7MGGLaSu8j3YjdezkZ+m1/Nm0uRVRMEMGk26Xs= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= -google.golang.org/grpc v1.67.0 h1:IdH9y6PF5MPSdAntIcpjQ+tXO41pcQsfZV2RxtQgVcw= -google.golang.org/grpc v1.67.0/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= -google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= -google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/otel v1.36.0 h1:UumtzIklRBY6cI/lllNZlALOF5nNIzJVb16APdvgTXg= +go.opentelemetry.io/otel v1.36.0/go.mod h1:/TcFMXYjyRNh8khOAO9ybYkqaDBb/70aVwkNML4pP8E= +go.opentelemetry.io/otel/metric v1.36.0 h1:MoWPKVhQvJ+eeXWHFBOPoBOi20jh6Iq2CcCREuTYufE= +go.opentelemetry.io/otel/metric v1.36.0/go.mod h1:zC7Ks+yeyJt4xig9DEw9kuUFe5C3zLbVjV2PzT6qzbs= +go.opentelemetry.io/otel/sdk v1.36.0 h1:b6SYIuLRs88ztox4EyrvRti80uXIFy+Sqzoh9kFULbs= +go.opentelemetry.io/otel/sdk v1.36.0/go.mod h1:+lC+mTgD+MUWfjJubi2vvXWcVxyr9rmlshZni72pXeY= +go.opentelemetry.io/otel/sdk/metric v1.36.0 h1:r0ntwwGosWGaa0CrSt8cuNuTcccMXERFwHX4dThiPis= +go.opentelemetry.io/otel/sdk/metric v1.36.0/go.mod h1:qTNOhFDfKRwX0yXOqJYegL5WRaW376QbB7P4Pb0qva4= +go.opentelemetry.io/otel/trace v1.36.0 h1:ahxWNuqZjpdiFAyrIoQ4GIiAIhxAunQR6MUoKrsNd4w= +go.opentelemetry.io/otel/trace v1.36.0/go.mod h1:gQ+OnDZzrybY4k4seLzPAWNwVBBVlF2szhehOBB/tGA= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w= +golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= +golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw= +golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA= +golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8= +golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= +golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M= +golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA= +golang.org/x/tools v0.34.0 h1:qIpSLOxeCYGg9TrcJokLBG4KFA6d795g0xkBkiESGlo= +golang.org/x/tools v0.34.0/go.mod h1:pAP9OwEaY1CAW3HOmg3hLZC5Z0CCmzjAF2UQMSqNARg= +golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= +golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250528174236-200df99c418a h1:v2PbRU4K3llS09c7zodFpNePeamkAwG3mPrAery9VeE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250528174236-200df99c418a/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.74.2 h1:WoosgB65DlWVC9FqI82dGsZhWFNBSLjQ84bjROOpMu4= +google.golang.org/grpc v1.74.2/go.mod h1:CtQ+BGjaAIXHs/5YS3i473GqwBBa1zGQNevxdeBEXrM= +google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= +google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 h1:5D53IMaUuA5InSeMu9eJtlQXS2NxAhyWQvkKEgXZhHI= diff --git a/go/main.go b/go/main.go index d817fd6..7710b79 100644 --- a/go/main.go +++ b/go/main.go @@ -42,7 +42,7 @@ func main() { // The Datalayers server uses this header to identify the associated table of a request. // This setting is optional since the following SQLs contain the database context // and the server could parse the database context from SQLs. - client.UseDatabase("go") + dbClient := client.UseDatabase("go") // Creates a table `demo` within the database `go`. sql = ` @@ -55,7 +55,7 @@ func main() { ) PARTITION BY HASH(sid) PARTITIONS 8 ENGINE=TimeSeries;` - result, err = client.Execute(sql) + result, err = dbClient.Execute(sql) if err != nil { fmt.Println("Failed to create table: ", err) return @@ -83,7 +83,7 @@ func main() { // Queries the inserted data. sql = "SELECT * FROM go.demo" - result, err = client.Execute(sql) + result, err = dbClient.Execute(sql) if err != nil { fmt.Println("Failed to scan data: ", err) return @@ -99,13 +99,13 @@ func main() { // Inserts some data into the `demo` table with prepared statement. sql = "INSERT INTO go.demo (ts, sid, value, flag) VALUES (?, ?, ?, ?);" - preparedStmt, err := client.Prepare(sql) + preparedStmt, err := dbClient.Prepare(sql) if err != nil { fmt.Println("Failed to create a insert prepared statement: ", err) return } binding := MakeInsertBinding() - result, err = client.ExecutePrepared(preparedStmt, binding) + result, err = dbClient.ExecutePrepared(preparedStmt, binding) if err != nil { fmt.Println("Failed to execute a insert prepared statement: ", err) return @@ -116,7 +116,7 @@ func main() { // Queries the inserted data with prepared statement. sql = "SELECT * FROM go.demo WHERE sid = ?" - preparedStmt, err = client.Prepare(sql) + preparedStmt, err = dbClient.Prepare(sql) if err != nil { fmt.Println("Failed to create a select prepared statement: ", err) return @@ -124,7 +124,7 @@ func main() { // Retrieves all rows with `sid` = 1. binding = MakeQueryBinding(1) - result, err = client.ExecutePrepared(preparedStmt, binding) + result, err = dbClient.ExecutePrepared(preparedStmt, binding) if err != nil { fmt.Println("Failed to execute a select prepared statement: ", err) return @@ -137,7 +137,7 @@ func main() { // Retrieves all rows with `sid` = 1. binding = MakeQueryBinding(2) - result, err = client.ExecutePrepared(preparedStmt, binding) + result, err = dbClient.ExecutePrepared(preparedStmt, binding) if err != nil { fmt.Println("Failed to execute a select prepared statement: ", err) return @@ -149,7 +149,7 @@ func main() { PrintRecords(result) // Closes the prepared statement to notify releasing resources on server side. - if err = client.ClosePrepared(preparedStmt); err != nil { + if err = dbClient.ClosePrepared(preparedStmt); err != nil { fmt.Println("Failed to close a prepared statement: ", err) return } @@ -162,7 +162,7 @@ func main() { INSERT INTO go.demo (ts, sid, value, flag) VALUES ('2024-09-03T10:00:00+08:00', 1, 4.5, 0), ('2024-09-03T10:05:00+08:00', 2, 11.6, 1);` - affectedRows, err := client.ExecuteUpdate(sql) + affectedRows, err := dbClient.ExecuteUpdate(sql) if err != nil { fmt.Println("Failed to insert data: ", err) return @@ -173,7 +173,7 @@ func main() { // Checks that the data are inserted successfully. sql = "SELECT * FROM go.demo where ts >= '2024-09-03T10:00:00+08:00'" - result, err = client.Execute(sql) + result, err = dbClient.Execute(sql) if err != nil { fmt.Println("Failed to scan data: ", err) return diff --git a/go/util.go b/go/util.go index 4fcc550..7981a1d 100644 --- a/go/util.go +++ b/go/util.go @@ -6,9 +6,9 @@ import ( "text/tabwriter" "time" - "github.com/apache/arrow/go/v17/arrow" - "github.com/apache/arrow/go/v17/arrow/array" - "github.com/apache/arrow/go/v17/arrow/memory" + "github.com/apache/arrow-go/v18/arrow" + "github.com/apache/arrow-go/v18/arrow/array" + "github.com/apache/arrow-go/v18/arrow/memory" ) // Assumes the records contain the affected rows and prints the affected rows. From 959f74688422f5f03f29ad5a77e4e75df493d0df Mon Sep 17 00:00:00 2001 From: chenhx <306142054@qq.com> Date: Tue, 29 Jul 2025 15:46:54 +0800 Subject: [PATCH 2/3] Update go/client.go Co-authored-by: niebayes --- go/client.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go/client.go b/go/client.go index 90b4ba2..5644937 100644 --- a/go/client.go +++ b/go/client.go @@ -123,7 +123,7 @@ func (client *Client) Execute(sql string) ([]arrow.Record, error) { return client.doGet(flightInfo.GetEndpoint()[0].GetTicket()) } -// ExecuteUpdate the sql on Datalayers and returns the affected rows. +// ExecuteUpdate executes the sql on Datalayers and returns the affected rows. // The supported sqls are Insert and Delete. Note, the development for supporting Delete is in progress. func (client *Client) ExecuteUpdate(sql string) (int64, error) { ctx, cancel := client.timeoutContext() From 59bbba27934e34889942d226824cafbf00de9ae3 Mon Sep 17 00:00:00 2001 From: chenhx <306142054@qq.com> Date: Tue, 29 Jul 2025 15:47:02 +0800 Subject: [PATCH 3/3] Update go/client.go Co-authored-by: niebayes --- go/client.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go/client.go b/go/client.go index 5644937..cb7005d 100644 --- a/go/client.go +++ b/go/client.go @@ -135,7 +135,7 @@ func (client *Client) ExecuteUpdate(sql string) (int64, error) { return affectedRows, nil } -// Prepare Creates a prepared statement. +// Prepare creates a prepared statement. func (client *Client) Prepare(sql string) (*flightsql.PreparedStatement, error) { ctx, cancel := client.timeoutContext() stmt, err := client.inner.Prepare(ctx, sql)