From ad777c7a3ff630960f25ff21c4ca00652248c7f0 Mon Sep 17 00:00:00 2001 From: Yusong Gao Date: Sat, 31 Aug 2024 09:12:44 +0800 Subject: [PATCH] test: add a robust SQL test suite based on go-mysql-server/enginetest (#18) --- Makefile | 2 +- duck_harness.go | 354 +++++++++++++++ executor.go | 28 +- executor_test.go | 343 +-------------- go.mod | 22 +- go.sum | 279 +----------- main.go | 9 +- main_test.go | 1065 ++++++++++++++++++++++++++++++++++++++++++++++ meta/database.go | 28 +- meta/provider.go | 30 +- meta/table.go | 10 +- 11 files changed, 1509 insertions(+), 661 deletions(-) create mode 100644 duck_harness.go create mode 100644 main_test.go diff --git a/Makefile b/Makefile index 75a2a1f8..6b487c6a 100644 --- a/Makefile +++ b/Makefile @@ -37,4 +37,4 @@ run: build # Test target .PHONY: test test: - go test -v -cover ./... \ No newline at end of file + go test -cover ./... diff --git a/duck_harness.go b/duck_harness.go new file mode 100644 index 00000000..20bfb4e9 --- /dev/null +++ b/duck_harness.go @@ -0,0 +1,354 @@ +// Copyright 2024 ApeCloud, Inc. + +// Copyright 2020-2021 Dolthub, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package main + +import ( + "context" + "fmt" + "os" + "strings" + "sync" + "testing" + + "github.com/apecloud/myduckserver/meta" + "github.com/dolthub/vitess/go/mysql" + + sqle "github.com/dolthub/go-mysql-server" + "github.com/dolthub/go-mysql-server/enginetest" + "github.com/dolthub/go-mysql-server/enginetest/scriptgen/setup" + "github.com/dolthub/go-mysql-server/memory" + "github.com/dolthub/go-mysql-server/server" + "github.com/dolthub/go-mysql-server/sql" +) + +const testNumPartitions = 5 + +type IndexDriverInitializer func([]sql.Database) sql.IndexDriver + +type DuckHarness struct { + name string + parallelism int + numTablePartitions int + // readonly bool + provider sql.DatabaseProvider + indexDriverInitializer IndexDriverInitializer + driver sql.IndexDriver + nativeIndexSupport bool + skippedQueries map[string]struct{} + session sql.Session + retainSession bool + setupData []setup.SetupScript + externalProcedureRegistry sql.ExternalStoredProcedureRegistry + server bool + mu *sync.Mutex +} + +var _ enginetest.Harness = (*DuckHarness)(nil) + +// var _ enginetest.IndexDriverHarness = (*DuckHarness)(nil) +var _ enginetest.IndexHarness = (*DuckHarness)(nil) +var _ enginetest.ForeignKeyHarness = (*DuckHarness)(nil) +var _ enginetest.KeylessTableHarness = (*DuckHarness)(nil) +var _ enginetest.ClientHarness = (*DuckHarness)(nil) +var _ enginetest.ServerHarness = (*DuckHarness)(nil) +var _ sql.ExternalStoredProcedureProvider = (*DuckHarness)(nil) + +func NewDuckHarness(name string, parallelism int, numTablePartitions int, useNativeIndexes bool, driverInitializer IndexDriverInitializer) *DuckHarness { + externalProcedureRegistry := sql.NewExternalStoredProcedureRegistry() + for _, esp := range memory.ExternalStoredProcedures { + externalProcedureRegistry.Register(esp) + } + + var useServer bool + if _, ok := os.LookupEnv("SERVER_ENGINE_TEST"); ok { + useServer = true + } + + return &DuckHarness{ + name: name, + numTablePartitions: numTablePartitions, + indexDriverInitializer: driverInitializer, + parallelism: parallelism, + nativeIndexSupport: useNativeIndexes, + skippedQueries: make(map[string]struct{}), + externalProcedureRegistry: externalProcedureRegistry, + mu: &sync.Mutex{}, + server: useServer, + } +} + +func NewDefaultDuckHarness() *DuckHarness { + return NewDuckHarness("default", 1, testNumPartitions, false, nil) +} + +// func NewReadOnlyDuckHarness() *DuckHarness { +// h := NewDefaultDuckHarness() +// h.readonly = true +// return h +// } + +func (m *DuckHarness) SessionBuilder() server.SessionBuilder { + return func(ctx context.Context, c *mysql.Conn, addr string) (sql.Session, error) { + host := "" + user := "" + mysqlConnectionUser, ok := c.UserData.(sql.MysqlConnectionUser) + if ok { + host = mysqlConnectionUser.Host + user = mysqlConnectionUser.User + } + client := sql.Client{Address: host, User: user, Capabilities: c.Capabilities} + baseSession := sql.NewBaseSessionWithClientServer(addr, client, c.ConnectionID) + return memory.NewSession(baseSession, m.getProvider()), nil + } +} + +// ExternalStoredProcedure implements the sql.ExternalStoredProcedureProvider interface +func (m *DuckHarness) ExternalStoredProcedure(_ *sql.Context, name string, numOfParams int) (*sql.ExternalStoredProcedureDetails, error) { + return m.externalProcedureRegistry.LookupByNameAndParamCount(name, numOfParams) +} + +// ExternalStoredProcedures implements the sql.ExternalStoredProcedureProvider interface +func (m *DuckHarness) ExternalStoredProcedures(_ *sql.Context, name string) ([]sql.ExternalStoredProcedureDetails, error) { + return m.externalProcedureRegistry.LookupByName(name) +} + +// func (m *DuckHarness) InitializeIndexDriver(dbs []sql.Database) { +// if m.indexDriverInitializer != nil { +// m.driver = m.indexDriverInitializer(dbs) +// } +// } + +func (m *DuckHarness) NewSession() *sql.Context { + m.session = m.newSession() + return m.NewContext() +} + +func (m *DuckHarness) SkipQueryTest(query string) bool { + _, ok := m.skippedQueries[strings.ToLower(query)] + return ok +} + +func (m *DuckHarness) QueriesToSkip(queries ...string) { + for _, query := range queries { + m.skippedQueries[strings.ToLower(query)] = struct{}{} + } +} + +func (m *DuckHarness) UseServer() { + m.server = true +} + +func (m *DuckHarness) IsUsingServer() bool { + return m.server +} + +type SkippingDuckHarness struct { + DuckHarness +} + +var _ enginetest.SkippingHarness = (*SkippingDuckHarness)(nil) + +func NewSkippingDuckHarness() *SkippingDuckHarness { + return &SkippingDuckHarness{ + DuckHarness: *NewDefaultDuckHarness(), + } +} + +func (s SkippingDuckHarness) SkipQueryTest(query string) bool { + return true +} + +func (m *DuckHarness) Setup(setupData ...[]setup.SetupScript) { + m.setupData = nil + for i := range setupData { + m.setupData = append(m.setupData, setupData[i]...) + } +} + +func (m *DuckHarness) NewEngine(t *testing.T) (enginetest.QueryEngine, error) { + if !m.retainSession { + m.session = nil + m.provider = nil + } + engine, err := NewEngine(t, m, m.getProvider(), m.setupData, memory.NewStatsProv()) + if err != nil { + return nil, err + } + + if m.server { + return enginetest.NewServerQueryEngine(t, engine, m.SessionBuilder()) + } + + return engine, nil +} + +// NewEngine creates an engine and sets it up for testing using harness, provider, and setup data given. +func NewEngine(t *testing.T, harness enginetest.Harness, dbProvider sql.DatabaseProvider, setupData []setup.SetupScript, statsProvider sql.StatsProvider) (*sqle.Engine, error) { + e := enginetest.NewEngineWithProvider(t, harness, dbProvider) + e.Analyzer.Catalog.StatsProvider = statsProvider + + provider := dbProvider.(*meta.DbProvider) + builder := NewDuckBuilder(e.Analyzer.ExecBuilder, provider.Storage(), provider.CatalogName()) + e.Analyzer.ExecBuilder = builder + + ctx := enginetest.NewContext(harness) + + var supportsIndexes bool + if ih, ok := harness.(enginetest.IndexHarness); ok && ih.SupportsNativeIndexCreation() { + supportsIndexes = true + } + + // TODO: remove ths, make it explicit everywhere + if len(setupData) == 0 { + setupData = setup.MydbData + } + return RunSetupScripts(ctx, e, setupData, supportsIndexes) +} + +// RunSetupScripts runs the given setup scripts on the given engine, returning any error +func RunSetupScripts(ctx *sql.Context, e *sqle.Engine, scripts []setup.SetupScript, createIndexes bool) (*sqle.Engine, error) { + for i := range scripts { + for _, s := range scripts[i] { + if !createIndexes { + if strings.Contains(s, "create index") || strings.Contains(s, "create unique index") { + continue + } + } + // ctx.GetLogger().Warnf("running query %s\n", s) + ctx := ctx.WithQuery(s) + _, iter, _, err := e.Query(ctx, s) + if err != nil { + return nil, err + } + _, err = sql.RowIterToRows(ctx, iter) + if err != nil { + return nil, err + } + } + } + return e, nil +} + +func (m *DuckHarness) SupportsNativeIndexCreation() bool { + return m.nativeIndexSupport +} + +func (m *DuckHarness) SupportsForeignKeys() bool { + return false +} + +func (m *DuckHarness) SupportsKeylessTables() bool { + return true +} + +func (m *DuckHarness) Parallelism() int { + return m.parallelism +} + +func (m *DuckHarness) NewContext() *sql.Context { + if m.session == nil { + m.session = m.newSession() + } + + return sql.NewContext( + context.Background(), + sql.WithSession(m.session), + ) +} + +func (m *DuckHarness) newSession() *memory.Session { + baseSession := enginetest.NewBaseSession() + session := memory.NewSession(baseSession, m.getProvider()) + if m.driver != nil { + session.GetIndexRegistry().RegisterIndexDriver(m.driver) + } + return session +} + +func (m *DuckHarness) NewContextWithClient(client sql.Client) *sql.Context { + baseSession := sql.NewBaseSessionWithClientServer("address", client, 1) + + return sql.NewContext( + context.Background(), + sql.WithSession(memory.NewSession(baseSession, m.getProvider())), + ) +} + +func (m *DuckHarness) IndexDriver(dbs []sql.Database) sql.IndexDriver { + if m.indexDriverInitializer != nil { + return m.indexDriverInitializer(dbs) + } + return nil +} + +func (m *DuckHarness) WithProvider(provider sql.DatabaseProvider) *DuckHarness { + ret := *m + ret.provider = provider + return &ret +} + +func (m *DuckHarness) getProvider() sql.DatabaseProvider { + m.mu.Lock() + defer m.mu.Unlock() + + if m.provider == nil { + m.provider = m.NewDatabaseProvider().(*meta.DbProvider) + } + + return m.provider +} + +func (m *DuckHarness) NewDatabaseProvider() sql.MutableDatabaseProvider { + return meta.NewInMemoryDBProvider() +} + +func (m *DuckHarness) Provider() *meta.DbProvider { + return m.getProvider().(*meta.DbProvider) +} + +func (m *DuckHarness) ValidateEngine(ctx *sql.Context, e *sqle.Engine) error { + return sanityCheckEngine(ctx, e) +} + +func sanityCheckEngine(ctx *sql.Context, e *sqle.Engine) (err error) { + for _, db := range e.Analyzer.Catalog.AllDatabases(ctx) { + if err = sanityCheckDatabase(ctx, db); err != nil { + return err + } + } + return +} + +func sanityCheckDatabase(ctx *sql.Context, db sql.Database) error { + names, err := db.GetTableNames(ctx) + if err != nil { + return err + } + for _, name := range names { + t, ok, err := db.GetTableInsensitive(ctx, name) + if err != nil { + return err + } + if !ok { + return fmt.Errorf("expected to find table %s", name) + } + if t.Name() != name { + return fmt.Errorf("unexpected table name (%s != %s)", name, t.Name()) + } + } + return nil +} diff --git a/executor.go b/executor.go index 8346d813..220365cc 100644 --- a/executor.go +++ b/executor.go @@ -28,30 +28,42 @@ import ( ) type DuckBuilder struct { - provider sql.MutableDatabaseProvider - base sql.NodeExecBuilder - db *stdsql.DB - conns sync.Map // map[uint32]*stdsql.Conn, but sync.Map is concurrent-safe + base sql.NodeExecBuilder + db *stdsql.DB + catalogName string + conns sync.Map // map[uint32]*stdsql.Conn, but sync.Map is concurrent-safe +} + +func NewDuckBuilder(base sql.NodeExecBuilder, db *stdsql.DB, catalogName string) *DuckBuilder { + return &DuckBuilder{ + base: base, + db: db, + catalogName: catalogName, + } } func (b *DuckBuilder) GetConn(ctx context.Context, id uint32, schemaName string) (*stdsql.Conn, error) { entry, ok := b.conns.Load(id) + conn := (*stdsql.Conn)(nil) + if !ok { c, err := b.db.Conn(ctx) if err != nil { return nil, err } b.conns.Store(id, c) - return c, nil + conn = c + } else { + conn = entry.(*stdsql.Conn) } - conn := entry.(*stdsql.Conn) + if schemaName != "" { var currentSchema string if err := conn.QueryRowContext(ctx, "SELECT CURRENT_SCHEMA()").Scan(¤tSchema); err != nil { logrus.WithError(err).Error("Failed to get current schema") return nil, err } else if currentSchema != schemaName { - if _, err := conn.ExecContext(ctx, "USE "+dbName+"."+schemaName); err != nil { + if _, err := conn.ExecContext(ctx, "USE "+b.catalogName+"."+schemaName); err != nil { logrus.WithField("schema", schemaName).WithError(err).Error("Failed to switch schema") return nil, err } @@ -116,7 +128,7 @@ func (b *DuckBuilder) Build(ctx *sql.Context, root sql.Node, r sql.Row) (sql.Row switch node := n.(type) { case *plan.Use: - useStmt := "USE " + fullSchemaName(dbName, node.Database().Name()) + useStmt := "USE " + fullSchemaName(b.catalogName, node.Database().Name()) if _, err := conn.ExecContext(ctx.Context, useStmt); err != nil { return nil, err } diff --git a/executor_test.go b/executor_test.go index 2dc9f603..1af6c2c1 100644 --- a/executor_test.go +++ b/executor_test.go @@ -2,12 +2,10 @@ package main import ( "context" - "fmt" "io" "testing" "github.com/DATA-DOG/go-sqlmock" - sqle "github.com/dolthub/go-mysql-server" "github.com/dolthub/go-mysql-server/memory" "github.com/dolthub/go-mysql-server/sql" "github.com/dolthub/go-mysql-server/sql/plan" @@ -65,10 +63,7 @@ func TestDuckBuilder_Select(t *testing.T) { defer conn.Close() provider := memory.NewDBProvider() - builder := &DuckBuilder{ - provider: provider, - base: &mockNodeExecBuilder{}, - } + builder := NewDuckBuilder(&mockNodeExecBuilder{}, db, "") builder.conns.Store(uint32(1), conn) session := memory.NewSession(sql.NewBaseSessionWithClientServer("", sql.Client{}, 1), provider) ctx := sql.NewContext(context.Background(), sql.WithSession(session), sql.WithQuery("SELECT * FROM test_table")) @@ -113,10 +108,7 @@ func TestDuckBuilder_Insert(t *testing.T) { defer conn.Close() provider := memory.NewDBProvider() - builder := &DuckBuilder{ - provider: provider, - base: &mockNodeExecBuilder{}, - } + builder := NewDuckBuilder(&mockNodeExecBuilder{}, db, "") builder.conns.Store(uint32(1), conn) session := memory.NewSession(sql.NewBaseSessionWithClientServer("", sql.Client{}, 1), provider) ctx := sql.NewContext(context.Background(), sql.WithSession(session), @@ -153,334 +145,3 @@ func TestDuckBuilder_Insert(t *testing.T) { assert.NoError(t, mock.ExpectationsWereMet()) } - -func TestDuckBuilder_CreateTable(t *testing.T) { - db, mock, err := sqlmock.New() - require.NoError(t, err) - defer db.Close() - conn, err := db.Conn(context.Background()) - require.NoError(t, err) - defer conn.Close() - - provider := memory.NewDBProvider() - builder := &DuckBuilder{ - provider: provider, - base: &mockNodeExecBuilder{}, - } - builder.conns.Store(uint32(1), conn) - session := memory.NewSession(sql.NewBaseSessionWithClientServer("", sql.Client{}, 1), provider) - ctx := sql.NewContext(context.Background(), sql.WithSession(session), - sql.WithQuery("CREATE TABLE test_table (id INT, name VARCHAR(255))")) - - // VARCHAR(255) is translated to TEXT(255) in DuckDB - mock.ExpectExec("CREATE TABLE test_table \\(id INT, name TEXT\\(255\\)\\)").WillReturnResult(sqlmock.NewResult(0, 0)) - mock.ExpectExec("COMMENT ON TABLE testdb.test_table").WillReturnResult(sqlmock.NewResult(0, 0)) - - // Create a mock db and table - mockDB := memory.NewDatabase("testdb") - // Define the schema for the new table - schema := sql.Schema{ - {Name: "id", Type: types.Int64, Nullable: false}, - {Name: "name", Type: types.MustCreateStringWithDefaults(sqltypes.VarChar, 255), Nullable: true}, - } - // Create a TableSpec - tableSpec := &plan.TableSpec{ - Schema: sql.NewPrimaryKeySchema(schema), - // You might need to set other fields of TableSpec as needed - } - node := plan.NewCreateTable(mockDB, "test_table", true, false, tableSpec) - iter, err := builder.Build(ctx, node, nil) - assert.NoError(t, err) - assert.NotNil(t, iter, "Iterator should not be nil") - - // Check the result of the insert operation - row, err := iter.Next(ctx) - assert.NoError(t, err) - assert.NotNil(t, row, "Result row should not be nil") - assert.Len(t, row, 1, "Result should have one column") - okResult, ok := row[0].(types.OkResult) - assert.True(t, ok, "Result should be of type types.OkResult") - assert.Equal(t, uint64(0), okResult.RowsAffected, "Number of affected rows should be 0") - - // There should be no more rows - _, err = iter.Next(ctx) - assert.Equal(t, io.EOF, err, "Second call to Next should return EOF") - - // Close the iterator - err = iter.Close(ctx) - assert.NoError(t, err, "Closing the iterator should not return an error") - - assert.NoError(t, mock.ExpectationsWereMet()) -} - -func TestDuckBuilder_DropTable(t *testing.T) { - db, mock, err := sqlmock.New() - require.NoError(t, err) - defer db.Close() - conn, err := db.Conn(context.Background()) - require.NoError(t, err) - defer conn.Close() - - provider := memory.NewDBProvider() - builder := &DuckBuilder{ - provider: provider, - base: &mockNodeExecBuilder{}, - } - builder.conns.Store(uint32(1), conn) - session := memory.NewSession(sql.NewBaseSessionWithClientServer("", sql.Client{}, 1), provider) - ctx := sql.NewContext(context.Background(), sql.WithSession(session), - sql.WithQuery("DROP TABLE test_table")) - - mock.ExpectExec("DROP TABLE test_table").WillReturnResult(sqlmock.NewResult(0, 0)) - - // Create a mock db and table - mockDB := memory.NewDatabase("testdb") - mockTable := &mockTable{ - name: "test_table", - } - tableNode := plan.NewResolvedTable(mockTable, mockDB, nil) - - // Create a DropTable node - node := plan.NewDropTable([]sql.Node{tableNode}, true) - iter, err := builder.Build(ctx, node, nil) - assert.NoError(t, err) - assert.NotNil(t, iter, "Iterator should not be nil") - - // Check the result of the drop operation - row, err := iter.Next(ctx) - assert.NoError(t, err) - assert.NotNil(t, row, "Result row should not be nil") - assert.Len(t, row, 1, "Result should have one column") - okResult, ok := row[0].(types.OkResult) - assert.True(t, ok, "Result should be of type types.OkResult") - assert.Equal(t, uint64(0), okResult.RowsAffected, "Number of affected rows should be 0") - - // There should be no more rows - _, err = iter.Next(ctx) - assert.Equal(t, io.EOF, err, "Second call to Next should return EOF") - - // Close the iterator - err = iter.Close(ctx) - assert.NoError(t, err, "Closing the iterator should not return an error") - - assert.NoError(t, mock.ExpectationsWereMet()) -} - -func TestDuckBuilder_ShowTables(t *testing.T) { - db, mock, err := sqlmock.New() - require.NoError(t, err) - defer db.Close() - conn, err := db.Conn(context.Background()) - require.NoError(t, err) - defer conn.Close() - - provider := memory.NewDBProvider() - builder := &DuckBuilder{ - provider: provider, - base: &mockNodeExecBuilder{}, - } - builder.conns.Store(uint32(1), conn) - session := memory.NewSession(sql.NewBaseSessionWithClientServer("", sql.Client{}, 1), provider) - ctx := sql.NewContext(context.Background(), sql.WithSession(session), - sql.WithQuery("SHOW TABLES")) - - // Mock the result of SHOW TABLES - rows := sqlmock.NewRows([]string{"table_name"}). - AddRow("table1"). - AddRow("table2"). - AddRow("table3") - mock.ExpectQuery("SHOW TABLES").WillReturnRows(rows) - - // Create a mock database - mockDB := memory.NewDatabase("testdb") - - // Create a ShowTables node - node := plan.NewShowTables(mockDB, false, nil) // false for full_schema - - iter, err := builder.Build(ctx, node, nil) - assert.NoError(t, err) - assert.NotNil(t, iter, "Iterator should not be nil") - - // Check the results - expectedTables := []string{"table1", "table2", "table3"} - for i, expectedTable := range expectedTables { - row, err := iter.Next(ctx) - assert.NoError(t, err) - assert.NotNil(t, row, fmt.Sprintf("Result row %d should not be nil", i)) - assert.Len(t, row, 1, fmt.Sprintf("Result row %d should have one column", i)) - tableName, ok := row[0].(string) - assert.True(t, ok, fmt.Sprintf("Result %d should be of type string", i)) - assert.Equal(t, expectedTable, tableName, fmt.Sprintf("Table name %d should match", i)) - } - - // There should be no more rows - _, err = iter.Next(ctx) - assert.Equal(t, io.EOF, err, "Call to Next after last row should return EOF") - - // Close the iterator - err = iter.Close(ctx) - assert.NoError(t, err, "Closing the iterator should not return an error") - - assert.NoError(t, mock.ExpectationsWereMet()) -} - -func TestDuckBuilder_ShowCreateTable(t *testing.T) { - provider := memory.NewDBProvider() - - session := memory.NewSession(sql.NewBaseSession(), provider) - ctx := sql.NewContext(context.Background(), sql.WithSession(session)) - - engine := sqle.NewDefault(provider) - _, _, _, err := engine.Query(ctx, "CREATE DATABASE test_schema") - assert.NoError(t, err) - - ctx.SetCurrentDatabase("test_schema") - - // Mock the result of SHOW CREATE TABLE - createTableStatement := `CREATE TABLE test_table ( - id INTEGER, - name VARCHAR(255), - PRIMARY KEY (id) -)` - _, _, _, err = engine.Query(ctx, createTableStatement) - assert.NoError(t, err) - - ctx = sql.NewContext(context.Background(), sql.WithSession(session), - sql.WithQuery("SHOW CREATE TABLE test_table")) - - // Create a mock database and table - mockDB := memory.NewDatabase("testdb") - mockTable := &mockTable{ - name: "test_table", - } - tableNode := plan.NewResolvedTable(mockTable, mockDB, nil) - - // Create a ShowCreateTable node - node := plan.NewShowCreateTable(tableNode, false) - - builder := &DuckBuilder{ - provider: provider, - base: engine.Analyzer.ExecBuilder, - } - iter, err := builder.Build(ctx, node, nil) - assert.NoError(t, err) - assert.NotNil(t, iter, "Iterator should not be nil") - - // Check the result - row, err := iter.Next(ctx) - assert.NoError(t, err) - assert.NotNil(t, row, "Result row should not be nil") - assert.Len(t, row, 2, "Result should have two columns") - - tableName, ok := row[0].(string) - assert.True(t, ok, "First column should be of type string") - assert.Equal(t, "test_table", tableName, "Table name should match") - - createStatement, ok := row[1].(string) - assert.True(t, ok, "Second column should be of type string") - assert.Equal(t, createTableStatement, createStatement, "Create table statement should match") - - // There should be no more rows - _, err = iter.Next(ctx) - assert.Equal(t, io.EOF, err, "Second call to Next should return EOF") - - // Close the iterator - err = iter.Close(ctx) - assert.NoError(t, err, "Closing the iterator should not return an error") -} - -func TestDuckBuilder_CreateDatabase(t *testing.T) { - db, mock, err := sqlmock.New() - require.NoError(t, err) - defer db.Close() - conn, err := db.Conn(context.Background()) - require.NoError(t, err) - defer conn.Close() - - provider := memory.NewDBProvider() - builder := &DuckBuilder{ - provider: provider, - base: &mockNodeExecBuilder{}, - } - builder.conns.Store(uint32(1), conn) - session := memory.NewSession(sql.NewBaseSessionWithClientServer("", sql.Client{}, 1), provider) - ctx := sql.NewContext(context.Background(), sql.WithSession(session), - sql.WithQuery("CREATE DATABASE test_db")) - - // translate DATABASE to SCHEMA in duckdb - mock.ExpectExec(`CREATE SCHEMA (.*) "test_db"`).WillReturnResult(sqlmock.NewResult(0, 0)) - - // Create a CreateDatabase node - node := plan.NewCreateDatabase("test_db", true, sql.Collation_Default) - - iter, err := builder.Build(ctx, node, nil) - assert.NoError(t, err) - assert.NotNil(t, iter, "Iterator should not be nil") - - // Check the result of the create database operation - row, err := iter.Next(ctx) - assert.NoError(t, err) - assert.NotNil(t, row, "Result row should not be nil") - assert.Len(t, row, 1, "Result should have one column") - okResult, ok := row[0].(types.OkResult) - assert.True(t, ok, "Result should be of type types.OkResult") - assert.Equal(t, uint64(0), okResult.RowsAffected, "Number of affected rows should be 0") - - // There should be no more rows - _, err = iter.Next(ctx) - assert.Equal(t, io.EOF, err, "Second call to Next should return EOF") - - // Close the iterator - err = iter.Close(ctx) - assert.NoError(t, err, "Closing the iterator should not return an error") - - assert.NoError(t, mock.ExpectationsWereMet()) -} - -func TestDuckBuilder_DropDatabase(t *testing.T) { - db, mock, err := sqlmock.New() - require.NoError(t, err) - defer db.Close() - conn, err := db.Conn(context.Background()) - require.NoError(t, err) - defer conn.Close() - - provider := memory.NewDBProvider() - builder := &DuckBuilder{ - provider: provider, - base: &mockNodeExecBuilder{}, - } - builder.conns.Store(uint32(1), conn) - session := memory.NewSession(sql.NewBaseSessionWithClientServer("", sql.Client{}, 1), provider) - ctx := sql.NewContext(context.Background(), sql.WithSession(session), - sql.WithQuery("DROP DATABASE test_db")) - - // Mock the result of DROP DATABASE - mock.ExpectExec(`DROP SCHEMA (.*) "test_db"`).WillReturnResult(sqlmock.NewResult(0, 0)) - - // Create a DropDatabase node - node := plan.NewDropDatabase("test_db", true) - - iter, err := builder.Build(ctx, node, nil) - assert.NoError(t, err) - assert.NotNil(t, iter, "Iterator should not be nil") - - // Check the result of the drop database operation - row, err := iter.Next(ctx) - assert.NoError(t, err) - assert.NotNil(t, row, "Result row should not be nil") - assert.Len(t, row, 1, "Result should have one column") - okResult, ok := row[0].(types.OkResult) - assert.True(t, ok, "Result should be of type types.OkResult") - assert.Equal(t, uint64(0), okResult.RowsAffected, "Number of affected rows should be 0") - - // There should be no more rows - _, err = iter.Next(ctx) - assert.Equal(t, io.EOF, err, "Second call to Next should return EOF") - - // Close the iterator - err = iter.Close(ctx) - assert.NoError(t, err, "Closing the iterator should not return an error") - - assert.NoError(t, mock.ExpectationsWereMet()) -} diff --git a/go.mod b/go.mod index f723e28a..ec71563a 100644 --- a/go.mod +++ b/go.mod @@ -5,12 +5,10 @@ go 1.22.4 require ( github.com/DATA-DOG/go-sqlmock v1.5.2 github.com/Shopify/toxiproxy/v2 v2.9.0 - github.com/dolthub/doltgresql v0.11.1 github.com/dolthub/go-mysql-server v0.18.2-0.20240815142344-761713e36043 github.com/dolthub/vitess v0.0.0-20240807181005-71d735078e24 github.com/go-sql-driver/mysql v1.8.1 github.com/jmoiron/sqlx v1.4.0 - github.com/lib/pq v1.10.9 github.com/marcboeker/go-duckdb v1.7.1 github.com/prometheus/client_golang v1.19.0 github.com/rs/zerolog v1.33.0 @@ -24,36 +22,25 @@ require ( github.com/apache/arrow/go/v17 v17.0.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/cockroachdb/apd/v2 v2.0.3-0.20200518165714-d020e156310a // indirect - github.com/cockroachdb/errors v1.7.5 // indirect - github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f // indirect - github.com/cockroachdb/redact v1.0.6 // indirect - github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/dolthub/flatbuffers/v23 v23.3.3-dh.2 // indirect github.com/dolthub/go-icu-regex v0.0.0-20230524105445-af7e7991c97e // indirect github.com/dolthub/jsonpath v0.0.2-0.20240227200619-19675ab05c71 // indirect + github.com/dolthub/sqllogictest/go v0.0.0-20240618184124-ca47f9354216 // indirect github.com/go-kit/kit v0.10.0 // indirect github.com/goccy/go-json v0.10.3 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/geo v0.0.0-20200730024412-e86565bf3f35 // indirect - github.com/golang/protobuf v1.5.4 // indirect + github.com/gocraft/dbr/v2 v2.7.2 // indirect github.com/google/flatbuffers v24.3.25+incompatible // indirect - github.com/google/go-cmp v0.6.0 // indirect github.com/google/uuid v1.6.0 // indirect github.com/gorilla/mux v1.8.1 // indirect - github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect github.com/hashicorp/golang-lru v0.5.4 // indirect github.com/klauspost/compress v1.17.9 // indirect github.com/klauspost/cpuid/v2 v2.2.8 // indirect - github.com/kr/pretty v0.3.1 // indirect - github.com/kr/text v0.2.0 // indirect github.com/lestrrat-go/strftime v1.0.4 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/pierrec/lz4/v4 v4.1.21 // indirect - github.com/pierrre/geohash v1.0.0 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/prometheus/client_model v0.6.0 // indirect @@ -63,11 +50,10 @@ require ( github.com/rs/xid v1.5.0 // indirect github.com/shopspring/decimal v1.3.1 // indirect github.com/tetratelabs/wazero v1.1.0 // indirect - github.com/twpayne/go-geom v1.3.6 // indirect - github.com/twpayne/go-kml v1.5.2-0.20200728095708-9f2fd4dfcbfe // indirect github.com/zeebo/xxh3 v1.0.2 // indirect go.opentelemetry.io/otel v1.7.0 // indirect go.opentelemetry.io/otel/trace v1.7.0 // indirect + golang.org/x/crypto v0.23.0 // indirect golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 // indirect golang.org/x/mod v0.18.0 // indirect golang.org/x/sync v0.7.0 // indirect @@ -75,8 +61,6 @@ require ( golang.org/x/text v0.16.0 // indirect golang.org/x/tools v0.22.0 // indirect golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect - google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240227224415-6ceb2ff114de // indirect google.golang.org/grpc v1.63.2 // indirect google.golang.org/protobuf v1.34.2 // indirect diff --git a/go.sum b/go.sum index 64f43b1b..4e5c9fd1 100644 --- a/go.sum +++ b/go.sum @@ -2,106 +2,60 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= -github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= -github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/CloudyKit/fastprinter v0.0.0-20170127035650-74b38d55f37a/go.mod h1:EFZQ978U7x8IRnstaskI3IysnWY5Ao3QgZUKOXlsAdw= -github.com/CloudyKit/jet v2.1.3-0.20180809161101-62edd43e4f88+incompatible/go.mod h1:HPYO+50pSWkPoj9Q/eq0aRGByCL6ScRlUmiEX5Zgm+w= -github.com/Codefor/geohash v0.0.0-20140723084247-1b41c28e3a9d h1:iG9B49Q218F/XxXNRM7k/vWf7MKmLIS8AcJV9cGN4nA= -github.com/Codefor/geohash v0.0.0-20140723084247-1b41c28e3a9d/go.mod h1:RVnhzAX71far8Kc3TQeA0k/dcaEKUnTDSOyet/JCmGI= -github.com/DATA-DOG/go-sqlmock v1.3.2/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= +github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/DATA-DOG/go-sqlmock v1.5.2 h1:OcvFkGmslmlZibjAjaHm3L//6LiuBgolP7OputlJIzU= github.com/DATA-DOG/go-sqlmock v1.5.2/go.mod h1:88MAG/4G7SMwSE3CeA0ZKzrT5CiOU3OJ+JlNzwDqpNU= -github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= -github.com/Joker/jade v1.0.1-0.20190614124447-d475f43051e7/go.mod h1:6E6s8o2AE4KhCrqr6GRJjdC/gNfTdxkIXvuGZZda2VM= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= -github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= -github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= -github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= -github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= -github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= github.com/Shopify/toxiproxy/v2 v2.9.0 h1:DIaDZG2/r/kv3Em6UxYBUVnnWl1mHlYTGFv+sTPV7VI= github.com/Shopify/toxiproxy/v2 v2.9.0/go.mod h1:2uPRyxR46fsx2yUr9i8zcejzdkWfK7p6G23jV/X6YNs= -github.com/TomiHiltunen/geohash-golang v0.0.0-20150112065804-b3e4e625abfb h1:wumPkzt4zaxO4rHPBrjDK8iZMR41C1qs7njNqlacwQg= -github.com/TomiHiltunen/geohash-golang v0.0.0-20150112065804-b3e4e625abfb/go.mod h1:QiYsIBRQEO+Z4Rz7GoI+dsHVneZNONvhczuA+llOZNM= github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE= github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= -github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= 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/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= -github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/broady/gogeohash v0.0.0-20120525094510-7b2c40d64042 h1:iEdmkrNMLXbM7ecffOAtZJQOQUTE4iMonxrb5opUgE4= -github.com/broady/gogeohash v0.0.0-20120525094510-7b2c40d64042/go.mod h1:f1L9YvXvlt9JTa+A17trQjSMM6bV40f+tHjB+Pi+Fqk= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= -github.com/cenkalti/backoff/v3 v3.0.0/go.mod h1:cIeZDE3IrqwwJl6VUwCN6trj1oXrTS4rc0ij+ULvLYs= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cockroachdb/apd/v2 v2.0.3-0.20200518165714-d020e156310a h1:9VFe4R5FRCUyidB1rdm3XdCRVuD/75P7Y4PtzEGhEE4= -github.com/cockroachdb/apd/v2 v2.0.3-0.20200518165714-d020e156310a/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOGr0B9pvN3Gw= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/cockroachdb/datadriven v1.0.0/go.mod h1:5Ib8Meh+jk1RlHIXej6Pzevx/NLlNvQB9pmSBZErGA4= -github.com/cockroachdb/errors v1.6.1/go.mod h1:tm6FTP5G81vwJ5lC0SizQo374JNCOPrHyXGitRJoDqM= -github.com/cockroachdb/errors v1.7.5 h1:ptyO1BLW+sBxwBTSKJfS6kGzYCVKhI7MyBhoXAnPIKM= -github.com/cockroachdb/errors v1.7.5/go.mod h1:m/IWRCPXYZ6TvLLDuC0kfLR1pp/+BiZ0h16WHaBMRMM= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f h1:o/kfcElHqOiXqcou5a3rIlMc7oJbMQkeLk0VQJ7zgqY= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= -github.com/cockroachdb/redact v1.0.6 h1:W34uRRyNR4dlZFd0MibhNELsZSgMkl52uRV/tA1xToY= -github.com/cockroachdb/redact v1.0.6/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= -github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2 h1:IKgmqgMQlVJIZj19CdocBeSfSaiCbEBZGKODaixqtHM= -github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2/go.mod h1:8BT+cPK6xvFOcRlk0R8eg+OTkcqI6baNH4xAkpiYVvQ= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= -github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= -github.com/containerd/continuity v0.0.0-20190827140505-75bee3e2ccb6/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 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/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= +github.com/denisenkom/go-mssqldb v0.10.0 h1:QykgLZBorFE95+gO3u9esLd0BmbvpWp0/waNNZfHBM8= +github.com/denisenkom/go-mssqldb v0.10.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= -github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/dolthub/doltgresql v0.11.1 h1:l1yOcSevQZT+O1vQCAcVVlzKrwm6Sp7xI/VjU+H2S3Y= -github.com/dolthub/doltgresql v0.11.1/go.mod h1:OaILhJgiiHRGVkumXs6Zv1myncnf7RYyBjp8HkCPrZo= github.com/dolthub/flatbuffers/v23 v23.3.3-dh.2 h1:u3PMzfF8RkKd3lB9pZ2bfn0qEG+1Gms9599cr0REMww= github.com/dolthub/flatbuffers/v23 v23.3.3-dh.2/go.mod h1:mIEZOHnFx4ZMQeawhw9rhsj+0zwQj7adVsnBX7t+eKY= github.com/dolthub/go-icu-regex v0.0.0-20230524105445-af7e7991c97e h1:kPsT4a47cw1+y/N5SSCkma7FhAPw7KeGmD6c9PBZW9Y= @@ -110,38 +64,23 @@ github.com/dolthub/go-mysql-server v0.18.2-0.20240815142344-761713e36043 h1:KgrD github.com/dolthub/go-mysql-server v0.18.2-0.20240815142344-761713e36043/go.mod h1:nbdOzd0ceWONE80vbfwoRBjut7z3CIj69ZgDF/cKuaA= github.com/dolthub/jsonpath v0.0.2-0.20240227200619-19675ab05c71 h1:bMGS25NWAGTEtT5tOBsCuCrlYnLRKpbJVJkDbrTRhwQ= github.com/dolthub/jsonpath v0.0.2-0.20240227200619-19675ab05c71/go.mod h1:2/2zjLQ/JOOSbbSboojeg+cAwcRV0fDLzIiWch/lhqI= +github.com/dolthub/sqllogictest/go v0.0.0-20240618184124-ca47f9354216 h1:JWkKRE4EHUcEVQCMRBej8DYxjYjRz/9MdF/NNQh0o70= +github.com/dolthub/sqllogictest/go v0.0.0-20240618184124-ca47f9354216/go.mod h1:e/FIZVvT2IR53HBCAo41NjqgtEnjMJGKca3Y/dAmZaA= github.com/dolthub/vitess v0.0.0-20240807181005-71d735078e24 h1:/zCd98CLZURqK85jQ+qRmEMx/dpXz85F1/Et7gqMGkk= github.com/dolthub/vitess v0.0.0-20240807181005-71d735078e24/go.mod h1:uBvlRluuL+SbEWTCZ68o0xvsdYZER3CEG/35INdzfJM= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= -github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= -github.com/fanixk/geohash v0.0.0-20150324002647-c1f9b5fa157a h1:Fyfh/dsHFrC6nkX7H7+nFdTd1wROlX/FxEIWVpKYf1U= -github.com/fanixk/geohash v0.0.0-20150324002647-c1f9b5fa157a/go.mod h1:UgNw+PTmmGN8rV7RvjvnBMsoTU8ZXXnaT3hYsDTBlgQ= -github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= -github.com/flosch/pongo2 v0.0.0-20190707114632-bbf5a6c351f4/go.mod h1:T9YF2M40nIgbVgp3rreNmTged+9HrbNTIQf1PsaIiTA= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= -github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= -github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= -github.com/go-errors/errors v1.0.1 h1:LUHzmkK3GUKUrL/1gfBUxAHzcev3apQlezX/+O7ma6w= -github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.10.0 h1:dXFJfIHVvUcpSgDOV+Ne6t7jXri8Tfv2uOLHUZ2XNuo= @@ -152,28 +91,24 @@ github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= -github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= 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/gocraft/dbr/v2 v2.7.2 h1:ccUxMuz6RdZvD7VPhMRRMSS/ECF3gytPhPtcavjktHk= +github.com/gocraft/dbr/v2 v2.7.2/go.mod h1:5bCqyIXO5fYn3jEp/L06QF4K1siFdhxChMjdNu6YJrg= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= -github.com/golang/geo v0.0.0-20200730024412-e86565bf3f35 h1:enTowfyfjtomBQhxX9mhUD+0tZhpe4rIzStO4aNlou8= -github.com/golang/geo v0.0.0-20200730024412-e86565bf3f35/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe h1:lXe2qZdvpiX5WZkZR4hgp4KJVfY3nMkvmwbVkpv1rVY= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -181,17 +116,7 @@ github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfb github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -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 v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/flatbuffers v24.3.25+incompatible h1:CX395cjN9Kke9mmalRoL3d81AtFUxJM+yDthflgJGkI= @@ -199,16 +124,12 @@ github.com/google/flatbuffers v24.3.25+incompatible/go.mod h1:1AeVuKshWv4vARoZat github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= 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/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 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/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= @@ -218,12 +139,9 @@ github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2z github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -242,24 +160,16 @@ github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huandu/xstrings v1.3.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= -github.com/hydrogen18/memlistener v0.0.0-20141126152155-54553eb933fb/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= -github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= -github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= -github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= -github.com/iris-contrib/i18n v0.0.0-20171121225848-987a633949d0/go.mod h1:pMCz62A0xJL6I+umB2YTlFRwWXaDFA0jy+5HzGiJjqI= -github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmoiron/sqlx v1.3.4/go.mod h1:2BljVx/86SuTyjE+aPYlHCTNvZrnJXghYGpNiXLBMCQ= github.com/jmoiron/sqlx v1.4.0 h1:1PLqN7S1UYp5t4SrVVnt4nUVNemrDAtxlulVe+Qgm3o= github.com/jmoiron/sqlx v1.4.0/go.mod h1:ZrZ7UsYB/weZdl2Bxg6jCRO9c3YHl8r3ahlKmRT4JLY= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= @@ -267,29 +177,15 @@ github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCV github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/juju/errors v0.0.0-20181118221551-089d3ea4e4d5/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q= -github.com/juju/loggo v0.0.0-20180524022052-584905176618/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U= -github.com/juju/testing v0.0.0-20180920084828-472a3e8b2073/go.mod h1:63prj8cnj0tU0S9OHjGJn+b1h0ZghCndfnbQolrYTwA= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= -github.com/kataras/golog v0.0.9/go.mod h1:12HJgwBIZFNGL0EJnMRhmvGA0PQGx8VFwrZtM4CqbAk= -github.com/kataras/iris/v12 v12.0.1/go.mod h1:udK4vLQKkdDqMGJJVd/msuMtN6hpYJhg/lSzuxjhO+U= -github.com/kataras/neffos v0.0.10/go.mod h1:ZYmJC07hQPW67eKuzlfY7SO3bC0mw83A3j6im82hfqw= -github.com/kataras/pio v0.0.0-20190103105442-ea782b38602d/go.mod h1:NV88laa9UiiDuX9AhMbDPkGYSPugBOV6yTZB1l2K9Z0= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kisielk/sqlstruct v0.0.0-20201105191214-5f3e10d3ab46/go.mod h1:yyMNCyc/Ib3bDTKd379tNMpB/7/H5TjM2Y9QJ5THLbE= -github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.9.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= -github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= 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/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= @@ -298,48 +194,37 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/labstack/echo/v4 v4.1.11/go.mod h1:i541M3Fj6f76NZtHSj7TXnyM8n2gaodfvfxNnFqi74g= -github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc h1:RKf14vYWi2ttpEmkA4aQ3j4u9dStX2t4M8UM6qqNsG8= github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc/go.mod h1:kopuH9ugFRkIXf3YoqHKyrJ9YfUFsckUU9S7B+XP+is= github.com/lestrrat-go/strftime v1.0.4 h1:T1Rb9EPkAhgxKqbcMIPguPq8glqXTA1koF8n9BHElA8= github.com/lestrrat-go/strftime v1.0.4/go.mod h1:E1nN3pCbtMSu1yjSVeyuRFVm/U0xoR76fd03sz+Qz4g= -github.com/lib/pq v0.0.0-20180327071824-d34b9ff171c2/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.10.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/marcboeker/go-duckdb v1.7.1 h1:m9/nKfP7cG9AptcQ95R1vfacRuhtrZE5pZF8BPUb/Iw= github.com/marcboeker/go-duckdb v1.7.1/go.mod h1:2oV8BZv88S16TKGKM+Lwd0g7DX84x0jMxjTInThC8Is= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= 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/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/mattn/go-sqlite3 v1.14.7/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= -github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/mediocregopher/mediocre-go-lib v0.0.0-20181029021733-cb65787f37ed/go.mod h1:dSsfyI2zABAdhcbvkXqgxOxrCsbYeHCPgrZkku60dSg= -github.com/mediocregopher/radix/v3 v3.3.0/go.mod h1:EmfVyvspXz1uZEyPBMyGK+kjWiKQGvsUt6O3Pj+LDCQ= -github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= @@ -347,64 +232,42 @@ github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:F github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/mmcloughlin/geohash v0.9.0 h1:FihR004p/aE1Sju6gcVq5OLDqGcMnpBY+8moBqIsVOs= -github.com/mmcloughlin/geohash v0.9.0/go.mod h1:oNZxQo5yWJh0eMQEP/8hwQuVx9Z9tjwFUqcTB1SmG0c= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= -github.com/nats-io/nats.go v1.8.1/go.mod h1:BrFz9vVn0fU3AcH9Vn4Kd7W0NpJ651tD5omQ3M8LwxM= github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= -github.com/nats-io/nkeys v0.0.2/go.mod h1:dab7URMsZm6Z/jp9Z5UGa87Uutgc2mVpXLC4B7TDb/4= github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= -github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= -github.com/ory/dockertest/v3 v3.6.0/go.mod h1:4ZOpj8qBUmh8fcBSVzkH2bws2s91JdGvHUqan4GHEuQ= github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= 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/pierrre/compare v1.0.2 h1:k4IUsHgh+dbcAOIWCfxVa/7G6STjADH2qmhomv+1quc= -github.com/pierrre/compare v1.0.2/go.mod h1:8UvyRHH+9HS8Pczdd2z5x/wvv67krDwVxoOndaIIDVU= -github.com/pierrre/geohash v1.0.0 h1:f/zfjdV4rVofTCz1FhP07T+EMQAvcMM2ioGZVt+zqjI= -github.com/pierrre/geohash v1.0.0/go.mod h1:atytaeVa21hj5F6kMebHYPf8JbIrGxK2FSzN2ajKXms= -github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= -github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -439,28 +302,21 @@ github.com/prometheus/procfs v0.13.0 h1:GqzLlQyfsPbaEHaQkO7tbDlriv/4o5Hudv6OXHGK github.com/prometheus/procfs v0.13.0/go.mod h1:cd4PFCR54QLnGKPaKGA6l+cfuNXtht43ZKY6tow0Y1g= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8= github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= -github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= @@ -468,14 +324,8 @@ github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1 github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= @@ -484,43 +334,16 @@ github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 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/tetratelabs/wazero v1.1.0 h1:EByoAhC+QcYpwSZJSs/aV0uokxPwBgKxfiokSUwAknQ= github.com/tetratelabs/wazero v1.1.0/go.mod h1:wYx2gNRg8/WihJfSDxA1TIL8H+GkfLYm+bIfbblu9VQ= -github.com/the42/cartconvert v0.0.0-20131203171324-aae784c392b8 h1:I4DY8wLxJXCrMYzDM6lKCGc3IQwJX0PlTLsd3nQqI3c= -github.com/the42/cartconvert v0.0.0-20131203171324-aae784c392b8/go.mod h1:fWO/msnJVhHqN1yX6OBoxSyfj7TEj1hHiL8bJSQsK30= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/twpayne/go-geom v1.3.6 h1:O27mIXZnMYiZi0ZD8ewjs/IT/ZOFVbZHBzPjA9skdmg= -github.com/twpayne/go-geom v1.3.6/go.mod h1:XTyWHR6+l9TUYONbbK4ImUTYbWDCu2ySSPrZmmiA0Pg= -github.com/twpayne/go-kml v1.5.1/go.mod h1:kz8jAiIz6FIdU2Zjce9qGlVtgFYES9vt7BTPBHf5jl4= -github.com/twpayne/go-kml v1.5.2-0.20200728095708-9f2fd4dfcbfe h1:rnfmzOnur92AXhw1B1ZFCUmGDI6V0Q5JYaKCEfN6P0c= -github.com/twpayne/go-kml v1.5.2-0.20200728095708-9f2fd4dfcbfe/go.mod h1:kz8jAiIz6FIdU2Zjce9qGlVtgFYES9vt7BTPBHf5jl4= -github.com/twpayne/go-polyline v1.0.0/go.mod h1:ICh24bcLYBX8CknfvNPKqoTbe+eg+MX1NPyJmSBo7pU= -github.com/twpayne/go-waypoint v0.0.0-20200706203930-b263a7f6e4e8/go.mod h1:qj5pHncxKhu9gxtZEYWypA/z097sxhFlbTyOyt9gcnU= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= -github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= -github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= -github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= -github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= -github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= 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= @@ -543,13 +366,13 @@ go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= 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= @@ -560,8 +383,6 @@ golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 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.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -575,31 +396,21 @@ golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190327091125-710a502c58a2/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191003171128-d98b1b443823/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ= golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -610,26 +421,14 @@ golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200121082415-34d275377bf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -638,7 +437,6 @@ golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -646,29 +444,21 @@ golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190327201419-c70d86f8b7cf/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= 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-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 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= @@ -677,20 +467,14 @@ google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMt google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/genproto v0.0.0-20180518175338-11a468237815/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de h1:F6qOa9AZTYJXOUEr4jDysRDLrm4PHePlge4v4TGAlxY= -google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo= -google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de h1:jFNzHPIeuzhdRwVhbZdiym9q0ory/xY3sA+v2wPg8I0= -google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:5iCWqnniDlqZHrd3neWVTOwvh/v6s3232omMecelax8= google.golang.org/genproto/googleapis/rpc v0.0.0-20240227224415-6ceb2ff114de h1:cZGRis4/ot9uVm639a+rHCUaG0JJHEsdyzSQTMX+suY= google.golang.org/genproto/googleapis/rpc v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:H4O17MA/PE9BsGx3w+a+W2VOLLD1Qf7oJneAoU6WktY= -google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= @@ -699,34 +483,20 @@ google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ij google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.63.2 h1:MUeiw1B2maTVZthpU5xvASfTh3LDbxHd6IJ6QQVU+xM= google.golang.org/grpc v1.63.2/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= -gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= -gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= -gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/src-d/go-errors.v1 v1.0.0 h1:cooGdZnCjYbeS1zb1s6pVAAimTdKceRrpn7aKOnNIfc= gopkg.in/src-d/go-errors.v1 v1.0.0/go.mod h1:q1cBlomlw2FnDBDNGlnh6X0jPihy+QxZfMMNxPCbdYg= @@ -736,14 +506,9 @@ gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRN gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/main.go b/main.go index ec6d18f2..3522b917 100644 --- a/main.go +++ b/main.go @@ -36,8 +36,7 @@ import ( var ( address = "localhost" port = 3306 - dbName = "mysql" - dbFile = dbName + ".db" + dbFile = "mysql.db" ) func checkDependencies() { @@ -64,11 +63,7 @@ func main() { engine := sqle.NewDefault(provider) - builder := &DuckBuilder{ - provider: provider, - base: engine.Analyzer.ExecBuilder, - db: provider.Storage(), - } + builder := NewDuckBuilder(engine.Analyzer.ExecBuilder, provider.Storage(), provider.CatalogName()) engine.Analyzer.ExecBuilder = builder if err := setPersister(provider, engine); err != nil { diff --git a/main_test.go b/main_test.go new file mode 100644 index 00000000..d465f922 --- /dev/null +++ b/main_test.go @@ -0,0 +1,1065 @@ +// Copyright 2024 ApeCloud, Inc. + +// Copyright 2020-2021 Dolthub, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package main + +import ( + "fmt" + "log" + "os" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/dolthub/go-mysql-server/enginetest" + "github.com/dolthub/go-mysql-server/enginetest/queries" + "github.com/dolthub/go-mysql-server/enginetest/scriptgen/setup" + "github.com/dolthub/go-mysql-server/memory" + "github.com/dolthub/go-mysql-server/sql" + "github.com/dolthub/go-mysql-server/sql/expression" + "github.com/dolthub/go-mysql-server/sql/types" + _ "github.com/dolthub/go-mysql-server/sql/variables" +) + +type indexBehaviorTestParams struct { + name string + driverInitializer IndexDriverInitializer + nativeIndexes bool +} + +var numPartitionsVals = []int{ + 1, + testNumPartitions, +} +var indexBehaviors = []*indexBehaviorTestParams{ + {"none", nil, false}, + {"mergableIndexes", mergableIndexDriver, false}, + {"nativeIndexes", nil, true}, + {"nativeAndMergable", mergableIndexDriver, true}, +} +var parallelVals = []int{ + 1, + 2, +} + +// TestQueries tests the given queries on an engine under a variety of circumstances: +// 1) Partitioned tables / non partitioned tables +// 2) Mergeable / unmergeable / native / no indexes +// 3) Parallelism on / off +func TestQueries(t *testing.T) { + for _, numPartitions := range numPartitionsVals { + for _, indexBehavior := range indexBehaviors { + for _, parallelism := range parallelVals { + if parallelism == 1 && numPartitions == testNumPartitions && indexBehavior.name == "nativeIndexes" { + // This case is covered by TestQueriesSimple + continue + } + testName := fmt.Sprintf("partitions=%d,indexes=%v,parallelism=%v", numPartitions, indexBehavior.name, parallelism) + harness := NewDuckHarness(testName, parallelism, numPartitions, indexBehavior.nativeIndexes, indexBehavior.driverInitializer) + + t.Run(testName, func(t *testing.T) { + enginetest.TestQueries(t, harness) + }) + } + } + } +} + +// TestQueriesPreparedSimple runs the canonical test queries against a single threaded index enabled harness. +func TestQueriesPreparedSimple(t *testing.T) { + harness := NewDefaultDuckHarness() + if harness.IsUsingServer() { + t.Skip("issue: https://github.com/dolthub/dolt/issues/6904 and https://github.com/dolthub/dolt/issues/6901") + } + enginetest.TestQueriesPrepared(t, harness) +} + +// TestQueriesSimple runs the canonical test queries against a single threaded index enabled harness. +func TestQueriesSimple(t *testing.T) { + harness := NewDefaultDuckHarness() + enginetest.TestQueries(t, harness) +} + +// TestJoinQueries runs the canonical test queries against a single threaded index enabled harness. +func TestJoinQueries(t *testing.T) { + enginetest.TestJoinQueries(t, NewDefaultDuckHarness()) +} + +func TestLateralJoin(t *testing.T) { + enginetest.TestLateralJoinQueries(t, NewDefaultDuckHarness()) +} + +// TestJoinPlanning runs join-specific tests for merge +func TestJoinPlanning(t *testing.T) { + enginetest.TestJoinPlanning(t, NewDefaultDuckHarness()) +} + +// TestJoinOps runs join-specific tests for merge +func TestJoinOps(t *testing.T) { + enginetest.TestJoinOps(t, NewDefaultDuckHarness(), enginetest.DefaultJoinOpTests) +} + +func TestJoinStats(t *testing.T) { + harness := NewDefaultDuckHarness() + if harness.IsUsingServer() { + t.Skip("join stats don't work with bindvars") + } + enginetest.TestJoinStats(t, harness) +} + +// TestJSONTableQueries runs the canonical test queries against a single threaded index enabled harness. +func TestJSONTableQueries(t *testing.T) { + enginetest.TestJSONTableQueries(t, NewDefaultDuckHarness()) +} + +// TestJSONTableScripts runs the canonical test queries against a single threaded index enabled harness. +func TestJSONTableScripts(t *testing.T) { + enginetest.TestJSONTableScripts(t, NewDefaultDuckHarness()) +} + +// TestBrokenJSONTableScripts runs the canonical test queries against a single threaded index enabled harness. +func TestBrokenJSONTableScripts(t *testing.T) { + enginetest.TestBrokenJSONTableScripts(t, enginetest.NewSkippingMemoryHarness()) +} + +// Convenience test for debugging a single query. Unskip and set to the desired query. +func TestSingleQuery(t *testing.T) { + t.Skip() + test := queries.QueryTest{ + Query: `select a.i,a.f, b.i2 from niltable a left join niltable b on a.i = b.i2 order by a.i`, + Expected: []sql.Row{{1, nil, nil}, {2, nil, 2}, {3, nil, nil}, {4, 4.0, 4}, {5, 5.0, nil}, {6, 6.0, 6}}, + } + + // fmt.Sprintf("%v", test) + harness := NewDuckHarness("", 1, testNumPartitions, true, nil) + // harness.UseServer() + harness.Setup(setup.MydbData, setup.NiltableData) + engine, err := harness.NewEngine(t) + require.NoError(t, err) + + engine.EngineAnalyzer().Debug = true + engine.EngineAnalyzer().Verbose = true + + enginetest.TestQueryWithEngine(t, harness, engine, test) +} + +// Convenience test for debugging a single query. Unskip and set to the desired query. +func TestSingleQueryPrepared(t *testing.T) { + t.Skip() + var test = queries.ScriptTest{ + Name: "renaming views with RENAME TABLE ... TO .. statement", + SetUpScript: []string{}, + Assertions: []queries.ScriptTestAssertion{ + { + // Original Issue: https://github.com/dolthub/dolt/issues/5714 + Query: `select 1.0/0.0 from dual`, + + Expected: []sql.Row{ + {4}, + }, + }, + }, + } + + // fmt.Sprintf("%v", test) + harness := NewDuckHarness("", 1, testNumPartitions, false, nil) + harness.Setup(setup.KeylessSetup...) + engine, err := harness.NewEngine(t) + if err != nil { + panic(err) + } + + engine.EngineAnalyzer().Debug = true + engine.EngineAnalyzer().Verbose = true + + enginetest.TestScriptWithEnginePrepared(t, engine, harness, test) +} + +// Convenience test for debugging a single query. Unskip and set to the desired query. +func TestSingleScript(t *testing.T) { + t.Skip() + var scripts = []queries.ScriptTest{ + { + Name: "test script", + SetUpScript: []string{}, + Assertions: []queries.ScriptTestAssertion{}, + }, + } + + for _, test := range scripts { + harness := NewDuckHarness("", 1, testNumPartitions, true, nil) + engine, err := harness.NewEngine(t) + if err != nil { + panic(err) + } + + enginetest.TestScriptWithEngine(t, engine, harness, test) + } +} + +func TestUnbuildableIndex(t *testing.T) { + var scripts = []queries.ScriptTest{ + { + Name: "Failing index builder still returning correct results", + SetUpScript: []string{ + "CREATE TABLE mytable2 (i BIGINT PRIMARY KEY, s VARCHAR(20))", + "CREATE UNIQUE INDEX mytable2_s ON mytable2 (s)", + fmt.Sprintf("CREATE INDEX mytable2_i_s ON mytable2 (i, s) COMMENT '%s'", memory.CommentPreventingIndexBuilding), + "INSERT INTO mytable2 VALUES (1, 'first row'), (2, 'second row'), (3, 'third row')", + }, + Assertions: []queries.ScriptTestAssertion{ + { + Query: "SELECT i FROM mytable2 WHERE i IN (SELECT i FROM mytable2) ORDER BY i", + Expected: []sql.Row{ + {1}, + {2}, + {3}, + }, + }, + }, + }, + } + + for _, test := range scripts { + harness := NewDefaultDuckHarness() + enginetest.TestScript(t, harness, test) + } +} + +func TestBrokenQueries(t *testing.T) { + enginetest.TestBrokenQueries(t, enginetest.NewSkippingMemoryHarness()) +} + +func TestQueryPlanTODOs(t *testing.T) { + harness := enginetest.NewSkippingMemoryHarness() + harness.Setup(setup.MydbData, setup.Pk_tablesData, setup.NiltableData) + e, err := harness.NewEngine(t) + if err != nil { + log.Fatal(err) + } + for _, tt := range queries.QueryPlanTODOs { + t.Run(tt.Query, func(t *testing.T) { + enginetest.TestQueryPlan(t, harness, e, tt) + }) + } +} + +// func TestVersionedQueries(t *testing.T) { +// for _, numPartitions := range numPartitionsVals { +// for _, indexInit := range indexBehaviors { +// for _, parallelism := range parallelVals { +// testName := fmt.Sprintf("partitions=%d,indexes=%v,parallelism=%v", numPartitions, indexInit.name, parallelism) +// harness := NewMetaHarness(testName, parallelism, numPartitions, indexInit.nativeIndexes, indexInit.driverInitializer) + +// t.Run(testName, func(t *testing.T) { +// enginetest.TestVersionedQueries(t, harness) +// }) +// } +// } +// } +// } + +func TestAnsiQuotesSqlMode(t *testing.T) { + enginetest.TestAnsiQuotesSqlMode(t, NewDefaultDuckHarness()) +} + +func TestAnsiQuotesSqlModePrepared(t *testing.T) { + harness := NewDefaultDuckHarness() + if harness.IsUsingServer() { + t.Skip("prepared test depend on context for current sql_mode information, but it does not get updated when using ServerEngine") + } + enginetest.TestAnsiQuotesSqlModePrepared(t, NewDefaultDuckHarness()) +} + +// Tests of choosing the correct execution plan independent of result correctness. Mostly useful for confirming that +// the right indexes are being used for joining tables. +func TestQueryPlans(t *testing.T) { + indexBehaviors := []*indexBehaviorTestParams{ + {"nativeIndexes", nil, true}, + {"nativeAndMergable", mergableIndexDriver, true}, + } + + for _, indexInit := range indexBehaviors { + t.Run(indexInit.name, func(t *testing.T) { + harness := NewDuckHarness(indexInit.name, 1, 2, indexInit.nativeIndexes, indexInit.driverInitializer) + enginetest.TestQueryPlans(t, harness, queries.PlanTests) + }) + } +} + +func TestSingleQueryPlan(t *testing.T) { + t.Skip() + tt := []queries.QueryPlanTest{ + { + Query: `SELECT mytable.i, selfjoin.i FROM mytable INNER JOIN mytable selfjoin ON mytable.i = selfjoin.i WHERE selfjoin.i IN (SELECT 1 FROM DUAL)`, + ExpectedPlan: "Project\n" + + " ├─ columns: [mytable.i:0!null, selfjoin.i:2!null]\n" + + " └─ SemiJoin\n" + + " ├─ MergeJoin\n" + + " │ ├─ cmp: Eq\n" + + " │ │ ├─ mytable.i:0!null\n" + + " │ │ └─ selfjoin.i:2!null\n" + + " │ ├─ IndexedTableAccess(mytable)\n" + + " │ │ ├─ index: [mytable.i,mytable.s]\n" + + " │ │ ├─ static: [{[NULL, ∞), [NULL, ∞)}]\n" + + " │ │ ├─ colSet: (1,2)\n" + + " │ │ ├─ tableId: 1\n" + + " │ │ └─ Table\n" + + " │ │ ├─ name: mytable\n" + + " │ │ └─ columns: [i s]\n" + + " │ └─ Filter\n" + + " │ ├─ Eq\n" + + " │ │ ├─ selfjoin.i:0!null\n" + + " │ │ └─ 1 (tinyint)\n" + + " │ └─ TableAlias(selfjoin)\n" + + " │ └─ IndexedTableAccess(mytable)\n" + + " │ ├─ index: [mytable.i]\n" + + " │ ├─ static: [{[1, 1]}]\n" + + " │ ├─ colSet: (3,4)\n" + + " │ ├─ tableId: 2\n" + + " │ └─ Table\n" + + " │ ├─ name: mytable\n" + + " │ └─ columns: [i s]\n" + + " └─ Project\n" + + " ├─ columns: [1 (tinyint)]\n" + + " └─ ProcessTable\n" + + " └─ Table\n" + + " ├─ name: \n" + + " └─ columns: []\n" + + "", + ExpectedEstimates: "Project\n" + + " ├─ columns: [mytable.i, selfjoin.i]\n" + + " └─ SemiJoin (estimated cost=4.515 rows=1)\n" + + " ├─ MergeJoin (estimated cost=6.090 rows=3)\n" + + " │ ├─ cmp: (mytable.i = selfjoin.i)\n" + + " │ ├─ IndexedTableAccess(mytable)\n" + + " │ │ ├─ index: [mytable.i,mytable.s]\n" + + " │ │ └─ filters: [{[NULL, ∞), [NULL, ∞)}]\n" + + " │ └─ Filter\n" + + " │ ├─ (selfjoin.i = 1)\n" + + " │ └─ TableAlias(selfjoin)\n" + + " │ └─ IndexedTableAccess(mytable)\n" + + " │ ├─ index: [mytable.i]\n" + + " │ └─ filters: [{[1, 1]}]\n" + + " └─ Project\n" + + " ├─ columns: [1]\n" + + " └─ Table\n" + + " └─ name: \n" + + "", + ExpectedAnalysis: "Project\n" + + " ├─ columns: [mytable.i, selfjoin.i]\n" + + " └─ SemiJoin (estimated cost=4.515 rows=1) (actual rows=1 loops=1)\n" + + " ├─ MergeJoin (estimated cost=6.090 rows=3) (actual rows=1 loops=1)\n" + + " │ ├─ cmp: (mytable.i = selfjoin.i)\n" + + " │ ├─ IndexedTableAccess(mytable)\n" + + " │ │ ├─ index: [mytable.i,mytable.s]\n" + + " │ │ └─ filters: [{[NULL, ∞), [NULL, ∞)}]\n" + + " │ └─ Filter\n" + + " │ ├─ (selfjoin.i = 1)\n" + + " │ └─ TableAlias(selfjoin)\n" + + " │ └─ IndexedTableAccess(mytable)\n" + + " │ ├─ index: [mytable.i]\n" + + " │ └─ filters: [{[1, 1]}]\n" + + " └─ Project\n" + + " ├─ columns: [1]\n" + + " └─ Table\n" + + " └─ name: \n" + + "", + }, + } + + harness := NewDuckHarness("nativeIndexes", 1, 2, true, nil) + harness.Setup(setup.PlanSetup...) + + for _, test := range tt { + t.Run(test.Query, func(t *testing.T) { + engine, err := harness.NewEngine(t) + engine.EngineAnalyzer().Verbose = true + engine.EngineAnalyzer().Debug = true + + require.NoError(t, err) + enginetest.TestQueryPlan(t, harness, engine, test) + }) + } +} + +func TestIntegrationQueryPlans(t *testing.T) { + indexBehaviors := []*indexBehaviorTestParams{ + {"nativeIndexes", nil, true}, + } + + for _, indexInit := range indexBehaviors { + t.Run(indexInit.name, func(t *testing.T) { + harness := NewDuckHarness(indexInit.name, 1, 1, indexInit.nativeIndexes, indexInit.driverInitializer) + enginetest.TestIntegrationPlans(t, harness) + }) + } +} + +func TestImdbQueryPlans(t *testing.T) { + t.Skip("tests are too slow") + indexBehaviors := []*indexBehaviorTestParams{ + {"nativeIndexes", nil, true}, + } + + for _, indexInit := range indexBehaviors { + t.Run(indexInit.name, func(t *testing.T) { + harness := NewDuckHarness(indexInit.name, 1, 1, indexInit.nativeIndexes, indexInit.driverInitializer) + enginetest.TestImdbPlans(t, harness) + }) + } +} + +func TestTpccQueryPlans(t *testing.T) { + indexBehaviors := []*indexBehaviorTestParams{ + {"nativeIndexes", nil, true}, + } + + for _, indexInit := range indexBehaviors { + t.Run(indexInit.name, func(t *testing.T) { + harness := NewDuckHarness(indexInit.name, 1, 1, indexInit.nativeIndexes, indexInit.driverInitializer) + enginetest.TestTpccPlans(t, harness) + }) + } +} + +func TestTpchQueryPlans(t *testing.T) { + indexBehaviors := []*indexBehaviorTestParams{ + {"nativeIndexes", nil, true}, + } + + for _, indexInit := range indexBehaviors { + t.Run(indexInit.name, func(t *testing.T) { + harness := NewDuckHarness(indexInit.name, 1, 1, indexInit.nativeIndexes, indexInit.driverInitializer) + enginetest.TestTpchPlans(t, harness) + }) + } +} + +func TestTpcdsQueryPlans(t *testing.T) { + t.Skip("missing features") + indexBehaviors := []*indexBehaviorTestParams{ + {"nativeIndexes", nil, true}, + } + + for _, indexInit := range indexBehaviors { + t.Run(indexInit.name, func(t *testing.T) { + harness := NewDuckHarness(indexInit.name, 1, 1, indexInit.nativeIndexes, indexInit.driverInitializer) + enginetest.TestTpcdsPlans(t, harness) + }) + } +} + +func TestIndexQueryPlans(t *testing.T) { + indexBehaviors := []*indexBehaviorTestParams{ + {"nativeIndexes", nil, true}, + {"nativeAndMergable", mergableIndexDriver, true}, + } + + for _, indexInit := range indexBehaviors { + t.Run(indexInit.name, func(t *testing.T) { + harness := NewDuckHarness(indexInit.name, 1, 2, indexInit.nativeIndexes, indexInit.driverInitializer) + enginetest.TestIndexQueryPlans(t, harness) + }) + } +} + +func TestParallelismQueries(t *testing.T) { + enginetest.TestParallelismQueries(t, NewDuckHarness("default", 2, testNumPartitions, true, nil)) +} + +func TestQueryErrors(t *testing.T) { + enginetest.TestQueryErrors(t, NewDefaultDuckHarness()) +} + +func TestInfoSchema(t *testing.T) { + enginetest.TestInfoSchema(t, NewDuckHarness("default", 1, testNumPartitions, true, mergableIndexDriver)) +} + +func TestMySqlDb(t *testing.T) { + enginetest.TestMySqlDb(t, NewDefaultDuckHarness()) +} + +// func TestReadOnlyDatabases(t *testing.T) { +// enginetest.TestReadOnlyDatabases(t, NewReadOnlyMetaHarness()) +// } + +// func TestReadOnlyVersionedQueries(t *testing.T) { +// enginetest.TestReadOnlyVersionedQueries(t, NewReadOnlyMetaHarness()) +// } + +func TestColumnAliases(t *testing.T) { + enginetest.TestColumnAliases(t, NewDefaultDuckHarness()) +} + +func TestDerivedTableOuterScopeVisibility(t *testing.T) { + harness := NewDefaultDuckHarness() + enginetest.TestDerivedTableOuterScopeVisibility(t, harness) +} + +func TestOrderByGroupBy(t *testing.T) { + // TODO: window validation expecting error message + enginetest.TestOrderByGroupBy(t, NewDefaultDuckHarness()) +} + +func TestAmbiguousColumnResolution(t *testing.T) { + enginetest.TestAmbiguousColumnResolution(t, NewDefaultDuckHarness()) +} + +func TestInsertInto(t *testing.T) { + harness := NewDefaultDuckHarness() + enginetest.TestInsertInto(t, harness) +} + +func TestInsertIgnoreInto(t *testing.T) { + enginetest.TestInsertIgnoreInto(t, NewDefaultDuckHarness()) +} + +func TestInsertDuplicateKeyKeyless(t *testing.T) { + enginetest.TestInsertDuplicateKeyKeyless(t, NewDefaultDuckHarness()) +} + +func TestIgnoreIntoWithDuplicateUniqueKeyKeyless(t *testing.T) { + enginetest.TestIgnoreIntoWithDuplicateUniqueKeyKeyless(t, NewDefaultDuckHarness()) +} + +func TestInsertIntoErrors(t *testing.T) { + enginetest.TestInsertIntoErrors(t, NewDefaultDuckHarness()) +} + +func TestBrokenInsertScripts(t *testing.T) { + enginetest.TestBrokenInsertScripts(t, NewDefaultDuckHarness()) +} + +func TestGeneratedColumns(t *testing.T) { + enginetest.TestGeneratedColumns(t, NewDefaultDuckHarness()) +} + +func TestGeneratedColumnPlans(t *testing.T) { + enginetest.TestGeneratedColumnPlans(t, NewDefaultDuckHarness()) +} + +func TestSysbenchPlans(t *testing.T) { + enginetest.TestSysbenchPlans(t, NewDefaultDuckHarness()) +} + +func TestStatistics(t *testing.T) { + enginetest.TestStatistics(t, NewDefaultDuckHarness()) +} + +func TestStatisticIndexFilters(t *testing.T) { + enginetest.TestStatisticIndexFilters(t, NewDefaultDuckHarness()) +} + +func TestSpatialInsertInto(t *testing.T) { + enginetest.TestSpatialInsertInto(t, NewDefaultDuckHarness()) +} + +func TestLoadData(t *testing.T) { + enginetest.TestLoadData(t, NewDefaultDuckHarness()) +} + +func TestLoadDataErrors(t *testing.T) { + enginetest.TestLoadDataErrors(t, NewDefaultDuckHarness()) +} + +func TestLoadDataFailing(t *testing.T) { + enginetest.TestLoadDataFailing(t, NewDefaultDuckHarness()) +} + +func TestSelectIntoFile(t *testing.T) { + enginetest.TestSelectIntoFile(t, NewDefaultDuckHarness()) +} + +func TestReplaceInto(t *testing.T) { + enginetest.TestReplaceInto(t, NewDefaultDuckHarness()) +} + +func TestReplaceIntoErrors(t *testing.T) { + enginetest.TestReplaceIntoErrors(t, NewDefaultDuckHarness()) +} + +func TestUpdate(t *testing.T) { + enginetest.TestUpdate(t, NewDuckHarness("default", 1, testNumPartitions, true, mergableIndexDriver)) +} + +func TestUpdateIgnore(t *testing.T) { + enginetest.TestUpdateIgnore(t, NewDuckHarness("default", 1, testNumPartitions, true, mergableIndexDriver)) +} + +func TestUpdateErrors(t *testing.T) { + // TODO different errors + enginetest.TestUpdateErrors(t, NewDuckHarness("default", 1, testNumPartitions, true, mergableIndexDriver)) +} + +func TestOnUpdateExprScripts(t *testing.T) { + enginetest.TestOnUpdateExprScripts(t, NewDuckHarness("default", 1, testNumPartitions, true, mergableIndexDriver)) +} + +func TestSpatialUpdate(t *testing.T) { + enginetest.TestSpatialUpdate(t, NewDuckHarness("default", 1, testNumPartitions, true, mergableIndexDriver)) +} + +func TestDeleteFromErrors(t *testing.T) { + enginetest.TestDeleteErrors(t, NewDuckHarness("default", 1, testNumPartitions, true, mergableIndexDriver)) +} + +func TestSpatialDeleteFrom(t *testing.T) { + enginetest.TestSpatialDelete(t, NewDuckHarness("default", 1, testNumPartitions, true, mergableIndexDriver)) +} + +func TestTruncate(t *testing.T) { + enginetest.TestTruncate(t, NewDuckHarness("default", 1, testNumPartitions, true, mergableIndexDriver)) +} + +func TestDeleteFrom(t *testing.T) { + enginetest.TestDelete(t, NewDuckHarness("default", 1, testNumPartitions, true, mergableIndexDriver)) +} + +func TestConvert(t *testing.T) { + enginetest.TestConvert(t, NewDuckHarness("default", 1, testNumPartitions, true, mergableIndexDriver)) +} + +func TestScripts(t *testing.T) { + enginetest.TestScripts(t, NewDuckHarness("default", 1, testNumPartitions, true, mergableIndexDriver)) +} + +func TestSpatialScripts(t *testing.T) { + enginetest.TestSpatialScripts(t, NewDuckHarness("default", 1, testNumPartitions, true, mergableIndexDriver)) +} + +func TestSpatialIndexScripts(t *testing.T) { + enginetest.TestSpatialIndexScripts(t, NewDuckHarness("default", 1, testNumPartitions, true, mergableIndexDriver)) +} + +func TestSpatialIndexPlans(t *testing.T) { + enginetest.TestSpatialIndexPlans(t, NewDuckHarness("default", 1, testNumPartitions, true, mergableIndexDriver)) +} + +func TestNumericErrorScripts(t *testing.T) { + enginetest.TestNumericErrorScripts(t, NewDuckHarness("default", 1, testNumPartitions, true, mergableIndexDriver)) +} + +func TestUserPrivileges(t *testing.T) { + harness := NewDuckHarness("default", 1, testNumPartitions, true, mergableIndexDriver) + if harness.IsUsingServer() { + t.Skip("TestUserPrivileges test depend on Context to switch the user to run test queries") + } + enginetest.TestUserPrivileges(t, harness) +} + +func TestUserAuthentication(t *testing.T) { + harness := NewDuckHarness("default", 1, testNumPartitions, true, mergableIndexDriver) + if harness.IsUsingServer() { + t.Skip("TestUserPrivileges test depend on Context to switch the user to run test queries") + } + enginetest.TestUserAuthentication(t, harness) +} + +func TestPrivilegePersistence(t *testing.T) { + enginetest.TestPrivilegePersistence(t, NewDuckHarness("default", 1, testNumPartitions, true, mergableIndexDriver)) +} + +func TestComplexIndexQueries(t *testing.T) { + harness := NewDuckHarness("default", 1, testNumPartitions, true, mergableIndexDriver) + enginetest.TestComplexIndexQueries(t, harness) +} + +func TestTriggers(t *testing.T) { + enginetest.TestTriggers(t, NewDefaultDuckHarness()) +} + +func TestShowTriggers(t *testing.T) { + enginetest.TestShowTriggers(t, NewDefaultDuckHarness()) +} + +func TestBrokenTriggers(t *testing.T) { + h := enginetest.NewSkippingMemoryHarness() + for _, script := range queries.BrokenTriggerQueries { + enginetest.TestScript(t, h, script) + } +} + +func TestStoredProcedures(t *testing.T) { + for i, test := range queries.ProcedureLogicTests { + //TODO: the RowIter returned from a SELECT should not take future changes into account + if test.Name == "FETCH captures state at OPEN" { + queries.ProcedureLogicTests[0], queries.ProcedureLogicTests[i] = queries.ProcedureLogicTests[i], queries.ProcedureLogicTests[0] + queries.ProcedureLogicTests = queries.ProcedureLogicTests[1:] + } + } + enginetest.TestStoredProcedures(t, NewDefaultDuckHarness()) +} + +func TestEvents(t *testing.T) { + enginetest.TestEvents(t, NewDefaultDuckHarness()) +} + +func TestTriggersErrors(t *testing.T) { + enginetest.TestTriggerErrors(t, NewDefaultDuckHarness()) +} + +func TestCreateTable(t *testing.T) { + enginetest.TestCreateTable(t, NewDefaultDuckHarness()) +} + +func TestRowLimit(t *testing.T) { + enginetest.TestRowLimit(t, NewDefaultDuckHarness()) +} + +func TestDropTable(t *testing.T) { + enginetest.TestDropTable(t, NewDefaultDuckHarness()) +} + +func TestRenameTable(t *testing.T) { + enginetest.TestRenameTable(t, NewDefaultDuckHarness()) +} + +func TestRenameColumn(t *testing.T) { + enginetest.TestRenameColumn(t, NewDefaultDuckHarness()) +} + +func TestAddColumn(t *testing.T) { + enginetest.TestAddColumn(t, NewDefaultDuckHarness()) +} + +func TestModifyColumn(t *testing.T) { + enginetest.TestModifyColumn(t, NewDefaultDuckHarness()) +} + +func TestDropColumn(t *testing.T) { + enginetest.TestDropColumn(t, NewDefaultDuckHarness()) +} + +func TestDropColumnKeylessTables(t *testing.T) { + enginetest.TestDropColumnKeylessTables(t, NewDefaultDuckHarness()) +} + +func TestCreateDatabase(t *testing.T) { + enginetest.TestCreateDatabase(t, NewDefaultDuckHarness()) +} + +func TestPkOrdinalsDDL(t *testing.T) { + enginetest.TestPkOrdinalsDDL(t, NewDefaultDuckHarness()) +} + +func TestPkOrdinalsDML(t *testing.T) { + enginetest.TestPkOrdinalsDML(t, NewDefaultDuckHarness()) +} + +func TestDropDatabase(t *testing.T) { + enginetest.TestDropDatabase(t, NewDefaultDuckHarness()) +} + +func TestCreateForeignKeys(t *testing.T) { + enginetest.TestCreateForeignKeys(t, NewDefaultDuckHarness()) +} + +func TestDropForeignKeys(t *testing.T) { + enginetest.TestDropForeignKeys(t, NewDefaultDuckHarness()) +} + +func TestForeignKeys(t *testing.T) { + enginetest.TestForeignKeys(t, NewDefaultDuckHarness()) +} + +func TestFulltextIndexes(t *testing.T) { + enginetest.TestFulltextIndexes(t, NewDefaultDuckHarness()) +} + +func TestCreateCheckConstraints(t *testing.T) { + enginetest.TestCreateCheckConstraints(t, NewDefaultDuckHarness()) +} + +func TestChecksOnInsert(t *testing.T) { + enginetest.TestChecksOnInsert(t, NewDefaultDuckHarness()) +} + +func TestChecksOnUpdate(t *testing.T) { + enginetest.TestChecksOnUpdate(t, NewDefaultDuckHarness()) +} + +func TestDisallowedCheckConstraints(t *testing.T) { + enginetest.TestDisallowedCheckConstraints(t, NewDefaultDuckHarness()) +} + +func TestDropCheckConstraints(t *testing.T) { + enginetest.TestDropCheckConstraints(t, NewDefaultDuckHarness()) +} + +func TestReadOnly(t *testing.T) { + enginetest.TestReadOnly(t, NewDefaultDuckHarness(), true /* testStoredProcedures */) +} + +func TestViews(t *testing.T) { + enginetest.TestViews(t, NewDefaultDuckHarness()) +} + +// func TestVersionedViews(t *testing.T) { +// enginetest.TestVersionedViews(t, NewDefaultMetaHarness()) +// } + +func TestNaturalJoin(t *testing.T) { + enginetest.TestNaturalJoin(t, NewDefaultDuckHarness()) +} + +func TestWindowFunctions(t *testing.T) { + enginetest.TestWindowFunctions(t, NewDefaultDuckHarness()) +} + +func TestWindowRangeFrames(t *testing.T) { + enginetest.TestWindowRangeFrames(t, NewDefaultDuckHarness()) +} + +func TestNamedWindows(t *testing.T) { + enginetest.TestNamedWindows(t, NewDefaultDuckHarness()) +} + +func TestNaturalJoinEqual(t *testing.T) { + enginetest.TestNaturalJoinEqual(t, NewDefaultDuckHarness()) +} + +func TestNaturalJoinDisjoint(t *testing.T) { + enginetest.TestNaturalJoinDisjoint(t, NewDefaultDuckHarness()) +} + +func TestInnerNestedInNaturalJoins(t *testing.T) { + enginetest.TestInnerNestedInNaturalJoins(t, NewDefaultDuckHarness()) +} + +func TestColumnDefaults(t *testing.T) { + enginetest.TestColumnDefaults(t, NewDefaultDuckHarness()) +} + +func TestAlterTable(t *testing.T) { + enginetest.TestAlterTable(t, NewDefaultDuckHarness()) +} + +func TestDateParse(t *testing.T) { + harness := NewDefaultDuckHarness() + if harness.IsUsingServer() { + t.Skip("issue: https://github.com/dolthub/dolt/issues/6901") + } + enginetest.TestDateParse(t, NewDefaultDuckHarness()) +} + +func TestJsonScripts(t *testing.T) { + var skippedTests []string = nil + enginetest.TestJsonScripts(t, NewDefaultDuckHarness(), skippedTests) +} + +func TestShowTableStatus(t *testing.T) { + enginetest.TestShowTableStatus(t, NewDefaultDuckHarness()) +} + +func TestAddDropPks(t *testing.T) { + enginetest.TestAddDropPks(t, NewDefaultDuckHarness()) +} + +func TestAddAutoIncrementColumn(t *testing.T) { + for _, script := range queries.AlterTableAddAutoIncrementScripts { + enginetest.TestScript(t, NewDefaultDuckHarness(), script) + } +} + +func TestNullRanges(t *testing.T) { + enginetest.TestNullRanges(t, NewDefaultDuckHarness()) +} + +func TestBlobs(t *testing.T) { + enginetest.TestBlobs(t, NewDefaultDuckHarness()) +} + +func TestIndexes(t *testing.T) { + enginetest.TestIndexes(t, NewDefaultDuckHarness()) +} + +func TestIndexPrefix(t *testing.T) { + enginetest.TestIndexPrefix(t, NewDefaultDuckHarness()) +} + +func TestPersist(t *testing.T) { + harness := NewDefaultDuckHarness() + if harness.IsUsingServer() { + t.Skip("this test depends on Context, which ServerEngine does not depend on or update the current context") + } + newSess := func(_ *sql.Context) sql.PersistableSession { + ctx := harness.NewSession() + persistedGlobals := memory.GlobalsMap{} + memSession := ctx.Session.(*memory.Session).SetGlobals(persistedGlobals) + return memSession + } + enginetest.TestPersist(t, harness, newSess) +} + +func TestValidateSession(t *testing.T) { + count := 0 + incrementValidateCb := func() { + count++ + } + + harness := NewDefaultDuckHarness() + if harness.IsUsingServer() { + t.Skip("It depends on ValidateSession() method call on context") + } + newSess := func(ctx *sql.Context) sql.PersistableSession { + memSession := ctx.Session.(*memory.Session) + memSession.SetValidationCallback(incrementValidateCb) + return memSession + } + enginetest.TestValidateSession(t, harness, newSess, &count) +} + +func TestPrepared(t *testing.T) { + enginetest.TestPrepared(t, NewDefaultDuckHarness()) +} + +func TestPreparedInsert(t *testing.T) { + enginetest.TestPreparedInsert(t, NewDuckHarness("default", 1, testNumPartitions, true, mergableIndexDriver)) +} + +func TestPreparedStatements(t *testing.T) { + enginetest.TestPreparedStatements(t, NewDefaultDuckHarness()) +} + +func TestCharsetCollationEngine(t *testing.T) { + harness := NewDefaultDuckHarness() + if harness.IsUsingServer() { + // Note: charset introducer needs to be handled with the SQLVal when preparing + // e.g. what we do currently for `_utf16'hi'` is `_utf16 :v1` with v1 = "hi", instead of `:v1` with v1 = "_utf16'hi'". + t.Skip("way we prepare the queries with injectBindVarsAndPrepare() method does not work for ServerEngine test") + } + enginetest.TestCharsetCollationEngine(t, harness) +} + +func TestCharsetCollationWire(t *testing.T) { + if _, ok := os.LookupEnv("CI_TEST"); !ok { + t.Skip("Skipping test that requires CI_TEST=true") + } + harness := NewDefaultDuckHarness() + enginetest.TestCharsetCollationWire(t, harness, harness.SessionBuilder()) +} + +func TestDatabaseCollationWire(t *testing.T) { + if _, ok := os.LookupEnv("CI_TEST"); !ok { + t.Skip("Skipping test that requires CI_TEST=true") + } + harness := NewDefaultDuckHarness() + enginetest.TestDatabaseCollationWire(t, harness, harness.SessionBuilder()) +} + +func TestTypesOverWire(t *testing.T) { + if _, ok := os.LookupEnv("CI_TEST"); !ok { + t.Skip("Skipping test that requires CI_TEST=true") + } + harness := NewDefaultDuckHarness() + enginetest.TestTypesOverWire(t, harness, harness.SessionBuilder()) +} + +func TestTransactions(t *testing.T) { + enginetest.TestTransactionScripts(t, enginetest.NewSkippingMemoryHarness()) +} + +func mergableIndexDriver(dbs []sql.Database) sql.IndexDriver { + return memory.NewIndexDriver("mydb", map[string][]sql.DriverIndex{ + "mytable": { + newMergableIndex(dbs, "mytable", + expression.NewGetFieldWithTable(0, 1, types.Int64, "db", "mytable", "i", false)), + newMergableIndex(dbs, "mytable", + expression.NewGetFieldWithTable(1, 1, types.Text, "db", "mytable", "s", false)), + newMergableIndex(dbs, "mytable", + expression.NewGetFieldWithTable(0, 1, types.Int64, "db", "mytable", "i", false), + expression.NewGetFieldWithTable(1, 1, types.Text, "db", "mytable", "s", false)), + }, + "othertable": { + newMergableIndex(dbs, "othertable", + expression.NewGetFieldWithTable(0, 1, types.Text, "db", "othertable", "s2", false)), + newMergableIndex(dbs, "othertable", + expression.NewGetFieldWithTable(1, 1, types.Text, "db", "othertable", "i2", false)), + newMergableIndex(dbs, "othertable", + expression.NewGetFieldWithTable(0, 1, types.Text, "db", "othertable", "s2", false), + expression.NewGetFieldWithTable(1, 1, types.Text, "db", "othertable", "i2", false)), + }, + "bigtable": { + newMergableIndex(dbs, "bigtable", + expression.NewGetFieldWithTable(0, 1, types.Text, "db", "bigtable", "t", false)), + }, + "floattable": { + newMergableIndex(dbs, "floattable", + expression.NewGetFieldWithTable(2, 1, types.Text, "db", "floattable", "f64", false)), + }, + "niltable": { + newMergableIndex(dbs, "niltable", + expression.NewGetFieldWithTable(0, 1, types.Int64, "db", "niltable", "i", false)), + newMergableIndex(dbs, "niltable", + expression.NewGetFieldWithTable(1, 1, types.Int64, "db", "niltable", "i2", true)), + }, + "one_pk": { + newMergableIndex(dbs, "one_pk", + expression.NewGetFieldWithTable(0, 1, types.Int8, "db", "one_pk", "pk", false)), + }, + "two_pk": { + newMergableIndex(dbs, "two_pk", + expression.NewGetFieldWithTable(0, 1, types.Int8, "db", "two_pk", "pk1", false), + expression.NewGetFieldWithTable(1, 1, types.Int8, "db", "two_pk", "pk2", false), + ), + }, + }) +} + +func newMergableIndex(dbs []sql.Database, tableName string, exprs ...sql.Expression) *memory.Index { + db, table := findTable(dbs, tableName) + if db == nil { + return nil + } + return &memory.Index{ + DB: db.Name(), + DriverName: memory.IndexDriverId, + TableName: tableName, + Tbl: table.(*memory.Table), + Exprs: exprs, + } +} + +func findTable(dbs []sql.Database, tableName string) (sql.Database, sql.Table) { + for _, db := range dbs { + names, err := db.GetTableNames(sql.NewEmptyContext()) + if err != nil { + panic(err) + } + for _, name := range names { + if name == tableName { + table, _, _ := db.GetTableInsensitive(sql.NewEmptyContext(), name) + return db, table + } + } + } + return nil, nil +} + +func TestSQLLogicTests(t *testing.T) { + enginetest.TestSQLLogicTests(t, NewDuckHarness("default", 1, testNumPartitions, true, mergableIndexDriver)) +} + +// func TestSQLLogicTestFiles(t *testing.T) { +// t.Skip() +// h := memharness.NewMemoryHarness(NewDefaultMetaHarness()) +// paths := []string{ +// "./sqllogictest/testdata/join/join.txt", +// "./sqllogictest/testdata/join/subquery_correlated.txt", +// } +// logictest.RunTestFiles(h, paths...) +// } diff --git a/meta/database.go b/meta/database.go index 0a4098f4..839fecf1 100644 --- a/meta/database.go +++ b/meta/database.go @@ -10,9 +10,9 @@ import ( ) type Database struct { - mu *sync.RWMutex - name string - engine *stdsql.DB + mu *sync.RWMutex + name string + storage *stdsql.DB } var _ sql.Database = (*Database)(nil) @@ -23,11 +23,11 @@ var _ sql.ViewDatabase = (*Database)(nil) var _ sql.TriggerDatabase = (*Database)(nil) var _ sql.CollatedDatabase = (*Database)(nil) -func NewDatabase(name string, engine *stdsql.DB) *Database { +func NewDatabase(name string, storage *stdsql.DB) *Database { return &Database{ - mu: &sync.RWMutex{}, - name: name, - engine: engine} + mu: &sync.RWMutex{}, + name: name, + storage: storage} } // GetTableNames implements sql.Database. @@ -62,7 +62,7 @@ func (d *Database) GetTableInsensitive(ctx *sql.Context, tblName string) (sql.Ta } func (d *Database) tablesInsensitive() (map[string]sql.Table, error) { - rows, err := d.engine.Query("SELECT DISTINCT table_name FROM duckdb_tables() where schema_name = ?", d.name) + rows, err := d.storage.Query("SELECT DISTINCT table_name FROM duckdb_tables() where schema_name = ?", d.name) if err != nil { return nil, ErrDuckDB.New(err) } @@ -121,7 +121,7 @@ func (d *Database) CreateTable(ctx *sql.Context, name string, schema sql.Primary } createTableSQL += ")" - _, err := d.engine.Exec(createTableSQL) + _, err := d.storage.Exec(createTableSQL) if err != nil { return ErrDuckDB.New(err) } @@ -136,7 +136,7 @@ func (d *Database) DropTable(ctx *sql.Context, name string) error { d.mu.Lock() defer d.mu.Unlock() - _, err := d.engine.Exec(fmt.Sprintf(`DROP TABLE "%s"."%s"`, d.name, name)) + _, err := d.storage.Exec(fmt.Sprintf(`DROP TABLE "%s"."%s"`, d.name, name)) if err != nil { return ErrDuckDB.New(err) @@ -149,7 +149,7 @@ func (d *Database) RenameTable(ctx *sql.Context, oldName string, newName string) d.mu.Lock() defer d.mu.Unlock() - _, err := d.engine.Exec(fmt.Sprintf(`ALTER TABLE "%s"."%s" RENAME TO "%s"`, d.name, oldName, newName)) + _, err := d.storage.Exec(fmt.Sprintf(`ALTER TABLE "%s"."%s" RENAME TO "%s"`, d.name, oldName, newName)) if err != nil { return ErrDuckDB.New(err) } @@ -170,7 +170,7 @@ func (d *Database) extractViewDefinitions(schemaName string, viewName string) ([ args = append(args, viewName) } - rows, err := d.engine.Query(query, args...) + rows, err := d.storage.Query(query, args...) if err != nil { return nil, ErrDuckDB.New(err) } @@ -223,7 +223,7 @@ func (d *Database) CreateView(ctx *sql.Context, name string, selectStatement str d.mu.Lock() defer d.mu.Unlock() - _, err := d.engine.Exec(fmt.Sprintf(`USE "%s"; CREATE VIEW "%s" AS %s`, d.name, name, selectStatement)) + _, err := d.storage.Exec(fmt.Sprintf(`USE "%s"; CREATE VIEW "%s" AS %s`, d.name, name, selectStatement)) if err != nil { return ErrDuckDB.New(err) } @@ -235,7 +235,7 @@ func (d *Database) DropView(ctx *sql.Context, name string) error { d.mu.Lock() defer d.mu.Unlock() - _, err := d.engine.Exec(fmt.Sprintf(`USE "%s"; DROP VIEW "%s"`, d.name, name)) + _, err := d.storage.Exec(fmt.Sprintf(`USE "%s"; DROP VIEW "%s"`, d.name, name)) if err != nil { return ErrDuckDB.New(err) } diff --git a/meta/provider.go b/meta/provider.go index 00563bb3..db0ea193 100644 --- a/meta/provider.go +++ b/meta/provider.go @@ -12,14 +12,22 @@ import ( ) type DbProvider struct { - mu *sync.RWMutex - storage *stdsql.DB - name string // also used as the database name in duckdb + mu *sync.RWMutex + storage *stdsql.DB + catalogName string } var _ sql.DatabaseProvider = (*DbProvider)(nil) var _ sql.MutableDatabaseProvider = (*DbProvider)(nil) +func NewInMemoryDBProvider() *DbProvider { + prov, err := NewDBProvider("") + if err != nil { + panic(err) + } + return prov +} + func NewDBProvider(dbFile string) (*DbProvider, error) { dbFile = strings.TrimSpace(dbFile) name := "" @@ -35,9 +43,9 @@ func NewDBProvider(dbFile string) (*DbProvider, error) { return nil, err } return &DbProvider{ - mu: &sync.RWMutex{}, - storage: storage, - name: name, + mu: &sync.RWMutex{}, + storage: storage, + catalogName: name, }, nil } @@ -49,12 +57,16 @@ func (prov *DbProvider) Storage() *stdsql.DB { return prov.storage } +func (prov *DbProvider) CatalogName() string { + return prov.catalogName +} + // AllDatabases implements sql.DatabaseProvider. func (prov *DbProvider) AllDatabases(ctx *sql.Context) []sql.Database { prov.mu.RLock() defer prov.mu.RUnlock() - rows, err := prov.storage.Query("SELECT DISTINCT schema_name FROM information_schema.schemata WHERE catalog_name = ?", prov.name) + rows, err := prov.storage.Query("SELECT DISTINCT schema_name FROM information_schema.schemata WHERE catalog_name = ?", prov.catalogName) if err != nil { panic(ErrDuckDB.New(err)) } @@ -87,7 +99,7 @@ func (prov *DbProvider) Database(ctx *sql.Context, name string) (sql.Database, e prov.mu.RLock() defer prov.mu.RUnlock() - ok, err := hasDatabase(prov.storage, prov.name, name) + ok, err := hasDatabase(prov.storage, prov.catalogName, name) if err != nil { return nil, err } @@ -103,7 +115,7 @@ func (prov *DbProvider) HasDatabase(ctx *sql.Context, name string) bool { prov.mu.RLock() defer prov.mu.RUnlock() - ok, err := hasDatabase(prov.storage, prov.name, name) + ok, err := hasDatabase(prov.storage, prov.catalogName, name) if err != nil { panic(err) } diff --git a/meta/table.go b/meta/table.go index 6d7ddb39..4b1ec5fb 100644 --- a/meta/table.go +++ b/meta/table.go @@ -60,7 +60,7 @@ func (t *Table) Schema() sql.Schema { } func (t *Table) schema() sql.Schema { - rows, err := t.db.engine.Query(` + rows, err := t.db.storage.Query(` SELECT column_name, data_type, is_nullable, column_default, numeric_precision, numeric_scale FROM duckdb_columns() WHERE schema_name = ? AND table_name = ? `, t.db.name, t.name) if err != nil { @@ -125,7 +125,7 @@ func (t *Table) PrimaryKeySchema() sql.PrimaryKeySchema { } func (t *Table) primaryKeyOrdinals() []int { - rows, err := t.db.engine.Query(` + rows, err := t.db.storage.Query(` SELECT constraint_column_indexes FROM duckdb_constraints() WHERE schema_name = ? AND table_name = ? AND constraint_type = 'PRIMARY KEY' LIMIT 1 `, t.db.name, t.name) if err != nil { @@ -167,7 +167,7 @@ func (t *Table) AddColumn(ctx *sql.Context, column *sql.Column, order *sql.Colum sql += fmt.Sprintf(" DEFAULT %s", column.Default.String()) } - _, err = t.db.engine.Exec(sql) + _, err = t.db.storage.Exec(sql) if err != nil { return ErrDuckDB.New(err) } @@ -182,7 +182,7 @@ func (t *Table) DropColumn(ctx *sql.Context, columnName string) error { sql := fmt.Sprintf(`ALTER TABLE "%s"."%s" DROP COLUMN "%s"`, t.db.name, t.name, columnName) - _, err := t.db.engine.Exec(sql) + _, err := t.db.storage.Exec(sql) if err != nil { return ErrDuckDB.New(err) } @@ -216,7 +216,7 @@ func (t *Table) ModifyColumn(ctx *sql.Context, columnName string, column *sql.Co sql += " DROP DEFAULT" } - _, err = t.db.engine.Exec(sql) + _, err = t.db.storage.Exec(sql) if err != nil { return ErrDuckDB.New(err) }