@@ -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