Skip to content

Commit d888746

Browse files
dveedenzeminzhou
authored andcommitted
infoschema: make columns table compatible with MySQL 8.0 (pingcap#59779)
close pingcap#59775
1 parent 6c6147d commit d888746

File tree

3 files changed

+33
-22
lines changed

3 files changed

+33
-22
lines changed

pkg/executor/infoschema_reader.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1219,6 +1219,7 @@ func (e *hugeMemTableRetriever) dataForColumnsInTable(
12191219
strings.ToLower(privileges.PrivToString(priv, mysql.AllColumnPrivs, mysql.Priv2Str)), // PRIVILEGES
12201220
columnDesc.Comment, // COLUMN_COMMENT
12211221
col.GeneratedExprString, // GENERATION_EXPRESSION
1222+
nil, // SRS_ID
12221223
)
12231224
e.rows = append(e.rows, record)
12241225
}

pkg/infoschema/tables.go

Lines changed: 28 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -371,15 +371,24 @@ type columnInfo struct {
371371
func buildColumnInfo(col columnInfo) *model.ColumnInfo {
372372
mCharset := charset.CharsetBin
373373
mCollation := charset.CharsetBin
374-
if col.tp == mysql.TypeVarchar || col.tp == mysql.TypeBlob || col.tp == mysql.TypeLongBlob || col.tp == mysql.TypeEnum {
374+
if col.tp == mysql.TypeVarchar || col.tp == mysql.TypeMediumBlob || col.tp == mysql.TypeBlob || col.tp == mysql.TypeLongBlob || col.tp == mysql.TypeEnum {
375375
mCharset = charset.CharsetUTF8MB4
376376
mCollation = charset.CollationUTF8MB4
377377
}
378378
fieldType := types.FieldType{}
379379
fieldType.SetType(col.tp)
380380
fieldType.SetCharset(mCharset)
381381
fieldType.SetCollate(mCollation)
382-
fieldType.SetFlen(col.size)
382+
switch col.tp {
383+
case mysql.TypeBlob:
384+
fieldType.SetFlen(1 << 16)
385+
case mysql.TypeMediumBlob:
386+
fieldType.SetFlen(1 << 24)
387+
case mysql.TypeLongBlob:
388+
fieldType.SetFlen(1 << 32)
389+
default:
390+
fieldType.SetFlen(col.size)
391+
}
383392
fieldType.SetDecimal(col.decimal)
384393
fieldType.SetFlag(col.flag)
385394
fieldType.SetElems(col.enumElems)
@@ -470,27 +479,28 @@ var tablesCols = []columnInfo{
470479

471480
// See: http://dev.mysql.com/doc/refman/5.7/en/information-schema-columns-table.html
472481
var columnsCols = []columnInfo{
473-
{name: "TABLE_CATALOG", tp: mysql.TypeVarchar, size: 512},
482+
{name: "TABLE_CATALOG", tp: mysql.TypeVarchar, size: 64},
474483
{name: "TABLE_SCHEMA", tp: mysql.TypeVarchar, size: 64},
475484
{name: "TABLE_NAME", tp: mysql.TypeVarchar, size: 64},
476485
{name: "COLUMN_NAME", tp: mysql.TypeVarchar, size: 64},
477-
{name: "ORDINAL_POSITION", tp: mysql.TypeLonglong, size: 21},
478-
{name: "COLUMN_DEFAULT", tp: mysql.TypeBlob, size: 196606},
486+
{name: "ORDINAL_POSITION", tp: mysql.TypeLong, flag: mysql.UnsignedFlag},
487+
{name: "COLUMN_DEFAULT", tp: mysql.TypeBlob},
479488
{name: "IS_NULLABLE", tp: mysql.TypeVarchar, size: 3},
480-
{name: "DATA_TYPE", tp: mysql.TypeVarchar, size: 64},
481-
{name: "CHARACTER_MAXIMUM_LENGTH", tp: mysql.TypeLonglong, size: 21},
482-
{name: "CHARACTER_OCTET_LENGTH", tp: mysql.TypeLonglong, size: 21},
483-
{name: "NUMERIC_PRECISION", tp: mysql.TypeLonglong, size: 21},
484-
{name: "NUMERIC_SCALE", tp: mysql.TypeLonglong, size: 21},
485-
{name: "DATETIME_PRECISION", tp: mysql.TypeLonglong, size: 21},
486-
{name: "CHARACTER_SET_NAME", tp: mysql.TypeVarchar, size: 32},
487-
{name: "COLLATION_NAME", tp: mysql.TypeVarchar, size: 32},
488-
{name: "COLUMN_TYPE", tp: mysql.TypeBlob, size: 196606},
489+
{name: "DATA_TYPE", tp: mysql.TypeLongBlob},
490+
{name: "CHARACTER_MAXIMUM_LENGTH", tp: mysql.TypeLonglong},
491+
{name: "CHARACTER_OCTET_LENGTH", tp: mysql.TypeLonglong},
492+
{name: "NUMERIC_PRECISION", tp: mysql.TypeLonglong, flag: mysql.UnsignedFlag},
493+
{name: "NUMERIC_SCALE", tp: mysql.TypeLonglong, flag: mysql.UnsignedFlag},
494+
{name: "DATETIME_PRECISION", tp: mysql.TypeLong, flag: mysql.UnsignedFlag},
495+
{name: "CHARACTER_SET_NAME", tp: mysql.TypeVarchar, size: 64},
496+
{name: "COLLATION_NAME", tp: mysql.TypeVarchar, size: 64},
497+
{name: "COLUMN_TYPE", tp: mysql.TypeMediumBlob},
489498
{name: "COLUMN_KEY", tp: mysql.TypeVarchar, size: 3},
490-
{name: "EXTRA", tp: mysql.TypeVarchar, size: 45},
491-
{name: "PRIVILEGES", tp: mysql.TypeVarchar, size: 80},
492-
{name: "COLUMN_COMMENT", tp: mysql.TypeVarchar, size: 1024},
493-
{name: "GENERATION_EXPRESSION", tp: mysql.TypeBlob, size: 589779, flag: mysql.NotNullFlag},
499+
{name: "EXTRA", tp: mysql.TypeVarchar, size: 256},
500+
{name: "PRIVILEGES", tp: mysql.TypeVarchar, size: 154},
501+
{name: "COLUMN_COMMENT", tp: mysql.TypeBlob},
502+
{name: "GENERATION_EXPRESSION", tp: mysql.TypeLongBlob, flag: mysql.NotNullFlag},
503+
{name: "SRS_ID", tp: mysql.TypeLong, flag: mysql.UnsignedFlag},
494504
}
495505

496506
var columnStatisticsCols = []columnInfo{

tests/integrationtest/r/executor/infoschema_reader.result

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,8 @@ def executor__infoschema_reader v1 VIEW NULL NULL NULL NULL NULL NULL NULL NULL
5959
drop table if exists t;
6060
create table t (bit bit(10) DEFAULT b'100');
6161
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'executor__infoschema_reader' AND TABLE_NAME = 't';
62-
TABLE_CATALOG TABLE_SCHEMA TABLE_NAME COLUMN_NAME ORDINAL_POSITION COLUMN_DEFAULT IS_NULLABLE DATA_TYPE CHARACTER_MAXIMUM_LENGTH CHARACTER_OCTET_LENGTH NUMERIC_PRECISION NUMERIC_SCALE DATETIME_PRECISION CHARACTER_SET_NAME COLLATION_NAME COLUMN_TYPE COLUMN_KEY EXTRA PRIVILEGES COLUMN_COMMENT GENERATION_EXPRESSION
63-
def executor__infoschema_reader t bit 1 b'100' YES bit NULL NULL 10 0 NULL NULL NULL bit(10) select,insert,update,references
62+
TABLE_CATALOG TABLE_SCHEMA TABLE_NAME COLUMN_NAME ORDINAL_POSITION COLUMN_DEFAULT IS_NULLABLE DATA_TYPE CHARACTER_MAXIMUM_LENGTH CHARACTER_OCTET_LENGTH NUMERIC_PRECISION NUMERIC_SCALE DATETIME_PRECISION CHARACTER_SET_NAME COLLATION_NAME COLUMN_TYPE COLUMN_KEY EXTRA PRIVILEGES COLUMN_COMMENT GENERATION_EXPRESSION SRS_ID
63+
def executor__infoschema_reader t bit 1 b'100' YES bit NULL NULL 10 0 NULL NULL NULL bit(10) select,insert,update,references NULL
6464
drop table if exists t;
6565
set time_zone='+08:00';
6666
drop table if exists t;
@@ -272,8 +272,8 @@ drop table if exists t;
272272
CREATE TABLE t ( id int DEFAULT NULL);
273273
CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`1.1.1.1` SQL SECURITY DEFINER VIEW `v_test` (`type`) AS SELECT NULL AS `type` FROM `t` AS `f`;
274274
select * from information_schema.columns where TABLE_SCHEMA = 'executor__infoschema_reader' and TABLE_NAME = 'v_test';
275-
TABLE_CATALOG TABLE_SCHEMA TABLE_NAME COLUMN_NAME ORDINAL_POSITION COLUMN_DEFAULT IS_NULLABLE DATA_TYPE CHARACTER_MAXIMUM_LENGTH CHARACTER_OCTET_LENGTH NUMERIC_PRECISION NUMERIC_SCALE DATETIME_PRECISION CHARACTER_SET_NAME COLLATION_NAME COLUMN_TYPE COLUMN_KEY EXTRA PRIVILEGES COLUMN_COMMENT GENERATION_EXPRESSION
276-
def executor__infoschema_reader v_test type 1 NULL YES binary 0 0 NULL NULL NULL NULL NULL binary(0) select,insert,update,references
275+
TABLE_CATALOG TABLE_SCHEMA TABLE_NAME COLUMN_NAME ORDINAL_POSITION COLUMN_DEFAULT IS_NULLABLE DATA_TYPE CHARACTER_MAXIMUM_LENGTH CHARACTER_OCTET_LENGTH NUMERIC_PRECISION NUMERIC_SCALE DATETIME_PRECISION CHARACTER_SET_NAME COLLATION_NAME COLUMN_TYPE COLUMN_KEY EXTRA PRIVILEGES COLUMN_COMMENT GENERATION_EXPRESSION SRS_ID
276+
def executor__infoschema_reader v_test type 1 NULL YES binary 0 0 NULL NULL NULL NULL NULL binary(0) select,insert,update,references NULL
277277
drop user if exists usageuser;
278278
create user usageuser;
279279
SELECT * FROM information_schema.user_privileges WHERE grantee="'usageuser'@'%'";

0 commit comments

Comments
 (0)