(ctx context.Context, req *connect.Request[v1pb.QueryRequest])
| 302 | } |
| 303 | |
| 304 | func (s *SQLService) Query(ctx context.Context, req *connect.Request[v1pb.QueryRequest]) (*connect.Response[v1pb.QueryResponse], error) { |
| 305 | request := req.Msg |
| 306 | // Prepare related message. |
| 307 | user, instance, database, err := s.prepareRelatedMessage(ctx, request.Name) |
| 308 | if err != nil { |
| 309 | return nil, err |
| 310 | } |
| 311 | |
| 312 | accessGrant := s.preCheckAccess(ctx, request.Statement, instance, database, false /* requireExport */) |
| 313 | |
| 314 | statement := request.Statement |
| 315 | // In Redshift datashare, Rewrite query used for parser. |
| 316 | if database.Metadata.GetDatashare() { |
| 317 | statement = strings.ReplaceAll(statement, fmt.Sprintf("%s.", database.DatabaseName), "") |
| 318 | } |
| 319 | |
| 320 | // Validate the request. |
| 321 | // New query ACL experience. |
| 322 | if !request.Explain && !common.EngineSupportQueryNewACL(instance.Metadata.GetEngine()) { |
| 323 | if err := validateQueryRequest(instance, statement); err != nil { |
| 324 | return nil, err |
| 325 | } |
| 326 | } |
| 327 | |
| 328 | queryDataPolicy := getEffectiveQueryDataPolicy( |
| 329 | ctx, |
| 330 | s.store, |
| 331 | s.licenseService, |
| 332 | 0, |
| 333 | database.ProjectID, |
| 334 | ) |
| 335 | resolvedDataSourceID, err := resolveDataSourceID(ctx, instance, request.DataSourceId, statement, queryDataPolicy.AllowAdminDataSource) |
| 336 | if err != nil { |
| 337 | return nil, err |
| 338 | } |
| 339 | |
| 340 | dataSource, err := checkAndGetDataSourceQueriable(ctx, s.store, s.licenseService, database, resolvedDataSourceID) |
| 341 | if err != nil { |
| 342 | return nil, err |
| 343 | } |
| 344 | driver, err := s.dbFactory.GetDataSourceDriver(ctx, instance, dataSource, db.ConnectionContext{ |
| 345 | DatabaseName: database.DatabaseName, |
| 346 | DataShare: database.Metadata.GetDatashare(), |
| 347 | ReadOnly: dataSource.GetType() == storepb.DataSourceType_READ_ONLY, |
| 348 | }) |
| 349 | if err != nil { |
| 350 | return nil, connect.NewError(connect.CodeInternal, errors.Errorf("failed to get database driver: %v", err)) |
| 351 | } |
| 352 | defer driver.Close(ctx) |
| 353 | |
| 354 | sqlDB := driver.GetDB() |
| 355 | var conn *sql.Conn |
| 356 | if sqlDB != nil { |
| 357 | conn, err = sqlDB.Conn(ctx) |
| 358 | if err != nil { |
| 359 | return nil, connect.NewError(connect.CodeInternal, errors.Errorf("failed to get database connection: %v", err)) |
| 360 | } |
| 361 | defer conn.Close() |
nothing calls this directly
no test coverage detected