21 #include <drizzled/dtcollation.h>
24 #include <drizzled/internal/my_sys.h>
25 #include <drizzled/error.h>
26 #include <drizzled/function/str/conv_charset.h>
27 #include <drizzled/session.h>
28 #include <drizzled/charset.h>
32 DTCollation::DTCollation()
34 collation= &my_charset_bin;
35 derivation= DERIVATION_NONE;
39 DTCollation::DTCollation(
const charset_info_st *
const collation_arg,
42 collation= collation_arg;
43 derivation= derivation_arg;
47 void DTCollation::set(DTCollation &dt)
49 collation= dt.collation;
50 derivation= dt.derivation;
54 void DTCollation::set(
const charset_info_st *
const collation_arg,
57 collation= collation_arg;
58 derivation= derivation_arg;
62 void DTCollation::set(
const charset_info_st *
const collation_arg)
64 collation= collation_arg;
68 void DTCollation::set(
Derivation derivation_arg)
70 derivation= derivation_arg;
76 if (!my_charset_same(collation, dt.collation))
84 if (collation == &my_charset_bin)
86 if (derivation <= dt.derivation)
93 else if (dt.collation == &my_charset_bin)
95 if (dt.derivation <= derivation)
104 else if ((flags & MY_COLL_ALLOW_SUPERSET_CONV) &&
105 collation->state & MY_CS_UNICODE &&
106 (derivation < dt.derivation ||
107 (derivation == dt.derivation &&
108 !(dt.collation->state & MY_CS_UNICODE))))
112 else if ((flags & MY_COLL_ALLOW_SUPERSET_CONV) &&
113 dt.collation->state & MY_CS_UNICODE &&
114 (dt.derivation < derivation ||
115 (dt.derivation == derivation &&
116 !(collation->state & MY_CS_UNICODE))))
120 else if ((flags & MY_COLL_ALLOW_COERCIBLE_CONV) &&
121 derivation < dt.derivation &&
122 dt.derivation >= DERIVATION_SYSCONST)
126 else if ((flags & MY_COLL_ALLOW_COERCIBLE_CONV) &&
127 dt.derivation < derivation &&
128 derivation >= DERIVATION_SYSCONST)
135 set(0, DERIVATION_NONE);
139 else if (derivation < dt.derivation)
143 else if (dt.derivation < derivation)
149 if (collation == dt.collation)
155 if (derivation == DERIVATION_EXPLICIT)
157 set(0, DERIVATION_NONE);
160 if (collation->state & MY_CS_BINSORT)
162 if (dt.collation->state & MY_CS_BINSORT)
167 const charset_info_st *
const bin= get_charset_by_csname(collation->csname, MY_CS_BINSORT);
168 set(bin, DERIVATION_NONE);
177 { set(dt1);
return aggregate(dt2, flags); }
180 const char *DTCollation::derivation_name()
const
184 case DERIVATION_IGNORABLE:
return "IGNORABLE";
185 case DERIVATION_COERCIBLE:
return "COERCIBLE";
186 case DERIVATION_IMPLICIT:
return "IMPLICIT";
187 case DERIVATION_SYSCONST:
return "SYSCONST";
188 case DERIVATION_EXPLICIT:
return "EXPLICIT";
189 case DERIVATION_NONE:
return "NONE";
190 default:
return "UNKNOWN";
195 bool agg_item_collations(DTCollation &c,
const char *fname,
196 Item **av, uint32_t count,
197 uint32_t flags,
int item_sep)
201 c.set(av[0]->collation);
202 for (i= 1, arg= &av[item_sep]; i < count; i++, arg++)
204 if (c.aggregate((*arg)->collation, flags))
206 my_coll_agg_error(av, count, fname, item_sep);
210 if ((flags & MY_COLL_DISALLOW_NONE) &&
211 c.derivation == DERIVATION_NONE)
213 my_coll_agg_error(av, count, fname, item_sep);
220 bool agg_item_collations_for_comparison(DTCollation &c,
const char *fname,
221 Item **av, uint32_t count,
224 return (agg_item_collations(c, fname, av, count,
225 flags | MY_COLL_DISALLOW_NONE, 1));
229 bool agg_item_charsets(DTCollation &coll,
const char *fname,
230 Item **args, uint32_t nargs, uint32_t flags,
233 if (agg_item_collations(coll, fname, args, nargs, flags, item_sep))
240 void my_coll_agg_error(DTCollation &c1,
241 DTCollation &c2,
const char *fname)
243 my_error(ER_CANT_AGGREGATE_2COLLATIONS,MYF(0),
244 c1.collation->name,c1.derivation_name(),
245 c2.collation->name,c2.derivation_name(),
250 void my_coll_agg_error(DTCollation &c1,
255 my_error(ER_CANT_AGGREGATE_3COLLATIONS,MYF(0),
256 c1.collation->name,c1.derivation_name(),
257 c2.collation->name,c2.derivation_name(),
258 c3.collation->name,c3.derivation_name(),
263 void my_coll_agg_error(Item** args, uint32_t count,
const char *fname,
267 my_coll_agg_error(args[0]->collation, args[item_sep]->collation, fname);
269 my_coll_agg_error(args[0]->collation, args[item_sep]->collation,
270 args[2*item_sep]->collation, fname);
272 my_error(ER_CANT_AGGREGATE_NCOLLATIONS,MYF(0),fname);