~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to drizzled/statement/alter_table.cc

  • Committer: Stewart Smith
  • Date: 2011-03-02 07:00:02 UTC
  • mto: (2241.1.2 build)
  • mto: This revision was merged to the branch mainline in revision 2242.
  • Revision ID: stewart@flamingspork.com-20110302070002-kgb2vq91dz6mfnia
use the AlterTable protobuf message list of colmuns, keys and foreign keys to drop inside the ALTER TABLE code instead of the list in alter_info

Show diffs side-by-side

added added

removed removed

Lines of Context:
266
266
  List<CreateField> new_create_list;
267
267
  /* New key definitions are added here */
268
268
  List<Key> new_key_list;
269
 
  List<AlterDrop>::iterator drop_it(alter_info->drop_list.begin());
270
269
  List<CreateField>::iterator def_it(alter_info->create_list.begin());
271
270
  List<AlterColumn>::iterator alter_it(alter_info->alter_list.begin());
272
271
  List<Key>::iterator key_it(alter_info->key_list.begin());
276
275
  uint32_t used_fields= create_info->used_fields;
277
276
  KeyInfo *key_info= table->key_info;
278
277
  bool rc= true;
 
278
  vector<string> drop_keys;
 
279
  vector<string> drop_columns;
 
280
  vector<string> drop_fkeys;
 
281
 
 
282
  /* we use drop_(keys|columns|fkey) below to check that we can do all
 
283
     operations we've been asked to do */
 
284
  for (int operationnr= 0; operationnr < alter_table_message.operations_size();
 
285
       operationnr++)
 
286
  {
 
287
    const message::AlterTable::AlterTableOperation &operation=
 
288
      alter_table_message.operations(operationnr);
 
289
 
 
290
    switch (operation.operation())
 
291
    {
 
292
    case message::AlterTable::AlterTableOperation::DROP_KEY:
 
293
      drop_keys.push_back(operation.drop_name());
 
294
      break;
 
295
    case message::AlterTable::AlterTableOperation::DROP_COLUMN:
 
296
      drop_columns.push_back(operation.drop_name());
 
297
      break;
 
298
    case message::AlterTable::AlterTableOperation::DROP_FOREIGN_KEY:
 
299
      drop_fkeys.push_back(operation.drop_name());
 
300
      break;
 
301
    default:
 
302
      break;
 
303
    }
 
304
  }
279
305
 
280
306
  /* Let new create options override the old ones */
281
307
  message::Table::TableOptions *table_options;
301
327
  for (Field **f_ptr= table->getFields(); (field= *f_ptr); f_ptr++)
302
328
  {
303
329
    /* Check if field should be dropped */
304
 
    AlterDrop *drop;
305
 
    drop_it= alter_info->drop_list.begin();
306
 
    while ((drop= drop_it++))
 
330
    vector<string>::iterator it= drop_columns.begin();
 
331
    while ((it != drop_columns.end()))
307
332
    {
308
 
      if (drop->type == AlterDrop::COLUMN &&
309
 
          ! my_strcasecmp(system_charset_info, field->field_name, drop->name))
 
333
      if (! my_strcasecmp(system_charset_info, field->field_name, (*it).c_str()))
310
334
      {
311
335
        /* Reset auto_increment value if it was dropped */
312
336
        if (MTYP_TYPENR(field->unireg_check) == Field::NEXT_NUMBER &&
317
341
        }
318
342
        break;
319
343
      }
 
344
      it++;
320
345
    }
321
346
 
322
 
    if (drop)
 
347
    if (it != drop_columns.end())
323
348
    {
324
 
      drop_it.remove();
 
349
      drop_columns.erase(it);
325
350
      continue;
326
351
    }
327
 
    
 
352
 
328
353
    /* Mark that we will read the field */
329
354
    field->setReadSet();
330
355
 
470
495
  for (uint32_t i= 0; i < table->getShare()->sizeKeys(); i++, key_info++)
471
496
  {
472
497
    char *key_name= key_info->name;
473
 
    AlterDrop *drop;
474
498
 
475
 
    drop_it= alter_info->drop_list.begin();
476
 
    while ((drop= drop_it++))
 
499
    vector<string>::iterator it= drop_keys.begin();
 
500
    while ((it != drop_keys.end()))
477
501
    {
478
 
      if (drop->type == AlterDrop::KEY &&
479
 
          ! my_strcasecmp(system_charset_info, key_name, drop->name))
 
502
      if (! my_strcasecmp(system_charset_info, key_name, (*it).c_str()))
480
503
        break;
 
504
      it++;
481
505
    }
482
506
 
483
 
    if (drop)
 
507
    if (it != drop_keys.end())
484
508
    {
485
 
      drop_it.remove();
 
509
      drop_keys.erase(it);
486
510
      continue;
487
511
    }
488
512
 
576
600
  /* Copy over existing foreign keys */
577
601
  for (int32_t j= 0; j < original_proto.fk_constraint_size(); j++)
578
602
  {
579
 
    AlterDrop *drop;
580
 
    drop_it= alter_info->drop_list.begin();
581
 
    while ((drop= drop_it++))
 
603
    vector<string>::iterator it= drop_fkeys.begin();
 
604
    while ((it != drop_fkeys.end()))
582
605
    {
583
 
      if (drop->type == AlterDrop::FOREIGN_KEY &&
584
 
          ! my_strcasecmp(system_charset_info, original_proto.fk_constraint(j).name().c_str(), drop->name))
 
606
      if (! my_strcasecmp(system_charset_info, original_proto.fk_constraint(j).name().c_str(), (*it).c_str()))
585
607
      {
586
608
        break;
587
609
      }
 
610
      it++;
588
611
    }
589
 
    if (drop)
 
612
 
 
613
    if (it != drop_fkeys.end())
590
614
    {
591
 
      drop_it.remove();
 
615
      drop_fkeys.erase(it);
592
616
      continue;
593
617
    }
594
618
 
648
672
    }
649
673
  }
650
674
 
651
 
  if (alter_info->drop_list.size())
652
 
  {
653
 
    my_error(ER_CANT_DROP_FIELD_OR_KEY,
654
 
             MYF(0),
655
 
             alter_info->drop_list.front().name);
 
675
  if (drop_keys.size())
 
676
  {
 
677
    my_error(ER_CANT_DROP_FIELD_OR_KEY,
 
678
             MYF(0),
 
679
             drop_keys.front().c_str());
 
680
    return true;
 
681
  }
 
682
 
 
683
  if (drop_columns.size())
 
684
  {
 
685
    my_error(ER_CANT_DROP_FIELD_OR_KEY,
 
686
             MYF(0),
 
687
             drop_columns.front().c_str());
 
688
    return true;
 
689
  }
 
690
 
 
691
  if (drop_fkeys.size())
 
692
  {
 
693
    my_error(ER_CANT_DROP_FIELD_OR_KEY,
 
694
             MYF(0),
 
695
             drop_fkeys.front().c_str());
656
696
    return true;
657
697
  }
658
698