My Project
Public Member Functions | Public Attributes
DTCollation Class Reference

List of all members.

Public Member Functions

void set_repertoire_from_charset (const CHARSET_INFO *cs)
 DTCollation (const CHARSET_INFO *collation_arg, Derivation derivation_arg)
void set (DTCollation &dt)
void set (const CHARSET_INFO *collation_arg, Derivation derivation_arg)
void set (const CHARSET_INFO *collation_arg, Derivation derivation_arg, uint repertoire_arg)
void set_numeric ()
void set (const CHARSET_INFO *collation_arg)
void set (Derivation derivation_arg)
void set_repertoire (uint repertoire_arg)
bool aggregate (DTCollation &dt, uint flags=0)
bool set (DTCollation &dt1, DTCollation &dt2, uint flags=0)
const char * derivation_name () const

Public Attributes

const CHARSET_INFO * collation
enum Derivation derivation
uint repertoire

Member Function Documentation

bool DTCollation::aggregate ( DTCollation dt,
uint  flags = 0 
)

Aggregate two collations together taking into account their coercibility (aka derivation):.

0 == DERIVATION_EXPLICIT - an explicitly written COLLATE clause
1 == DERIVATION_NONE - a mix of two different collations
2 == DERIVATION_IMPLICIT - a column
3 == DERIVATION_COERCIBLE - a string constant.

The most important rules are:

  1. If collations are the same: chose this collation, and the strongest derivation.
  2. If collations are different:
  • Character sets may differ, but only if conversion without data loss is possible. The caller provides flags whether character set conversion attempts should be done. If no flags are substituted, then the character sets must be the same. Currently processed flags are: MY_COLL_ALLOW_SUPERSET_CONV - allow conversion to a superset MY_COLL_ALLOW_COERCIBLE_CONV - allow conversion of a coercible value
  • two EXPLICIT collations produce an error, e.g. this is wrong: CONCAT(expr1 collate latin1_swedish_ci, expr2 collate latin1_german_ci)
  • the side with smaller derivation value wins, i.e. a column is stronger than a string constant, an explicit COLLATE clause is stronger than a column.
  • if derivations are the same, we have DERIVATION_NONE, we'll wait for an explicit COLLATE clause which possibly can come from another argument later: for example, this is valid, but we don't know yet when collecting the first two arguments:
           CONCAT(latin1_swedish_ci_column,
                  latin1_german1_ci_column,
                  expr COLLATE latin1_german2_ci)
    

The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines