From d6cc88dc25c0605b1be2a3a903d24fcbef8a1c95 Mon Sep 17 00:00:00 2001 From: James Cor Date: Thu, 7 Nov 2024 16:47:59 -0800 Subject: [PATCH 1/8] support multi-like statements --- sql/planbuilder/ddl.go | 154 ++++++++++++++++++++++++----------------- 1 file changed, 89 insertions(+), 65 deletions(-) diff --git a/sql/planbuilder/ddl.go b/sql/planbuilder/ddl.go index 0949749f37..ec2545e412 100644 --- a/sql/planbuilder/ddl.go +++ b/sql/planbuilder/ddl.go @@ -332,84 +332,108 @@ func assignColumnIndexesInSchema(schema sql.Schema) sql.Schema { } func (b *Builder) buildCreateTableLike(inScope *scope, ct *ast.DDL) *scope { - outScope, ok := b.buildTablescan(inScope, ct.OptLike.LikeTable, nil) - if !ok { - b.handleErr(sql.ErrTableNotFound.New(ct.OptLike.LikeTable.Name.String())) - } + database := b.resolveDbForTable(ct.Table) + newTableName := strings.ToLower(ct.Table.Name.String()) - likeTable, ok := outScope.node.(*plan.ResolvedTable) - if !ok { - err := fmt.Errorf("expected resolved table: %s", ct.OptLike.LikeTable.Name.String()) - b.handleErr(err) + var pkSch sql.PrimaryKeySchema + var coll sql.CollationID + var comment string + outScope := inScope.push() + if ct.TableSpec != nil { + pkSch, coll, _ = b.tableSpecToSchema(inScope, outScope, database, strings.ToLower(ct.Table.Name.String()), ct.TableSpec, false) } - newTableName := strings.ToLower(ct.Table.Name.String()) - outScope.setTableAlias(newTableName) - + var ok bool + var pkOrdinals []int + newSch := pkSch.Schema var idxDefs sql.IndexDefs - if indexableTable, ok := likeTable.Table.(sql.IndexAddressableTable); ok { - indexes, err := indexableTable.GetIndexes(b.ctx) - if err != nil { + var checkDefs []*sql.CheckConstraint + for _, likeTable := range ct.OptLike.LikeTables { + outScope, ok = b.buildTablescan(outScope, likeTable, nil) + if !ok { + b.handleErr(sql.ErrTableNotFound.New(likeTable.Name.String())) + } + lTable, isResTbl := outScope.node.(*plan.ResolvedTable) + if !isResTbl { + err := fmt.Errorf("expected resolved table: %s", likeTable.Name.String()) b.handleErr(err) } - for _, index := range indexes { - if index.IsGenerated() { - continue - } - constraint := sql.IndexConstraint_None - if index.IsUnique() { - if index.ID() == "PRIMARY" { - constraint = sql.IndexConstraint_Primary - } else { - constraint = sql.IndexConstraint_Unique - } - } - columns := make([]sql.IndexColumn, len(index.Expressions())) - for i, col := range index.Expressions() { - //TODO: find a better way to get only the column name if the table is present - col = strings.TrimPrefix(col, indexableTable.Name()+".") - columns[i] = sql.IndexColumn{Name: col} + if coll == sql.Collation_Unspecified { + coll = lTable.Collation() + } + + if comment == "" { + comment = lTable.Comment() + } + + // Copy over primary key schema ordinals + if pkTable, isPkTable := lTable.Table.(sql.PrimaryKeyTable); isPkTable { + for _, pkOrd := range pkTable.PrimaryKeySchema().PkOrdinals { + pkOrdinals = append(pkOrdinals, len(newSch) + pkOrd) } - idxDefs = append(idxDefs, &sql.IndexDef{ - Name: index.ID(), - Storage: sql.IndexUsing_Default, - Constraint: constraint, - Columns: columns, - Comment: index.Comment(), - }) } - } - origSch := likeTable.Schema() - newSch := make(sql.Schema, len(origSch)) - for i, col := range origSch { - tempCol := *col - tempCol.Source = newTableName - newSch[i] = &tempCol - } - var pkOrdinals []int - if pkTable, ok := likeTable.Table.(sql.PrimaryKeyTable); ok { - pkOrdinals = pkTable.PrimaryKeySchema().PkOrdinals - } + // Deep copy columns from schema + for _, col := range lTable.Schema() { + newCol := *col + newCol.Source = newTableName + newSch = append(newSch, &newCol) + } - var checkDefs []*sql.CheckConstraint - if checksTable, ok := likeTable.Table.(sql.CheckTable); ok { - checks, err := checksTable.GetChecks(b.ctx) - if err != nil { - b.handleErr(err) + // Load index definitions + if idxTbl, isIdxTbl := lTable.Table.(sql.IndexAddressableTable); isIdxTbl { + idxs, err := idxTbl.GetIndexes(b.ctx) + if err != nil { + b.handleErr(err) + } + for _, idx := range idxs { + if idx.IsGenerated() { + continue + } + constraint := sql.IndexConstraint_None + if idx.IsUnique() { + if idx.ID() == "PRIMARY" { + // TODO: deal with multiple primary key constraints? + constraint = sql.IndexConstraint_Primary + } else { + constraint = sql.IndexConstraint_Unique + } + } + + columns := make([]sql.IndexColumn, len(idx.Expressions())) + for i, col := range idx.Expressions() { + //TODO: find a better way to get only the column name if the table is present + col = strings.TrimPrefix(col, idxTbl.Name()+".") + columns[i] = sql.IndexColumn{Name: col} + } + idxDefs = append(idxDefs, &sql.IndexDef{ + Name: idx.ID(), + Storage: sql.IndexUsing_Default, + Constraint: constraint, + Columns: columns, + Comment: idx.Comment(), + }) + } } - for _, check := range checks { - checkConstraint := b.buildCheckConstraint(outScope, &check) + // Load check constraints + if chkTable, isChkTable := lTable.Table.(sql.CheckTable); isChkTable { + checks, err := chkTable.GetChecks(b.ctx) if err != nil { b.handleErr(err) } + for _, check := range checks { + checkConstraint := b.buildCheckConstraint(outScope, &check) + if err != nil { + b.handleErr(err) + } - // Prevent a name collision between old and new checks. - // New check will be assigned a name during building. - checkConstraint.Name = "" - checkDefs = append(checkDefs, checkConstraint) + // Prevent a name collision between old and new checks. + // New check name will be assigned a name during building. + checkConstraint.Name = "" + checkDefs = append(checkDefs, checkConstraint) + } } } @@ -420,13 +444,13 @@ func (b *Builder) buildCreateTableLike(inScope *scope, ct *ast.DDL) *scope { Schema: pkSchema, IdxDefs: idxDefs, ChDefs: checkDefs, - Collation: likeTable.Collation(), - Comment: likeTable.Comment(), + Collation: coll, + Comment: comment, } - database := b.resolveDbForTable(ct.Table) - b.qFlags.Set(sql.QFlagSetDatabase) + + outScope.setTableAlias(newTableName) outScope.node = plan.NewCreateTable(database, newTableName, ct.IfNotExists, ct.Temporary, tableSpec) return outScope } From 2375a54b2f3787a60e674c37bf923c975fbd5b96 Mon Sep 17 00:00:00 2001 From: James Cor Date: Thu, 7 Nov 2024 16:52:44 -0800 Subject: [PATCH 2/8] bump --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 1183344539..96487bb81f 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( github.com/dolthub/go-icu-regex v0.0.0-20240916130659-0118adc6b662 github.com/dolthub/jsonpath v0.0.2-0.20240227200619-19675ab05c71 github.com/dolthub/sqllogictest/go v0.0.0-20201107003712-816f3ae12d81 - github.com/dolthub/vitess v0.0.0-20241104125316-860772ba6683 + github.com/dolthub/vitess v0.0.0-20241108004726-fd871a8e800e github.com/go-kit/kit v0.10.0 github.com/go-sql-driver/mysql v1.7.2-0.20231213112541-0004702b931d github.com/gocraft/dbr/v2 v2.7.2 diff --git a/go.sum b/go.sum index c328f81c8c..3da7cc780e 100644 --- a/go.sum +++ b/go.sum @@ -58,8 +58,8 @@ github.com/dolthub/jsonpath v0.0.2-0.20240227200619-19675ab05c71 h1:bMGS25NWAGTE 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-20201107003712-816f3ae12d81 h1:7/v8q9XGFa6q5Ap4Z/OhNkAMBaK5YeuEzwJt+NZdhiE= github.com/dolthub/sqllogictest/go v0.0.0-20201107003712-816f3ae12d81/go.mod h1:siLfyv2c92W1eN/R4QqG/+RjjX5W2+gCTRjZxBjI3TY= -github.com/dolthub/vitess v0.0.0-20241104125316-860772ba6683 h1:2/RJeUfNAXS7mbBnEr9C36htiCJHk5XldDPzhxtEsME= -github.com/dolthub/vitess v0.0.0-20241104125316-860772ba6683/go.mod h1:uBvlRluuL+SbEWTCZ68o0xvsdYZER3CEG/35INdzfJM= +github.com/dolthub/vitess v0.0.0-20241108004726-fd871a8e800e h1:LzLeTanHHI4h75GGqo7GVlFZsOpR6VOn5j3ug+a3+R8= +github.com/dolthub/vitess v0.0.0-20241108004726-fd871a8e800e/go.mod h1:uBvlRluuL+SbEWTCZ68o0xvsdYZER3CEG/35INdzfJM= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/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= From 4ea2b9441eb6b5286a696aa7cafcd26a058a7163 Mon Sep 17 00:00:00 2001 From: jycor Date: Fri, 8 Nov 2024 00:55:15 +0000 Subject: [PATCH 3/8] [ga-format-pr] Run ./format_repo.sh to fix formatting --- sql/planbuilder/ddl.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql/planbuilder/ddl.go b/sql/planbuilder/ddl.go index ec2545e412..19ca4399e9 100644 --- a/sql/planbuilder/ddl.go +++ b/sql/planbuilder/ddl.go @@ -370,7 +370,7 @@ func (b *Builder) buildCreateTableLike(inScope *scope, ct *ast.DDL) *scope { // Copy over primary key schema ordinals if pkTable, isPkTable := lTable.Table.(sql.PrimaryKeyTable); isPkTable { for _, pkOrd := range pkTable.PrimaryKeySchema().PkOrdinals { - pkOrdinals = append(pkOrdinals, len(newSch) + pkOrd) + pkOrdinals = append(pkOrdinals, len(newSch)+pkOrd) } } From 60335611b9f4293ade15bad090521ff8efbd4678 Mon Sep 17 00:00:00 2001 From: James Cor Date: Fri, 8 Nov 2024 10:57:42 -0800 Subject: [PATCH 4/8] handle duplicates and merge order --- sql/planbuilder/ddl.go | 42 ++++++++++++++++++++++++++++++++---------- 1 file changed, 32 insertions(+), 10 deletions(-) diff --git a/sql/planbuilder/ddl.go b/sql/planbuilder/ddl.go index 19ca4399e9..902c3eb7ac 100644 --- a/sql/planbuilder/ddl.go +++ b/sql/planbuilder/ddl.go @@ -345,7 +345,8 @@ func (b *Builder) buildCreateTableLike(inScope *scope, ct *ast.DDL) *scope { var ok bool var pkOrdinals []int - newSch := pkSch.Schema + var newSch sql.Schema + newSchMap := make(map[string]struct{}) var idxDefs sql.IndexDefs var checkDefs []*sql.CheckConstraint for _, likeTable := range ct.OptLike.LikeTables { @@ -367,20 +368,34 @@ func (b *Builder) buildCreateTableLike(inScope *scope, ct *ast.DDL) *scope { comment = lTable.Comment() } - // Copy over primary key schema ordinals - if pkTable, isPkTable := lTable.Table.(sql.PrimaryKeyTable); isPkTable { - for _, pkOrd := range pkTable.PrimaryKeySchema().PkOrdinals { - pkOrdinals = append(pkOrdinals, len(newSch)+pkOrd) - } - } - - // Deep copy columns from schema + schOff := len(newSch) + hasSkippedCols := false for _, col := range lTable.Schema() { newCol := *col + name := strings.ToLower(newCol.Name) + if _, ok := newSchMap[name]; ok { + // TODO: throw warning + hasSkippedCols = true + continue + } + newSchMap[name] = struct{}{} newCol.Source = newTableName newSch = append(newSch, &newCol) } + // if a column was skipped due to duplicates, don't copy over PK ords, idxDefs, or checkDefs + // since they might be incorrect + if hasSkippedCols { + continue + } + + // Copy over primary key schema ordinals + if pkTable, isPkTable := lTable.Table.(sql.PrimaryKeyTable); isPkTable { + for _, pkOrd := range pkTable.PrimaryKeySchema().PkOrdinals { + pkOrdinals = append(pkOrdinals, schOff+pkOrd) + } + } + // Load index definitions if idxTbl, isIdxTbl := lTable.Table.(sql.IndexAddressableTable); isIdxTbl { idxs, err := idxTbl.GetIndexes(b.ctx) @@ -403,7 +418,7 @@ func (b *Builder) buildCreateTableLike(inScope *scope, ct *ast.DDL) *scope { columns := make([]sql.IndexColumn, len(idx.Expressions())) for i, col := range idx.Expressions() { - //TODO: find a better way to get only the column name if the table is present + // TODO: find a better way to get only the column name if the table is present col = strings.TrimPrefix(col, idxTbl.Name()+".") columns[i] = sql.IndexColumn{Name: col} } @@ -437,6 +452,13 @@ func (b *Builder) buildCreateTableLike(inScope *scope, ct *ast.DDL) *scope { } } + for _, col := range pkSch.Schema { + newSch = append(newSch, col) + } + for _, pkOrd := range pkSch.PkOrdinals { + pkOrdinals = append(pkOrdinals, len(newSch) + pkOrd) + } + pkSchema := sql.NewPrimaryKeySchema(newSch, pkOrdinals...) pkSchema.Schema = b.resolveSchemaDefaults(outScope, pkSchema.Schema) From b2de759fca1c915d93b839c02bcd68c29d35bc03 Mon Sep 17 00:00:00 2001 From: jycor Date: Fri, 8 Nov 2024 18:59:03 +0000 Subject: [PATCH 5/8] [ga-format-pr] Run ./format_repo.sh to fix formatting --- sql/planbuilder/ddl.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql/planbuilder/ddl.go b/sql/planbuilder/ddl.go index 902c3eb7ac..d40b3c73db 100644 --- a/sql/planbuilder/ddl.go +++ b/sql/planbuilder/ddl.go @@ -456,7 +456,7 @@ func (b *Builder) buildCreateTableLike(inScope *scope, ct *ast.DDL) *scope { newSch = append(newSch, col) } for _, pkOrd := range pkSch.PkOrdinals { - pkOrdinals = append(pkOrdinals, len(newSch) + pkOrd) + pkOrdinals = append(pkOrdinals, len(newSch)+pkOrd) } pkSchema := sql.NewPrimaryKeySchema(newSch, pkOrdinals...) From 14a7c3c42a21cd79e2246bab9973005d03473c78 Mon Sep 17 00:00:00 2001 From: James Cor Date: Fri, 8 Nov 2024 11:35:59 -0800 Subject: [PATCH 6/8] catch duplicates --- sql/planbuilder/ddl.go | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/sql/planbuilder/ddl.go b/sql/planbuilder/ddl.go index d40b3c73db..3d3915c060 100644 --- a/sql/planbuilder/ddl.go +++ b/sql/planbuilder/ddl.go @@ -452,11 +452,20 @@ func (b *Builder) buildCreateTableLike(inScope *scope, ct *ast.DDL) *scope { } } + var hasSkippedCols bool for _, col := range pkSch.Schema { + name := strings.ToLower(col.Name) + if _, ok := newSchMap[name]; ok { + // TODO: throw warning + hasSkippedCols = true + continue + } newSch = append(newSch, col) } - for _, pkOrd := range pkSch.PkOrdinals { - pkOrdinals = append(pkOrdinals, len(newSch)+pkOrd) + if !hasSkippedCols { + for _, pkOrd := range pkSch.PkOrdinals { + pkOrdinals = append(pkOrdinals, len(newSch)+pkOrd) + } } pkSchema := sql.NewPrimaryKeySchema(newSch, pkOrdinals...) From facbd96ac7b0a134c355ec0e6911cfcfab1538c0 Mon Sep 17 00:00:00 2001 From: James Cor Date: Mon, 11 Nov 2024 14:41:42 -0800 Subject: [PATCH 7/8] helper methods --- sql/planbuilder/ddl.go | 96 ++++++++++++++++++++---------------------- 1 file changed, 46 insertions(+), 50 deletions(-) diff --git a/sql/planbuilder/ddl.go b/sql/planbuilder/ddl.go index 3d3915c060..360b96bf02 100644 --- a/sql/planbuilder/ddl.go +++ b/sql/planbuilder/ddl.go @@ -331,6 +331,45 @@ func assignColumnIndexesInSchema(schema sql.Schema) sql.Schema { return newSch } +func (b *Builder) getIndexDefs(table sql.Table) sql.IndexDefs { + idxTbl, isIdxTbl := table.(sql.IndexAddressableTable) + if !isIdxTbl { + return nil + } + var idxDefs sql.IndexDefs + idxs, err := idxTbl.GetIndexes(b.ctx) + if err != nil { + b.handleErr(err) + } + for _, idx := range idxs { + if idx.IsGenerated() { + continue + } + constraint := sql.IndexConstraint_None + if idx.IsUnique() { + if idx.ID() == "PRIMARY" { + constraint = sql.IndexConstraint_Primary + } else { + constraint = sql.IndexConstraint_Unique + } + } + columns := make([]sql.IndexColumn, len(idx.Expressions())) + for i, col := range idx.Expressions() { + // TODO: find a better way to get only the column name if the table is present + col = strings.TrimPrefix(col, idxTbl.Name()+".") + columns[i] = sql.IndexColumn{Name: col} + } + idxDefs = append(idxDefs, &sql.IndexDef{ + Name: idx.ID(), + Storage: sql.IndexUsing_Default, + Constraint: constraint, + Columns: columns, + Comment: idx.Comment(), + }) + } + return idxDefs +} + func (b *Builder) buildCreateTableLike(inScope *scope, ct *ast.DDL) *scope { database := b.resolveDbForTable(ct.Table) newTableName := strings.ToLower(ct.Table.Name.String()) @@ -397,59 +436,16 @@ func (b *Builder) buildCreateTableLike(inScope *scope, ct *ast.DDL) *scope { } // Load index definitions - if idxTbl, isIdxTbl := lTable.Table.(sql.IndexAddressableTable); isIdxTbl { - idxs, err := idxTbl.GetIndexes(b.ctx) - if err != nil { - b.handleErr(err) - } - for _, idx := range idxs { - if idx.IsGenerated() { - continue - } - constraint := sql.IndexConstraint_None - if idx.IsUnique() { - if idx.ID() == "PRIMARY" { - // TODO: deal with multiple primary key constraints? - constraint = sql.IndexConstraint_Primary - } else { - constraint = sql.IndexConstraint_Unique - } - } - - columns := make([]sql.IndexColumn, len(idx.Expressions())) - for i, col := range idx.Expressions() { - // TODO: find a better way to get only the column name if the table is present - col = strings.TrimPrefix(col, idxTbl.Name()+".") - columns[i] = sql.IndexColumn{Name: col} - } - idxDefs = append(idxDefs, &sql.IndexDef{ - Name: idx.ID(), - Storage: sql.IndexUsing_Default, - Constraint: constraint, - Columns: columns, - Comment: idx.Comment(), - }) - } - } + idxDefs = append(idxDefs, b.getIndexDefs(lTable.Table)...) // Load check constraints - if chkTable, isChkTable := lTable.Table.(sql.CheckTable); isChkTable { - checks, err := chkTable.GetChecks(b.ctx) - if err != nil { - b.handleErr(err) - } - for _, check := range checks { - checkConstraint := b.buildCheckConstraint(outScope, &check) - if err != nil { - b.handleErr(err) - } - - // Prevent a name collision between old and new checks. - // New check name will be assigned a name during building. - checkConstraint.Name = "" - checkDefs = append(checkDefs, checkConstraint) - } + newCheckDefs := b.loadChecksFromTable(outScope, lTable.Table) + for _, check := range newCheckDefs { + // Prevent a name collision between old and new checks. + // New check name will be assigned a name during building. + check.Name = "" } + checkDefs = append(checkDefs, newCheckDefs...) } var hasSkippedCols bool From b76a774349d2b20a5a71702d470e6ee80a70fa39 Mon Sep 17 00:00:00 2001 From: James Cor Date: Mon, 11 Nov 2024 15:59:17 -0800 Subject: [PATCH 8/8] bump --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 96487bb81f..9d1af8346e 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( github.com/dolthub/go-icu-regex v0.0.0-20240916130659-0118adc6b662 github.com/dolthub/jsonpath v0.0.2-0.20240227200619-19675ab05c71 github.com/dolthub/sqllogictest/go v0.0.0-20201107003712-816f3ae12d81 - github.com/dolthub/vitess v0.0.0-20241108004726-fd871a8e800e + github.com/dolthub/vitess v0.0.0-20241111235433-a20a5ab9d7c9 github.com/go-kit/kit v0.10.0 github.com/go-sql-driver/mysql v1.7.2-0.20231213112541-0004702b931d github.com/gocraft/dbr/v2 v2.7.2 diff --git a/go.sum b/go.sum index 3da7cc780e..12e8b0dda1 100644 --- a/go.sum +++ b/go.sum @@ -58,8 +58,8 @@ github.com/dolthub/jsonpath v0.0.2-0.20240227200619-19675ab05c71 h1:bMGS25NWAGTE 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-20201107003712-816f3ae12d81 h1:7/v8q9XGFa6q5Ap4Z/OhNkAMBaK5YeuEzwJt+NZdhiE= github.com/dolthub/sqllogictest/go v0.0.0-20201107003712-816f3ae12d81/go.mod h1:siLfyv2c92W1eN/R4QqG/+RjjX5W2+gCTRjZxBjI3TY= -github.com/dolthub/vitess v0.0.0-20241108004726-fd871a8e800e h1:LzLeTanHHI4h75GGqo7GVlFZsOpR6VOn5j3ug+a3+R8= -github.com/dolthub/vitess v0.0.0-20241108004726-fd871a8e800e/go.mod h1:uBvlRluuL+SbEWTCZ68o0xvsdYZER3CEG/35INdzfJM= +github.com/dolthub/vitess v0.0.0-20241111235433-a20a5ab9d7c9 h1:s36zDuLPuZRWC0nBCJs2Z8joP19eKEtcsIsuE8K9Kx0= +github.com/dolthub/vitess v0.0.0-20241111235433-a20a5ab9d7c9/go.mod h1:uBvlRluuL+SbEWTCZ68o0xvsdYZER3CEG/35INdzfJM= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/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=