diff options
Diffstat (limited to '')
-rw-r--r-- | sql/lex_charset.h | 90 |
1 files changed, 69 insertions, 21 deletions
diff --git a/sql/lex_charset.h b/sql/lex_charset.h index 2bbeff8a..43854c37 100644 --- a/sql/lex_charset.h +++ b/sql/lex_charset.h @@ -16,6 +16,7 @@ #ifndef LEX_CHARSET_INCLUDED #define LEX_CHARSET_INCLUDED +#include "charset_collations.h" /* An extention for Charset_loader_mysys, @@ -296,7 +297,9 @@ public: bool set_by_name(const char *name, myf my_flags); // e.g. MY_UTF8_IS_UTF8MB3 bool raise_if_conflicts_with_context_collation(const Lex_context_collation &) const; - bool merge_exact_charset(const Lex_exact_charset &rhs); + bool merge_exact_charset(Sql_used *used, + const Charset_collation_map_st &map, + const Lex_exact_charset &rhs); bool merge_exact_collation(const Lex_exact_collation &rhs); bool merge(const Lex_extended_collation_st &rhs); }; @@ -347,7 +350,10 @@ public: } bool with_collate() const { return m_with_collate; } CHARSET_INFO *find_bin_collation() const; - CHARSET_INFO *find_default_collation() const; + CHARSET_INFO *find_compiled_default_collation() const; + CHARSET_INFO *find_mapped_default_collation( + Sql_used *used, + const Charset_collation_map_st &map) const; bool raise_if_charsets_differ(const Lex_exact_charset &cs) const; bool raise_if_not_applicable(const Lex_exact_collation &cl) const; /* @@ -355,18 +361,23 @@ public: So the full syntax looks like: CHARACTER SET cs [COLLATE cl] ... COLLATE cl2 */ - bool merge_collation(const Lex_extended_collation_st &cl) + bool merge_collation(Sql_used *used, + const Charset_collation_map_st &map, + const Lex_extended_collation_st &cl) { switch (cl.type()) { case Lex_extended_collation_st::TYPE_EXACT: return merge_exact_collation(Lex_exact_collation(cl.charset_info())); case Lex_extended_collation_st::TYPE_CONTEXTUALLY_TYPED: - return merge_context_collation(Lex_context_collation(cl.charset_info())); + return merge_context_collation(used, map, + Lex_context_collation(cl.charset_info())); } DBUG_ASSERT(0); return false; } - bool merge_collation_override(const Lex_extended_collation_st &cl) + bool merge_collation_override(Sql_used *used, + const Charset_collation_map_st &map, + const Lex_extended_collation_st &cl) { switch (cl.type()) { case Lex_extended_collation_st::TYPE_EXACT: @@ -374,7 +385,7 @@ public: Lex_exact_collation(cl.charset_info())); case Lex_extended_collation_st::TYPE_CONTEXTUALLY_TYPED: return merge_context_collation_override( - Lex_context_collation(cl.charset_info())); + used, map, Lex_context_collation(cl.charset_info())); } DBUG_ASSERT(0); return false; @@ -383,8 +394,12 @@ public: Add a context collation: CHARACTER SET cs [COLLATE cl] ... COLLATE DEFAULT */ - bool merge_context_collation(const Lex_context_collation &cl); - bool merge_context_collation_override(const Lex_context_collation &cl); + bool merge_context_collation(Sql_used *used, + const Charset_collation_map_st &map, + const Lex_context_collation &cl); + bool merge_context_collation_override(Sql_used *used, + const Charset_collation_map_st &map, + const Lex_context_collation &cl); /* Add an exact collation: CHARACTER SET cs [COLLATE cl] ... COLLATE latin1_bin @@ -399,7 +414,7 @@ public: { if ((m_ci->state & MY_CS_PRIMARY)) return Lex_exact_charset(m_ci); - return Lex_exact_charset(find_default_collation()); + return Lex_exact_charset(find_compiled_default_collation()); } }; @@ -507,11 +522,13 @@ public: m_ci= cs.charset_info(); m_type= TYPE_CHARACTER_SET; } - bool set_charset_collate_default(const Lex_exact_charset &cs) + bool set_charset_collate_default(Sql_used *used, + const Charset_collation_map_st &map, + const Lex_exact_charset &cs) { CHARSET_INFO *ci; if (!(ci= Lex_exact_charset_opt_extended_collate(cs). - find_default_collation())) + find_mapped_default_collation(used, map))) return true; m_ci= ci; m_type= TYPE_CHARACTER_SET_COLLATE_EXACT; @@ -544,6 +561,21 @@ public: { return m_ci; } + CHARSET_INFO *charset_info(Sql_used *used, + const Charset_collation_map_st &map) const + { + switch (m_type) + { + case TYPE_CHARACTER_SET: + return map.get_collation_for_charset(used, m_ci); + case TYPE_EMPTY: + case TYPE_CHARACTER_SET_COLLATE_EXACT: + case TYPE_COLLATE_CONTEXTUALLY_TYPED: + case TYPE_COLLATE_EXACT: + break; + } + return m_ci; + } Type type() const { return m_type; @@ -552,7 +584,9 @@ public: { return m_type == TYPE_COLLATE_CONTEXTUALLY_TYPED; } - CHARSET_INFO *resolved_to_character_set(CHARSET_INFO *cs) const; + CHARSET_INFO *resolved_to_character_set(Sql_used *used, + const Charset_collation_map_st &map, + CHARSET_INFO *cs) const; /* Merge the column CHARACTER SET clause to: - an exact collation name @@ -561,15 +595,17 @@ public: "cl" corresponds to the COLLATE clause */ bool merge_column_charset_clause_and_collate_clause( + Sql_used *used, + const Charset_collation_map_st &map, const Lex_exact_charset_extended_collation_attrs_st &cl) { switch (cl.type()) { case TYPE_EMPTY: return false; case TYPE_COLLATE_EXACT: - return merge_exact_collation(Lex_exact_collation(cl.charset_info())); + return merge_exact_collation(Lex_exact_collation(cl.m_ci)); case TYPE_COLLATE_CONTEXTUALLY_TYPED: - return merge_context_collation(Lex_context_collation(cl.charset_info())); + return merge_context_collation(used, map, Lex_context_collation(cl.m_ci)); case TYPE_CHARACTER_SET: case TYPE_CHARACTER_SET_COLLATE_EXACT: break; @@ -584,6 +620,8 @@ public: in an independent COLLATE clause in a column attribute. */ bool merge_column_collate_clause_and_collate_clause( + Sql_used *used, + const Charset_collation_map_st &map, const Lex_exact_charset_extended_collation_attrs_st &cl) { DBUG_ASSERT(m_type != TYPE_CHARACTER_SET); @@ -591,9 +629,9 @@ public: case TYPE_EMPTY: return false; case TYPE_COLLATE_EXACT: - return merge_exact_collation(Lex_exact_collation(cl.charset_info())); + return merge_exact_collation(Lex_exact_collation(cl.m_ci)); case TYPE_COLLATE_CONTEXTUALLY_TYPED: - return merge_context_collation(Lex_context_collation(cl.charset_info())); + return merge_context_collation(used, map, Lex_context_collation(cl.m_ci)); case TYPE_CHARACTER_SET: case TYPE_CHARACTER_SET_COLLATE_EXACT: break; @@ -601,10 +639,16 @@ public: DBUG_ASSERT(0); return false; } - bool merge_exact_charset(const Lex_exact_charset &cs); + bool merge_exact_charset(Sql_used *used, + const Charset_collation_map_st &map, + const Lex_exact_charset &cs); bool merge_exact_collation(const Lex_exact_collation &cl); - bool merge_context_collation(const Lex_context_collation &cl); - bool merge_collation(const Lex_extended_collation_st &cl); + bool merge_context_collation(Sql_used *used, + const Charset_collation_map_st &map, + const Lex_context_collation &cl); + bool merge_collation(Sql_used *used, + const Charset_collation_map_st &map, + const Lex_extended_collation_st &cl); }; @@ -713,9 +757,13 @@ public: } bool raise_if_charset_conflicts_with_default( const Lex_exact_charset_opt_extended_collate &def) const; - CHARSET_INFO *resolved_to_context(const Charset_collation_context &ctx) const; + CHARSET_INFO *resolved_to_context(Sql_used *used, + const Charset_collation_map_st &map, + const Charset_collation_context &ctx) const; bool merge_charset_default(); - bool merge_exact_charset(const Lex_exact_charset &cs); + bool merge_exact_charset(Sql_used *used, + const Charset_collation_map_st &map, + const Lex_exact_charset &cs); }; |