diff --git a/pkg/expression/builtin_miscellaneous_vec.go b/pkg/expression/builtin_miscellaneous_vec.go index 1c1c584049..2be48400fa 100644 --- a/pkg/expression/builtin_miscellaneous_vec.go +++ b/pkg/expression/builtin_miscellaneous_vec.go @@ -30,6 +30,11 @@ import ( "github.com/pingcap/tidb/pkg/util/vitess" ) +// UUIDStrLen is the length of a UUID in string format +// 16 bytes in hex is 32 characters, plus 4 hyphens = 36 characters (hex/ASCII, 1 byte chars) +// https://datatracker.ietf.org/doc/html/rfc9562#name-uuid-format +const UUIDStrLen = 36 + func (b *builtinInetNtoaSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get() @@ -207,7 +212,7 @@ func (b *builtinUUIDSig) vectorized() bool { func (b *builtinUUIDSig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() - result.ReserveString(n) + result.ReserveStringWithSizeHint(n, UUIDStrLen) var id uuid.UUID var err error for range n { @@ -226,7 +231,7 @@ func (b *builtinUUIDv4Sig) vectorized() bool { func (b *builtinUUIDv4Sig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() - result.ReserveString(n) + result.ReserveStringWithSizeHint(n, UUIDStrLen) var id uuid.UUID var err error for range n { @@ -245,7 +250,7 @@ func (b *builtinUUIDv7Sig) vectorized() bool { func (b *builtinUUIDv7Sig) vecEvalString(ctx EvalContext, input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() - result.ReserveString(n) + result.ReserveStringWithSizeHint(n, UUIDStrLen) var id uuid.UUID var err error for range n { diff --git a/pkg/util/chunk/column.go b/pkg/util/chunk/column.go index 857c5fc3ca..ef3f1bc4fa 100644 --- a/pkg/util/chunk/column.go +++ b/pkg/util/chunk/column.go @@ -612,6 +612,12 @@ func (c *Column) ReserveString(n int) { c.reserve(n, 8) } +// ReserveStringWithSizeHint changes the column capacity to store n strings of a predetermined size. +// example: a 36 character text format UUID: ReserveStringWithSizeHint(1, 36) for a single entry. +func (c *Column) ReserveStringWithSizeHint(n int, size int) { + c.reserve(n, size) +} + // ReserveBytes changes the column capacity to store n bytes elements and set the length to zero. func (c *Column) ReserveBytes(n int) { c.reserve(n, 8)