MCPcopy Create free account
hub / github.com/bytebase/bytebase / queryRetry

Function queryRetry

backend/api/v1/sql_service.go:640–835  ·  view source on GitHub ↗
(
	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,
)

Source from the content-addressed store, hash-verified

638}
639
640func 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 }

Callers 2

queryRetryStopOnErrorFunction · 0.85
doExportFunction · 0.85

Calls 15

MaskResultsMethod · 0.95
IsObjectCaseSensitiveFunction · 0.92
BBErrorFunction · 0.92
NewQueryResultMaskerFunction · 0.85
preExecuteMaskingCheckFunction · 0.85
executeWithTimeoutFunction · 0.85

Tested by

no test coverage detected