MCPcopy Index your code
hub / github.com/bytebase/bytebase / explainStatement

Method explainStatement

backend/plugin/db/spanner/spanner.go:566–615  ·  view source on GitHub ↗

explainStatement returns the query plan for the given statement as JSON.

(ctx context.Context, statement string)

Source from the content-addressed store, hash-verified

564
565// explainStatement returns the query plan for the given statement as JSON.
566func (d *Driver) explainStatement(ctx context.Context, statement string) ([]*v1pb.QueryResult, error) {
567 if d.client == nil {
568 return nil, errors.New("spanner client is not initialized, database name may be missing")
569 }
570
571 stmts, err := util.SanitizeSQL(statement)
572 if err != nil {
573 return nil, err
574 }
575
576 var results []*v1pb.QueryResult
577 for _, stmt := range stmts {
578 startTime := time.Now()
579 queryResult, err := func() (*v1pb.QueryResult, error) {
580 plan, err := d.client.Single().AnalyzeQuery(ctx, spanner.NewStatement(stmt))
581 if err != nil {
582 return nil, err
583 }
584
585 // Convert the query plan to JSON
586 planJSON, err := convertQueryPlanToJSON(plan)
587 if err != nil {
588 return nil, errors.Wrap(err, "failed to convert query plan to JSON")
589 }
590
591 return &v1pb.QueryResult{
592 ColumnNames: []string{"QUERY PLAN"},
593 ColumnTypeNames: []string{"JSON"},
594 Rows: []*v1pb.QueryRow{
595 {
596 Values: []*v1pb.RowValue{
597 {Kind: &v1pb.RowValue_StringValue{StringValue: planJSON}},
598 },
599 },
600 },
601 }, nil
602 }()
603 if err != nil {
604 queryResult = &v1pb.QueryResult{
605 Error: err.Error(),
606 }
607 }
608 queryResult.Statement = stmt
609 queryResult.Latency = durationpb.New(time.Since(startTime))
610 queryResult.RowsCount = int64(len(queryResult.Rows))
611 results = append(results, queryResult)
612 }
613
614 return results, nil
615}
616
617// PlanNode represents a node in the Spanner query plan for JSON serialization.
618type PlanNode struct {

Callers 1

QueryConnMethod · 0.95

Implementers 15

MockDriverbackend/plugin/advisor/utils_for_tests
Driverbackend/plugin/db/bigquery/bigquery.go
Driverbackend/plugin/db/mongodb/mongodb.go
Driverbackend/plugin/db/trino/trino.go
Driverbackend/plugin/db/redshift/redshift.go
Driverbackend/plugin/db/oracle/oracle.go
Driverbackend/plugin/db/dynamodb/dynamodb.go
Driverbackend/plugin/db/cosmosdb/cosmosdb.go
Driverbackend/plugin/db/spanner/spanner.go
Driverbackend/plugin/db/mssql/mssql.go
Driverbackend/plugin/db/mysql/mysql.go
Driverbackend/plugin/db/pg/pg.go

Calls 3

SanitizeSQLFunction · 0.92
convertQueryPlanToJSONFunction · 0.85
ErrorMethod · 0.45

Tested by

no test coverage detected