Skip to content

Commit e8014e4

Browse files
committed
Removing maxTextResponseBytes from StringType, since we can't calculate it upfront and need to use session-specific settings to calculate it now.
1 parent d720f84 commit e8014e4

File tree

2 files changed

+39
-47
lines changed

2 files changed

+39
-47
lines changed

sql/types/strings.go

Lines changed: 17 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -62,11 +62,10 @@ var (
6262
)
6363

6464
type StringType struct {
65-
baseType query.Type
66-
maxCharLength int64
67-
maxByteLength int64
68-
maxResponseByteLength uint32
69-
collation sql.CollationID
65+
baseType query.Type
66+
maxCharLength int64
67+
maxByteLength int64
68+
collation sql.CollationID
7069
}
7170

7271
var _ sql.StringType = StringType{}
@@ -126,7 +125,6 @@ func CreateString(baseType query.Type, length int64, collation sql.CollationID)
126125
case sqltypes.Binary, sqltypes.VarBinary, sqltypes.Text, sqltypes.Blob:
127126
maxCharLength = length / charsetMaxLength
128127
}
129-
maxResponseByteLength := maxByteLength
130128

131129
// Make sure that length is valid depending on the base type, since they each handle lengths differently
132130
switch baseType {
@@ -166,21 +164,9 @@ func CreateString(baseType query.Type, length int64, collation sql.CollationID)
166164
maxByteLength = LongTextBlobMax
167165
maxCharLength = LongTextBlobMax / charsetMaxLength
168166
}
169-
170-
maxResponseByteLength = maxByteLength
171-
if baseType == sqltypes.Text && maxByteLength != LongTextBlobMax {
172-
// For TEXT types, MySQL returns the maxByteLength multiplied by the size of the largest
173-
// multibyte character in the associated charset for the maximum field bytes in the response
174-
// metadata. It seems like returning the maxByteLength would be sufficient, but we do this to
175-
// emulate MySQL's behavior exactly.
176-
// The one exception is LongText types, which cannot be multiplied by a multibyte char multiplier,
177-
// since the max bytes field in a column definition response over the wire is a uint32 and multiplying
178-
// longTextBlobMax by anything over 1 would cause it to overflow.
179-
maxResponseByteLength = maxByteLength * charsetMaxLength
180-
}
181167
}
182168

183-
return StringType{baseType, maxCharLength, maxByteLength, uint32(maxResponseByteLength), collation}, nil
169+
return StringType{baseType, maxCharLength, maxByteLength, collation}, nil
184170
}
185171

186172
// MustCreateString is the same as CreateString except it panics on errors.
@@ -234,18 +220,20 @@ func CreateLongText(collation sql.CollationID) sql.StringType {
234220

235221
// MaxTextResponseByteLength implements the Type interface
236222
func (t StringType) MaxTextResponseByteLength(ctx *sql.Context) uint32 {
237-
// TODO: Move this down into the if block and clean up logic
238-
characterSetResults := ctx.GetCharacterSetResults()
239-
charsetMaxLength := uint32(characterSetResults.MaxLength())
240-
241-
// TODO: What happens if character_set_results is set to NULL?
242-
243-
maxTextResponseByteLength := uint32(t.maxByteLength)
223+
// For TEXT types, MySQL returns the maxByteLength multiplied by the size of the largest
224+
// multibyte character in the associated charset for the maximum field bytes in the response
225+
// metadata.
226+
// The one exception is LongText types, which cannot be multiplied by a multibyte char multiplier,
227+
// since the max bytes field in a column definition response over the wire is a uint32 and multiplying
228+
// longTextBlobMax by anything over 1 would cause it to overflow.
244229
if t.baseType == sqltypes.Text && t.maxByteLength != LongTextBlobMax {
245-
maxTextResponseByteLength = maxTextResponseByteLength * charsetMaxLength
230+
// TODO: What happens if character_set_results is set to NULL?
231+
characterSetResults := ctx.GetCharacterSetResults()
232+
charsetMaxLength := uint32(characterSetResults.MaxLength())
233+
return uint32(t.maxByteLength) * charsetMaxLength
234+
} else {
235+
return uint32(t.maxByteLength)
246236
}
247-
248-
return maxTextResponseByteLength
249237
}
250238

251239
func (t StringType) Length() int64 {

sql/types/strings_test.go

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -95,17 +95,17 @@ func TestStringCreateBlob(t *testing.T) {
9595
expectedErr bool
9696
}{
9797
{sqltypes.Binary, 10,
98-
StringType{sqltypes.Binary, 10, 10, 10, sql.Collation_binary}, false},
98+
StringType{sqltypes.Binary, 10, 10, sql.Collation_binary}, false},
9999
{sqltypes.Blob, 10,
100-
StringType{sqltypes.Blob, TinyTextBlobMax, TinyTextBlobMax, TinyTextBlobMax, sql.Collation_binary}, false},
100+
StringType{sqltypes.Blob, TinyTextBlobMax, TinyTextBlobMax, sql.Collation_binary}, false},
101101
{sqltypes.Char, 10,
102-
StringType{sqltypes.Binary, 10, 10, 10, sql.Collation_binary}, false},
102+
StringType{sqltypes.Binary, 10, 10, sql.Collation_binary}, false},
103103
{sqltypes.Text, 10,
104-
StringType{sqltypes.Blob, TinyTextBlobMax, TinyTextBlobMax, TinyTextBlobMax, sql.Collation_binary}, false},
104+
StringType{sqltypes.Blob, TinyTextBlobMax, TinyTextBlobMax, sql.Collation_binary}, false},
105105
{sqltypes.VarBinary, 10,
106-
StringType{sqltypes.VarBinary, 10, 10, 10, sql.Collation_binary}, false},
106+
StringType{sqltypes.VarBinary, 10, 10, sql.Collation_binary}, false},
107107
{sqltypes.VarChar, 10,
108-
StringType{sqltypes.VarBinary, 10, 10, 10, sql.Collation_binary}, false},
108+
StringType{sqltypes.VarBinary, 10, 10, sql.Collation_binary}, false},
109109
}
110110

111111
for _, test := range tests {
@@ -177,29 +177,33 @@ func TestStringCreateString(t *testing.T) {
177177
expectedErr bool
178178
}{
179179
{sqltypes.Binary, 10, sql.Collation_binary,
180-
StringType{sqltypes.Binary, 10, 10, 10, sql.Collation_binary}, false},
180+
StringType{sqltypes.Binary, 10, 10, sql.Collation_binary}, false},
181181
{sqltypes.Blob, 10, sql.Collation_binary,
182-
StringType{sqltypes.Blob, TinyTextBlobMax, TinyTextBlobMax, TinyTextBlobMax, sql.Collation_binary}, false},
182+
StringType{sqltypes.Blob, TinyTextBlobMax, TinyTextBlobMax, sql.Collation_binary}, false},
183183
{sqltypes.Char, 10, sql.Collation_Default,
184-
StringType{sqltypes.Char, 10, 40, 40, sql.Collation_Default}, false},
184+
StringType{sqltypes.Char, 10, 40, sql.Collation_Default}, false},
185185
{sqltypes.Text, 10, sql.Collation_Default,
186-
StringType{sqltypes.Text, TinyTextBlobMax / sql.Collation_Default.CharacterSet().MaxLength(), TinyTextBlobMax, uint32(TinyTextBlobMax * sql.Collation_Default.CharacterSet().MaxLength()), sql.Collation_Default}, false},
186+
// TODO: Test MaxTextResponseBytes: uint32(TinyTextBlobMax * sql.Collation_Default.CharacterSet().MaxLength())
187+
StringType{sqltypes.Text, TinyTextBlobMax / sql.Collation_Default.CharacterSet().MaxLength(), TinyTextBlobMax, sql.Collation_Default}, false},
187188
{sqltypes.Text, 1000, sql.Collation_Default,
188-
StringType{sqltypes.Text, TextBlobMax / sql.Collation_Default.CharacterSet().MaxLength(), TextBlobMax, uint32(TextBlobMax * sql.Collation_Default.CharacterSet().MaxLength()), sql.Collation_Default}, false},
189+
// TODO: Test MaxTextResponseBytes: uint32(TextBlobMax * sql.Collation_Default.CharacterSet().MaxLength())
190+
StringType{sqltypes.Text, TextBlobMax / sql.Collation_Default.CharacterSet().MaxLength(), TextBlobMax, sql.Collation_Default}, false},
189191
{sqltypes.Text, 1000000, sql.Collation_Default,
190-
StringType{sqltypes.Text, MediumTextBlobMax / sql.Collation_Default.CharacterSet().MaxLength(), MediumTextBlobMax, uint32(MediumTextBlobMax * sql.Collation_Default.CharacterSet().MaxLength()), sql.Collation_Default}, false},
192+
// TODO: Test MaxTextResponseBytes: uint32(MediumTextBlobMax * sql.Collation_Default.CharacterSet().MaxLength())
193+
StringType{sqltypes.Text, MediumTextBlobMax / sql.Collation_Default.CharacterSet().MaxLength(), MediumTextBlobMax, sql.Collation_Default}, false},
191194
{sqltypes.Text, LongTextBlobMax, sql.Collation_Default,
192-
StringType{sqltypes.Text, LongTextBlobMax / sql.Collation_Default.CharacterSet().MaxLength(), LongTextBlobMax, uint32(LongTextBlobMax), sql.Collation_Default}, false},
195+
// TODO: Test MaxTextResponseBytes: uint32(LongTextBlobMax)
196+
StringType{sqltypes.Text, LongTextBlobMax / sql.Collation_Default.CharacterSet().MaxLength(), LongTextBlobMax, sql.Collation_Default}, false},
193197
{sqltypes.VarBinary, 10, sql.Collation_binary,
194-
StringType{sqltypes.VarBinary, 10, 10, 10, sql.Collation_binary}, false},
198+
StringType{sqltypes.VarBinary, 10, 10, sql.Collation_binary}, false},
195199
{sqltypes.VarChar, 10, sql.Collation_Default,
196-
StringType{sqltypes.VarChar, 10, 40, 40, sql.Collation_Default}, false},
200+
StringType{sqltypes.VarChar, 10, 40, sql.Collation_Default}, false},
197201
{sqltypes.Char, 10, sql.Collation_binary,
198-
StringType{sqltypes.Binary, 10, 10, 10, sql.Collation_binary}, false},
202+
StringType{sqltypes.Binary, 10, 10, sql.Collation_binary}, false},
199203
{sqltypes.Text, 10, sql.Collation_binary,
200-
StringType{sqltypes.Blob, TinyTextBlobMax, TinyTextBlobMax, TinyTextBlobMax, sql.Collation_binary}, false},
204+
StringType{sqltypes.Blob, TinyTextBlobMax, TinyTextBlobMax, sql.Collation_binary}, false},
201205
{sqltypes.VarChar, 10, sql.Collation_binary,
202-
StringType{sqltypes.VarBinary, 10, 10, 10, sql.Collation_binary}, false},
206+
StringType{sqltypes.VarBinary, 10, 10, sql.Collation_binary}, false},
203207

204208
{sqltypes.Binary, charBinaryMax + 1, sql.Collation_binary, StringType{}, true},
205209
{sqltypes.Blob, LongTextBlobMax + 1, sql.Collation_binary, StringType{}, true},

0 commit comments

Comments
 (0)