Skip to content

Commit d3452c7

Browse files
MDEV-40168 [wip] Add multi valued index over fulltext
TODOs on top of those in the patch diff: - EXPLAIN output should not say fulltext - check type match to avoid false negative / positive bugs in mysql - transcode the value into the index charset in mvi_encode_key
1 parent 5818146 commit d3452c7

20 files changed

Lines changed: 625 additions & 34 deletions

libmysqld/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ SET(SQL_EMBEDDED_SOURCES emb_qcache.cc libmysqld.c lib_sql.cc
7272
../sql/mf_iocache.cc ../sql/my_decimal.cc
7373
../sql/net_serv.cc ../sql/opt_range.cc
7474
../sql/opt_group_by_cardinality.cc
75+
../sql/opt_multi_valued_index.cc
7576
../sql/opt_rewrite_date_cmp.cc
7677
../sql/opt_rewrite_remove_casefold.cc
7778
../sql/opt_sargable_left.cc
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
--innodb_ft_index_cache
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
# basic test
2+
SET SESSION debug = '+d,test_invisible_index,test_completely_invisible';
3+
create table t1 (c int, j json, key idx ((CAST(j->'$.tags' AS CHAR(6) ARRAY))))engine=innodb;
4+
SHOW CREATE TABLE t1;
5+
Table Create Table
6+
t1 CREATE TABLE `t1` (
7+
`c` int(11) DEFAULT NULL,
8+
`j` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL CHECK (json_valid(`j`))
9+
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci
10+
show index from t1;
11+
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment Ignored
12+
t1 1 invisible1 1 invisible1 A 0 NULL NULL YES BTREE NO
13+
t1 1 idx 1 DB_MVI_1 NULL NULL NULL NULL YES FULLTEXT NO
14+
set @old_innodb_ft_aux_table=@@global.innodb_ft_aux_table;
15+
set global innodb_ft_aux_table='test/t1';
16+
insert into t1 values (1, '{"tags": [1, "abcde", "34567", "", 34567]}');
17+
SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHE;
18+
WORD FIRST_DOC_ID LAST_DOC_ID DOC_COUNT DOC_ID POSITION
19+
31xx 1 1 1 1 0
20+
3334353637 1 1 1 1 16
21+
3334353637 1 1 1 1 16
22+
6162636465 1 1 1 1 5
23+
xxxx 1 1 1 1 27
24+
select json_contains(j->'$.tags', '"abcde"') from t1;
25+
json_contains(j->'$.tags', '"abcde"')
26+
1
27+
explain
28+
select * from t1 where json_contains(j->'$.tags', '"abcde"');
29+
id select_type table type possible_keys key key_len ref rows Extra
30+
1 SIMPLE t1 fulltext idx idx 0 1 Using where
31+
select * from t1 where json_contains(j->'$.tags', '"abcde"');
32+
c j
33+
1 {"tags": [1, "abcde", "34567", "", 34567]}
34+
DROP TABLE t1;
35+
set global innodb_ft_aux_table=@old_innodb_ft_aux_table;
36+
# direct call of mvi_encode
37+
select mvi_encode('[1, 42, "3"]', int);
38+
mvi_encode('[1, 42, "3"]', int)
39+
8000000000000001 800000000000002a 8000000000000003
40+
select mvi_encode('[1, 42, "3"]', unsigned);
41+
mvi_encode('[1, 42, "3"]', unsigned)
42+
0000000000000001 000000000000002a 0000000000000003
43+
select mvi_encode('[1, 42, "3 "]', char(6));
44+
mvi_encode('[1, 42, "3 "]', char(6))
45+
31xx 3432 33xx
46+
select mvi_encode('[1, 42, " "]', char(6));
47+
mvi_encode('[1, 42, " "]', char(6))
48+
31xx 3432 xxxx
49+
select mvi_encode('[1, 42, "3 "]', binary(6));
50+
mvi_encode('[1, 42, "3 "]', binary(6))
51+
31xx 3432 33xx
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
--source include/have_innodb.inc
2+
3+
--echo # basic test
4+
SET SESSION debug = '+d,test_invisible_index,test_completely_invisible';
5+
6+
create table t1 (c int, j json, key idx ((CAST(j->'$.tags' AS CHAR(6) ARRAY))))engine=innodb;
7+
SHOW CREATE TABLE t1;
8+
show index from t1;
9+
10+
set @old_innodb_ft_aux_table=@@global.innodb_ft_aux_table;
11+
set global innodb_ft_aux_table='test/t1';
12+
13+
insert into t1 values (1, '{"tags": [1, "abcde", "34567", "", 34567]}');
14+
15+
SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHE;
16+
17+
select json_contains(j->'$.tags', '"abcde"') from t1;
18+
explain
19+
select * from t1 where json_contains(j->'$.tags', '"abcde"');
20+
select * from t1 where json_contains(j->'$.tags', '"abcde"');
21+
22+
DROP TABLE t1;
23+
24+
set global innodb_ft_aux_table=@old_innodb_ft_aux_table;
25+
26+
--echo # direct call of mvi_encode
27+
select mvi_encode('[1, 42, "3"]', int);
28+
select mvi_encode('[1, 42, "3"]', unsigned);
29+
select mvi_encode('[1, 42, "3 "]', char(6));
30+
select mvi_encode('[1, 42, " "]', char(6));
31+
select mvi_encode('[1, 42, "3 "]', binary(6));

mysql-test/suite/perfschema/r/digest_view.result

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -191,17 +191,17 @@ SELECT SCHEMA_NAME, DIGEST, DIGEST_TEXT, COUNT_STAR
191191
FROM performance_schema.events_statements_summary_by_digest
192192
ORDER BY DIGEST_TEXT;
193193
SCHEMA_NAME DIGEST DIGEST_TEXT COUNT_STAR
194-
test cc5e38c5a702f49627052e59a2603818 EXPLAIN SELECT * FROM `test` . `v1` 1
195-
test 264b69debfd30bbfe374cdca018fa4f9 EXPLAIN SELECT * FROM `test` . `v1` WHERE `a` = ? 1
196-
test 75f31bf60b75a4f851ff9c9ee4e19d96 EXPLAIN SELECT * FROM `test` . `v1` WHERE `b` > ? 1
197-
test a8f8a85697afacda9f2f3d3b023f9ed0 EXPLAIN SELECT `a` , `b` FROM `test` . `v1` 1
198-
test 512598992d37826136f3f1292bb32e1e EXPLAIN SELECT `b` , `a` FROM `test` . `v1` 1
199-
test 54342cc19df16ce54b3ba43d1fd7552d SELECT * FROM `test` . `v1` 1
200-
test 3750b7d8c33e040b90a2cdccb4c642a3 SELECT * FROM `test` . `v1` WHERE `a` = ? 1
201-
test 94af70ef76a31364845f534863d99da8 SELECT * FROM `test` . `v1` WHERE `b` > ? 1
202-
test 0c87d86b62e664a81a23d4f176fbb377 SELECT `a` , `b` FROM `test` . `v1` 1
203-
test de7e6f1350ff14a952b97b373d76c1a4 SELECT `b` , `a` FROM `test` . `v1` 1
204-
test 3468091e6d6ce474aded20beaec36b53 TRUNCATE TABLE `performance_schema` . `events_statements_summary_by_digest` 1
194+
test 983c118738efc2378bb2a15495c7e6c9 EXPLAIN SELECT * FROM `test` . `v1` 1
195+
test f34ab36bba7121e7953b5c6ca8f58e11 EXPLAIN SELECT * FROM `test` . `v1` WHERE `a` = ? 1
196+
test ee2356b394246ac8b7fc5faa97b0c1ad EXPLAIN SELECT * FROM `test` . `v1` WHERE `b` > ? 1
197+
test 3e70e03c91932264badade3cb1f2e66e EXPLAIN SELECT `a` , `b` FROM `test` . `v1` 1
198+
test 021f3cff6701828a7f017af34d29ce1c EXPLAIN SELECT `b` , `a` FROM `test` . `v1` 1
199+
test d2e11df922514a25243fc04ebf839825 SELECT * FROM `test` . `v1` 1
200+
test c967f871a7c1bc86a7667b83a17ca6e1 SELECT * FROM `test` . `v1` WHERE `a` = ? 1
201+
test 7c87fc30bf915208e69006449a702b7a SELECT * FROM `test` . `v1` WHERE `b` > ? 1
202+
test 258f5bff705a10fe1c43fd25c29c61fd SELECT `a` , `b` FROM `test` . `v1` 1
203+
test 518f87edc2c96f2b022d6ab3c767df7b SELECT `b` , `a` FROM `test` . `v1` 1
204+
test d972cde0f9bbec28c84e4dcca8ef3281 TRUNCATE TABLE `performance_schema` . `events_statements_summary_by_digest` 1
205205
DROP TABLE test.v1;
206206
CREATE VIEW test.v1 AS SELECT * FROM test.t1;
207207
EXPLAIN SELECT * from test.v1;
@@ -248,19 +248,19 @@ SELECT SCHEMA_NAME, DIGEST, DIGEST_TEXT, COUNT_STAR
248248
FROM performance_schema.events_statements_summary_by_digest
249249
ORDER BY DIGEST_TEXT;
250250
SCHEMA_NAME DIGEST DIGEST_TEXT COUNT_STAR
251-
test ef8b10f452e117fa96af49687a93a10f CREATE VIEW `test` . `v1` AS SELECT * FROM `test` . `t1` 1
252-
test 6b99f4d2ad410f9fa4ee1d501b0db571 DROP TABLE `test` . `v1` 1
253-
test cc5e38c5a702f49627052e59a2603818 EXPLAIN SELECT * FROM `test` . `v1` 2
254-
test 264b69debfd30bbfe374cdca018fa4f9 EXPLAIN SELECT * FROM `test` . `v1` WHERE `a` = ? 2
255-
test 75f31bf60b75a4f851ff9c9ee4e19d96 EXPLAIN SELECT * FROM `test` . `v1` WHERE `b` > ? 2
256-
test a8f8a85697afacda9f2f3d3b023f9ed0 EXPLAIN SELECT `a` , `b` FROM `test` . `v1` 2
257-
test 512598992d37826136f3f1292bb32e1e EXPLAIN SELECT `b` , `a` FROM `test` . `v1` 2
258-
test 54342cc19df16ce54b3ba43d1fd7552d SELECT * FROM `test` . `v1` 2
259-
test 3750b7d8c33e040b90a2cdccb4c642a3 SELECT * FROM `test` . `v1` WHERE `a` = ? 2
260-
test 94af70ef76a31364845f534863d99da8 SELECT * FROM `test` . `v1` WHERE `b` > ? 2
261-
test 187a846fafe04b746eddaaab80b6a766 SELECT SCHEMA_NAME , `DIGEST` , `DIGEST_TEXT` , `COUNT_STAR` FROM `performance_schema` . `events_statements_summary_by_digest` ORDER BY `DIGEST_TEXT` 1
262-
test 0c87d86b62e664a81a23d4f176fbb377 SELECT `a` , `b` FROM `test` . `v1` 2
263-
test de7e6f1350ff14a952b97b373d76c1a4 SELECT `b` , `a` FROM `test` . `v1` 2
264-
test 3468091e6d6ce474aded20beaec36b53 TRUNCATE TABLE `performance_schema` . `events_statements_summary_by_digest` 1
251+
test bd4716657502ce7922d2ed7e20043b76 CREATE VIEW `test` . `v1` AS SELECT * FROM `test` . `t1` 1
252+
test 2d14a4845ee825e3a1a21bd5799cba3c DROP TABLE `test` . `v1` 1
253+
test 983c118738efc2378bb2a15495c7e6c9 EXPLAIN SELECT * FROM `test` . `v1` 2
254+
test f34ab36bba7121e7953b5c6ca8f58e11 EXPLAIN SELECT * FROM `test` . `v1` WHERE `a` = ? 2
255+
test ee2356b394246ac8b7fc5faa97b0c1ad EXPLAIN SELECT * FROM `test` . `v1` WHERE `b` > ? 2
256+
test 3e70e03c91932264badade3cb1f2e66e EXPLAIN SELECT `a` , `b` FROM `test` . `v1` 2
257+
test 021f3cff6701828a7f017af34d29ce1c EXPLAIN SELECT `b` , `a` FROM `test` . `v1` 2
258+
test d2e11df922514a25243fc04ebf839825 SELECT * FROM `test` . `v1` 2
259+
test c967f871a7c1bc86a7667b83a17ca6e1 SELECT * FROM `test` . `v1` WHERE `a` = ? 2
260+
test 7c87fc30bf915208e69006449a702b7a SELECT * FROM `test` . `v1` WHERE `b` > ? 2
261+
test aa329bcb29afc39d9793e4fd6e108722 SELECT SCHEMA_NAME , `DIGEST` , `DIGEST_TEXT` , `COUNT_STAR` FROM `performance_schema` . `events_statements_summary_by_digest` ORDER BY `DIGEST_TEXT` 1
262+
test 258f5bff705a10fe1c43fd25c29c61fd SELECT `a` , `b` FROM `test` . `v1` 2
263+
test 518f87edc2c96f2b022d6ab3c767df7b SELECT `b` , `a` FROM `test` . `v1` 2
264+
test d972cde0f9bbec28c84e4dcca8ef3281 TRUNCATE TABLE `performance_schema` . `events_statements_summary_by_digest` 1
265265
DROP VIEW test.v1;
266266
DROP TABLE test.t1;

mysql-test/suite/perfschema/r/start_server_low_digest_sql_length.result

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,5 @@ SELECT 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
88
####################################
99
SELECT event_name, digest, digest_text, sql_text FROM events_statements_history_long;
1010
event_name digest digest_text sql_text
11-
statement/sql/select c9e142fe40c43498607ca5310e11d2ce SELECT ? + ? + SELECT ...
12-
statement/sql/truncate 506e3496d92689cd2367329dc7725165 TRUNCATE TABLE truncat...
11+
statement/sql/select 3e19ece73d286977122b52fb027c180c SELECT ? + ? + SELECT ...
12+
statement/sql/truncate 7ab36a94986dd98b93370b025166a946 TRUNCATE TABLE truncat...

sql/CMakeLists.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,6 @@ SET (SQL_SOURCE
122122
opt_rewrite_remove_casefold.cc
123123
opt_sargable_left.cc
124124
opt_sum.cc
125-
opt_vcol_substitution.cc
126125
../sql-common/pack.c parse_file.cc password.c procedure.cc
127126
protocol.cc records.cc repl_failsafe.cc rpl_filter.cc
128127
session_tracker.cc
@@ -199,6 +198,8 @@ SET (SQL_SOURCE
199198
json_table.cc
200199
proxy_protocol.cc backup.cc xa.cc
201200
socketpair.c socketpair.h
201+
opt_multi_valued_index.h
202+
opt_multi_valued_index.cc
202203
opt_vcol_substitution.h
203204
opt_vcol_substitution.cc
204205
opt_hints_parser.cc opt_hints_parser.h scan_char.h

sql/item.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2859,6 +2859,11 @@ class Item :public Value_source,
28592859
DBUG_ASSERT(fixed());
28602860
return false;
28612861
}
2862+
virtual Item *create_ft_for_mvi(THD *thd, List<Field> *vcol_fields)
2863+
{
2864+
return NULL;
2865+
}
2866+
28622867

28632868
protected:
28642869
/*

sql/item_func.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,8 @@ class Item_func :public Item_func_or_sum
109109
JSON_EXTRACT_FUNC, JSON_VALID_FUNC, ROWNUM_FUNC,
110110
CASE_SEARCHED_FUNC, // Used by ColumnStore/Spider
111111
CASE_SIMPLE_FUNC, // Used by ColumnStore/spider,
112-
DATE_FUNC, YEAR_FUNC, SUBSTR_FUNC, LEFT_FUNC
112+
DATE_FUNC, YEAR_FUNC, SUBSTR_FUNC, LEFT_FUNC,
113+
MVI_ENCODE_FUNC
113114
};
114115

115116
/*

sql/item_jsonfunc.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,7 @@ class Item_func_json_contains: public Item_bool_func
376376
}
377377
bool fix_length_and_dec(THD *thd) override;
378378
bool val_bool() override;
379+
Item *create_ft_for_mvi(THD *thd, List<Field> *vcol_fields) override;
379380

380381
protected:
381382
Item *shallow_copy(THD *thd) const override

0 commit comments

Comments
 (0)