Skip to content

Commit

Permalink
MySQL bypass change #2 - SELECT parsing
Browse files Browse the repository at this point in the history
Summary:
This is change #2 that ports the SELECT statement parsing from feature-myrocks-bypass branch, including:

1. select_parser class that parses SELECT statements and validates the scenarios are supported, and error with proper message if not supported
2. You can control bypass policy with rocksdb_select_bypass_policy variable = 0 (ALWAYS OFF) / 1 (ALWAYS ON) / 2 (OPT IN) / 3 (OPT OUT).
3. A few metrics for number of SELECT bypass statements executed/rejected (due to not supported) /failed (something wrong in execution)

At this point this only dumps the SELECT statement parsed results without doing anything useful. The next change will be porting the query plan execution and point/range query execution part.

Please ignore the unused attributes for now - they'll be removed in next change once the execution part is ported.

Test Plan:
1. Run all tests
2. bypass_select_basic is updated to include testing for 4 policies
3. bypass_select_unsupported is added for validating unsupported scenarios are indeed unsupported

Reviewers: luqun, herman, bintong, mung, #mysql_eng

Reviewed By: luqun

Subscribers: butterflybot, zhichengzhu, ritwikyadav, vinaybhat, [email protected]

Differential Revision: https://phabricator.intern.facebook.com/D15491834

Signature: 15491834:1564726573:45b9a764fd3090a1ab5fab1703ae7546bdd21d2b
  • Loading branch information
yizhang82 committed Aug 5, 2019
1 parent 61c3761 commit e79b20a
Show file tree
Hide file tree
Showing 20 changed files with 2,399 additions and 604 deletions.
15 changes: 15 additions & 0 deletions mysql-test/r/mysqld--help-notwin-profiling.result
Original file line number Diff line number Diff line change
Expand Up @@ -1522,6 +1522,17 @@ The following options may be given as the first argument:
--rocksdb-seconds-between-stat-computes=#
Sets a number of seconds to wait between optimizer stats
recomputation. Only changed indexes will be refreshed.
--rocksdb-select-bypass-fail-unsupported
Select bypass would fail for unsupported SELECT commands
(Defaults to on; use --skip-rocksdb-select-bypass-fail-unsupported to disable.)
--rocksdb-select-bypass-log-failed
Log failed SELECT bypass queries
--rocksdb-select-bypass-log-rejected
Log rejected SELECT bypass queries
(Defaults to on; use --skip-rocksdb-select-bypass-log-rejected to disable.)
--rocksdb-select-bypass-policy=#
Change bypass SELECT related policy and allow directly
talk to RocksDB
--rocksdb-signal-drop-index-thread
Wake up drop index thread
--rocksdb-sim-cache-size=#
Expand Down Expand Up @@ -2428,6 +2439,10 @@ rocksdb-records-in-range 0
rocksdb-reset-stats FALSE
rocksdb-rollback-on-timeout FALSE
rocksdb-seconds-between-stat-computes 3600
rocksdb-select-bypass-fail-unsupported TRUE
rocksdb-select-bypass-log-failed FALSE
rocksdb-select-bypass-log-rejected TRUE
rocksdb-select-bypass-policy 0
rocksdb-signal-drop-index-thread FALSE
rocksdb-sim-cache-size 0
rocksdb-skip-bloom-filter-on-read FALSE
Expand Down
15 changes: 15 additions & 0 deletions mysql-test/r/mysqld--help-notwin.result
Original file line number Diff line number Diff line change
Expand Up @@ -1520,6 +1520,17 @@ The following options may be given as the first argument:
--rocksdb-seconds-between-stat-computes=#
Sets a number of seconds to wait between optimizer stats
recomputation. Only changed indexes will be refreshed.
--rocksdb-select-bypass-fail-unsupported
Select bypass would fail for unsupported SELECT commands
(Defaults to on; use --skip-rocksdb-select-bypass-fail-unsupported to disable.)
--rocksdb-select-bypass-log-failed
Log failed SELECT bypass queries
--rocksdb-select-bypass-log-rejected
Log rejected SELECT bypass queries
(Defaults to on; use --skip-rocksdb-select-bypass-log-rejected to disable.)
--rocksdb-select-bypass-policy=#
Change bypass SELECT related policy and allow directly
talk to RocksDB
--rocksdb-signal-drop-index-thread
Wake up drop index thread
--rocksdb-sim-cache-size=#
Expand Down Expand Up @@ -2425,6 +2436,10 @@ rocksdb-records-in-range 0
rocksdb-reset-stats FALSE
rocksdb-rollback-on-timeout FALSE
rocksdb-seconds-between-stat-computes 3600
rocksdb-select-bypass-fail-unsupported TRUE
rocksdb-select-bypass-log-failed FALSE
rocksdb-select-bypass-log-rejected TRUE
rocksdb-select-bypass-policy 0
rocksdb-signal-drop-index-thread FALSE
rocksdb-sim-cache-size 0
rocksdb-skip-bloom-filter-on-read FALSE
Expand Down
557 changes: 283 additions & 274 deletions mysql-test/suite/rocksdb/r/bypass_select_basic.result

Large diffs are not rendered by default.

557 changes: 283 additions & 274 deletions mysql-test/suite/rocksdb/r/bypass_select_basic_bloom.result

Large diffs are not rendered by default.

277 changes: 277 additions & 0 deletions mysql-test/suite/rocksdb/r/bypass_select_unsupported.result
Original file line number Diff line number Diff line change
@@ -0,0 +1,277 @@
SELECT @@rocksdb_select_bypass_policy;
@@rocksdb_select_bypass_policy
0
SELECT @@rocksdb_select_bypass_policy into @save_rocksdb_select_bypass_policy;
set global rocksdb_select_bypass_policy=2;
SELECT @@rocksdb_select_bypass_policy;
@@rocksdb_select_bypass_policy
2
create table t1 (pk INT PRIMARY KEY, a INT, b INT, c INT, KEY a (a, b, c))
ENGINE=ROCKSDB;
create table t2 (pk INT PRIMARY KEY, a INT, b INT, c INT, KEY a (a, b, c))
ENGINE=ROCKSDB;
create table t3 (pk INT PRIMARY KEY, a INT, b INT, c VARCHAR(15) CHARACTER SET latin1, KEY a (a, b))
ENGINE=ROCKSDB;
SELECT @@rocksdb_select_bypass_fail_unsupported;
@@rocksdb_select_bypass_fail_unsupported
1
SELECT @@rocksdb_select_bypass_fail_unsupported into @save_fail_unsupported;
set global rocksdb_select_bypass_fail_unsupported=true;
SELECT @@rocksdb_select_bypass_fail_unsupported;
@@rocksdb_select_bypass_fail_unsupported
1
SELECT /*+ bypass */ pk from t1 WHERE pk=1 having pk=1;
ERROR 42000: SELECT statement pattern not supported: HAVING not supported
SHOW STATUS LIKE 'rocksdb_select_bypass%';
Variable_name Value
rocksdb_select_bypass_executed 0
rocksdb_select_bypass_failed 0
rocksdb_select_bypass_rejected 1
SELECT /*+ bypass */ pk from t1 WHERE pk=1 group by pk;
ERROR 42000: SELECT statement pattern not supported: GROUP BY not supported
SHOW STATUS LIKE 'rocksdb_select_bypass%';
Variable_name Value
rocksdb_select_bypass_executed 0
rocksdb_select_bypass_failed 0
rocksdb_select_bypass_rejected 2
SELECT /*+ bypass */ * from t1 WHERE pk=1;
ERROR 42000: SELECT statement pattern not supported: Unrecognized field name: '*'
SHOW STATUS LIKE 'rocksdb_select_bypass%';
Variable_name Value
rocksdb_select_bypass_executed 0
rocksdb_select_bypass_failed 0
rocksdb_select_bypass_rejected 3
SELECT /*+ bypass */ 1 from t1 WHERE pk=1;
ERROR 42000: SELECT statement pattern not supported: SELECT expressions can only be field
SHOW STATUS LIKE 'rocksdb_select_bypass%';
Variable_name Value
rocksdb_select_bypass_executed 0
rocksdb_select_bypass_failed 0
rocksdb_select_bypass_rejected 4
SELECT /*+ bypass */ 1+2 from t1 WHERE pk=1;
ERROR 42000: SELECT statement pattern not supported: SELECT expressions can only be field
SHOW STATUS LIKE 'rocksdb_select_bypass%';
Variable_name Value
rocksdb_select_bypass_executed 0
rocksdb_select_bypass_failed 0
rocksdb_select_bypass_rejected 5
SELECT /*+ bypass */ COUNT(*) from t1 WHERE pk=1;
ERROR 42000: SELECT statement pattern not supported: SELECT expressions can only be field
SHOW STATUS LIKE 'rocksdb_select_bypass%';
Variable_name Value
rocksdb_select_bypass_executed 0
rocksdb_select_bypass_failed 0
rocksdb_select_bypass_rejected 6
SELECT /*+ bypass */ COUNT(pk) from t1 WHERE pk=1;
ERROR 42000: SELECT statement pattern not supported: SELECT expressions can only be field
SHOW STATUS LIKE 'rocksdb_select_bypass%';
Variable_name Value
rocksdb_select_bypass_executed 0
rocksdb_select_bypass_failed 0
rocksdb_select_bypass_rejected 7
SELECT /*+ bypass */ pk+1 from t1 WHERE pk=1;
ERROR 42000: SELECT statement pattern not supported: SELECT expressions can only be field
SHOW STATUS LIKE 'rocksdb_select_bypass%';
Variable_name Value
rocksdb_select_bypass_executed 0
rocksdb_select_bypass_failed 0
rocksdb_select_bypass_rejected 8
SELECT /*+ bypass */ pk from t1 USE INDEX (PRIMARY) WHERE pk=1;
ERROR 42000: SELECT statement pattern not supported: Index hint must be FORCE INDEX
SHOW STATUS LIKE 'rocksdb_select_bypass%';
Variable_name Value
rocksdb_select_bypass_executed 0
rocksdb_select_bypass_failed 0
rocksdb_select_bypass_rejected 9
SELECT /*+ bypass */ pk from t1;
ERROR 42000: SELECT statement pattern not supported: Unsupported WHERE: should be expr [(AND expr)*] where expr only contains >, >=, <, <=, =, IN
SHOW STATUS LIKE 'rocksdb_select_bypass%';
Variable_name Value
rocksdb_select_bypass_executed 0
rocksdb_select_bypass_failed 0
rocksdb_select_bypass_rejected 10
SELECT /*+ bypass */ pk from t1 WHERE pk=1 or pk=2;
ERROR 42000: SELECT statement pattern not supported: Unsupported WHERE: should be expr [(AND expr)*] where expr only contains >, >=, <, <=, =, IN
SHOW STATUS LIKE 'rocksdb_select_bypass%';
Variable_name Value
rocksdb_select_bypass_executed 0
rocksdb_select_bypass_failed 0
rocksdb_select_bypass_rejected 11
SELECT /*+ bypass */ pk from t1 WHERE pk<=>1;
ERROR 42000: SELECT statement pattern not supported: Unsupported WHERE - needs to be >, >=, <, <=, =, IN
SHOW STATUS LIKE 'rocksdb_select_bypass%';
Variable_name Value
rocksdb_select_bypass_executed 0
rocksdb_select_bypass_failed 0
rocksdb_select_bypass_rejected 12
SELECT /*+ bypass */ pk from t1 WHERE pk=(1,2,3);
ERROR 42000: SELECT statement pattern not supported: Unsupported WHERE - operand should be int/string/real/varbinary
SHOW STATUS LIKE 'rocksdb_select_bypass%';
Variable_name Value
rocksdb_select_bypass_executed 0
rocksdb_select_bypass_failed 0
rocksdb_select_bypass_rejected 13
SELECT /*+ bypass */ pk from t1 WHERE pk=DATE '2019-03-25';
ERROR 42000: SELECT statement pattern not supported: Unsupported WHERE - operand should be int/string/real/varbinary
SHOW STATUS LIKE 'rocksdb_select_bypass%';
Variable_name Value
rocksdb_select_bypass_executed 0
rocksdb_select_bypass_failed 0
rocksdb_select_bypass_rejected 14
SELECT /*+ bypass */ pk from t1 WHERE pk=TIME '18:01:00';
ERROR 42000: SELECT statement pattern not supported: Unsupported WHERE - operand should be int/string/real/varbinary
SHOW STATUS LIKE 'rocksdb_select_bypass%';
Variable_name Value
rocksdb_select_bypass_executed 0
rocksdb_select_bypass_failed 0
rocksdb_select_bypass_rejected 15
SELECT /*+ bypass */ pk from t1 WHERE pk=TIMESTAMP '2019-03-25 18:01:00';
ERROR 42000: SELECT statement pattern not supported: Unsupported WHERE - operand should be int/string/real/varbinary
SHOW STATUS LIKE 'rocksdb_select_bypass%';
Variable_name Value
rocksdb_select_bypass_executed 0
rocksdb_select_bypass_failed 0
rocksdb_select_bypass_rejected 16
SELECT /*+ bypass */ pk from t1 WHERE pk=ANY (SELECT pk FROM t1);
pk
SHOW STATUS LIKE 'rocksdb_select_bypass%';
Variable_name Value
rocksdb_select_bypass_executed 0
rocksdb_select_bypass_failed 0
rocksdb_select_bypass_rejected 16
SELECT /*+ bypass */ pk from t1 WHERE pk>ALL (SELECT pk FROM t1);
pk
SHOW STATUS LIKE 'rocksdb_select_bypass%';
Variable_name Value
rocksdb_select_bypass_executed 0
rocksdb_select_bypass_failed 0
rocksdb_select_bypass_rejected 16
SELECT /*+ bypass */ DISTINCT a from t1;
ERROR 42000: SELECT statement pattern not supported: SELECT options not supported (such as SELECT DISTINCT)
SHOW STATUS LIKE 'rocksdb_select_bypass%';
Variable_name Value
rocksdb_select_bypass_executed 0
rocksdb_select_bypass_failed 0
rocksdb_select_bypass_rejected 17
SELECT /*+ bypass */ ALL a, b from t1;
ERROR 42000: SELECT statement pattern not supported: SELECT options not supported (such as SELECT DISTINCT)
SHOW STATUS LIKE 'rocksdb_select_bypass%';
Variable_name Value
rocksdb_select_bypass_executed 0
rocksdb_select_bypass_failed 0
rocksdb_select_bypass_rejected 18
SELECT /*+ bypass */ t1.pk, t2.pk from t1, t2;
pk pk
SHOW STATUS LIKE 'rocksdb_select_bypass%';
Variable_name Value
rocksdb_select_bypass_executed 0
rocksdb_select_bypass_failed 0
rocksdb_select_bypass_rejected 18
SELECT /*+ bypass */ t1.pk FROM t1 LEFT JOIN t2 using (pk)
WHERE t1.pk=1;
pk
SHOW STATUS LIKE 'rocksdb_select_bypass%';
Variable_name Value
rocksdb_select_bypass_executed 0
rocksdb_select_bypass_failed 0
rocksdb_select_bypass_rejected 18
SELECT /*+ bypass */ pk, a from (SELECT pk, a FROM t1) AS t1_temp;
pk a
SHOW STATUS LIKE 'rocksdb_select_bypass%';
Variable_name Value
rocksdb_select_bypass_executed 0
rocksdb_select_bypass_failed 0
rocksdb_select_bypass_rejected 18
SELECT /*+ bypass */ pk FROM t1 WHERE pk=3 UNION DISTINCT
SELECT pk FROM t2 WHERE pk=3;
pk
SELECT /*+ bypass */ pk FROM t1 WHERE pk=3 UNION ALL
SELECT pk FROM t2 WHERE pk=3;
pk
SHOW STATUS LIKE 'rocksdb_select_bypass%';
Variable_name Value
rocksdb_select_bypass_executed 0
rocksdb_select_bypass_failed 0
rocksdb_select_bypass_rejected 18
SELECT /*+ bypass */ a, b, c FROM t1 WHERE a=1 ORDER BY a;
ERROR 42000: SELECT statement pattern not supported: ORDER BY field doesn't belong to the index
SELECT /*+ bypass */ a, b, c FROM t1 FORCE INDEX(`a`) WHERE a=1 ORDER BY b, a;
ERROR 42000: SELECT statement pattern not supported: ORDER BY is not in index order
SELECT /*+ bypass */ a, b, c FROM t1 FORCE INDEX(`a`) WHERE a=1
ORDER BY a, b, c, c, c, a, b, c, d;
ERROR 42000: SELECT statement pattern not supported: ORDER BY is not in index order
SELECT /*+ bypass */ a, b, c FROM t1 FORCE INDEX(`a`) WHERE a=1 ORDER BY c, a;
ERROR 42000: SELECT statement pattern not supported: ORDER BY is not in index order
SELECT /*+ bypass */ a, b, c FROM t1 FORCE INDEX(`a`) WHERE a=1 ORDER BY a, a;
ERROR 42000: SELECT statement pattern not supported: ORDER BY is not in index order
SELECT /*+ bypass */ a, b, c FROM t1 FORCE INDEX(`a`) WHERE a=1
ORDER BY a, a, a, a, a, a, a, a;
ERROR 42000: SELECT statement pattern not supported: ORDER BY is not in index order
SELECT /*+ bypass */ a, b, c FROM t1 FORCE INDEX(`a`) WHERE a=1 ORDER BY b, b;
ERROR 42000: SELECT statement pattern not supported: ORDER BY is not in index order
SELECT /*+ bypass */ a, b, c FROM t3 FORCE INDEX(`a`) WHERE a=1 ORDER BY b, b;
ERROR 42000: SELECT statement pattern not supported: only utf8_bin, latin1_bin is supported for varchar field
SHOW STATUS LIKE 'rocksdb_select_bypass%';
Variable_name Value
rocksdb_select_bypass_executed 0
rocksdb_select_bypass_failed 0
rocksdb_select_bypass_rejected 26
SELECT /*+ bypass */ a, b, c FROM t1 FORCE INDEX(`abc`) WHERE a=1 ORDER BY b, a;
ERROR 42000: SELECT statement pattern not supported: Unrecognized index: 'abc'
SELECT /*+ bypass */ a from t1 WHERE a=1 INTO OUTFILE 'datadir/select.out';
ERROR 42000: SELECT statement pattern not supported: SELECT INTO/DUMP not supported
SHOW STATUS LIKE 'rocksdb_select_bypass%';
Variable_name Value
rocksdb_select_bypass_executed 0
rocksdb_select_bypass_failed 0
rocksdb_select_bypass_rejected 28
SELECT /*+ bypass */ a from t1 WHERE a=1 INTO DUMPFILE 'datadir/select.dump';
ERROR 42000: SELECT statement pattern not supported: SELECT INTO/DUMP not supported
SHOW STATUS LIKE 'rocksdb_select_bypass%';
Variable_name Value
rocksdb_select_bypass_executed 0
rocksdb_select_bypass_failed 0
rocksdb_select_bypass_rejected 29
SELECT /*+ bypass */ a, b, c FROM t3 WHERE pk=1 FOR UPDATE;
ERROR 42000: SELECT statement pattern not supported: Only SELECT with default READ lock is supported
SELECT /*+ bypass */ a, b, c FROM t3 WHERE pk=1 FOR UPDATE SKIP LOCKED;
ERROR 42000: SELECT statement pattern not supported: Only SELECT with default READ lock is supported
SELECT /*+ bypass */ a, b, c FROM t3 WHERE pk=1 FOR UPDATE NOWAIT;
ERROR 42000: SELECT statement pattern not supported: Only SELECT with default READ lock is supported
SELECT /*+ bypass */ a, b, c FROM t3 WHERE pk=1 LOCK IN SHARE MODE;
ERROR 42000: SELECT statement pattern not supported: Only SELECT with default READ lock is supported
SELECT /*+ bypass */ HIGH_PRIORITY a, b, c FROM t3 WHERE pk=1;
ERROR 42000: SELECT statement pattern not supported: Only SELECT with default READ lock is supported
SELECT /*+ bypass */ a,a,a,a,a, a,a,a,a,a, a,a,a,a,a, a,a FROM t3 WHERE pk=1;
ERROR 42000: SELECT statement pattern not supported: Too many SELECT expressions
SELECT /*+ bypass */ a FROM t3 WHERE a=1 AND a=1 AND a=1 AND a=1 AND a=1 AND
a=1 AND a=1 AND a=1 AND a=1 AND a=1 AND
a=1 AND a=1 AND a=1 AND a=1 AND a=1 AND
a=1 AND a=1;
ERROR 42000: SELECT statement pattern not supported: Too many WHERE expressions
SELECT @@rocksdb_select_bypass_policy;
@@rocksdb_select_bypass_policy
2
set global rocksdb_select_bypass_policy=@save_rocksdb_select_bypass_policy;
SELECT @@rocksdb_select_bypass_policy;
@@rocksdb_select_bypass_policy
0
SELECT @@rocksdb_select_bypass_fail_unsupported;
@@rocksdb_select_bypass_fail_unsupported
1
set global rocksdb_select_bypass_fail_unsupported=false;
SELECT @@rocksdb_select_bypass_fail_unsupported;
@@rocksdb_select_bypass_fail_unsupported
0
SELECT /*+ bypass */ * from t1;
pk a b c
SELECT @@rocksdb_select_bypass_fail_unsupported;
@@rocksdb_select_bypass_fail_unsupported
0
set global rocksdb_select_bypass_fail_unsupported=@save_fail_unsupported;
SELECT @@rocksdb_select_bypass_fail_unsupported;
@@rocksdb_select_bypass_fail_unsupported
1
drop table t1;
drop table t2;
drop table t3;
13 changes: 13 additions & 0 deletions mysql-test/suite/rocksdb/r/rocksdb.result
Original file line number Diff line number Diff line change
Expand Up @@ -959,6 +959,10 @@ rocksdb_records_in_range 50
rocksdb_reset_stats OFF
rocksdb_rollback_on_timeout OFF
rocksdb_seconds_between_stat_computes 3600
rocksdb_select_bypass_fail_unsupported ON
rocksdb_select_bypass_log_failed OFF
rocksdb_select_bypass_log_rejected ON
rocksdb_select_bypass_policy 0
rocksdb_signal_drop_index_thread OFF
rocksdb_sim_cache_size 0
rocksdb_skip_bloom_filter_on_read OFF
Expand Down Expand Up @@ -1556,6 +1560,9 @@ rocksdb_number_superversion_cleanups #
rocksdb_number_superversion_releases #
rocksdb_row_lock_deadlocks #
rocksdb_row_lock_wait_timeouts #
rocksdb_select_bypass_executed #
rocksdb_select_bypass_failed #
rocksdb_select_bypass_rejected #
rocksdb_snapshot_conflict_errors #
rocksdb_stall_l0_file_count_limit_slowdowns #
rocksdb_stall_locked_l0_file_count_limit_slowdowns #
Expand Down Expand Up @@ -1672,6 +1679,9 @@ ROCKSDB_NUMBER_SUPERVERSION_CLEANUPS
ROCKSDB_NUMBER_SUPERVERSION_RELEASES
ROCKSDB_ROW_LOCK_DEADLOCKS
ROCKSDB_ROW_LOCK_WAIT_TIMEOUTS
ROCKSDB_SELECT_BYPASS_EXECUTED
ROCKSDB_SELECT_BYPASS_FAILED
ROCKSDB_SELECT_BYPASS_REJECTED
ROCKSDB_SNAPSHOT_CONFLICT_ERRORS
ROCKSDB_STALL_L0_FILE_COUNT_LIMIT_SLOWDOWNS
ROCKSDB_STALL_LOCKED_L0_FILE_COUNT_LIMIT_SLOWDOWNS
Expand Down Expand Up @@ -1790,6 +1800,9 @@ ROCKSDB_NUMBER_SUPERVERSION_CLEANUPS
ROCKSDB_NUMBER_SUPERVERSION_RELEASES
ROCKSDB_ROW_LOCK_DEADLOCKS
ROCKSDB_ROW_LOCK_WAIT_TIMEOUTS
ROCKSDB_SELECT_BYPASS_EXECUTED
ROCKSDB_SELECT_BYPASS_FAILED
ROCKSDB_SELECT_BYPASS_REJECTED
ROCKSDB_SNAPSHOT_CONFLICT_ERRORS
ROCKSDB_STALL_L0_FILE_COUNT_LIMIT_SLOWDOWNS
ROCKSDB_STALL_LOCKED_L0_FILE_COUNT_LIMIT_SLOWDOWNS
Expand Down
Loading

0 comments on commit e79b20a

Please sign in to comment.