( ctx context.Context, stores *store.Store, user *store.UserMessage, instance *store.InstanceMessage, database *store.DatabaseMessage, driver db.Driver, conn *sql.Conn, statements []parserbase.Statement, originalStatement string, queryContext db.QueryContext, licenseService *enterprise.LicenseService, optionalAccessCheck accessCheckFunc, schemaSyncer *schemasync.Syncer, multiStatement bool, )
| 638 | } |
| 639 | |
| 640 | func queryRetry( |
| 641 | ctx context.Context, |
| 642 | stores *store.Store, |
| 643 | user *store.UserMessage, |
| 644 | instance *store.InstanceMessage, |
| 645 | database *store.DatabaseMessage, |
| 646 | driver db.Driver, |
| 647 | conn *sql.Conn, |
| 648 | statements []parserbase.Statement, |
| 649 | originalStatement string, |
| 650 | queryContext db.QueryContext, |
| 651 | licenseService *enterprise.LicenseService, |
| 652 | optionalAccessCheck accessCheckFunc, |
| 653 | schemaSyncer *schemasync.Syncer, |
| 654 | multiStatement bool, |
| 655 | ) ([]*v1pb.QueryResult, []*parserbase.QuerySpan, time.Duration, error) { |
| 656 | var spans []*parserbase.QuerySpan |
| 657 | var sensitivePredicateColumns [][]parserbase.ColumnResource |
| 658 | var err error |
| 659 | if !queryContext.Explain { |
| 660 | spans, err = parserbase.GetQuerySpan( |
| 661 | ctx, |
| 662 | parserbase.GetQuerySpanContext{ |
| 663 | InstanceID: instance.ResourceID, |
| 664 | GetDatabaseMetadataFunc: parsercontext.BuildGetDatabaseMetadataFunc(stores), |
| 665 | ListDatabaseNamesFunc: parsercontext.BuildListDatabaseNamesFunc(stores), |
| 666 | GetLinkedDatabaseMetadataFunc: parsercontext.BuildGetLinkedDatabaseMetadataFunc(stores, instance.Metadata.GetEngine()), |
| 667 | }, |
| 668 | instance.Metadata.GetEngine(), |
| 669 | statements, |
| 670 | database.DatabaseName, |
| 671 | queryContext.Schema, |
| 672 | !store.IsObjectCaseSensitive(instance), |
| 673 | ) |
| 674 | if err != nil { |
| 675 | return nil, nil, time.Duration(0), err |
| 676 | } |
| 677 | // After replacing backup table with source, we can apply the original access check and mask sensitive data for backup table. |
| 678 | // If err != nil, this function will return the original spans. |
| 679 | if err := replaceBackupTableWithSource(ctx, stores, instance, database, spans); err != nil { |
| 680 | slog.Debug("failed to replace backup table with source", log.BBError(err)) |
| 681 | } |
| 682 | if optionalAccessCheck != nil { |
| 683 | // Check query access |
| 684 | if err := optionalAccessCheck(ctx, instance, database, user, spans, queryContext.Explain, statements, queryContext.Schema, multiStatement); err != nil { |
| 685 | return nil, nil, time.Duration(0), err |
| 686 | } |
| 687 | slog.Debug("optional access check", slog.String("instance", instance.ResourceID), slog.String("database", database.DatabaseName)) |
| 688 | } |
| 689 | if !queryContext.SkipMasking && licenseService.IsFeatureEnabledForInstance(ctx, common.GetWorkspaceIDFromContext(ctx), v1pb.PlanFeature_FEATURE_DATA_MASKING, instance) == nil { |
| 690 | masker := NewQueryResultMasker(stores) |
| 691 | sensitivePredicateColumns, err = masker.ExtractSensitivePredicateColumns(ctx, spans, instance, user) |
| 692 | if err != nil { |
| 693 | return nil, nil, time.Duration(0), connect.NewError(connect.CodeInternal, errors.New(err.Error())) |
| 694 | } |
| 695 | slog.Debug("extract sensitive predicate columns", slog.String("instance", instance.ResourceID), slog.String("database", database.DatabaseName)) |
| 696 | } |
| 697 | } |
no test coverage detected