mirror of
https://github.com/MariaDB/server.git
synced 2025-02-06 05:42:19 +01:00
888 lines
33 KiB
Text
888 lines
33 KiB
Text
--source include/have_innodb.inc
|
||
--source include/innodb_page_size_small.inc
|
||
--source include/no_valgrind_without_big.inc
|
||
|
||
#------------------------------------------------------------------------------
|
||
# FTS with FK and update cascade
|
||
#-------------------------------------------------------------------------------
|
||
set names utf8;
|
||
|
||
call mtr.add_suppression("\\[Warning\\] InnoDB: A new Doc ID must be supplied while updating FTS indexed columns.");
|
||
call mtr.add_suppression("\\[Warning\\] InnoDB: FTS Doc ID must be larger than [0-9]+ for table `test`.`t1`");
|
||
|
||
# Create FTS table
|
||
CREATE TABLE t1 (
|
||
id1 INT ,
|
||
a1 VARCHAR(200) ,
|
||
b1 TEXT ,
|
||
FULLTEXT KEY (a1,b1), PRIMARY KEY (a1, id1)
|
||
) CHARACTER SET = utf8 , ENGINE = InnoDB;
|
||
|
||
CREATE TABLE t2 (
|
||
id2 INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
|
||
a2 VARCHAR(200),
|
||
b2 TEXT ,
|
||
FOREIGN KEY (a2) REFERENCES t1(a1) ON UPDATE CASCADE,
|
||
FULLTEXT KEY (b2,a2)
|
||
) CHARACTER SET = utf8 ,ENGINE = InnoDB;
|
||
|
||
# Insert rows
|
||
INSERT INTO t1 (id1,a1,b1) VALUES
|
||
(1,'MySQL Tutorial','DBMS stands for DataBase VÐƷWİ...') ,
|
||
(2,'How To Use MySQL Well','After you went through a ...'),
|
||
(3,'Optimizing MySQL','In this tutorial we will show ...');
|
||
|
||
# Insert rows
|
||
INSERT INTO t1 (id1,a1,b1) VALUES
|
||
(4,'1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),
|
||
(5,'MySQL vs. YourSQL','In the following database comparison ...'),
|
||
(6,'MySQL Security','When configured properly, MySQL ...');
|
||
|
||
# Insert rows in t2 fk table
|
||
INSERT INTO t2 (a2,b2) VALUES
|
||
('MySQL Tutorial','DBMS stands for DataBase VÐƷWİ...') ,
|
||
('How To Use MySQL Well','After you went through a ...'),
|
||
('Optimizing MySQL','In this tutorial we will show ...');
|
||
|
||
# Insert rows t2 fk table
|
||
INSERT INTO t2 (a2,b2) VALUES
|
||
('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),
|
||
('MySQL vs. YourSQL','In the following database comparison ...'),
|
||
('MySQL Security','When configured properly, MySQL ...');
|
||
|
||
# error on violating fk constraint
|
||
--error 1452
|
||
INSERT INTO t2 (a2,b2) VALUES
|
||
('MySQL Tricks','1. Never run mysqld as root. 2. ...');
|
||
|
||
# error on delete from parent table
|
||
--error 1451
|
||
DELETE FROM t1;
|
||
|
||
ANALYZE TABLE t1;
|
||
ANALYZE TABLE t2;
|
||
|
||
SELECT id1 FROM t1 WHERE MATCH (a1,b1) AGAINST ('tutorial') ORDER BY id1;
|
||
SELECT id2 FROM t2 WHERE MATCH (a2,b2) AGAINST ('tutorial') ORDER BY id2;
|
||
|
||
SELECT id1 FROM t1 WHERE MATCH (a1,b1) AGAINST ('tutorial (+mysql -VÐƷWİ)' IN BOOLEAN MODE) ORDER BY id1;
|
||
SELECT id2 FROM t2 WHERE MATCH (a2,b2) AGAINST ('tutorial (+mysql -VÐƷWİ)' IN BOOLEAN MODE) ORDER BY id2;
|
||
|
||
SELECT id1 FROM t1 WHERE MATCH (a1,b1) AGAINST ('tutorial' WITH QUERY EXPANSION) ORDER BY id1;
|
||
SELECT id2 FROM t2 WHERE MATCH (a2,b2) AGAINST ('tutorial' WITH QUERY EXPANSION) ORDER BY id2;
|
||
|
||
|
||
SELECT id1 FROM t1 WHERE MATCH (a1,b1) AGAINST ('"dbms database"@4' IN BOOLEAN MODE) ;
|
||
SELECT id2 FROM t2 WHERE MATCH (a2,b2) AGAINST ('"dbms database"@4' IN BOOLEAN MODE) ;
|
||
|
||
set global innodb_optimize_fulltext_only=1;
|
||
optimize table t1;
|
||
set global innodb_optimize_fulltext_only=0;
|
||
# Updating parent table hence child table should get updated due to 'update cascade' clause
|
||
UPDATE t1 SET a1 = "changing column - on update cascade" , b1 = "to check foreign constraint" WHERE
|
||
MATCH (a1,b1) AGAINST ('tutorial (+mysql -VÐƷWİ)' IN BOOLEAN MODE) ;
|
||
|
||
# no records expected
|
||
SELECT id1 FROM t1 WHERE MATCH (a1,b1) AGAINST ('tutorial (+mysql -VÐƷWİ)' IN BOOLEAN MODE) ;
|
||
# InnoDB:Error child table shows records which is incorrect - UPADTE on Fix
|
||
SELECT id2 FROM t2 WHERE MATCH (a2,b2) AGAINST ('tutorial (+mysql -VÐƷWİ)' IN BOOLEAN MODE) ;
|
||
|
||
# it shows updated record
|
||
SELECT id1 FROM t1 WHERE MATCH (a1,b1) AGAINST ('+update +cascade' IN BOOLEAN MODE) ORDER BY id1;
|
||
# InnoDB:Error child table does not show the expected record
|
||
SELECT id2 FROM t2 WHERE MATCH (a2,b2) AGAINST ('+update +cascade' IN BOOLEAN MODE) ORDER BY id2;
|
||
SELECT id2 FROM t2 WHERE a2 LIKE '%UPDATE CASCADE%' ORDER BY id2;
|
||
|
||
DROP TABLE t2 , t1;
|
||
|
||
# on update cascade
|
||
create table t1 (s1 int, s2 varchar(200), primary key (s1,s2)) ENGINE = InnoDB;
|
||
create table t2 (s1 int, s2 varchar(200),
|
||
fulltext key(s2),
|
||
foreign key (s1,s2) references t1 (s1,s2) on update cascade) ENGINE = InnoDB;
|
||
insert into t1 values (1,'Sunshine'),(2,'Lollipops');
|
||
insert into t2 values (1,'Sunshine'),(2,'Lollipops');
|
||
update t1 set s2 = 'Rainbows' where s2 <> 'Sunshine';
|
||
commit;
|
||
select * from t2 where match(s2) against ('Lollipops');
|
||
DROP TABLE t2 , t1;
|
||
|
||
# on delete cascade
|
||
create table t1 (s1 int, s2 varchar(200), primary key (s1,s2)) ENGINE = InnoDB;
|
||
create table t2 (s1 int, s2 varchar(200),
|
||
fulltext key(s2),
|
||
foreign key (s1,s2) references t1 (s1,s2) on delete cascade) ENGINE = InnoDB;
|
||
insert into t1 values (1,'Sunshine'),(2,'Lollipops');
|
||
insert into t2 values (1,'Sunshine'),(2,'Lollipops');
|
||
delete from t1 where s2 <> 'Sunshine';
|
||
select * from t2 where match(s2) against ('Lollipops');
|
||
DROP TABLE t2 , t1;
|
||
|
||
# on delete set NULL
|
||
create table t1 (s1 int, s2 varchar(200), primary key (s1,s2)) ENGINE = InnoDB;
|
||
create table t2 (s1 int, s2 varchar(200),
|
||
fulltext key(s2),
|
||
foreign key (s1,s2) references t1 (s1,s2) on delete set null) ENGINE = InnoDB;
|
||
insert into t1 values (1,'Sunshine'),(2,'Lollipops');
|
||
insert into t2 values (1,'Sunshine'),(2,'Lollipops');
|
||
delete from t1 where s2 <> 'Sunshine';
|
||
select * from t2 where match(s2) against ('Lollipops');
|
||
DROP TABLE t2 , t1;
|
||
|
||
|
||
# on update set NULL
|
||
create table t1 (s1 int, s2 varchar(200), primary key (s1,s2)) ENGINE = InnoDB;
|
||
create table t2 (s1 int, s2 varchar(200),
|
||
fulltext key(s2),
|
||
foreign key (s1,s2) references t1 (s1,s2) on update set null) ENGINE = InnoDB;
|
||
insert into t1 values (1,'Sunshine'),(2,'Lollipops');
|
||
insert into t2 values (1,'Sunshine'),(2,'Lollipops');
|
||
update t1 set s2 = 'Rainbows' where s2 <> 'Sunshine';
|
||
commit;
|
||
select * from t2 where match(s2) against ('Lollipops');
|
||
DROP TABLE t2 , t1;
|
||
|
||
# When Doc ID is involved
|
||
create table t1 (s1 bigint unsigned not null, s2 varchar(200),
|
||
primary key (s1,s2)) ENGINE = InnoDB;
|
||
create table t2 (FTS_DOC_ID BIGINT UNSIGNED NOT NULL, s2 varchar(200),
|
||
foreign key (FTS_DOC_ID) references t1 (s1)
|
||
on update cascade) ENGINE = InnoDB;
|
||
|
||
create fulltext index idx on t2(s2);
|
||
|
||
show create table t2;
|
||
|
||
insert into t1 values (1,'Sunshine'),(2,'Lollipops');
|
||
insert into t2 values (1,'Sunshine'),(2,'Lollipops');
|
||
|
||
update t1 set s1 = 3 where s1=1;
|
||
|
||
select * from t2 where match(s2) against ('sunshine');
|
||
|
||
# FTS Doc ID cannot be reused
|
||
--error 1451
|
||
update t1 set s1 = 1 where s1=3;
|
||
|
||
DROP TABLE t2 , t1;
|
||
|
||
#------------------------------------------------------------------------------
|
||
# FTS with FK and delete casecade
|
||
#------------------------------------------------------------------------------
|
||
|
||
# Create FTS table
|
||
CREATE TABLE t1 (
|
||
id1 INT ,
|
||
a1 VARCHAR(200) PRIMARY KEY,
|
||
b1 TEXT character set utf8 ,
|
||
FULLTEXT KEY (a1,b1)
|
||
) CHARACTER SET = utf8 ,ENGINE = InnoDB;
|
||
|
||
CREATE TABLE t2 (
|
||
id2 INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
|
||
a2 VARCHAR(200),
|
||
b2 TEXT character set utf8 ,
|
||
FOREIGN KEY (a2) REFERENCES t1(a1) ON DELETE CASCADE,
|
||
FULLTEXT KEY (b2,a2)
|
||
) CHARACTER SET = utf8 ,ENGINE = InnoDB;
|
||
|
||
# Insert rows
|
||
INSERT INTO t1 (id1,a1,b1) VALUES
|
||
(1,'MySQL Tutorial','DBMS stands for DataBase VÐƷWİ...') ,
|
||
(2,'How To Use MySQL Well','After you went through a ...'),
|
||
(3,'Optimizing MySQL','In this tutorial we will show ...'),
|
||
(4,'1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),
|
||
(5,'MySQL vs. YourSQL','In the following database comparison ...'),
|
||
(6,'MySQL Security','When configured properly, MySQL ...');
|
||
|
||
# Insert rows in t2
|
||
INSERT INTO t2 (a2,b2) VALUES
|
||
('MySQL Tutorial','DBMS stands for DataBase VÐƷWİ...') ,
|
||
('How To Use MySQL Well','After you went through a ...'),
|
||
('Optimizing MySQL','In this tutorial we will show ...'),
|
||
('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),
|
||
('MySQL vs. YourSQL','In the following database comparison ...'),
|
||
('MySQL Security','When configured properly, MySQL ...');
|
||
|
||
# delete records from parent
|
||
DELETE FROM t1 WHERE MATCH (a1,b1) AGAINST ('tutorial (+mysql -VÐƷWİ)' IN BOOLEAN MODE) ;
|
||
|
||
# no records expected
|
||
SELECT * FROM t1 WHERE MATCH (a1,b1) AGAINST ('tutorial (+mysql -VÐƷWİ)' IN BOOLEAN MODE) ;
|
||
SELECT * FROM t2 WHERE MATCH (a2,b2) AGAINST ('tutorial (+mysql -VÐƷWİ)' IN BOOLEAN MODE) ;
|
||
|
||
SELECT * FROM t1 WHERE a1 LIKE '%tutorial%';
|
||
SELECT * FROM t2 WHERE a2 LIKE '%tutorial%';
|
||
|
||
DROP TABLE t2 , t1;
|
||
|
||
#------------------------------------------------------------------------------
|
||
# FTS with FK+transactions and UPDATE casecade with transaction
|
||
#-------------------------------------------------------------------------------
|
||
|
||
call mtr.add_suppression("\\[ERROR\\] InnoDB: FTS Doc ID must be larger than 3 for table `test`.`t2`");
|
||
|
||
# Create FTS table
|
||
CREATE TABLE t1 (
|
||
id1 INT ,
|
||
a1 VARCHAR(200) ,
|
||
b1 TEXT ,
|
||
FULLTEXT KEY (a1,b1), PRIMARY KEY(a1, id1)
|
||
) CHARACTER SET = utf8 , ENGINE = InnoDB;
|
||
|
||
CREATE TABLE t2 (
|
||
id2 INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
|
||
a2 VARCHAR(200),
|
||
b2 TEXT ,
|
||
FOREIGN KEY (a2) REFERENCES t1(a1) ON UPDATE CASCADE,
|
||
FULLTEXT KEY (b2,a2)
|
||
) CHARACTER SET = utf8 ,ENGINE = InnoDB;
|
||
|
||
# Insert rows
|
||
INSERT INTO t1 (id1,a1,b1) VALUES
|
||
(1,'MySQL Tutorial','DBMS stands for DataBase VÐƷWİ...') ,
|
||
(2,'How To Use MySQL Well','After you went through a ...'),
|
||
(3,'Optimizing MySQL','In this tutorial we will show ...');
|
||
|
||
# Insert rows in t2 fk table
|
||
INSERT INTO t2 (a2,b2) VALUES
|
||
('MySQL Tutorial','DBMS stands for DataBase VÐƷWİ...') ,
|
||
('How To Use MySQL Well','After you went through a ...'),
|
||
('Optimizing MySQL','In this tutorial we will show ...');
|
||
|
||
START TRANSACTION;
|
||
# Insert rows
|
||
INSERT INTO t1 (id1,a1,b1) VALUES
|
||
(4,'1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),
|
||
(5,'MySQL vs. YourSQL','In the following database comparison ...'),
|
||
(6,'MySQL Security','When configured properly, MySQL ...');
|
||
|
||
# Insert rows t2 fk table
|
||
INSERT INTO t2 (a2,b2) VALUES
|
||
('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),
|
||
('MySQL vs. YourSQL','In the following database comparison ...'),
|
||
('MySQL Security','When configured properly, MySQL ...');
|
||
|
||
# error on violating fk constraint
|
||
--error 1452
|
||
INSERT INTO t2 (a2,b2) VALUES
|
||
('MySQL Tricks','1. Never run mysqld as root. 2. ...');
|
||
|
||
# error on DELETE FROM parent table
|
||
--error 1451
|
||
DELETE FROM t1;
|
||
|
||
# records expected
|
||
SELECT * FROM t1 WHERE MATCH (a1,b1) AGAINST ('tutorial') ORDER BY id1;
|
||
SELECT * FROM t2 WHERE MATCH (a2,b2) AGAINST ('tutorial') ORDER BY id2;
|
||
SELECT * FROM t1 WHERE MATCH (a1,b1) AGAINST ('tutorial (+mysql -VÐƷWİ)' IN BOOLEAN MODE) ORDER BY id1;
|
||
SELECT * FROM t2 WHERE MATCH (a2,b2) AGAINST ('tutorial (+mysql -VÐƷWİ)' IN BOOLEAN MODE) ORDER BY id2;
|
||
SELECT * FROM t1 WHERE MATCH (a1,b1) AGAINST ('tutorial' WITH QUERY EXPANSION) ORDER BY id1;
|
||
SELECT * FROM t2 WHERE MATCH (a2,b2) AGAINST ('tutorial' WITH QUERY EXPANSION) ORDER BY id2;
|
||
SELECT * FROM t1 WHERE MATCH (a1,b1) AGAINST ('"dbms database"@4' IN BOOLEAN MODE) ;
|
||
SELECT * FROM t2 WHERE MATCH (a2,b2) AGAINST ('"dbms database"@4' IN BOOLEAN MODE) ;
|
||
|
||
# no records as data not COMMITted.
|
||
SELECT * FROM t1 WHERE MATCH (a1,b1) AGAINST ('root') ;
|
||
SELECT * FROM t2 WHERE MATCH (a2,b2) AGAINST ('root') ;
|
||
SELECT * FROM t1 WHERE MATCH (a1,b1) AGAINST ('mysqld (+root)' IN BOOLEAN MODE) ;
|
||
SELECT * FROM t2 WHERE MATCH (a2,b2) AGAINST ('mysqld (-root)' IN BOOLEAN MODE) ;
|
||
SELECT * FROM t1 WHERE MATCH (a1,b1) AGAINST ('root' WITH QUERY EXPANSION) ;
|
||
SELECT * FROM t2 WHERE MATCH (a2,b2) AGAINST ('root' WITH QUERY EXPANSION) ;
|
||
SELECT * FROM t1 WHERE MATCH (a1,b1) AGAINST ('"database comparison"@02' IN BOOLEAN MODE) ;
|
||
SELECT * FROM t2 WHERE MATCH (a2,b2) AGAINST ('"database comparison"@02' IN BOOLEAN MODE) ;
|
||
|
||
SELECT * FROM t1 ORDER BY id1;
|
||
SELECT * FROM t2 ORDER BY id2;
|
||
|
||
COMMIT;
|
||
|
||
START TRANSACTION;
|
||
# Updating parent table hence child table should get updated due to 'UPDATE cascade' clause
|
||
UPDATE t1 SET a1 = "changing column - on UPDATE cascade" , b1 = "to check foreign constraint" WHERE
|
||
MATCH (a1,b1) AGAINST ('tutorial (+mysql -VÐƷWİ)' IN BOOLEAN MODE) ;
|
||
COMMIT;
|
||
|
||
# no records expected
|
||
SELECT * FROM t1 WHERE MATCH (a1,b1) AGAINST ('tutorial (+mysql -VÐƷWİ)' IN BOOLEAN MODE) ;
|
||
SELECT * FROM t2 WHERE MATCH (a2,b2) AGAINST ('tutorial (+mysql -VÐƷWİ)' IN BOOLEAN MODE) ;
|
||
|
||
# it shows updated record
|
||
SELECT * FROM t1 WHERE MATCH (a1,b1) AGAINST ('+UPDATE +cascade' IN BOOLEAN MODE) ORDER BY id1;
|
||
SELECT * FROM t2 WHERE MATCH (a2,b2) AGAINST ('+UPDATE +cascade' IN BOOLEAN MODE) ORDER BY id2;
|
||
SELECT * FROM t2 WHERE a2 LIKE '%UPDATE CASCADE%' ORDER BY id2;
|
||
|
||
DROP TABLE t2 , t1;
|
||
|
||
|
||
# FTS with FK+transactions - UPDATE cascade
|
||
CREATE TABLE t1 (s1 INT, s2 VARCHAR(200), PRIMARY KEY (s1,s2)) ENGINE = InnoDB;
|
||
CREATE TABLE t2 (s1 INT, s2 VARCHAR(200),
|
||
FULLTEXT KEY(s2),
|
||
FOREIGN KEY (s1,s2) REFERENCES t1 (s1,s2) on UPDATE cascade) ENGINE = InnoDB;
|
||
START TRANSACTION;
|
||
INSERT INTO t1 VALUES (1,'Sunshine'),(2,'Lollipops');
|
||
INSERT INTO t2 VALUES (1,'Sunshine'),(2,'Lollipops');
|
||
UPDATE t1 set s2 = 'Rainbows' WHERE s2 <> 'Sunshine';
|
||
COMMIT;
|
||
SELECT * FROM t2 WHERE MATCH(s2) AGAINST ('Lollipops');
|
||
DROP TABLE t2 , t1;
|
||
|
||
# FTS with FK+transactions - on DELETE cascade
|
||
CREATE TABLE t1 (s1 INT, s2 VARCHAR(200), PRIMARY KEY (s1,s2)) ENGINE = InnoDB;
|
||
CREATE TABLE t2 (s1 INT, s2 VARCHAR(200),
|
||
FULLTEXT KEY(s2),
|
||
FOREIGN KEY (s1,s2) REFERENCES t1 (s1,s2) on DELETE cascade) ENGINE = InnoDB;
|
||
START TRANSACTION;
|
||
INSERT INTO t1 VALUES (1,'Sunshine'),(2,'Lollipops');
|
||
INSERT INTO t2 VALUES (1,'Sunshine'),(2,'Lollipops');
|
||
DELETE FROM t1 WHERE s2 <> 'Sunshine';
|
||
COMMIT;
|
||
SELECT * FROM t2 WHERE MATCH(s2) AGAINST ('Lollipops');
|
||
DROP TABLE t2 , t1;
|
||
|
||
# FTS with FK+transactions - DELETE SET NULL
|
||
CREATE TABLE t1 (s1 INT, s2 VARCHAR(200), PRIMARY KEY (s1,s2)) ENGINE = InnoDB;
|
||
CREATE TABLE t2 (s1 INT, s2 VARCHAR(200),
|
||
FULLTEXT KEY(s2),
|
||
FOREIGN KEY (s1,s2) REFERENCES t1 (s1,s2) on DELETE SET NULL) ENGINE = InnoDB;
|
||
START TRANSACTION;
|
||
INSERT INTO t1 VALUES (1,'Sunshine'),(2,'Lollipops');
|
||
INSERT INTO t2 VALUES (1,'Sunshine'),(2,'Lollipops');
|
||
DELETE FROM t1 WHERE s2 <> 'Sunshine';
|
||
COMMIT;
|
||
SELECT * FROM t2 WHERE MATCH(s2) AGAINST ('Lollipops');
|
||
DROP TABLE t2 , t1;
|
||
|
||
|
||
# FTS with FK+transactions - UPDATE SET NULL
|
||
CREATE TABLE t1 (s1 INT, s2 VARCHAR(200), PRIMARY KEY (s1,s2)) ENGINE = InnoDB;
|
||
CREATE TABLE t2 (s1 INT, s2 VARCHAR(200),
|
||
FULLTEXT KEY(s2),
|
||
FOREIGN KEY (s1,s2) REFERENCES t1 (s1,s2) on UPDATE SET NULL) ENGINE = InnoDB;
|
||
START TRANSACTION;
|
||
INSERT INTO t1 VALUES (1,'Sunshine'),(2,'Lollipops');
|
||
INSERT INTO t2 VALUES (1,'Sunshine'),(2,'Lollipops');
|
||
UPDATE t1 set s2 = 'Rainbows' WHERE s2 <> 'Sunshine';
|
||
COMMIT;
|
||
SELECT * FROM t2 WHERE MATCH(s2) AGAINST ('Lollipops');
|
||
DROP TABLE t2 , t1;
|
||
|
||
|
||
#-----------------------------------------------------------------------------
|
||
|
||
# FTS with FK+transactions - UPDATE cascade
|
||
CREATE TABLE t1 (s1 INT, s2 VARCHAR(200), PRIMARY KEY (s1,s2)) ENGINE = InnoDB;
|
||
CREATE TABLE t2 (s1 INT, s2 VARCHAR(200),
|
||
FULLTEXT KEY(s2),
|
||
FOREIGN KEY (s1,s2) REFERENCES t1 (s1,s2) on UPDATE cascade) ENGINE = InnoDB;
|
||
START TRANSACTION;
|
||
INSERT INTO t1 VALUES (1,'Sunshine'),(2,'Lollipops');
|
||
INSERT INTO t2 VALUES (1,'Sunshine'),(2,'Lollipops');
|
||
UPDATE t1 set s2 = 'Rainbows' WHERE s2 <> 'Sunshine';
|
||
ROLLBACK;
|
||
SELECT * FROM t2 WHERE MATCH(s2) AGAINST ('Lollipops');
|
||
DROP TABLE t2 , t1;
|
||
|
||
# FTS with FK+transactions - DELETE cascade
|
||
CREATE TABLE t1 (s1 INT, s2 VARCHAR(200), PRIMARY KEY (s1,s2)) ENGINE = InnoDB;
|
||
CREATE TABLE t2 (s1 INT, s2 VARCHAR(200),
|
||
FULLTEXT KEY(s2),
|
||
FOREIGN KEY (s1,s2) REFERENCES t1 (s1,s2) on DELETE cascade) ENGINE = InnoDB;
|
||
START TRANSACTION;
|
||
INSERT INTO t1 VALUES (1,'Sunshine'),(2,'Lollipops');
|
||
INSERT INTO t2 VALUES (1,'Sunshine'),(2,'Lollipops');
|
||
DELETE FROM t1 WHERE s2 <> 'Sunshine';
|
||
ROLLBACK;
|
||
SELECT * FROM t2 WHERE MATCH(s2) AGAINST ('Lollipops');
|
||
DROP TABLE t2 , t1;
|
||
|
||
# FTS with FK+transactions - DELETE SET NULL
|
||
CREATE TABLE t1 (s1 INT, s2 VARCHAR(200), PRIMARY KEY (s1,s2)) ENGINE = InnoDB;
|
||
CREATE TABLE t2 (s1 INT, s2 VARCHAR(200),
|
||
FULLTEXT KEY(s2),
|
||
FOREIGN KEY (s1,s2) REFERENCES t1 (s1,s2) on DELETE SET NULL) ENGINE = InnoDB;
|
||
START TRANSACTION;
|
||
INSERT INTO t1 VALUES (1,'Sunshine'),(2,'Lollipops');
|
||
INSERT INTO t2 VALUES (1,'Sunshine'),(2,'Lollipops');
|
||
DELETE FROM t1 WHERE s2 <> 'Sunshine';
|
||
ROLLBACK;
|
||
SELECT * FROM t2 WHERE MATCH(s2) AGAINST ('Lollipops');
|
||
DROP TABLE t2 , t1;
|
||
|
||
|
||
# FTS with FK+transactions - UPDATE SET NULL
|
||
CREATE TABLE t1 (s1 INT, s2 VARCHAR(200), PRIMARY KEY (s1,s2)) ENGINE = InnoDB;
|
||
CREATE TABLE t2 (s1 INT, s2 VARCHAR(200),
|
||
FULLTEXT KEY(s2),
|
||
FOREIGN KEY (s1,s2) REFERENCES t1 (s1,s2) on UPDATE SET NULL) ENGINE = InnoDB;
|
||
START TRANSACTION;
|
||
INSERT INTO t1 VALUES (1,'Sunshine'),(2,'Lollipops');
|
||
INSERT INTO t2 VALUES (1,'Sunshine'),(2,'Lollipops');
|
||
UPDATE t1 set s2 = 'Rainbows' WHERE s2 <> 'Sunshine';
|
||
ROLLBACK;
|
||
SELECT * FROM t2 WHERE MATCH(s2) AGAINST ('Lollipops');
|
||
DROP TABLE t2 , t1;
|
||
|
||
|
||
#------------------------------------------------------------------------------
|
||
# FTS index with compressed row format
|
||
#------------------------------------------------------------------------------
|
||
|
||
# Create FTS table
|
||
CREATE TABLE t1 (
|
||
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
|
||
a VARCHAR(200),
|
||
b TEXT
|
||
) CHARACTER SET = utf8, ROW_FORMAT=COMPRESSED, ENGINE = InnoDB;
|
||
|
||
# Insert rows
|
||
INSERT INTO t1 (a,b) VALUES
|
||
('MySQL Tutorial','DBMS stands for DataBase VÐƷWİ...') ,
|
||
('How To Use MySQL Well','After you went through a ...'),
|
||
('Optimizing MySQL','In this tutorial we will show ...');
|
||
|
||
# Create the FTS index Using Alter Table
|
||
ALTER TABLE t1 ADD FULLTEXT INDEX idx (a,b);
|
||
EVAL SHOW CREATE TABLE t1;
|
||
|
||
# Check whether individual space id created for AUX tables
|
||
SELECT count(*) FROM information_schema.innodb_sys_tables WHERE name LIKE "%FTS_%" AND space !=0;
|
||
|
||
# Insert rows
|
||
INSERT INTO t1 (a,b) VALUES
|
||
('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),
|
||
('MySQL vs. YourSQL','In the following database comparison ...'),
|
||
('MySQL Security','When configured properly, MySQL ...');
|
||
|
||
-- disable_result_log
|
||
ANALYZE TABLE t1;
|
||
-- enable_result_log
|
||
|
||
# Select word "tutorial" in the table
|
||
SELECT * FROM t1 WHERE MATCH (a,b)
|
||
AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE) ORDER BY id;
|
||
|
||
# boolean mode
|
||
select * from t1 where MATCH(a,b) AGAINST("+tutorial +VÐƷWİ" IN BOOLEAN MODE);
|
||
--error ER_PARSE_ERROR
|
||
select * from t1 where MATCH(a,b) AGAINST("+-VÐƷWİ" IN BOOLEAN MODE);
|
||
select * from t1 where MATCH(a,b) AGAINST("+Mysql +(tricks never)" IN BOOLEAN MODE);
|
||
select * from t1 where MATCH(a,b) AGAINST("+mysql -(tricks never)" IN BOOLEAN MODE) ORDER BY id;
|
||
select *, MATCH(a,b) AGAINST("mysql stands" IN BOOLEAN MODE) as x from t1 ORDER BY id;
|
||
select * from t1 where MATCH a,b AGAINST ("+database* +VÐƷW*" IN BOOLEAN MODE);
|
||
select * from t1 where MATCH a,b AGAINST ('"security mysql"' IN BOOLEAN MODE);
|
||
|
||
# query expansion
|
||
select * from t1 where MATCH(a,b) AGAINST ("VÐƷWİ" WITH QUERY EXPANSION) ORDER BY id;
|
||
|
||
# Drop index
|
||
ALTER TABLE t1 DROP INDEX idx;
|
||
|
||
# Create the FTS index again
|
||
CREATE FULLTEXT INDEX idx on t1 (a,b);
|
||
|
||
-- disable_query_log
|
||
-- disable_result_log
|
||
ANALYZE TABLE t1;
|
||
-- enable_result_log
|
||
-- enable_query_log
|
||
|
||
# Select word "tutorial" in the table
|
||
SELECT * FROM t1 WHERE MATCH (a,b)
|
||
AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE) ORDER BY id;
|
||
|
||
# boolean mode
|
||
select * from t1 where MATCH(a,b) AGAINST("+tutorial +VÐƷWİ" IN BOOLEAN MODE);
|
||
select * from t1 where MATCH(a,b) AGAINST("+dbms" IN BOOLEAN MODE);
|
||
select * from t1 where MATCH(a,b) AGAINST("+Mysql +(tricks never)" IN BOOLEAN MODE);
|
||
select * from t1 where MATCH(a,b) AGAINST("+mysql -(tricks never)" IN BOOLEAN MODE) ORDER BY id;
|
||
select *, MATCH(a,b) AGAINST("mysql VÐƷWİ" IN BOOLEAN MODE) as x from t1 ORDER BY id;
|
||
# Innodb:Assert eval0eval.c line 148
|
||
#select * from t1 where MATCH a,b AGAINST ("+database* +VÐƷWİ*" IN BOOLEAN MODE);
|
||
select * from t1 where MATCH a,b AGAINST ('"security mysql"' IN BOOLEAN MODE);
|
||
|
||
# query expansion
|
||
select * from t1 where MATCH(a,b) AGAINST ("VÐƷWİ" WITH QUERY EXPANSION) ORDER BY id;
|
||
|
||
|
||
# insert for proximity search
|
||
INSERT INTO t1 (a,b) VALUES ('test query expansion','for database ...');
|
||
# Insert into table with similar word of different distances
|
||
INSERT INTO t1 (a,b) VALUES
|
||
('test proximity search, test, proximity and phrase',
|
||
'search, with proximity innodb');
|
||
|
||
INSERT INTO t1 (a,b) VALUES
|
||
('test proximity fts search, test, proximity and phrase',
|
||
'search, with proximity innodb');
|
||
|
||
INSERT INTO t1 (a,b) VALUES
|
||
('test more proximity fts search, test, more proximity and phrase',
|
||
'search, with proximity innodb');
|
||
|
||
# This should only return the first document
|
||
SELECT * FROM t1
|
||
WHERE MATCH (a,b)
|
||
AGAINST ('"proximity search"@2' IN BOOLEAN MODE);
|
||
|
||
# This would return no document
|
||
SELECT * FROM t1
|
||
WHERE MATCH (a,b)
|
||
AGAINST ('"proximity search"@1' IN BOOLEAN MODE);
|
||
|
||
# This give you all three documents
|
||
SELECT * FROM t1
|
||
WHERE MATCH (a,b)
|
||
AGAINST ('"proximity search"@3' IN BOOLEAN MODE) ORDER BY id;
|
||
|
||
# Similar boundary testing for the words
|
||
SELECT * FROM t1
|
||
WHERE MATCH (a,b)
|
||
AGAINST ('"test proximity"@5' IN BOOLEAN MODE) ORDER BY id;
|
||
|
||
# Test with more word The last document will return, please notice there
|
||
# is no ordering requirement for proximity search.
|
||
SELECT * FROM t1
|
||
WHERE MATCH (a,b)
|
||
AGAINST ('"more test proximity"@2' IN BOOLEAN MODE);
|
||
|
||
SELECT * FROM t1
|
||
WHERE MATCH (a,b)
|
||
AGAINST ('"more test proximity"@3' IN BOOLEAN MODE);
|
||
|
||
# The phrase search will not require exact word ordering
|
||
SELECT * FROM t1
|
||
WHERE MATCH (a,b)
|
||
AGAINST ('"more fts proximity"@03' IN BOOLEAN MODE);
|
||
|
||
|
||
UPDATE t1 SET a = UPPER(a) , b = UPPER(b) ;
|
||
UPDATE t1 SET a = UPPER(a) , b = LOWER(b) ;
|
||
|
||
select * from t1 where MATCH(a,b) AGAINST("+tutorial +dbms" IN BOOLEAN MODE);
|
||
select * from t1 where MATCH(a,b) AGAINST("+VÐƷWİ" IN BOOLEAN MODE);
|
||
|
||
SELECT * FROM t1 WHERE MATCH (a,b)
|
||
AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE) ORDER BY id;
|
||
|
||
DELETE FROM t1 WHERE MATCH (a,b) AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE);
|
||
DELETE FROM t1 WHERE MATCH (a,b) AGAINST ('"proximity search"@14' IN BOOLEAN MODE);
|
||
|
||
|
||
SELECT * FROM t1 WHERE MATCH (a,b)
|
||
AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE);
|
||
|
||
SELECT * FROM t1 ORDER BY id;
|
||
|
||
DROP TABLE t1;
|
||
|
||
#------------------------------------------------------------------------------
|
||
# FTS index with utf8 character testcase
|
||
#------------------------------------------------------------------------------
|
||
|
||
# Create FTS table
|
||
EVAL CREATE TABLE t1 (
|
||
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
|
||
a VARCHAR(200),
|
||
b TEXT
|
||
) CHARACTER SET = utf8, ENGINE=InnoDB;
|
||
|
||
|
||
# Insert rows from different languages
|
||
INSERT INTO t1 (a,b) VALUES
|
||
('Я могу есть стекло', 'оно мне не вредит'),
|
||
('Мога да ям стъкло', 'то не ми вреди'),
|
||
('Μπορῶ νὰ φάω σπασμένα' ,'γυαλιὰ χωρὶς νὰ πάθω τίποτα'),
|
||
('Příliš žluťoučký kůň', 'úpěl ďábelské kódy'),
|
||
('Sævör grét', 'áðan því úlpan var ónýt'),
|
||
('うゐのおくやま','けふこえて'),
|
||
('いろはにほへど ちりぬる','あさきゆめみじ ゑひもせず');
|
||
|
||
# insert english text
|
||
INSERT INTO t1 (a,b) VALUES
|
||
('MySQL Tutorial','request docteam@oraclehelp.com ...') ,
|
||
('Trial version','query performace @1255 minute on 2.1Hz Memory 2GB...') ,
|
||
('when To Use MySQL Well','for free faq mail@xyz.com ...');
|
||
|
||
# Create the FTS index again
|
||
CREATE FULLTEXT INDEX idx on t1 (a,b);
|
||
|
||
# FTS Queries
|
||
SELECT * FROM t1 WHERE MATCH(a,b) AGAINST ("вредит χωρὶς") ORDER BY id;
|
||
SELECT * FROM t1 WHERE MATCH(a,b) AGAINST ("оно" WITH QUERY EXPANSION);
|
||
|
||
SELECT * FROM t1 WHERE MATCH(a,b) AGAINST("вред*" IN BOOLEAN MODE) ORDER BY id;
|
||
SELECT * FROM t1 WHERE MATCH(a,b) AGAINST("+γυαλιὰ +tutorial" IN BOOLEAN MODE);
|
||
SELECT * FROM t1 WHERE MATCH(a,b) AGAINST("+tutorial +(Мога τίποτα)" IN BOOLEAN MODE);
|
||
|
||
# Innodb:error - no result returned (update result of query once fixed) (innodb limit , does not understand character boundry for japanses like charcter set)
|
||
SELECT * FROM t1 WHERE MATCH(a,b) AGAINST ("あさきゆめみじ ゑひもせず");
|
||
SELECT * FROM t1 WHERE MATCH(a,b) AGAINST ("ちりぬる" WITH QUERY EXPANSION);
|
||
|
||
# Innodb:error - no result returned (update result of query once fixed) (innodb limit , does not understand character boundry for japanses like charcter set)
|
||
SELECT * FROM t1 WHERE MATCH(a,b) AGAINST ("+あさきゆめみじ +ゑひもせず" IN BOOLEAN MODE);
|
||
SELECT * FROM t1 WHERE MATCH(a,b) AGAINST("うゐのおく*" IN BOOLEAN MODE);
|
||
SELECT * FROM t1 WHERE MATCH(a,b) AGAINST("+Sævör +úlpan" IN BOOLEAN MODE);
|
||
|
||
SELECT * FROM t1
|
||
WHERE MATCH (a,b)
|
||
AGAINST ('"γυαλιὰ χωρὶς"@2' IN BOOLEAN MODE);
|
||
|
||
SELECT * FROM t1
|
||
WHERE MATCH (a,b)
|
||
AGAINST ('"query performace"@02' IN BOOLEAN MODE);
|
||
|
||
SELECT * FROM t1
|
||
WHERE MATCH (a,b)
|
||
AGAINST ('"πάθω τίποτα"@2' IN BOOLEAN MODE);
|
||
|
||
SELECT * FROM t1
|
||
WHERE MATCH (a,b)
|
||
AGAINST ('"あさきゆめみじ ゑひもせず"@1' IN BOOLEAN MODE);
|
||
|
||
SELECT * FROM t1
|
||
WHERE MATCH (a,b)
|
||
AGAINST ('"あさきゆめみじ ゑひもせず"@2' IN BOOLEAN MODE);
|
||
|
||
ALTER TABLE t1 DROP INDEX idx;
|
||
# Create the FTS index again
|
||
CREATE FULLTEXT INDEX idx on t1 (a,b);
|
||
|
||
# Innodb:error - no result returned (update result of query once fixed) (innodb limit , does not understand character boundry for japanses like charcter set)
|
||
SELECT * FROM t1 WHERE MATCH(a,b) AGAINST ("あさきゆめみじ ゑひもせず");
|
||
# Update fails because where condition do not succeed which is incorrect (update result of query once fixed)
|
||
UPDATE t1 SET a = "Pchnąć w tę łódź jeża" , b = "lub osiem skrzyń fig" WHERE MATCH(a,b) AGAINST ("あさきゆめみじ ゑひもせず");
|
||
UPDATE t1 SET a = "В чащах юга жил-был цитрус? Да", b = "но фальшивый экземпляр! ёъ" WHERE MATCH(a,b) AGAINST ("вред*" IN BOOLEAN MODE);
|
||
DELETE FROM t1 WHERE MATCH(a,b) AGAINST("+Sævör +úlpan" IN BOOLEAN MODE);
|
||
|
||
# Innodb error - no result returned
|
||
SELECT * FROM t1 WHERE MATCH(a,b) AGAINST ("あさきゆめみじ ゑひもせず");
|
||
SELECT * FROM t1 WHERE MATCH(a,b) AGAINST ("łódź osiem");
|
||
SELECT * FROM t1 WHERE MATCH(a,b) AGAINST("вред*" IN BOOLEAN MODE);
|
||
SELECT * FROM t1 WHERE MATCH(a,b) AGAINST("фальшив*" IN BOOLEAN MODE) ORDER BY id;
|
||
SELECT * FROM t1 WHERE MATCH(a,b) AGAINST("+Sævör +úlpan" IN BOOLEAN MODE);
|
||
|
||
SELECT * FROM t1
|
||
WHERE MATCH (a,b)
|
||
AGAINST ('"łódź jeża"@2' IN BOOLEAN MODE);
|
||
|
||
SELECT * FROM t1 ORDER BY id;
|
||
DROP TABLE t1;
|
||
|
||
# This is to test the update operation on FTS indexed and non-indexed
|
||
# column
|
||
CREATE TABLE t1(ID INT PRIMARY KEY,
|
||
no_fts_field VARCHAR(10),
|
||
fts_field VARCHAR(10),
|
||
FULLTEXT INDEX f(fts_field)) ENGINE=INNODB;
|
||
|
||
INSERT INTO t1 VALUES (1, 'AAA', 'BBB');
|
||
|
||
SELECT * FROM t1 WHERE MATCH(fts_field) against("BBB");
|
||
|
||
# Update FULLTEXT indexed column, Doc ID will be updated
|
||
UPDATE t1 SET fts_field='anychange' where id = 1;
|
||
|
||
SELECT * FROM t1 WHERE MATCH(fts_field) against("anychange");
|
||
|
||
# Update non-FULLTEXT indexed column, Doc ID stay to be the same
|
||
UPDATE t1 SET no_fts_field='anychange' where id = 1;
|
||
|
||
SELECT * FROM t1 WHERE MATCH(fts_field) against("anychange");
|
||
|
||
# Update both FULLTEXT indexed and non-indexed column, Doc ID will be updated
|
||
UPDATE t1 SET no_fts_field='anychange', fts_field='other' where id = 1;
|
||
|
||
SELECT * FROM t1 WHERE MATCH(fts_field) against("other");
|
||
|
||
SELECT * FROM t1 WHERE MATCH(fts_field) against("BBB");
|
||
|
||
# FTS index dropped, the DOC_ID column is kept, however, the ID will not
|
||
# change
|
||
DROP INDEX f on t1;
|
||
|
||
UPDATE t1 SET fts_field='anychange' where id = 1;
|
||
|
||
UPDATE t1 SET no_fts_field='anychange' where id = 1;
|
||
|
||
UPDATE t1 SET no_fts_field='anychange', fts_field='other' where id = 1;
|
||
|
||
CREATE FULLTEXT INDEX f ON t1(FTS_FIELD);
|
||
|
||
SELECT * FROM t1 WHERE MATCH(fts_field) against("other");
|
||
|
||
DROP TABLE t1;
|
||
|
||
# Test on user supplied 'FTS_DOC_ID'
|
||
CREATE TABLE t1(`FTS_DOC_ID` serial,
|
||
no_fts_field VARCHAR(10),
|
||
fts_field VARCHAR(10),
|
||
FULLTEXT INDEX f(fts_field)) ENGINE=INNODB;
|
||
|
||
INSERT INTO t1 VALUES (1, 'AAA', 'BBB');
|
||
|
||
# Doc ID must be updated as well (HA_FTS_INVALID_DOCID).
|
||
--error 182
|
||
UPDATE t1 SET fts_field='anychange' where FTS_DOC_ID = 1;
|
||
|
||
UPDATE t1 SET fts_field='anychange', FTS_DOC_ID = 2 where FTS_DOC_ID = 1;
|
||
|
||
SELECT * FROM t1 WHERE MATCH(fts_field) against("anychange");
|
||
|
||
# "BBB" should be marked as deleted.
|
||
SELECT * FROM t1 WHERE MATCH(fts_field) against("BBB");
|
||
|
||
UPDATE t1 SET no_fts_field='anychange' where FTS_DOC_ID = 2;
|
||
|
||
SELECT * FROM t1 WHERE MATCH(fts_field) against("anychange");
|
||
|
||
# "HA_FTS_INVALID_DOCID"
|
||
--error 182
|
||
UPDATE t1 SET no_fts_field='anychange', fts_field='other' where FTS_DOC_ID = 2;
|
||
|
||
SELECT * FROM t1 WHERE MATCH(fts_field) against("other");
|
||
|
||
# Doc ID must be monotonically increase (HA_FTS_INVALID_DOCID)
|
||
--error 182
|
||
UPDATE t1 SET FTS_DOC_ID = 1 where FTS_DOC_ID = 2;
|
||
|
||
DROP INDEX f ON t1;
|
||
|
||
# After FULLTEXT index dropped, we can update the fields freely
|
||
UPDATE t1 SET fts_field='newchange' where FTS_DOC_ID = 2;
|
||
|
||
UPDATE t1 SET no_fts_field='anychange' where FTS_DOC_ID = 2;
|
||
|
||
SELECT * FROM t1;
|
||
|
||
DROP TABLE t1;
|
||
|
||
CREATE TABLE t1(ID INT PRIMARY KEY,
|
||
no_fts_field VARCHAR(10),
|
||
fts_field VARCHAR(10),
|
||
FULLTEXT INDEX f(fts_field), index k(fts_field)) ENGINE=INNODB;
|
||
|
||
CREATE TABLE t2(ID INT PRIMARY KEY,
|
||
no_fts_field VARCHAR(10),
|
||
fts_field VARCHAR(10),
|
||
FULLTEXT INDEX f(fts_field),
|
||
INDEX k2(fts_field),
|
||
FOREIGN KEY(fts_field) REFERENCES
|
||
t1(fts_field) ON UPDATE CASCADE) ENGINE=INNODB;
|
||
|
||
INSERT INTO t1 VALUES (1, 'AAA', 'BBB');
|
||
|
||
INSERT INTO t2 VALUES (1, 'AAA', 'BBB');
|
||
|
||
update t1 set fts_field='newchange' where id =1;
|
||
|
||
SELECT * FROM t1 WHERE MATCH(fts_field) against("BBB");
|
||
SELECT * FROM t2 WHERE MATCH(fts_field) against("BBB");
|
||
SELECT * FROM t1 WHERE MATCH(fts_field) against("newchange");
|
||
SELECT * FROM t2 WHERE MATCH(fts_field) against("newchange");
|
||
|
||
DROP TABLE t2;
|
||
|
||
DROP TABLE t1;
|
||
|
||
# Testcases adopted from innodb_multi_update.test
|
||
|
||
CREATE TABLE t1(id INT PRIMARY KEY,
|
||
fts_field VARCHAR(10),
|
||
FULLTEXT INDEX f(fts_field)) ENGINE=INNODB;
|
||
|
||
|
||
CREATE TABLE t2(id INT PRIMARY KEY,
|
||
fts_field VARCHAR(10),
|
||
FULLTEXT INDEX f(fts_field)) ENGINE=INNODB;
|
||
|
||
INSERT INTO t1 values (1,'100'),(2,'200'),(3,'300'),(4,'400'),(5,'500'),(6,'600'), (7,'700'),(8,'800'),(9,'900'),(10,'1000'),(11,'1100'),(12,'1200');
|
||
INSERT INTO t2 values (1,'100'),(2,'200'),(3,'300'),(4,'400'),(5,'500'),(6,'600'), (7,'700'),(8,'800');
|
||
|
||
UPDATE t1, t2 set t1.fts_field = CONCAT(t1.fts_field, 'foo');
|
||
|
||
UPDATE t1, t2 set t1.fts_field = CONCAT(t1.fts_field, 'foo') WHERE t1.fts_field = "100foo";
|
||
|
||
# Update two tables in the same statement
|
||
UPDATE t1, t2 set t1.fts_field = CONCAT(t1.fts_field, 'xoo'), t2.fts_field = CONCAT(t1.fts_field, 'xoo') where t1.fts_field=CONCAT(t2.fts_field, 'foo');
|
||
|
||
# Following selects shows whether the correct Doc ID are updated
|
||
|
||
# This row should present in table t1
|
||
SELECT * FROM t1 WHERE MATCH(fts_field) against("100foofoo");
|
||
|
||
# Following rows should be dropped
|
||
SELECT * FROM t1 WHERE MATCH(fts_field) against("100foo");
|
||
SELECT * FROM t1 WHERE MATCH(fts_field) against("100");
|
||
|
||
# This row should present in table t2
|
||
SELECT * FROM t2 WHERE MATCH(fts_field) against("400fooxoo");
|
||
SELECT * FROM t2 WHERE MATCH(fts_field) against("100");
|
||
|
||
# Follow rows should be marked as dropped
|
||
SELECT * FROM t2 WHERE MATCH(fts_field) against("200");
|
||
SELECT * FROM t2 WHERE MATCH(fts_field) against("400");
|
||
|
||
|
||
DROP TABLE t1;
|
||
|
||
DROP TABLE t2;
|
||
|
||
|
||
--echo
|
||
--echo BUG#13701973/64274: MYSQL THREAD WAS SUSPENDED WHEN EXECUTE UPDATE QUERY
|
||
--echo
|
||
# FTS setup did not track which tables it had already looked at to see whether
|
||
# they need initialization. Hilarity ensued when hitting circular dependencies.
|
||
|
||
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
|
||
|
||
CREATE TABLE t1 (
|
||
t1_id INT(10) UNSIGNED NOT NULL,
|
||
t2_id INT(10) UNSIGNED DEFAULT NULL,
|
||
PRIMARY KEY (t1_id),
|
||
FOREIGN KEY (t2_id) REFERENCES t2 (t2_id)
|
||
ON DELETE CASCADE ON UPDATE CASCADE
|
||
) ENGINE=InnoDB;
|
||
|
||
CREATE TABLE t2 (
|
||
t1_id INT(10) UNSIGNED NOT NULL,
|
||
t2_id INT(10) UNSIGNED NOT NULL,
|
||
t3_id INT(10) UNSIGNED NOT NULL,
|
||
t4_id INT(10) UNSIGNED NOT NULL,
|
||
PRIMARY KEY (t2_id),
|
||
FOREIGN KEY (t1_id) REFERENCES t1 (t1_id),
|
||
FOREIGN KEY (t3_id) REFERENCES t3 (t3_id)
|
||
ON DELETE CASCADE ON UPDATE CASCADE,
|
||
FOREIGN KEY (t4_id) REFERENCES t4 (t4_id)
|
||
) ENGINE=InnoDB;
|
||
|
||
CREATE TABLE t3 (
|
||
t3_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
|
||
payload char(3),
|
||
PRIMARY KEY (t3_id)
|
||
) ENGINE=InnoDB;
|
||
|
||
INSERT INTO t3 VALUES (1, '100');
|
||
|
||
CREATE TABLE t4 (
|
||
t2_id INT(10) UNSIGNED DEFAULT NULL,
|
||
t4_id INT(10) UNSIGNED NOT NULL,
|
||
PRIMARY KEY (t4_id),
|
||
FOREIGN KEY (t2_id) REFERENCES t2 (t2_id)
|
||
ON DELETE CASCADE ON UPDATE CASCADE
|
||
) ENGINE=InnoDB;
|
||
|
||
SET FOREIGN_KEY_CHECKS=1;
|
||
|
||
UPDATE t3 SET payload='101' WHERE t3_id=1;
|
||
|
||
SET FOREIGN_KEY_CHECKS=0;
|
||
|
||
DROP TABLE t1;
|
||
DROP TABLE t2;
|
||
DROP TABLE t3;
|
||
DROP TABLE t4;
|
||
|
||
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
|