~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to drizzled/table.cc

  • Committer: Brian Aker
  • Date: 2010-02-09 21:18:30 UTC
  • mfrom: (1273.2.42)
  • Revision ID: brian@gaz-20100209211830-7vf91n0yasi0r28y
Merge Stewart.

Show diffs side-by-side

added added

removed removed

Lines of Context:
262
262
{
263
263
  int error= 0;
264
264
 
 
265
  if (! table.IsInitialized())
 
266
  {
 
267
    my_error(ER_CORRUPT_TABLE_DEFINITION, MYF(0), table.InitializationErrorString().c_str());
 
268
    return ER_CORRUPT_TABLE_DEFINITION;
 
269
  }
 
270
 
265
271
  share->setTableProto(new(nothrow) message::Table(table));
266
272
 
267
273
  share->storage_engine= plugin::StorageEngine::findByName(session, table.engine().name());
2364
2370
#define AVG_STRING_LENGTH_TO_PACK_ROWS   64
2365
2371
#define RATIO_TO_PACK_ROWS             2
2366
2372
 
 
2373
static void make_internal_temporary_table_path(Session *session, char* path)
 
2374
{
 
2375
  /* if we run out of slots or we are not using tempool */
 
2376
  snprintf(path, FN_REFLEN, "%s%lx_%"PRIx64"_%x", TMP_FILE_PREFIX, (unsigned long)current_pid,
 
2377
           session->thread_id, session->tmp_table++);
 
2378
 
 
2379
  /*
 
2380
    No need to change table name to lower case as we are only creating
 
2381
    MyISAM or HEAP tables here
 
2382
  */
 
2383
  internal::fn_format(path, path, drizzle_tmpdir, "", MY_REPLACE_EXT|MY_UNPACK_FILENAME);
 
2384
}
 
2385
 
2367
2386
Table *
2368
2387
create_tmp_table(Session *session,Tmp_Table_Param *param,List<Item> &fields,
2369
2388
                 order_st *group, bool distinct, bool save_sum_fields,
2398
2417
 
2399
2418
  status_var_increment(session->status_var.created_tmp_tables);
2400
2419
 
2401
 
  /* if we run out of slots or we are not using tempool */
2402
 
  snprintf(path, FN_REFLEN, "%s%lx_%"PRIx64"_%x", TMP_FILE_PREFIX, (unsigned long)current_pid,
2403
 
           session->thread_id, session->tmp_table++);
2404
 
 
2405
 
  /*
2406
 
    No need to change table name to lower case as we are only creating
2407
 
    MyISAM or HEAP tables here
2408
 
  */
2409
 
  internal::fn_format(path, path, drizzle_tmpdir, "", MY_REPLACE_EXT|MY_UNPACK_FILENAME);
2410
 
 
 
2420
  make_internal_temporary_table_path(session, path);
2411
2421
 
2412
2422
  if (group)
2413
2423
  {
2553
2563
            create_tmp_field(session, table, arg, arg->type(), &copy_func,
2554
2564
                             tmp_from_field, &default_field[fieldnr],
2555
2565
                             group != 0,not_all_columns,
2556
 
                             distinct, 0,
 
2566
                             false,
2557
2567
                             param->convert_blob_length);
2558
2568
          if (!new_field)
2559
2569
            goto err;                                   // Should be OOM
2598
2608
        We here distinguish between UNION and multi-table-updates by the fact
2599
2609
        that in the later case group is set to the row pointer.
2600
2610
      */
2601
 
      Field *new_field= 
 
2611
      Field *new_field=
2602
2612
        create_tmp_field(session, table, item, type, &copy_func,
2603
2613
                         tmp_from_field, &default_field[fieldnr],
2604
2614
                         group != 0,
2605
2615
                         !force_copy_fields &&
2606
2616
                           (not_all_columns || group != 0),
2607
 
                         /*
2608
 
                           If item->marker == 4 then we force create_tmp_field
2609
 
                           to create a 64-bit longs for BIT fields because HEAP
2610
 
                           tables can't index BIT fields directly. We do the same
2611
 
                           for distinct, as we want the distinct index to be
2612
 
                           usable in this case too.
2613
 
                         */
2614
 
                         item->marker == 4 || param->bit_fields_as_long,
2615
2617
                         force_copy_fields,
2616
2618
                         param->convert_blob_length);
2617
2619
 
3684
3686
  merge_keys.reset();
3685
3687
}
3686
3688
 
3687
 
Field *Table::find_field_in_table_sef(const char *name)
3688
 
{
3689
 
  Field **field_ptr;
3690
 
  if (s->name_hash.records)
3691
 
  {
3692
 
    field_ptr= (Field**)hash_search(&s->name_hash,(unsigned char*) name,
3693
 
                                    strlen(name));
3694
 
    if (field_ptr)
3695
 
    {
3696
 
      /*
3697
 
        field_ptr points to field in TableShare. Convert it to the matching
3698
 
        field in table
3699
 
      */
3700
 
      field_ptr= (field + (field_ptr - s->field));
3701
 
    }
3702
 
  }
3703
 
  else
3704
 
  {
3705
 
    if (!(field_ptr= field))
3706
 
      return (Field *)0;
3707
 
    for (; *field_ptr; ++field_ptr)
3708
 
      if (!my_strcasecmp(system_charset_info, (*field_ptr)->field_name, name))
3709
 
        break;
3710
 
  }
3711
 
  if (field_ptr)
3712
 
    return *field_ptr;
3713
 
  else
3714
 
    return (Field *)0;
3715
 
}
3716
 
 
3717
3689
 
3718
3690
/*
3719
3691
  Used by ALTER Table when the table is a temporary one. It changes something