mirror of
				https://github.com/MariaDB/server.git
				synced 2025-11-04 12:56:14 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			297 lines
		
	
	
	
		
			9.9 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			297 lines
		
	
	
	
		
			9.9 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
#
 | 
						||
# test of new fulltext search features
 | 
						||
#
 | 
						||
 | 
						||
#
 | 
						||
# two-level tree
 | 
						||
#
 | 
						||
 | 
						||
--source include/have_innodb.inc
 | 
						||
--source include/maybe_versioning.inc
 | 
						||
 | 
						||
CREATE TABLE t1 (
 | 
						||
  i int(10) unsigned not null auto_increment primary key,
 | 
						||
  a varchar(255) not null,
 | 
						||
  FULLTEXT KEY (a)
 | 
						||
) ENGINE = INNODB;
 | 
						||
 | 
						||
# two-level entry, second-level tree with depth 2
 | 
						||
--disable_query_log
 | 
						||
let $1=260;
 | 
						||
while ($1)
 | 
						||
{
 | 
						||
  eval insert t1 (a) values ('aaaxxx');
 | 
						||
  dec $1;
 | 
						||
}
 | 
						||
 | 
						||
# two-level entry, second-level tree has only one page
 | 
						||
let $1=255;
 | 
						||
while ($1)
 | 
						||
{
 | 
						||
  eval insert t1 (a) values ('aaazzz');
 | 
						||
  dec $1;
 | 
						||
}
 | 
						||
 | 
						||
# one-level entry (entries)
 | 
						||
let $1=250;
 | 
						||
while ($1)
 | 
						||
{
 | 
						||
  eval insert t1 (a) values ('aaayyy');
 | 
						||
  dec $1;
 | 
						||
}
 | 
						||
--enable_query_log
 | 
						||
 | 
						||
# converting to two-level
 | 
						||
# INNODB_FTS: Do not support repair
 | 
						||
#repair table t1 quick;
 | 
						||
check table t1;
 | 
						||
#optimize table t1; # BUG#5327 - mi_sort_index() of 2-level tree
 | 
						||
#check table t1;
 | 
						||
 | 
						||
select count(*) from t1 where match a against ('aaaxxx');
 | 
						||
select count(*) from t1 where match a against ('aaayyy');
 | 
						||
select count(*) from t1 where match a against ('aaazzz');
 | 
						||
select count(*) from t1 where match a against ('aaaxxx' in boolean mode);
 | 
						||
select count(*) from t1 where match a against ('aaayyy' in boolean mode);
 | 
						||
select count(*) from t1 where match a against ('aaazzz' in boolean mode);
 | 
						||
select count(*) from t1 where match a against ('aaaxxx aaayyy aaazzz');
 | 
						||
select count(*) from t1 where match a against ('aaaxxx aaayyy aaazzz' in boolean mode);
 | 
						||
 | 
						||
select count(*) from t1 where match a against ('aaax*' in boolean mode);
 | 
						||
select count(*) from t1 where match a against ('aaay*' in boolean mode);
 | 
						||
select count(*) from t1 where match a against ('aaa*' in boolean mode);
 | 
						||
 | 
						||
# mi_write:
 | 
						||
 | 
						||
insert t1 (a) values ('aaaxxx'),('aaayyy');
 | 
						||
# call to enlarge_root() below
 | 
						||
insert t1 (a) values ('aaazzz'),('aaazzz'),('aaazzz'),('aaazzz'),('aaazzz');
 | 
						||
select count(*) from t1 where match a against ('aaaxxx');
 | 
						||
select count(*) from t1 where match a against ('aaayyy');
 | 
						||
select count(*) from t1 where match a against ('aaazzz');
 | 
						||
 | 
						||
# mi_delete
 | 
						||
insert t1 (a) values ('aaaxxx 000000');
 | 
						||
select count(*) from t1 where match a against ('000000');
 | 
						||
delete from t1 where match a against ('000000');
 | 
						||
select count(*) from t1 where match a against ('000000');
 | 
						||
select count(*) from t1 where match a against ('aaaxxx');
 | 
						||
delete from t1 where match a against ('aaazzz');
 | 
						||
select count(*) from t1 where match a against ('aaaxxx' in boolean mode);
 | 
						||
select count(*) from t1 where match a against ('aaayyy' in boolean mode);
 | 
						||
select count(*) from t1 where match a against ('aaazzz' in boolean mode);
 | 
						||
# double-check without index
 | 
						||
select count(*) from t1 where a = 'aaaxxx';
 | 
						||
select count(*) from t1 where a = 'aaayyy';
 | 
						||
select count(*) from t1 where a = 'aaazzz';
 | 
						||
 | 
						||
# update
 | 
						||
insert t1 (a) values ('aaaxxx 000000');
 | 
						||
select count(*) from t1 where match a against ('000000');
 | 
						||
update t1 set a='aaazzz' where match a against ('000000');
 | 
						||
select count(*) from t1 where match a against ('aaaxxx' in boolean mode);
 | 
						||
select count(*) from t1 where match a against ('aaazzz' in boolean mode);
 | 
						||
update t1 set a='aaazzz' where a = 'aaaxxx';
 | 
						||
update t1 set a='aaaxxx' where a = 'aaayyy';
 | 
						||
select count(*) from t1 where match a against ('aaaxxx' in boolean mode);
 | 
						||
select count(*) from t1 where match a against ('aaayyy' in boolean mode);
 | 
						||
select count(*) from t1 where match a against ('aaazzz' in boolean mode);
 | 
						||
 | 
						||
drop table t1;
 | 
						||
 | 
						||
CREATE TABLE t1 (
 | 
						||
  i int(10) unsigned not null auto_increment primary key,
 | 
						||
  a varchar(255) not null,
 | 
						||
  FULLTEXT KEY (a)
 | 
						||
) ENGINE = INNODB;
 | 
						||
 | 
						||
#
 | 
						||
# now same as about but w/o repair table
 | 
						||
# 2-level tree created by mi_write
 | 
						||
#
 | 
						||
 | 
						||
# two-level entry, second-level tree with depth 2
 | 
						||
--disable_query_log
 | 
						||
let $1=260;
 | 
						||
while ($1)
 | 
						||
{
 | 
						||
  eval insert t1 (a) values ('aaaxxx');
 | 
						||
  dec $1;
 | 
						||
}
 | 
						||
let $1=255;
 | 
						||
while ($1)
 | 
						||
{
 | 
						||
  eval insert t1 (a) values ('aaazzz');
 | 
						||
  dec $1;
 | 
						||
}
 | 
						||
let $1=250;
 | 
						||
while ($1)
 | 
						||
{
 | 
						||
  eval insert t1 (a) values ('aaayyy');
 | 
						||
  dec $1;
 | 
						||
}
 | 
						||
--enable_query_log
 | 
						||
 | 
						||
select count(*) from t1 where match a against ('aaaxxx');
 | 
						||
select count(*) from t1 where match a against ('aaayyy');
 | 
						||
select count(*) from t1 where match a against ('aaazzz');
 | 
						||
select count(*) from t1 where match a against ('aaaxxx' in boolean mode);
 | 
						||
select count(*) from t1 where match a against ('aaayyy' in boolean mode);
 | 
						||
select count(*) from t1 where match a against ('aaazzz' in boolean mode);
 | 
						||
select count(*) from t1 where match a against ('aaaxxx aaayyy aaazzz');
 | 
						||
select count(*) from t1 where match a against ('aaaxxx aaayyy aaazzz' in boolean mode);
 | 
						||
 | 
						||
select count(*) from t1 where match a against ('aaax*' in boolean mode);
 | 
						||
select count(*) from t1 where match a against ('aaay*' in boolean mode);
 | 
						||
select count(*) from t1 where match a against ('aaa*' in boolean mode);
 | 
						||
 | 
						||
# mi_write:
 | 
						||
 | 
						||
insert t1 (a) values ('aaaxxx'),('aaayyy');
 | 
						||
insert t1 (a) values ('aaazzz'),('aaazzz'),('aaazzz'),('aaazzz'),('aaazzz');
 | 
						||
select count(*) from t1 where match a against ('aaaxxx');
 | 
						||
select count(*) from t1 where match a against ('aaayyy');
 | 
						||
select count(*) from t1 where match a against ('aaazzz');
 | 
						||
 | 
						||
# mi_delete
 | 
						||
insert t1 (a) values ('aaaxxx 000000');
 | 
						||
select count(*) from t1 where match a against ('000000');
 | 
						||
delete from t1 where match a against ('000000');
 | 
						||
select count(*) from t1 where match a against ('000000');
 | 
						||
select count(*) from t1 where match a against ('aaaxxx');
 | 
						||
delete from t1 where match a against ('aaazzz');
 | 
						||
select count(*) from t1 where match a against ('aaaxxx' in boolean mode);
 | 
						||
select count(*) from t1 where match a against ('aaayyy' in boolean mode);
 | 
						||
select count(*) from t1 where match a against ('aaazzz' in boolean mode);
 | 
						||
# double-check without index
 | 
						||
select count(*) from t1 where a = 'aaaxxx';
 | 
						||
select count(*) from t1 where a = 'aaayyy';
 | 
						||
select count(*) from t1 where a = 'aaazzz';
 | 
						||
 | 
						||
# update
 | 
						||
insert t1 (a) values ('aaaxxx 000000');
 | 
						||
select count(*) from t1 where match a against ('000000');
 | 
						||
update t1 set a='aaazzz' where match a against ('000000');
 | 
						||
select count(*) from t1 where match a against ('aaaxxx' in boolean mode);
 | 
						||
select count(*) from t1 where match a against ('aaazzz' in boolean mode);
 | 
						||
update t1 set a='aaazzz' where a = 'aaaxxx';
 | 
						||
update t1 set a='aaaxxx' where a = 'aaayyy';
 | 
						||
select count(*) from t1 where match a against ('aaaxxx' in boolean mode);
 | 
						||
select count(*) from t1 where match a against ('aaayyy' in boolean mode);
 | 
						||
select count(*) from t1 where match a against ('aaazzz' in boolean mode);
 | 
						||
drop table t1;
 | 
						||
 | 
						||
#
 | 
						||
# BUG#11336
 | 
						||
#
 | 
						||
# for uca collation isalnum and strnncollsp don't agree on whether
 | 
						||
# 0xC2A0 is a space (strnncollsp is right, isalnum is wrong).
 | 
						||
#
 | 
						||
# they still don't, the bug was fixed by avoiding strnncollsp
 | 
						||
#
 | 
						||
 | 
						||
set names utf8;
 | 
						||
eval create table t1(a text,fulltext(a)) ENGINE = INNODB collate=utf8_swedish_ci;
 | 
						||
insert into t1 values('test test '),('test'),('test'),('test'),
 | 
						||
('test'),('test'),('test'),('test'),('test'),('test'),('test'),('test'),
 | 
						||
('test'),('test'),('test'),('test'),('test'),('test'),('test'),('test'),
 | 
						||
('test'),('test'),('test'),('test'),('test'),('test'),('test'),('test'),
 | 
						||
('test'),('test'),('test'),('test'),('test'),('test'),('test'),('test'),
 | 
						||
('test'),('test'),('test'),('test'),('test'),('test'),('test'),('test'),
 | 
						||
('test'),('test'),('test'),('test'),('test'),('test'),('test'),('test'),
 | 
						||
('test'),('test'),('test'),('test'),('test'),('test'),('test'),('test'),
 | 
						||
('test'),('test'),('test'),('test'),('test'),('test'),('test'),('test'),
 | 
						||
('test'),('test'),('test'),('test'),('test'),('test'),('test'),('test'),
 | 
						||
('test'),('test'),('test'),('test'),('test'),('test'),('test'),('test'),
 | 
						||
('test'),('test'),('test'),('test'),('test'),('test'),('test'),('test'),
 | 
						||
('test'),('test'),('test'),('test'),('test'),('test'),('test'),('test'),
 | 
						||
('test'),('test'),('test'),('test'),('test'),('test'),('test'),('test'),
 | 
						||
('test'),('test'),('test'),('test'),('test'),('test'),('test'),('test'),
 | 
						||
('test'),('test'),('test'),('test'),('test'),('test'),('test'),('test');
 | 
						||
delete from t1 limit 1;
 | 
						||
 | 
						||
#
 | 
						||
# BUG#16489: utf8 + fulltext leads to corrupt index file.
 | 
						||
#
 | 
						||
if ($MTR_COMBINATION_ORIG)
 | 
						||
{
 | 
						||
truncate table t1;
 | 
						||
}
 | 
						||
if (!$MTR_COMBINATION_ORIG)
 | 
						||
{
 | 
						||
--disable_query_log
 | 
						||
delete from t1;
 | 
						||
--enable_query_log
 | 
						||
--echo truncate table t1;
 | 
						||
}
 | 
						||
insert into t1 values('ab c d');
 | 
						||
update t1 set a='ab c d';
 | 
						||
select * from t1 where match a against('ab c' in boolean mode);
 | 
						||
select * from t1 where match a against('ab	c' in boolean mode);
 | 
						||
drop table t1;
 | 
						||
set names latin1;
 | 
						||
 | 
						||
# End of 4.1 tests
 | 
						||
 | 
						||
#
 | 
						||
# BUG#19580 - FULLTEXT search produces wrong results on UTF-8 columns
 | 
						||
# INNODB_FTS: Investigate
 | 
						||
SET NAMES utf8;
 | 
						||
CREATE TABLE t1(a VARCHAR(255), FULLTEXT(a)) ENGINE = INNODB DEFAULT CHARSET=utf8;
 | 
						||
INSERT INTO t1 VALUES('„MySQL“');
 | 
						||
SELECT a FROM t1 WHERE MATCH a AGAINST('“MySQL„' IN BOOLEAN MODE);
 | 
						||
DROP TABLE t1;
 | 
						||
SET NAMES latin1;
 | 
						||
 | 
						||
#
 | 
						||
# Bug #20597981 - WRONG RELEVANCE RANKING FOR FULL TEXT SEARCHES
 | 
						||
# WHEN FTS_DOC_ID IS PRIMARY KEY
 | 
						||
CREATE TABLE t1 (
 | 
						||
  FTS_DOC_ID BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
 | 
						||
  id int(10) not null ,
 | 
						||
  first_name varchar(50) NOT NULL,
 | 
						||
  last_name varchar(50) NOT NULL,
 | 
						||
  PRIMARY KEY (FTS_DOC_ID),
 | 
						||
  UNIQUE KEY idx_1 (first_name, last_name),
 | 
						||
  FULLTEXT KEY `idx_2` (first_name)
 | 
						||
) ENGINE=InnoDB;
 | 
						||
 | 
						||
INSERT INTO t1 (id, first_name, last_name) VALUES
 | 
						||
(10, 'Bart', 'Simpson'),
 | 
						||
(11, 'Homer', 'Simpson'),
 | 
						||
(12, 'Marge', 'Simpson'),
 | 
						||
(13, 'Lisa', 'Simpson'),
 | 
						||
(14, 'Maggie', 'Simpson'),
 | 
						||
(15, 'Ned', 'Flanders'),
 | 
						||
(16, 'Nelson', 'Muntz');
 | 
						||
 | 
						||
analyze table t1;
 | 
						||
SELECT fts_doc_id, first_name, last_name, MATCH(first_name) AGAINST('Homer' IN BOOLEAN MODE) AS score FROM t1;
 | 
						||
DROP TABLE t1;
 | 
						||
 | 
						||
#
 | 
						||
# MDEV-28912  NON-UNIQUE FTS_DOC_ID mistaken as FTS_DOC_ID_INDEX
 | 
						||
#
 | 
						||
CREATE TABLE t1(a INT, b TEXT, FTS_DOC_ID BIGINT UNSIGNED NOT NULL,
 | 
						||
		KEY FTS_DOC_ID_INDEX(FTS_DOC_ID))ENGINE=InnoDB;
 | 
						||
ALTER TABLE t1 ADD COLUMN c INT as (a) VIRTUAL;
 | 
						||
ALTER TABLE t1 ADD d INT NULL;
 | 
						||
--error ER_INNODB_FT_WRONG_DOCID_INDEX
 | 
						||
ALTER TABLE t1 ADD FULLTEXT(b);
 | 
						||
DROP TABLE t1;
 | 
						||
 | 
						||
--echo #
 | 
						||
--echo # MDEV-29169 Using MATCH returns NULL for Virtual Column
 | 
						||
--echo #
 | 
						||
CREATE TABLE t (a TEXT DEFAULT NULL,
 | 
						||
                b TEXT AS (a),
 | 
						||
                c TEXT AS (concat(a, '1')),
 | 
						||
                d int AS (111) VIRTUAL,
 | 
						||
                FULLTEXT KEY `a` (`a`)
 | 
						||
) ENGINE=InnoDB;
 | 
						||
 | 
						||
INSERT INTO t (a) VALUES ('test');
 | 
						||
SELECT * FROM t;
 | 
						||
SELECT * FROM t WHERE MATCH(a) AGAINST('test');
 | 
						||
 | 
						||
DROP TABLE t;
 |