359
307
int store_create_info(TableList *table_list, String *packet, bool is_if_not_exists)
361
List<Item> field_list;
362
char tmp[MAX_FIELD_WIDTH], *for_str, def_value_buf[MAX_FIELD_WIDTH];
365
String type(tmp, sizeof(tmp), system_charset_info);
366
String def_value(def_value_buf, sizeof(def_value_buf), system_charset_info);
368
uint32_t primary_key;
370
309
Table *table= table_list->table;
371
Cursor *cursor= table->cursor;
372
HA_CREATE_INFO create_info;
373
my_bitmap_map *old_map;
375
311
table->restoreRecordAsDefault(); // Get empty record
377
if (table->getShare()->getType())
378
packet->append(STRING_WITH_LEN("CREATE TEMPORARY TABLE "));
380
packet->append(STRING_WITH_LEN("CREATE TABLE "));
381
if (is_if_not_exists)
382
packet->append(STRING_WITH_LEN("IF NOT EXISTS "));
383
alias= table->getShare()->getTableName();
385
packet->append_identifier(alias, strlen(alias));
386
packet->append(STRING_WITH_LEN(" (\n"));
388
We need this to get default values from the table
389
We have to restore the read_set if we are called from insert in case
390
of row based replication.
392
old_map= table->use_all_columns(table->read_set);
394
for (ptr= table->getFields() ; (field= *ptr); ptr++)
396
uint32_t flags = field->flags;
398
if (ptr != table->getFields())
399
packet->append(STRING_WITH_LEN(",\n"));
401
packet->append(STRING_WITH_LEN(" "));
402
packet->append_identifier(field->field_name, strlen(field->field_name));
404
// check for surprises from the previous call to Field::sql_type()
405
if (type.ptr() != tmp)
406
type.set(tmp, sizeof(tmp), system_charset_info);
408
type.set_charset(system_charset_info);
410
field->sql_type(type);
411
packet->append(type.ptr(), type.length(), system_charset_info);
413
if (field->has_charset())
416
For string types dump collation name only if
417
collation is not primary for the given charset
419
if (!(field->charset()->state & MY_CS_PRIMARY))
421
packet->append(STRING_WITH_LEN(" COLLATE "));
422
packet->append(field->charset()->name);
426
if (flags & NOT_NULL_FLAG)
427
packet->append(STRING_WITH_LEN(" NOT NULL"));
428
else if (field->type() == DRIZZLE_TYPE_TIMESTAMP)
431
TIMESTAMP field require explicit NULL flag, because unlike
432
all other fields they are treated as NOT NULL by default.
434
packet->append(STRING_WITH_LEN(" NULL"));
438
Add field flags about FIELD FORMAT (FIXED or DYNAMIC)
439
and about STORAGE (DISK or MEMORY).
441
enum column_format_type column_format= (enum column_format_type)
442
((flags >> COLUMN_FORMAT_FLAGS) & COLUMN_FORMAT_MASK);
445
packet->append(STRING_WITH_LEN(" /*!"));
446
packet->append(STRING_WITH_LEN(" COLUMN_FORMAT"));
447
if (column_format == COLUMN_FORMAT_TYPE_FIXED)
448
packet->append(STRING_WITH_LEN(" FIXED */"));
450
packet->append(STRING_WITH_LEN(" DYNAMIC */"));
453
if (get_field_default_value(table->timestamp_field, field, &def_value, 1))
455
packet->append(STRING_WITH_LEN(" DEFAULT "));
456
packet->append(def_value.ptr(), def_value.length(), system_charset_info);
459
if (table->timestamp_field == field && field->unireg_check != Field::TIMESTAMP_DN_FIELD)
460
packet->append(STRING_WITH_LEN(" ON UPDATE CURRENT_TIMESTAMP"));
462
if (field->unireg_check == Field::NEXT_NUMBER)
463
packet->append(STRING_WITH_LEN(" AUTO_INCREMENT"));
465
if (field->comment.length)
467
packet->append(STRING_WITH_LEN(" COMMENT "));
468
append_unescaped(packet, field->comment.str, field->comment.length);
472
key_info= table->key_info;
473
memset(&create_info, 0, sizeof(create_info));
475
primary_key= table->getShare()->getPrimaryKey();
477
for (uint32_t i=0 ; i < table->getShare()->sizeKeys() ; i++,key_info++)
479
KeyPartInfo *key_part= key_info->key_part;
480
bool found_primary=0;
481
packet->append(STRING_WITH_LEN(",\n "));
483
if (i == primary_key && is_primary_key(key_info))
487
No space at end, because a space will be added after where the
488
identifier would go, but that is not added for primary key.
490
packet->append(STRING_WITH_LEN("PRIMARY KEY"));
492
else if (key_info->flags & HA_NOSAME)
493
packet->append(STRING_WITH_LEN("UNIQUE KEY "));
495
packet->append(STRING_WITH_LEN("KEY "));
498
packet->append_identifier(key_info->name, strlen(key_info->name));
500
packet->append(STRING_WITH_LEN(" ("));
502
for (uint32_t j=0 ; j < key_info->key_parts ; j++,key_part++)
508
packet->append_identifier(key_part->field->field_name,
509
strlen(key_part->field->field_name));
510
if (key_part->field &&
512
table->getField(key_part->fieldnr-1)->key_length()))
515
buff.append(to_string((int32_t) key_part->length /
516
key_part->field->charset()->mbmaxlen));
518
packet->append(buff.c_str(), buff.length());
522
store_key_options(packet, table, key_info);
526
Get possible foreign key definitions stored in InnoDB and append them
527
to the CREATE TABLE statement
530
if ((for_str= cursor->get_foreign_key_create_info()))
532
packet->append(for_str, strlen(for_str));
533
cursor->free_foreign_key_create_info(for_str);
536
packet->append(STRING_WITH_LEN("\n)"));
539
Get possible table space definitions and append them
540
to the CREATE TABLE statement
544
We should always store engine since we will now be
545
making sure engines accept options (aka... no
546
dangling arguments for engines.
548
packet->append(STRING_WITH_LEN(" ENGINE="));
549
packet->append(cursor->getEngine()->getName().c_str());
551
size_t num_engine_options= table->getShare()->getTableProto()->engine().options_size();
552
for (size_t x= 0; x < num_engine_options; ++x)
554
const message::Engine::Option &option= table->getShare()->getTableProto()->engine().options(x);
556
packet->append(option.name().c_str());
558
append_unescaped(packet, option.state().c_str(), option.state().length());
561
if (table->getShare()->block_size)
563
packet->append(STRING_WITH_LEN(" BLOCK_SIZE="));
564
buff= to_string(table->getShare()->block_size);
565
packet->append(buff.c_str(), buff.length());
567
table->cursor->append_create_info(packet);
568
if (table->getMutableShare()->hasComment() && table->getMutableShare()->getCommentLength())
570
packet->append(STRING_WITH_LEN(" COMMENT="));
571
append_unescaped(packet, table->getMutableShare()->getComment(),
572
table->getMutableShare()->getCommentLength());
575
table->restore_column_map(old_map);
315
enum drizzled::message::TransformSqlError transform_err;
317
(void)is_if_not_exists;
319
transform_err= message::transformTableDefinitionToSql(*(table->getShare()->getTableProto()),
324
packet->append(create_sql.c_str(), create_sql.length(), default_charset_info);
579
static void store_key_options(String *packet, Table *, KeyInfo *key_info)
581
if (key_info->algorithm == HA_KEY_ALG_BTREE)
582
packet->append(STRING_WITH_LEN(" USING BTREE"));
584
if (key_info->algorithm == HA_KEY_ALG_HASH)
585
packet->append(STRING_WITH_LEN(" USING HASH"));
587
assert(test(key_info->flags & HA_USES_COMMENT) ==
588
(key_info->comment.length > 0));
589
if (key_info->flags & HA_USES_COMMENT)
591
packet->append(STRING_WITH_LEN(" COMMENT "));
592
append_unescaped(packet, key_info->comment.str,
593
key_info->comment.length);
598
329
/****************************************************************************
599
330
Return info about all processes
600
331
returns for each thread: thread id, user, host, db, command, info