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

Method QueryConn

backend/plugin/db/spanner/spanner.go:325–390  ·  view source on GitHub ↗

QueryConn queries a SQL statement in a given connection.

(ctx context.Context, _ *sql.Conn, statement string, queryContext db.QueryContext)

Source from the content-addressed store, hash-verified

323
324// QueryConn queries a SQL statement in a given connection.
325func (d *Driver) QueryConn(ctx context.Context, _ *sql.Conn, statement string, queryContext db.QueryContext) ([]*v1pb.QueryResult, error) {
326 if queryContext.Explain {
327 return d.explainStatement(ctx, statement)
328 }
329
330 stmts, err := util.SanitizeSQL(statement)
331 if err != nil {
332 return nil, err
333 }
334
335 var results []*v1pb.QueryResult
336 for _, statement := range stmts {
337 startTime := time.Now()
338 queryResult, err := func() (*v1pb.QueryResult, error) {
339 if util.IsSelect(statement) {
340 // Only apply limit wrapper for SELECT statements
341 limitedStatement := statement
342 if queryContext.Limit > 0 {
343 limitedStatement = getStatementWithResultLimit(statement, queryContext.Limit)
344 }
345 return d.queryStatement(ctx, limitedStatement, queryContext)
346 }
347 if util.IsDDL(statement) {
348 op, err := d.dbClient.UpdateDatabaseDdl(ctx, &databasepb.UpdateDatabaseDdlRequest{
349 Database: getDSN(d.config.DataSource.Host, d.databaseName),
350 Statements: []string{statement},
351 })
352 if err != nil {
353 return nil, err
354 }
355 if err := op.Wait(ctx); err != nil {
356 return nil, err
357 }
358 return &v1pb.QueryResult{}, nil
359 }
360 var rowCount int64
361 if _, err := d.client.ReadWriteTransaction(ctx, func(ctx context.Context, rwt *spanner.ReadWriteTransaction) error {
362 count, err := rwt.Update(ctx, spanner.NewStatement(statement))
363 if err != nil {
364 return err
365 }
366 rowCount = count
367 return nil
368 }); err != nil {
369 return nil, err
370 }
371 return util.BuildAffectedRowsResult(rowCount, nil), nil
372 }()
373 stop := false
374 if err != nil {
375 queryResult = &v1pb.QueryResult{
376 Error: err.Error(),
377 }
378 stop = true
379 }
380 queryResult.Statement = statement
381 queryResult.Latency = durationpb.New(time.Since(startTime))
382 queryResult.RowsCount = int64(len(queryResult.Rows))

Callers

nothing calls this directly

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 9

explainStatementMethod · 0.95
queryStatementMethod · 0.95
SanitizeSQLFunction · 0.92
IsSelectFunction · 0.92
IsDDLFunction · 0.92
BuildAffectedRowsResultFunction · 0.92
getDSNFunction · 0.85
ErrorMethod · 0.45

Tested by

no test coverage detected