MySQL 8.2.0
Source Code Documentation
str_uca_type.h
Go to the documentation of this file.
1/* Copyright (c) 2016, 2023, Oracle and/or its affiliates.
2
3 This program is free software; you can redistribute it and/or modify
4 it under the terms of the GNU General Public License, version 2.0,
5 as published by the Free Software Foundation.
6
7 This program is also distributed with certain software (including
8 but not limited to OpenSSL) that is licensed under separate terms,
9 as designated in a particular file or component or in included license
10 documentation. The authors of MySQL hereby grant you an additional
11 permission to link the program and your derivative works with the
12 separately licensed software that they have included with MySQL.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License, version 2.0, for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
22
23/* This header file contains type declarations used by UCA code. */
24
25#ifndef STR_UCA_TYPE_H
26#define STR_UCA_TYPE_H
27
28#include <array>
29#include <cstdint>
30#include <vector>
31
33
34constexpr int MY_UCA_CNT_FLAG_SIZE = 4096;
36
37/*
38 So far we have only Croatian collation needs to reorder Latin and
39 Cyrillic group of characters. May add more in future.
40*/
41#define UCA_MAX_CHAR_GRP 4
43
52};
53
55 uint16_t begin;
56 uint16_t end;
57};
58
62};
63
68 uint16_t max_weight;
69};
70
72
73struct Coll_param {
75 bool norm_enabled; // false = normalization off, default;
76 // true = on
78};
79
80/*
81 NOTE: If you change MY_UCA_MAX_CONTRACTION, be sure to update the comment on
82 MY_UCA_CNT_MID1 in strings/uca_data.h, as it might cause us to run out of
83 bits in a byte flag.
84*/
85#define MY_UCA_MAX_CONTRACTION 6
86#define MY_UCA_MAX_WEIGHT_SIZE 25
87#define MY_UCA_WEIGHT_LEVELS 1
88
89/*
90 We store all the contractions in a trie, indexed on the codepoints they
91 consist of. The trie is organized as:
92 1. Each node stores one code point (ch) of contraction, and a list of nodes
93 (child_nodes) store all possible following code points.
94 2. The vector in MY_UCA_INFO stores a list of nodes which store the first
95 code points of all contractions.
96 3. Each node has a boolean value (is_contraction_tail) which shows
97 whether the code point stored in the node is the end of a contraction.
98 This is necessary because even if one code point is the end of a
99 contraction, there might be longer contraction contains all the
100 code points in the path (e.g., for Hungarian, both 'DZ' and 'DZS' are
101 contractions).
102 4. A contraction is formed by all the code points in the path until the
103 end of the contraction.
104 5. If it is the end of a contraction (is_contraction_tail == true), the
105 weight of this contraction is stored in array weight.
106 6. If it is the end of a contraction (is_contraction_tail == true),
107 with_context shows whether it is common contraction (with_context ==
108 false), or previous context contraction (with_context == true).
109 7. If it is the end of a contraction (is_contraction_tail == true),
110 contraction_len shows how many code points this contraction consists of.
111*/
114 // Lists of following nodes.
115 std::vector<MY_CONTRACTION> child_nodes;
116 std::vector<MY_CONTRACTION> child_nodes_context;
117
118 // weight and with_context are only useful when is_contraction_tail is true.
119 uint16_t weight[MY_UCA_MAX_WEIGHT_SIZE]; /* Its weight string, 0-terminated */
122};
123
127
128 // Collation weights.
130
131 uint8_t *lengths{nullptr};
132 std::vector<uint8_t> *m_allocated_weights{nullptr};
133 uint16_t **weights{nullptr};
134
135 bool have_contractions{false};
136 std::vector<MY_CONTRACTION> *contraction_nodes{nullptr};
137 /*
138 contraction_flags is only used when a collation has contraction rule.
139 UCA collation supports at least 65535 characters, but only a few of
140 them can be part of contraction, it is huge waste of time to find out
141 whether one character is in contraction list for every character.
142 contraction_flags points to memory which is allocated when a collation
143 has contraction rule. For a character in contraction, its corresponding
144 byte (contraction_flags[ch & 0x1000]) will be set to a certain value
145 according to the position (head, tail or middle) of this character in
146 contraction. This byte will be used to quick check whether one character
147 can be part of contraction.
148 */
149 using flags_type = std::array<char, MY_UCA_CNT_FLAG_SIZE>;
151
152 /* Logical positions */
165 /*
166 extra_ce_pri_base, extra_ce_sec_base and extra_ce_ter_base are only used for
167 the UCA collations whose UCA version is not smaller than UCA_V900. For why
168 we need this extra CE, please see the comment in my_char_weight_put_900()
169 and apply_primary_shift_900().
170
171 The value of these three variables is set by the definition of my_uca_v900.
172 The value of extra_ce_pri_base is usually 0x54A4 (which is the maximum
173 regular weight value pluses one, 0x54A3 + 1 = 0x54A4). But for the Chinese
174 collation, the extra_ce_pri_base needs to change. This is because 0x54A4 has
175 been occupied to do reordering. There might be weight conflict if we still
176 use 0x54A4. Please also see the comment on modify_all_zh_pages().
177 */
178 uint16_t extra_ce_pri_base{0}; // Primary weight of extra CE
179 uint16_t extra_ce_sec_base{0}; // Secondary weight of extra CE
180 uint16_t extra_ce_ter_base{0}; // Tertiary weight of extra CE
181};
182
183/** Whether the given character can be the first in any contraction. */
184#define MY_UCA_CNT_HEAD 1
185
186/** Whether the given character can be the last in any contraction. */
187#define MY_UCA_CNT_TAIL 2
188
189/**
190 Whether the given character can be the second in any contraction.
191
192 Also defined implicitly through shifting MY_UCA_CNT_MID1:
193
194 \#define MY_UCA_CNT_MID2 8
195 \#define MY_UCA_CNT_MID3 16
196 \#define MY_UCA_CNT_MID4 32
197
198 There's no need for MY_UCA_CNT_MID5 (which would cause us to run out of
199 bits) since MY_UCA_MAX_CONTRACTION is 6 (so head, four in the middle,
200 and then tail).
201*/
202#define MY_UCA_CNT_MID1 4
203
204/**
205 Whether the given character is the first part of a context-sensitive
206 contraction. Context-sensitive contractions are like normal contractions,
207 except that for performance reasons, they trigger on the _last_ character
208 instead of the first. The case given in Unicode TR35 is that in some
209 scripts (such as katakana in Japanese), "a-" should sort as "aa"
210 (except on the tertiary level), "e-" should sort as "ee" and so on.
211 However, adding regular contractions on "a" and "e" would cause undue
212 performance loss, so instead, we add a special "context-sensitive"
213 contraction on "-" that then looks at the _previous_ character.
214
215 We don't support context-sensitive contractions longer than two characters
216 at the moment, since none exist in CLDR. Thus, there is no
217 MY_UCA_PREVIOUS_CONTEXT_MID1 and so on.
218*/
219#define MY_UCA_PREVIOUS_CONTEXT_HEAD 64
220
221/** Similar to MY_UCA_PREVIOUS_CONTEXT_HEAD, just for the tail. */
222#define MY_UCA_PREVIOUS_CONTEXT_TAIL 128
223
224#define MY_UCA_PSHIFT 8
225
226/**
227 Check if a code point can be contraction head
228
229 @param flags Pointer to UCA contraction flag data
230 @param wc Code point
231
232 @retval 0 - cannot be contraction head
233 @retval 1 - can be contraction head
234*/
235
237 my_wc_t wc) {
239}
240
241/**
242 Check if a code point can be contraction tail
243
244 @param flags Pointer to UCA contraction flag data
245 @param wc Code point
246
247 @retval 0 - cannot be contraction tail
248 @retval 1 - can be contraction tail
249*/
250
252 my_wc_t wc) {
254}
255
256const uint16_t *my_uca_contraction2_weight(
257 const std::vector<MY_CONTRACTION> *cont_nodes, my_wc_t wc1, my_wc_t wc2);
258#endif
static int flags[50]
Definition: hp_test1.cc:39
A better implementation of the UNIX ctype(3) library.
unsigned long my_wc_t
Our own version of wchar_t, ie., a type that holds a single Unicode code point ("wide character").
Definition: m_ctype.h:56
enum_uca_ver
Definition: str_uca_type.h:42
@ UCA_V520
Definition: str_uca_type.h:42
@ UCA_V400
Definition: str_uca_type.h:42
@ UCA_V900
Definition: str_uca_type.h:42
#define MY_UCA_CNT_TAIL
Whether the given character can be the last in any contraction.
Definition: str_uca_type.h:187
enum_char_grp
Definition: str_uca_type.h:44
@ CHARGRP_NONE
Definition: str_uca_type.h:45
@ CHARGRP_ARAB
Definition: str_uca_type.h:49
@ CHARGRP_LATIN
Definition: str_uca_type.h:47
@ CHARGRP_CYRILLIC
Definition: str_uca_type.h:48
@ CHARGRP_KANA
Definition: str_uca_type.h:50
@ CHARGRP_CORE
Definition: str_uca_type.h:46
@ CHARGRP_OTHERS
Definition: str_uca_type.h:51
const uint16_t * my_uca_contraction2_weight(const std::vector< MY_CONTRACTION > *cont_nodes, my_wc_t wc1, my_wc_t wc2)
Find a contraction consisting of two code points and return its weight array.
Definition: ctype-uca.cc:952
constexpr my_wc_t MY_UCA_CNT_FLAG_MASK
Definition: str_uca_type.h:35
constexpr int MY_UCA_CNT_FLAG_SIZE
Definition: str_uca_type.h:34
#define MY_UCA_MAX_WEIGHT_SIZE
Definition: str_uca_type.h:86
#define UCA_MAX_CHAR_GRP
Definition: str_uca_type.h:41
#define MY_UCA_CNT_HEAD
Whether the given character can be the first in any contraction.
Definition: str_uca_type.h:184
bool my_uca_can_be_contraction_tail(const MY_UCA_INFO::flags_type *flags, my_wc_t wc)
Check if a code point can be contraction tail.
Definition: str_uca_type.h:251
enum_case_first
Definition: str_uca_type.h:71
@ CASE_FIRST_UPPER
Definition: str_uca_type.h:71
@ CASE_FIRST_LOWER
Definition: str_uca_type.h:71
@ CASE_FIRST_OFF
Definition: str_uca_type.h:71
bool my_uca_can_be_contraction_head(const MY_UCA_INFO::flags_type *flags, my_wc_t wc)
Check if a code point can be contraction head.
Definition: str_uca_type.h:236
Definition: str_uca_type.h:73
struct Reorder_param * reorder_param
Definition: str_uca_type.h:74
enum enum_case_first case_first
Definition: str_uca_type.h:77
bool norm_enabled
Definition: str_uca_type.h:75
Definition: str_uca_type.h:112
std::vector< MY_CONTRACTION > child_nodes_context
Definition: str_uca_type.h:116
std::vector< MY_CONTRACTION > child_nodes
Definition: str_uca_type.h:115
uint16_t weight[MY_UCA_MAX_WEIGHT_SIZE]
Definition: str_uca_type.h:119
my_wc_t ch
Definition: str_uca_type.h:113
size_t contraction_len
Definition: str_uca_type.h:121
bool is_contraction_tail
Definition: str_uca_type.h:120
Definition: str_uca_type.h:124
my_wc_t first_non_ignorable
Definition: str_uca_type.h:153
uint16_t extra_ce_pri_base
Definition: str_uca_type.h:178
uint16_t ** weights
Definition: str_uca_type.h:133
std::vector< uint8_t > * m_allocated_weights
Definition: str_uca_type.h:132
my_wc_t last_tertiary_ignorable
Definition: str_uca_type.h:160
enum_uca_ver version
Definition: str_uca_type.h:125
flags_type * contraction_flags
Definition: str_uca_type.h:150
my_wc_t last_secondary_ignorable
Definition: str_uca_type.h:158
uint8_t * lengths
Definition: str_uca_type.h:131
my_wc_t maxchar
Definition: str_uca_type.h:129
my_wc_t last_primary_ignorable
Definition: str_uca_type.h:156
uint16_t extra_ce_sec_base
Definition: str_uca_type.h:179
bool have_contractions
Definition: str_uca_type.h:135
my_wc_t first_variable
Definition: str_uca_type.h:163
MY_UCA_INFO * m_based_on
Definition: str_uca_type.h:126
my_wc_t first_tertiary_ignorable
Definition: str_uca_type.h:159
my_wc_t last_trailing
Definition: str_uca_type.h:162
my_wc_t first_secondary_ignorable
Definition: str_uca_type.h:157
my_wc_t last_non_ignorable
Definition: str_uca_type.h:154
my_wc_t last_variable
Definition: str_uca_type.h:164
my_wc_t first_primary_ignorable
Definition: str_uca_type.h:155
std::array< char, MY_UCA_CNT_FLAG_SIZE > flags_type
Definition: str_uca_type.h:149
uint16_t extra_ce_ter_base
Definition: str_uca_type.h:180
my_wc_t first_trailing
Definition: str_uca_type.h:161
std::vector< MY_CONTRACTION > * contraction_nodes
Definition: str_uca_type.h:136
Definition: str_uca_type.h:64
enum enum_char_grp reorder_grp[UCA_MAX_CHAR_GRP]
Definition: str_uca_type.h:65
int wt_rec_num
Definition: str_uca_type.h:67
uint16_t max_weight
Definition: str_uca_type.h:68
struct Reorder_wt_rec wt_rec[2 *UCA_MAX_CHAR_GRP]
Definition: str_uca_type.h:66
Definition: str_uca_type.h:59
struct Weight_boundary old_wt_bdy
Definition: str_uca_type.h:60
struct Weight_boundary new_wt_bdy
Definition: str_uca_type.h:61
Definition: str_uca_type.h:54
uint16_t begin
Definition: str_uca_type.h:55
uint16_t end
Definition: str_uca_type.h:56