13.1.1标量的子查询

重写一个标量子查询,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_helperItem_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