mariadb/mysql-test/suite
Yuchen Pei 8cdee25952
MDEV-36132 Substitute vcol expressions with indexed vcol fields in ORDER BY and GROUP BY
Also expand vcol field index coverings to include indexes covering all
the fields in the expression. The reasoning goes as follows: let f(c1,
c2, ..., cn) be a function on applied to columns c1, c2, ..., cn, if
f(...) is covered by an index, so should vc whose expression is
f(...).

For example, if t.vf = t.c1 + t.c2, and t has three indexes (vf), (c1,
c2), (c1).

Before this change, vf's index covering is a singleton {(vf)}. Let's call
that the "conventional" index covering.

After this change vf's index covering is now {(vf), (c1, c2)}, since
(c1, c2) covers both c1 and c2. Let's call (c1, c2) in this case the
"extra" covering.

With the coverings updated, when an index in the "extra" covering is
chosen for keyread, the vcol also needs to be calculated. In this case
we mark vcol in the table read_set, and ensure it is computed.

With these changes, we see various improvements, including from using
full table scan + filesort to full index scan + filesort when ORDER BY
an indexed vcol (here vc = c + 1 is a vcol and both c and vc are
indexes):

 explain select c + 1 from t order by vc;
 id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
-1	SIMPLE	t	ALL	NULL	NULL	NULL	NULL	10000	Using filesort
+1	SIMPLE	t	index	NULL	c	5	NULL	10000	Using index; Using filesort

The substitutions are followed updates to all_fields which include a
copy of the ORDER BY/GROUP BY item pointers, as well as corresponding
updates to ref_pointer_array so that the all_fields and
ref_pointer_array remain in sync.

Another, related change is the recomputation of table index covering
on substitutions. It not only reflects the correct table index
covering after the substitutions, but also improve executions where
the vcol index can be chosen, such as this example (here vc = c + 1
and vc is the only index in the table), from full table scan +
filesort to full index scan:

select vc from t order by c + 1;

We do it in SELECT as well as in single table DELETE/UPDATE.
2025-07-22 10:44:12 +10:00
..
archive Merge remote-tracking branch 'github/bb-11.4-release' into bb-11.8-serg 2025-04-27 19:40:00 +02:00
atomic Fix the test: changing charset should be dome when we can not skip the test. 2025-05-09 07:36:15 +02:00
binlog MDEV-35617: DROP USER should leave no active session for that user 2025-07-16 09:14:33 +07:00
binlog_encryption MDEV-35617: DROP USER should leave no active session for that user 2025-07-16 09:14:33 +07:00
client Fix typos in mysql-test/ 2025-04-29 13:53:16 +10:00
compat mariadb-test: wait on disconnect 2025-07-16 09:14:33 +07:00
csv mariadb-test: wait on disconnect 2025-07-16 09:14:33 +07:00
encryption mariadb-test: wait on disconnect 2025-07-16 09:14:33 +07:00
engines MDEV-35617: DROP USER should leave no active session for that user 2025-07-16 09:14:33 +07:00
events MDEV-35617: DROP USER should leave no active session for that user 2025-07-16 09:14:33 +07:00
federated MDEV-35617: DROP USER should leave no active session for that user 2025-07-16 09:14:33 +07:00
funcs_1 cleanup: disconnect before DROP USER 2025-07-16 09:14:33 +07:00
funcs_2 Merge 11.4 into 11.8 2025-04-02 14:07:01 +03:00
galera MDEV-35617: DROP USER should leave no active session for that user 2025-07-16 09:14:33 +07:00
galera_3nodes Merge branch '11.8' into 12.0 2025-06-18 07:50:39 +02:00
galera_3nodes_sr Merge 11.4 into 11.8 2025-04-02 14:07:01 +03:00
galera_sr Fix typos in mysql-test/ 2025-04-29 13:53:16 +10:00
gcol MDEV-36132 Substitute vcol expressions with indexed vcol fields in ORDER BY and GROUP BY 2025-07-22 10:44:12 +10:00
handler mariadb-test: wait on disconnect 2025-07-16 09:14:33 +07:00
heap Merge branch '11.4' into 11.7 2025-02-06 16:46:36 +01:00
innodb cleanup: disconnect before DROP USER 2025-07-16 09:14:33 +07:00
innodb_fts mariadb-test: wait on disconnect 2025-07-16 09:14:33 +07:00
innodb_gis mariadb-test: wait on disconnect 2025-07-16 09:14:33 +07:00
innodb_i_s
innodb_zip Fix typos in mysql-test/ 2025-04-29 13:53:16 +10:00
jp Fix typos in mysql-test/ 2025-04-29 13:53:16 +10:00
json Merge branch '11.8' into 12.0 2025-05-22 09:22:55 +02:00
large_tests
maria MDEV-24 Segmented key cache for Aria 2025-06-25 17:59:45 +03:00
mariabackup mariadb-test: wait on disconnect 2025-07-16 09:14:33 +07:00
merge mariadb-test: wait on disconnect 2025-07-16 09:14:33 +07:00
mtr/t Remove dates from all rdiff files 2025-01-05 16:40:11 +02:00
mtr2
multi_source MDEV-35304: Fix multi_source.connects_tried 2025-04-29 11:00:37 -06:00
optimizer_unfixed_bugs
parts Fix typos in mysql-test/ 2025-04-29 13:53:16 +10:00
perfschema cleanup: disconnect before DROP USER 2025-07-16 09:14:33 +07:00
perfschema_stress remove features that were deprecated in 10.5 2025-04-29 16:53:02 +02:00
period Fix typos in mysql-test/ 2025-04-29 13:53:16 +10:00
plugins MDEV-35617: DROP USER should leave no active session for that user 2025-07-16 09:14:33 +07:00
roles MDEV-35617: DROP USER should leave no active session for that user 2025-07-16 09:14:33 +07:00
rpl MDEV-35617: DROP USER should leave no active session for that user 2025-07-16 09:14:33 +07:00
s3 Merge branch '11.8' into 12.0 2025-06-18 07:50:39 +02:00
sql_sequence cleanup: disconnect before DROP USER 2025-07-16 09:14:33 +07:00
storage_engine mariadb-test: wait on disconnect 2025-07-16 09:14:33 +07:00
stress MDEV-34453 Trying to read 16384 bytes at 70368744161280 outside the bounds of the file: ./ibdata1 2024-09-20 20:26:43 +05:30
sys_vars cleanup: disconnect before DROP USER 2025-07-16 09:14:33 +07:00
sysschema MDEV-34888 Implement SEMIJOIN() and SUBQUERY() hints 2025-05-05 12:02:47 +07:00
unit
vcol MDEV-36132 Substitute vcol expressions with indexed vcol fields in ORDER BY and GROUP BY 2025-07-22 10:44:12 +10:00
versioning cleanup: disconnect before DROP USER 2025-07-16 09:14:33 +07:00
wsrep Fix typos in mysql-test/ 2025-04-29 13:53:16 +10:00