Skip to content

Commit

Permalink
[planner] Schema information on the information_schema views (#11941)
Browse files Browse the repository at this point in the history
* add info_schema information

Signed-off-by: Andres Taylor <andres@planetscale.com>

* add SchemaInformation handling for info_schema tables

Signed-off-by: Andres Taylor <andres@planetscale.com>

* fix bad test query

Signed-off-by: Andres Taylor <andres@planetscale.com>

* add support for information_schema on mysql 5.7

Signed-off-by: Andres Taylor <andres@planetscale.com>

* columns sorted just like mysql, and tests for 5.7

Signed-off-by: Andres Taylor <andres@planetscale.com>

* test: skip test that should not run

Signed-off-by: Andres Taylor <andres@planetscale.com>

Signed-off-by: Andres Taylor <andres@planetscale.com>
  • Loading branch information
systay authored Dec 14, 2022
1 parent 2d08a98 commit 397fbe2
Show file tree
Hide file tree
Showing 13 changed files with 3,903 additions and 230 deletions.
92 changes: 48 additions & 44 deletions go/vt/sqlparser/ast_funcs.go
Original file line number Diff line number Diff line change
Expand Up @@ -215,97 +215,101 @@ func (ct *ColumnType) DescribeType() string {

// SQLType returns the sqltypes type code for the given column
func (ct *ColumnType) SQLType() querypb.Type {
switch strings.ToLower(ct.Type) {
case keywordStrings[TINYINT]:
if ct.Unsigned {
return SQLTypeToQueryType(ct.Type, ct.Unsigned)
}

func SQLTypeToQueryType(typeName string, unsigned bool) querypb.Type {
switch keywordVals[strings.ToLower(typeName)] {
case TINYINT:
if unsigned {
return sqltypes.Uint8
}
return sqltypes.Int8
case keywordStrings[SMALLINT]:
if ct.Unsigned {
case SMALLINT:
if unsigned {
return sqltypes.Uint16
}
return sqltypes.Int16
case keywordStrings[MEDIUMINT]:
if ct.Unsigned {
case MEDIUMINT:
if unsigned {
return sqltypes.Uint24
}
return sqltypes.Int24
case keywordStrings[INT], keywordStrings[INTEGER]:
if ct.Unsigned {
case INT, INTEGER:
if unsigned {
return sqltypes.Uint32
}
return sqltypes.Int32
case keywordStrings[BIGINT]:
if ct.Unsigned {
case BIGINT:
if unsigned {
return sqltypes.Uint64
}
return sqltypes.Int64
case keywordStrings[BOOL], keywordStrings[BOOLEAN]:
case BOOL, BOOLEAN:
return sqltypes.Uint8
case keywordStrings[TEXT]:
case TEXT:
return sqltypes.Text
case keywordStrings[TINYTEXT]:
case TINYTEXT:
return sqltypes.Text
case keywordStrings[MEDIUMTEXT]:
case MEDIUMTEXT:
return sqltypes.Text
case keywordStrings[LONGTEXT]:
case LONGTEXT:
return sqltypes.Text
case keywordStrings[BLOB]:
case BLOB:
return sqltypes.Blob
case keywordStrings[TINYBLOB]:
case TINYBLOB:
return sqltypes.Blob
case keywordStrings[MEDIUMBLOB]:
case MEDIUMBLOB:
return sqltypes.Blob
case keywordStrings[LONGBLOB]:
case LONGBLOB:
return sqltypes.Blob
case keywordStrings[CHAR]:
case CHAR:
return sqltypes.Char
case keywordStrings[VARCHAR]:
case VARCHAR:
return sqltypes.VarChar
case keywordStrings[BINARY]:
case BINARY:
return sqltypes.Binary
case keywordStrings[VARBINARY]:
case VARBINARY:
return sqltypes.VarBinary
case keywordStrings[DATE]:
case DATE:
return sqltypes.Date
case keywordStrings[TIME]:
case TIME:
return sqltypes.Time
case keywordStrings[DATETIME]:
case DATETIME:
return sqltypes.Datetime
case keywordStrings[TIMESTAMP]:
case TIMESTAMP:
return sqltypes.Timestamp
case keywordStrings[YEAR]:
case YEAR:
return sqltypes.Year
case keywordStrings[FLOAT_TYPE]:
case FLOAT_TYPE:
return sqltypes.Float32
case keywordStrings[DOUBLE]:
case DOUBLE:
return sqltypes.Float64
case keywordStrings[DECIMAL]:
case DECIMAL, DECIMAL_TYPE:
return sqltypes.Decimal
case keywordStrings[BIT]:
case BIT:
return sqltypes.Bit
case keywordStrings[ENUM]:
case ENUM:
return sqltypes.Enum
case keywordStrings[SET]:
case SET:
return sqltypes.Set
case keywordStrings[JSON]:
case JSON:
return sqltypes.TypeJSON
case keywordStrings[GEOMETRY]:
case GEOMETRY:
return sqltypes.Geometry
case keywordStrings[POINT]:
case POINT:
return sqltypes.Geometry
case keywordStrings[LINESTRING]:
case LINESTRING:
return sqltypes.Geometry
case keywordStrings[POLYGON]:
case POLYGON:
return sqltypes.Geometry
case keywordStrings[GEOMETRYCOLLECTION]:
case GEOMETRYCOLLECTION:
return sqltypes.Geometry
case keywordStrings[MULTIPOINT]:
case MULTIPOINT:
return sqltypes.Geometry
case keywordStrings[MULTILINESTRING]:
case MULTILINESTRING:
return sqltypes.Geometry
case keywordStrings[MULTIPOLYGON]:
case MULTIPOLYGON:
return sqltypes.Geometry
}
return sqltypes.Null
Expand Down
2 changes: 2 additions & 0 deletions go/vt/sqlparser/keywords.go
Original file line number Diff line number Diff line change
Expand Up @@ -690,6 +690,7 @@ var keywords = []keyword{

// keywordStrings contains the reverse mapping of token to keyword strings
var keywordStrings = map[int]string{}
var keywordVals = map[string]int{}

// keywordLookupTable is a perfect hash map that maps **case insensitive** keyword names to their ids
var keywordLookupTable *caseInsensitiveTable
Expand Down Expand Up @@ -738,6 +739,7 @@ func init() {
panic(fmt.Sprintf("keyword %q must be lowercase in table", kw.name))
}
keywordStrings[kw.id] = kw.name
keywordVals[kw.name] = kw.id
}

keywordLookupTable = buildCaseInsensitiveTable(keywords)
Expand Down
13 changes: 12 additions & 1 deletion go/vt/vtgate/planbuilder/plan_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ import (
"github.com/nsf/jsondiff"
"github.com/stretchr/testify/require"

"vitess.io/vitess/go/vt/servenv"

vtgatepb "vitess.io/vitess/go/vt/proto/vtgate"

"vitess.io/vitess/go/test/utils"
Expand Down Expand Up @@ -250,10 +252,19 @@ func TestPlan(t *testing.T) {
testFile(t, "flush_cases_no_default_keyspace.json", testOutputTempDir, vschemaWrapper, false)
testFile(t, "show_cases_no_default_keyspace.json", testOutputTempDir, vschemaWrapper, false)
testFile(t, "stream_cases.json", testOutputTempDir, vschemaWrapper, false)
testFile(t, "systemtables_cases.json", testOutputTempDir, vschemaWrapper, false)
testFile(t, "systemtables_cases80.json", testOutputTempDir, vschemaWrapper, false)
testFile(t, "reference_cases.json", testOutputTempDir, vschemaWrapper, false)
}

func TestSystemTables57(t *testing.T) {
// first we move everything to use 5.7 logic
servenv.SetMySQLServerVersionForTest("5.7")
defer servenv.SetMySQLServerVersionForTest("")
vschemaWrapper := &vschemaWrapper{v: loadSchema(t, "vschemas/schema.json", true)}
testOutputTempDir := makeTestOutput(t)
testFile(t, "systemtables_cases57.json", testOutputTempDir, vschemaWrapper, false)
}

func TestSysVarSetDisabled(t *testing.T) {
vschemaWrapper := &vschemaWrapper{
v: loadSchema(t, "vschemas/schema.json", true),
Expand Down
Loading

0 comments on commit 397fbe2

Please sign in to comment.