~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to drizzled/join.cc

  • Committer: Prafulla Tekawade
  • Date: 2010-07-06 15:51:58 UTC
  • mfrom: (1643 rollup)
  • mto: (1662.1.4 rollup)
  • mto: This revision was merged to the branch mainline in revision 1664.
  • Revision ID: prafulla_t@users.sourceforge.net-20100706155158-yf8f947vbwlyai77
Merger from main branch

Show diffs side-by-side

added added

removed removed

Lines of Context:
4458
4458
    JoinTable *tab=join->join_tab+i;
4459
4459
    Table *table=tab->table;
4460
4460
    TableList *tbl= table->pos_in_table_list;
4461
 
    TableList *embedding= tbl->embedding;
 
4461
    TableList *embedding= tbl->getEmbedding();
4462
4462
 
4463
4463
    if (tbl->outer_join)
4464
4464
    {
4471
4471
      tab->on_expr_ref= &tbl->on_expr;
4472
4472
      tab->cond_equal= tbl->cond_equal;
4473
4473
      if (embedding)
4474
 
        tab->first_upper= embedding->nested_join->first_nested;
 
4474
        tab->first_upper= embedding->getNestedJoin()->first_nested;
4475
4475
    }
4476
 
    for ( ; embedding ; embedding= embedding->embedding)
 
4476
    for ( ; embedding ; embedding= embedding->getEmbedding())
4477
4477
    {
4478
4478
      /* Ignore sj-nests: */
4479
4479
      if (!embedding->on_expr)
4480
4480
        continue;
4481
 
      nested_join_st *nested_join= embedding->nested_join;
 
4481
      nested_join_st *nested_join= embedding->getNestedJoin();
4482
4482
      if (!nested_join->counter_)
4483
4483
      {
4484
4484
        /*
4488
4488
        nested_join->first_nested= tab;
4489
4489
        tab->on_expr_ref= &embedding->on_expr;
4490
4490
        tab->cond_equal= tbl->cond_equal;
4491
 
        if (embedding->embedding)
4492
 
          tab->first_upper= embedding->embedding->nested_join->first_nested;
 
4491
        if (embedding->getEmbedding())
 
4492
          tab->first_upper= embedding->getEmbedding()->getNestedJoin()->first_nested;
4493
4493
      }
4494
4494
      if (!tab->first_inner)
4495
4495
        tab->first_inner= nested_join->first_nested;
5231
5231
    table_map used_tables;
5232
5232
    table_map not_null_tables= (table_map) 0;
5233
5233
 
5234
 
    if ((nested_join= table->nested_join))
 
5234
    if ((nested_join= table->getNestedJoin()))
5235
5235
    {
5236
5236
      /*
5237
5237
         If the element of join_list is a nested join apply
5273
5273
        not_null_tables= conds->not_null_tables();
5274
5274
    }
5275
5275
 
5276
 
    if (table->embedding)
 
5276
    if (table->getEmbedding())
5277
5277
    {
5278
 
      table->embedding->nested_join->used_tables|= used_tables;
5279
 
      table->embedding->nested_join->not_null_tables|= not_null_tables;
 
5278
      table->getEmbedding()->getNestedJoin()->used_tables|= used_tables;
 
5279
      table->getEmbedding()->getNestedJoin()->not_null_tables|= not_null_tables;
5280
5280
    }
5281
5281
 
5282
5282
    if (!table->outer_join || (used_tables & not_null_tables))
5312
5312
    */
5313
5313
    if (table->on_expr)
5314
5314
    {
5315
 
      table->dep_tables|= table->on_expr->used_tables();
5316
 
      if (table->embedding)
 
5315
      table->setDepTables(table->getDepTables() | table->on_expr->used_tables());
 
5316
      if (table->getEmbedding())
5317
5317
      {
5318
 
        table->dep_tables&= ~table->embedding->nested_join->used_tables;
 
5318
        table->setDepTables(table->getDepTables() & ~table->getEmbedding()->getNestedJoin()->used_tables);
5319
5319
        /*
5320
5320
           Embedding table depends on tables used
5321
5321
           in embedded on expressions.
5322
5322
        */
5323
 
        table->embedding->on_expr_dep_tables|= table->on_expr->used_tables();
 
5323
        table->getEmbedding()->setOnExprDepTables(table->getEmbedding()->getOnExprDepTables() & table->on_expr->used_tables());
5324
5324
      }
5325
5325
      else
5326
 
        table->dep_tables&= ~table->table->map;
 
5326
        table->setDepTables(table->getDepTables() & ~table->table->map);
5327
5327
    }
5328
5328
 
5329
5329
    if (prev_table)
5330
5330
    {
5331
5331
      /* The order of tables is reverse: prev_table follows table */
5332
5332
      if (prev_table->straight)
5333
 
        prev_table->dep_tables|= used_tables;
 
5333
        prev_table->setDepTables(prev_table->getDepTables() | used_tables);
5334
5334
      if (prev_table->on_expr)
5335
5335
      {
5336
 
        prev_table->dep_tables|= table->on_expr_dep_tables;
5337
 
        table_map prev_used_tables= prev_table->nested_join ?
5338
 
                                    prev_table->nested_join->used_tables :
 
5336
        prev_table->setDepTables(prev_table->getDepTables() | table->getOnExprDepTables());
 
5337
        table_map prev_used_tables= prev_table->getNestedJoin() ?
 
5338
                                    prev_table->getNestedJoin()->used_tables :
5339
5339
                                    prev_table->table->map;
5340
5340
        /*
5341
5341
          If on expression contains only references to inner tables
5344
5344
          for them. Yet this is really a rare case.
5345
5345
              */
5346
5346
        if (!(prev_table->on_expr->used_tables() & ~prev_used_tables))
5347
 
          prev_table->dep_tables|= used_tables;
 
5347
          prev_table->setDepTables(prev_table->getDepTables() | used_tables);
5348
5348
      }
5349
5349
    }
5350
5350
    prev_table= table;
5357
5357
  li.rewind();
5358
5358
  while ((table= li++))
5359
5359
  {
5360
 
    nested_join= table->nested_join;
 
5360
    nested_join= table->getNestedJoin();
5361
5361
    if (nested_join && !table->on_expr)
5362
5362
    {
5363
5363
      TableList *tbl;
5364
5364
      List_iterator<TableList> it(nested_join->join_list);
5365
5365
      while ((tbl= it++))
5366
5366
      {
5367
 
        tbl->embedding= table->embedding;
5368
 
        tbl->join_list= table->join_list;
 
5367
        tbl->setEmbedding(table->getEmbedding());
 
5368
        tbl->setJoinList(table->getJoinList());
5369
5369
      }
5370
5370
      li.replace(nested_join->join_list);
5371
5371
    }
5504
5504
       tables;
5505
5505
       s++, tables= tables->next_leaf, i++)
5506
5506
  {
5507
 
    TableList *embedding= tables->embedding;
 
5507
    TableList *embedding= tables->getEmbedding();
5508
5508
    stat_vector[i]=s;
5509
5509
    s->keys.reset();
5510
5510
    s->const_keys.reset();
5527
5527
    s->join=join;
5528
5528
    s->info=0;                                  // For describe
5529
5529
 
5530
 
    s->dependent= tables->dep_tables;
 
5530
    s->dependent= tables->getDepTables();
5531
5531
    s->key_dependent= 0;
5532
5532
    table->quick_condition_rows= table->cursor->stats.records;
5533
5533
 
5543
5543
      }
5544
5544
      outer_join|= table->map;
5545
5545
      s->embedding_map.reset();
5546
 
      for (;embedding; embedding= embedding->embedding)
5547
 
        s->embedding_map|= embedding->nested_join->nj_map;
 
5546
      for (;embedding; embedding= embedding->getEmbedding())
 
5547
        s->embedding_map|= embedding->getNestedJoin()->nj_map;
5548
5548
      continue;
5549
5549
    }
5550
 
    if (embedding && !(false && ! embedding->embedding))
 
5550
    if (embedding && !(false && ! embedding->getEmbedding()))
5551
5551
    {
5552
5552
      /* s belongs to a nested join, maybe to several embedded joins */
5553
5553
      s->embedding_map.reset();
5554
5554
      do
5555
5555
      {
5556
 
        nested_join_st *nested_join= embedding->nested_join;
 
5556
        nested_join_st *nested_join= embedding->getNestedJoin();
5557
5557
        s->embedding_map|= nested_join->nj_map;
5558
 
        s->dependent|= embedding->dep_tables;
5559
 
        embedding= embedding->embedding;
 
5558
        s->dependent|= embedding->getDepTables();
 
5559
        embedding= embedding->getEmbedding();
5560
5560
        outer_join|= nested_join->used_tables;
5561
5561
      }
5562
5562
      while (embedding);
5690
5690
          continue;
5691
5691
        if (table->cursor->stats.records <= 1L &&
5692
5692
            (table->cursor->getEngine()->check_flag(HTON_BIT_STATS_RECORDS_IS_EXACT)) &&
5693
 
                  !table->pos_in_table_list->embedding)
 
5693
                  !table->pos_in_table_list->getEmbedding())
5694
5694
        {                                       // system table
5695
5695
          int tmp= 0;
5696
5696
          s->type= AM_SYSTEM;
5735
5735
          } while (keyuse->getTable() == table && keyuse->getKey() == key);
5736
5736
 
5737
5737
          if (is_keymap_prefix(eq_part, table->key_info[key].key_parts) &&
5738
 
              ! table->pos_in_table_list->embedding)
 
5738
              ! table->pos_in_table_list->getEmbedding())
5739
5739
          {
5740
5740
            if ((table->key_info[key].flags & (HA_NOSAME)) == HA_NOSAME)
5741
5741
            {
5822
5822
    add_group_and_distinct_keys(join, s);
5823
5823
 
5824
5824
    if (s->const_keys.any() &&
5825
 
        !s->table->pos_in_table_list->embedding)
 
5825
        !s->table->pos_in_table_list->getEmbedding())
5826
5826
    {
5827
5827
      ha_rows records;
5828
5828
      optimizer::SqlSelect *select= NULL;
5913
5913
  while ((table= li++))
5914
5914
  {
5915
5915
    nested_join_st *nested_join;
5916
 
    if ((nested_join= table->nested_join))
 
5916
    if ((nested_join= table->getNestedJoin()))
5917
5917
    {
5918
5918
      /*
5919
5919
        It is guaranteed by simplify_joins() function that a nested join
5984
5984
  while ((table= li++))
5985
5985
  {
5986
5986
    nested_join_st *nested_join;
5987
 
    if ((nested_join= table->nested_join))
 
5987
    if ((nested_join= table->getNestedJoin()))
5988
5988
    {
5989
5989
      nested_join->counter_= 0;
5990
5990
      reset_nj_counters(&nested_join->join_list);
6024
6024
*/
6025
6025
static void restore_prev_nj_state(JoinTable *last)
6026
6026
{
6027
 
  TableList *last_emb= last->table->pos_in_table_list->embedding;
 
6027
  TableList *last_emb= last->table->pos_in_table_list->getEmbedding();
6028
6028
  Join *join= last->join;
6029
6029
  while (last_emb)
6030
6030
  {
6031
6031
    if (last_emb->on_expr)
6032
6032
    {
6033
 
      if (!(--last_emb->nested_join->counter_))
6034
 
        join->cur_embedding_map&= ~last_emb->nested_join->nj_map;
6035
 
      else if (last_emb->nested_join->join_list.elements-1 ==
6036
 
               last_emb->nested_join->counter_)
6037
 
        join->cur_embedding_map|= last_emb->nested_join->nj_map;
 
6033
      if (!(--last_emb->getNestedJoin()->counter_))
 
6034
        join->cur_embedding_map&= ~last_emb->getNestedJoin()->nj_map;
 
6035
      else if (last_emb->getNestedJoin()->join_list.elements-1 ==
 
6036
               last_emb->getNestedJoin()->counter_)
 
6037
        join->cur_embedding_map|= last_emb->getNestedJoin()->nj_map;
6038
6038
      else
6039
6039
        break;
6040
6040
    }
6041
 
    last_emb= last_emb->embedding;
 
6041
    last_emb= last_emb->getEmbedding();
6042
6042
  }
6043
6043
}
6044
6044