QueryConn queries a SQL statement in a given connection.
(ctx context.Context, _ *sql.Conn, statement string, queryContext db.QueryContext)
| 323 | |
| 324 | // QueryConn queries a SQL statement in a given connection. |
| 325 | func (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)) |
nothing calls this directly
no test coverage detected