重写一个标量在
子查询,Item_in_subselect: single_value_transformer
使用方法。标量在
子查询将被替换为一个Item_in_optimizer
项。
一个Item_in_optimizer
项目是一个特殊的布尔函数。请求(在一个值瓦尔
,val_int
,或val_str
他们评估的左表达式方法)在
通过存储在缓存项(其价值Item_cache *
项),然后测试缓存是否零
。如果表达式(缓存)零
,然后Item_in_optimizer
返回零
,其他的评估Item_in_subselect
。
示例查询。
一个t1) SELECT * from t1。在(选择t2。从t2);b) SELECT * from t1 t1的地方。在(选择t2。从t2.a t2组);
Item_in_subselect
继承了获得一个值的机制Item_exists_subselect
。Select_transformer
左边的表达式的引用存储在它的条件:
(在哪里和在在a和b)
项目从项目列表的选择(
t2.a
可以特别引用(引用)Item_ref_null_helper
或Item_null_helper
)。这个引用通知Item_in_optimizer
是否项目(t2.a
)是零
通过设置was_null
国旗。的返回值
Item_in_subselect
将评估如下:如果这是真的,返回TRUE
如果为空,返回NULL(未知)
如果错误,
was_null
设置,返回null返回假
< left_expression >(选择< item >…)
将代表如下:
+ - - - - - - - - - - - - - - - - - - + | Item_in_optimizer | + - - - - - - - - - - - - - - - - - - + | + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + | | + - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - + | < left_expression > | | Item_in_subselect | | | + - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - + | | < left_expression缓存> | + + - - - - - - - - - - - - - - - - - - - - - - - - - - + | | | | + - - - - - - - - - - - - - - - - - - - - - - - - + | | ^ + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + < < < < < < < < < < < < < < < < < | Item_ref | + < < < | Item_ref_null_helper | + - - - - - - - - - - - + V + - - - - - - - - - - - - - - - - - - - + V + - - - - - - - - - - - - - - - - - - - + + > > > | < item > | + - - - - - - - - - - - - - - - - - - - - - - +
在哪里< < < < < < < < <
参考的意义吗Item_ref
。
Item_ref
是指什么< left_expression缓存>
,因为在转换的时候我们只知道变量的地址将被存储在缓存指针。
如果select语句有一个命令
条款,将被消灭,因为是没有意义的命令
没有限制
在这里。
如果在
子查询联盟的每一个选择的条件联盟
分别将被改变。
如果需要添加一个条件在哪里
条款,它将作为(项目或项目为空)
和Item_is_not_null_test(项)
将被添加到有
条款。Item_is_not_null_test
注册一个零
价值的方式Item_ref_null_helper
它,并返回如果参数是错误的零
。与上面的技巧,我们将注册零
的价值项
即使对于指数的优化在哪里
条款(以下示例案例a)。
以下的例子在
转换:
示例1:
在(选择< item > < left_expression > t < where_exp >)
如果返回零
正确有意义,上面将成为:
(选择1从t < where_exp >和(Item_ref (< cached_left_expression >) = < item >或< item >是null)拥有Item_is_not_null_test (< item >))
子查询时标记为项目的顶部在哪里
条款,这将成为:
(选择1从t < where_exp >和Item_ref (< cached_left_expression >) = < >项)
示例2:
< left_expression >中(从t选择< item > < having_expr >订单1)
将表示为
(选择< item > ref_null_helper从t < having_exp >和Item_ref (< cached_left_expression >) = Item_ref_null_helper(项目))
示例3:
< left_expression >(选择< item >联盟……)
将成为
(选择1 Item_ref (< cached_left_expression >) = < Item_null_helper (< Item >) >联盟……)
(有
没有从
是一个语法错误,但一个吗有
即使是子查询没有检查条件从
)
示例4:
(选择< item > < left_expression >)
将完全取代< left_expression > = <项目>
现在的条件((a)或(b))
将会改变,这取决于选择,以下列方式:
如果子查询包含一个有
条款,SUM ()
函数或集团
(例1),然后将不变,一个项目列表Item_ref_null_helper
参考创建项目列表元素。将被添加到一个条件有
。
如果子查询不包含有
,SUM ()
函数,或集团
(例2),那么:
项目列表
将被替换为1。left_expression缓存> = < item >或为空<项目>
将被添加到在哪里
条款和特殊is_not_null(项)
将被添加到有
将注册,所以null值。如果返回零
不正确的意义,然后只left_expression缓存> = <项目>
将被添加到在哪里
条款。如果这个子查询不包含一个从
条款或者子查询包含联盟
(例3)left_expression缓存> = Item_null_helper (< item >)
将被添加到有
条款。
一个选择没有从
条款将减少< left_expression > = <项目>
没有使用Item_in_optimizer
。