summaryrefslogtreecommitdiff
path: root/sql/opt_table_elimination.cc
diff options
context:
space:
mode:
authorSergey Petrunya <psergey@askmonty.org>2009-08-13 23:10:53 +0400
committerSergey Petrunya <psergey@askmonty.org>2009-08-13 23:10:53 +0400
commit23ba4fbc791f631d11ff710dfc12b003ca10a34f (patch)
treec30c51fdbe895e1b62a03a05aa55d0c0ac5b02c2 /sql/opt_table_elimination.cc
parenta650a4cfe1a721e05f7bd756b8a67b1b1ea3d1c5 (diff)
downloadmariadb-git-23ba4fbc791f631d11ff710dfc12b003ca10a34f.tar.gz
MWL#17: Table elimination
- Better comments sql/sql_select.cc: MWL#17: Table elimination - Fix buildbot failure: do set correct value to nested_join::n_tables
Diffstat (limited to 'sql/opt_table_elimination.cc')
-rw-r--r--sql/opt_table_elimination.cc54
1 files changed, 23 insertions, 31 deletions
diff --git a/sql/opt_table_elimination.cc b/sql/opt_table_elimination.cc
index 5f98288be96..ba0adbef696 100644
--- a/sql/opt_table_elimination.cc
+++ b/sql/opt_table_elimination.cc
@@ -20,18 +20,15 @@
OVERVIEW
The module has one entry point - eliminate_tables() function, which one
- needs to call (once) sometime after update_ref_and_keys() but before the
- join optimization.
+ needs to call (once) at some point before the join optimization.
eliminate_tables() operates over the JOIN structures. Logically, it
removes the right sides of outer join nests. Physically, it changes the
following members:
* Eliminated tables are marked as constant and moved to the front of the
join order.
- * In addition to this, they are recorded in JOIN::eliminated_tables bitmap.
- * All join nests have their NESTED_JOIN::n_tables updated to discount
- the eliminated tables
+ * In addition to this, they are recorded in JOIN::eliminated_tables bitmap.
* Items that became disused because they were in the ON expression of an
eliminated outer join are notified by means of the Item tree walk which
@@ -40,26 +37,13 @@
Item_subselect with its Item_subselect::eliminated flag which is used
by EXPLAIN code to check if the subquery should be shown in EXPLAIN.
- Table elimination is redone on every PS re-execution. (TODO reasons?)
+ Table elimination is redone on every PS re-execution.
*/
-/*
- A structure that represents a functional dependency of something over
- something else. This can be one of:
-
- 1. A "tbl.field = expr" equality. The field depends on the expression.
-
- 2. An Item_equal(...) multi-equality. Each participating field depends on
- every other participating field. (TODO???)
-
- 3. A UNIQUE_KEY(field1, field2, fieldN). The key depends on the fields that
- it is composed of.
-
- 4. A table (which is within an outer join nest). Table depends on a unique
- key (value of a unique key identifies a table record)
-
- 5. An outer join nest. It depends on all tables it contains.
+/*
+ An abstract structure that represents some entity that's being dependent on
+ some other entity.
*/
class Func_dep : public Sql_alloc
@@ -73,9 +57,14 @@ public:
FD_UNIQUE_KEY,
FD_TABLE,
FD_OUTER_JOIN
- } type;
- Func_dep *next;
- bool bound;
+ } type; /* Type of the object */
+
+ /*
+ Used to make a linked list of elements that became bound and thus can
+ make elements that depend on them bound, too.
+ */
+ Func_dep *next;
+ bool bound; /* TRUE<=> The entity is considered bound */
Func_dep() : next(NULL), bound(FALSE) {}
};
@@ -84,10 +73,10 @@ class Field_dep;
class Table_dep;
class Outer_join_dep;
+
/*
- An equality
- - Depends on multiple fields (those in its expression), unknown_args is a
- counter of unsatisfied dependencies.
+ A "tbl.column= expr" equality dependency. tbl.column depends on fields
+ used in expr.
*/
class Equality_dep : public Func_dep
{
@@ -95,8 +84,11 @@ public:
Field_dep *field;
Item *val;
- uint level; /* Used during condition analysis only */
- uint unknown_args; /* Number of yet unknown arguments */
+ /* Used during condition analysis only, similar to KEYUSE::level */
+ uint level;
+
+ /* Number of fields referenced from *val that are not yet 'bound' */
+ uint unknown_args;
};
@@ -139,7 +131,7 @@ public:
type= Func_dep::FD_UNIQUE_KEY;
}
Table_dep *table; /* Table this key is from */
- uint keyno; // TODO do we care about this
+ uint keyno;
uint n_missing_keyparts;
Key_dep *next_table_key;
};