mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
5.5 merge
This commit is contained in:
50
sql/table.cc
50
sql/table.cc
@@ -2163,8 +2163,10 @@ end:
|
||||
@brief
|
||||
Unpack the definition of a virtual column from its linear representation
|
||||
|
||||
@parm
|
||||
@param
|
||||
thd The thread object
|
||||
@param
|
||||
mem_root The mem_root object where to allocated memory
|
||||
@param
|
||||
table The table containing the virtual column
|
||||
@param
|
||||
@@ -2194,6 +2196,7 @@ end:
|
||||
TRUE Otherwise
|
||||
*/
|
||||
bool unpack_vcol_info_from_frm(THD *thd,
|
||||
MEM_ROOT *mem_root,
|
||||
TABLE *table,
|
||||
Field *field,
|
||||
LEX_STRING *vcol_expr,
|
||||
@@ -2221,7 +2224,7 @@ bool unpack_vcol_info_from_frm(THD *thd,
|
||||
"PARSE_VCOL_EXPR (<expr_string_from_frm>)".
|
||||
*/
|
||||
|
||||
if (!(vcol_expr_str= (char*) alloc_root(&table->mem_root,
|
||||
if (!(vcol_expr_str= (char*) alloc_root(mem_root,
|
||||
vcol_expr->length +
|
||||
parse_vcol_keyword.length + 3)))
|
||||
{
|
||||
@@ -2255,10 +2258,10 @@ bool unpack_vcol_info_from_frm(THD *thd,
|
||||
We need to use CONVENTIONAL_EXECUTION here to ensure that
|
||||
any new items created by fix_fields() are not reverted.
|
||||
*/
|
||||
Query_arena expr_arena(&table->mem_root,
|
||||
Query_arena expr_arena(mem_root,
|
||||
Query_arena::STMT_CONVENTIONAL_EXECUTION);
|
||||
if (!(vcol_arena= (Query_arena *) alloc_root(&table->mem_root,
|
||||
sizeof(Query_arena))))
|
||||
if (!(vcol_arena= (Query_arena *) alloc_root(mem_root,
|
||||
sizeof(Query_arena))))
|
||||
goto err;
|
||||
*vcol_arena= expr_arena;
|
||||
table->expr_arena= vcol_arena;
|
||||
@@ -2525,6 +2528,7 @@ int open_table_from_share(THD *thd, TABLE_SHARE *share, const char *alias,
|
||||
if (share->vfields && (*field_ptr)->vcol_info)
|
||||
{
|
||||
if (unpack_vcol_info_from_frm(thd,
|
||||
&outparam->mem_root,
|
||||
outparam,
|
||||
*field_ptr,
|
||||
&(*field_ptr)->vcol_info->expr_str,
|
||||
@@ -5004,19 +5008,33 @@ TABLE *TABLE_LIST::get_real_join_table()
|
||||
DBUG_ASSERT(tbl->derived == NULL ||
|
||||
tbl->derived->first_select()->next_select() == NULL);
|
||||
|
||||
if (tbl->table)
|
||||
table= tbl->table;
|
||||
tbl= (tbl->view != NULL ?
|
||||
tbl->view->select_lex.get_table_list() :
|
||||
tbl->derived->first_select()->get_table_list());
|
||||
|
||||
/* find left table in outer join on this level */
|
||||
while(tbl->outer_join & JOIN_TYPE_RIGHT)
|
||||
{
|
||||
DBUG_ASSERT(tbl->next_local);
|
||||
tbl= tbl->next_local;
|
||||
List_iterator_fast<TABLE_LIST> ti;
|
||||
{
|
||||
List_iterator_fast<TABLE_LIST>
|
||||
ti(tbl->view != NULL ?
|
||||
tbl->view->select_lex.top_join_list :
|
||||
tbl->derived->first_select()->top_join_list);
|
||||
for (;;)
|
||||
{
|
||||
tbl= NULL;
|
||||
/*
|
||||
Find left table in outer join on this level
|
||||
(the list is reverted).
|
||||
*/
|
||||
for (TABLE_LIST *t= ti++; t; t= ti++)
|
||||
tbl= t;
|
||||
/*
|
||||
It is impossible that the list is empty
|
||||
so tbl can't be NULL after above loop.
|
||||
*/
|
||||
if (!tbl->nested_join)
|
||||
break;
|
||||
/* go deeper if we've found nested join */
|
||||
ti= tbl->nested_join->join_list;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return tbl->table;
|
||||
|
Reference in New Issue
Block a user