diff options
author | Igor Babaev <igor@askmonty.org> | 2019-08-30 15:49:07 -0700 |
---|---|---|
committer | Igor Babaev <igor@askmonty.org> | 2019-08-30 15:49:07 -0700 |
commit | d1490c177139faa71cd88af71fdb7d88a8f45000 (patch) | |
tree | 86086ac8d6816708919e258d10350fb5d4e4bf04 /sql/item.h | |
parent | 7060b0320d1479bb9476e0cbd4acc584e059e1ff (diff) | |
download | mariadb-git-10.3-mdev15777.tar.gz |
MDEV-15777 Use inferred IS NOT NULL predicates in the range optimizer10.3-mdev15777
This patch introduces the optimization that allows range optimizer to
consider index range scans that are built employing NOT NULL predicates
inferred from WHERE conditions and ON expressions.
The patch adds a new optimizer switch not_null_range_scan.
Diffstat (limited to 'sql/item.h')
-rw-r--r-- | sql/item.h | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/sql/item.h b/sql/item.h index 2adc111db03..c2dbdb135f1 100644 --- a/sql/item.h +++ b/sql/item.h @@ -1818,6 +1818,44 @@ public: virtual bool set_fields_as_dependent_processor(void *arg) { return 0; } /*============== End of Item processor list ======================*/ + /* + Given a condition P from the WHERE clause or from an ON expression of + the processed SELECT S and a set of join tables from S marked in the + parameter 'allowed'={T} a call of P->find_not_null_fields({T}) has to + find the set fields {F} of the tables from 'allowed' such that: + - each field from {F} is declared as nullable + - each record of table t from {T} that contains NULL as the value for at + at least one field from {F} can be ignored when building the result set + for S + It is assumed here that the condition P is conjunctive and all its column + references belong to T. + + Examples: + CREATE TABLE t1 (a int, b int); + CREATE TABLE t2 (a int, b int); + + SELECT * FROM t1,t2 WHERE t1.a=t2.a and t1.b > 5; + A call of find_not_null_fields() for the whole WHERE condition and {t1,t2} + should find {t1.a,t1.b,t2.a} + + SELECT * FROM t1 LEFT JOIN ON (t1.a=t2.a and t2.a > t2.b); + A call of find_not_null_fields() for the ON expression and {t2} + should find {t2.a,t2.b} + + The function returns TRUE if it succeeds to prove that all records of + a table from {T} can be ignored. Otherwise it always returns FALSE. + + Example: + SELECT * FROM t1,t2 WHERE t1.a=t2.a AND t2.a IS NULL; + A call of find_not_null_fields() for the WHERE condition and {t1,t2} + will return TRUE. + + It is assumed that the implementation of this virtual function saves + the info on the found set of fields in the structures associates with + tables from {T}. + */ + virtual bool find_not_null_fields(table_map allowed) { return false; } + virtual Item *get_copy(THD *thd)=0; bool cache_const_expr_analyzer(uchar **arg); @@ -3079,6 +3117,7 @@ public: bool is_result_field() { return false; } void save_in_result_field(bool no_conversions); Item *get_tmp_table_item(THD *thd); + bool find_not_null_fields(table_map allowed); bool collect_item_field_processor(void * arg); bool add_field_to_set_processor(void * arg); bool find_item_in_field_list_processor(void *arg); @@ -4858,6 +4897,10 @@ public: { return depended_from ? 0 : (*ref)->not_null_tables(); } + bool find_not_null_fields(table_map allowed) + { + return depended_from ? false : (*ref)->find_not_null_fields(allowed); + } void save_in_result_field(bool no_conversions) { (*ref)->save_in_field(result_field, no_conversions); |