Skip to content

Commit

Permalink
cherry pick of 14878 (#4064)
Browse files Browse the repository at this point in the history
  • Loading branch information
planetscale-actions-bot authored Jan 4, 2024
1 parent 6fb0a74 commit 0518c36
Show file tree
Hide file tree
Showing 19 changed files with 637 additions and 157 deletions.
23 changes: 23 additions & 0 deletions go/mysql/capabilities/capability.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package capabilities

type FlavorCapability int

const (
NoneFlavorCapability FlavorCapability = iota // default placeholder
FastDropTableFlavorCapability // supported in MySQL 8.0.23 and above: https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-23.html
TransactionalGtidExecutedFlavorCapability //
InstantDDLFlavorCapability // ALGORITHM=INSTANT general support
InstantAddLastColumnFlavorCapability //
InstantAddDropVirtualColumnFlavorCapability //
InstantAddDropColumnFlavorCapability // Adding/dropping column in any position/ordinal.
InstantChangeColumnDefaultFlavorCapability //
InstantExpandEnumCapability //
MySQLJSONFlavorCapability // JSON type supported
MySQLUpgradeInServerFlavorCapability //
DynamicRedoLogCapacityFlavorCapability // supported in MySQL 8.0.30 and above: https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-30.html
DisableRedoLogFlavorCapability // supported in MySQL 8.0.21 and above: https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-21.html
CheckConstraintsCapability // supported in MySQL 8.0.16 and above: https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-16.html
PerformanceSchemaDataLocksTableCapability
)

type CapableOf func(capability FlavorCapability) (bool, error)
31 changes: 5 additions & 26 deletions go/mysql/flavor.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import (
"strconv"
"strings"

"vitess.io/vitess/go/mysql/capabilities"
"vitess.io/vitess/go/mysql/replication"
"vitess.io/vitess/go/mysql/sqlerror"
"vitess.io/vitess/go/sqltypes"
Expand All @@ -39,26 +40,6 @@ var (
ErrNoPrimaryStatus = errors.New("no master status")
)

type FlavorCapability int

const (
NoneFlavorCapability FlavorCapability = iota // default placeholder
FastDropTableFlavorCapability // supported in MySQL 8.0.23 and above: https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-23.html
TransactionalGtidExecutedFlavorCapability
InstantDDLFlavorCapability
InstantAddLastColumnFlavorCapability
InstantAddDropVirtualColumnFlavorCapability
InstantAddDropColumnFlavorCapability
InstantChangeColumnDefaultFlavorCapability
InstantExpandEnumCapability
MySQLJSONFlavorCapability
MySQLUpgradeInServerFlavorCapability
DynamicRedoLogCapacityFlavorCapability // supported in MySQL 8.0.30 and above: https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-30.html
DisableRedoLogFlavorCapability // supported in MySQL 8.0.21 and above: https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-21.html
CheckConstraintsCapability // supported in MySQL 8.0.16 and above: https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-16.html
PerformanceSchemaDataLocksTableCapability
)

const (
// mariaDBReplicationHackPrefix is the prefix of a version for MariaDB 10.0
// versions, to work around replication bugs.
Expand Down Expand Up @@ -155,11 +136,9 @@ type flavor interface {
baseShowTables() string
baseShowTablesWithSizes() string

supportsCapability(serverVersion string, capability FlavorCapability) (bool, error)
supportsCapability(serverVersion string, capability capabilities.FlavorCapability) (bool, error)
}

type CapableOf func(capability FlavorCapability) (bool, error)

// flavors maps flavor names to their implementation.
// Flavors need to register only if they support being specified in the
// connection parameters.
Expand Down Expand Up @@ -201,7 +180,7 @@ func ServerVersionAtLeast(serverVersion string, parts ...int) (bool, error) {
// Note on such servers, 'select version()' would return 10.0.21-MariaDB-...
// as well (not matching what c.ServerVersion is, but matching after we remove
// the prefix).
func GetFlavor(serverVersion string, flavorFunc func() flavor) (f flavor, capableOf CapableOf, canonicalVersion string) {
func GetFlavor(serverVersion string, flavorFunc func() flavor) (f flavor, capableOf capabilities.CapableOf, canonicalVersion string) {
canonicalVersion = serverVersion
switch {
case flavorFunc != nil:
Expand All @@ -224,7 +203,7 @@ func GetFlavor(serverVersion string, flavorFunc func() flavor) (f flavor, capabl
f = mysqlFlavor56{}
}
return f,
func(capability FlavorCapability) (bool, error) {
func(capability capabilities.FlavorCapability) (bool, error) {
return f.supportsCapability(serverVersion, capability)
}, canonicalVersion
}
Expand Down Expand Up @@ -474,7 +453,7 @@ func (c *Conn) BaseShowTablesWithSizes() string {
}

// SupportsCapability checks if the database server supports the given capability
func (c *Conn) SupportsCapability(capability FlavorCapability) (bool, error) {
func (c *Conn) SupportsCapability(capability capabilities.FlavorCapability) (bool, error) {
return c.flavor.supportsCapability(c.ServerVersion, capability)
}

Expand Down
3 changes: 2 additions & 1 deletion go/mysql/flavor_filepos.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import (
"strings"
"time"

"vitess.io/vitess/go/mysql/capabilities"
"vitess.io/vitess/go/mysql/replication"
"vitess.io/vitess/go/mysql/sqlerror"
vtrpcpb "vitess.io/vitess/go/vt/proto/vtrpc"
Expand Down Expand Up @@ -335,7 +336,7 @@ func (*filePosFlavor) baseShowTablesWithSizes() string {
}

// supportsCapability is part of the Flavor interface.
func (*filePosFlavor) supportsCapability(serverVersion string, capability FlavorCapability) (bool, error) {
func (*filePosFlavor) supportsCapability(serverVersion string, capability capabilities.FlavorCapability) (bool, error) {
switch capability {
default:
return false, nil
Expand Down
3 changes: 2 additions & 1 deletion go/mysql/flavor_mariadb.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import (
"io"
"time"

"vitess.io/vitess/go/mysql/capabilities"
"vitess.io/vitess/go/mysql/replication"
"vitess.io/vitess/go/mysql/sqlerror"
"vitess.io/vitess/go/vt/vterrors"
Expand Down Expand Up @@ -286,7 +287,7 @@ func (mariadbFlavor) readBinlogEvent(c *Conn) (BinlogEvent, error) {
}

// supportsCapability is part of the Flavor interface.
func (mariadbFlavor) supportsCapability(serverVersion string, capability FlavorCapability) (bool, error) {
func (mariadbFlavor) supportsCapability(serverVersion string, capability capabilities.FlavorCapability) (bool, error) {
switch capability {
default:
return false, nil
Expand Down
37 changes: 19 additions & 18 deletions go/mysql/flavor_mysql.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import (
"io"
"time"

"vitess.io/vitess/go/mysql/capabilities"
"vitess.io/vitess/go/mysql/replication"
"vitess.io/vitess/go/mysql/sqlerror"
"vitess.io/vitess/go/vt/vterrors"
Expand Down Expand Up @@ -371,7 +372,7 @@ func (mysqlFlavor56) baseShowTablesWithSizes() string {
}

// supportsCapability is part of the Flavor interface.
func (mysqlFlavor56) supportsCapability(serverVersion string, capability FlavorCapability) (bool, error) {
func (mysqlFlavor56) supportsCapability(serverVersion string, capability capabilities.FlavorCapability) (bool, error) {
switch capability {
default:
return false, nil
Expand All @@ -384,9 +385,9 @@ func (mysqlFlavor57) baseShowTablesWithSizes() string {
}

// supportsCapability is part of the Flavor interface.
func (mysqlFlavor57) supportsCapability(serverVersion string, capability FlavorCapability) (bool, error) {
func (mysqlFlavor57) supportsCapability(serverVersion string, capability capabilities.FlavorCapability) (bool, error) {
switch capability {
case MySQLJSONFlavorCapability:
case capabilities.MySQLJSONFlavorCapability:
return true, nil
default:
return false, nil
Expand All @@ -399,31 +400,31 @@ func (mysqlFlavor80) baseShowTablesWithSizes() string {
}

// supportsCapability is part of the Flavor interface.
func (mysqlFlavor80) supportsCapability(serverVersion string, capability FlavorCapability) (bool, error) {
func (mysqlFlavor80) supportsCapability(serverVersion string, capability capabilities.FlavorCapability) (bool, error) {
switch capability {
case InstantDDLFlavorCapability,
InstantExpandEnumCapability,
InstantAddLastColumnFlavorCapability,
InstantAddDropVirtualColumnFlavorCapability,
InstantChangeColumnDefaultFlavorCapability:
case capabilities.InstantDDLFlavorCapability,
capabilities.InstantExpandEnumCapability,
capabilities.InstantAddLastColumnFlavorCapability,
capabilities.InstantAddDropVirtualColumnFlavorCapability,
capabilities.InstantChangeColumnDefaultFlavorCapability:
return true, nil
case InstantAddDropColumnFlavorCapability:
case capabilities.InstantAddDropColumnFlavorCapability:
return ServerVersionAtLeast(serverVersion, 8, 0, 29)
case TransactionalGtidExecutedFlavorCapability:
case capabilities.TransactionalGtidExecutedFlavorCapability:
return ServerVersionAtLeast(serverVersion, 8, 0, 17)
case FastDropTableFlavorCapability:
case capabilities.FastDropTableFlavorCapability:
return ServerVersionAtLeast(serverVersion, 8, 0, 23)
case MySQLJSONFlavorCapability:
case capabilities.MySQLJSONFlavorCapability:
return true, nil
case MySQLUpgradeInServerFlavorCapability:
case capabilities.MySQLUpgradeInServerFlavorCapability:
return ServerVersionAtLeast(serverVersion, 8, 0, 16)
case DynamicRedoLogCapacityFlavorCapability:
case capabilities.DynamicRedoLogCapacityFlavorCapability:
return ServerVersionAtLeast(serverVersion, 8, 0, 30)
case DisableRedoLogFlavorCapability:
case capabilities.DisableRedoLogFlavorCapability:
return ServerVersionAtLeast(serverVersion, 8, 0, 21)
case CheckConstraintsCapability:
case capabilities.CheckConstraintsCapability:
return ServerVersionAtLeast(serverVersion, 8, 0, 16)
case PerformanceSchemaDataLocksTableCapability:
case capabilities.PerformanceSchemaDataLocksTableCapability:
return true, nil
default:
return false, nil
Expand Down
25 changes: 13 additions & 12 deletions go/mysql/flavor_mysqlgr.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import (
"fmt"
"math"

"vitess.io/vitess/go/mysql/capabilities"
"vitess.io/vitess/go/mysql/replication"
"vitess.io/vitess/go/vt/proto/vtrpc"

Expand Down Expand Up @@ -248,25 +249,25 @@ func (mysqlGRFlavor) baseShowTablesWithSizes() string {
}

// supportsCapability is part of the Flavor interface.
func (mysqlGRFlavor) supportsCapability(serverVersion string, capability FlavorCapability) (bool, error) {
func (mysqlGRFlavor) supportsCapability(serverVersion string, capability capabilities.FlavorCapability) (bool, error) {
switch capability {
case InstantDDLFlavorCapability,
InstantExpandEnumCapability,
InstantAddLastColumnFlavorCapability,
InstantAddDropVirtualColumnFlavorCapability,
InstantChangeColumnDefaultFlavorCapability:
case capabilities.InstantDDLFlavorCapability,
capabilities.InstantExpandEnumCapability,
capabilities.InstantAddLastColumnFlavorCapability,
capabilities.InstantAddDropVirtualColumnFlavorCapability,
capabilities.InstantChangeColumnDefaultFlavorCapability:
return ServerVersionAtLeast(serverVersion, 8, 0, 0)
case InstantAddDropColumnFlavorCapability:
case capabilities.InstantAddDropColumnFlavorCapability:
return ServerVersionAtLeast(serverVersion, 8, 0, 29)
case TransactionalGtidExecutedFlavorCapability:
case capabilities.TransactionalGtidExecutedFlavorCapability:
return ServerVersionAtLeast(serverVersion, 8, 0, 17)
case FastDropTableFlavorCapability:
case capabilities.FastDropTableFlavorCapability:
return ServerVersionAtLeast(serverVersion, 8, 0, 23)
case MySQLJSONFlavorCapability:
case capabilities.MySQLJSONFlavorCapability:
return ServerVersionAtLeast(serverVersion, 5, 7, 0)
case MySQLUpgradeInServerFlavorCapability:
case capabilities.MySQLUpgradeInServerFlavorCapability:
return ServerVersionAtLeast(serverVersion, 8, 0, 16)
case DynamicRedoLogCapacityFlavorCapability:
case capabilities.DynamicRedoLogCapacityFlavorCapability:
return ServerVersionAtLeast(serverVersion, 8, 0, 30)
default:
return false, nil
Expand Down
38 changes: 20 additions & 18 deletions go/mysql/flavor_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ import (
"testing"

"github.com/stretchr/testify/assert"

"vitess.io/vitess/go/mysql/capabilities"
)

func TestServerVersionAtLeast(t *testing.T) {
Expand Down Expand Up @@ -92,92 +94,92 @@ func TestServerVersionAtLeast(t *testing.T) {
func TestGetFlavor(t *testing.T) {
testcases := []struct {
version string
capability FlavorCapability
capability capabilities.FlavorCapability
isCapable bool
}{
{
version: "8.0.14",
capability: InstantDDLFlavorCapability,
capability: capabilities.InstantDDLFlavorCapability,
isCapable: true,
},
{
version: "8.0.20",
capability: TransactionalGtidExecutedFlavorCapability,
capability: capabilities.TransactionalGtidExecutedFlavorCapability,
isCapable: true,
},
{
version: "8.0.0",
capability: InstantAddLastColumnFlavorCapability,
capability: capabilities.InstantAddLastColumnFlavorCapability,
isCapable: true,
},
{
version: "8.0.0",
capability: InstantAddDropColumnFlavorCapability,
capability: capabilities.InstantAddDropColumnFlavorCapability,
isCapable: false,
},
{
version: "5.6.7",
capability: InstantDDLFlavorCapability,
capability: capabilities.InstantDDLFlavorCapability,
isCapable: false,
},
{
version: "5.7.29",
capability: TransactionalGtidExecutedFlavorCapability,
capability: capabilities.TransactionalGtidExecutedFlavorCapability,
isCapable: false,
},
{
version: "5.6.7",
capability: MySQLJSONFlavorCapability,
capability: capabilities.MySQLJSONFlavorCapability,
isCapable: false,
},
{
version: "5.7.29",
capability: MySQLJSONFlavorCapability,
capability: capabilities.MySQLJSONFlavorCapability,
isCapable: true,
},
{
version: "8.0.30",
capability: DynamicRedoLogCapacityFlavorCapability,
capability: capabilities.DynamicRedoLogCapacityFlavorCapability,
isCapable: true,
},
{
version: "8.0.29",
capability: DynamicRedoLogCapacityFlavorCapability,
capability: capabilities.DynamicRedoLogCapacityFlavorCapability,
isCapable: false,
},
{
version: "5.7.38",
capability: DynamicRedoLogCapacityFlavorCapability,
capability: capabilities.DynamicRedoLogCapacityFlavorCapability,
isCapable: false,
},
{
version: "8.0.21",
capability: DisableRedoLogFlavorCapability,
capability: capabilities.DisableRedoLogFlavorCapability,
isCapable: true,
},
{
version: "8.0.20",
capability: DisableRedoLogFlavorCapability,
capability: capabilities.DisableRedoLogFlavorCapability,
isCapable: false,
},
{
version: "8.0.15",
capability: CheckConstraintsCapability,
capability: capabilities.CheckConstraintsCapability,
isCapable: false,
},
{
version: "8.0.20",
capability: CheckConstraintsCapability,
capability: capabilities.CheckConstraintsCapability,
isCapable: true,
},
{
version: "5.7.38",
capability: PerformanceSchemaDataLocksTableCapability,
capability: capabilities.PerformanceSchemaDataLocksTableCapability,
isCapable: false,
},
{
version: "8.0.20",
capability: PerformanceSchemaDataLocksTableCapability,
capability: capabilities.PerformanceSchemaDataLocksTableCapability,
isCapable: true,
},
}
Expand Down
Loading

0 comments on commit 0518c36

Please sign in to comment.