142
bool buildScemas(Session *session)
144
session->getLex()->sql_command= SQLCOM_SELECT;
145
session->getLex()->statement= new statement::Show(session);
147
std::string column_name= "Database";
148
if (session->getLex()->wild)
150
column_name.append(" (");
151
column_name.append(session->getLex()->wild->ptr());
152
column_name.append(")");
155
if (session->getLex()->current_select->where)
157
if (prepare_new_schema_table(session, session->getLex(), "SCHEMAS"))
162
if (prepare_new_schema_table(session, session->getLex(), "SHOW_SCHEMAS"))
166
Item_field *my_field= new Item_field(&session->getLex()->current_select->context, NULL, NULL, "SCHEMA_NAME");
167
my_field->is_autogenerated_name= false;
168
my_field->set_name(column_name.c_str(), column_name.length(), system_charset_info);
170
if (session->add_item_to_list(my_field))
173
if (session->add_order_to_list(my_field, true))
179
bool buildTables(Session *session, const char *ident)
181
session->getLex()->sql_command= SQLCOM_SELECT;
183
drizzled::statement::Show *select= new statement::Show(session);
184
session->getLex()->statement= select;
186
std::string column_name= "Tables_in_";
188
util::string::const_shared_ptr schema(session->schema());
191
identifier::Schema identifier(ident);
192
column_name.append(ident);
193
session->getLex()->select_lex.db= const_cast<char *>(ident);
194
if (not plugin::StorageEngine::doesSchemaExist(identifier))
196
my_error(ER_BAD_DB_ERROR, identifier);
198
select->setShowPredicate(ident, "");
200
else if (schema and not schema->empty())
202
column_name.append(*schema);
203
select->setShowPredicate(*schema, "");
207
my_error(ER_NO_DB_ERROR, MYF(0));
212
if (session->getLex()->wild)
214
column_name.append(" (");
215
column_name.append(session->getLex()->wild->ptr());
216
column_name.append(")");
219
if (prepare_new_schema_table(session, session->getLex(), "SHOW_TABLES"))
222
Item_field *my_field= new Item_field(&session->getLex()->current_select->context, NULL, NULL, "TABLE_NAME");
223
my_field->is_autogenerated_name= false;
224
my_field->set_name(column_name.c_str(), column_name.length(), system_charset_info);
226
if (session->add_item_to_list(my_field))
229
if (session->add_order_to_list(my_field, true))
235
bool buildTemporaryTables(Session *session)
237
session->getLex()->sql_command= SQLCOM_SELECT;
239
session->getLex()->statement= new statement::Show(session);
242
if (prepare_new_schema_table(session, session->getLex(), "SHOW_TEMPORARY_TABLES"))
245
if (session->add_item_to_list( new Item_field(&session->getLex()->current_select->context, NULL, NULL, "*")))
248
(session->getLex()->current_select->with_wild)++;
253
bool buildTableStatus(Session *session, const char *ident)
255
session->getLex()->sql_command= SQLCOM_SELECT;
256
drizzled::statement::Show *select= new statement::Show(session);
257
session->getLex()->statement= select;
259
std::string column_name= "Tables_in_";
261
util::string::const_shared_ptr schema(session->schema());
264
session->getLex()->select_lex.db= const_cast<char *>(ident);
266
identifier::Schema identifier(ident);
267
if (not plugin::StorageEngine::doesSchemaExist(identifier))
269
my_error(ER_BAD_DB_ERROR, identifier);
272
select->setShowPredicate(ident, "");
276
select->setShowPredicate(*schema, "");
280
my_error(ER_NO_DB_ERROR, MYF(0));
284
if (prepare_new_schema_table(session, session->getLex(), "SHOW_TABLE_STATUS"))
287
if (session->add_item_to_list( new Item_field(&session->getLex()->current_select->
292
(session->getLex()->current_select->with_wild)++;
297
bool buildEngineStatus(Session *session, LEX_STRING)
299
session->getLex()->sql_command= SQLCOM_SELECT;
300
drizzled::statement::Show *select= new statement::Show(session);
301
session->getLex()->statement= select;
303
my_error(ER_USE_DATA_DICTIONARY);
307
bool buildColumns(Session *session, const char *schema_ident, Table_ident *table_ident)
309
session->getLex()->sql_command= SQLCOM_SELECT;
311
drizzled::statement::Show *select= new statement::Show(session);
312
session->getLex()->statement= select;
314
util::string::const_shared_ptr schema(session->schema());
317
select->setShowPredicate(schema_ident, table_ident->table.str);
319
else if (table_ident->db.str)
321
select->setShowPredicate(table_ident->db.str, table_ident->table.str);
325
select->setShowPredicate(*schema, table_ident->table.str);
329
my_error(ER_NO_DB_ERROR, MYF(0));
334
drizzled::identifier::Table identifier(select->getShowSchema().c_str(), table_ident->table.str);
335
if (not plugin::StorageEngine::doesTableExist(*session, identifier))
337
my_error(ER_TABLE_UNKNOWN, identifier);
341
if (prepare_new_schema_table(session, session->getLex(), "SHOW_COLUMNS"))
344
if (session->add_item_to_list( new Item_field(&session->getLex()->current_select->context, NULL, NULL, "*")))
347
(session->getLex()->current_select->with_wild)++;
352
void buildSelectWarning(Session *session)
354
(void) create_select_for_variable(session, "warning_count");
355
session->getLex()->statement= new statement::Show(session);
358
void buildSelectError(Session *session)
360
(void) create_select_for_variable(session, "error_count");
361
session->getLex()->statement= new statement::Show(session);
364
void buildWarnings(Session *session)
366
session->getLex()->statement= new statement::ShowWarnings(session);
369
void buildErrors(Session *session)
371
session->getLex()->statement= new statement::ShowErrors(session);
374
bool buildIndex(Session *session, const char *schema_ident, Table_ident *table_ident)
376
session->getLex()->sql_command= SQLCOM_SELECT;
377
drizzled::statement::Show *select= new statement::Show(session);
378
session->getLex()->statement= select;
380
util::string::const_shared_ptr schema(session->schema());
383
select->setShowPredicate(schema_ident, table_ident->table.str);
385
else if (table_ident->db.str)
387
select->setShowPredicate(table_ident->db.str, table_ident->table.str);
391
select->setShowPredicate(*schema, table_ident->table.str);
395
my_error(ER_NO_DB_ERROR, MYF(0));
400
drizzled::identifier::Table identifier(select->getShowSchema().c_str(), table_ident->table.str);
401
if (not plugin::StorageEngine::doesTableExist(*session, identifier))
403
my_error(ER_TABLE_UNKNOWN, identifier);
407
if (prepare_new_schema_table(session, session->getLex(), "SHOW_INDEXES"))
410
if (session->add_item_to_list( new Item_field(&session->getLex()->current_select->context, NULL, NULL, "*")))
413
(session->getLex()->current_select->with_wild)++;
418
bool buildStatus(Session *session, const drizzled::sql_var_t is_global)
420
session->getLex()->sql_command= SQLCOM_SELECT;
421
session->getLex()->statement= new statement::Show(session);
423
if (is_global == OPT_GLOBAL)
425
if (prepare_new_schema_table(session, session->getLex(), "GLOBAL_STATUS"))
430
if (prepare_new_schema_table(session, session->getLex(), "SESSION_STATUS"))
434
std::string key("Variable_name");
435
std::string value("Value");
437
Item_field *my_field= new Item_field(&session->getLex()->current_select->context, NULL, NULL, "VARIABLE_NAME");
438
my_field->is_autogenerated_name= false;
439
my_field->set_name(key.c_str(), key.length(), system_charset_info);
441
if (session->add_item_to_list(my_field))
444
my_field= new Item_field(&session->getLex()->current_select->context, NULL, NULL, "VARIABLE_VALUE");
445
my_field->is_autogenerated_name= false;
446
my_field->set_name(value.c_str(), value.length(), system_charset_info);
448
if (session->add_item_to_list(my_field))
454
bool buildCreateTable(Session *session, Table_ident *ident)
456
session->getLex()->sql_command= SQLCOM_SELECT;
457
statement::Show *select= new statement::Show(session);
458
session->getLex()->statement= select;
460
if (session->getLex()->statement == NULL)
463
if (prepare_new_schema_table(session, session->getLex(), "TABLE_SQL_DEFINITION"))
466
util::string::const_shared_ptr schema(session->schema());
469
select->setShowPredicate(ident->db.str, ident->table.str);
473
select->setShowPredicate(*schema, ident->table.str);
477
my_error(ER_NO_DB_ERROR, MYF(0));
481
std::string key("Table");
482
std::string value("Create Table");
484
Item_field *my_field= new Item_field(&session->getLex()->current_select->context, NULL, NULL, "TABLE_NAME");
485
my_field->is_autogenerated_name= false;
486
my_field->set_name(key.c_str(), key.length(), system_charset_info);
488
if (session->add_item_to_list(my_field))
491
my_field= new Item_field(&session->getLex()->current_select->context, NULL, NULL, "TABLE_SQL_DEFINITION");
492
my_field->is_autogenerated_name= false;
493
my_field->set_name(value.c_str(), value.length(), system_charset_info);
495
if (session->add_item_to_list(my_field))
501
bool buildProcesslist(Session *session)
503
session->getLex()->sql_command= SQLCOM_SELECT;
504
session->getLex()->statement= new statement::Show(session);
506
if (prepare_new_schema_table(session, session->getLex(), "PROCESSLIST"))
509
if (session->add_item_to_list( new Item_field(&session->getLex()->current_select->context, NULL, NULL, "*")))
512
(session->getLex()->current_select->with_wild)++;
517
bool buildVariables(Session *session, const drizzled::sql_var_t is_global)
519
session->getLex()->sql_command= SQLCOM_SELECT;
520
session->getLex()->statement= new statement::Show(session);
522
if (is_global == OPT_GLOBAL)
524
if (prepare_new_schema_table(session, session->getLex(), "GLOBAL_VARIABLES"))
529
if (prepare_new_schema_table(session, session->getLex(), "SESSION_VARIABLES"))
533
std::string key("Variable_name");
534
std::string value("Value");
536
Item_field *my_field= new Item_field(&session->getLex()->current_select->context, NULL, NULL, "VARIABLE_NAME");
537
my_field->is_autogenerated_name= false;
538
my_field->set_name(key.c_str(), key.length(), system_charset_info);
540
if (session->add_item_to_list(my_field))
543
my_field= new Item_field(&session->getLex()->current_select->context, NULL, NULL, "VARIABLE_VALUE");
544
my_field->is_autogenerated_name= false;
545
my_field->set_name(value.c_str(), value.length(), system_charset_info);
547
if (session->add_item_to_list(my_field))
553
bool buildCreateSchema(Session *session, LEX_STRING &ident)
555
session->getLex()->sql_command= SQLCOM_SELECT;
556
drizzled::statement::Show *select= new statement::Show(session);
557
session->getLex()->statement= select;
559
if (prepare_new_schema_table(session, session->getLex(), "SCHEMA_SQL_DEFINITION"))
562
util::string::const_shared_ptr schema(session->schema());
565
select->setShowPredicate(ident.str);
569
select->setShowPredicate(*schema);
573
my_error(ER_NO_DB_ERROR, MYF(0));
577
std::string key("Database");
578
std::string value("Create Database");
580
Item_field *my_field= new Item_field(&session->getLex()->current_select->context, NULL, NULL, "SCHEMA_NAME");
581
my_field->is_autogenerated_name= false;
582
my_field->set_name(key.c_str(), key.length(), system_charset_info);
584
if (session->add_item_to_list(my_field))
587
my_field= new Item_field(&session->getLex()->current_select->context, NULL, NULL, "SCHEMA_SQL_DEFINITION");
588
my_field->is_autogenerated_name= false;
589
my_field->set_name(value.c_str(), value.length(), system_charset_info);
591
if (session->add_item_to_list(my_field))
597
bool buildDescribe(Session *session, Table_ident *ident)
599
session->getLex()->lock_option= TL_READ;
600
init_select(session->getLex());
601
session->getLex()->current_select->parsing_place= SELECT_LIST;
602
session->getLex()->sql_command= SQLCOM_SELECT;
603
drizzled::statement::Show *select= new statement::Show(session);
604
session->getLex()->statement= select;
605
session->getLex()->select_lex.db= 0;
607
util::string::const_shared_ptr schema(session->schema());
610
select->setShowPredicate(ident->db.str, ident->table.str);
614
select->setShowPredicate(*schema, ident->table.str);
618
my_error(ER_NO_DB_ERROR, MYF(0));
623
drizzled::identifier::Table identifier(select->getShowSchema().c_str(), ident->table.str);
624
if (not plugin::StorageEngine::doesTableExist(*session, identifier))
626
my_error(ER_TABLE_UNKNOWN, identifier);
630
if (prepare_new_schema_table(session, session->getLex(), "SHOW_COLUMNS"))
635
if (session->add_item_to_list( new Item_field(&session->getLex()->current_select->
642
(session->getLex()->current_select->with_wild)++;
647
} /* namespace drizzled */
288
#define LIST_PROCESS_HOST_LEN 64
290
static bool get_field_default_value(Field *timestamp_field,
291
Field *field, String *def_value,
295
bool has_now_default;
298
We are using CURRENT_TIMESTAMP instead of NOW because it is
301
has_now_default= (timestamp_field == field &&
302
field->unireg_check != Field::TIMESTAMP_UN_FIELD);
304
has_default= (field->type() != DRIZZLE_TYPE_BLOB &&
305
!(field->flags & NO_DEFAULT_VALUE_FLAG) &&
306
field->unireg_check != Field::NEXT_NUMBER);
308
def_value->length(0);
312
def_value->append(STRING_WITH_LEN("CURRENT_TIMESTAMP"));
313
else if (!field->is_null())
314
{ // Not null by default
315
char tmp[MAX_FIELD_WIDTH];
316
String type(tmp, sizeof(tmp), field->charset());
317
field->val_str(&type);
321
uint32_t dummy_errors;
322
/* convert to system_charset_info == utf8 */
323
def_val.copy(type.ptr(), type.length(), field->charset(),
324
system_charset_info, &dummy_errors);
326
append_unescaped(def_value, def_val.ptr(), def_val.length());
328
def_value->append(def_val.ptr(), def_val.length());
331
def_value->append(STRING_WITH_LEN("''"));
333
else if (field->maybe_null() && quoted)
334
def_value->append(STRING_WITH_LEN("NULL")); // Null as default
342
Build a CREATE TABLE statement for a table.
346
table_list A list containing one table to write statement
348
packet Pointer to a string where statement will be
352
Currently always return 0, but might return error code in the
359
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
Table *table= table_list->table;
371
Cursor *cursor= table->cursor;
372
HA_CREATE_INFO create_info;
373
my_bitmap_map *old_map;
375
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);
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
/****************************************************************************
599
Return info about all processes
600
returns for each thread: thread id, user, host, db, command, info
601
****************************************************************************/
616
thread_info(uint64_t thread_id_arg,
617
time_t start_time_arg,
618
uint32_t command_arg,
619
const string &user_arg,
620
const string &host_arg,
621
const string &db_arg,
622
const string &proc_info_arg,
623
const string &state_info_arg,
624
const string &query_arg)
625
: thread_id(thread_id_arg), start_time(start_time_arg), command(command_arg),
626
user(user_arg), host(host_arg), db(db_arg), proc_info(proc_info_arg),
627
state_info(state_info_arg), query(query_arg)
649
631
} /* namespace drizzled */