diff --git a/go/vt/vtgate/planbuilder/testdata/other_read_cases.json b/go/vt/vtgate/planbuilder/testdata/other_read_cases.json index 92c8d132eda..e7271deef10 100644 --- a/go/vt/vtgate/planbuilder/testdata/other_read_cases.json +++ b/go/vt/vtgate/planbuilder/testdata/other_read_cases.json @@ -87,5 +87,26 @@ "SingleShardOnly": true } } + }, + { + "comment": "describe info_schema table", + "query": "describe information_schema.administrable_role_authorizations", + "plan": { + "QueryType": "EXPLAIN", + "Original": "describe information_schema.administrable_role_authorizations", + "Instructions": { + "OperatorType": "Send", + "Keyspace": { + "Name": "main", + "Sharded": false + }, + "TargetDestination": "AnyShard()", + "Query": "explain information_schema.administrable_role_authorizations", + "SingleShardOnly": true + }, + "TablesUsed": [ + "main.administrable_role_authorizations" + ] + } } ] diff --git a/go/vt/vtgate/planbuilder/vexplain.go b/go/vt/vtgate/planbuilder/vexplain.go index 1e01576b25d..fb7244a0a65 100644 --- a/go/vt/vtgate/planbuilder/vexplain.go +++ b/go/vt/vtgate/planbuilder/vexplain.go @@ -23,6 +23,8 @@ import ( "vitess.io/vitess/go/vt/vtgate/planbuilder/plancontext" + "vitess.io/vitess/go/vt/vtgate/vindexes" + "vitess.io/vitess/go/sqltypes" "vitess.io/vitess/go/vt/key" querypb "vitess.io/vitess/go/vt/proto/query" @@ -63,24 +65,37 @@ func buildVExplainPlan(ctx context.Context, vexplainStmt *sqlparser.VExplainStmt } func explainTabPlan(explain *sqlparser.ExplainTab, vschema plancontext.VSchema) (*planResult, error) { - _, _, ks, _, destination, err := vschema.FindTableOrVindex(explain.Table) - if err != nil { - return nil, err + var keyspace *vindexes.Keyspace + var destination key.Destination + + if sqlparser.SystemSchema(explain.Table.Qualifier.String()) { + var err error + keyspace, err = vschema.AnyKeyspace() + if err != nil { + return nil, err + } + } else { + var err error + var ks string + _, _, ks, _, destination, err = vschema.FindTableOrVindex(explain.Table) + if err != nil { + return nil, err + } + explain.Table.Qualifier = sqlparser.NewIdentifierCS("") + + keyspace, err = vschema.FindKeyspace(ks) + if err != nil { + return nil, err + } + if keyspace == nil { + return nil, vterrors.VT14004(ks) + } } - explain.Table.Qualifier = sqlparser.NewIdentifierCS("") if destination == nil { destination = key.DestinationAnyShard{} } - keyspace, err := vschema.FindKeyspace(ks) - if err != nil { - return nil, err - } - if keyspace == nil { - return nil, vterrors.VT14004(ks) - } - return newPlanResult(&engine.Send{ Keyspace: keyspace, TargetDestination: destination,