1#
2#   InnoDB FULLTEXT SEARCH: CJK support - ngram parser
3#
4#
5
6--source include/have_innodb.inc
7
8# Must have debug code to use SET DEBUG
9--source include/have_debug.inc
10# Embedded server does not support restarting
11--source include/not_embedded.inc
12
13# Enable diag print to print query parse tree
14SET GLOBAL innodb_ft_enable_diag_print = 1;
15
16-- echo # Test Case 1: Test English with Default(latin1) Charset
17# Ignore ngram token check for latin1.
18SET DEBUG="+d,fts_instrument_ignore_ngram_check";
19
20CREATE TABLE articles (
21	id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
22	title VARCHAR(200)
23	) ENGINE=InnoDB;
24
25ALTER TABLE articles ADD FULLTEXT INDEX (title) WITH PARSER ngram;
26
27INSERT INTO articles (title) VALUES
28  ('what is M'),
29  ('Myname is wonder'),
30  ('My SQL is good'),
31  ('MySQL database'),
32  ('Mind a good thing'),
33  ('Mind good idea');
34
35SELECT * FROM articles WHERE
36	MATCH(title) AGAINST('m*' IN BOOLEAN MODE);
37
38SELECT * FROM articles WHERE
39	MATCH(title) AGAINST('my*' IN BOOLEAN MODE);
40
41SELECT * FROM articles WHERE
42	MATCH(title) AGAINST('+mind -mysql' IN BOOLEAN MODE);
43
44SELECT * FROM articles WHERE
45	MATCH(title) AGAINST('+(mind thing) -idea' IN BOOLEAN MODE);
46
47SELECT * FROM articles WHERE
48	MATCH(title) AGAINST('mysql');
49
50SELECT * FROM articles WHERE
51	MATCH(title) AGAINST('mysql' IN BOOLEAN MODE);
52
53SELECT * FROM articles WHERE
54	MATCH(title) AGAINST('"mysql"' IN BOOLEAN MODE);
55
56SELECT * FROM articles WHERE
57	MATCH(title) AGAINST('"my sql"' IN BOOLEAN MODE);
58
59SET DEBUG="-d,fts_instrument_ignore_ngram_check";
60
61DROP TABLE articles;
62
63SET NAMES utf8;
64
65-- echo # Test Case 2: Test Stopwords
66# Compare with results without stopword check.
67SET DEBUG="+d,fts_instrument_ignore_ngram_check";
68
69# Without stopwords
70CREATE TABLE articles (
71	id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
72	title VARCHAR(200),
73	body TEXT
74	) ENGINE=InnoDB DEFAULT CHARACTER SET gb2312 COLLATE gb2312_chinese_ci;
75
76CREATE FULLTEXT INDEX ft_index ON articles(title, body) WITH PARSER ngram;
77
78INSERT INTO articles (title, body) VALUES
79  ('从简单购物清单到画展','或企业网络中的海量数据'),
80  ('要想将数据添加到数据库','访问、处理计算机数据库中保存的数据'),
81  ('从简单的购物清单到画展','或企业网络中的海量数据'),
82  ('要想将数据添加到数据库','或访问、处理计算机数据库中保存的数据'),
83  ('数据库是数据的结构化集合','它可以是任何东西');
84
85SELECT * FROM articles WHERE
86	MATCH(title, body) AGAINST('的* 或* 东西' IN BOOLEAN MODE);
87
88SELECT * FROM articles WHERE
89	MATCH(title, body) AGAINST('简单的' IN BOOLEAN MODE);
90
91SELECT * FROM articles WHERE
92	MATCH(title, body) AGAINST('或访问' IN BOOLEAN MODE);
93
94SELECT * FROM articles WHERE
95	MATCH(title, body) AGAINST('"数据的结构化"' IN BOOLEAN MODE);
96
97SET DEBUG="-d,fts_instrument_ignore_ngram_check";
98
99DROP TABLE articles;
100
101# With Stopwords
102CREATE TABLE articles (
103	id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
104	title VARCHAR(200),
105	body TEXT
106	) ENGINE=InnoDB DEFAULT CHARACTER SET gb2312 COLLATE gb2312_chinese_ci;
107
108# Define a user stopword table and set to it
109CREATE TABLE user_stopword(value varchar(30)) ENGINE = InnoDB
110	DEFAULT CHARACTER SET gb2312 COLLATE gb2312_chinese_ci;
111
112INSERT INTO user_stopword VALUES('的'),('或'),('东西'),('ab');
113
114SET GLOBAL innodb_ft_server_stopword_table = 'test/user_stopword';
115
116INSERT INTO articles (title, body) VALUES
117  ('从简单购物清单到画展','或企业网络中的海量数据'),
118  ('要想将数据添加到数据库','访问、处理计算机数据库中保存的数据');
119
120CREATE FULLTEXT INDEX ft_index ON articles(title, body) WITH PARSER ngram;
121
122INSERT INTO articles (title, body) VALUES
123  ('从简单的购物清单到画展','或企业网络中的海量数据'),
124  ('要想将数据添加到数据库','或访问、处理计算机数据库中保存的数据'),
125  ('要想将数据添加到数据库','或访问、处理计算机数据库中保存的数据 abc xyz'),
126  ('数据库是数据的结构化集合','它可以是任何东西');
127
128SELECT * FROM articles WHERE
129	MATCH(title, body) AGAINST('的* 或* 东西' IN BOOLEAN MODE);
130
131SELECT * FROM articles WHERE
132	MATCH(title, body) AGAINST('简单的' IN BOOLEAN MODE);
133
134SELECT * FROM articles WHERE
135	MATCH(title, body) AGAINST('或访问' IN BOOLEAN MODE);
136
137SELECT * FROM articles WHERE
138	MATCH(title, body) AGAINST('"数据的结构化"' IN BOOLEAN MODE);
139
140SELECT * FROM user_stopword WHERE value like 'ab' ;
141SELECT * FROM articles WHERE
142	MATCH(title, body) AGAINST('"ab"' );
143SELECT * FROM articles WHERE
144	MATCH(title, body) AGAINST('数据 +ab' IN BOOLEAN MODE);
145SELECT * FROM articles WHERE
146	MATCH(title, body) AGAINST('数据 (+xyz -bc)' IN BOOLEAN MODE);
147
148DROP TABLE user_stopword;
149DROP TABLE articles;
150SET GLOBAL innodb_ft_server_stopword_table=default;
151
152-- echo # Test Case 3: Check with FTS debug points
153CREATE TABLE articles (
154        seq INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
155        c1 VARCHAR(200) CHARACTER SET big5 COLLATE big5_chinese_ci,
156        c2 CHAR(200) CHARACTER SET gbk COLLATE gbk_chinese_ci,
157        c3 CHAR(200) CHARACTER SET utf8,
158        j1 TEXT CHARACTER SET ujis COLLATE ujis_japanese_ci,
159        j2 VARCHAR(200) CHARACTER SET sjis COLLATE sjis_japanese_ci,
160        j3 VARCHAR(200) CHARACTER SET ujis,
161        k1 CHAR(200) CHARACTER SET euckr COLLATE euckr_korean_ci,
162        k2 CHAR(200) CHARACTER SET utf8,
163        e1 CHAR(200) CHARACTER SET latin1,
164        FULLTEXT KEY `con1` (c1),
165        FULLTEXT KEY `con2` (j1,j3),
166        FULLTEXT KEY `con3` (k2) WITH PARSER ngram
167        ) ENGINE=InnoDB ;
168SET DEBUG='+d,alter_table_rollback_new_index';
169-- error ER_UNKNOWN_ERROR
170ALTER TABLE articles ADD FULLTEXT INDEX (c2(64));
171-- error ER_UNKNOWN_ERROR
172ALTER TABLE articles ADD FULLTEXT INDEX (j1,j3);
173-- error ER_UNKNOWN_ERROR
174ALTER TABLE articles ADD FULLTEXT INDEX (k1);
175-- error ER_UNKNOWN_ERROR
176ALTER TABLE articles ADD FULLTEXT INDEX (e1);
177SET DEBUG='-d,alter_table_rollback_new_index';
178
179# Abort the operation in dict_create_index_step by setting
180# return status of dict_create_index_tree_step() to DB_OUT_OF_MEMORY
181# The newly create dict_index_t should be removed from fts cache
182SET DEBUG="+d,ib_dict_create_index_tree_fail";
183--error ER_OUT_OF_RESOURCES
184ALTER TABLE articles ADD FULLTEXT INDEX (c2(64));
185--error ER_OUT_OF_RESOURCES
186ALTER TABLE articles ADD FULLTEXT INDEX (j1,j3);
187--error ER_OUT_OF_RESOURCES
188ALTER TABLE articles ADD FULLTEXT INDEX (k1);
189--error ER_OUT_OF_RESOURCES
190ALTER TABLE articles ADD FULLTEXT INDEX (e1);
191SET DEBUG="-d,ib_dict_create_index_tree_fail";
192
193--error ER_INNODB_FT_LIMIT
194ALTER TABLE articles ADD FULLTEXT INDEX (e1), ADD FULLTEXT INDEX (k1);
195DROP TABLE articles;
196
197SET GLOBAL innodb_ft_enable_diag_print = default;
198