summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2019-03-06 15:15:59 +0200
committerMarko Mäkelä <marko.makela@mariadb.com>2019-03-06 15:15:59 +0200
commitc155946c90307ba448af8b4b5161f35b8af9d31d (patch)
tree426b59a490b7ec839a9465b5730ba57d0defc8f8
parent90f09ba8c249e23e015ce9d1d56463869f1a5358 (diff)
parent26f0d72a3f9b92574b16fc0348f79f16ed8021d0 (diff)
downloadmariadb-git-c155946c90307ba448af8b4b5161f35b8af9d31d.tar.gz
Merge 10.1 into 10.2
-rw-r--r--extra/mariabackup/backup_copy.cc6
-rw-r--r--extra/mariabackup/encryption_plugin.cc8
-rw-r--r--extra/mariabackup/fil_cur.cc6
-rw-r--r--extra/mariabackup/xtrabackup.cc9
-rw-r--r--mysql-test/suite/innodb_fts/r/fulltext3.result9
-rw-r--r--mysql-test/suite/innodb_fts/t/fulltext3.test9
-rw-r--r--sql/sql_parse.cc5
-rw-r--r--storage/innobase/dict/dict0dict.cc24
-rw-r--r--storage/innobase/fts/fts0fts.cc9
-rw-r--r--storage/innobase/fts/fts0opt.cc19
-rw-r--r--storage/innobase/include/dict0crea.ic10
-rw-r--r--storage/innobase/row/row0ftsort.cc17
-rw-r--r--storage/innobase/row/row0mysql.cc8
-rw-r--r--storage/innobase/srv/srv0start.cc2
-rw-r--r--storage/xtradb/dict/dict0dict.cc26
-rw-r--r--storage/xtradb/fts/fts0fts.cc13
-rw-r--r--storage/xtradb/fts/fts0opt.cc19
-rw-r--r--storage/xtradb/include/dict0crea.ic10
-rw-r--r--storage/xtradb/include/log0online.h3
-rw-r--r--storage/xtradb/log/log0online.cc7
-rw-r--r--storage/xtradb/row/row0ftsort.cc17
-rw-r--r--storage/xtradb/row/row0mysql.cc8
-rw-r--r--storage/xtradb/srv/srv0start.cc7
23 files changed, 144 insertions, 107 deletions
diff --git a/extra/mariabackup/backup_copy.cc b/extra/mariabackup/backup_copy.cc
index 0059ae5b16a..be99d49a86f 100644
--- a/extra/mariabackup/backup_copy.cc
+++ b/extra/mariabackup/backup_copy.cc
@@ -513,7 +513,8 @@ datafile_open(const char *file, datafile_cur_t *cursor, uint thread_n)
5.6+. We want to make "local" copies for the backup. */
strncpy(cursor->rel_path,
xb_get_relative_path(cursor->abs_path, FALSE),
- sizeof(cursor->rel_path));
+ (sizeof cursor->rel_path) - 1);
+ cursor->rel_path[(sizeof cursor->rel_path) - 1] = '\0';
cursor->file = os_file_create_simple_no_error_handling(
0, cursor->abs_path,
@@ -646,8 +647,7 @@ mkdirp(const char *pathname, int Flags, myf MyFlags)
/* make a parent directory path */
if (!(parent= (char *)malloc(len)))
return(-1);
- strncpy(parent, pathname, len);
- parent[len-1]= 0;
+ memcpy(parent, pathname, len);
for (p = parent + strlen(parent);
!is_path_separator(*p) && p != parent; p--) ;
diff --git a/extra/mariabackup/encryption_plugin.cc b/extra/mariabackup/encryption_plugin.cc
index be530d63ee2..8f1978e967a 100644
--- a/extra/mariabackup/encryption_plugin.cc
+++ b/extra/mariabackup/encryption_plugin.cc
@@ -107,7 +107,8 @@ void encryption_plugin_backup_init(MYSQL *mysql)
/* Required to load the plugin later.*/
add_to_plugin_load_list(plugin_load.c_str());
- strncpy(opt_plugin_dir, dir, FN_REFLEN);
+ strncpy(opt_plugin_dir, dir, FN_REFLEN - 1);
+ opt_plugin_dir[FN_REFLEN - 1] = '\0';
oss << "plugin_dir=" << '"' << dir << '"' << std::endl;
@@ -177,7 +178,10 @@ void encryption_plugin_prepare_init(int argc, char **argv)
add_to_plugin_load_list(plugin_load.c_str());
if (xb_plugin_dir)
- strncpy(opt_plugin_dir, xb_plugin_dir, FN_REFLEN);
+ {
+ strncpy(opt_plugin_dir, xb_plugin_dir, FN_REFLEN - 1);
+ opt_plugin_dir[FN_REFLEN - 1] = '\0';
+ }
char **new_argv = new char *[argc + 1];
new_argv[0] = XTRABACKUP_EXE;
diff --git a/extra/mariabackup/fil_cur.cc b/extra/mariabackup/fil_cur.cc
index fa9dcb29317..fd5e1bc02dd 100644
--- a/extra/mariabackup/fil_cur.cc
+++ b/extra/mariabackup/fil_cur.cc
@@ -148,7 +148,8 @@ xb_fil_cur_open(
cursor->space_id = node->space->id;
- strncpy(cursor->abs_path, node->name, sizeof(cursor->abs_path));
+ strncpy(cursor->abs_path, node->name, (sizeof cursor->abs_path) - 1);
+ cursor->abs_path[(sizeof cursor->abs_path) - 1] = '\0';
/* Get the relative path for the destination tablespace name, i.e. the
one that can be appended to the backup root directory. Non-system
@@ -156,7 +157,8 @@ xb_fil_cur_open(
We want to make "local" copies for the backup. */
strncpy(cursor->rel_path,
xb_get_relative_path(cursor->abs_path, cursor->is_system()),
- sizeof(cursor->rel_path));
+ (sizeof cursor->rel_path) - 1);
+ cursor->rel_path[(sizeof cursor->rel_path) - 1] = '\0';
/* In the backup mode we should already have a tablespace handle created
by fil_ibd_load() unless it is a system
diff --git a/extra/mariabackup/xtrabackup.cc b/extra/mariabackup/xtrabackup.cc
index 96537e3de42..5737fcfca64 100644
--- a/extra/mariabackup/xtrabackup.cc
+++ b/extra/mariabackup/xtrabackup.cc
@@ -2408,8 +2408,9 @@ check_if_skip_table(
return(FALSE);
}
- strncpy(buf, dbname, FN_REFLEN);
- buf[tbname - 1 - dbname] = 0;
+ strncpy(buf, dbname, FN_REFLEN - 1);
+ buf[FN_REFLEN - 1] = '\0';
+ buf[tbname - 1 - dbname] = '\0';
const skip_database_check_result skip_database =
check_if_skip_database(buf);
@@ -2417,7 +2418,6 @@ check_if_skip_table(
return (TRUE);
}
- buf[FN_REFLEN - 1] = '\0';
buf[tbname - 1 - dbname] = '.';
/* Check if there's a suffix in the table name. If so, truncate it. We
@@ -4888,7 +4888,8 @@ xtrabackup_apply_delta(
}
dst_path[strlen(dst_path) - 6] = '\0';
- strncpy(space_name, filename, FN_REFLEN);
+ strncpy(space_name, filename, FN_REFLEN - 1);
+ space_name[FN_REFLEN - 1] = '\0';
space_name[strlen(space_name) - 6] = 0;
if (!get_meta_path(src_path, meta_path)) {
diff --git a/mysql-test/suite/innodb_fts/r/fulltext3.result b/mysql-test/suite/innodb_fts/r/fulltext3.result
index 98fd91a072c..8d89cb74bfd 100644
--- a/mysql-test/suite/innodb_fts/r/fulltext3.result
+++ b/mysql-test/suite/innodb_fts/r/fulltext3.result
@@ -7,3 +7,12 @@ DROP TABLE t1;
CREATE TABLE t1(a VARCHAR(2) CHARACTER SET big5 COLLATE big5_chinese_ci,
FULLTEXT(a)) ENGINE=<default_engine>;
DROP TABLE t1;
+CREATE TABLE t1 (a SERIAL, t TEXT, FULLTEXT f1(t), FULLTEXT f2(t)) ENGINE=InnoDB;
+Warnings:
+Note 1831 Duplicate index `f2`. This is deprecated and will be disallowed in a future release
+INSERT INTO t1 (a,t) VALUES (1,'1'),(2,'1');
+ALTER TABLE t1 ADD COLUMN g TEXT GENERATED ALWAYS AS (t) VIRTUAL;
+DELETE FROM t1 WHERE a = 1;
+ALTER TABLE t1 DROP INDEX f1;
+INSERT INTO t1 (a,t) VALUES (1,'1');
+DROP TABLE t1;
diff --git a/mysql-test/suite/innodb_fts/t/fulltext3.test b/mysql-test/suite/innodb_fts/t/fulltext3.test
index 11e6e1af734..9c7941d7b5c 100644
--- a/mysql-test/suite/innodb_fts/t/fulltext3.test
+++ b/mysql-test/suite/innodb_fts/t/fulltext3.test
@@ -35,3 +35,12 @@ FULLTEXT(a)) ENGINE=$default_engine;
DROP TABLE t1;
# End of 5.1 tests
+
+
+CREATE TABLE t1 (a SERIAL, t TEXT, FULLTEXT f1(t), FULLTEXT f2(t)) ENGINE=InnoDB;
+INSERT INTO t1 (a,t) VALUES (1,'1'),(2,'1');
+ALTER TABLE t1 ADD COLUMN g TEXT GENERATED ALWAYS AS (t) VIRTUAL;
+DELETE FROM t1 WHERE a = 1;
+ALTER TABLE t1 DROP INDEX f1;
+INSERT INTO t1 (a,t) VALUES (1,'1');
+DROP TABLE t1;
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index 507b1ffdc2b..1d5de9dc276 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -2420,6 +2420,11 @@ com_multi_end:
thd->packet.shrink(thd->variables.net_buffer_length); // Reclaim some memory
}
thd->reset_kill_query(); /* Ensure that killed_errmsg is released */
+ /*
+ LEX::m_sql_cmd can point to Sql_cmd allocated on thd->mem_root.
+ Unlink it now, before freeing the root.
+ */
+ thd->lex->m_sql_cmd= NULL;
free_root(thd->mem_root,MYF(MY_KEEP_PREALLOC));
#if defined(ENABLED_PROFILING)
diff --git a/storage/innobase/dict/dict0dict.cc b/storage/innobase/dict/dict0dict.cc
index 73ca11247ce..628038ff8fe 100644
--- a/storage/innobase/dict/dict0dict.cc
+++ b/storage/innobase/dict/dict0dict.cc
@@ -1598,13 +1598,8 @@ dict_table_rename_in_cache(
ut_ad(mutex_own(&dict_sys->mutex));
/* store the old/current name to an automatic variable */
- if (strlen(table->name.m_name) + 1 <= sizeof(old_name)) {
- strcpy(old_name, table->name.m_name);
- } else {
- ib::fatal() << "Too long table name: "
- << table->name
- << ", max length is " << MAX_FULL_NAME_LEN;
- }
+ ut_a(strlen(table->name.m_name) < sizeof old_name);
+ strcpy(old_name, table->name.m_name);
fold = ut_fold_string(new_name);
@@ -1815,7 +1810,7 @@ dict_table_rename_in_cache(
ulint db_len;
char* old_id;
- char old_name_cs_filename[MAX_TABLE_NAME_LEN+20];
+ char old_name_cs_filename[MAX_FULL_NAME_LEN+1];
uint errors = 0;
/* All table names are internally stored in charset
@@ -1832,7 +1827,8 @@ dict_table_rename_in_cache(
in old_name_cs_filename */
strncpy(old_name_cs_filename, old_name,
- MAX_TABLE_NAME_LEN);
+ MAX_FULL_NAME_LEN);
+ old_name_cs_filename[MAX_FULL_NAME_LEN] = '\0';
if (strstr(old_name, TEMP_TABLE_PATH_PREFIX) == NULL) {
innobase_convert_to_system_charset(
@@ -1854,7 +1850,9 @@ dict_table_rename_in_cache(
/* Old name already in
my_charset_filename */
strncpy(old_name_cs_filename, old_name,
- MAX_TABLE_NAME_LEN);
+ MAX_FULL_NAME_LEN);
+ old_name_cs_filename[MAX_FULL_NAME_LEN]
+ = '\0';
}
}
@@ -1880,7 +1878,7 @@ dict_table_rename_in_cache(
/* This is a generated >= 4.0.18 format id */
- char table_name[MAX_TABLE_NAME_LEN] = "";
+ char table_name[MAX_TABLE_NAME_LEN + 1];
uint errors = 0;
if (strlen(table->name.m_name)
@@ -1895,6 +1893,7 @@ dict_table_rename_in_cache(
/* Convert the table name to UTF-8 */
strncpy(table_name, table->name.m_name,
MAX_TABLE_NAME_LEN);
+ table_name[MAX_TABLE_NAME_LEN] = '\0';
innobase_convert_to_system_charset(
strchr(table_name, '/') + 1,
strchr(table->name.m_name, '/') + 1,
@@ -1904,9 +1903,10 @@ dict_table_rename_in_cache(
/* Table name could not be converted
from charset my_charset_filename to
UTF-8. This means that the table name
- is already in UTF-8 (#mysql#50). */
+ is already in UTF-8 (#mysql50#). */
strncpy(table_name, table->name.m_name,
MAX_TABLE_NAME_LEN);
+ table_name[MAX_TABLE_NAME_LEN] = '\0';
}
/* Replace the prefix 'databasename/tablename'
diff --git a/storage/innobase/fts/fts0fts.cc b/storage/innobase/fts/fts0fts.cc
index c0a38d2f2a4..206aa7231c1 100644
--- a/storage/innobase/fts/fts0fts.cc
+++ b/storage/innobase/fts/fts0fts.cc
@@ -1,7 +1,7 @@
/*****************************************************************************
Copyright (c) 2011, 2018, Oracle and/or its affiliates. All Rights Reserved.
-Copyright (c) 2016, 2018, MariaDB Corporation.
+Copyright (c) 2016, 2019, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
@@ -727,6 +727,7 @@ fts_reset_get_doc(
memset(get_doc, 0x0, sizeof(*get_doc));
get_doc->index_cache = ind_cache;
+ get_doc->cache = cache;
}
ut_ad(ib_vector_size(cache->get_docs)
@@ -4805,12 +4806,12 @@ fts_tokenize_document(
ut_a(!doc->tokens);
ut_a(doc->charset);
- doc->tokens = rbt_create_arg_cmp(
- sizeof(fts_token_t), innobase_fts_text_cmp, (void*) doc->charset);
+ doc->tokens = rbt_create_arg_cmp(sizeof(fts_token_t),
+ innobase_fts_text_cmp,
+ (void*) doc->charset);
if (parser != NULL) {
fts_tokenize_param_t fts_param;
-
fts_param.result_doc = (result != NULL) ? result : doc;
fts_param.add_pos = 0;
diff --git a/storage/innobase/fts/fts0opt.cc b/storage/innobase/fts/fts0opt.cc
index 91d59e01e57..22efd3e27b0 100644
--- a/storage/innobase/fts/fts0opt.cc
+++ b/storage/innobase/fts/fts0opt.cc
@@ -1,7 +1,7 @@
/*****************************************************************************
Copyright (c) 2007, 2018, Oracle and/or its affiliates. All Rights Reserved.
-Copyright (c) 2016, 2018, MariaDB Corporation.
+Copyright (c) 2016, 2019, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
@@ -674,18 +674,17 @@ fts_fetch_index_words(
fts_zip_t* zip = static_cast<fts_zip_t*>(user_arg);
que_node_t* exp = sel_node->select_list;
dfield_t* dfield = que_node_get_val(exp);
- short len = static_cast<short>(dfield_get_len(dfield));
+
+ ut_a(dfield_get_len(dfield) <= FTS_MAX_WORD_LEN);
+
+ uint16 len = uint16(dfield_get_len(dfield));
void* data = dfield_get_data(dfield);
/* Skip the duplicate words. */
- if (zip->word.f_len == static_cast<ulint>(len)
- && !memcmp(zip->word.f_str, data, len)) {
-
+ if (zip->word.f_len == len && !memcmp(zip->word.f_str, data, len)) {
return(TRUE);
}
- ut_a(len <= FTS_MAX_WORD_LEN);
-
memcpy(zip->word.f_str, data, len);
zip->word.f_len = len;
@@ -693,6 +692,9 @@ fts_fetch_index_words(
ut_a(zip->zp->next_in == NULL);
/* The string is prefixed by len. */
+ /* FIXME: This is not byte order agnostic (InnoDB data files
+ with FULLTEXT INDEX are not portable between little-endian and
+ big-endian systems!) */
zip->zp->next_in = reinterpret_cast<byte*>(&len);
zip->zp->avail_in = sizeof(len);
@@ -720,14 +722,13 @@ fts_fetch_index_words(
ut_a(len <= FTS_MAX_WORD_LEN);
len = 0;
}
- break;
+ continue;
case Z_STREAM_END:
case Z_BUF_ERROR:
case Z_STREAM_ERROR:
default:
ut_error;
- break;
}
}
diff --git a/storage/innobase/include/dict0crea.ic b/storage/innobase/include/dict0crea.ic
index 565e4ed1a8c..00e4e54115a 100644
--- a/storage/innobase/include/dict0crea.ic
+++ b/storage/innobase/include/dict0crea.ic
@@ -1,6 +1,7 @@
/*****************************************************************************
Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved.
+Copyright (c) 2019, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
@@ -68,11 +69,11 @@ dict_create_add_foreign_id(
sprintf(id, "%s_ibfk_%lu", name,
(ulong) (*id_nr)++);
} else {
- char table_name[MAX_TABLE_NAME_LEN + 20] = "";
+ char table_name[MAX_TABLE_NAME_LEN + 21];
uint errors = 0;
- strncpy(table_name, name,
- MAX_TABLE_NAME_LEN + 20);
+ strncpy(table_name, name, (sizeof table_name) - 1);
+ table_name[(sizeof table_name) - 1] = '\0';
innobase_convert_to_system_charset(
strchr(table_name, '/') + 1,
@@ -81,7 +82,8 @@ dict_create_add_foreign_id(
if (errors) {
strncpy(table_name, name,
- MAX_TABLE_NAME_LEN + 20);
+ (sizeof table_name) - 1);
+ table_name[(sizeof table_name) - 1] = '\0';
}
/* no overflow if number < 1e13 */
diff --git a/storage/innobase/row/row0ftsort.cc b/storage/innobase/row/row0ftsort.cc
index 4472df55c65..c4be5ad69b3 100644
--- a/storage/innobase/row/row0ftsort.cc
+++ b/storage/innobase/row/row0ftsort.cc
@@ -98,8 +98,8 @@ row_merge_create_fts_sort_index(
field = dict_index_get_nth_field(new_index, 0);
field->name = NULL;
field->prefix_len = 0;
- field->col = static_cast<dict_col_t*>(
- mem_heap_alloc(new_index->heap, sizeof(dict_col_t)));
+ field->col = new(mem_heap_zalloc(new_index->heap, sizeof(dict_col_t)))
+ dict_col_t();
field->col->prtype = idx_field->col->prtype | DATA_NOT_NULL;
field->col->mtype = charset == &my_charset_latin1
? DATA_VARCHAR : DATA_VARMYSQL;
@@ -113,8 +113,8 @@ row_merge_create_fts_sort_index(
field = dict_index_get_nth_field(new_index, 1);
field->name = NULL;
field->prefix_len = 0;
- field->col = static_cast<dict_col_t*>(
- mem_heap_alloc(new_index->heap, sizeof(dict_col_t)));
+ field->col = new(mem_heap_zalloc(new_index->heap, sizeof(dict_col_t)))
+ dict_col_t();
field->col->mtype = DATA_INT;
*opt_doc_id_size = FALSE;
@@ -148,21 +148,16 @@ row_merge_create_fts_sort_index(
field->col->prtype = DATA_NOT_NULL | DATA_BINARY_TYPE;
- field->col->mbminlen = 0;
- field->col->mbmaxlen = 0;
-
/* The third field is on the word's position in the original doc */
field = dict_index_get_nth_field(new_index, 2);
field->name = NULL;
field->prefix_len = 0;
- field->col = static_cast<dict_col_t*>(
- mem_heap_alloc(new_index->heap, sizeof(dict_col_t)));
+ field->col = new(mem_heap_zalloc(new_index->heap, sizeof(dict_col_t)))
+ dict_col_t();
field->col->mtype = DATA_INT;
field->col->len = 4 ;
field->fixed_len = 4;
field->col->prtype = DATA_NOT_NULL;
- field->col->mbminlen = 0;
- field->col->mbmaxlen = 0;
return(new_index);
}
diff --git a/storage/innobase/row/row0mysql.cc b/storage/innobase/row/row0mysql.cc
index 1e2c22c1c2f..4d1a05d516a 100644
--- a/storage/innobase/row/row0mysql.cc
+++ b/storage/innobase/row/row0mysql.cc
@@ -4345,11 +4345,12 @@ row_rename_table_for_mysql(
if (!new_is_tmp) {
/* Rename all constraints. */
- char new_table_name[MAX_TABLE_NAME_LEN] = "";
- char old_table_utf8[MAX_TABLE_NAME_LEN] = "";
+ char new_table_name[MAX_TABLE_NAME_LEN + 1];
+ char old_table_utf8[MAX_TABLE_NAME_LEN + 1];
uint errors = 0;
strncpy(old_table_utf8, old_name, MAX_TABLE_NAME_LEN);
+ old_table_utf8[MAX_TABLE_NAME_LEN] = '\0';
innobase_convert_to_system_charset(
strchr(old_table_utf8, '/') + 1,
strchr(old_name, '/') +1,
@@ -4360,6 +4361,7 @@ row_rename_table_for_mysql(
my_charset_filename to UTF-8. This means that the
table name is already in UTF-8 (#mysql#50). */
strncpy(old_table_utf8, old_name, MAX_TABLE_NAME_LEN);
+ old_table_utf8[MAX_TABLE_NAME_LEN] = '\0';
}
info = pars_info_create();
@@ -4370,6 +4372,7 @@ row_rename_table_for_mysql(
old_table_utf8);
strncpy(new_table_name, new_name, MAX_TABLE_NAME_LEN);
+ new_table_name[MAX_TABLE_NAME_LEN] = '\0';
innobase_convert_to_system_charset(
strchr(new_table_name, '/') + 1,
strchr(new_name, '/') +1,
@@ -4380,6 +4383,7 @@ row_rename_table_for_mysql(
my_charset_filename to UTF-8. This means that the
table name is already in UTF-8 (#mysql#50). */
strncpy(new_table_name, new_name, MAX_TABLE_NAME_LEN);
+ new_table_name[MAX_TABLE_NAME_LEN] = '\0';
}
pars_info_add_str_literal(info, "new_table_utf8", new_table_name);
diff --git a/storage/innobase/srv/srv0start.cc b/storage/innobase/srv/srv0start.cc
index e2b3d24c044..b12e6a6fb18 100644
--- a/storage/innobase/srv/srv0start.cc
+++ b/storage/innobase/srv/srv0start.cc
@@ -3,7 +3,7 @@
Copyright (c) 1996, 2017, Oracle and/or its affiliates. All rights reserved.
Copyright (c) 2008, Google Inc.
Copyright (c) 2009, Percona Inc.
-Copyright (c) 2013, 2018, MariaDB Corporation.
+Copyright (c) 2013, 2019, MariaDB Corporation.
Portions of this file contain modifications contributed and copyrighted by
Google, Inc. Those modifications are gratefully acknowledged and are described
diff --git a/storage/xtradb/dict/dict0dict.cc b/storage/xtradb/dict/dict0dict.cc
index 1c489d13f1a..4c5117f987e 100644
--- a/storage/xtradb/dict/dict0dict.cc
+++ b/storage/xtradb/dict/dict0dict.cc
@@ -1632,15 +1632,8 @@ dict_table_rename_in_cache(
ut_ad(mutex_own(&(dict_sys->mutex)));
/* store the old/current name to an automatic variable */
- if (strlen(table->name) + 1 <= sizeof(old_name)) {
- memcpy(old_name, table->name, strlen(table->name) + 1);
- } else {
- ut_print_timestamp(stderr);
- fprintf(stderr, "InnoDB: too long table name: '%s', "
- "max length is %d\n", table->name,
- MAX_FULL_NAME_LEN);
- ut_error;
- }
+ ut_a(strlen(table->name) < sizeof old_name);
+ strcpy(old_name, table->name);
fold = ut_fold_string(new_name);
@@ -1851,7 +1844,7 @@ dict_table_rename_in_cache(
ulint db_len;
char* old_id;
- char old_name_cs_filename[MAX_TABLE_NAME_LEN+20];
+ char old_name_cs_filename[MAX_FULL_NAME_LEN+1];
uint errors = 0;
/* All table names are internally stored in charset
@@ -1868,7 +1861,8 @@ dict_table_rename_in_cache(
in old_name_cs_filename */
strncpy(old_name_cs_filename, old_name,
- MAX_TABLE_NAME_LEN);
+ MAX_FULL_NAME_LEN);
+ old_name_cs_filename[MAX_FULL_NAME_LEN] = '\0';
if (strstr(old_name, TEMP_TABLE_PATH_PREFIX) == NULL) {
innobase_convert_to_system_charset(
@@ -1890,7 +1884,9 @@ dict_table_rename_in_cache(
/* Old name already in
my_charset_filename */
strncpy(old_name_cs_filename, old_name,
- MAX_TABLE_NAME_LEN);
+ MAX_FULL_NAME_LEN);
+ old_name_cs_filename[MAX_FULL_NAME_LEN]
+ = '\0';
}
}
@@ -1916,7 +1912,7 @@ dict_table_rename_in_cache(
/* This is a generated >= 4.0.18 format id */
- char table_name[MAX_TABLE_NAME_LEN] = "";
+ char table_name[MAX_TABLE_NAME_LEN + 1];
uint errors = 0;
if (strlen(table->name) > strlen(old_name)) {
@@ -1930,6 +1926,7 @@ dict_table_rename_in_cache(
/* Convert the table name to UTF-8 */
strncpy(table_name, table->name,
MAX_TABLE_NAME_LEN);
+ table_name[MAX_TABLE_NAME_LEN] = '\0';
innobase_convert_to_system_charset(
strchr(table_name, '/') + 1,
strchr(table->name, '/') + 1,
@@ -1939,9 +1936,10 @@ dict_table_rename_in_cache(
/* Table name could not be converted
from charset my_charset_filename to
UTF-8. This means that the table name
- is already in UTF-8 (#mysql#50). */
+ is already in UTF-8 (#mysql50#). */
strncpy(table_name, table->name,
MAX_TABLE_NAME_LEN);
+ table_name[MAX_TABLE_NAME_LEN] = '\0';
}
/* Replace the prefix 'databasename/tablename'
diff --git a/storage/xtradb/fts/fts0fts.cc b/storage/xtradb/fts/fts0fts.cc
index 02d81551e75..1ea3a8d2c60 100644
--- a/storage/xtradb/fts/fts0fts.cc
+++ b/storage/xtradb/fts/fts0fts.cc
@@ -1,7 +1,7 @@
/*****************************************************************************
Copyright (c) 2011, 2018, Oracle and/or its affiliates. All Rights Reserved.
-Copyright (c) 2016, 2018, MariaDB Corporation.
+Copyright (c) 2016, 2019, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
@@ -567,7 +567,7 @@ fts_index_cache_init(
index_cache->words = rbt_create_arg_cmp(
sizeof(fts_tokenizer_word_t), innobase_fts_text_cmp,
- (void*)index_cache->charset);
+ (void*) index_cache->charset);
ut_a(index_cache->doc_stats == NULL);
@@ -736,6 +736,7 @@ fts_reset_get_doc(
memset(get_doc, 0x0, sizeof(*get_doc));
get_doc->index_cache = ind_cache;
+ get_doc->cache = cache;
}
ut_ad(ib_vector_size(cache->get_docs)
@@ -2004,7 +2005,8 @@ fts_create_one_index_table(
dict_mem_table_add_col(new_table, heap, "ilist", DATA_BLOB,
4130048, 0);
- error = row_create_table_for_mysql(new_table, trx, false, FIL_ENCRYPTION_DEFAULT, FIL_DEFAULT_ENCRYPTION_KEY);
+ error = row_create_table_for_mysql(new_table, trx, false,
+ FIL_ENCRYPTION_DEFAULT, FIL_DEFAULT_ENCRYPTION_KEY);
if (error != DB_SUCCESS) {
trx->error_state = error;
@@ -4800,8 +4802,9 @@ fts_tokenize_document(
ut_a(!doc->tokens);
ut_a(doc->charset);
- doc->tokens = rbt_create_arg_cmp(
- sizeof(fts_token_t), innobase_fts_text_cmp, (void*) doc->charset);
+ doc->tokens = rbt_create_arg_cmp(sizeof(fts_token_t),
+ innobase_fts_text_cmp,
+ (void*) doc->charset);
for (ulint i = 0; i < doc->text.f_len; i += inc) {
inc = fts_process_token(doc, result, i, 0);
diff --git a/storage/xtradb/fts/fts0opt.cc b/storage/xtradb/fts/fts0opt.cc
index 77293bc867a..28e704eb9a5 100644
--- a/storage/xtradb/fts/fts0opt.cc
+++ b/storage/xtradb/fts/fts0opt.cc
@@ -1,7 +1,7 @@
/*****************************************************************************
Copyright (c) 2007, 2018, Oracle and/or its affiliates. All Rights Reserved.
-Copyright (c) 2016, MariaDB Corporation. All Rights reserved.
+Copyright (c) 2016, 2019, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
@@ -673,18 +673,17 @@ fts_fetch_index_words(
fts_zip_t* zip = static_cast<fts_zip_t*>(user_arg);
que_node_t* exp = sel_node->select_list;
dfield_t* dfield = que_node_get_val(exp);
- short len = static_cast<short>(dfield_get_len(dfield));
+
+ ut_a(dfield_get_len(dfield) <= FTS_MAX_WORD_LEN);
+
+ uint16 len = uint16(dfield_get_len(dfield));
void* data = dfield_get_data(dfield);
/* Skip the duplicate words. */
- if (zip->word.f_len == static_cast<ulint>(len)
- && !memcmp(zip->word.f_str, data, len)) {
-
+ if (zip->word.f_len == len && !memcmp(zip->word.f_str, data, len)) {
return(TRUE);
}
- ut_a(len <= FTS_MAX_WORD_LEN);
-
memcpy(zip->word.f_str, data, len);
zip->word.f_len = len;
@@ -692,6 +691,9 @@ fts_fetch_index_words(
ut_a(zip->zp->next_in == NULL);
/* The string is prefixed by len. */
+ /* FIXME: This is not byte order agnostic (InnoDB data files
+ with FULLTEXT INDEX are not portable between little-endian and
+ big-endian systems!) */
zip->zp->next_in = reinterpret_cast<byte*>(&len);
zip->zp->avail_in = sizeof(len);
@@ -717,14 +719,13 @@ fts_fetch_index_words(
ut_a(len <= FTS_MAX_WORD_LEN);
len = 0;
}
- break;
+ continue;
case Z_STREAM_END:
case Z_BUF_ERROR:
case Z_STREAM_ERROR:
default:
ut_error;
- break;
}
}
diff --git a/storage/xtradb/include/dict0crea.ic b/storage/xtradb/include/dict0crea.ic
index 1cbaa47032b..3eb3ddfa84e 100644
--- a/storage/xtradb/include/dict0crea.ic
+++ b/storage/xtradb/include/dict0crea.ic
@@ -1,6 +1,7 @@
/*****************************************************************************
Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved.
+Copyright (c) 2019, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
@@ -65,11 +66,11 @@ dict_create_add_foreign_id(
sprintf(id, "%s_ibfk_%lu", name,
(ulong) (*id_nr)++);
} else {
- char table_name[MAX_TABLE_NAME_LEN + 20] = "";
+ char table_name[MAX_TABLE_NAME_LEN + 21];
uint errors = 0;
- strncpy(table_name, name,
- MAX_TABLE_NAME_LEN + 20);
+ strncpy(table_name, name, (sizeof table_name) - 1);
+ table_name[(sizeof table_name) - 1] = '\0';
innobase_convert_to_system_charset(
strchr(table_name, '/') + 1,
@@ -78,7 +79,8 @@ dict_create_add_foreign_id(
if (errors) {
strncpy(table_name, name,
- MAX_TABLE_NAME_LEN + 20);
+ (sizeof table_name) - 1);
+ table_name[(sizeof table_name) - 1] = '\0';
}
/* no overflow if number < 1e13 */
diff --git a/storage/xtradb/include/log0online.h b/storage/xtradb/include/log0online.h
index 2d1febe9b9f..1a53b9efa9c 100644
--- a/storage/xtradb/include/log0online.h
+++ b/storage/xtradb/include/log0online.h
@@ -1,6 +1,7 @@
/*****************************************************************************
Copyright (c) 2011-2012, Percona Inc. All Rights Reserved.
+Copyright (c) 2019, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
@@ -146,7 +147,7 @@ struct log_online_bitmap_file_range_struct {
size_t count; /*!< Number of files */
/*!< Dynamically-allocated array of info about individual files */
struct files_t {
- char name[FN_REFLEN]; /*!< Name of a file */
+ char name[OS_FILE_MAX_PATH+1];/*!< Name of a file */
lsn_t start_lsn; /*!< Starting LSN of data in
this file */
ulong seq_num; /*!< Sequence number of this
diff --git a/storage/xtradb/log/log0online.cc b/storage/xtradb/log/log0online.cc
index bc1667e1c20..b25e2bca711 100644
--- a/storage/xtradb/log/log0online.cc
+++ b/storage/xtradb/log/log0online.cc
@@ -1,7 +1,7 @@
/*****************************************************************************
Copyright (c) 2011-2012 Percona Inc. All Rights Reserved.
-Copyright (C) 2016, MariaDB Corporation.
+Copyright (C) 2016, 2019, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
@@ -1453,8 +1453,9 @@ log_online_setup_bitmap_file_range(
bitmap_files->files[array_pos].seq_num = file_seq_num;
strncpy(bitmap_files->files[array_pos].name,
- bitmap_dir_file_info.name, FN_REFLEN);
- bitmap_files->files[array_pos].name[FN_REFLEN - 1]
+ bitmap_dir_file_info.name,
+ OS_FILE_MAX_PATH);
+ bitmap_files->files[array_pos].name[OS_FILE_MAX_PATH]
= '\0';
bitmap_files->files[array_pos].start_lsn
= file_start_lsn;
diff --git a/storage/xtradb/row/row0ftsort.cc b/storage/xtradb/row/row0ftsort.cc
index deae270f716..1798f997033 100644
--- a/storage/xtradb/row/row0ftsort.cc
+++ b/storage/xtradb/row/row0ftsort.cc
@@ -101,8 +101,8 @@ row_merge_create_fts_sort_index(
field = dict_index_get_nth_field(new_index, 0);
field->name = NULL;
field->prefix_len = 0;
- field->col = static_cast<dict_col_t*>(
- mem_heap_alloc(new_index->heap, sizeof(dict_col_t)));
+ field->col = new(mem_heap_zalloc(new_index->heap, sizeof(dict_col_t)))
+ dict_col_t();
field->col->prtype = idx_field->col->prtype | DATA_NOT_NULL;
field->col->mtype = charset == &my_charset_latin1
? DATA_VARCHAR : DATA_VARMYSQL;
@@ -116,8 +116,8 @@ row_merge_create_fts_sort_index(
field = dict_index_get_nth_field(new_index, 1);
field->name = NULL;
field->prefix_len = 0;
- field->col = static_cast<dict_col_t*>(
- mem_heap_alloc(new_index->heap, sizeof(dict_col_t)));
+ field->col = new(mem_heap_zalloc(new_index->heap, sizeof(dict_col_t)))
+ dict_col_t();
field->col->mtype = DATA_INT;
*opt_doc_id_size = FALSE;
@@ -151,21 +151,16 @@ row_merge_create_fts_sort_index(
field->col->prtype = DATA_NOT_NULL | DATA_BINARY_TYPE;
- field->col->mbminlen = 0;
- field->col->mbmaxlen = 0;
-
/* The third field is on the word's position in the original doc */
field = dict_index_get_nth_field(new_index, 2);
field->name = NULL;
field->prefix_len = 0;
- field->col = static_cast<dict_col_t*>(
- mem_heap_alloc(new_index->heap, sizeof(dict_col_t)));
+ field->col = new(mem_heap_zalloc(new_index->heap, sizeof(dict_col_t)))
+ dict_col_t();
field->col->mtype = DATA_INT;
field->col->len = 4 ;
field->fixed_len = 4;
field->col->prtype = DATA_NOT_NULL;
- field->col->mbminlen = 0;
- field->col->mbmaxlen = 0;
return(new_index);
}
diff --git a/storage/xtradb/row/row0mysql.cc b/storage/xtradb/row/row0mysql.cc
index 93a4db98e7b..498a35a86ce 100644
--- a/storage/xtradb/row/row0mysql.cc
+++ b/storage/xtradb/row/row0mysql.cc
@@ -5183,11 +5183,12 @@ row_rename_table_for_mysql(
if (!new_is_tmp) {
/* Rename all constraints. */
- char new_table_name[MAX_TABLE_NAME_LEN] = "";
- char old_table_utf8[MAX_TABLE_NAME_LEN] = "";
+ char new_table_name[MAX_TABLE_NAME_LEN + 1];
+ char old_table_utf8[MAX_TABLE_NAME_LEN + 1];
uint errors = 0;
strncpy(old_table_utf8, old_name, MAX_TABLE_NAME_LEN);
+ old_table_utf8[MAX_TABLE_NAME_LEN] = '\0';
innobase_convert_to_system_charset(
strchr(old_table_utf8, '/') + 1,
strchr(old_name, '/') +1,
@@ -5198,6 +5199,7 @@ row_rename_table_for_mysql(
my_charset_filename to UTF-8. This means that the
table name is already in UTF-8 (#mysql#50). */
strncpy(old_table_utf8, old_name, MAX_TABLE_NAME_LEN);
+ old_table_utf8[MAX_TABLE_NAME_LEN] = '\0';
}
info = pars_info_create();
@@ -5208,6 +5210,7 @@ row_rename_table_for_mysql(
old_table_utf8);
strncpy(new_table_name, new_name, MAX_TABLE_NAME_LEN);
+ new_table_name[MAX_TABLE_NAME_LEN] = '\0';
innobase_convert_to_system_charset(
strchr(new_table_name, '/') + 1,
strchr(new_name, '/') +1,
@@ -5218,6 +5221,7 @@ row_rename_table_for_mysql(
my_charset_filename to UTF-8. This means that the
table name is already in UTF-8 (#mysql#50). */
strncpy(new_table_name, new_name, MAX_TABLE_NAME_LEN);
+ new_table_name[MAX_TABLE_NAME_LEN] = '\0';
}
pars_info_add_str_literal(info, "new_table_utf8", new_table_name);
diff --git a/storage/xtradb/srv/srv0start.cc b/storage/xtradb/srv/srv0start.cc
index 7baa3cf14a5..4ad78829ee8 100644
--- a/storage/xtradb/srv/srv0start.cc
+++ b/storage/xtradb/srv/srv0start.cc
@@ -3,7 +3,7 @@
Copyright (c) 1996, 2017, Oracle and/or its affiliates. All rights reserved.
Copyright (c) 2008, Google Inc.
Copyright (c) 2009, Percona Inc.
-Copyright (c) 2013, 2017, MariaDB Corporation
+Copyright (c) 2013, 2019, MariaDB Corporation.
Portions of this file contain modifications contributed and copyrighted by
Google, Inc. Those modifications are gratefully acknowledged and are described
@@ -3445,9 +3445,8 @@ srv_get_meta_data_filename(
if (strncmp(suffix, ".cfg", suffix_len) == 0) {
strcpy(filename, path);
} else {
- ut_ad(strncmp(suffix, ".ibd", suffix_len) == 0);
-
- strncpy(filename, path, len - suffix_len);
+ ut_ad(!strcmp(suffix, ".ibd"));
+ memcpy(filename, path, len - suffix_len);
suffix = filename + (len - suffix_len);
strcpy(suffix, ".cfg");
}