summaryrefslogtreecommitdiffstats
path: root/sql/lex_charset.h
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--sql/lex_charset.h90
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);
};