Skip to content

Commit

Permalink
Merge pull request #85125 from rafiss/backport21.2-85086
Browse files Browse the repository at this point in the history
  • Loading branch information
rafiss authored Jul 27, 2022
2 parents c567d8b + 1f198f1 commit 48da9e3
Show file tree
Hide file tree
Showing 5 changed files with 28 additions and 19 deletions.
8 changes: 4 additions & 4 deletions pkg/sql/faketreeeval/evalctx.go
Original file line number Diff line number Diff line change
Expand Up @@ -180,15 +180,15 @@ type DummyEvalPlanner struct{}
// ResolveOIDFromString is part of the EvalPlanner interface.
func (ep *DummyEvalPlanner) ResolveOIDFromString(
ctx context.Context, resultType *types.T, toResolve *tree.DString,
) (*tree.DOid, error) {
return nil, errors.WithStack(errEvalPlanner)
) (*tree.DOid, bool, error) {
return nil, false, errors.WithStack(errEvalPlanner)
}

// ResolveOIDFromOID is part of the EvalPlanner interface.
func (ep *DummyEvalPlanner) ResolveOIDFromOID(
ctx context.Context, resultType *types.T, toResolve *tree.DOid,
) (*tree.DOid, error) {
return nil, errors.WithStack(errEvalPlanner)
) (*tree.DOid, bool, error) {
return nil, false, errors.WithStack(errEvalPlanner)
}

// UnsafeUpsertDescriptor is part of the EvalPlanner interface.
Expand Down
16 changes: 8 additions & 8 deletions pkg/sql/resolve_oid.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ import (
// ResolveOIDFromString is part of tree.TypeResolver.
func (p *planner) ResolveOIDFromString(
ctx context.Context, resultType *types.T, toResolve *tree.DString,
) (*tree.DOid, error) {
) (_ *tree.DOid, errSafeToIgnore bool, _ error) {
return resolveOID(
ctx, p.Txn(),
p.extendedEvalCtx.InternalExecutor.(sqlutil.InternalExecutor),
Expand All @@ -38,7 +38,7 @@ func (p *planner) ResolveOIDFromString(
// ResolveOIDFromOID is part of tree.TypeResolver.
func (p *planner) ResolveOIDFromOID(
ctx context.Context, resultType *types.T, toResolve *tree.DOid,
) (*tree.DOid, error) {
) (_ *tree.DOid, errSafeToIgnore bool, _ error) {
return resolveOID(
ctx, p.Txn(),
p.extendedEvalCtx.InternalExecutor.(sqlutil.InternalExecutor),
Expand All @@ -52,10 +52,10 @@ func resolveOID(
ie sqlutil.InternalExecutor,
resultType *types.T,
toResolve tree.Datum,
) (*tree.DOid, error) {
) (_ *tree.DOid, errSafeToIgnore bool, _ error) {
info, ok := regTypeInfos[resultType.Oid()]
if !ok {
return nil, pgerror.Newf(
return nil, true, pgerror.Newf(
pgcode.InvalidTextRepresentation,
"invalid input syntax for type %s: %q",
resultType,
Expand All @@ -73,20 +73,20 @@ func resolveOID(
results, err := ie.QueryRow(ctx, "queryOid", txn, q, toResolve)
if err != nil {
if errors.HasType(err, (*tree.MultipleResultsError)(nil)) {
return nil, pgerror.Newf(pgcode.AmbiguousAlias,
return nil, false, pgerror.Newf(pgcode.AmbiguousAlias,
"more than one %s named %s", info.objName, toResolve)
}
return nil, err
return nil, false, err
}
if results.Len() == 0 {
return nil, pgerror.Newf(info.errType,
return nil, true, pgerror.Newf(info.errType,
"%s %s does not exist", info.objName, toResolve)
}
return tree.NewDOidWithName(
results[0].(*tree.DOid).DInt,
resultType,
tree.AsStringWithFlags(results[1], tree.FmtBareStrings),
), nil
), true, nil
}

// regTypeInfo contains details on a pg_catalog table that has a reg* type.
Expand Down
5 changes: 4 additions & 1 deletion pkg/sql/sem/tree/casts.go
Original file line number Diff line number Diff line change
Expand Up @@ -1473,8 +1473,11 @@ func performIntToOidCast(ctx *EvalContext, t *types.T, v DInt) (Datum, error) {
return ret, nil

default:
oid, err := ctx.Planner.ResolveOIDFromOID(ctx.Ctx(), t, NewDOid(v))
oid, errSafeToIgnore, err := ctx.Planner.ResolveOIDFromOID(ctx.Ctx(), t, NewDOid(v))
if err != nil {
if !errSafeToIgnore {
return nil, err
}
oid = NewDOid(v)
oid.semanticType = t
}
Expand Down
14 changes: 10 additions & 4 deletions pkg/sql/sem/tree/datum.go
Original file line number Diff line number Diff line change
Expand Up @@ -4447,8 +4447,11 @@ func ParseDOid(ctx *EvalContext, s string, t *types.T) (*DOid, error) {
// If it is an integer in string form, convert it as an int.
if val, err := ParseDInt(strings.TrimSpace(s)); err == nil {
tmpOid := NewDOid(*val)
oid, err := ctx.Planner.ResolveOIDFromOID(ctx.Ctx(), t, tmpOid)
oid, errSafeToIgnore, err := ctx.Planner.ResolveOIDFromOID(ctx.Ctx(), t, tmpOid)
if err != nil {
if !errSafeToIgnore {
return nil, err
}
oid = tmpOid
oid.semanticType = t
}
Expand Down Expand Up @@ -4518,9 +4521,11 @@ func ParseDOid(ctx *EvalContext, s string, t *types.T) (*DOid, error) {
// Trim type modifiers, e.g. `numeric(10,3)` becomes `numeric`.
s = pgSignatureRegexp.ReplaceAllString(s, "$1")

dOid, missingTypeErr := ctx.Planner.ResolveOIDFromString(ctx.Ctx(), t, NewDString(Name(s).Normalize()))
dOid, errSafeToIgnore, missingTypeErr := ctx.Planner.ResolveOIDFromString(ctx.Ctx(), t, NewDString(Name(s).Normalize()))
if missingTypeErr == nil {
return dOid, missingTypeErr
return dOid, nil
} else if !errSafeToIgnore {
return nil, missingTypeErr
}
// Fall back to some special cases that we support for compatibility
// only. Client use syntax like 'sometype'::regtype to produce the oid
Expand Down Expand Up @@ -4557,7 +4562,8 @@ func ParseDOid(ctx *EvalContext, s string, t *types.T) (*DOid, error) {
name: tn.ObjectName.String(),
}, nil
default:
return ctx.Planner.ResolveOIDFromString(ctx.Ctx(), t, NewDString(s))
d, _ /* errSafeToIgnore */, err := ctx.Planner.ResolveOIDFromString(ctx.Ctx(), t, NewDString(s))
return d, err
}
}

Expand Down
4 changes: 2 additions & 2 deletions pkg/sql/sem/tree/eval.go
Original file line number Diff line number Diff line change
Expand Up @@ -3136,7 +3136,7 @@ type TypeResolver interface {
// query, an error will be returned.
ResolveOIDFromString(
ctx context.Context, resultType *types.T, toResolve *DString,
) (*DOid, error)
) (_ *DOid, errSafeToIgnore bool, _ error)

// ResolveOIDFromOID looks up the populated value of the oid with the
// desired resultType which matches the provided oid.
Expand All @@ -3146,7 +3146,7 @@ type TypeResolver interface {
// query, an error will be returned.
ResolveOIDFromOID(
ctx context.Context, resultType *types.T, toResolve *DOid,
) (*DOid, error)
) (_ *DOid, errSafeToIgnore bool, _ error)
}

// EvalPlanner is a limited planner that can be used from EvalContext.
Expand Down

0 comments on commit 48da9e3

Please sign in to comment.