~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to drizzled/show.cc

  • Committer: Nathan Williams
  • Date: 2009-07-02 06:54:37 UTC
  • mfrom: (1085 staging)
  • mto: This revision was merged to the branch mainline in revision 1087.
  • Revision ID: nathanlws@gmail.com-20090702065437-nmgxvuk837rpa3e0
Merged trunk, resolved conflicts.

Show diffs side-by-side

added added

removed removed

Lines of Context:
278
278
    field_list.push_back(new Item_empty_string("Table",NAME_CHAR_LEN));
279
279
    // 1024 is for not to confuse old clients
280
280
    field_list.push_back(new Item_empty_string("Create Table",
281
 
                                               cmax(buffer.length(),(uint32_t)1024)));
 
281
                                               max(buffer.length(),(uint32_t)1024)));
282
282
  }
283
283
 
284
284
  if (protocol->sendFields(&field_list,
1354
1354
/* This is only used internally, but we need it here as a forward reference */
1355
1355
extern InfoSchemaTable schema_tables[];
1356
1356
 
1357
 
typedef struct st_lookup_field_values
1358
 
{
1359
 
  LEX_STRING db_value, table_value;
1360
 
  bool wild_db_value, wild_table_value;
1361
 
} LOOKUP_FIELD_VALUES;
1362
 
 
1363
 
 
1364
1357
/*
1365
1358
  Store record to I_S table, convert HEAP table
1366
1359
  to MyISAM if necessary
2375
2368
}
2376
2369
 
2377
2370
 
2378
 
bool store_schema_shemata(Session* session, Table *table, LEX_STRING *db_name,
2379
 
                          const CHARSET_INFO * const cs)
2380
 
{
2381
 
  table->restoreRecordAsDefault();
2382
 
  table->field[1]->store(db_name->str, db_name->length, system_charset_info);
2383
 
  table->field[2]->store(cs->csname, strlen(cs->csname), system_charset_info);
2384
 
  table->field[3]->store(cs->name, strlen(cs->name), system_charset_info);
2385
 
  return schema_table_store_record(session, table);
2386
 
}
2387
 
 
2388
 
 
2389
 
int SchemataISMethods::fillTable(Session *session, TableList *tables, COND *cond)
2390
 
{
2391
 
  /*
2392
 
    TODO: fill_schema_shemata() is called when new client is connected.
2393
 
    Returning error status in this case leads to client hangup.
2394
 
  */
2395
 
 
2396
 
  LOOKUP_FIELD_VALUES lookup_field_vals;
2397
 
  bool with_i_schema;
2398
 
  Table *table= tables->table;
2399
 
 
2400
 
  if (get_lookup_field_values(session, cond, tables, &lookup_field_vals))
2401
 
    return(0);
2402
 
 
2403
 
  vector<LEX_STRING*> db_names;
2404
 
  if (make_db_list(session, db_names, &lookup_field_vals, &with_i_schema))
2405
 
    return(1);
2406
 
 
2407
 
  /*
2408
 
    If we have lookup db value we should check that the database exists
2409
 
  */
2410
 
  if(lookup_field_vals.db_value.str && !lookup_field_vals.wild_db_value &&
2411
 
     !with_i_schema)
2412
 
  {
2413
 
    char path[FN_REFLEN+16];
2414
 
    uint32_t path_len;
2415
 
    struct stat stat_info;
2416
 
    if (!lookup_field_vals.db_value.str[0])
2417
 
      return(0);
2418
 
    path_len= build_table_filename(path, sizeof(path),
2419
 
                                   lookup_field_vals.db_value.str, "", false);
2420
 
    path[path_len-1]= 0;
2421
 
    if (stat(path,&stat_info))
2422
 
      return(0);
2423
 
  }
2424
 
 
2425
 
  for (vector<LEX_STRING*>::iterator db_name= db_names.begin(); db_name != db_names.end(); ++db_name)
2426
 
  {
2427
 
    if (with_i_schema)       // information schema name is always first in list
2428
 
    {
2429
 
      if (store_schema_shemata(session, table, *db_name,
2430
 
                               system_charset_info))
2431
 
        return(1);
2432
 
      with_i_schema= 0;
2433
 
      continue;
2434
 
    }
2435
 
    {
2436
 
      HA_CREATE_INFO create;
2437
 
      load_db_opt_by_name((*db_name)->str, &create);
2438
 
 
2439
 
      if (store_schema_shemata(session, table, *db_name,
2440
 
                               create.default_table_charset))
2441
 
        return(1);
2442
 
    }
2443
 
  }
2444
 
  return(0);
2445
 
}
2446
 
 
2447
 
 
2448
 
int TablesISMethods::processTable(Session *session, TableList *tables,
2449
 
                                    Table *table, bool res,
2450
 
                                    LEX_STRING *db_name,
2451
 
                                    LEX_STRING *table_name) const
2452
 
{
2453
 
  const char *tmp_buff;
2454
 
  DRIZZLE_TIME time;
2455
 
  const CHARSET_INFO * const cs= system_charset_info;
2456
 
 
2457
 
  table->restoreRecordAsDefault();
2458
 
  table->field[1]->store(db_name->str, db_name->length, cs);
2459
 
  table->field[2]->store(table_name->str, table_name->length, cs);
2460
 
  if (res)
2461
 
  {
2462
 
    /*
2463
 
      there was errors during opening tables
2464
 
    */
2465
 
    const char *error= session->is_error() ? session->main_da.message() : "";
2466
 
    if (tables->schema_table)
2467
 
      table->field[3]->store(STRING_WITH_LEN("SYSTEM VIEW"), cs);
2468
 
    else
2469
 
      table->field[3]->store(STRING_WITH_LEN("BASE Table"), cs);
2470
 
    table->field[20]->store(error, strlen(error), cs);
2471
 
    session->clear_error();
2472
 
  }
2473
 
  else
2474
 
  {
2475
 
    char option_buff[400],*ptr;
2476
 
    Table *show_table= tables->table;
2477
 
    TableShare *share= show_table->s;
2478
 
    handler *file= show_table->file;
2479
 
    StorageEngine *tmp_db_type= share->db_type();
2480
 
    if (share->tmp_table == SYSTEM_TMP_TABLE)
2481
 
      table->field[3]->store(STRING_WITH_LEN("SYSTEM VIEW"), cs);
2482
 
    else if (share->tmp_table)
2483
 
      table->field[3]->store(STRING_WITH_LEN("LOCAL TEMPORARY"), cs);
2484
 
    else
2485
 
      table->field[3]->store(STRING_WITH_LEN("BASE Table"), cs);
2486
 
 
2487
 
    for (int i= 4; i < 20; i++)
2488
 
    {
2489
 
      if (i == 7 || (i > 12 && i < 17) || i == 18)
2490
 
        continue;
2491
 
      table->field[i]->set_notnull();
2492
 
    }
2493
 
    string engine_name= ha_resolve_storage_engine_name(tmp_db_type);
2494
 
    table->field[4]->store(engine_name.c_str(), engine_name.size(), cs);
2495
 
    table->field[5]->store((int64_t) 0, true);
2496
 
 
2497
 
    ptr=option_buff;
2498
 
    if (share->min_rows)
2499
 
    {
2500
 
      ptr= strcpy(ptr," min_rows=")+10;
2501
 
      ptr= int64_t10_to_str(share->min_rows,ptr,10);
2502
 
    }
2503
 
    if (share->max_rows)
2504
 
    {
2505
 
      ptr= strcpy(ptr," max_rows=")+10;
2506
 
      ptr= int64_t10_to_str(share->max_rows,ptr,10);
2507
 
    }
2508
 
    if (share->avg_row_length)
2509
 
    {
2510
 
      ptr= strcpy(ptr," avg_row_length=")+16;
2511
 
      ptr= int64_t10_to_str(share->avg_row_length,ptr,10);
2512
 
    }
2513
 
    if (share->db_create_options & HA_OPTION_PACK_KEYS)
2514
 
      ptr= strcpy(ptr," pack_keys=1")+12;
2515
 
    if (share->db_create_options & HA_OPTION_NO_PACK_KEYS)
2516
 
      ptr= strcpy(ptr," pack_keys=0")+12;
2517
 
    /* We use CHECKSUM, instead of TABLE_CHECKSUM, for backward compability */
2518
 
    if (share->db_create_options & HA_OPTION_CHECKSUM)
2519
 
      ptr= strcpy(ptr," checksum=1")+11;
2520
 
    if (share->page_checksum != HA_CHOICE_UNDEF)
2521
 
      ptr+= sprintf(ptr, " page_checksum=%s",
2522
 
                    ha_choice_values[(uint32_t) share->page_checksum]);
2523
 
    if (share->db_create_options & HA_OPTION_DELAY_KEY_WRITE)
2524
 
      ptr= strcpy(ptr," delay_key_write=1")+18;
2525
 
    if (share->row_type != ROW_TYPE_DEFAULT)
2526
 
      ptr+= sprintf(ptr, " row_format=%s", ha_row_type[(uint32_t)share->row_type]);
2527
 
    if (share->block_size)
2528
 
    {
2529
 
      ptr= strcpy(ptr, " block_size=")+12;
2530
 
      ptr= int64_t10_to_str(share->block_size, ptr, 10);
2531
 
    }
2532
 
 
2533
 
    table->field[19]->store(option_buff+1,
2534
 
                            (ptr == option_buff ? 0 :
2535
 
                             (uint32_t) (ptr-option_buff)-1), cs);
2536
 
 
2537
 
    tmp_buff= (share->table_charset ?
2538
 
               share->table_charset->name : "default");
2539
 
    table->field[17]->store(tmp_buff, strlen(tmp_buff), cs);
2540
 
 
2541
 
    if (share->comment.str)
2542
 
      table->field[20]->store(share->comment.str, share->comment.length, cs);
2543
 
 
2544
 
    if(file)
2545
 
    {
2546
 
      file->info(HA_STATUS_VARIABLE | HA_STATUS_TIME | HA_STATUS_AUTO |
2547
 
                 HA_STATUS_NO_LOCK);
2548
 
      enum row_type row_type = file->get_row_type();
2549
 
      switch (row_type) {
2550
 
      case ROW_TYPE_NOT_USED:
2551
 
      case ROW_TYPE_DEFAULT:
2552
 
        tmp_buff= ((share->db_options_in_use &
2553
 
                    HA_OPTION_COMPRESS_RECORD) ? "Compressed" :
2554
 
                   (share->db_options_in_use & HA_OPTION_PACK_RECORD) ?
2555
 
                   "Dynamic" : "Fixed");
2556
 
        break;
2557
 
      case ROW_TYPE_FIXED:
2558
 
        tmp_buff= "Fixed";
2559
 
        break;
2560
 
      case ROW_TYPE_DYNAMIC:
2561
 
        tmp_buff= "Dynamic";
2562
 
        break;
2563
 
      case ROW_TYPE_COMPRESSED:
2564
 
        tmp_buff= "Compressed";
2565
 
        break;
2566
 
      case ROW_TYPE_REDUNDANT:
2567
 
        tmp_buff= "Redundant";
2568
 
        break;
2569
 
      case ROW_TYPE_COMPACT:
2570
 
        tmp_buff= "Compact";
2571
 
        break;
2572
 
      case ROW_TYPE_PAGE:
2573
 
        tmp_buff= "Paged";
2574
 
        break;
2575
 
      }
2576
 
      table->field[6]->store(tmp_buff, strlen(tmp_buff), cs);
2577
 
      if (!tables->schema_table)
2578
 
      {
2579
 
        table->field[7]->store((int64_t) file->stats.records, true);
2580
 
        table->field[7]->set_notnull();
2581
 
      }
2582
 
      table->field[8]->store((int64_t) file->stats.mean_rec_length, true);
2583
 
      table->field[9]->store((int64_t) file->stats.data_file_length, true);
2584
 
      if (file->stats.max_data_file_length)
2585
 
      {
2586
 
        table->field[10]->store((int64_t) file->stats.max_data_file_length,
2587
 
                                true);
2588
 
      }
2589
 
      table->field[11]->store((int64_t) file->stats.index_file_length, true);
2590
 
      table->field[12]->store((int64_t) file->stats.delete_length, true);
2591
 
      if (show_table->found_next_number_field)
2592
 
      {
2593
 
        table->field[13]->store((int64_t) file->stats.auto_increment_value,
2594
 
                                true);
2595
 
        table->field[13]->set_notnull();
2596
 
      }
2597
 
      if (file->stats.create_time)
2598
 
      {
2599
 
        session->variables.time_zone->gmt_sec_to_TIME(&time,
2600
 
                                                  (time_t) file->stats.create_time);
2601
 
        table->field[14]->store_time(&time, DRIZZLE_TIMESTAMP_DATETIME);
2602
 
        table->field[14]->set_notnull();
2603
 
      }
2604
 
      if (file->stats.update_time)
2605
 
      {
2606
 
        session->variables.time_zone->gmt_sec_to_TIME(&time,
2607
 
                                                  (time_t) file->stats.update_time);
2608
 
        table->field[15]->store_time(&time, DRIZZLE_TIMESTAMP_DATETIME);
2609
 
        table->field[15]->set_notnull();
2610
 
      }
2611
 
      if (file->stats.check_time)
2612
 
      {
2613
 
        session->variables.time_zone->gmt_sec_to_TIME(&time,
2614
 
                                                  (time_t) file->stats.check_time);
2615
 
        table->field[16]->store_time(&time, DRIZZLE_TIMESTAMP_DATETIME);
2616
 
        table->field[16]->set_notnull();
2617
 
      }
2618
 
      if (file->ha_table_flags() & (ulong) HA_HAS_CHECKSUM)
2619
 
      {
2620
 
        table->field[18]->store((int64_t) file->checksum(), true);
2621
 
        table->field[18]->set_notnull();
2622
 
      }
2623
 
    }
2624
 
  }
2625
 
  return(schema_table_store_record(session, table));
2626
 
}
2627
 
 
2628
 
 
2629
2371
/**
2630
2372
  @brief    Store field characteristics into appropriate I_S table columns
2631
2373
 
2855
2597
}
2856
2598
 
2857
2599
 
2858
 
int StatsISMethods::processTable(Session *session, TableList *tables,
2859
 
                                  Table *table, bool res,
2860
 
                                  LEX_STRING *db_name,
2861
 
                                  LEX_STRING *table_name) const
2862
 
{
2863
 
  const CHARSET_INFO * const cs= system_charset_info;
2864
 
  if (res)
2865
 
  {
2866
 
    if (session->lex->sql_command != SQLCOM_SHOW_KEYS)
2867
 
    {
2868
 
      /*
2869
 
        I.e. we are in SELECT FROM INFORMATION_SCHEMA.STATISTICS
2870
 
        rather than in SHOW KEYS
2871
 
      */
2872
 
      if (session->is_error())
2873
 
        push_warning(session, DRIZZLE_ERROR::WARN_LEVEL_WARN,
2874
 
                     session->main_da.sql_errno(), session->main_da.message());
2875
 
      session->clear_error();
2876
 
      res= 0;
2877
 
    }
2878
 
    return(res);
2879
 
  }
2880
 
  else
2881
 
  {
2882
 
    Table *show_table= tables->table;
2883
 
    KEY *key_info=show_table->s->key_info;
2884
 
    if (show_table->file)
2885
 
      show_table->file->info(HA_STATUS_VARIABLE |
2886
 
                             HA_STATUS_NO_LOCK |
2887
 
                             HA_STATUS_TIME);
2888
 
    for (uint32_t i=0 ; i < show_table->s->keys ; i++,key_info++)
2889
 
    {
2890
 
      KEY_PART_INFO *key_part= key_info->key_part;
2891
 
      const char *str;
2892
 
      for (uint32_t j=0 ; j < key_info->key_parts ; j++,key_part++)
2893
 
      {
2894
 
        table->restoreRecordAsDefault();
2895
 
        table->field[1]->store(db_name->str, db_name->length, cs);
2896
 
        table->field[2]->store(table_name->str, table_name->length, cs);
2897
 
        table->field[3]->store((int64_t) ((key_info->flags &
2898
 
                                            HA_NOSAME) ? 0 : 1), true);
2899
 
        table->field[4]->store(db_name->str, db_name->length, cs);
2900
 
        table->field[5]->store(key_info->name, strlen(key_info->name), cs);
2901
 
        table->field[6]->store((int64_t) (j+1), true);
2902
 
        str=(key_part->field ? key_part->field->field_name :
2903
 
             "?unknown field?");
2904
 
        table->field[7]->store(str, strlen(str), cs);
2905
 
        if (show_table->file)
2906
 
        {
2907
 
          if (show_table->file->index_flags(i, j, 0) & HA_READ_ORDER)
2908
 
          {
2909
 
            table->field[8]->store(((key_part->key_part_flag &
2910
 
                                     HA_REVERSE_SORT) ?
2911
 
                                    "D" : "A"), 1, cs);
2912
 
            table->field[8]->set_notnull();
2913
 
          }
2914
 
          KEY *key=show_table->key_info+i;
2915
 
          if (key->rec_per_key[j])
2916
 
          {
2917
 
            ha_rows records=(show_table->file->stats.records /
2918
 
                             key->rec_per_key[j]);
2919
 
            table->field[9]->store((int64_t) records, true);
2920
 
            table->field[9]->set_notnull();
2921
 
          }
2922
 
          str= show_table->file->index_type(i);
2923
 
          table->field[13]->store(str, strlen(str), cs);
2924
 
        }
2925
 
        if ((key_part->field &&
2926
 
             key_part->length !=
2927
 
             show_table->s->field[key_part->fieldnr-1]->key_length()))
2928
 
        {
2929
 
          table->field[10]->store((int64_t) key_part->length /
2930
 
                                  key_part->field->charset()->mbmaxlen, true);
2931
 
          table->field[10]->set_notnull();
2932
 
        }
2933
 
        uint32_t flags= key_part->field ? key_part->field->flags : 0;
2934
 
        const char *pos=(char*) ((flags & NOT_NULL_FLAG) ? "" : "YES");
2935
 
        table->field[12]->store(pos, strlen(pos), cs);
2936
 
        if (!show_table->s->keys_in_use.test(i))
2937
 
          table->field[14]->store(STRING_WITH_LEN("disabled"), cs);
2938
 
        else
2939
 
          table->field[14]->store("", 0, cs);
2940
 
        table->field[14]->set_notnull();
2941
 
        assert(test(key_info->flags & HA_USES_COMMENT) ==
2942
 
                   (key_info->comment.length > 0));
2943
 
        if (key_info->flags & HA_USES_COMMENT)
2944
 
          table->field[15]->store(key_info->comment.str,
2945
 
                                  key_info->comment.length, cs);
2946
 
        if (schema_table_store_record(session, table))
2947
 
          return(1);
2948
 
      }
2949
 
    }
2950
 
  }
2951
 
  return(res);
2952
 
}
2953
 
 
2954
 
 
2955
 
int OpenTablesISMethods::fillTable(Session *session, TableList *tables, COND *)
2956
 
{
2957
 
  const char *wild= session->lex->wild ? session->lex->wild->ptr() : NULL;
2958
 
  Table *table= tables->table;
2959
 
  const CHARSET_INFO * const cs= system_charset_info;
2960
 
  OPEN_TableList *open_list;
2961
 
  if (!(open_list=list_open_tables(session->lex->select_lex.db, wild))
2962
 
            && session->is_fatal_error)
2963
 
    return(1);
2964
 
 
2965
 
  for (; open_list ; open_list=open_list->next)
2966
 
  {
2967
 
    table->restoreRecordAsDefault();
2968
 
    table->field[0]->store(open_list->db, strlen(open_list->db), cs);
2969
 
    table->field[1]->store(open_list->table, strlen(open_list->table), cs);
2970
 
    table->field[2]->store((int64_t) open_list->in_use, true);
2971
 
    table->field[3]->store((int64_t) open_list->locked, true);
2972
 
    if (schema_table_store_record(session, table))
2973
 
      return(1);
2974
 
  }
2975
 
  return(0);
2976
 
}
2977
 
 
2978
 
 
2979
2600
int VariablesISMethods::fillTable(Session *session, TableList *tables, COND *)
2980
2601
{
2981
2602
  int res= 0;
3233
2854
}
3234
2855
 
3235
2856
 
3236
 
int SchemataISMethods::oldFormat(Session *session, InfoSchemaTable *schema_table)
3237
 
  const
3238
 
{
3239
 
  char tmp[128];
3240
 
  LEX *lex= session->lex;
3241
 
  Select_Lex *sel= lex->current_select;
3242
 
  Name_resolution_context *context= &sel->context;
3243
 
  const InfoSchemaTable::Columns columns= schema_table->getColumns();
3244
 
 
3245
 
  if (!sel->item_list.elements)
3246
 
  {
3247
 
    const ColumnInfo *column= columns[1];
3248
 
    String buffer(tmp,sizeof(tmp), system_charset_info);
3249
 
    Item_field *field= new Item_field(context,
3250
 
                                      NULL, NULL, column->getName().c_str());
3251
 
    if (!field || session->add_item_to_list(field))
3252
 
      return 1;
3253
 
    buffer.length(0);
3254
 
    buffer.append(column->getOldName().c_str());
3255
 
    if (lex->wild && lex->wild->ptr())
3256
 
    {
3257
 
      buffer.append(STRING_WITH_LEN(" ("));
3258
 
      buffer.append(lex->wild->ptr());
3259
 
      buffer.append(')');
3260
 
    }
3261
 
    field->set_name(buffer.ptr(), buffer.length(), system_charset_info);
3262
 
  }
3263
 
  return 0;
3264
 
}
3265
 
 
3266
 
 
3267
 
int TabNamesISMethods::oldFormat(Session *session, InfoSchemaTable *schema_table)
3268
 
  const
3269
 
{
3270
 
  char tmp[128];
3271
 
  String buffer(tmp,sizeof(tmp), session->charset());
3272
 
  LEX *lex= session->lex;
3273
 
  Name_resolution_context *context= &lex->select_lex.context;
3274
 
  const InfoSchemaTable::Columns columns= schema_table->getColumns();
3275
 
 
3276
 
  const ColumnInfo *column= columns[2];
3277
 
  buffer.length(0);
3278
 
  buffer.append(column->getOldName().c_str());
3279
 
  buffer.append(lex->select_lex.db);
3280
 
  if (lex->wild && lex->wild->ptr())
3281
 
  {
3282
 
    buffer.append(STRING_WITH_LEN(" ("));
3283
 
    buffer.append(lex->wild->ptr());
3284
 
    buffer.append(')');
3285
 
  }
3286
 
  Item_field *field= new Item_field(context,
3287
 
                                    NULL, NULL, column->getName().c_str());
3288
 
  if (session->add_item_to_list(field))
3289
 
    return 1;
3290
 
  field->set_name(buffer.ptr(), buffer.length(), system_charset_info);
3291
 
  if (session->lex->verbose)
3292
 
  {
3293
 
    field->set_name(buffer.ptr(), buffer.length(), system_charset_info);
3294
 
    column= columns[3];
3295
 
    field= new Item_field(context, NULL, NULL, column->getName().c_str());
3296
 
    if (session->add_item_to_list(field))
3297
 
      return 1;
3298
 
    field->set_name(column->getOldName().c_str(), 
3299
 
                    column->getOldName().length(),
3300
 
                    system_charset_info);
3301
 
  }
3302
 
  return 0;
3303
 
}
3304
 
 
3305
 
 
3306
 
int ColumnsISMethods::oldFormat(Session *session, InfoSchemaTable *schema_table)
3307
 
  const
3308
 
{
3309
 
  int fields_arr[]= {3, 14, 13, 6, 15, 5, 16, 17, 18, -1};
3310
 
  int *field_num= fields_arr;
3311
 
  const InfoSchemaTable::Columns columns= schema_table->getColumns();
3312
 
  const ColumnInfo *column;
3313
 
  Name_resolution_context *context= &session->lex->select_lex.context;
3314
 
 
3315
 
  for (; *field_num >= 0; field_num++)
3316
 
  {
3317
 
    column= columns[*field_num];
3318
 
    if (!session->lex->verbose && (*field_num == 13 ||
3319
 
                               *field_num == 17 ||
3320
 
                               *field_num == 18))
3321
 
      continue;
3322
 
    Item_field *field= new Item_field(context,
3323
 
                                      NULL, NULL, column->getName().c_str());
3324
 
    if (field)
3325
 
    {
3326
 
      field->set_name(column->getOldName().c_str(),
3327
 
                      column->getOldName().length(),
3328
 
                      system_charset_info);
3329
 
      if (session->add_item_to_list(field))
3330
 
        return 1;
3331
 
    }
3332
 
  }
3333
 
  return 0;
3334
 
}
3335
 
 
3336
 
 
3337
2857
/*
3338
2858
  Create information_schema table
3339
2859
 
3499
3019
  return(result);
3500
3020
}
3501
3021
 
3502
 
ColumnInfo schema_fields_info[]=
3503
 
{
3504
 
  ColumnInfo("CATALOG_NAME",
3505
 
            FN_REFLEN,
3506
 
            DRIZZLE_TYPE_VARCHAR,
3507
 
            0, 1, "", SKIP_OPEN_TABLE),
3508
 
  ColumnInfo("SCHEMA_NAME",
3509
 
            NAME_CHAR_LEN,
3510
 
            DRIZZLE_TYPE_VARCHAR,
3511
 
            0, 0, "Database", SKIP_OPEN_TABLE),
3512
 
  ColumnInfo("DEFAULT_CHARACTER_SET_NAME", 
3513
 
            64, DRIZZLE_TYPE_VARCHAR, 0, 0, "",
3514
 
            SKIP_OPEN_TABLE),
3515
 
  ColumnInfo("DEFAULT_COLLATION_NAME",
3516
 
            64, DRIZZLE_TYPE_VARCHAR, 0, 0, "",
3517
 
            SKIP_OPEN_TABLE),
3518
 
  ColumnInfo("SQL_PATH",
3519
 
            FN_REFLEN,
3520
 
            DRIZZLE_TYPE_VARCHAR,
3521
 
            0, 1, "", SKIP_OPEN_TABLE),
3522
 
  ColumnInfo()
3523
 
};
3524
 
 
3525
 
 
3526
 
ColumnInfo tables_fields_info[]=
3527
 
{
3528
 
  ColumnInfo("TABLE_CATALOG",  FN_REFLEN, DRIZZLE_TYPE_VARCHAR,
3529
 
            0, 1, "", SKIP_OPEN_TABLE),
3530
 
  ColumnInfo("TABLE_SCHEMA", NAME_CHAR_LEN, DRIZZLE_TYPE_VARCHAR,
3531
 
            0, 0, "", SKIP_OPEN_TABLE), 
3532
 
  ColumnInfo("TABLE_NAME", NAME_CHAR_LEN, DRIZZLE_TYPE_VARCHAR,
3533
 
            0, 0, "Name", SKIP_OPEN_TABLE),
3534
 
  ColumnInfo("TABLE_TYPE", NAME_CHAR_LEN, DRIZZLE_TYPE_VARCHAR,
3535
 
            0, 0, "", OPEN_FRM_ONLY),
3536
 
  ColumnInfo("ENGINE", NAME_CHAR_LEN, DRIZZLE_TYPE_VARCHAR,
3537
 
            0, 1, "Engine", OPEN_FRM_ONLY),
3538
 
  ColumnInfo("VERSION", MY_INT64_NUM_DECIMAL_DIGITS, DRIZZLE_TYPE_LONGLONG, 0,
3539
 
   (MY_I_S_MAYBE_NULL | MY_I_S_UNSIGNED), "Version", OPEN_FRM_ONLY),
3540
 
  ColumnInfo("ROW_FORMAT", 10, DRIZZLE_TYPE_VARCHAR, 0, 1, "Row_format", OPEN_FULL_TABLE),
3541
 
  ColumnInfo("TABLE_ROWS", MY_INT64_NUM_DECIMAL_DIGITS, DRIZZLE_TYPE_LONGLONG, 0,
3542
 
   (MY_I_S_MAYBE_NULL | MY_I_S_UNSIGNED), "Rows", OPEN_FULL_TABLE),
3543
 
  ColumnInfo("AVG_ROW_LENGTH", MY_INT64_NUM_DECIMAL_DIGITS, DRIZZLE_TYPE_LONGLONG, 0,
3544
 
   (MY_I_S_MAYBE_NULL | MY_I_S_UNSIGNED), "Avg_row_length", OPEN_FULL_TABLE),
3545
 
  ColumnInfo("DATA_LENGTH", MY_INT64_NUM_DECIMAL_DIGITS, DRIZZLE_TYPE_LONGLONG, 0,
3546
 
   (MY_I_S_MAYBE_NULL | MY_I_S_UNSIGNED), "Data_length", OPEN_FULL_TABLE),
3547
 
  ColumnInfo("MAX_DATA_LENGTH", MY_INT64_NUM_DECIMAL_DIGITS, DRIZZLE_TYPE_LONGLONG, 0,
3548
 
   (MY_I_S_MAYBE_NULL | MY_I_S_UNSIGNED), "Max_data_length", OPEN_FULL_TABLE),
3549
 
  ColumnInfo("INDEX_LENGTH", MY_INT64_NUM_DECIMAL_DIGITS, DRIZZLE_TYPE_LONGLONG, 0,
3550
 
   (MY_I_S_MAYBE_NULL | MY_I_S_UNSIGNED), "Index_length", OPEN_FULL_TABLE),
3551
 
  ColumnInfo("DATA_FREE", MY_INT64_NUM_DECIMAL_DIGITS, DRIZZLE_TYPE_LONGLONG, 0,
3552
 
   (MY_I_S_MAYBE_NULL | MY_I_S_UNSIGNED), "Data_free", OPEN_FULL_TABLE),
3553
 
  ColumnInfo("AUTO_INCREMENT", MY_INT64_NUM_DECIMAL_DIGITS , DRIZZLE_TYPE_LONGLONG, 0,
3554
 
   (MY_I_S_MAYBE_NULL | MY_I_S_UNSIGNED), "Auto_increment", OPEN_FULL_TABLE),
3555
 
  ColumnInfo("CREATE_TIME", 0, DRIZZLE_TYPE_DATETIME, 0, 1, "Create_time", OPEN_FULL_TABLE),
3556
 
  ColumnInfo("UPDATE_TIME", 0, DRIZZLE_TYPE_DATETIME, 0, 1, "Update_time", OPEN_FULL_TABLE),
3557
 
  ColumnInfo("CHECK_TIME", 0, DRIZZLE_TYPE_DATETIME, 0, 1, "Check_time", OPEN_FULL_TABLE),
3558
 
  ColumnInfo("TABLE_COLLATION", 64, DRIZZLE_TYPE_VARCHAR, 0, 1, "Collation", OPEN_FRM_ONLY),
3559
 
  ColumnInfo("CHECKSUM", MY_INT64_NUM_DECIMAL_DIGITS, DRIZZLE_TYPE_LONGLONG, 0,
3560
 
   (MY_I_S_MAYBE_NULL | MY_I_S_UNSIGNED), "Checksum", OPEN_FULL_TABLE),
3561
 
  ColumnInfo("CREATE_OPTIONS", 255, DRIZZLE_TYPE_VARCHAR, 0, 1, "Create_options",
3562
 
   OPEN_FRM_ONLY),
3563
 
  ColumnInfo("TABLE_COMMENT", TABLE_COMMENT_MAXLEN, DRIZZLE_TYPE_VARCHAR,
3564
 
            0, 0, "Comment", OPEN_FRM_ONLY),
3565
 
  ColumnInfo()
3566
 
};
3567
 
 
3568
 
 
3569
 
ColumnInfo columns_fields_info[]=
3570
 
{
3571
 
  ColumnInfo("TABLE_CATALOG", FN_REFLEN, DRIZZLE_TYPE_VARCHAR, 0, 1, "", OPEN_FRM_ONLY),
3572
 
  ColumnInfo("TABLE_SCHEMA", NAME_CHAR_LEN, DRIZZLE_TYPE_VARCHAR, 0, 0, "", OPEN_FRM_ONLY),
3573
 
  ColumnInfo("TABLE_NAME", NAME_CHAR_LEN, DRIZZLE_TYPE_VARCHAR, 0, 0, "", OPEN_FRM_ONLY),
3574
 
  ColumnInfo("COLUMN_NAME", NAME_CHAR_LEN, DRIZZLE_TYPE_VARCHAR, 0, 0, "Field",
3575
 
   OPEN_FRM_ONLY),
3576
 
  ColumnInfo("ORDINAL_POSITION", MY_INT64_NUM_DECIMAL_DIGITS, DRIZZLE_TYPE_LONGLONG, 0,
3577
 
   MY_I_S_UNSIGNED, "", OPEN_FRM_ONLY),
3578
 
  ColumnInfo("COLUMN_DEFAULT", MAX_FIELD_VARCHARLENGTH, DRIZZLE_TYPE_VARCHAR, 0,
3579
 
   1, "Default", OPEN_FRM_ONLY),
3580
 
  ColumnInfo("IS_NULLABLE", 3, DRIZZLE_TYPE_VARCHAR, 0, 0, "Null", OPEN_FRM_ONLY),
3581
 
  ColumnInfo("DATA_TYPE", NAME_CHAR_LEN, DRIZZLE_TYPE_VARCHAR, 0, 0, "", OPEN_FRM_ONLY),
3582
 
  ColumnInfo("CHARACTER_MAXIMUM_LENGTH", MY_INT64_NUM_DECIMAL_DIGITS, DRIZZLE_TYPE_LONGLONG,
3583
 
   0, (MY_I_S_MAYBE_NULL | MY_I_S_UNSIGNED), "", OPEN_FRM_ONLY),
3584
 
  ColumnInfo("CHARACTER_OCTET_LENGTH", MY_INT64_NUM_DECIMAL_DIGITS , DRIZZLE_TYPE_LONGLONG,
3585
 
   0, (MY_I_S_MAYBE_NULL | MY_I_S_UNSIGNED), "", OPEN_FRM_ONLY),
3586
 
  ColumnInfo("NUMERIC_PRECISION", MY_INT64_NUM_DECIMAL_DIGITS, DRIZZLE_TYPE_LONGLONG,
3587
 
   0, (MY_I_S_MAYBE_NULL | MY_I_S_UNSIGNED), "", OPEN_FRM_ONLY),
3588
 
  ColumnInfo("NUMERIC_SCALE", MY_INT64_NUM_DECIMAL_DIGITS , DRIZZLE_TYPE_LONGLONG,
3589
 
   0, (MY_I_S_MAYBE_NULL | MY_I_S_UNSIGNED), "", OPEN_FRM_ONLY),
3590
 
  ColumnInfo("CHARACTER_SET_NAME", 64, DRIZZLE_TYPE_VARCHAR, 0, 1, "", OPEN_FRM_ONLY),
3591
 
  ColumnInfo("COLLATION_NAME", 64, DRIZZLE_TYPE_VARCHAR, 0, 1, "Collation", OPEN_FRM_ONLY),
3592
 
  ColumnInfo("COLUMN_TYPE", 65535, DRIZZLE_TYPE_VARCHAR, 0, 0, "Type", OPEN_FRM_ONLY),
3593
 
  ColumnInfo("COLUMN_KEY", 3, DRIZZLE_TYPE_VARCHAR, 0, 0, "Key", OPEN_FRM_ONLY),
3594
 
  ColumnInfo("EXTRA", 27, DRIZZLE_TYPE_VARCHAR, 0, 0, "Extra", OPEN_FRM_ONLY),
3595
 
  ColumnInfo("PRIVILEGES", 80, DRIZZLE_TYPE_VARCHAR, 0, 0, "Privileges", OPEN_FRM_ONLY),
3596
 
  ColumnInfo("COLUMN_COMMENT", COLUMN_COMMENT_MAXLEN, DRIZZLE_TYPE_VARCHAR, 0, 0, "Comment", OPEN_FRM_ONLY),
3597
 
  ColumnInfo("STORAGE", 8, DRIZZLE_TYPE_VARCHAR, 0, 0, "Storage", OPEN_FRM_ONLY),
3598
 
  ColumnInfo("FORMAT", 8, DRIZZLE_TYPE_VARCHAR, 0, 0, "Format", OPEN_FRM_ONLY),
3599
 
  ColumnInfo()
3600
 
};
3601
 
 
3602
 
 
3603
 
ColumnInfo collation_fields_info[]=
3604
 
{
3605
 
  ColumnInfo("COLLATION_NAME", 64, DRIZZLE_TYPE_VARCHAR, 0, 0, "Collation", SKIP_OPEN_TABLE),
3606
 
  ColumnInfo("CHARACTER_SET_NAME", 64, DRIZZLE_TYPE_VARCHAR, 0, 0, "Charset",
3607
 
   SKIP_OPEN_TABLE),
3608
 
  ColumnInfo("ID", MY_INT32_NUM_DECIMAL_DIGITS, DRIZZLE_TYPE_LONGLONG, 0, 0, "Id",
3609
 
   SKIP_OPEN_TABLE),
3610
 
  ColumnInfo("IS_DEFAULT", 3, DRIZZLE_TYPE_VARCHAR, 0, 0, "Default", SKIP_OPEN_TABLE),
3611
 
  ColumnInfo("IS_COMPILED", 3, DRIZZLE_TYPE_VARCHAR, 0, 0, "Compiled", SKIP_OPEN_TABLE),
3612
 
  ColumnInfo("SORTLEN", 3, DRIZZLE_TYPE_LONGLONG, 0, 0, "Sortlen", SKIP_OPEN_TABLE),
3613
 
  ColumnInfo()
3614
 
};
3615
 
 
3616
 
 
3617
 
 
3618
 
ColumnInfo coll_charset_app_fields_info[]=
3619
 
{
3620
 
  ColumnInfo("COLLATION_NAME", 64, DRIZZLE_TYPE_VARCHAR, 0, 0, "", SKIP_OPEN_TABLE),
3621
 
  ColumnInfo("CHARACTER_SET_NAME", 64, DRIZZLE_TYPE_VARCHAR, 0, 0, "", SKIP_OPEN_TABLE),
3622
 
  ColumnInfo()
3623
 
};
3624
 
 
3625
 
 
3626
 
ColumnInfo stat_fields_info[]=
3627
 
{
3628
 
  ColumnInfo("TABLE_CATALOG", FN_REFLEN, DRIZZLE_TYPE_VARCHAR, 0, 1, "", OPEN_FRM_ONLY),
3629
 
  ColumnInfo("TABLE_SCHEMA", NAME_CHAR_LEN, DRIZZLE_TYPE_VARCHAR, 0, 0, "", OPEN_FRM_ONLY),
3630
 
  ColumnInfo("TABLE_NAME", NAME_CHAR_LEN, DRIZZLE_TYPE_VARCHAR, 0, 0, "Table", OPEN_FRM_ONLY),
3631
 
  ColumnInfo("NON_UNIQUE", 1, DRIZZLE_TYPE_LONGLONG, 0, 0, "Non_unique", OPEN_FRM_ONLY),
3632
 
  ColumnInfo("INDEX_SCHEMA", NAME_CHAR_LEN, DRIZZLE_TYPE_VARCHAR, 0, 0, "", OPEN_FRM_ONLY),
3633
 
  ColumnInfo("INDEX_NAME", NAME_CHAR_LEN, DRIZZLE_TYPE_VARCHAR, 0, 0, "Key_name",
3634
 
   OPEN_FRM_ONLY),
3635
 
  ColumnInfo("SEQ_IN_INDEX", 2, DRIZZLE_TYPE_LONGLONG, 0, 0, "Seq_in_index", OPEN_FRM_ONLY),
3636
 
  ColumnInfo("COLUMN_NAME", NAME_CHAR_LEN, DRIZZLE_TYPE_VARCHAR, 0, 0, "Column_name",
3637
 
   OPEN_FRM_ONLY),
3638
 
  ColumnInfo("COLLATION", 1, DRIZZLE_TYPE_VARCHAR, 0, 1, "Collation", OPEN_FRM_ONLY),
3639
 
  ColumnInfo("CARDINALITY", MY_INT64_NUM_DECIMAL_DIGITS, DRIZZLE_TYPE_LONGLONG, 0, 1,
3640
 
   "Cardinality", OPEN_FULL_TABLE),
3641
 
  ColumnInfo("SUB_PART", 3, DRIZZLE_TYPE_LONGLONG, 0, 1, "Sub_part", OPEN_FRM_ONLY),
3642
 
  ColumnInfo("PACKED", 10, DRIZZLE_TYPE_VARCHAR, 0, 1, "Packed", OPEN_FRM_ONLY),
3643
 
  ColumnInfo("NULLABLE", 3, DRIZZLE_TYPE_VARCHAR, 0, 0, "Null", OPEN_FRM_ONLY),
3644
 
  ColumnInfo("INDEX_TYPE", 16, DRIZZLE_TYPE_VARCHAR, 0, 0, "Index_type", OPEN_FULL_TABLE),
3645
 
  ColumnInfo("COMMENT", 16, DRIZZLE_TYPE_VARCHAR, 0, 1, "Comment", OPEN_FRM_ONLY),
3646
 
  ColumnInfo("INDEX_COMMENT", INDEX_COMMENT_MAXLEN, DRIZZLE_TYPE_VARCHAR, 0, 0, "Index_Comment", OPEN_FRM_ONLY),
3647
 
  ColumnInfo()
3648
 
};
3649
 
 
3650
 
 
3651
 
ColumnInfo table_names_fields_info[]=
3652
 
{
3653
 
  ColumnInfo("TABLE_CATALOG", FN_REFLEN, DRIZZLE_TYPE_VARCHAR, 0, 1, "", SKIP_OPEN_TABLE),
3654
 
  ColumnInfo("TABLE_SCHEMA",NAME_CHAR_LEN, DRIZZLE_TYPE_VARCHAR, 0, 0, "", SKIP_OPEN_TABLE),
3655
 
  ColumnInfo("TABLE_NAME", NAME_CHAR_LEN, DRIZZLE_TYPE_VARCHAR, 0, 0, "Tables_in_",
3656
 
   SKIP_OPEN_TABLE),
3657
 
  ColumnInfo("TABLE_TYPE", NAME_CHAR_LEN, DRIZZLE_TYPE_VARCHAR, 0, 0, "Table_type",
3658
 
   OPEN_FRM_ONLY),
3659
 
  ColumnInfo()
3660
 
};
3661
 
 
3662
 
 
3663
 
ColumnInfo open_tables_fields_info[]=
3664
 
{
3665
 
  ColumnInfo("Database", NAME_CHAR_LEN, DRIZZLE_TYPE_VARCHAR, 0, 0, "Database",
3666
 
   SKIP_OPEN_TABLE),
3667
 
  ColumnInfo("Table",NAME_CHAR_LEN, DRIZZLE_TYPE_VARCHAR, 0, 0, "Table", SKIP_OPEN_TABLE),
3668
 
  ColumnInfo("In_use", 1, DRIZZLE_TYPE_LONGLONG, 0, 0, "In_use", SKIP_OPEN_TABLE),
3669
 
  ColumnInfo("Name_locked", 4, DRIZZLE_TYPE_LONGLONG, 0, 0, "Name_locked", SKIP_OPEN_TABLE),
3670
 
  ColumnInfo()
3671
 
};
3672
 
 
3673
 
 
3674
3022
ColumnInfo variables_fields_info[]=
3675
3023
{
3676
3024
  ColumnInfo("VARIABLE_NAME", 64, DRIZZLE_TYPE_VARCHAR, 0, 0, "Variable_name",
3680
3028
};
3681
3029
 
3682
3030
 
3683
 
static ColumnsISMethods columns_methods;
3684
3031
static StatusISMethods status_methods;
3685
3032
static VariablesISMethods variables_methods;
3686
 
static OpenTablesISMethods open_tables_methods;
3687
 
static SchemataISMethods schemata_methods;
3688
 
static StatsISMethods stats_methods;
3689
 
static TablesISMethods tables_methods;
3690
 
static TabNamesISMethods tab_names_methods;
3691
3033
 
3692
 
static InfoSchemaTable columns_table("COLUMNS",
3693
 
                                     columns_fields_info,
3694
 
                                     1, 2, false, true, OPTIMIZE_I_S_TABLE,
3695
 
                                     &columns_methods);
3696
3034
static InfoSchemaTable global_stat_table("GLOBAL_STATUS",
3697
3035
                                         variables_fields_info,
3698
3036
                                         -1, -1, false, false, 0,
3701
3039
                                        variables_fields_info,
3702
3040
                                        -1, -1, false, false, 0,
3703
3041
                                        &variables_methods);
3704
 
static InfoSchemaTable open_tab_table("OPEN_TABLES",
3705
 
                                      open_tables_fields_info,
3706
 
                                      -1, -1, true, false, 0,
3707
 
                                      &open_tables_methods);
3708
 
static InfoSchemaTable schemata_table("SCHEMATA",
3709
 
                                      schema_fields_info,
3710
 
                                      1, -1, false, false, 0,
3711
 
                                      &schemata_methods);
3712
3042
static InfoSchemaTable sess_stat_table("SESSION_STATUS",
3713
3043
                                       variables_fields_info,
3714
3044
                                       -1, -1, false, false, 0,
3717
3047
                                      variables_fields_info,
3718
3048
                                      -1, -1, false, false, 0,
3719
3049
                                      &variables_methods);
3720
 
static InfoSchemaTable stats_table("STATISTICS",
3721
 
                                   stat_fields_info,
3722
 
                                   1, 2, false, true,
3723
 
                                   OPEN_TABLE_ONLY|OPTIMIZE_I_S_TABLE,
3724
 
                                   &stats_methods);
3725
3050
static InfoSchemaTable status_table("STATUS",
3726
3051
                                    variables_fields_info,
3727
3052
                                    -1, -1, true, false, 0,
3728
3053
                                    &status_methods);
3729
 
static InfoSchemaTable tables_table("TABLES",
3730
 
                                    tables_fields_info,
3731
 
                                    1, 2, false, true, OPTIMIZE_I_S_TABLE,
3732
 
                                    &tables_methods);
3733
 
static InfoSchemaTable tab_names_table("TABLE_NAMES",
3734
 
                                       table_names_fields_info,
3735
 
                                       1, 2, true, true, 0,
3736
 
                                       &tab_names_methods);
3737
3054
static InfoSchemaTable var_table("VARIABLES",
3738
3055
                                 variables_fields_info,
3739
3056
                                 -1, -1, true, false, 0,
3741
3058
 
3742
3059
InfoSchemaTable schema_tables[]=
3743
3060
{
3744
 
  columns_table,
3745
3061
  global_stat_table,
3746
3062
  global_var_table,
3747
 
  open_tab_table,
3748
 
  schemata_table,
3749
3063
  sess_stat_table,
3750
3064
  sess_var_table,
3751
 
  stats_table,
3752
3065
  status_table,
3753
 
  tables_table,
3754
 
  tab_names_table,
3755
3066
  var_table,
3756
3067
  InfoSchemaTable()
3757
3068
};