summaryrefslogtreecommitdiff
path: root/sql/table.cc
diff options
context:
space:
mode:
Diffstat (limited to 'sql/table.cc')
-rw-r--r--sql/table.cc38
1 files changed, 27 insertions, 11 deletions
diff --git a/sql/table.cc b/sql/table.cc
index 7c5410aed84..d3b4cf3a3c0 100644
--- a/sql/table.cc
+++ b/sql/table.cc
@@ -12,7 +12,7 @@
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */
/* Some general useful functions */
@@ -564,14 +564,14 @@ inline bool is_system_table_name(const char *name, uint length)
SYNOPSIS
open_table_def()
- thd Thread handler
+ thd Thread handler
share Fill this with table definition
- db_flags Bit mask of the following flags: OPEN_VIEW
+ flags Bit mask of the following flags: OPEN_VIEW
NOTES
This function is called when the table definition is not cached in
table definition cache
- The data is returned in 'share', which is alloced by
+ The data is returned in 'share', which is allocated by
alloc_table_share().. The code assumes that share is initialized.
*/
@@ -1129,7 +1129,7 @@ bool parse_vcol_defs(THD *thd, MEM_ROOT *mem_root, TABLE *table,
if (check_constraint_ptr)
*check_constraint_ptr= 0;
- /* Check that expressions aren't refering to not yet initialized fields */
+ /* Check that expressions aren't referring to not yet initialized fields */
for (field_ptr= table->field; *field_ptr; field_ptr++)
{
Field *field= *field_ptr;
@@ -1357,8 +1357,9 @@ int TABLE_SHARE::init_from_binary_frm_image(THD *thd, bool write,
}
if (!share->table_charset)
{
+ const CHARSET_INFO *cs= thd->variables.collation_database;
/* unknown charset in frm_image[38] or pre-3.23 frm */
- if (use_mb(default_charset_info))
+ if (use_mb(cs))
{
/* Warn that we may be changing the size of character columns */
sql_print_warning("'%s' had no or invalid character set, "
@@ -1366,7 +1367,7 @@ int TABLE_SHARE::init_from_binary_frm_image(THD *thd, bool write,
"so character column sizes may have changed",
share->path.str);
}
- share->table_charset= default_charset_info;
+ share->table_charset= cs;
}
share->db_record_offset= 1;
@@ -1839,7 +1840,8 @@ int TABLE_SHARE::init_from_binary_frm_image(THD *thd, bool write,
goto err;
vcol_info= new (&share->mem_root) Virtual_column_info();
vcol_info_length= uint2korr(vcol_screen_pos + 1);
- DBUG_ASSERT(vcol_info_length);
+ if (!vcol_info_length) // Expect non-empty expression
+ goto err;
vcol_info->stored_in_db= vcol_screen_pos[3];
vcol_info->utf8= 0;
vcol_screen_pos+= vcol_info_length + MYSQL57_GCOL_HEADER_SIZE;;
@@ -2614,8 +2616,20 @@ static bool sql_unusable_for_discovery(THD *thd, handlerton *engine,
if (create_info->data_file_name || create_info->index_file_name)
return 1;
// ... engine
- if (create_info->db_type && create_info->db_type != engine)
- return 1;
+ DBUG_ASSERT(lex->m_sql_cmd);
+ if (lex->create_info.used_fields & HA_CREATE_USED_ENGINE)
+ {
+ /*
+ TODO: we could just compare engine names here, without resolving.
+ But this optimization is too late for 10.1.
+ */
+ Storage_engine_name *opt= lex->m_sql_cmd->option_storage_engine_name();
+ DBUG_ASSERT(opt); // lex->m_sql_cmd must be an Sql_cmd_create_table instance
+ if (opt->resolve_storage_engine_with_error(thd, &create_info->db_type,
+ false) ||
+ (create_info->db_type && create_info->db_type != engine))
+ return 1;
+ }
return 0;
}
@@ -5988,7 +6002,8 @@ const char *Field_iterator_table_ref::get_table_name()
return natural_join_it.column_ref()->table_name();
DBUG_ASSERT(!strcmp(table_ref->table_name,
- table_ref->table->s->table_name.str));
+ table_ref->table->s->table_name.str) ||
+ table_ref->schema_table);
return table_ref->table_name;
}
@@ -7667,6 +7682,7 @@ int TABLE::update_virtual_fields(handler *h, enum_vcol_update_mode update_mode)
int TABLE::update_virtual_field(Field *vf)
{
+ DBUG_ASSERT(!in_use->is_error());
Query_arena backup_arena;
DBUG_ENTER("TABLE::update_virtual_field");
in_use->set_n_backup_active_arena(expr_arena, &backup_arena);