45
45
#include <drizzled/select_max_min_finder_subselect.h>
46
46
#include <drizzled/select_exists_subselect.h>
47
47
#include <drizzled/select_union.h>
48
#include <drizzled/sql_lex.h>
49
#include <drizzled/system_variables.h>
52
53
extern plugin::StorageEngine *myisam_engine;
54
inline Item * and_items(Item* cond, Item *item)
55
inline Item* and_items(Item* cond, Item *item)
56
return (cond? (new Item_cond_and(cond, item)) : item);
57
return cond ? new Item_cond_and(cond, item) : item;
59
60
Item_subselect::Item_subselect() :
540
534
have_to_be_excluded= 1;
541
if (session->getLex()->describe)
535
if (session->lex().describe)
543
537
char warn_buff[DRIZZLE_ERRMSG_SIZE];
544
538
snprintf(warn_buff, sizeof(warn_buff), ER(ER_SELECT_REDUCED), select_lex->select_number);
730
724
if (unit_arg->fake_select_lex &&
731
725
unit_arg->fake_select_lex->test_limit())
734
728
Select_Lex *sl= unit_arg->first_select();
735
729
for (; sl; sl= sl->next_select())
737
731
if (sl->test_limit())
743
737
Item_in_subselect::Item_in_subselect(Item * left_exp,
1062
1056
it.replace(item);
1065
save_allow_sum_func= session->getLex()->allow_sum_func;
1066
session->getLex()->allow_sum_func|= 1 << session->getLex()->current_select->nest_level;
1059
save_allow_sum_func= session->lex().allow_sum_func;
1060
session->lex().allow_sum_func|= 1 << session->lex().current_select->nest_level;
1068
1062
Item_sum_(max|min) can't substitute other item => we can use 0 as
1069
1063
reference, also Item_sum_(max|min) can't be fixed after creation, so
1072
1066
if (item->fix_fields(session, 0))
1073
1067
return(RES_ERROR);
1074
session->getLex()->allow_sum_func= save_allow_sum_func;
1068
session->lex().allow_sum_func= save_allow_sum_func;
1075
1069
/* we added aggregate function => we have to change statistic */
1076
1070
count_field_types(select_lex, &join->tmp_table_param, join->all_fields,
1096
1090
Select_Lex_Unit *master_unit= select_lex->master_unit();
1097
1091
substitution= optimizer;
1099
Select_Lex *current= session->getLex()->current_select, *up;
1093
Select_Lex *current= session->lex().current_select, *up;
1101
session->getLex()->current_select= up= current->return_after_parsing();
1095
session->lex().current_select= up= current->return_after_parsing();
1102
1096
//optimizer never use Item **ref => we can pass 0 as parameter
1103
1097
if (!optimizer || optimizer->fix_left(session, 0))
1105
session->getLex()->current_select= current;
1099
session->lex().current_select= current;
1106
1100
return(RES_ERROR);
1108
session->getLex()->current_select= current;
1102
session->lex().current_select= current;
1111
1105
As far as Item_ref_in_optimizer do not substitute itself on fix_fields
1112
1106
we can use same item for all selects.
1114
expr= new Item_direct_ref(&select_lex->context,
1115
(Item**)optimizer->get_cache(),
1116
(char *)"<no matter>",
1117
(char *)in_left_expr_name);
1108
expr= new Item_direct_ref(&select_lex->context, (Item**)optimizer->get_cache(), "<no matter>", in_left_expr_name);
1119
1110
master_unit->uncacheable.set(UNCACHEABLE_DEPENDENT);
1122
1113
if (!abort_on_null && left_expr->maybe_null && !pushed_cond_guards)
1124
if (!(pushed_cond_guards= (bool*)join->session->getMemRoot()->allocate(sizeof(bool))))
1115
pushed_cond_guards= new (join->session->mem) bool;
1126
1116
pushed_cond_guards[0]= true;
1184
1174
select_lex->group_list.elements)
1187
Item *item= func->create(expr,
1188
new Item_ref_null_helper(&select_lex->context,
1193
this->full_name()));
1177
Item *item= func->create(expr, new Item_ref_null_helper(&select_lex->context, this, select_lex->ref_pointer_array, "<ref>", this->full_name()));
1194
1178
if (!abort_on_null && left_expr->maybe_null)
1229
1213
Item *having= item, *orig_item= item;
1230
1214
select_lex->item_list.clear();
1231
select_lex->item_list.push_back(new Item_int("Not_used",
1233
MY_INT64_NUM_DECIMAL_DIGITS));
1215
select_lex->item_list.push_back(new Item_int("Not_used", 1, MY_INT64_NUM_DECIMAL_DIGITS));
1234
1216
select_lex->ref_pointer_array[0]= &select_lex->item_list.front();
1236
1218
item= func->create(expr, item);
1239
1221
having= new Item_is_not_null_test(this, having);
1240
1222
if (left_expr->maybe_null)
1242
if (!(having= new Item_func_trig_cond(having,
1243
get_cond_guard(0))))
1223
having= new Item_func_trig_cond(having, get_cond_guard(0));
1247
1225
Item_is_not_null_test can't be changed during fix_fields()
1248
1226
we can assign select_lex->having here, and pass 0 as last
1260
1238
select_lex->having_fix_field= 0;
1262
1240
return(RES_ERROR);
1263
item= new Item_cond_or(item,
1264
new Item_func_isnull(orig_item));
1241
item= new Item_cond_or(item, new Item_func_isnull(orig_item));
1267
1244
If we may encounter NULL IN (SELECT ...) and care whether subquery
1268
1245
result is NULL or false, wrap condition in a trig_cond.
1270
1247
if (!abort_on_null && left_expr->maybe_null)
1272
if (!(item= new Item_func_trig_cond(item, get_cond_guard(0))))
1248
item= new Item_func_trig_cond(item, get_cond_guard(0));
1276
1250
TODO: figure out why the following is done here in
1277
1251
single_value_transformer but there is no corresponding action in
1303
1277
we can assign select_lex->having here, and pass 0 as last
1304
1278
argument (reference) to fix_fields()
1308
new Item_ref_null_helper(&select_lex->context, this,
1309
select_lex->ref_pointer_array,
1310
(char *)"<no matter>",
1311
(char *)"<result>"));
1280
Item *new_having= func->create(expr, new Item_ref_null_helper(&select_lex->context, this, select_lex->ref_pointer_array, "<no matter>", "<result>"));
1312
1281
if (!abort_on_null && left_expr->maybe_null)
1314
if (!(new_having= new Item_func_trig_cond(new_having,
1315
get_cond_guard(0))))
1318
new_having->name= (char*)in_having_cond;
1282
new_having= new Item_func_trig_cond(new_having, get_cond_guard(0));
1283
new_having->name= in_having_cond;
1319
1284
select_lex->having= join->having= new_having;
1320
1285
select_lex->having_fix_field= 1;
1335
1300
// fix_field of item will be done in time of substituting
1336
1301
substitution= item;
1337
1302
have_to_be_excluded= 1;
1338
if (session->getLex()->describe)
1303
if (session->lex().describe)
1340
1305
char warn_buff[DRIZZLE_ERRMSG_SIZE];
1341
1306
snprintf(warn_buff, sizeof(warn_buff), ER(ER_SELECT_REDUCED), select_lex->select_number);
1373
1338
Select_Lex_Unit *master_unit= select_lex->master_unit();
1374
1339
substitution= optimizer;
1376
Select_Lex *current= session->getLex()->current_select, *up;
1377
session->getLex()->current_select= up= current->return_after_parsing();
1341
Select_Lex *current= session->lex().current_select, *up;
1342
session->lex().current_select= up= current->return_after_parsing();
1378
1343
//optimizer never use Item **ref => we can pass 0 as parameter
1379
1344
if (!optimizer || optimizer->fix_left(session, 0))
1381
session->getLex()->current_select= current;
1346
session->lex().current_select= current;
1382
1347
return(RES_ERROR);
1385
1350
// we will refer to upper level cache array => we have to save it in PS
1386
1351
optimizer->keep_top_level_cache();
1388
session->getLex()->current_select= current;
1353
session->lex().current_select= current;
1389
1354
master_unit->uncacheable.set(UNCACHEABLE_DEPENDENT);
1391
1356
if (!abort_on_null && left_expr->maybe_null && !pushed_cond_guards)
1393
if (!(pushed_cond_guards= (bool*)join->session->getMemRoot()->allocate(sizeof(bool) *
1394
left_expr->cols())))
1358
pushed_cond_guards= new (join->session->mem) bool[left_expr->cols()];
1396
1359
for (uint32_t i= 0; i < cols_num; i++)
1397
1360
pushed_cond_guards[i]= true;
1469
1432
Item_ref(&select_lex->context,
1470
1433
(*optimizer->get_cache())->
1472
(char *)"<no matter>",
1473
(char *)in_left_expr_name),
1475
1438
Item_ref(&select_lex->context,
1476
1439
select_lex->ref_pointer_array + i,
1477
(char *)"<no matter>",
1478
(char *)"<list ref>")
1480
1443
Item *item_isnull=
1481
1444
new Item_func_isnull(new
1482
1445
Item_ref(&select_lex->context,
1483
1446
select_lex->ref_pointer_array+i,
1484
(char *)"<no matter>",
1485
(char *)"<list ref>")
1487
1450
Item *col_item= new Item_cond_or(item_eq, item_isnull);
1488
1451
if (!abort_on_null && left_expr->element_index(i)->maybe_null)
1490
if (!(col_item= new Item_func_trig_cond(col_item, get_cond_guard(i))))
1452
col_item= new Item_func_trig_cond(col_item, get_cond_guard(i));
1493
1453
having_item= and_items(having_item, col_item);
1495
1455
Item *item_nnull_test=
1497
1457
new Item_ref(&select_lex->context,
1499
1459
ref_pointer_array + i,
1500
(char *)"<no matter>",
1501
(char *)"<list ref>"));
1502
1462
if (!abort_on_null && left_expr->element_index(i)->maybe_null)
1504
if (!(item_nnull_test=
1505
new Item_func_trig_cond(item_nnull_test, get_cond_guard(i))))
1464
item_nnull_test= new Item_func_trig_cond(item_nnull_test, get_cond_guard(i));
1508
1466
item_having_part2= and_items(item_having_part2, item_nnull_test);
1509
1467
item_having_part2->top_level_item();
1546
1504
Item_direct_ref(&select_lex->context,
1547
1505
(*optimizer->get_cache())->
1549
(char *)"<no matter>",
1550
(char *)in_left_expr_name),
1552
1510
Item_direct_ref(&select_lex->context,
1554
1512
ref_pointer_array+i,
1555
(char *)"<no matter>",
1556
(char *)"<list ref>")
1558
1516
if (!abort_on_null)
1582
1540
if (left_expr->element_index(i)->maybe_null)
1584
if (!(item= new Item_func_trig_cond(item, get_cond_guard(i))))
1586
if (!(having_col_item=
1587
new Item_func_trig_cond(having_col_item, get_cond_guard(i))))
1542
item= new Item_func_trig_cond(item, get_cond_guard(i));
1543
having_col_item= new Item_func_trig_cond(having_col_item, get_cond_guard(i));
1590
1545
having_item= and_items(having_item, having_col_item);
1657
1612
Item_subselect::trans_res
1658
1613
Item_in_subselect::select_in_like_transformer(Join *join, const Comp_creator *func)
1660
Select_Lex *current= session->getLex()->current_select, *up;
1615
Select_Lex *current= session->lex().current_select, *up;
1661
1616
const char *save_where= session->where();
1662
1617
Item_subselect::trans_res res= RES_ERROR;
1695
session->getLex()->current_select= up= current->return_after_parsing();
1650
session->lex().current_select= up= current->return_after_parsing();
1696
1651
result= (!left_expr->fixed &&
1697
1652
left_expr->fix_fields(session, optimizer->arguments()));
1698
1653
/* fix_fields can change reference to left_expr, we need reassign it */
1699
1654
left_expr= optimizer->arguments()[0];
1701
session->getLex()->current_select= current;
1656
session->lex().current_select= current;
1793
1748
subselect_single_select_engine *old_engine_ptr;
1795
1750
old_engine_ptr= static_cast<subselect_single_select_engine *>(engine);
1797
if (!(new_engine= new subselect_hash_sj_engine(session, this,
1799
new_engine->init_permanent(unit->get_unit_column_types()))
1751
new_engine= new subselect_hash_sj_engine(session, this, old_engine_ptr);
1752
if (new_engine->init_permanent(unit->get_unit_column_types()))
1801
1754
Item_subselect::trans_res new_trans_res;
1808
1761
new_engine= NULL;
1809
1762
exec_method= NOT_TRANSFORMED;
1810
1763
if (left_expr->cols() == 1)
1811
new_trans_res= single_value_in_to_exists_transformer(
1812
old_engine_ptr->join,
1813
Eq_creator::instance());
1764
new_trans_res= single_value_in_to_exists_transformer(old_engine_ptr->join, Eq_creator::instance());
1815
1766
new_trans_res= row_value_in_to_exists_transformer(old_engine_ptr->join);
1816
1767
res= (new_trans_res != Item_subselect::RES_OK);
1864
1814
if (! outer_join || ! outer_join->tables || ! outer_join->join_tab)
1867
if (!(left_expr_cache= new List<Cached_item>))
1817
left_expr_cache= new List<Cached_item>;
1870
1819
for (uint32_t i= 0; i < left_expr->cols(); i++)
1872
1821
Cached_item *cur_item_cache= new_Cached_item(session, left_expr->element_index(i));
1873
if (!cur_item_cache || left_expr_cache->push_front(cur_item_cache))
1822
if (!cur_item_cache)
1824
left_expr_cache->push_front(cur_item_cache);
1909
1859
void Item_allany_subselect::print(String *str)
1911
1861
if (exec_method == IN_TO_EXISTS)
1912
1863
str->append(STRING_WITH_LEN("<exists>"));
1915
1867
left_expr->print(str);
1916
1868
str->append(' ');
1917
str->append(func->symbol(all));
1869
str->append(func->symbol(all), strlen(func->symbol(all)));
1918
1870
str->append(all ? " all " : " any ", 5);
1920
1872
Item_subselect::print(str);
2037
join= new Join(session, select_lex->item_list,
2038
select_lex->options | SELECT_NO_UNLOCK, result);
2039
if (!join || !result)
1991
join= new Join(session, select_lex->item_list, select_lex->options | SELECT_NO_UNLOCK, result);
2040
1993
return 1; /* Fatal error is set already. */
2042
Select_Lex *save_select= session->getLex()->current_select;
2043
session->getLex()->current_select= select_lex;
1995
Select_Lex *save_select= session->lex().current_select;
1996
session->lex().current_select= select_lex;
2044
1997
if (join->prepare(&select_lex->ref_pointer_array,
2045
1998
(TableList*) select_lex->table_list.first,
2046
1999
select_lex->with_wild,
2151
2104
int subselect_single_select_engine::exec()
2153
2106
char const *save_where= session->where();
2154
Select_Lex *save_select= session->getLex()->current_select;
2155
session->getLex()->current_select= select_lex;
2107
Select_Lex *save_select= session->lex().current_select;
2108
session->lex().current_select= select_lex;
2156
2109
if (!join->optimized)
2158
2111
Select_Lex_Unit *unit= select_lex->master_unit();
2163
2116
session->setWhere(save_where);
2165
session->getLex()->current_select= save_select;
2118
session->lex().current_select= save_select;
2166
2119
return(join->error ? join->error : 1);
2168
if (save_join_if_explain())
2121
save_join_if_explain();
2171
2122
if (item->engine_changed)
2176
2127
if (select_lex->uncacheable.any() &&
2241
2192
session->setWhere(save_where);
2242
session->getLex()->current_select= save_select;
2193
session->lex().current_select= save_select;
2243
2194
return(join->error||session->is_fatal_error);
2245
2196
session->setWhere(save_where);
2246
session->getLex()->current_select= save_select;
2197
session->lex().current_select= save_select;
2251
subselect_single_select_engine::save_join_if_explain()
2201
void subselect_single_select_engine::save_join_if_explain()
2254
2204
Save this JOIN to join->tmp_join since the original layout will be
2263
2213
make a replacement JOIN by calling make_simple_join().
2264
2214
5) The Item_subselect is cacheable
2266
if (session->getLex()->describe && // 1
2216
if (session->lex().describe && // 1
2267
2217
select_lex->uncacheable.none() && // 2
2268
2218
!(join->select_options & SELECT_DESCRIBE) && // 3
2269
2219
join->need_tmp && // 4
2779
2727
void subselect_uniquesubquery_engine::print(String *str)
2781
const char *table_name= tab->table->getShare()->getTableName();
2782
2729
str->append(STRING_WITH_LEN("<primary_index_lookup>("));
2783
2730
tab->ref.items[0]->print(str);
2784
2731
str->append(STRING_WITH_LEN(" in "));
2791
2738
str->append(STRING_WITH_LEN("<temporary table>"));
2794
str->append(table_name, tab->table->getShare()->getTableNameSize());
2795
KeyInfo *key_info= tab->table->key_info+ tab->ref.key;
2741
str->append(tab->table->getShare()->getTableNameRef());
2796
2742
str->append(STRING_WITH_LEN(" on "));
2797
str->append(key_info->name);
2743
str->append(tab->table->key_info[tab->ref.key].name, strlen(tab->table->key_info[tab->ref.key].name));
2800
2746
str->append(STRING_WITH_LEN(" where "));
2832
2778
str->append(STRING_WITH_LEN("<index_lookup>("));
2833
2779
tab->ref.items[0]->print(str);
2834
2780
str->append(STRING_WITH_LEN(" in "));
2835
str->append(tab->table->getShare()->getTableName(), tab->table->getShare()->getTableNameSize());
2781
str->append(tab->table->getShare()->getTableNameRef());
2836
2782
KeyInfo *key_info= tab->table->key_info+ tab->ref.key;
2837
2783
str->append(STRING_WITH_LEN(" on "));
2838
str->append(key_info->name);
2784
str->append(key_info->name, strlen(key_info->name));
2839
2785
if (check_null)
2840
2787
str->append(STRING_WITH_LEN(" checking NULL"));
2843
2792
str->append(STRING_WITH_LEN(" where "));
2844
2793
cond->print(str);
2848
2798
str->append(STRING_WITH_LEN(" having "));
2849
2799
having->print(str);
2851
2802
str->append(')');
3021
2972
result stream in a temporary table. The temporary table itself is
3022
2973
managed (created/filled/etc) internally by the interceptor.
3024
if (!(tmp_result_sink= new select_union))
2975
tmp_result_sink= new select_union;
3027
if (tmp_result_sink->create_result_table(
3028
session, tmp_columns, true,
3029
session->options | TMP_TABLE_ALL_COLUMNS,
3030
"materialized subselect"))
2977
if (tmp_result_sink->create_result_table(session, tmp_columns, true,
2978
session->options | TMP_TABLE_ALL_COLUMNS, "materialized subselect"))
3033
2981
tmp_table= tmp_result_sink->table;
3034
2982
tmp_key= tmp_table->key_info;
3071
3019
- here we initialize only those members that are used by
3072
3020
subselect_uniquesubquery_engine, so these objects are incomplete.
3074
if (!(tab= (JoinTable*) session->getMemRoot()->allocate(sizeof(JoinTable))))
3076
new (tab) JoinTable();
3022
tab= new (session->mem) JoinTable;
3077
3023
tab->table= tmp_table;
3078
3024
tab->ref.key= 0; /* The only temp table index. */
3079
3025
tab->ref.key_length= tmp_key->key_length;
3080
if (!(tab->ref.key_buff=
3081
(unsigned char*) session->calloc(ALIGN_SIZE(tmp_key->key_length) * 2)) ||
3082
!(tab->ref.key_copy=
3083
(StoredKey**) session->getMemRoot()->allocate((sizeof(StoredKey*) *
3084
(tmp_key_parts + 1)))) ||
3086
(Item**) session->getMemRoot()->allocate(sizeof(Item*) * tmp_key_parts)))
3026
tab->ref.key_buff= (unsigned char*) session->mem.calloc(ALIGN_SIZE(tmp_key->key_length) * 2);
3027
tab->ref.key_copy= new (session->mem) StoredKey*[tmp_key_parts + 1];
3028
tab->ref.items= new (session->mem) Item*[tmp_key_parts];
3089
3030
KeyPartInfo *cur_key_part= tmp_key->key_part;
3090
3031
StoredKey **ref_key= tab->ref.key_copy;
3184
3124
if (!is_materialized)
3187
Select_Lex *save_select= session->getLex()->current_select;
3188
session->getLex()->current_select= materialize_engine->select_lex;
3127
Select_Lex *save_select= session->lex().current_select;
3128
session->lex().current_select= materialize_engine->select_lex;
3189
3129
if ((res= materialize_join->optimize()))
3192
if (materialize_engine->save_join_if_explain())
3132
materialize_engine->save_join_if_explain();
3195
3134
materialize_join->exec();
3196
3135
if ((res= test(materialize_join->error || session->is_fatal_error)))