Skip to content

Commit 3753068

Browse files
abmusseThePrez
authored andcommitted
fix: Incompatible CCSID and sort sequence issue
1 parent 10e7a2f commit 3753068

File tree

2 files changed

+142
-208
lines changed

2 files changed

+142
-208
lines changed

db2i_collationSupport.cc

+122-204
Original file line numberDiff line numberDiff line change
@@ -37,195 +37,118 @@ OF SUCH DAMAGE.
3737
#include "db2i_collationSupport.h"
3838
#include "db2i_errors.h"
3939

40-
41-
/*
42-
The following arrays define a mapping between MySQL collation names and
43-
corresponding IBM i sort sequences. The mapping is a 1-to-1 correlation
44-
between corresponding array slots but is incomplete without case-sensitivity
45-
markers dynamically added to the mySqlSortSequence names.
46-
*/
47-
#define MAX_COLLATION 87
48-
static const char* mySQLCollation[MAX_COLLATION] =
49-
{
50-
"ascii_general",
51-
"ascii",
52-
"big5_chinese",
53-
"big5",
54-
"cp1250_croatian",
55-
"cp1250_general",
56-
"cp1250_polish",
57-
"cp1250",
58-
"cp1251_bulgarian",
59-
"cp1251_general",
60-
"cp1251",
61-
"cp1256_general",
62-
"cp1256",
63-
"cp850_general",
64-
"cp850",
65-
"cp852_general",
66-
"cp852",
67-
"cp932_japanese",
68-
"cp932",
69-
"euckr_korean",
70-
"euckr",
71-
"gb2312_chinese",
72-
"gb2312",
73-
"gbk_chinese",
74-
"gbk",
75-
"greek_general",
76-
"greek",
77-
"hebrew_general",
78-
"hebrew",
79-
"latin1_danish",
80-
"latin1_general",
81-
"latin1_german1",
82-
"latin1_spanish",
83-
"latin1_swedish",
84-
"latin1",
85-
"latin2_croatian",
86-
"latin2_general",
87-
"latin2_hungarian",
88-
"latin2",
89-
"latin5_turkish",
90-
"latin5",
91-
"macce_general",
92-
"macce",
93-
"sjis_japanese",
94-
"sjis",
95-
"tis620_thai",
96-
"tis620",
97-
"ucs2_czech",
98-
"ucs2_danish",
99-
"ucs2_esperanto",
100-
"ucs2_estonian",
101-
"ucs2_general",
102-
"ucs2_hungarian",
103-
"ucs2_icelandic",
104-
"ucs2_latvian",
105-
"ucs2_lithuanian",
106-
"ucs2_persian",
107-
"ucs2_polish",
108-
"ucs2_romanian",
109-
"ucs2_slovak",
110-
"ucs2_slovenian",
111-
"ucs2_spanish",
112-
"ucs2_swedish",
113-
"ucs2_turkish",
114-
"ucs2_unicode",
115-
"ucs2",
116-
"ujis_japanese",
117-
"ujis",
118-
"utf8_czech",
119-
"utf8_danish",
120-
"utf8_esperanto",
121-
"utf8_estonian",
122-
"utf8_general",
123-
"utf8_hungarian",
124-
"utf8_icelandic",
125-
"utf8_latvian",
126-
"utf8_lithuanian",
127-
"utf8_persian",
128-
"utf8_polish",
129-
"utf8_romanian",
130-
"utf8_slovak",
131-
"utf8_slovenian",
132-
"utf8_spanish",
133-
"utf8_swedish",
134-
"utf8_turkish",
135-
"utf8_unicode",
136-
"utf8"
40+
struct CollationMapEntry {
41+
const char* collation_name;
42+
const char* db2_sort_sequence;
13743
};
13844

139-
140-
static const char* mySqlSortSequence[MAX_COLLATION] =
141-
{
142-
"QALA101F4",
143-
"QBLA101F4",
144-
"QACHT04B0",
145-
"QBCHT04B0",
146-
"QALA20481",
147-
"QCLA20481",
148-
"QDLA20481",
149-
"QELA20481",
150-
"QACYR0401",
151-
"QBCYR0401",
152-
"QCCYR0401",
153-
"QAARA01A4",
154-
"QBARA01A4",
155-
"QCLA101F4",
156-
"QDLA101F4",
157-
"QALA20366",
158-
"QBLA20366",
159-
"QAJPN04B0",
160-
"QBJPN04B0",
161-
"QAKOR04B0",
162-
"QBKOR04B0",
163-
"QACHS04B0",
164-
"QBCHS04B0",
165-
"QCCHS04B0",
166-
"QDCHS04B0",
167-
"QAELL036B",
168-
"QBELL036B",
169-
"QAHEB01A8",
170-
"QBHEB01A8",
171-
"QALA1047C",
172-
"QBLA1047C",
173-
"QCLA1047C",
174-
"QDLA1047C",
175-
"QELA1047C",
176-
"QFLA1047C",
177-
"QCLA20366",
178-
"QELA20366",
179-
"QFLA20366",
180-
"QGLA20366",
181-
"QATRK0402",
182-
"QBTRK0402",
183-
"QHLA20366",
184-
"QILA20366",
185-
"QCJPN04B0",
186-
"QDJPN04B0",
187-
"QATHA0346",
188-
"QBTHA0346",
189-
"ACS_CZ",
190-
"ADA_DK",
191-
"AEO",
192-
"AET",
193-
"QAUCS04B0",
194-
"AHU",
195-
"AIS",
196-
"ALV",
197-
"ALT",
198-
"AFA",
199-
"APL",
200-
"ARO",
201-
"ASK",
202-
"ASL",
203-
"AES",
204-
"ASW",
205-
"ATR",
206-
"AEN",
207-
"*HEX",
208-
"QEJPN04B0",
209-
"QFJPN04B0",
210-
"ACS_CZ",
211-
"ADA_DK",
212-
"AEO",
213-
"AET",
214-
"QAUCS04B0",
215-
"AHU",
216-
"AIS",
217-
"ALV",
218-
"ALT",
219-
"AFA",
220-
"APL",
221-
"ARO",
222-
"ASK",
223-
"ASL",
224-
"AES",
225-
"ASW",
226-
"ATR",
227-
"AEN",
228-
"*HEX"
45+
static CollationMapEntry collation_map[] = {
46+
{ "ascii_general", "QALA101F4"},
47+
{ "ascii", "QBLA101F4" },
48+
{ "big5_chinese", "QACHT04B0" },
49+
{ "big5", "QBCHT04B0" },
50+
{ "cp1250_croatian", "QALA20481" },
51+
{ "cp1250_general", "QCLA20481" },
52+
{ "cp1250_polish", "QDLA20481" },
53+
{ "cp1250", "QELA20481" },
54+
{ "cp1251_bulgarian", "QACYR0401" },
55+
{ "cp1251_general", "QBCYR0401" },
56+
{ "cp1251", "QCCYR0401" },
57+
{ "cp1256_general", "QAARA01A4" },
58+
{ "cp1256", "QBARA01A4" },
59+
{ "cp850_general", "QCLA101F4" },
60+
{ "cp850", "QDLA101F4" },
61+
{ "cp852_general", "QALA20366" },
62+
{ "cp852", "QBLA20366" },
63+
{ "cp932_japanese", "QAJPN04B0" },
64+
{ "cp932", "QBJPN04B0" },
65+
{ "euckr_korean", "QAKOR04B0" },
66+
{ "euckr", "QBKOR04B0" },
67+
{ "gb2312_chinese", "QACHS04B0" },
68+
{ "gb2312", "QBCHS04B0" },
69+
{ "gbk_chinese", "QCCHS04B0" },
70+
{ "gbk", "QDCHS04B0" },
71+
{ "greek_general", "QAELL036B" },
72+
{ "greek", "QBELL036B" },
73+
{ "hebrew_general", "QAHEB01A8" },
74+
{ "hebrew", "QBHEB01A8" },
75+
{ "latin1_danish", "QALA1047C" },
76+
{ "latin1_general", "QBLA1047C" },
77+
{ "latin1_german1", "QCLA1047C" },
78+
{ "latin1_spanish", "QDLA1047C" },
79+
{ "latin1_swedish", "QELA1047C" },
80+
{ "latin1", "QFLA1047C" },
81+
{ "latin2_croatian", "QCLA20366" },
82+
{ "latin2_general", "QELA20366" },
83+
{ "latin2_hungarian", "QFLA20366" },
84+
{ "latin2", "QGLA20366" },
85+
{ "latin5_turkish", "QATRK0402" },
86+
{ "latin5", "QBTRK0402" },
87+
{ "macce_general", "QHLA20366" },
88+
{ "macce", "QILA20366" },
89+
{ "sjis_japanese", "QCJPN04B0" },
90+
{ "sjis", "QDJPN04B0" },
91+
{ "tis620_thai", "QATHA0346" },
92+
{ "tis620", "QBTHA0346" },
93+
{ "ucs2_czech", "ACS_CZ" },
94+
{ "ucs2_danish", "ADA_DK" },
95+
{ "ucs2_esperanto", "AEO" },
96+
{ "ucs2_estonian", "AET" },
97+
{ "ucs2_general", "QAUCS04B0" },
98+
{ "ucs2_hungarian", "AHU" },
99+
{ "ucs2_icelandic", "AIS" },
100+
{ "ucs2_latvian", "ALV" },
101+
{ "ucs2_lithuanian", "ALT" },
102+
{ "ucs2_persian", "AFA" },
103+
{ "ucs2_polish", "APL" },
104+
{ "ucs2_romanian", "ARO" },
105+
{ "ucs2_slovak", "ASK" },
106+
{ "ucs2_slovenian", "ASL" },
107+
{ "ucs2_spanish", "AES" },
108+
{ "ucs2_swedish", "ASW" },
109+
{ "ucs2_turkish", "ATR" },
110+
{ "ucs2_unicode", "AEN" },
111+
{ "ucs2", "*HEX" },
112+
{ "ujis_japanese", "QEJPN04B0" },
113+
{ "ujis", "QFJPN04B0" },
114+
{ "utf8_czech", "ACS_CZ" },
115+
{ "utf8_danish", "ADA_DK" },
116+
{ "utf8_esperanto", "AEO" },
117+
{ "utf8_estonian", "AET" },
118+
{ "utf8_general", "QAUCS04B0" },
119+
{ "utf8_hungarian", "AHU" },
120+
{ "utf8_icelandic", "AIS" },
121+
{ "utf8_latvian", "ALV" },
122+
{ "utf8_lithuanian", "ALT" },
123+
{ "utf8_persian", "AFA" },
124+
{ "utf8_polish", "APL" },
125+
{ "utf8_romanian", "ARO" },
126+
{ "utf8_slovak", "ASK" },
127+
{ "utf8_slovenian", "ASL" },
128+
{ "utf8_spanish", "AES" },
129+
{ "utf8_swedish", "ASW" },
130+
{ "utf8_turkish", "ATR" },
131+
{ "utf8_unicode", "AEN" },
132+
{ "utf8", "*HEX" },
133+
{ "utf8mb4_czech", "ACS_CZ" },
134+
{ "utf8mb4_danish", "ADA_DK" },
135+
{ "utf8mb4_esperanto", "AEO" },
136+
{ "utf8mb4_estonian", "AET" },
137+
{ "utf8mb4_general", "QAUCS04B0" },
138+
{ "utf8mb4_hungarian", "AHU" },
139+
{ "utf8mb4_icelandic", "AIS" },
140+
{ "utf8mb4_latvian", "ALV" },
141+
{ "utf8mb4_lithuanian", "ALT" },
142+
{ "utf8mb4_persian", "AFA" },
143+
{ "utf8mb4_polish", "APL" },
144+
{ "utf8mb4_romanian", "ARO" },
145+
{ "utf8mb4_slovak", "ASK" },
146+
{ "utf8mb4_slovenian", "ASL" },
147+
{ "utf8mb4_spanish", "AES" },
148+
{ "utf8mb4_swedish", "ASW" },
149+
{ "utf8mb4_turkish", "ATR" },
150+
{ "utf8mb4_unicode", "AEN" },
151+
{ "utf8mb4", "*HEX" }
229152
};
230153

231154

@@ -243,28 +166,23 @@ static int32 getAssociatedSortSequence(const CHARSET_INFO *fieldCharSet, const c
243166

244167
if (strcmp(fieldCharSet->csname,"binary") != 0)
245168
{
246-
int collationSearchLen = strlen(fieldCharSet->name);
169+
size_t collationSearchLen = strlen(fieldCharSet->name);
247170
if (fieldCharSet->state & MY_CS_BINSORT)
248-
collationSearchLen -= 4;
171+
collationSearchLen -= strlen("_bin");
249172
else
250-
collationSearchLen -= 3;
251-
252-
uint16 loopCnt = 0;
253-
for (loopCnt = 0; loopCnt < MAX_COLLATION; ++loopCnt)
254-
{
255-
if ((strlen(mySQLCollation[loopCnt]) == (size_t) collationSearchLen) &&
256-
(strncmp((char*)mySQLCollation[loopCnt], fieldCharSet->name, collationSearchLen) == 0))
257-
break;
258-
}
259-
if (loopCnt == MAX_COLLATION) // Did not find associated sort sequence
173+
collationSearchLen -= strlen("_ci");
174+
175+
for (auto& entry : collation_map)
260176
{
261-
getErrTxt(DB2I_ERR_SRTSEQ);
262-
DBUG_RETURN(DB2I_ERR_SRTSEQ);
177+
if ((strlen(entry.collation_name) == collationSearchLen) &&
178+
(memcmp(entry.collation_name, fieldCharSet->name, collationSearchLen) == 0)) {
179+
*rtnSortSequence = entry.db2_sort_sequence;
180+
DBUG_RETURN(0);
181+
}
263182
}
264-
*rtnSortSequence = mySqlSortSequence[loopCnt];
183+
getErrTxt(DB2I_ERR_SRTSEQ);
184+
DBUG_RETURN(DB2I_ERR_SRTSEQ);
265185
}
266-
267-
DBUG_RETURN(0);
268186
}
269187

270188

0 commit comments

Comments
 (0)