vitess.io/vitess@v0.16.2/go/mysql/collations/uca_test.go (about)

     1  /*
     2  Copyright 2021 The Vitess Authors.
     3  
     4  Licensed under the Apache License, Version 2.0 (the "License");
     5  you may not use this file except in compliance with the License.
     6  You may obtain a copy of the License at
     7  
     8      http://www.apache.org/licenses/LICENSE-2.0
     9  
    10  Unless required by applicable law or agreed to in writing, software
    11  distributed under the License is distributed on an "AS IS" BASIS,
    12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  See the License for the specific language governing permissions and
    14  limitations under the License.
    15  */
    16  
    17  package collations
    18  
    19  import (
    20  	"bytes"
    21  	"fmt"
    22  	"math/rand"
    23  	"sort"
    24  	"strings"
    25  	"sync"
    26  	"testing"
    27  	"unicode/utf8"
    28  
    29  	"github.com/stretchr/testify/assert"
    30  	"github.com/stretchr/testify/require"
    31  	"golang.org/x/exp/slices"
    32  
    33  	"vitess.io/vitess/go/mysql/collations/internal/charset"
    34  )
    35  
    36  var testcollationMap map[string]Collation
    37  var testcollationSlice []Collation
    38  var testcollationOnce sync.Once
    39  
    40  func testinit() {
    41  	testcollationOnce.Do(func() {
    42  		testcollationSlice = make([]Collation, 0, len(globalAllCollations))
    43  		testcollationMap = make(map[string]Collation)
    44  
    45  		for _, collation := range globalAllCollations {
    46  			collation.Init()
    47  			testcollationMap[collation.Name()] = collation
    48  			testcollationSlice = append(testcollationSlice, collation)
    49  		}
    50  
    51  		sort.Slice(testcollationSlice, func(i, j int) bool {
    52  			return testcollationSlice[i].ID() < testcollationSlice[j].ID()
    53  		})
    54  	})
    55  }
    56  
    57  func testcollation(t testing.TB, name string) Collation {
    58  	t.Helper()
    59  	testinit()
    60  	coll := testcollationMap[name]
    61  	require.NotNil(t, coll, "missing collation: %s", name)
    62  
    63  	return coll
    64  }
    65  
    66  func testall() []Collation {
    67  	testinit()
    68  	return testcollationSlice
    69  }
    70  
    71  func TestWeightsForSpace(t *testing.T) {
    72  	for _, coll := range testall() {
    73  		var actual, expected uint16
    74  		switch coll := coll.(type) {
    75  		case *Collation_uca_legacy:
    76  			actual = coll.uca.WeightForSpace()
    77  			if strings.Contains(coll.name, "_520_") {
    78  				expected = 0x20A
    79  			} else {
    80  				expected = 0x209
    81  			}
    82  		case *Collation_utf8mb4_uca_0900:
    83  			actual = coll.uca.WeightForSpace()
    84  			expected = 0x209
    85  		default:
    86  			continue
    87  		}
    88  		assert.Equal(t, expected, actual, "expected Weight(' ') == 0x%X, got 0x%X", expected, actual)
    89  
    90  	}
    91  }
    92  
    93  func TestKanaSensitivity(t *testing.T) {
    94  	const Kana1 = "の東京ノ"
    95  	const Kana2 = "ノ東京の"
    96  
    97  	var cases = []struct {
    98  		collation string
    99  		equal     bool
   100  	}{
   101  		{"utf8mb4_0900_as_cs", false},
   102  		{"utf8mb4_ja_0900_as_cs", true},
   103  		{"utf8mb4_ja_0900_as_cs_ks", false},
   104  	}
   105  
   106  	for _, tc := range cases {
   107  		t.Run(tc.collation, func(t *testing.T) {
   108  			collation := testcollation(t, tc.collation)
   109  			equal := collation.Collate([]byte(Kana1), []byte(Kana2), false) == 0
   110  			assert.Equal(t, tc.equal, equal, "expected %q == %q to be %v", Kana1, Kana2, tc.equal)
   111  
   112  		})
   113  	}
   114  }
   115  
   116  func TestContractions(t *testing.T) {
   117  	var cases = []struct {
   118  		collation string
   119  		inputs    []string
   120  		expected  []byte
   121  	}{
   122  		{
   123  			collation: "utf8mb4_es_trad_0900_ai_ci",
   124  			inputs:    []string{"ch", "CH", "Ch"},
   125  			expected:  []byte{0x1c, 0x7a, 0x54, 0xa5},
   126  		},
   127  		{
   128  			collation: "utf8mb4_es_trad_0900_as_cs",
   129  			inputs:    []string{"Ch"},
   130  			expected:  []byte{0x1c, 0x7a, 0x54, 0xa5, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x8, 0x0, 0x21},
   131  		},
   132  	}
   133  
   134  	for _, tc := range cases {
   135  		t.Run(tc.collation, func(t *testing.T) {
   136  			coll := testcollation(t, tc.collation)
   137  
   138  			for _, in := range tc.inputs {
   139  				weightString := coll.WeightString(nil, []byte(in), 0)
   140  				assert.True(t, bytes.Equal(weightString, tc.expected), "weight_string(%q) = %#v (expected %#v)", in, weightString, tc.expected)
   141  
   142  			}
   143  		})
   144  	}
   145  }
   146  
   147  func TestReplacementCharacter(t *testing.T) {
   148  	var cases = []struct {
   149  		collation string
   150  		expected  []byte
   151  	}{
   152  		{"utf8mb4_0900_ai_ci", []byte{0xff, 0xfd}},
   153  		{"utf8mb4_0900_as_ci", []byte{0xff, 0xfd, 0x0, 0x0, 0x0, 0x20}},
   154  		{"utf8mb4_0900_as_cs", []byte{0xff, 0xfd, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x2}},
   155  	}
   156  
   157  	for _, tc := range cases {
   158  		t.Run(tc.collation, func(t *testing.T) {
   159  			coll := testcollation(t, tc.collation)
   160  			weightString := coll.WeightString(nil, []byte(string(utf8.RuneError)), 0)
   161  			assert.True(t, bytes.Equal(weightString, tc.expected), "weight_string(\\uFFFD) = %#v (expected %#v)", weightString, tc.expected)
   162  
   163  		})
   164  	}
   165  }
   166  
   167  func TestIsPrefix(t *testing.T) {
   168  	var collations = []string{
   169  		"utf8mb4_0900_ai_ci",
   170  		"utf8mb4_0900_as_ci",
   171  		"utf8mb4_unicode_ci",
   172  		"utf8mb4_unicode_520_ci",
   173  		"utf8mb4_general_ci",
   174  	}
   175  
   176  	for _, collName := range collations {
   177  		coll := testcollation(t, collName)
   178  		input := []rune(strings.ToUpper(ExampleStringLong))
   179  
   180  		for size := 0; size < len(input); size++ {
   181  			left := ExampleStringLong
   182  			right := string(input[:size])
   183  
   184  			cmp := coll.Collate([]byte(left), []byte(right), true)
   185  			assert.Equal(t, 0, cmp, "IsPrefix(%q, %q) = %d (expected 0)", left, right, cmp)
   186  
   187  		}
   188  	}
   189  }
   190  
   191  func DebugUcaLegacyWeightString(t *testing.T, collname string, input, expected []byte) {
   192  	coll := testcollation(t, collname).(*Collation_uca_legacy)
   193  	iter := coll.uca.Iterator(input)
   194  	defer iter.Done()
   195  
   196  	for {
   197  		curcp, _ := iter.DebugCodepoint()
   198  		w, ok := iter.Next()
   199  		if !ok {
   200  			break
   201  		}
   202  
   203  		a := byte(w >> 8)
   204  		b := byte(w)
   205  		t.Logf("%q -> %d, %d | %d, %d", string(curcp), a, b, expected[0], expected[1])
   206  		if a != expected[0] || b != expected[1] {
   207  			t.Errorf("mismatch on %q", string(curcp))
   208  		}
   209  		expected = expected[2:]
   210  	}
   211  }
   212  
   213  const ExampleString = "abc æøå 日本語"
   214  const ExampleStringLong = "Premature optimization is the root of all evil. " +
   215  	"Våre norske tegn bør æres. 日本語が少しわかります。 " +
   216  	"✌️🐶👩🏽"
   217  const JapaneseString = "データの保存とアクセスを行うストレージエンジンがSQLパーサとは" +
   218  	"分離独立しており、用途に応じたストレージエンジンを選択できる" +
   219  	"「マルチストレージエンジン」方式を採用している。"
   220  const WhitespaceString = "This is a\n prett\ny unrealist\nic case; a\nn " +
   221  	"Eng\nlish sente\nnce where\n we'\nve added a new\nline every te\nn " +
   222  	"bytes or\n so.\n"
   223  const HungarianString = "A MySQL adatbázisok adminisztrációjára a mellékelt " +
   224  	"parancssori eszközöket (mysql és mysqladmin) használhatjuk."
   225  const JapaneseString2 = "サーバー SQL モードの設定方法。この設定は、たとえば" +
   226  	"別のデータベースシステムからのコードとの互換性を保ったり、特定の状況に" +
   227  	"ついてのエラー処理を制御したりするために、SQL の構文およびセマンティクス" +
   228  	"の特定の側面を変更します。"
   229  const ChineseString = "\xE9\x98\xBF\xE5\x92\x97\xF0\xAC\xBA\xA1" +
   230  	"\xC4\x81\x61\x62\xC5\xAB\x75\x55\xC7\x96\x5A\xF0\x94\x99\x86" +
   231  	"\xF0\x97\x86\xA0\xF0\xAC\xBA\xA2\xF0\xAE\xAF\xA0\xF0\xB3\x8C\xB3"
   232  const ChineseString2 = "春江潮水连海平,海上明月共潮生。" +
   233  	"滟滟随波千万里,何处春江无月明!" +
   234  	"江流宛转绕芳甸,月照花林皆似霰;" +
   235  	"空里流霜不觉飞,汀上白沙看不见。" +
   236  	"江天一色无纤尘,皎皎空中孤月轮。" +
   237  	"江畔何人初见月?江月何年初照人?" +
   238  	"人生代代无穷已,江月年年只相似。" +
   239  	"不知江月待何人,但见长江送流水。" +
   240  	"白云一片去悠悠,青枫浦上不胜愁。" +
   241  	"谁家今夜扁舟子?何处相思明月楼?"
   242  const SpanishString = "A mí se me hace cuento que empezó Buenos Aires: " +
   243  	"La juzgo tan eterna como el agua y el aire."
   244  const EnglishString = "Dame Mary Rosa Alleyne Hunnings DBE (nee Berry; born 24 March 1935), " +
   245  	"known professionally as Mary Berry, is an English food writer, chef, baker and television presenter."
   246  
   247  var AllTestStrings = []struct {
   248  	Name, Content string
   249  }{
   250  	{"Example", ExampleString},
   251  	{"ExampleLong", ExampleStringLong},
   252  	{"Japanese", JapaneseString},
   253  	{"Whitespace", WhitespaceString},
   254  	{"Hungarian", HungarianString},
   255  	{"Japanese2", JapaneseString2},
   256  	{"Chinese", ChineseString},
   257  	{"Chinese2", ChineseString2},
   258  	{"Spanish", SpanishString},
   259  	{"English", EnglishString},
   260  }
   261  
   262  var TestCases = []struct {
   263  	collation string
   264  	input     string
   265  	expected  []byte
   266  }{
   267  	{
   268  		collation: "utf8mb4_bin",
   269  		input:     ExampleString,
   270  		expected: []byte{
   271  			0x00, 0x00, 0x61, 0x00, 0x00, 0x62, 0x00, 0x00, 0x63, // abc
   272  			0x00, 0x00, 0x20, // space
   273  			0x00, 0x00, 0xe6, 0x00, 0x00, 0xf8, 0x00, 0x00, 0xe5, // æøå
   274  			0x00, 0x00, 0x20, // space
   275  			0x00, 0x65, 0xe5, 0x00, 0x67, 0x2c, 0x00, 0x8a, 0x9e, // 日本語
   276  			0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20,
   277  			0x00, 0x00, 0x20, 0x00, 0x00, 0x20, // space for padding
   278  		},
   279  	},
   280  	{
   281  		collation: "utf8mb4_0900_ai_ci",
   282  		input:     ExampleString,
   283  		expected: []byte{
   284  			0x1c, 0x47, 0x1c, 0x60, 0x1c, 0x7a, // abc
   285  			0x02, 0x09, // space
   286  			0x1c, 0x47, 0x1c, 0xaa, 0x1d, 0xdd, 0x1c, 0x47, // æøå
   287  			0x02, 0x09, // space
   288  			0xfb, 0x40, 0xe5, 0xe5, 0xfb, 0x40, 0xe7, 0x2c,
   289  			0xfb, 0x41, 0x8a, 0x9e, // 日本語
   290  		},
   291  	},
   292  	{
   293  		collation: "utf8mb4_0900_as_ci",
   294  		input:     ExampleString,
   295  		expected: []byte{
   296  			0x1c, 0x47, 0x1c, 0x60, 0x1c, 0x7a, // abc
   297  			0x02, 0x09, // space
   298  			0x1c, 0x47, 0x1c, 0xaa, 0x1d, 0xdd, 0x1c, 0x47, // æøå
   299  			0x02, 0x09, // space
   300  			0xfb, 0x40, 0xe5, 0xe5, 0xfb, 0x40, 0xe7, 0x2c, // 日本語
   301  			0xfb, 0x41, 0x8a, 0x9e, 0x00, 0x00, // level separator
   302  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, // abc
   303  			0x00, 0x20, // space
   304  			0x00, 0x20, 0x01, 0x10, 0x00, 0x20, 0x00, 0x20, // æøå
   305  			0x00, 0x2F, 0x00, 0x20, 0x00, 0x29, 0x00, 0x20, // space
   306  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, // 日本語
   307  		},
   308  	},
   309  	{
   310  		collation: "utf8mb4_0900_as_cs",
   311  		input:     "abc    ",
   312  		expected: []byte{
   313  			0x1c, 0x47, 0x1c, 0x60, 0x1c, 0x7a, // abc
   314  			0x02, 0x09, 0x02, 0x09, 0x02, 0x09,
   315  			0x02, 0x09, // Four spaces.
   316  			0x00, 0x00, // Level separator.
   317  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, // Accents for abc.
   318  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   319  			0x00, 0x20, // Accents for four spaces.
   320  			0x00, 0x00, // Level separator.
   321  			0x00, 0x02, 0x00, 0x02, 0x00, 0x02, // Case for abc.
   322  			0x00, 0x02, 0x00, 0x02, 0x00, 0x02,
   323  			0x00, 0x02, // Case for four spaces.
   324  		},
   325  	},
   326  	{
   327  		collation: "utf8mb4_0900_ai_ci",
   328  		input:     ExampleStringLong,
   329  		expected: []byte{
   330  			0x1e, 0x0c, 0x1e, 0x33, 0x1c, 0xaa, 0x1d, 0xaa, 0x1c, 0x47, 0x1e, 0x95,
   331  			0x1e, 0xb5, 0x1e, 0x33, 0x1c, 0xaa, 0x02, 0x09, 0x1d, 0xdd, 0x1e, 0x0c,
   332  			0x1e, 0x95, 0x1d, 0x32, 0x1d, 0xaa, 0x1d, 0x32, 0x1f, 0x21, 0x1c, 0x47,
   333  			0x1e, 0x95, 0x1d, 0x32, 0x1d, 0xdd, 0x1d, 0xb9, 0x02, 0x09, 0x1d, 0x32,
   334  			0x1e, 0x71, 0x02, 0x09, 0x1e, 0x95, 0x1d, 0x18, 0x1c, 0xaa, 0x02, 0x09,
   335  			0x1e, 0x33, 0x1d, 0xdd, 0x1d, 0xdd, 0x1e, 0x95, 0x02, 0x09, 0x1d, 0xdd,
   336  			0x1c, 0xe5, 0x02, 0x09, 0x1c, 0x47, 0x1d, 0x77, 0x1d, 0x77, 0x02, 0x09,
   337  			0x1c, 0xaa, 0x1e, 0xe3, 0x1d, 0x32, 0x1d, 0x77, 0x02, 0x77, 0x02, 0x09,
   338  			0x1e, 0xe3, 0x1c, 0x47, 0x1e, 0x33, 0x1c, 0xaa, 0x02, 0x09, 0x1d, 0xb9,
   339  			0x1d, 0xdd, 0x1e, 0x33, 0x1e, 0x71, 0x1d, 0x65, 0x1c, 0xaa, 0x02, 0x09,
   340  			0x1e, 0x95, 0x1c, 0xaa, 0x1c, 0xf4, 0x1d, 0xb9, 0x02, 0x09, 0x1c, 0x60,
   341  			0x1d, 0xdd, 0x1e, 0x33, 0x02, 0x09, 0x1c, 0x47, 0x1c, 0xaa, 0x1e, 0x33,
   342  			0x1c, 0xaa, 0x1e, 0x71, 0x02, 0x77, 0x02, 0x09, 0xfb, 0x40, 0xe5, 0xe5,
   343  			0xfb, 0x40, 0xe7, 0x2c, 0xfb, 0x41, 0x8a, 0x9e, 0x3d, 0x60, 0xfb, 0x40,
   344  			0xdc, 0x11, 0x3d, 0x66, 0x3d, 0x87, 0x3d, 0x60, 0x3d, 0x83, 0x3d, 0x79,
   345  			0x3d, 0x67, 0x02, 0x8a, 0x02, 0x09, 0x0a, 0x2d, 0x13, 0xdf, 0x14, 0x12,
   346  			0x13, 0xa6,
   347  		},
   348  	},
   349  	{
   350  		collation: "utf8mb4_0900_as_ci",
   351  		input:     ExampleStringLong,
   352  		expected: []byte{
   353  			0x1e, 0x0c, 0x1e, 0x33, 0x1c, 0xaa, 0x1d, 0xaa, 0x1c, 0x47, 0x1e, 0x95,
   354  			0x1e, 0xb5, 0x1e, 0x33, 0x1c, 0xaa, 0x02, 0x09, 0x1d, 0xdd, 0x1e, 0x0c,
   355  			0x1e, 0x95, 0x1d, 0x32, 0x1d, 0xaa, 0x1d, 0x32, 0x1f, 0x21, 0x1c, 0x47,
   356  			0x1e, 0x95, 0x1d, 0x32, 0x1d, 0xdd, 0x1d, 0xb9, 0x02, 0x09, 0x1d, 0x32,
   357  			0x1e, 0x71, 0x02, 0x09, 0x1e, 0x95, 0x1d, 0x18, 0x1c, 0xaa, 0x02, 0x09,
   358  			0x1e, 0x33, 0x1d, 0xdd, 0x1d, 0xdd, 0x1e, 0x95, 0x02, 0x09, 0x1d, 0xdd,
   359  			0x1c, 0xe5, 0x02, 0x09, 0x1c, 0x47, 0x1d, 0x77, 0x1d, 0x77, 0x02, 0x09,
   360  			0x1c, 0xaa, 0x1e, 0xe3, 0x1d, 0x32, 0x1d, 0x77, 0x02, 0x77, 0x02, 0x09,
   361  			0x1e, 0xe3, 0x1c, 0x47, 0x1e, 0x33, 0x1c, 0xaa, 0x02, 0x09, 0x1d, 0xb9,
   362  			0x1d, 0xdd, 0x1e, 0x33, 0x1e, 0x71, 0x1d, 0x65, 0x1c, 0xaa, 0x02, 0x09,
   363  			0x1e, 0x95, 0x1c, 0xaa, 0x1c, 0xf4, 0x1d, 0xb9, 0x02, 0x09, 0x1c, 0x60,
   364  			0x1d, 0xdd, 0x1e, 0x33, 0x02, 0x09, 0x1c, 0x47, 0x1c, 0xaa, 0x1e, 0x33,
   365  			0x1c, 0xaa, 0x1e, 0x71, 0x02, 0x77, 0x02, 0x09, 0xfb, 0x40, 0xe5, 0xe5,
   366  			0xfb, 0x40, 0xe7, 0x2c, 0xfb, 0x41, 0x8a, 0x9e, 0x3d, 0x60, 0xfb, 0x40,
   367  			0xdc, 0x11, 0x3d, 0x66, 0x3d, 0x87, 0x3d, 0x60, 0x3d, 0x83, 0x3d, 0x79,
   368  			0x3d, 0x67, 0x02, 0x8a, 0x02, 0x09, 0x0a, 0x2d, 0x13, 0xdf, 0x14, 0x12,
   369  			0x13, 0xa6, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   370  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   371  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   372  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   373  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   374  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   375  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   376  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   377  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x29, 0x00, 0x20,
   378  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   379  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   380  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x2F, 0x00, 0x20,
   381  			0x00, 0x20, 0x00, 0x20, 0x01, 0x10, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   382  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   383  			0x00, 0x20, 0x00, 0x37, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   384  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   385  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   386  		},
   387  	},
   388  	{
   389  		collation: "utf8mb4_0900_ai_ci",
   390  		input:     JapaneseString,
   391  		expected: []byte{
   392  			0x3d, 0x6d, 0x1c, 0x0e, 0x3d, 0x6a, 0x3d, 0x73, 0xfb, 0x40, 0xcf, 0xdd,
   393  			0xfb, 0x40, 0xdb, 0x58, 0x3d, 0x6e, 0x3d, 0x5a, 0x3d, 0x62, 0x3d, 0x68,
   394  			0x3d, 0x67, 0x3d, 0x8a, 0xfb, 0x41, 0x88, 0x4c, 0x3d, 0x5c, 0x3d, 0x67,
   395  			0x3d, 0x6e, 0x3d, 0x85, 0x1c, 0x0e, 0x3d, 0x66, 0x3d, 0x5e, 0x3d, 0x8b,
   396  			0x3d, 0x66, 0x3d, 0x8b, 0x3d, 0x60, 0x1e, 0x71, 0x1e, 0x21, 0x1d, 0x77,
   397  			0x3d, 0x74, 0x1c, 0x0e, 0x3d, 0x65, 0x3d, 0x6e, 0x3d, 0x74, 0xfb, 0x40,
   398  			0xd2, 0x06, 0xfb, 0x41, 0x96, 0xe2, 0xfb, 0x40, 0xf2, 0xec, 0xfb, 0x40,
   399  			0xfa, 0xcb, 0x3d, 0x66, 0x3d, 0x6d, 0x3d, 0x5f, 0x3d, 0x83, 0x02, 0x31,
   400  			0xfb, 0x40, 0xf5, 0x28, 0xfb, 0x41, 0x90, 0x14, 0x3d, 0x70, 0xfb, 0x40,
   401  			0xdf, 0xdc, 0x3d, 0x66, 0x3d, 0x6a, 0x3d, 0x67, 0x3d, 0x6e, 0x3d, 0x85,
   402  			0x1c, 0x0e, 0x3d, 0x66, 0x3d, 0x5e, 0x3d, 0x8b, 0x3d, 0x66, 0x3d, 0x8b,
   403  			0x3d, 0x8a, 0xfb, 0x41, 0x90, 0x78, 0xfb, 0x40, 0xe2, 0x9e, 0x3d, 0x6d,
   404  			0x3d, 0x61, 0x3d, 0x84, 0x03, 0x73, 0x3d, 0x79, 0x3d, 0x84, 0x3d, 0x6b,
   405  			0x3d, 0x67, 0x3d, 0x6e, 0x3d, 0x85, 0x1c, 0x0e, 0x3d, 0x66, 0x3d, 0x5e,
   406  			0x3d, 0x8b, 0x3d, 0x66, 0x3d, 0x8b, 0x03, 0x74, 0xfb, 0x40, 0xe5, 0xb9,
   407  			0xfb, 0x40, 0xdf, 0x0f, 0x3d, 0x8a, 0xfb, 0x40, 0xe3, 0xa1, 0xfb, 0x40,
   408  			0xf5, 0x28, 0x3d, 0x66, 0x3d, 0x6d, 0x3d, 0x5b, 0x3d, 0x84, 0x02, 0x8a,
   409  		},
   410  	},
   411  	{
   412  		collation: "utf8mb4_0900_ai_ci",
   413  		input:     WhitespaceString,
   414  		expected: []byte{
   415  			0x1e, 0x95, 0x1d, 0x18, 0x1d, 0x32, 0x1e, 0x71, 0x02, 0x09, 0x1d, 0x32,
   416  			0x1e, 0x71, 0x02, 0x09, 0x1c, 0x47, 0x02, 0x02, 0x02, 0x09, 0x1e, 0x0c,
   417  			0x1e, 0x33, 0x1c, 0xaa, 0x1e, 0x95, 0x1e, 0x95, 0x02, 0x02, 0x1f, 0x0b,
   418  			0x02, 0x09, 0x1e, 0xb5, 0x1d, 0xb9, 0x1e, 0x33, 0x1c, 0xaa, 0x1c, 0x47,
   419  			0x1d, 0x77, 0x1d, 0x32, 0x1e, 0x71, 0x1e, 0x95, 0x02, 0x02, 0x1d, 0x32,
   420  			0x1c, 0x7a, 0x02, 0x09, 0x1c, 0x7a, 0x1c, 0x47, 0x1e, 0x71, 0x1c, 0xaa,
   421  			0x02, 0x34, 0x02, 0x09, 0x1c, 0x47, 0x02, 0x02, 0x1d, 0xb9, 0x02, 0x09,
   422  			0x1c, 0xaa, 0x1d, 0xb9, 0x1c, 0xf4, 0x02, 0x02, 0x1d, 0x77, 0x1d, 0x32,
   423  			0x1e, 0x71, 0x1d, 0x18, 0x02, 0x09, 0x1e, 0x71, 0x1c, 0xaa, 0x1d, 0xb9,
   424  			0x1e, 0x95, 0x1c, 0xaa, 0x02, 0x02, 0x1d, 0xb9, 0x1c, 0x7a, 0x1c, 0xaa,
   425  			0x02, 0x09, 0x1e, 0xf5, 0x1d, 0x18, 0x1c, 0xaa, 0x1e, 0x33, 0x1c, 0xaa,
   426  			0x02, 0x02, 0x02, 0x09, 0x1e, 0xf5, 0x1c, 0xaa, 0x03, 0x05, 0x02, 0x02,
   427  			0x1e, 0xe3, 0x1c, 0xaa, 0x02, 0x09, 0x1c, 0x47, 0x1c, 0x8f, 0x1c, 0x8f,
   428  			0x1c, 0xaa, 0x1c, 0x8f, 0x02, 0x09, 0x1c, 0x47, 0x02, 0x09, 0x1d, 0xb9,
   429  			0x1c, 0xaa, 0x1e, 0xf5, 0x02, 0x02, 0x1d, 0x77, 0x1d, 0x32, 0x1d, 0xb9,
   430  			0x1c, 0xaa, 0x02, 0x09, 0x1c, 0xaa, 0x1e, 0xe3, 0x1c, 0xaa, 0x1e, 0x33,
   431  			0x1f, 0x0b, 0x02, 0x09, 0x1e, 0x95, 0x1c, 0xaa, 0x02, 0x02, 0x1d, 0xb9,
   432  			0x02, 0x09, 0x1c, 0x60, 0x1f, 0x0b, 0x1e, 0x95, 0x1c, 0xaa, 0x1e, 0x71,
   433  			0x02, 0x09, 0x1d, 0xdd, 0x1e, 0x33, 0x02, 0x02, 0x02, 0x09, 0x1e, 0x71,
   434  			0x1d, 0xdd, 0x02, 0x77, 0x02, 0x02,
   435  		},
   436  	},
   437  	{
   438  		collation: "utf8mb4_hu_0900_as_cs",
   439  		input:     HungarianString,
   440  		expected: []byte{
   441  			0x1c, 0x47, 0x02, 0x09, 0x1d, 0xaa, 0x1f, 0x0b, 0x1e, 0x71, 0x1e, 0x21,
   442  			0x1d, 0x77, 0x02, 0x09, 0x1c, 0x47, 0x1c, 0x8f, 0x1c, 0x47, 0x1e, 0x95,
   443  			0x1c, 0x60, 0x1c, 0x47, 0x1f, 0x21, 0x1d, 0x32, 0x1e, 0x71, 0x1d, 0xdd,
   444  			0x1d, 0x65, 0x02, 0x09, 0x1c, 0x47, 0x1c, 0x8f, 0x1d, 0xaa, 0x1d, 0x32,
   445  			0x1d, 0xb9, 0x1d, 0x32, 0x1e, 0x71, 0x54, 0xa5, 0x1e, 0x95, 0x1e, 0x33,
   446  			0x1c, 0x47, 0x1c, 0x7a, 0x1d, 0x32, 0x1d, 0xdd, 0x1d, 0x4c, 0x1c, 0x47,
   447  			0x1e, 0x33, 0x1c, 0x47, 0x02, 0x09, 0x1c, 0x47, 0x02, 0x09, 0x1d, 0xaa,
   448  			0x1c, 0xaa, 0x1d, 0x77, 0x1d, 0x77, 0x1c, 0xaa, 0x1d, 0x65, 0x1c, 0xaa,
   449  			0x1d, 0x77, 0x1e, 0x95, 0x02, 0x09, 0x1e, 0x0c, 0x1c, 0x47, 0x1e, 0x33,
   450  			0x1c, 0x47, 0x1d, 0xb9, 0x1c, 0x7a, 0x54, 0xa5, 0x1e, 0x71, 0x1d, 0xdd,
   451  			0x1e, 0x33, 0x1d, 0x32, 0x02, 0x09, 0x1c, 0xaa, 0x1e, 0x71, 0x54, 0xa5,
   452  			0x1d, 0x65, 0x1d, 0xdd, 0x54, 0xa5, 0x1f, 0x21, 0x1d, 0xdd, 0x54, 0xa5,
   453  			0x1d, 0x65, 0x1c, 0xaa, 0x1e, 0x95, 0x02, 0x09, 0x03, 0x17, 0x1d, 0xaa,
   454  			0x1f, 0x0b, 0x1e, 0x71, 0x1e, 0x21, 0x1d, 0x77, 0x02, 0x09, 0x1c, 0xaa,
   455  			0x1e, 0x71, 0x02, 0x09, 0x1d, 0xaa, 0x1f, 0x0b, 0x1e, 0x71, 0x1e, 0x21,
   456  			0x1d, 0x77, 0x1c, 0x47, 0x1c, 0x8f, 0x1d, 0xaa, 0x1d, 0x32, 0x1d, 0xb9,
   457  			0x03, 0x18, 0x02, 0x09, 0x1d, 0x18, 0x1c, 0x47, 0x1e, 0x71, 0x54, 0xa5,
   458  			0x1d, 0xb9, 0x1c, 0x47, 0x1d, 0x77, 0x1d, 0x18, 0x1c, 0x47, 0x1e, 0x95,
   459  			0x1d, 0x4c, 0x1e, 0xb5, 0x1d, 0x65, 0x02, 0x77, 0x00, 0x00, 0x00, 0x20,
   460  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   461  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   462  			0x00, 0x20, 0x00, 0x24, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   463  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   464  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   465  			0x00, 0x24, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x24, 0x00, 0x20,
   466  			0x00, 0x20, 0x00, 0x24, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   467  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   468  			0x00, 0x24, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   469  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   470  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   471  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   472  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   473  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x24,
   474  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   475  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   476  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   477  			0x00, 0x20, 0x00, 0x24, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   478  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x08,
   479  			0x00, 0x02, 0x00, 0x08, 0x00, 0x02, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08,
   480  			0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02,
   481  			0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02,
   482  			0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02,
   483  			0x00, 0x02, 0x00, 0x02, 0x00, 0x08, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02,
   484  			0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02,
   485  			0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02,
   486  			0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02,
   487  			0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02,
   488  			0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x08,
   489  			0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02,
   490  			0x00, 0x08, 0x00, 0x02, 0x00, 0x08, 0x00, 0x02, 0x00, 0x08, 0x00, 0x02,
   491  			0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02,
   492  			0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02,
   493  			0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02,
   494  			0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02,
   495  			0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x08, 0x00, 0x02,
   496  			0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02,
   497  			0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02,
   498  		},
   499  	},
   500  	{
   501  		collation: "utf8mb4_ja_0900_as_cs",
   502  		input:     JapaneseString2,
   503  		expected: []byte{
   504  			0x1F, 0xC1, 0x1F, 0xB6, 0x1F, 0xD0, 0x1F, 0xB6, 0x02, 0x09, 0x1E, 0x71,
   505  			0x1E, 0x21, 0x1D, 0x77, 0x02, 0x09, 0x1F, 0xD9, 0x1F, 0xBB, 0x1F, 0xCA,
   506  			0x1F, 0xCF, 0x5A, 0xC2, 0x5C, 0x45, 0x5E, 0x8C, 0x5E, 0x8E, 0x02, 0x8A,
   507  			0x1F, 0xC0, 0x1F, 0xCF, 0x5A, 0xC2, 0x5C, 0x45, 0x1F, 0xD0, 0x02, 0x31,
   508  			0x1F, 0xC6, 0x1F, 0xCA, 0x1F, 0xBA, 0x1F, 0xD0, 0x5E, 0x5B, 0x1F, 0xCF,
   509  			0x1F, 0xC9, 0x1F, 0xBA, 0x1F, 0xC6, 0x1F, 0xD3, 0x1F, 0xBA, 0x1F, 0xC3,
   510  			0x1F, 0xC2, 0x1F, 0xC3, 0x1F, 0xC9, 0x1F, 0xD7, 0x1F, 0xBC, 0x1F, 0xDE,
   511  			0x1F, 0xCF, 0x1F, 0xC0, 0x1F, 0xBB, 0x1F, 0xCA, 0x1F, 0xCA, 0x1F, 0xCF,
   512  			0x57, 0xD2, 0x56, 0x34, 0x5A, 0x90, 0x1F, 0xE6, 0x5E, 0x6C, 0x1F, 0xC8,
   513  			0x1F, 0xC6, 0x1F, 0xDF, 0x02, 0x31, 0x5C, 0xDA, 0x5C, 0x45, 0x1F, 0xCF,
   514  			0x5A, 0x1C, 0x56, 0xEE, 0x1F, 0xCC, 0x1F, 0xC8, 0x1F, 0xB7, 0x1F, 0xC9,
   515  			0x1F, 0xCF, 0x1F, 0xBA, 0x1F, 0xDE, 0x1F, 0xB6, 0x59, 0xB1, 0x5F, 0xA6,
   516  			0x1F, 0xE6, 0x5A, 0x8C, 0x57, 0xD9, 0x1F, 0xC2, 0x1F, 0xC6, 0x1F, 0xDF,
   517  			0x1F, 0xC3, 0x1F, 0xE0, 0x1F, 0xC6, 0x1F, 0xD8, 0x1F, 0xCC, 0x02, 0x31,
   518  			0x1E, 0x71, 0x1E, 0x21, 0x1D, 0x77, 0x02, 0x09, 0x1F, 0xCF, 0x58, 0x0E,
   519  			0x5E, 0x47, 0x1F, 0xBB, 0x1F, 0xDD, 0x1F, 0xD1, 0x1F, 0xC4, 0x1F, 0xD5,
   520  			0x1F, 0xE7, 0x1F, 0xC9, 0x1F, 0xB7, 0x1F, 0xBE, 0x1F, 0xC3, 0x1F, 0xCF,
   521  			0x5C, 0xDA, 0x5C, 0x45, 0x1F, 0xCF, 0x5B, 0x45, 0x5F, 0x17, 0x1F, 0xE6,
   522  			0x5E, 0x60, 0x58, 0x0A, 0x1F, 0xC2, 0x1F, 0xD5, 0x1F, 0xC3, 0x02, 0x8A,
   523  			0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x37, 0x00, 0x20,
   524  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   525  			0x00, 0x20, 0x00, 0x20, 0x00, 0x37, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   526  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   527  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   528  			0x00, 0x20, 0x00, 0x37, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x37,
   529  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x37, 0x00, 0x20, 0x00, 0x20,
   530  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   531  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x37, 0x00, 0x20,
   532  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   533  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   534  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   535  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   536  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   537  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   538  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   539  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x37,
   540  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   541  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   542  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   543  			0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x0C, 0x00, 0x21,
   544  			0x00, 0x0E, 0x00, 0x02, 0x00, 0x0C, 0x00, 0x21, 0x00, 0x02, 0x00, 0x08,
   545  			0x00, 0x08, 0x00, 0x08, 0x00, 0x02, 0x00, 0x0E, 0x00, 0x0C, 0x00, 0x21,
   546  			0x00, 0x0E, 0x00, 0x02, 0x00, 0x0E, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02,
   547  			0x00, 0x02, 0x00, 0x02, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x02, 0x00, 0x02,
   548  			0x00, 0x0E, 0x00, 0x02, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E,
   549  			0x00, 0x02, 0x00, 0x02, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x02, 0x00, 0x0C,
   550  			0x00, 0x21, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x02, 0x00, 0x0C, 0x00, 0x21,
   551  			0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E,
   552  			0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0C, 0x00, 0x21, 0x00, 0x0E,
   553  			0x00, 0x02, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02,
   554  			0x00, 0x0E, 0x00, 0x02, 0x00, 0x0D, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x02,
   555  			0x00, 0x02, 0x00, 0x02, 0x00, 0x0E, 0x00, 0x02, 0x00, 0x02, 0x00, 0x0E,
   556  			0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E,
   557  			0x00, 0x0C, 0x00, 0x21, 0x00, 0x02, 0x00, 0x02, 0x00, 0x0E, 0x00, 0x02,
   558  			0x00, 0x02, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E,
   559  			0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x02, 0x00, 0x08, 0x00, 0x08,
   560  			0x00, 0x08, 0x00, 0x02, 0x00, 0x0E, 0x00, 0x02, 0x00, 0x02, 0x00, 0x0E,
   561  			0x00, 0x0E, 0x00, 0x0E, 0x00, 0x02, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E,
   562  			0x00, 0x0E, 0x00, 0x0D, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x02,
   563  			0x00, 0x02, 0x00, 0x0E, 0x00, 0x02, 0x00, 0x02, 0x00, 0x0E, 0x00, 0x02,
   564  			0x00, 0x02, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x02,
   565  		},
   566  	},
   567  	{
   568  		collation: "utf8mb4_ja_0900_as_cs_ks",
   569  		input:     JapaneseString2,
   570  		expected: []byte{
   571  			0x1F, 0xC1, 0x1F, 0xB6, 0x1F, 0xD0, 0x1F, 0xB6, 0x02, 0x09, 0x1E, 0x71,
   572  			0x1E, 0x21, 0x1D, 0x77, 0x02, 0x09, 0x1F, 0xD9, 0x1F, 0xBB, 0x1F, 0xCA,
   573  			0x1F, 0xCF, 0x5A, 0xC2, 0x5C, 0x45, 0x5E, 0x8C, 0x5E, 0x8E, 0x02, 0x8A,
   574  			0x1F, 0xC0, 0x1F, 0xCF, 0x5A, 0xC2, 0x5C, 0x45, 0x1F, 0xD0, 0x02, 0x31,
   575  			0x1F, 0xC6, 0x1F, 0xCA, 0x1F, 0xBA, 0x1F, 0xD0, 0x5E, 0x5B, 0x1F, 0xCF,
   576  			0x1F, 0xC9, 0x1F, 0xBA, 0x1F, 0xC6, 0x1F, 0xD3, 0x1F, 0xBA, 0x1F, 0xC3,
   577  			0x1F, 0xC2, 0x1F, 0xC3, 0x1F, 0xC9, 0x1F, 0xD7, 0x1F, 0xBC, 0x1F, 0xDE,
   578  			0x1F, 0xCF, 0x1F, 0xC0, 0x1F, 0xBB, 0x1F, 0xCA, 0x1F, 0xCA, 0x1F, 0xCF,
   579  			0x57, 0xD2, 0x56, 0x34, 0x5A, 0x90, 0x1F, 0xE6, 0x5E, 0x6C, 0x1F, 0xC8,
   580  			0x1F, 0xC6, 0x1F, 0xDF, 0x02, 0x31, 0x5C, 0xDA, 0x5C, 0x45, 0x1F, 0xCF,
   581  			0x5A, 0x1C, 0x56, 0xEE, 0x1F, 0xCC, 0x1F, 0xC8, 0x1F, 0xB7, 0x1F, 0xC9,
   582  			0x1F, 0xCF, 0x1F, 0xBA, 0x1F, 0xDE, 0x1F, 0xB6, 0x59, 0xB1, 0x5F, 0xA6,
   583  			0x1F, 0xE6, 0x5A, 0x8C, 0x57, 0xD9, 0x1F, 0xC2, 0x1F, 0xC6, 0x1F, 0xDF,
   584  			0x1F, 0xC3, 0x1F, 0xE0, 0x1F, 0xC6, 0x1F, 0xD8, 0x1F, 0xCC, 0x02, 0x31,
   585  			0x1E, 0x71, 0x1E, 0x21, 0x1D, 0x77, 0x02, 0x09, 0x1F, 0xCF, 0x58, 0x0E,
   586  			0x5E, 0x47, 0x1F, 0xBB, 0x1F, 0xDD, 0x1F, 0xD1, 0x1F, 0xC4, 0x1F, 0xD5,
   587  			0x1F, 0xE7, 0x1F, 0xC9, 0x1F, 0xB7, 0x1F, 0xBE, 0x1F, 0xC3, 0x1F, 0xCF,
   588  			0x5C, 0xDA, 0x5C, 0x45, 0x1F, 0xCF, 0x5B, 0x45, 0x5F, 0x17, 0x1F, 0xE6,
   589  			0x5E, 0x60, 0x58, 0x0A, 0x1F, 0xC2, 0x1F, 0xD5, 0x1F, 0xC3, 0x02, 0x8A,
   590  			0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x37, 0x00, 0x20,
   591  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   592  			0x00, 0x20, 0x00, 0x20, 0x00, 0x37, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   593  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   594  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   595  			0x00, 0x20, 0x00, 0x37, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x37,
   596  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x37, 0x00, 0x20, 0x00, 0x20,
   597  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   598  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x37, 0x00, 0x20,
   599  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   600  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   601  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   602  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   603  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   604  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   605  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   606  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x37,
   607  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   608  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   609  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   610  			0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x0C, 0x00, 0x21,
   611  			0x00, 0x0E, 0x00, 0x02, 0x00, 0x0C, 0x00, 0x21, 0x00, 0x02, 0x00, 0x08,
   612  			0x00, 0x08, 0x00, 0x08, 0x00, 0x02, 0x00, 0x0E, 0x00, 0x0C, 0x00, 0x21,
   613  			0x00, 0x0E, 0x00, 0x02, 0x00, 0x0E, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02,
   614  			0x00, 0x02, 0x00, 0x02, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x02, 0x00, 0x02,
   615  			0x00, 0x0E, 0x00, 0x02, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E,
   616  			0x00, 0x02, 0x00, 0x02, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x02, 0x00, 0x0C,
   617  			0x00, 0x21, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x02, 0x00, 0x0C, 0x00, 0x21,
   618  			0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E,
   619  			0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0C, 0x00, 0x21, 0x00, 0x0E,
   620  			0x00, 0x02, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02,
   621  			0x00, 0x0E, 0x00, 0x02, 0x00, 0x0D, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x02,
   622  			0x00, 0x02, 0x00, 0x02, 0x00, 0x0E, 0x00, 0x02, 0x00, 0x02, 0x00, 0x0E,
   623  			0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E,
   624  			0x00, 0x0C, 0x00, 0x21, 0x00, 0x02, 0x00, 0x02, 0x00, 0x0E, 0x00, 0x02,
   625  			0x00, 0x02, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E,
   626  			0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x02, 0x00, 0x08, 0x00, 0x08,
   627  			0x00, 0x08, 0x00, 0x02, 0x00, 0x0E, 0x00, 0x02, 0x00, 0x02, 0x00, 0x0E,
   628  			0x00, 0x0E, 0x00, 0x0E, 0x00, 0x02, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E,
   629  			0x00, 0x0E, 0x00, 0x0D, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x02,
   630  			0x00, 0x02, 0x00, 0x0E, 0x00, 0x02, 0x00, 0x02, 0x00, 0x0E, 0x00, 0x02,
   631  			0x00, 0x02, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x02, 0x00, 0x00,
   632  			0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08,
   633  			0x00, 0x08, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02,
   634  			0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x08, 0x00, 0x08,
   635  			0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08,
   636  			0x00, 0x08, 0x00, 0x08, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x08,
   637  			0x00, 0x08, 0x00, 0x08, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02,
   638  			0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02,
   639  			0x00, 0x02, 0x00, 0x02, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x02,
   640  			0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02,
   641  			0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02,
   642  			0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08,
   643  			0x00, 0x08, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02,
   644  			0x00, 0x02,
   645  		},
   646  	},
   647  	{
   648  		collation: "utf8mb4_zh_0900_as_cs",
   649  		input:     ChineseString,
   650  		expected: []byte{
   651  			0x1C, 0x47, 0xBD, 0xBE, 0xBD, 0xC3, 0xCE, 0xA1, 0xBD, 0xC4, 0xBD, 0xC4,
   652  			0xBD, 0xDD, 0xC0, 0x32, 0xC0, 0x32, 0xC0, 0x32, 0xC0, 0x32, 0xC0, 0x9E,
   653  			0xF6, 0x20, 0xF6, 0x21, 0x81, 0xA0, 0xF6, 0x27, 0xCE, 0xA2, 0xF6, 0x27,
   654  			0xEB, 0xE0, 0xF6, 0x28, 0xB3, 0x33, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20,
   655  			0x00, 0x20, 0x00, 0x1F, 0x01, 0x16, 0x00, 0x20, 0x00, 0x20, 0x00, 0x1F,
   656  			0x01, 0x16, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x01, 0x16, 0x00, 0x20,
   657  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00,
   658  			0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02,
   659  			0x00, 0x02, 0x00, 0x02, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x02,
   660  			0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02,
   661  		},
   662  	},
   663  	{
   664  		collation: "utf8mb4_zh_0900_as_cs",
   665  		input:     ChineseString2,
   666  		expected: []byte{
   667  			0x2C, 0xD0, 0x4F, 0xF1, 0x28, 0x08, 0x87, 0xE8, 0x60, 0x4C, 0x42, 0xEF,
   668  			0x75, 0x93, 0x02, 0x22, 0x42, 0xEF, 0x83, 0x8A, 0x6C, 0x4F, 0xAF, 0x96,
   669  			0x3F, 0x58, 0x28, 0x08, 0x84, 0xCF, 0x02, 0x8A, 0xA3, 0xA4, 0xA3, 0xA4,
   670  			0x8A, 0x5F, 0x23, 0x71, 0x78, 0xA8, 0x93, 0x1A, 0x5E, 0xD9, 0x02, 0x22,
   671  			0x44, 0xAC, 0x2B, 0xD5, 0x2C, 0xD0, 0x4F, 0xF1, 0x96, 0x31, 0xAF, 0x96,
   672  			0x6C, 0x4F, 0x02, 0x60, 0x4F, 0xF1, 0x63, 0x7B, 0x92, 0xDD, 0xBA, 0x2E,
   673  			0x7F, 0x07, 0x39, 0x15, 0x32, 0xB2, 0x02, 0x22, 0xAF, 0x96, 0xB4, 0x41,
   674  			0x47, 0xD7, 0x62, 0x27, 0x51, 0x4C, 0x85, 0xE9, 0x81, 0x86, 0x02, 0x34,
   675  			0x59, 0x09, 0x5E, 0xD9, 0x63, 0x7B, 0x87, 0xBA, 0x24, 0x78, 0x56, 0x5A,
   676  			0x39, 0x48, 0x02, 0x22, 0x8F, 0x74, 0x83, 0x8A, 0x1E, 0x4D, 0x82, 0x46,
   677  			0x57, 0xD9, 0x24, 0x78, 0x4F, 0x79, 0x02, 0x8A, 0x4F, 0xF1, 0x8E, 0x8A,
   678  			0xA6, 0x3E, 0x81, 0xEE, 0x96, 0x31, 0x99, 0x9E, 0x28, 0x97, 0x02, 0x22,
   679  			0x50, 0xC2, 0x50, 0xC2, 0x59, 0x09, 0xB8, 0x20, 0x3F, 0xCC, 0xAF, 0x96,
   680  			0x66, 0xC9, 0x02, 0x8A, 0x4F, 0xF1, 0x72, 0xB6, 0x44, 0xAC, 0x7F, 0x11,
   681  			0x2B, 0x7B, 0x4F, 0x79, 0xAF, 0x96, 0x02, 0x66, 0x4F, 0xF1, 0xAF, 0x96,
   682  			0x44, 0xAC, 0x6F, 0xD5, 0x2B, 0x7B, 0xB4, 0x41, 0x7F, 0x11, 0x02, 0x66,
   683  			0x7F, 0x11, 0x84, 0xCF, 0x2F, 0xE2, 0x2F, 0xE2, 0x96, 0x31, 0x7B, 0xE1,
   684  			0xA7, 0x41, 0x02, 0x22, 0x4F, 0xF1, 0xAF, 0x96, 0x6F, 0xD5, 0x6F, 0xD5,
   685  			0xB6, 0xC3, 0x9B, 0x15, 0x85, 0xE9, 0x02, 0x8A, 0x24, 0x78, 0xB6, 0x2E,
   686  			0x4F, 0xF1, 0xAF, 0x96, 0x2F, 0xF4, 0x44, 0xAC, 0x7F, 0x11, 0x02, 0x22,
   687  			0x30, 0x86, 0x4F, 0x79, 0xB3, 0xDD, 0x4F, 0xF1, 0x89, 0x2A, 0x63, 0x7B,
   688  			0x87, 0xE8, 0x02, 0x8A, 0x1E, 0x4D, 0xB0, 0x1B, 0xA6, 0x3E, 0x75, 0x00,
   689  			0x7D, 0x93, 0xAB, 0xAF, 0xAB, 0xAF, 0x02, 0x22, 0x7B, 0x7D, 0x3A, 0x63,
   690  			0x76, 0xA2, 0x83, 0x8A, 0x24, 0x78, 0x85, 0x16, 0x2B, 0x2D, 0x02, 0x8A,
   691  			0x84, 0x30, 0x4D, 0xF3, 0x52, 0x63, 0xA5, 0xC7, 0x21, 0xE0, 0xB8, 0x87,
   692  			0xBC, 0x16, 0x02, 0x66, 0x44, 0xAC, 0x2B, 0xD5, 0x9B, 0x15, 0x88, 0x52,
   693  			0x6C, 0x4F, 0xAF, 0x96, 0x64, 0xA1, 0x02, 0x66, 0x00, 0x00, 0x00, 0x20,
   694  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   695  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   696  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   697  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   698  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   699  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   700  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   701  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   702  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   703  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   704  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   705  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   706  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   707  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   708  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   709  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   710  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   711  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   712  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   713  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   714  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   715  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   716  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   717  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   718  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   719  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
   720  			0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02,
   721  			0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03,
   722  			0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02,
   723  			0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02,
   724  			0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02,
   725  			0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03,
   726  			0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02,
   727  			0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02,
   728  			0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02,
   729  			0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03,
   730  			0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02,
   731  			0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02,
   732  			0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02,
   733  			0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02,
   734  			0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02,
   735  			0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02,
   736  			0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02,
   737  			0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03,
   738  			0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02,
   739  			0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02,
   740  			0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02,
   741  			0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02,
   742  			0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02,
   743  			0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02,
   744  			0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02,
   745  			0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03,
   746  			0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02,
   747  			0x00, 0x02, 0x00, 0x03,
   748  		},
   749  	},
   750  }
   751  
   752  func TestUCAWeightStrings(t *testing.T) {
   753  	for _, tc := range TestCases {
   754  		t.Run(tc.collation, func(t *testing.T) {
   755  			collation := testcollation(t, tc.collation)
   756  			for maxlen := 0; maxlen < len(tc.expected); maxlen += 2 {
   757  				buf := make([]byte, 0, len(tc.expected))
   758  				result := collation.WeightString(buf, []byte(tc.input), PadToMax)
   759  				if !bytes.Equal(tc.expected[:maxlen], result[:maxlen]) {
   760  					t.Errorf("mismatch at len=%d\ninput:    %#v\nexpected: %#v\nactual:   %#v",
   761  						maxlen, []byte(tc.input), tc.expected[:maxlen], result[:maxlen])
   762  					break
   763  				}
   764  			}
   765  		})
   766  	}
   767  }
   768  
   769  func BenchmarkAllUCAWeightStrings(b *testing.B) {
   770  	for _, tc := range TestCases {
   771  		b.Run(tc.collation, func(b *testing.B) {
   772  			collation := testcollation(b, tc.collation)
   773  			buf := make([]byte, 0, len(tc.expected))
   774  			input := []byte(tc.input)
   775  
   776  			b.ResetTimer()
   777  
   778  			for i := 0; i < b.N; i++ {
   779  				_ = collation.WeightString(buf, input, 0)
   780  			}
   781  		})
   782  	}
   783  }
   784  
   785  func TestCompareWithWeightString(t *testing.T) {
   786  	var cases = []struct {
   787  		left, right string
   788  		equal       bool
   789  	}{
   790  		{"Abc", "aBC", true},
   791  		{"ǍḄÇ", "ÁḆĈ", false},
   792  		{"\uA73A", "\uA738", false},
   793  		{"\uAC00", "\u326E", true},
   794  	}
   795  
   796  	collation := testcollation(t, "utf8mb4_0900_as_ci")
   797  
   798  	for _, tc := range cases {
   799  		left := collation.WeightString(nil, []byte(tc.left), 0)
   800  		right := collation.WeightString(nil, []byte(tc.right), 0)
   801  		assert.Equal(t, tc.equal, bytes.Equal(left, right), "expected %q / %v == %q / %v to be %v", tc.left, left, tc.right, right, tc.equal)
   802  
   803  	}
   804  }
   805  
   806  func TestFastIterators(t *testing.T) {
   807  	allASCIICharacters := make([]byte, 128)
   808  	for n := range allASCIICharacters {
   809  		allASCIICharacters[n] = byte(n)
   810  	}
   811  	allASCIICharacters[0] = 'A'
   812  
   813  	var cases = []struct {
   814  		collation string
   815  		expected  []byte
   816  	}{
   817  		{
   818  			collation: "utf8mb4_0900_as_cs",
   819  			expected:  []byte{0x1c, 0x47, 0x2, 0x1, 0x2, 0x2, 0x2, 0x3, 0x2, 0x4, 0x2, 0x5, 0x2, 0x9, 0x2, 0x60, 0x3, 0xc, 0x3, 0x98, 0x1c, 0x12, 0x3, 0x99, 0x3, 0x96, 0x3, 0x5, 0x3, 0x17, 0x3, 0x18, 0x3, 0x8f, 0x6, 0x16, 0x2, 0x22, 0x2, 0xd, 0x2, 0x77, 0x3, 0x94, 0x1c, 0x3d, 0x1c, 0x3e, 0x1c, 0x3f, 0x1c, 0x40, 0x1c, 0x41, 0x1c, 0x42, 0x1c, 0x43, 0x1c, 0x44, 0x1c, 0x45, 0x1c, 0x46, 0x2, 0x39, 0x2, 0x34, 0x6, 0x1a, 0x6, 0x1b, 0x6, 0x1c, 0x2, 0x66, 0x3, 0x8e, 0x1c, 0x47, 0x1c, 0x60, 0x1c, 0x7a, 0x1c, 0x8f, 0x1c, 0xaa, 0x1c, 0xe5, 0x1c, 0xf4, 0x1d, 0x18, 0x1d, 0x32, 0x1d, 0x4c, 0x1d, 0x65, 0x1d, 0x77, 0x1d, 0xaa, 0x1d, 0xb9, 0x1d, 0xdd, 0x1e, 0xc, 0x1e, 0x21, 0x1e, 0x33, 0x1e, 0x71, 0x1e, 0x95, 0x1e, 0xb5, 0x1e, 0xe3, 0x1e, 0xf5, 0x1e, 0xff, 0x1f, 0xb, 0x1f, 0x21, 0x3, 0x19, 0x3, 0x95, 0x3, 0x1a, 0x4, 0x85, 0x2, 0xb, 0x4, 0x82, 0x1c, 0x47, 0x1c, 0x60, 0x1c, 0x7a, 0x1c, 0x8f, 0x1c, 0xaa, 0x1c, 0xe5, 0x1c, 0xf4, 0x1d, 0x18, 0x1d, 0x32, 0x1d, 0x4c, 0x1d, 0x65, 0x1d, 0x77, 0x1d, 0xaa, 0x1d, 0xb9, 0x1d, 0xdd, 0x1e, 0xc, 0x1e, 0x21, 0x1e, 0x33, 0x1e, 0x71, 0x1e, 0x95, 0x1e, 0xb5, 0x1e, 0xe3, 0x1e, 0xf5, 0x1e, 0xff, 0x1f, 0xb, 0x1f, 0x21, 0x3, 0x1b, 0x6, 0x1e, 0x3, 0x1c, 0x6, 0x20, 0x0, 0x0, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x0, 0x0, 0x8, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x8, 0x0, 0x8, 0x0, 0x8, 0x0, 0x8, 0x0, 0x8, 0x0, 0x8, 0x0, 0x8, 0x0, 0x8, 0x0, 0x8, 0x0, 0x8, 0x0, 0x8, 0x0, 0x8, 0x0, 0x8, 0x0, 0x8, 0x0, 0x8, 0x0, 0x8, 0x0, 0x8, 0x0, 0x8, 0x0, 0x8, 0x0, 0x8, 0x0, 0x8, 0x0, 0x8, 0x0, 0x8, 0x0, 0x8, 0x0, 0x8, 0x0, 0x8, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2},
   820  		},
   821  		{
   822  			collation: "utf8mb4_0900_as_ci",
   823  			expected:  []byte{0x1c, 0x47, 0x2, 0x1, 0x2, 0x2, 0x2, 0x3, 0x2, 0x4, 0x2, 0x5, 0x2, 0x9, 0x2, 0x60, 0x3, 0xc, 0x3, 0x98, 0x1c, 0x12, 0x3, 0x99, 0x3, 0x96, 0x3, 0x5, 0x3, 0x17, 0x3, 0x18, 0x3, 0x8f, 0x6, 0x16, 0x2, 0x22, 0x2, 0xd, 0x2, 0x77, 0x3, 0x94, 0x1c, 0x3d, 0x1c, 0x3e, 0x1c, 0x3f, 0x1c, 0x40, 0x1c, 0x41, 0x1c, 0x42, 0x1c, 0x43, 0x1c, 0x44, 0x1c, 0x45, 0x1c, 0x46, 0x2, 0x39, 0x2, 0x34, 0x6, 0x1a, 0x6, 0x1b, 0x6, 0x1c, 0x2, 0x66, 0x3, 0x8e, 0x1c, 0x47, 0x1c, 0x60, 0x1c, 0x7a, 0x1c, 0x8f, 0x1c, 0xaa, 0x1c, 0xe5, 0x1c, 0xf4, 0x1d, 0x18, 0x1d, 0x32, 0x1d, 0x4c, 0x1d, 0x65, 0x1d, 0x77, 0x1d, 0xaa, 0x1d, 0xb9, 0x1d, 0xdd, 0x1e, 0xc, 0x1e, 0x21, 0x1e, 0x33, 0x1e, 0x71, 0x1e, 0x95, 0x1e, 0xb5, 0x1e, 0xe3, 0x1e, 0xf5, 0x1e, 0xff, 0x1f, 0xb, 0x1f, 0x21, 0x3, 0x19, 0x3, 0x95, 0x3, 0x1a, 0x4, 0x85, 0x2, 0xb, 0x4, 0x82, 0x1c, 0x47, 0x1c, 0x60, 0x1c, 0x7a, 0x1c, 0x8f, 0x1c, 0xaa, 0x1c, 0xe5, 0x1c, 0xf4, 0x1d, 0x18, 0x1d, 0x32, 0x1d, 0x4c, 0x1d, 0x65, 0x1d, 0x77, 0x1d, 0xaa, 0x1d, 0xb9, 0x1d, 0xdd, 0x1e, 0xc, 0x1e, 0x21, 0x1e, 0x33, 0x1e, 0x71, 0x1e, 0x95, 0x1e, 0xb5, 0x1e, 0xe3, 0x1e, 0xf5, 0x1e, 0xff, 0x1f, 0xb, 0x1f, 0x21, 0x3, 0x1b, 0x6, 0x1e, 0x3, 0x1c, 0x6, 0x20, 0x0, 0x0, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20, 0x0, 0x20},
   824  		},
   825  		{
   826  			collation: "utf8mb4_0900_ai_ci",
   827  			expected:  []byte{0x1c, 0x47, 0x2, 0x1, 0x2, 0x2, 0x2, 0x3, 0x2, 0x4, 0x2, 0x5, 0x2, 0x9, 0x2, 0x60, 0x3, 0xc, 0x3, 0x98, 0x1c, 0x12, 0x3, 0x99, 0x3, 0x96, 0x3, 0x5, 0x3, 0x17, 0x3, 0x18, 0x3, 0x8f, 0x6, 0x16, 0x2, 0x22, 0x2, 0xd, 0x2, 0x77, 0x3, 0x94, 0x1c, 0x3d, 0x1c, 0x3e, 0x1c, 0x3f, 0x1c, 0x40, 0x1c, 0x41, 0x1c, 0x42, 0x1c, 0x43, 0x1c, 0x44, 0x1c, 0x45, 0x1c, 0x46, 0x2, 0x39, 0x2, 0x34, 0x6, 0x1a, 0x6, 0x1b, 0x6, 0x1c, 0x2, 0x66, 0x3, 0x8e, 0x1c, 0x47, 0x1c, 0x60, 0x1c, 0x7a, 0x1c, 0x8f, 0x1c, 0xaa, 0x1c, 0xe5, 0x1c, 0xf4, 0x1d, 0x18, 0x1d, 0x32, 0x1d, 0x4c, 0x1d, 0x65, 0x1d, 0x77, 0x1d, 0xaa, 0x1d, 0xb9, 0x1d, 0xdd, 0x1e, 0xc, 0x1e, 0x21, 0x1e, 0x33, 0x1e, 0x71, 0x1e, 0x95, 0x1e, 0xb5, 0x1e, 0xe3, 0x1e, 0xf5, 0x1e, 0xff, 0x1f, 0xb, 0x1f, 0x21, 0x3, 0x19, 0x3, 0x95, 0x3, 0x1a, 0x4, 0x85, 0x2, 0xb, 0x4, 0x82, 0x1c, 0x47, 0x1c, 0x60, 0x1c, 0x7a, 0x1c, 0x8f, 0x1c, 0xaa, 0x1c, 0xe5, 0x1c, 0xf4, 0x1d, 0x18, 0x1d, 0x32, 0x1d, 0x4c, 0x1d, 0x65, 0x1d, 0x77, 0x1d, 0xaa, 0x1d, 0xb9, 0x1d, 0xdd, 0x1e, 0xc, 0x1e, 0x21, 0x1e, 0x33, 0x1e, 0x71, 0x1e, 0x95, 0x1e, 0xb5, 0x1e, 0xe3, 0x1e, 0xf5, 0x1e, 0xff, 0x1f, 0xb, 0x1f, 0x21, 0x3, 0x1b, 0x6, 0x1e, 0x3, 0x1c, 0x6, 0x20},
   828  		},
   829  	}
   830  
   831  	for _, tc := range cases {
   832  		t.Run(tc.collation, func(t *testing.T) {
   833  			coll := testcollation(t, tc.collation)
   834  			result := coll.WeightString(nil, allASCIICharacters, 0)
   835  			assert.True(t, bytes.Equal(tc.expected, result), "weight_string(%q) = %#v (expected %#v)", allASCIICharacters, result, tc.expected)
   836  
   837  		})
   838  	}
   839  }
   840  
   841  func TestUniqueHashes(t *testing.T) {
   842  	for _, teststr := range AllTestStrings {
   843  		t.Run(teststr.Name, func(t *testing.T) {
   844  			var hashes = make(map[uintptr]string)
   845  			for _, collation := range testall() {
   846  				trans, _ := charset.ConvertFromUTF8(nil, collation.Charset(), []byte(teststr.Content))
   847  				h := collation.Hash(trans, 0)
   848  				if dupname, dup := hashes[h]; dup {
   849  					t.Fatalf("%s hashes to %d in %s and %s", teststr.Name, h, collation.Name(), dupname)
   850  				}
   851  				hashes[h] = collation.Name()
   852  			}
   853  		})
   854  	}
   855  }
   856  
   857  type ConsistentCollation struct {
   858  	Collation
   859  	t testing.TB
   860  }
   861  
   862  func (c *ConsistentCollation) Collate(left, right []byte, isPrefix bool) int {
   863  	cmp := c.Collation.Collate(left, right, isPrefix)
   864  	if isPrefix {
   865  		return cmp
   866  	}
   867  
   868  	equal := cmp == 0
   869  	w1 := c.WeightString(nil, left, 0)
   870  	w2 := c.WeightString(nil, right, 0)
   871  	if bytes.Equal(w1, w2) != equal {
   872  		c.t.Errorf("ConsistentCollation(%s): expected WeightString %q / %v == %q / %v to be %v", c.Name(), left, w1, right, w2, equal)
   873  	}
   874  
   875  	h1 := c.Hash(left, 0)
   876  	h2 := c.Hash(right, 0)
   877  	if (h1 == h2) != equal {
   878  		c.t.Errorf("ConsistentCollation(%s): expected Hash %q / %v == %q / %v to be %v", c.Name(), left, h1, right, h2, equal)
   879  	}
   880  
   881  	return cmp
   882  }
   883  
   884  func TestEqualities(t *testing.T) {
   885  	var cases = []struct {
   886  		collation   string
   887  		left, right string
   888  		equal       bool
   889  	}{
   890  		{"utf8mb4_0900_as_ci", "Abc", "aBC", true},
   891  		{"utf8mb4_0900_as_ci", "ǍḄÇ", "ÁḆĈ", false},
   892  		{"utf8mb4_0900_as_ci", "\uA73A", "\uA738", false},
   893  		{"utf8mb4_0900_as_ci", "\uAC00", "\u326E", true},
   894  		{"utf8mb4_0900_as_cs", "の東京ノ", "ノ東京の", false},
   895  		{"utf8mb4_ja_0900_as_cs", "の東京ノ", "ノ東京の", true},
   896  		{"utf8mb4_ja_0900_as_cs_ks", "の東京ノ", "ノ東京の", false},
   897  	}
   898  
   899  	for _, tc := range cases {
   900  		collation := testcollation(t, tc.collation)
   901  		collation = &ConsistentCollation{Collation: collation, t: t}
   902  
   903  		cmp := collation.Collate([]byte(tc.left), []byte(tc.right), false)
   904  		assert.Equal(t, tc.equal, (cmp == 0), "expected %q == %q to be %v", tc.left, tc.right, tc.equal)
   905  
   906  	}
   907  }
   908  
   909  func TestUCACollationOrder(t *testing.T) {
   910  	var sorted = []string{
   911  		"aaaa",
   912  		"bbbb",
   913  		"cccc",
   914  		"dddd",
   915  		"zzzz",
   916  	}
   917  
   918  	var collations = []string{
   919  		"utf8mb4_0900_ai_ci",
   920  		"utf8mb4_0900_as_cs",
   921  	}
   922  
   923  	for _, colname := range collations {
   924  		col := testcollation(t, colname)
   925  
   926  		for _, a := range sorted {
   927  			for _, b := range sorted {
   928  				want := strings.Compare(a, b) < 0
   929  				got := col.Collate([]byte(a), []byte(b), false) < 0
   930  				require.Equalf(t, want, got, "failed to compare %q vs %q", a, b)
   931  			}
   932  		}
   933  
   934  		ary := slices.Clone(sorted)
   935  		for i := range ary {
   936  			j := rand.Intn(i + 1)
   937  			ary[i], ary[j] = ary[j], ary[i]
   938  		}
   939  		slices.SortFunc(ary, func(a, b string) bool {
   940  			return col.Collate([]byte(a), []byte(b), false) < 0
   941  		})
   942  		require.Equal(t, sorted, ary)
   943  	}
   944  }
   945  
   946  func TestCaseChangeEqualities(t *testing.T) {
   947  	for _, teststr := range AllTestStrings {
   948  		str1 := []byte(teststr.Content)
   949  		str2 := []byte(strings.ToUpper(teststr.Content))
   950  		str3 := []byte(strings.ToLower(teststr.Content))
   951  
   952  		t.Run(teststr.Name, func(t *testing.T) {
   953  			for _, collation := range testall() {
   954  				collation = &ConsistentCollation{Collation: collation, t: t}
   955  
   956  				cs := collation.Charset()
   957  				trans1, _ := charset.ConvertFromUTF8(nil, cs, str1)
   958  				trans2, _ := charset.ConvertFromUTF8(nil, cs, str2)
   959  				trans3, _ := charset.ConvertFromUTF8(nil, cs, str3)
   960  
   961  				_ = collation.Collate(trans1, trans2, false)
   962  				_ = collation.Collate(trans1, trans3, false)
   963  				_ = collation.Collate(trans2, trans3, false)
   964  			}
   965  		})
   966  	}
   967  }
   968  
   969  func BenchmarkUCA900Collation(b *testing.B) {
   970  	var Collations = []Collation{
   971  		testcollation(b, "utf8mb4_0900_as_cs"),
   972  		testcollation(b, "utf8mb4_0900_as_ci"),
   973  		testcollation(b, "utf8mb4_0900_ai_ci"),
   974  	}
   975  
   976  	var BenchStrings = []struct {
   977  		Name, Content string
   978  	}{
   979  		{"Long", ExampleStringLong},
   980  		{"Spanish", SpanishString},
   981  		{"English", EnglishString},
   982  		{"Japanese", JapaneseString2},
   983  	}
   984  
   985  	for _, teststr := range BenchStrings {
   986  		for _, length := range []int{1, 8} {
   987  			content := strings.Repeat(teststr.Content, length)
   988  			str1 := []byte(content)
   989  			str2 := []byte(strings.ToUpper(content))
   990  			for _, collation := range Collations {
   991  				b.Run(fmt.Sprintf("%s/%d/%s", teststr.Name, length, collation.Name()), func(b *testing.B) {
   992  					for i := 0; i < b.N; i++ {
   993  						_ = collation.Collate(str1, str2, false)
   994  					}
   995  				})
   996  			}
   997  		}
   998  	}
   999  }