Skip to content

Commit f27a47b

Browse files
Fetch results in arrow format (#109)
Results are now retrieved using Apache Arrow format. Includes support for timestamp and complex types returned using arrow native types. Please note; while timestamp and the complex types are retrieved using the native arrow formats their scan types currently remain the same. When calling Rows.Scan they will continue to be returned as time.Time and string respectively. This change will significantly improve performance for some data types such as date and timestamp. Testing showed performance improvements in the 12-23% range when retrieving dates and timestamps. Fixes two issues with complex types (i.e. ARRAY, MAP, and STRUCT) * Invalid JSON was being returned when a complex type contains date values * Invalid JSON was being returned when the key of a MAP was not of type STRING Known issues: * Interval data types in arrays, maps, and structs Planned enhancements: * Extend the existing API to allow clients to directly access the arrow format data, rather than scan rows individually. How: Moved the implementation of driver.Rows into an internal package. Refactored Rows implementation to remove behaviour specific to the format of the retrieved data. Made the format specific behaviour into an injectable dependency via the RowScanner interface. Implemented versions of RowScanner for column and arrow format data returned from the thrift server. --------- Signed-off-by: Raymond Cypher <[email protected]>
1 parent 01fbc21 commit f27a47b

27 files changed

+6351
-476
lines changed

connection.go

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ import (
99
"github.com/databricks/databricks-sql-go/internal/cli_service"
1010
"github.com/databricks/databricks-sql-go/internal/client"
1111
"github.com/databricks/databricks-sql-go/internal/config"
12+
dbsqlerr "github.com/databricks/databricks-sql-go/internal/err"
13+
"github.com/databricks/databricks-sql-go/internal/rows"
1214
"github.com/databricks/databricks-sql-go/internal/sentinel"
1315
"github.com/databricks/databricks-sql-go/logger"
1416
"github.com/pkg/errors"
@@ -44,19 +46,19 @@ func (c *conn) Close() error {
4446

4547
if err != nil {
4648
log.Err(err).Msg("databricks: failed to close connection")
47-
return wrapErr(err, "failed to close connection")
49+
return dbsqlerr.WrapErr(err, "failed to close connection")
4850
}
4951
return nil
5052
}
5153

5254
// Not supported in Databricks.
5355
func (c *conn) Begin() (driver.Tx, error) {
54-
return nil, errors.New(ErrTransactionsNotSupported)
56+
return nil, errors.New(dbsqlerr.ErrTransactionsNotSupported)
5557
}
5658

5759
// Not supported in Databricks.
5860
func (c *conn) BeginTx(ctx context.Context, opts driver.TxOptions) (driver.Tx, error) {
59-
return nil, errors.New(ErrTransactionsNotSupported)
61+
return nil, errors.New(dbsqlerr.ErrTransactionsNotSupported)
6062
}
6163

6264
// Ping attempts to verify that the server is accessible.
@@ -98,7 +100,7 @@ func (c *conn) ExecContext(ctx context.Context, query string, args []driver.Name
98100

99101
ctx = driverctx.NewContextWithConnId(ctx, c.id)
100102
if len(args) > 0 {
101-
return nil, errors.New(ErrParametersNotSupported)
103+
return nil, errors.New(dbsqlerr.ErrParametersNotSupported)
102104
}
103105
exStmtResp, opStatusResp, err := c.runQuery(ctx, query, args)
104106

@@ -120,7 +122,7 @@ func (c *conn) ExecContext(ctx context.Context, query string, args []driver.Name
120122
}
121123
if err != nil {
122124
log.Err(err).Msgf("databricks: failed to execute query: query %s", query)
123-
return nil, wrapErrf(err, "failed to execute query")
125+
return nil, dbsqlerr.WrapErrf(err, "failed to execute query")
124126
}
125127

126128
res := result{AffectedRows: opStatusResp.GetNumModifiedRows()}
@@ -140,7 +142,7 @@ func (c *conn) QueryContext(ctx context.Context, query string, args []driver.Nam
140142

141143
ctx = driverctx.NewContextWithConnId(ctx, c.id)
142144
if len(args) > 0 {
143-
return nil, errors.New(ErrParametersNotSupported)
145+
return nil, errors.New(dbsqlerr.ErrParametersNotSupported)
144146
}
145147
// first we try to get the results synchronously.
146148
// at any point in time that the context is done we must cancel and return
@@ -153,14 +155,14 @@ func (c *conn) QueryContext(ctx context.Context, query string, args []driver.Nam
153155

154156
if err != nil {
155157
log.Err(err).Msg("databricks: failed to run query") // To log query we need to redact credentials
156-
return nil, wrapErrf(err, "failed to run query")
158+
return nil, dbsqlerr.WrapErrf(err, "failed to run query")
157159
}
158160
// hold on to the operation handle
159161
opHandle := exStmtResp.OperationHandle
160162

161-
rows := NewRows(c.id, corrId, c.client, opHandle, int64(c.cfg.MaxRows), c.cfg.Location, exStmtResp.DirectResults)
163+
rows, err := rows.NewRows(c.id, corrId, opHandle, c.client, c.cfg, exStmtResp.DirectResults)
162164

163-
return rows, nil
165+
return rows, err
164166

165167
}
166168

@@ -271,6 +273,16 @@ func (c *conn) executeStatement(ctx context.Context, query string, args []driver
271273
},
272274
}
273275

276+
if c.cfg.UseArrowBatches {
277+
req.CanReadArrowResult_ = &c.cfg.UseArrowBatches
278+
req.UseArrowNativeTypes = &cli_service.TSparkArrowTypes{
279+
DecimalAsArrow: &c.cfg.UseArrowNativeDecimal,
280+
TimestampAsArrow: &c.cfg.UseArrowNativeTimestamp,
281+
ComplexTypesAsArrow: &c.cfg.UseArrowNativeComplexTypes,
282+
IntervalTypesAsArrow: &c.cfg.UseArrowNativeIntervalTypes,
283+
}
284+
}
285+
274286
ctx = driverctx.NewContextWithConnId(ctx, c.id)
275287
resp, err := c.client.ExecuteStatement(ctx, &req)
276288

@@ -353,7 +365,7 @@ func (c *conn) pollOperation(ctx context.Context, opHandle *cli_service.TOperati
353365
}
354366
_, resp, err := pollSentinel.Watch(ctx, c.cfg.PollInterval, 0)
355367
if err != nil {
356-
return nil, wrapErr(err, "failed to poll query state")
368+
return nil, dbsqlerr.WrapErr(err, "failed to poll query state")
357369
}
358370
statusResp, ok := resp.(*cli_service.TGetOperationStatusResp)
359371
if !ok {

connector.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"github.com/databricks/databricks-sql-go/internal/cli_service"
1414
"github.com/databricks/databricks-sql-go/internal/client"
1515
"github.com/databricks/databricks-sql-go/internal/config"
16+
dbsqlerr "github.com/databricks/databricks-sql-go/internal/err"
1617
"github.com/databricks/databricks-sql-go/logger"
1718
)
1819

@@ -34,7 +35,7 @@ func (c *connector) Connect(ctx context.Context) (driver.Conn, error) {
3435

3536
tclient, err := client.InitThriftClient(c.cfg, c.client)
3637
if err != nil {
37-
return nil, wrapErr(err, "error initializing thrift client")
38+
return nil, dbsqlerr.WrapErr(err, "error initializing thrift client")
3839
}
3940
protocolVersion := int64(c.cfg.ThriftProtocolVersion)
4041
session, err := tclient.OpenSession(ctx, &cli_service.TOpenSessionReq{
@@ -48,7 +49,7 @@ func (c *connector) Connect(ctx context.Context) (driver.Conn, error) {
4849
})
4950

5051
if err != nil {
51-
return nil, wrapErrf(err, "error connecting: host=%s port=%d, httpPath=%s", c.cfg.Host, c.cfg.Port, c.cfg.HTTPPath)
52+
return nil, dbsqlerr.WrapErrf(err, "error connecting: host=%s port=%d, httpPath=%s", c.cfg.Host, c.cfg.Port, c.cfg.HTTPPath)
5253
}
5354

5455
conn := &conn{

driver_e2e_test.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
"github.com/databricks/databricks-sql-go/driverctx"
1616
"github.com/databricks/databricks-sql-go/internal/cli_service"
1717
"github.com/databricks/databricks-sql-go/internal/client"
18+
dbsqlerr "github.com/databricks/databricks-sql-go/internal/err"
1819
"github.com/databricks/databricks-sql-go/logger"
1920
"github.com/stretchr/testify/assert"
2021
"github.com/stretchr/testify/require"
@@ -282,9 +283,9 @@ func TestContextTimeoutExample(t *testing.T) {
282283
rows, err := db.QueryContext(ctx1, `SELECT id FROM RANGE(100000000) ORDER BY RANDOM() + 2 asc`)
283284
require.ErrorContains(t, err, context.DeadlineExceeded.Error())
284285
require.Nil(t, rows)
285-
_, ok := err.(causer)
286+
_, ok := err.(dbsqlerr.Causer)
286287
assert.True(t, ok)
287-
_, ok = err.(stackTracer)
288+
_, ok = err.(dbsqlerr.StackTracer)
288289
assert.True(t, ok)
289290
assert.Equal(t, 1, state.executeStatementCalls)
290291
assert.GreaterOrEqual(t, state.getOperationStatusCalls, 1)

go.mod

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ module github.com/databricks/databricks-sql-go
33
go 1.19
44

55
require (
6+
github.com/apache/arrow/go/v11 v11.0.0-20221220213742-09453f9258f3
67
github.com/apache/thrift v0.17.0
78
github.com/joho/godotenv v1.4.0
89
github.com/mattn/go-isatty v0.0.16
@@ -11,26 +12,37 @@ require (
1112
)
1213

1314
require (
15+
github.com/andybalholm/brotli v1.0.4 // indirect
1416
github.com/davecgh/go-spew v1.1.1 // indirect
1517
github.com/dnephin/pflag v1.0.7 // indirect
1618
github.com/fatih/color v1.13.0 // indirect
1719
github.com/fsnotify/fsnotify v1.5.4 // indirect
20+
github.com/goccy/go-json v0.9.11 // indirect
21+
github.com/golang/snappy v0.0.4 // indirect
22+
github.com/google/flatbuffers v2.0.8+incompatible // indirect
1823
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect
1924
github.com/hashicorp/go-cleanhttp v0.5.1 // indirect
20-
github.com/kr/pretty v0.2.1 // indirect
25+
github.com/klauspost/asmfmt v1.3.2 // indirect
26+
github.com/klauspost/compress v1.15.9 // indirect
27+
github.com/klauspost/cpuid/v2 v2.0.9 // indirect
28+
github.com/kr/text v0.2.0 // indirect
2129
github.com/mattn/go-colorable v0.1.12 // indirect
30+
github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 // indirect
31+
github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 // indirect
32+
github.com/pierrec/lz4/v4 v4.1.15 // indirect
2233
github.com/pmezard/go-difflib v1.0.0 // indirect
34+
github.com/zeebo/xxh3 v1.0.2 // indirect
2335
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect
24-
golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f // indirect
36+
golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde // indirect
2537
golang.org/x/term v0.0.0-20220526004731-065cf7ba2467 // indirect
26-
golang.org/x/tools v0.1.11 // indirect
27-
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect
38+
golang.org/x/tools v0.1.12 // indirect
39+
golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f // indirect
2840
gopkg.in/yaml.v3 v3.0.1 // indirect
2941
)
3042

3143
require (
3244
github.com/hashicorp/go-retryablehttp v0.7.1
3345
github.com/pkg/errors v0.9.1
3446
github.com/rs/zerolog v1.28.0
35-
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab // indirect
47+
golang.org/x/sys v0.0.0-20220829200755-d48e67d00261 // indirect
3648
)

go.sum

Lines changed: 42 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
1+
github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c h1:RGWPOewvKIROun94nF7v2cua9qP+thov/7M50KEoeSU=
2+
github.com/andybalholm/brotli v1.0.4 h1:V7DdXeJtZscaqfNuAdSRuRFzuiKlHSC/Zh3zl9qY3JY=
3+
github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
4+
github.com/apache/arrow/go/v11 v11.0.0-20221220213742-09453f9258f3 h1:ILGvYiJaQS+DDVkPDbKvq8+GX39V8K2I2NnwMcJGbzY=
5+
github.com/apache/arrow/go/v11 v11.0.0-20221220213742-09453f9258f3/go.mod h1:Eg5OsL5H+e299f7u5ssuXsuHQVEGC4xei5aX110hRiI=
16
github.com/apache/thrift v0.17.0 h1:cMd2aj52n+8VoAtvSvLn4kDC3aZ6IAkBuqWQ2IDu7wo=
27
github.com/apache/thrift v0.17.0/go.mod h1:OLxhMRJxomX+1I/KUw03qoV3mMz16BwaKI+d4fPBx7Q=
38
github.com/coreos/go-systemd/v22 v22.3.3-0.20220203105225-a9a7ef127534/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
9+
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
410
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
511
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
612
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@@ -10,7 +16,13 @@ github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=
1016
github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=
1117
github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI=
1218
github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=
19+
github.com/goccy/go-json v0.9.11 h1:/pAaQDLHEoCq/5FFmSKBswWmK6H0e8g4159Kc/X/nqk=
20+
github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
1321
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
22+
github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
23+
github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
24+
github.com/google/flatbuffers v2.0.8+incompatible h1:ivUb1cGomAB101ZM1T0nOiWz9pSrTMoa9+EiY7igmkM=
25+
github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8=
1426
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
1527
github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg=
1628
github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
@@ -24,22 +36,33 @@ github.com/hashicorp/go-retryablehttp v0.7.1 h1:sUiuQAnLlbvmExtFQs72iFW/HXeUn8Z1
2436
github.com/hashicorp/go-retryablehttp v0.7.1/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY=
2537
github.com/joho/godotenv v1.4.0 h1:3l4+N6zfMWnkbPEXKng2o2/MR5mSwTrBih4ZEkkz1lg=
2638
github.com/joho/godotenv v1.4.0/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
27-
github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI=
28-
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
29-
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
30-
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
31-
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
39+
github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK4=
40+
github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE=
41+
github.com/klauspost/compress v1.15.9 h1:wKRjX6JRtDdrE9qwa4b/Cip7ACOshUI4smpCQanqjSY=
42+
github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU=
43+
github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4=
44+
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
45+
github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
46+
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
47+
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
3248
github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
3349
github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40=
3450
github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
3551
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
3652
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
3753
github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ=
3854
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
55+
github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 h1:AMFGa4R4MiIpspGNG7Z948v4n35fFGB3RR3G/ry4FWs=
56+
github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY=
57+
github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 h1:+n/aFZefKZp7spd8DFdX7uMikMLXX4oubIzJF4kv/wI=
58+
github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE=
59+
github.com/pierrec/lz4/v4 v4.1.15 h1:MO0/ucJhngq7299dKLwIMtgTfbkoSPF6AoMYDd8Q4q0=
60+
github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
3961
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
4062
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
4163
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
4264
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
65+
github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
4366
github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
4467
github.com/rs/zerolog v1.28.0 h1:MirSo27VyNi7RJYP3078AA1+Cyzd2GB66qy3aUHvsWY=
4568
github.com/rs/zerolog v1.28.0/go.mod h1:NILgTygv/Uej1ra5XxGf82ZFSLk58MFGAUS2o6usyD0=
@@ -54,10 +77,14 @@ github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKs
5477
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
5578
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
5679
github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
80+
github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ=
81+
github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0=
82+
github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA=
5783
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
5884
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
5985
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
6086
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
87+
golang.org/x/exp v0.0.0-20220827204233-334a2380cb91 h1:tnebWN09GYg9OLPss1KXj8txwZc6X6uMr6VFdcGNbHw=
6188
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
6289
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s=
6390
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
@@ -69,8 +96,9 @@ golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qx
6996
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
7097
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
7198
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
72-
golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f h1:Ax0t5p6N38Ga0dThY21weqDEyz2oklo4IvDkpigvkD8=
7399
golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
100+
golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde h1:ejfdSekXMDxDLbRrJMwUk6KnSLZ2McaUCVcIKM+N6jc=
101+
golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
74102
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
75103
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
76104
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -85,8 +113,9 @@ golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBc
85113
golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
86114
golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
87115
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
88-
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab h1:2QkjZIsXupsJbJIdSjjUOgWK3aEtzyuh2mPt3l/CkeU=
89116
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
117+
golang.org/x/sys v0.0.0-20220829200755-d48e67d00261 h1:v6hYoSR9T5oet+pMXwUWkbiVqx/63mlHjefrHmxwfeY=
118+
golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
90119
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
91120
golang.org/x/term v0.0.0-20220526004731-065cf7ba2467 h1:CBpWXWQpIRjzmkkA+M7q9Fqnwd2mZr3AFqexg8YTfoM=
92121
golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
@@ -97,15 +126,18 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
97126
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
98127
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
99128
golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
100-
golang.org/x/tools v0.1.11 h1:loJ25fNOEhSXfHrpoGj91eCUThwdNX6u24rO1xnNteY=
101129
golang.org/x/tools v0.1.11/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4=
130+
golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU=
131+
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
102132
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
103133
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
104134
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
105135
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
136+
golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f h1:uF6paiQQebLeSXkrTqHqz0MXhXXS1KgF41eUdBNvxK0=
137+
golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=
138+
gonum.org/v1/gonum v0.11.0 h1:f1IJhK4Km5tBJmaiJXtk/PkL4cdVX6J+tGiM187uT5E=
106139
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
107-
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
108-
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
140+
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
109141
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
110142
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
111143
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

0 commit comments

Comments
 (0)