Commit 96f4b4a5 authored by Marko Mäkelä's avatar Marko Mäkelä

Merge 10.3 into 10.4

parents ebbd5ef6 91d5fffa
/* /*
Copyright (c) 2001, 2012, Oracle and/or its affiliates. Copyright (c) 2001, 2012, Oracle and/or its affiliates.
Copyright (c) 2009, 2020, MariaDB Copyright (c) 2009, 2022, MariaDB
This program is free software; you can redistribute it and/or modify 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 it under the terms of the GNU General Public License as published by
...@@ -102,6 +102,7 @@ enum options_client ...@@ -102,6 +102,7 @@ enum options_client
OPT_IGNORE_DATA, OPT_IGNORE_DATA,
OPT_PRINT_ROW_COUNT, OPT_PRINT_ROW_EVENT_POSITIONS, OPT_PRINT_ROW_COUNT, OPT_PRINT_ROW_EVENT_POSITIONS,
OPT_CHECK_IF_UPGRADE_NEEDED, OPT_CHECK_IF_UPGRADE_NEEDED,
OPT_COMPATIBILTY_CLEARTEXT_PLUGIN,
OPT_SHUTDOWN_WAIT_FOR_SLAVES, OPT_SHUTDOWN_WAIT_FOR_SLAVES,
OPT_MAX_CLIENT_OPTION /* should be always the last */ OPT_MAX_CLIENT_OPTION /* should be always the last */
}; };
......
...@@ -1514,6 +1514,8 @@ static struct my_option my_long_options[] = ...@@ -1514,6 +1514,8 @@ static struct my_option my_long_options[] =
&delimiter_str, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, &delimiter_str, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
{"execute", 'e', "Execute command and quit. (Disables --force and history file.)", 0, {"execute", 'e', "Execute command and quit. (Disables --force and history file.)", 0,
0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
{"enable-cleartext-plugin", OPT_COMPATIBILTY_CLEARTEXT_PLUGIN, "Obsolete option. Exists only for MySQL compatibility.",
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
{"vertical", 'E', "Print the output of a query (rows) vertically.", {"vertical", 'E', "Print the output of a query (rows) vertically.",
&vertical, &vertical, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, &vertical, &vertical, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0,
0}, 0},
...@@ -1813,6 +1815,14 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)), ...@@ -1813,6 +1815,14 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
printf("WARNING: --server-arg option not supported in this configuration.\n"); printf("WARNING: --server-arg option not supported in this configuration.\n");
#endif #endif
break; break;
case OPT_COMPATIBILTY_CLEARTEXT_PLUGIN:
/*
This option exists in MySQL client but not in MariaDB. Users switching from
MySQL might still have this option in their commands, and it will not work
in MariaDB unless it is handled. Therefore output a warning and continue.
*/
printf("WARNING: option '--enable-cleartext-plugin' is obsolete.\n");
break;
case 'A': case 'A':
opt_rehash= 0; opt_rehash= 0;
break; break;
......
/****************************************************** /******************************************************
Copyright (c) 2011-2013 Percona LLC and/or its affiliates. Copyright (c) 2011-2013 Percona LLC and/or its affiliates.
Copyright (c) 2022, MariaDB Corporation.
Compressing datasink implementation for XtraBackup. Compressing datasink implementation for XtraBackup.
...@@ -32,11 +33,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA ...@@ -32,11 +33,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA
typedef struct { typedef struct {
pthread_t id; pthread_t id;
uint num; uint num;
pthread_mutex_t ctrl_mutex;
pthread_cond_t ctrl_cond;
pthread_mutex_t data_mutex; pthread_mutex_t data_mutex;
pthread_cond_t data_cond; pthread_cond_t data_cond;
my_bool started;
my_bool data_avail; my_bool data_avail;
my_bool cancelled; my_bool cancelled;
const char *from; const char *from;
...@@ -208,14 +206,13 @@ compress_write(ds_file_t *file, const uchar *buf, size_t len) ...@@ -208,14 +206,13 @@ compress_write(ds_file_t *file, const uchar *buf, size_t len)
thd = threads + i; thd = threads + i;
pthread_mutex_lock(&thd->ctrl_mutex); pthread_mutex_lock(&thd->data_mutex);
chunk_len = (len > COMPRESS_CHUNK_SIZE) ? chunk_len = (len > COMPRESS_CHUNK_SIZE) ?
COMPRESS_CHUNK_SIZE : len; COMPRESS_CHUNK_SIZE : len;
thd->from = ptr; thd->from = ptr;
thd->from_len = chunk_len; thd->from_len = chunk_len;
pthread_mutex_lock(&thd->data_mutex);
thd->data_avail = TRUE; thd->data_avail = TRUE;
pthread_cond_signal(&thd->data_cond); pthread_cond_signal(&thd->data_cond);
pthread_mutex_unlock(&thd->data_mutex); pthread_mutex_unlock(&thd->data_mutex);
...@@ -241,26 +238,24 @@ compress_write(ds_file_t *file, const uchar *buf, size_t len) ...@@ -241,26 +238,24 @@ compress_write(ds_file_t *file, const uchar *buf, size_t len)
xb_a(threads[i].to_len > 0); xb_a(threads[i].to_len > 0);
if (ds_write(dest_file, "NEWBNEWB", 8) || bool fail = ds_write(dest_file, "NEWBNEWB", 8) ||
write_uint64_le(dest_file, write_uint64_le(dest_file,
comp_file->bytes_processed)) { comp_file->bytes_processed);
msg("compress: write to the destination stream " comp_file->bytes_processed += threads[i].from_len;
"failed.");
return 1; if (!fail) {
fail = write_uint32_le(dest_file, threads[i].adler) ||
ds_write(dest_file, threads[i].to,
threads[i].to_len);
} }
comp_file->bytes_processed += threads[i].from_len; pthread_mutex_unlock(&threads[i].data_mutex);
if (write_uint32_le(dest_file, threads[i].adler) || if (fail) {
ds_write(dest_file, threads[i].to,
threads[i].to_len)) {
msg("compress: write to the destination stream " msg("compress: write to the destination stream "
"failed."); "failed.");
return 1; return 1;
} }
pthread_mutex_unlock(&threads[i].data_mutex);
pthread_mutex_unlock(&threads[i].ctrl_mutex);
} }
} }
...@@ -330,6 +325,23 @@ write_uint64_le(ds_file_t *file, ulonglong n) ...@@ -330,6 +325,23 @@ write_uint64_le(ds_file_t *file, ulonglong n)
return ds_write(file, tmp, sizeof(tmp)); return ds_write(file, tmp, sizeof(tmp));
} }
static
void
destroy_worker_thread(comp_thread_ctxt_t *thd)
{
pthread_mutex_lock(&thd->data_mutex);
thd->cancelled = TRUE;
pthread_cond_signal(&thd->data_cond);
pthread_mutex_unlock(&thd->data_mutex);
pthread_join(thd->id, NULL);
pthread_cond_destroy(&thd->data_cond);
pthread_mutex_destroy(&thd->data_mutex);
my_free(thd->to);
}
static static
comp_thread_ctxt_t * comp_thread_ctxt_t *
create_worker_threads(uint n) create_worker_threads(uint n)
...@@ -344,7 +356,6 @@ create_worker_threads(uint n) ...@@ -344,7 +356,6 @@ create_worker_threads(uint n)
comp_thread_ctxt_t *thd = threads + i; comp_thread_ctxt_t *thd = threads + i;
thd->num = i + 1; thd->num = i + 1;
thd->started = FALSE;
thd->cancelled = FALSE; thd->cancelled = FALSE;
thd->data_avail = FALSE; thd->data_avail = FALSE;
...@@ -352,46 +363,25 @@ create_worker_threads(uint n) ...@@ -352,46 +363,25 @@ create_worker_threads(uint n)
MY_QLZ_COMPRESS_OVERHEAD, MY_QLZ_COMPRESS_OVERHEAD,
MYF(MY_FAE)); MYF(MY_FAE));
/* Initialize the control mutex and condition var */
if (pthread_mutex_init(&thd->ctrl_mutex, NULL) ||
pthread_cond_init(&thd->ctrl_cond, NULL)) {
goto err;
}
/* Initialize and data mutex and condition var */ /* Initialize and data mutex and condition var */
if (pthread_mutex_init(&thd->data_mutex, NULL) || if (pthread_mutex_init(&thd->data_mutex, NULL) ||
pthread_cond_init(&thd->data_cond, NULL)) { pthread_cond_init(&thd->data_cond, NULL)) {
goto err; goto err;
} }
pthread_mutex_lock(&thd->ctrl_mutex);
if (pthread_create(&thd->id, NULL, compress_worker_thread_func, if (pthread_create(&thd->id, NULL, compress_worker_thread_func,
thd)) { thd)) {
msg("compress: pthread_create() failed: " msg("compress: pthread_create() failed: "
"errno = %d", errno); "errno = %d", errno);
pthread_mutex_unlock(&thd->ctrl_mutex);
goto err; goto err;
} }
} }
/* Wait for the threads to start */
for (i = 0; i < n; i++) {
comp_thread_ctxt_t *thd = threads + i;
while (thd->started == FALSE)
pthread_cond_wait(&thd->ctrl_cond, &thd->ctrl_mutex);
pthread_mutex_unlock(&thd->ctrl_mutex);
}
return threads; return threads;
err: err:
while (i > 0) { for (; i; i--) {
comp_thread_ctxt_t *thd; destroy_worker_thread(threads + i);
i--;
thd = threads + i;
pthread_mutex_unlock(&thd->ctrl_mutex);
} }
my_free(threads); my_free(threads);
...@@ -405,21 +395,7 @@ destroy_worker_threads(comp_thread_ctxt_t *threads, uint n) ...@@ -405,21 +395,7 @@ destroy_worker_threads(comp_thread_ctxt_t *threads, uint n)
uint i; uint i;
for (i = 0; i < n; i++) { for (i = 0; i < n; i++) {
comp_thread_ctxt_t *thd = threads + i; destroy_worker_thread(threads + i);
pthread_mutex_lock(&thd->data_mutex);
threads[i].cancelled = TRUE;
pthread_cond_signal(&thd->data_cond);
pthread_mutex_unlock(&thd->data_mutex);
pthread_join(thd->id, NULL);
pthread_cond_destroy(&thd->data_cond);
pthread_mutex_destroy(&thd->data_mutex);
pthread_cond_destroy(&thd->ctrl_cond);
pthread_mutex_destroy(&thd->ctrl_mutex);
my_free(thd->to);
} }
my_free(threads); my_free(threads);
...@@ -431,19 +407,9 @@ compress_worker_thread_func(void *arg) ...@@ -431,19 +407,9 @@ compress_worker_thread_func(void *arg)
{ {
comp_thread_ctxt_t *thd = (comp_thread_ctxt_t *) arg; comp_thread_ctxt_t *thd = (comp_thread_ctxt_t *) arg;
pthread_mutex_lock(&thd->ctrl_mutex);
pthread_mutex_lock(&thd->data_mutex); pthread_mutex_lock(&thd->data_mutex);
thd->started = TRUE;
pthread_cond_signal(&thd->ctrl_cond);
pthread_mutex_unlock(&thd->ctrl_mutex);
while (1) { while (1) {
thd->data_avail = FALSE;
pthread_cond_signal(&thd->data_cond);
while (!thd->data_avail && !thd->cancelled) { while (!thd->data_avail && !thd->cancelled) {
pthread_cond_wait(&thd->data_cond, &thd->data_mutex); pthread_cond_wait(&thd->data_cond, &thd->data_mutex);
} }
......
...@@ -507,6 +507,21 @@ the section called \(lqMYSQL COMMANDS\(rq\&. ...@@ -507,6 +507,21 @@ the section called \(lqMYSQL COMMANDS\(rq\&.
.sp -1 .sp -1
.IP \(bu 2.3 .IP \(bu 2.3
.\} .\}
.\" mysql: enable cleartext plugin option
.\" enable cleartext plugin option: mysql
\fB\-\-enable\-cleartext\-plugin\fR
.sp
Obsolete option\&. Exists only for MySQL compatibility\&.
.RE
.sp
.RS 4
.ie n \{\
\h'-04'\(bu\h'+03'\c
.\}
.el \{\
.sp -1
.IP \(bu 2.3
.\}
.\" mysql: execute option .\" mysql: execute option
.\" execute option: mysql .\" execute option: mysql
\fB\-\-execute=\fR\fB\fIstatement\fR\fR, \fB\-\-execute=\fR\fB\fIstatement\fR\fR,
......
...@@ -629,4 +629,7 @@ drop table t1; ...@@ -629,4 +629,7 @@ drop table t1;
# #
# MDEV-15538 '-N' Produce html output wrong # MDEV-15538 '-N' Produce html output wrong
# #
<TABLE BORDER=1><TR><TD>1</TD></TR></TABLE> <TABLE BORDER=1><TR><TD>1</TD></TR></TABLE>
\ No newline at end of file WARNING: option '--enable-cleartext-plugin' is obsolete.
1
1
...@@ -708,3 +708,11 @@ drop table t1; ...@@ -708,3 +708,11 @@ drop table t1;
--echo # MDEV-15538 '-N' Produce html output wrong --echo # MDEV-15538 '-N' Produce html output wrong
--echo # --echo #
--exec $MYSQL -NHe "select 1 as a" --exec $MYSQL -NHe "select 1 as a"
#
# Test obsolete option --enable-cleartext-plugin
# This should proceed with a warning
#
--echo
--exec $MYSQL test --enable-cleartext-plugin -e "select 1"
...@@ -6,7 +6,18 @@ drop table if exists t1, t2; ...@@ -6,7 +6,18 @@ drop table if exists t1, t2;
CREATE TABLE t1 (a int); CREATE TABLE t1 (a int);
CREATE OR REPLACE VIEW v1 AS SELECT * FROM t1; CREATE OR REPLACE VIEW v1 AS SELECT * FROM t1;
ALTER TABLE t1 EXCHANGE PARTITION p0 WITH TABLE v1; ALTER TABLE t1 EXCHANGE PARTITION p0 WITH TABLE v1;
ERROR 42000: Can't open table ERROR HY000: 'test.v1' is not of type 'BASE TABLE'
DROP VIEW v1;
DROP TABLE t1;
#
# MDEV-28599 EXCHANGE PARTITION on view causes ER_CHECK_NO_SUCH_TABLE instead of ER_WRONG_OBJECT
#
CREATE TABLE t1 (a int)
PARTITION BY HASH (a)
PARTITIONS 2;
CREATE OR REPLACE VIEW v1 AS SELECT * FROM t1;
ALTER TABLE t1 EXCHANGE PARTITION p0 WITH TABLE v1;
ERROR HY000: 'test.v1' is not of type 'BASE TABLE'
DROP VIEW v1; DROP VIEW v1;
DROP TABLE t1; DROP TABLE t1;
# #
......
...@@ -16,7 +16,19 @@ let $MYSQLD_DATADIR= `SELECT @@datadir`; ...@@ -16,7 +16,19 @@ let $MYSQLD_DATADIR= `SELECT @@datadir`;
--echo # --echo #
CREATE TABLE t1 (a int); CREATE TABLE t1 (a int);
CREATE OR REPLACE VIEW v1 AS SELECT * FROM t1; CREATE OR REPLACE VIEW v1 AS SELECT * FROM t1;
--error ER_CHECK_NO_SUCH_TABLE --error ER_WRONG_OBJECT
ALTER TABLE t1 EXCHANGE PARTITION p0 WITH TABLE v1;
DROP VIEW v1;
DROP TABLE t1;
--echo #
--echo # MDEV-28599 EXCHANGE PARTITION on view causes ER_CHECK_NO_SUCH_TABLE instead of ER_WRONG_OBJECT
--echo #
CREATE TABLE t1 (a int)
PARTITION BY HASH (a)
PARTITIONS 2;
CREATE OR REPLACE VIEW v1 AS SELECT * FROM t1;
--error ER_WRONG_OBJECT
ALTER TABLE t1 EXCHANGE PARTITION p0 WITH TABLE v1; ALTER TABLE t1 EXCHANGE PARTITION p0 WITH TABLE v1;
DROP VIEW v1; DROP VIEW v1;
DROP TABLE t1; DROP TABLE t1;
......
...@@ -718,4 +718,18 @@ t1 CREATE TABLE `t1` ( ...@@ -718,4 +718,18 @@ t1 CREATE TABLE `t1` (
FULLTEXT KEY `a_2` (`a`) FULLTEXT KEY `a_2` (`a`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ) ENGINE=InnoDB DEFAULT CHARSET=latin1
DROP TABLE t1; DROP TABLE t1;
#
# MDEV-25257 SEGV in fts_get_next_doc_id upon some INSERT
#
SET @save = @@global.innodb_file_per_table;
SET @@global.innodb_file_per_table = 0;
CREATE TABLE t1 (
col_int INTEGER, col_text TEXT,
col_int_g INTEGER GENERATED ALWAYS AS (col_int)
) ENGINE = InnoDB ROW_FORMAT = Redundant ;
ALTER TABLE t1 ADD FULLTEXT KEY `ftidx` ( col_text ) ;
ALTER TABLE t1 DROP KEY `ftidx` ;
INSERT INTO t1 (col_int, col_text) VALUES ( 1255, NULL);
DROP TABLE t1;
SET @@global.innodb_file_per_table = @save;
# End of 10.3 tests # End of 10.3 tests
...@@ -741,4 +741,20 @@ ALTER TABLE t1 ADD FULLTEXT INDEX (a); ...@@ -741,4 +741,20 @@ ALTER TABLE t1 ADD FULLTEXT INDEX (a);
SHOW CREATE TABLE t1; SHOW CREATE TABLE t1;
DROP TABLE t1; DROP TABLE t1;
--echo #
--echo # MDEV-25257 SEGV in fts_get_next_doc_id upon some INSERT
--echo #
SET @save = @@global.innodb_file_per_table;
SET @@global.innodb_file_per_table = 0;
CREATE TABLE t1 (
col_int INTEGER, col_text TEXT,
col_int_g INTEGER GENERATED ALWAYS AS (col_int)
) ENGINE = InnoDB ROW_FORMAT = Redundant ;
ALTER TABLE t1 ADD FULLTEXT KEY `ftidx` ( col_text ) ;
ALTER TABLE t1 DROP KEY `ftidx` ;
INSERT INTO t1 (col_int, col_text) VALUES ( 1255, NULL);
DROP TABLE t1;
SET @@global.innodb_file_per_table = @save;
--echo # End of 10.3 tests --echo # End of 10.3 tests
...@@ -86,7 +86,6 @@ encrypt_threads="" ...@@ -86,7 +86,6 @@ encrypt_threads=""
encrypt_chunk="" encrypt_chunk=""
readonly SECRET_TAG='secret' readonly SECRET_TAG='secret'
readonly TOTAL_TAG='secret /total'
# Required for backup locks # Required for backup locks
# For backup locks it is 1 sent by joiner # For backup locks it is 1 sent by joiner
...@@ -419,7 +418,7 @@ get_transfer() ...@@ -419,7 +418,7 @@ get_transfer()
get_footprint() get_footprint()
{ {
pushd "$WSREP_SST_OPT_DATA" 1>/dev/null cd "$DATA_DIR"
payload=$(find . -regex '.*\.ibd$\|.*\.MYI$\|.*\.MYD$\|.*ibdata1$' \ payload=$(find . -regex '.*\.ibd$\|.*\.MYI$\|.*\.MYD$\|.*ibdata1$' \
-type f -print0 | du --files0-from=- --block-size=1 -c -s | \ -type f -print0 | du --files0-from=- --block-size=1 -c -s | \
awk 'END { print $1 }') awk 'END { print $1 }')
...@@ -428,7 +427,7 @@ get_footprint() ...@@ -428,7 +427,7 @@ get_footprint()
# When compression/compaction used, the progress is only an approximate. # When compression/compaction used, the progress is only an approximate.
payload=$(( payload*1/2 )) payload=$(( payload*1/2 ))
fi fi
popd 1>/dev/null cd "$OLD_PWD"
pcmd="$pcmd -s $payload" pcmd="$pcmd -s $payload"
adjust_progress adjust_progress
} }
......
...@@ -900,10 +900,12 @@ void partition_info::vers_check_limit(THD *thd) ...@@ -900,10 +900,12 @@ void partition_info::vers_check_limit(THD *thd)
bitmap_set_all(), but this is not optimal since there can be quite a number bitmap_set_all(), but this is not optimal since there can be quite a number
of partitions. of partitions.
*/ */
#ifndef DBUG_OFF
const uint32 sub_factor= num_subparts ? num_subparts : 1; const uint32 sub_factor= num_subparts ? num_subparts : 1;
uint32 part_id= vers_info->hist_part->id * sub_factor; uint32 part_id= vers_info->hist_part->id * sub_factor;
const uint32 part_id_end= part_id + sub_factor; const uint32 part_id_end= part_id + sub_factor;
DBUG_ASSERT(part_id_end <= num_parts * sub_factor); DBUG_ASSERT(part_id_end <= num_parts * sub_factor);
#endif
ha_partition *hp= (ha_partition*)(table->file); ha_partition *hp= (ha_partition*)(table->file);
ha_rows hist_rows= hp->part_records(vers_info->hist_part); ha_rows hist_rows= hp->part_records(vers_info->hist_part);
......
...@@ -539,6 +539,14 @@ bool Sql_cmd_alter_table_exchange_partition:: ...@@ -539,6 +539,14 @@ bool Sql_cmd_alter_table_exchange_partition::
part_table= table_list->table; part_table= table_list->table;
swap_table= swap_table_list->table; swap_table= swap_table_list->table;
/* Don't allow to exchange with a VIEW */
if (unlikely(swap_table_list->view))
{
my_error(ER_WRONG_OBJECT, MYF(0), table_list->db.str,
swap_table_list->table_name.str, "BASE TABLE");
DBUG_RETURN(TRUE);
}
if (unlikely(check_exchange_partition(swap_table, part_table))) if (unlikely(check_exchange_partition(swap_table, part_table)))
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
......
...@@ -3214,9 +3214,6 @@ enum open_frm_error open_table_from_share(THD *thd, TABLE_SHARE *share, ...@@ -3214,9 +3214,6 @@ enum open_frm_error open_table_from_share(THD *thd, TABLE_SHARE *share,
uint ha_open_flags, TABLE *outparam, uint ha_open_flags, TABLE *outparam,
bool is_create_table, bool is_create_table,
List<String> *partitions_to_open= NULL); List<String> *partitions_to_open= NULL);
bool fix_session_vcol_expr(THD *thd, Virtual_column_info *vcol);
bool fix_session_vcol_expr_for_read(THD *thd, Field *field,
Virtual_column_info *vcol);
bool parse_vcol_defs(THD *thd, MEM_ROOT *mem_root, TABLE *table, bool parse_vcol_defs(THD *thd, MEM_ROOT *mem_root, TABLE *table,
bool *error_reported, vcol_init_mode expr); bool *error_reported, vcol_init_mode expr);
TABLE_SHARE *alloc_table_share(const char *db, const char *table_name, TABLE_SHARE *alloc_table_share(const char *db, const char *table_name,
......
...@@ -946,15 +946,6 @@ bool TDBMYSQL::OpenDB(PGLOBAL g) ...@@ -946,15 +946,6 @@ bool TDBMYSQL::OpenDB(PGLOBAL g)
} // endif MakeInsert } // endif MakeInsert
if (m_Rc != RC_FX) {
char cmd[64];
int w;
sprintf(cmd, "ALTER TABLE `%s` DISABLE KEYS", TableName);
m_Rc = Myc.ExecSQL(g, cmd, &w); // may fail for some engines
} // endif m_Rc
} else } else
// m_Rc = (Mode == MODE_DELETE) ? MakeDelete(g) : MakeUpdate(g); // m_Rc = (Mode == MODE_DELETE) ? MakeDelete(g) : MakeUpdate(g);
m_Rc = (MakeCommand(g)) ? RC_FX : RC_OK; m_Rc = (MakeCommand(g)) ? RC_FX : RC_OK;
...@@ -1216,16 +1207,6 @@ int TDBMYSQL::DeleteDB(PGLOBAL g, int irc) ...@@ -1216,16 +1207,6 @@ int TDBMYSQL::DeleteDB(PGLOBAL g, int irc)
void TDBMYSQL::CloseDB(PGLOBAL g) void TDBMYSQL::CloseDB(PGLOBAL g)
{ {
if (Myc.Connected()) { if (Myc.Connected()) {
if (Mode == MODE_INSERT) {
char cmd[64];
int w;
PDBUSER dup = PlgGetUser(g);
dup->Step = "Enabling indexes";
sprintf(cmd, "ALTER TABLE `%s` ENABLE KEYS", TableName);
Myc.m_Rows = -1; // To execute the query
m_Rc = Myc.ExecSQL(g, cmd, &w); // May fail for some engines
} // endif m_Rc
Myc.Close(); Myc.Close();
} // endif Myc } // endif Myc
......
...@@ -1847,6 +1847,7 @@ dict_load_columns( ...@@ -1847,6 +1847,7 @@ dict_load_columns(
the flag is set before the table is created. */ the flag is set before the table is created. */
if (table->fts == NULL) { if (table->fts == NULL) {
table->fts = fts_create(table); table->fts = fts_create(table);
table->fts->cache = fts_cache_create(table);
fts_optimize_add_table(table); fts_optimize_add_table(table);
} }
......
...@@ -2366,6 +2366,7 @@ os_file_get_last_error_low( ...@@ -2366,6 +2366,7 @@ os_file_get_last_error_low(
case EXDEV: case EXDEV:
case ENOTDIR: case ENOTDIR:
case EISDIR: case EISDIR:
case EPERM:
return(OS_FILE_PATH_ERROR); return(OS_FILE_PATH_ERROR);
case EAGAIN: case EAGAIN:
if (srv_use_native_aio) { if (srv_use_native_aio) {
......
...@@ -7995,22 +7995,14 @@ void translog_flush_buffers(TRANSLOG_ADDRESS *lsn, ...@@ -7995,22 +7995,14 @@ void translog_flush_buffers(TRANSLOG_ADDRESS *lsn,
} }
else else
{ {
if (log_descriptor.bc.buffer->last_lsn == LSN_IMPOSSIBLE) if (log_descriptor.bc.buffer->last_lsn == LSN_IMPOSSIBLE &&
log_descriptor.bc.buffer->prev_last_lsn == LSN_IMPOSSIBLE)
{ {
/*
In this case both last_lsn & prev_last_lsn are LSN_IMPOSSIBLE
otherwise it will go in the first IF because LSN_IMPOSSIBLE less
then any real LSN and cmp_translog_addr(*lsn,
log_descriptor.bc.buffer->prev_last_lsn) will be TRUE
*/
DBUG_ASSERT(log_descriptor.bc.buffer->prev_last_lsn ==
LSN_IMPOSSIBLE);
DBUG_PRINT("info", ("There is no LSNs yet generated => do nothing")); DBUG_PRINT("info", ("There is no LSNs yet generated => do nothing"));
translog_unlock(); translog_unlock();
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
DBUG_ASSERT(log_descriptor.bc.buffer->prev_last_lsn != LSN_IMPOSSIBLE);
/* fix lsn if it was horizon */ /* fix lsn if it was horizon */
*lsn= log_descriptor.bc.buffer->prev_last_lsn; *lsn= log_descriptor.bc.buffer->prev_last_lsn;
DBUG_PRINT("info", ("LSN to flush fixed to prev last lsn: " LSN_FMT, DBUG_PRINT("info", ("LSN to flush fixed to prev last lsn: " LSN_FMT,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment