summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2019-05-16 14:24:29 +0300
committerMarko Mäkelä <marko.makela@mariadb.com>2019-05-16 14:24:29 +0300
commit3d56adbfac394b2b3ffd22a89fe7c2978ed9a505 (patch)
tree20d568348fb9aab84446988823f1a971f45a7aca
parentb7d22a843e36cd5b8695f8ac2b92789d1cf50e4f (diff)
parent796486d19b7eede58566620dfd110d24ac723218 (diff)
downloadmariadb-git-3d56adbfac394b2b3ffd22a89fe7c2978ed9a505.tar.gz
Merge 10.2 into 10.3
-rw-r--r--client/mysqlimport.c11
-rw-r--r--mysql-test/main/mysqldump.result18
-rw-r--r--mysql-test/main/mysqldump.test29
-rw-r--r--mysql-test/main/stat_tables.result30
-rw-r--r--mysql-test/main/stat_tables.test26
-rw-r--r--mysql-test/main/stat_tables_innodb.result30
-rw-r--r--mysql-test/suite/innodb_gis/r/rtree_add_index.result13
-rw-r--r--mysql-test/suite/innodb_gis/t/rtree_add_index.test20
-rw-r--r--sql/opt_range.cc2
-rw-r--r--sql/sql_statistics.cc3
10 files changed, 179 insertions, 3 deletions
diff --git a/client/mysqlimport.c b/client/mysqlimport.c
index 8740670c1c4..dbb2e8f7dba 100644
--- a/client/mysqlimport.c
+++ b/client/mysqlimport.c
@@ -48,8 +48,8 @@ static char *add_load_option(char *ptr,const char *object,
const char *statement);
static my_bool verbose=0,lock_tables=0,ignore_errors=0,opt_delete=0,
- replace=0,silent=0,ignore=0,opt_compress=0,
- opt_low_priority= 0, tty_password= 0;
+ replace, silent, ignore, ignore_foreign_keys,
+ opt_compress, opt_low_priority, tty_password;
static my_bool debug_info_flag= 0, debug_check_flag= 0;
static uint opt_use_threads=0, opt_local_file=0, my_end_arg= 0;
static char *opt_password=0, *current_user=0,
@@ -123,6 +123,10 @@ static struct my_option my_long_options[] =
&current_host, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
{"ignore", 'i', "If duplicate unique key was found, keep old row.",
&ignore, &ignore, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
+ {"ignore-foreign-keys", 'k',
+ "Disable foreign key checks while importing the data.",
+ &ignore_foreign_keys, &ignore_foreign_keys, 0, GET_BOOL, NO_ARG,
+ 0, 0, 0, 0, 0, 0},
{"ignore-lines", OPT_IGN_LINES, "Ignore first n lines of data infile.",
&opt_ignore_lines, &opt_ignore_lines, 0, GET_LL,
REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
@@ -489,6 +493,9 @@ static MYSQL *db_connect(char *host, char *database,
ignore_errors=0;
db_error(mysql);
}
+ if (ignore_foreign_keys)
+ mysql_query(mysql, "set foreign_key_checks= 0;");
+
return mysql;
}
diff --git a/mysql-test/main/mysqldump.result b/mysql-test/main/mysqldump.result
index 812a095d1bb..539f51c24e2 100644
--- a/mysql-test/main/mysqldump.result
+++ b/mysql-test/main/mysqldump.result
@@ -5639,6 +5639,24 @@ DROP FUNCTION f;
DROP VIEW v1;
DROP FUNCTION f;
#
+# MDEV-788 New option to ignore foreign key contraints in mysqlimport
+#
+create table t1 (
+id int primary key
+) engine=InnoDB;
+create table t2 (
+t1_id int,
+CONSTRAINT fk
+FOREIGN KEY (t1_id) REFERENCES t1 (id)
+) ENGINE = InnoDB;
+select count(*) from t2;
+count(*)
+1
+select count(*) from t2;
+count(*)
+2
+drop tables t2, t1;
+#
# Test for --add-drop-trigger
#
use test;
diff --git a/mysql-test/main/mysqldump.test b/mysql-test/main/mysqldump.test
index dbd32f3e74a..8853002b6c0 100644
--- a/mysql-test/main/mysqldump.test
+++ b/mysql-test/main/mysqldump.test
@@ -2500,6 +2500,7 @@ DROP TABLE t1;
DROP TABLE t2;
DROP DATABASE db_20772273;
USE test;
+--remove_file $MYSQLTEST_VARDIR/tmp/t2.txt
--echo #
--echo # Bug #25717383: MYSQLDUMP MAY EXECUTE ANY ARBITRARY QUERY
@@ -2669,6 +2670,34 @@ DROP VIEW v1;
DROP FUNCTION f;
--echo #
+--echo # MDEV-788 New option to ignore foreign key contraints in mysqlimport
+--echo #
+create table t1 (
+ id int primary key
+) engine=InnoDB;
+
+create table t2 (
+ t1_id int,
+ CONSTRAINT fk
+ FOREIGN KEY (t1_id) REFERENCES t1 (id)
+) ENGINE = InnoDB;
+
+--write_file $MYSQLTEST_VARDIR/tmp/t2.txt
+0
+EOF
+
+--error 1
+--exec $MYSQL_IMPORT --silent test $MYSQLTEST_VARDIR/tmp/t2.txt
+--exec $MYSQL_IMPORT --silent -k test $MYSQLTEST_VARDIR/tmp/t2.txt
+select count(*) from t2;
+
+--exec $MYSQL_IMPORT --silent --ignore-foreign-keys test $MYSQLTEST_VARDIR/tmp/t2.txt
+select count(*) from t2;
+
+--remove_file $MYSQLTEST_VARDIR/tmp/t2.txt
+drop tables t2, t1;
+
+--echo #
--echo # Test for --add-drop-trigger
--echo #
use test;
diff --git a/mysql-test/main/stat_tables.result b/mysql-test/main/stat_tables.result
index d224286056f..a631aab8714 100644
--- a/mysql-test/main/stat_tables.result
+++ b/mysql-test/main/stat_tables.result
@@ -707,8 +707,38 @@ ERROR 42S02: Table 'test.x' doesn't exist
select * from information_schema.tables where table_name='v';
TABLE_CATALOG TABLE_SCHEMA TABLE_NAME TABLE_TYPE ENGINE VERSION ROW_FORMAT TABLE_ROWS AVG_ROW_LENGTH DATA_LENGTH MAX_DATA_LENGTH INDEX_LENGTH DATA_FREE AUTO_INCREMENT CREATE_TIME UPDATE_TIME CHECK_TIME TABLE_COLLATION CHECKSUM CREATE_OPTIONS TABLE_COMMENT MAX_INDEX_LENGTH TEMPORARY
def test v VIEW NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL VIEW NULL NULL
+set @@optimizer_use_condition_selectivity= @save_optimizer_use_condition_selectivity;
drop table t1,t2;
drop view v;
+#
+# MDEV-19407: Assertion `field->table->stats_is_read' failed in is_eits_usable
+#
+set @save_optimizer_use_condition_selectivity= @@optimizer_use_condition_selectivity;
+set @@optimizer_use_condition_selectivity= 1;
+set @@use_stat_tables='never';
+create table t1(pk int);
+insert into t1 values (4),(3);
+set @@optimizer_use_condition_selectivity= 4;
+set use_stat_tables='preferably';
+INSERT INTO t1 SELECT * FROM x;
+ERROR 42S02: Table 'test.x' doesn't exist
+CREATE TABLE t2 SELECT pk FROM t1 WHERE pk>2;
+select * from t2;
+pk
+4
+3
+drop table t1,t2;
+create table t1(a int,b int, key k1(a) );
+insert into t1 values(1,1),(2,2),(3,3);
+analyze table t1;
+Table Op Msg_type Msg_text
+test.t1 analyze status Engine-independent statistics collected
+test.t1 analyze status OK
+select * from mysql.index_stats, t1 where index_name='k1' and t1.a > 1 and t1.b > 1;
+db_name table_name index_name prefix_arity avg_frequency a b
+test t1 k1 1 1.0000 2 2
+test t1 k1 1 1.0000 3 3
+drop table t1;
set @@optimizer_use_condition_selectivity= @save_optimizer_use_condition_selectivity;
set @save_optimizer_switch=@@optimizer_switch;
set use_stat_tables=@save_use_stat_tables;
diff --git a/mysql-test/main/stat_tables.test b/mysql-test/main/stat_tables.test
index ddf881c69ae..79a7a17550b 100644
--- a/mysql-test/main/stat_tables.test
+++ b/mysql-test/main/stat_tables.test
@@ -469,9 +469,35 @@ CREATE VIEW v AS SELECT * FROM t1 JOIN t2;
INSERT INTO t2 SELECT * FROM x;
select * from information_schema.tables where table_name='v';
+set @@optimizer_use_condition_selectivity= @save_optimizer_use_condition_selectivity;
drop table t1,t2;
drop view v;
+
+--echo #
+--echo # MDEV-19407: Assertion `field->table->stats_is_read' failed in is_eits_usable
+--echo #
+
+set @save_optimizer_use_condition_selectivity= @@optimizer_use_condition_selectivity;
+set @@optimizer_use_condition_selectivity= 1;
+set @@use_stat_tables='never';
+create table t1(pk int);
+insert into t1 values (4),(3);
+set @@optimizer_use_condition_selectivity= 4;
+set use_stat_tables='preferably';
+
+--error ER_NO_SUCH_TABLE
+INSERT INTO t1 SELECT * FROM x;
+CREATE TABLE t2 SELECT pk FROM t1 WHERE pk>2;
+select * from t2;
+drop table t1,t2;
+
+create table t1(a int,b int, key k1(a) );
+insert into t1 values(1,1),(2,2),(3,3);
+analyze table t1;
+select * from mysql.index_stats, t1 where index_name='k1' and t1.a > 1 and t1.b > 1;
+drop table t1;
+
set @@optimizer_use_condition_selectivity= @save_optimizer_use_condition_selectivity;
set @save_optimizer_switch=@@optimizer_switch;
diff --git a/mysql-test/main/stat_tables_innodb.result b/mysql-test/main/stat_tables_innodb.result
index 1d7e1b8f1b6..53a1441158a 100644
--- a/mysql-test/main/stat_tables_innodb.result
+++ b/mysql-test/main/stat_tables_innodb.result
@@ -734,8 +734,38 @@ ERROR 42S02: Table 'test.x' doesn't exist
select * from information_schema.tables where table_name='v';
TABLE_CATALOG TABLE_SCHEMA TABLE_NAME TABLE_TYPE ENGINE VERSION ROW_FORMAT TABLE_ROWS AVG_ROW_LENGTH DATA_LENGTH MAX_DATA_LENGTH INDEX_LENGTH DATA_FREE AUTO_INCREMENT CREATE_TIME UPDATE_TIME CHECK_TIME TABLE_COLLATION CHECKSUM CREATE_OPTIONS TABLE_COMMENT MAX_INDEX_LENGTH TEMPORARY
def test v VIEW NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL VIEW NULL NULL
+set @@optimizer_use_condition_selectivity= @save_optimizer_use_condition_selectivity;
drop table t1,t2;
drop view v;
+#
+# MDEV-19407: Assertion `field->table->stats_is_read' failed in is_eits_usable
+#
+set @save_optimizer_use_condition_selectivity= @@optimizer_use_condition_selectivity;
+set @@optimizer_use_condition_selectivity= 1;
+set @@use_stat_tables='never';
+create table t1(pk int);
+insert into t1 values (4),(3);
+set @@optimizer_use_condition_selectivity= 4;
+set use_stat_tables='preferably';
+INSERT INTO t1 SELECT * FROM x;
+ERROR 42S02: Table 'test.x' doesn't exist
+CREATE TABLE t2 SELECT pk FROM t1 WHERE pk>2;
+select * from t2;
+pk
+4
+3
+drop table t1,t2;
+create table t1(a int,b int, key k1(a) );
+insert into t1 values(1,1),(2,2),(3,3);
+analyze table t1;
+Table Op Msg_type Msg_text
+test.t1 analyze status Engine-independent statistics collected
+test.t1 analyze status OK
+select * from mysql.index_stats, t1 where index_name='k1' and t1.a > 1 and t1.b > 1;
+db_name table_name index_name prefix_arity avg_frequency a b
+test t1 k1 1 1.0000 2 2
+test t1 k1 1 1.0000 3 3
+drop table t1;
set @@optimizer_use_condition_selectivity= @save_optimizer_use_condition_selectivity;
set @save_optimizer_switch=@@optimizer_switch;
set use_stat_tables=@save_use_stat_tables;
diff --git a/mysql-test/suite/innodb_gis/r/rtree_add_index.result b/mysql-test/suite/innodb_gis/r/rtree_add_index.result
new file mode 100644
index 00000000000..dbd804b18bd
--- /dev/null
+++ b/mysql-test/suite/innodb_gis/r/rtree_add_index.result
@@ -0,0 +1,13 @@
+SET @saved_frequency = @@GLOBAL.innodb_purge_rseg_truncate_frequency;
+SET GLOBAL innodb_purge_rseg_truncate_frequency = 1;
+CREATE TABLE t1 (g MULTIPOINT NOT NULL) ENGINE=InnoDB;
+INSERT INTO t1 VALUES ('');
+connect purge_control,localhost,root;
+START TRANSACTION WITH CONSISTENT SNAPSHOT;
+connection default;
+DELETE FROM t1;
+ALTER TABLE t1 ADD SPATIAL INDEX (g);
+disconnect purge_control;
+InnoDB 0 transactions not purged
+DROP TABLE t1;
+SET GLOBAL innodb_purge_rseg_truncate_frequency = @saved_frequency;
diff --git a/mysql-test/suite/innodb_gis/t/rtree_add_index.test b/mysql-test/suite/innodb_gis/t/rtree_add_index.test
new file mode 100644
index 00000000000..cbc82f62a70
--- /dev/null
+++ b/mysql-test/suite/innodb_gis/t/rtree_add_index.test
@@ -0,0 +1,20 @@
+--source include/have_innodb.inc
+
+SET @saved_frequency = @@GLOBAL.innodb_purge_rseg_truncate_frequency;
+SET GLOBAL innodb_purge_rseg_truncate_frequency = 1;
+
+CREATE TABLE t1 (g MULTIPOINT NOT NULL) ENGINE=InnoDB;
+INSERT INTO t1 VALUES ('');
+
+connect purge_control,localhost,root;
+START TRANSACTION WITH CONSISTENT SNAPSHOT;
+connection default;
+
+DELETE FROM t1;
+
+ALTER TABLE t1 ADD SPATIAL INDEX (g);
+
+disconnect purge_control;
+--source ../../innodb/include/wait_all_purged.inc
+DROP TABLE t1;
+SET GLOBAL innodb_purge_rseg_truncate_frequency = @saved_frequency;
diff --git a/sql/opt_range.cc b/sql/opt_range.cc
index 59f21d31279..ec7b3dbbd7a 100644
--- a/sql/opt_range.cc
+++ b/sql/opt_range.cc
@@ -3045,7 +3045,7 @@ bool calculate_cond_selectivity_for_table(THD *thd, TABLE *table, Item **cond)
if (thd->variables.optimizer_use_condition_selectivity > 2 &&
!bitmap_is_clear_all(used_fields) &&
- thd->variables.use_stat_tables > 0)
+ thd->variables.use_stat_tables > 0 && table->stats_is_read)
{
PARAM param;
MEM_ROOT alloc;
diff --git a/sql/sql_statistics.cc b/sql/sql_statistics.cc
index 9ed49cef3e6..5b8c1b63b6f 100644
--- a/sql/sql_statistics.cc
+++ b/sql/sql_statistics.cc
@@ -2199,6 +2199,9 @@ inline bool statistics_for_command_is_needed(THD *thd)
case SQLCOM_DELETE_MULTI:
case SQLCOM_REPLACE:
case SQLCOM_REPLACE_SELECT:
+ case SQLCOM_CREATE_TABLE:
+ case SQLCOM_SET_OPTION:
+ case SQLCOM_DO:
break;
default:
return FALSE;