~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to drizzled/sql_select.cc

  • Committer: Brian Aker
  • Date: 2010-12-16 02:36:10 UTC
  • Revision ID: brian@tangent.org-20101216023610-s8zccyilntzeco63
Reverse patch with memory leak.

Show diffs side-by-side

added added

removed removed

Lines of Context:
78
78
static Item* part_of_refkey(Table *form,Field *field);
79
79
static bool cmp_buffer_with_ref(JoinTable *tab);
80
80
static void change_cond_ref_to_const(Session *session,
81
 
                                     vector<COND_CMP*>& save_list,
 
81
                                     vector<COND_CMP>& save_list,
82
82
                                     Item *and_father,
83
83
                                     Item *cond,
84
84
                                     Item *field,
2362
2362
  and_level
2363
2363
*/
2364
2364
static void change_cond_ref_to_const(Session *session,
2365
 
                                     vector<COND_CMP*>& save_list,
 
2365
                                     vector<COND_CMP>& save_list,
2366
2366
                                     Item *and_father,
2367
2367
                                     Item *cond,
2368
2368
                                     Item *field,
2403
2403
          ! left_item->const_item())
2404
2404
      {
2405
2405
        cond->marker=1;
2406
 
        COND_CMP *new_cond_cmp= new COND_CMP(and_father, func);
2407
 
        save_list.push_back( new_cond_cmp );
 
2406
        save_list.push_back( COND_CMP(and_father, func) );
2408
2407
      }
2409
2408
      func->set_cmp_func();
2410
2409
    }
2429
2428
        args[0]= args[1];                       // For easy check
2430
2429
        session->change_item_tree(args + 1, value);
2431
2430
        cond->marker=1;
2432
 
        COND_CMP *new_cond_cmp= new COND_CMP(and_father, func);
2433
 
        save_list.push_back( new_cond_cmp );
 
2431
        save_list.push_back( COND_CMP(and_father, func) );
2434
2432
      }
2435
2433
      func->set_cmp_func();
2436
2434
    }
2469
2467
}
2470
2468
 
2471
2469
static void propagate_cond_constants(Session *session, 
2472
 
                                     vector<COND_CMP*>& save_list, 
 
2470
                                     vector<COND_CMP>& save_list, 
2473
2471
                                     COND *and_father, 
2474
2472
                                     COND *cond)
2475
2473
{
2478
2476
    bool and_level= ((Item_cond*) cond)->functype() == Item_func::COND_AND_FUNC;
2479
2477
    List_iterator_fast<Item> li(*((Item_cond*) cond)->argument_list());
2480
2478
    Item *item;
2481
 
    vector<COND_CMP*> save;
 
2479
    vector<COND_CMP> save;
2482
2480
    while ((item=li++))
2483
2481
    {
2484
2482
      propagate_cond_constants(session, save, and_level ? cond : item, item);
2486
2484
    if (and_level)
2487
2485
    {
2488
2486
      // Handle other found items
2489
 
      for (vector<COND_CMP*>::iterator iter= save.begin(); iter < save.end(); iter++)
 
2487
      for (vector<COND_CMP>::iterator iter= save.begin(); iter != save.end(); ++iter)
2490
2488
      {
2491
 
        Item **args= (*iter)->second->arguments();
 
2489
        Item **args= iter->cmp_func->arguments();
2492
2490
        if (!args[0]->const_item())
2493
2491
        {
2494
 
          change_cond_ref_to_const( session, save_list, (*iter)->first,
2495
 
                                    (*iter)->first, args[0], args[1] );
 
2492
          change_cond_ref_to_const( session, save, iter->and_level,
 
2493
                                    iter->and_level, args[0], args[1] );
2496
2494
        }
2497
2495
      }
2498
2496
    }
2683
2681
                             &join->cond_equal);
2684
2682
 
2685
2683
    /* change field = field to field = const for each found field = const */
2686
 
    vector<COND_CMP*> temp;
 
2684
    vector<COND_CMP> temp;
2687
2685
    propagate_cond_constants(session, temp, conds, conds);
2688
2686
    /*
2689
2687
      Remove all instances of item == item