132
bool buildScemas(Session *session)
134
session->getLex()->sql_command= SQLCOM_SELECT;
135
session->getLex()->statement= new statement::Show(session);
137
std::string column_name= "Database";
138
if (session->getLex()->wild)
140
column_name.append(" (");
141
column_name.append(session->getLex()->wild->ptr());
142
column_name.append(")");
145
if (session->getLex()->current_select->where)
147
if (prepare_new_schema_table(session, session->getLex(), "SCHEMAS"))
152
if (prepare_new_schema_table(session, session->getLex(), "SHOW_SCHEMAS"))
156
Item_field *my_field= new Item_field(&session->lex->current_select->context, NULL, NULL, "SCHEMA_NAME");
157
my_field->is_autogenerated_name= false;
158
my_field->set_name(column_name.c_str(), column_name.length(), system_charset_info);
160
if (session->add_item_to_list(my_field))
163
if (session->add_order_to_list(my_field, true))
169
bool buildTables(Session *session, const char *ident)
171
session->getLex()->sql_command= SQLCOM_SELECT;
173
drizzled::statement::Show *select= new statement::Show(session);
174
session->getLex()->statement= select;
176
std::string column_name= "Tables_in_";
178
util::string::const_shared_ptr schema(session->schema());
181
identifier::Schema identifier(ident);
182
column_name.append(ident);
183
session->getLex()->select_lex.db= const_cast<char *>(ident);
184
if (not plugin::StorageEngine::doesSchemaExist(identifier))
186
my_error(ER_BAD_DB_ERROR, MYF(0), ident);
188
select->setShowPredicate(ident, "");
190
else if (schema and not schema->empty())
192
column_name.append(*schema);
193
select->setShowPredicate(*schema, "");
197
my_error(ER_NO_DB_ERROR, MYF(0));
202
if (session->getLex()->wild)
204
column_name.append(" (");
205
column_name.append(session->getLex()->wild->ptr());
206
column_name.append(")");
209
if (prepare_new_schema_table(session, session->getLex(), "SHOW_TABLES"))
212
Item_field *my_field= new Item_field(&session->lex->current_select->context, NULL, NULL, "TABLE_NAME");
213
my_field->is_autogenerated_name= false;
214
my_field->set_name(column_name.c_str(), column_name.length(), system_charset_info);
216
if (session->add_item_to_list(my_field))
219
if (session->add_order_to_list(my_field, true))
225
bool buildTemporaryTables(Session *session)
227
session->getLex()->sql_command= SQLCOM_SELECT;
229
session->getLex()->statement= new statement::Show(session);
232
if (prepare_new_schema_table(session, session->getLex(), "SHOW_TEMPORARY_TABLES"))
235
if (session->add_item_to_list( new Item_field(&session->lex->current_select->context, NULL, NULL, "*")))
238
(session->lex->current_select->with_wild)++;
243
bool buildTableStatus(Session *session, const char *ident)
245
session->getLex()->sql_command= SQLCOM_SELECT;
246
drizzled::statement::Show *select= new statement::Show(session);
247
session->getLex()->statement= select;
249
std::string column_name= "Tables_in_";
251
util::string::const_shared_ptr schema(session->schema());
254
session->getLex()->select_lex.db= const_cast<char *>(ident);
256
identifier::Schema identifier(ident);
257
if (not plugin::StorageEngine::doesSchemaExist(identifier))
259
my_error(ER_BAD_DB_ERROR, MYF(0), ident);
262
select->setShowPredicate(ident, "");
266
select->setShowPredicate(*schema, "");
270
my_error(ER_NO_DB_ERROR, MYF(0));
274
if (prepare_new_schema_table(session, session->getLex(), "SHOW_TABLE_STATUS"))
277
if (session->add_item_to_list( new Item_field(&session->lex->current_select->
282
(session->lex->current_select->with_wild)++;
287
bool buildEngineStatus(Session *session, LEX_STRING)
289
session->getLex()->sql_command= SQLCOM_SELECT;
290
drizzled::statement::Show *select= new statement::Show(session);
291
session->getLex()->statement= select;
293
my_error(ER_USE_DATA_DICTIONARY);
371
#define LIST_PROCESS_HOST_LEN 64
373
static bool get_field_default_value(Field *timestamp_field,
374
Field *field, String *def_value,
378
bool has_now_default;
381
We are using CURRENT_TIMESTAMP instead of NOW because it is
384
has_now_default= (timestamp_field == field &&
385
field->unireg_check != Field::TIMESTAMP_UN_FIELD);
387
has_default= (field->type() != DRIZZLE_TYPE_BLOB &&
388
!(field->flags & NO_DEFAULT_VALUE_FLAG) &&
389
field->unireg_check != Field::NEXT_NUMBER);
391
def_value->length(0);
395
def_value->append(STRING_WITH_LEN("CURRENT_TIMESTAMP"));
396
else if (!field->is_null())
397
{ // Not null by default
398
char tmp[MAX_FIELD_WIDTH];
399
String type(tmp, sizeof(tmp), field->charset());
400
field->val_str(&type);
404
uint32_t dummy_errors;
405
/* convert to system_charset_info == utf8 */
406
def_val.copy(type.ptr(), type.length(), field->charset(),
407
system_charset_info, &dummy_errors);
409
append_unescaped(def_value, def_val.ptr(), def_val.length());
411
def_value->append(def_val.ptr(), def_val.length());
414
def_value->append(STRING_WITH_LEN("''"));
416
else if (field->maybe_null() && quoted)
417
def_value->append(STRING_WITH_LEN("NULL")); // Null as default
425
Build a CREATE TABLE statement for a table.
429
table_list A list containing one table to write statement
431
packet Pointer to a string where statement will be
435
Currently always return 0, but might return error code in the
442
int store_create_info(TableList *table_list, String *packet, bool is_if_not_exists)
444
List<Item> field_list;
445
char tmp[MAX_FIELD_WIDTH], *for_str, def_value_buf[MAX_FIELD_WIDTH];
448
String type(tmp, sizeof(tmp), system_charset_info);
449
String def_value(def_value_buf, sizeof(def_value_buf), system_charset_info);
451
uint32_t primary_key;
453
Table *table= table_list->table;
454
Cursor *cursor= table->cursor;
455
TableShare *share= table->s;
456
HA_CREATE_INFO create_info;
457
bool show_table_options= false;
458
my_bitmap_map *old_map;
460
table->restoreRecordAsDefault(); // Get empty record
462
if (share->tmp_table)
463
packet->append(STRING_WITH_LEN("CREATE TEMPORARY TABLE "));
465
packet->append(STRING_WITH_LEN("CREATE TABLE "));
466
if (is_if_not_exists)
467
packet->append(STRING_WITH_LEN("IF NOT EXISTS "));
468
alias= share->table_name.str;
470
packet->append_identifier(alias, strlen(alias));
471
packet->append(STRING_WITH_LEN(" (\n"));
473
We need this to get default values from the table
474
We have to restore the read_set if we are called from insert in case
475
of row based replication.
477
old_map= table->use_all_columns(table->read_set);
479
for (ptr=table->field ; (field= *ptr); ptr++)
481
uint32_t flags = field->flags;
483
if (ptr != table->field)
484
packet->append(STRING_WITH_LEN(",\n"));
486
packet->append(STRING_WITH_LEN(" "));
487
packet->append_identifier(field->field_name, strlen(field->field_name));
489
// check for surprises from the previous call to Field::sql_type()
490
if (type.ptr() != tmp)
491
type.set(tmp, sizeof(tmp), system_charset_info);
493
type.set_charset(system_charset_info);
495
field->sql_type(type);
496
packet->append(type.ptr(), type.length(), system_charset_info);
498
if (field->has_charset())
500
if (field->charset() != share->table_charset)
502
packet->append(STRING_WITH_LEN(" CHARACTER SET "));
503
packet->append(field->charset()->csname);
507
For string types dump collation name only if
508
collation is not primary for the given charset
510
if (!(field->charset()->state & MY_CS_PRIMARY))
512
packet->append(STRING_WITH_LEN(" COLLATE "));
513
packet->append(field->charset()->name);
517
if (flags & NOT_NULL_FLAG)
518
packet->append(STRING_WITH_LEN(" NOT NULL"));
519
else if (field->type() == DRIZZLE_TYPE_TIMESTAMP)
522
TIMESTAMP field require explicit NULL flag, because unlike
523
all other fields they are treated as NOT NULL by default.
525
packet->append(STRING_WITH_LEN(" NULL"));
529
Add field flags about FIELD FORMAT (FIXED or DYNAMIC)
530
and about STORAGE (DISK or MEMORY).
532
enum column_format_type column_format= (enum column_format_type)
533
((flags >> COLUMN_FORMAT_FLAGS) & COLUMN_FORMAT_MASK);
536
packet->append(STRING_WITH_LEN(" /*!"));
537
packet->append(STRING_WITH_LEN(" COLUMN_FORMAT"));
538
if (column_format == COLUMN_FORMAT_TYPE_FIXED)
539
packet->append(STRING_WITH_LEN(" FIXED */"));
541
packet->append(STRING_WITH_LEN(" DYNAMIC */"));
544
if (get_field_default_value(table->timestamp_field, field, &def_value, 1))
546
packet->append(STRING_WITH_LEN(" DEFAULT "));
547
packet->append(def_value.ptr(), def_value.length(), system_charset_info);
550
if (table->timestamp_field == field && field->unireg_check != Field::TIMESTAMP_DN_FIELD)
551
packet->append(STRING_WITH_LEN(" ON UPDATE CURRENT_TIMESTAMP"));
553
if (field->unireg_check == Field::NEXT_NUMBER)
554
packet->append(STRING_WITH_LEN(" AUTO_INCREMENT"));
556
if (field->comment.length)
558
packet->append(STRING_WITH_LEN(" COMMENT "));
559
append_unescaped(packet, field->comment.str, field->comment.length);
563
key_info= table->key_info;
564
memset(&create_info, 0, sizeof(create_info));
565
/* Allow update_create_info to update row type */
566
create_info.row_type= share->row_type;
567
cursor->update_create_info(&create_info);
568
primary_key= share->primary_key;
570
for (uint32_t i=0 ; i < share->keys ; i++,key_info++)
572
KEY_PART_INFO *key_part= key_info->key_part;
573
bool found_primary=0;
574
packet->append(STRING_WITH_LEN(",\n "));
576
if (i == primary_key && is_primary_key(key_info))
580
No space at end, because a space will be added after where the
581
identifier would go, but that is not added for primary key.
583
packet->append(STRING_WITH_LEN("PRIMARY KEY"));
585
else if (key_info->flags & HA_NOSAME)
586
packet->append(STRING_WITH_LEN("UNIQUE KEY "));
588
packet->append(STRING_WITH_LEN("KEY "));
591
packet->append_identifier(key_info->name, strlen(key_info->name));
593
packet->append(STRING_WITH_LEN(" ("));
595
for (uint32_t j=0 ; j < key_info->key_parts ; j++,key_part++)
601
packet->append_identifier(key_part->field->field_name,
602
strlen(key_part->field->field_name));
603
if (key_part->field &&
605
table->field[key_part->fieldnr-1]->key_length()))
608
buff.append(to_string((int32_t) key_part->length /
609
key_part->field->charset()->mbmaxlen));
611
packet->append(buff.c_str(), buff.length());
615
store_key_options(packet, table, key_info);
619
Get possible foreign key definitions stored in InnoDB and append them
620
to the CREATE TABLE statement
623
if ((for_str= cursor->get_foreign_key_create_info()))
625
packet->append(for_str, strlen(for_str));
626
cursor->free_foreign_key_create_info(for_str);
629
packet->append(STRING_WITH_LEN("\n)"));
631
show_table_options= true;
633
Get possible table space definitions and append them
634
to the CREATE TABLE statement
638
We should always store engine since we will now be
639
making sure engines accept options (aka... no
640
dangling arguments for engines.
642
packet->append(STRING_WITH_LEN(" ENGINE="));
643
packet->append(cursor->engine->getName().c_str());
645
if (share->db_create_options & HA_OPTION_PACK_KEYS)
646
packet->append(STRING_WITH_LEN(" PACK_KEYS=1"));
647
if (share->db_create_options & HA_OPTION_NO_PACK_KEYS)
648
packet->append(STRING_WITH_LEN(" PACK_KEYS=0"));
649
if (create_info.row_type != ROW_TYPE_DEFAULT)
651
packet->append(STRING_WITH_LEN(" ROW_FORMAT="));
652
packet->append(ha_row_type[(uint32_t) create_info.row_type]);
654
if (table->s->hasKeyBlockSize())
656
packet->append(STRING_WITH_LEN(" KEY_BLOCK_SIZE="));
657
buff= to_string(table->s->getKeyBlockSize());
658
packet->append(buff.c_str(), buff.length());
660
if (share->block_size)
662
packet->append(STRING_WITH_LEN(" BLOCK_SIZE="));
663
buff= to_string(share->block_size);
664
packet->append(buff.c_str(), buff.length());
666
table->cursor->append_create_info(packet);
667
if (share->hasComment() && share->getCommentLength())
669
packet->append(STRING_WITH_LEN(" COMMENT="));
670
append_unescaped(packet, share->getComment(),
671
share->getCommentLength());
674
table->restore_column_map(old_map);
678
static void store_key_options(String *packet, Table *table, KEY *key_info)
682
if (key_info->algorithm == HA_KEY_ALG_BTREE)
683
packet->append(STRING_WITH_LEN(" USING BTREE"));
685
if (key_info->algorithm == HA_KEY_ALG_HASH)
686
packet->append(STRING_WITH_LEN(" USING HASH"));
688
if ((key_info->flags & HA_USES_BLOCK_SIZE) &&
689
table->s->getKeyBlockSize() != key_info->block_size)
691
packet->append(STRING_WITH_LEN(" KEY_BLOCK_SIZE="));
692
end= internal::int64_t10_to_str(key_info->block_size, buff, 10);
693
packet->append(buff, (uint32_t) (end - buff));
696
assert(test(key_info->flags & HA_USES_COMMENT) ==
697
(key_info->comment.length > 0));
698
if (key_info->flags & HA_USES_COMMENT)
700
packet->append(STRING_WITH_LEN(" COMMENT "));
701
append_unescaped(packet, key_info->comment.str,
702
key_info->comment.length);
707
/****************************************************************************
708
Return info about all processes
709
returns for each thread: thread id, user, host, db, command, info
710
****************************************************************************/
725
thread_info(uint64_t thread_id_arg,
726
time_t start_time_arg,
727
uint32_t command_arg,
728
const string &user_arg,
729
const string &host_arg,
730
const string &db_arg,
731
const string &proc_info_arg,
732
const string &state_info_arg,
733
const string &query_arg)
734
: thread_id(thread_id_arg), start_time(start_time_arg), command(command_arg),
735
user(user_arg), host(host_arg), db(db_arg), proc_info(proc_info_arg),
736
state_info(state_info_arg), query(query_arg)
740
/*****************************************************************************
742
*****************************************************************************/
744
static vector<drizzle_show_var *> all_status_vars;
745
static vector<drizzle_show_var *> com_status_vars;
746
static bool status_vars_inited= 0;
747
static int show_var_cmp(const void *var1, const void *var2)
749
return strcmp(((drizzle_show_var*)var1)->name, ((drizzle_show_var*)var2)->name);
752
class show_var_cmp_functor
755
show_var_cmp_functor() { }
756
inline bool operator()(const drizzle_show_var *var1, const drizzle_show_var *var2) const
758
int val= strcmp(var1->name, var2->name);
763
class show_var_remove_if
766
show_var_remove_if() { }
767
inline bool operator()(const drizzle_show_var *curr) const
769
return (curr->type == SHOW_UNDEF);
773
drizzle_show_var *getFrontOfStatusVars()
775
return all_status_vars.front();
778
drizzle_show_var *getCommandStatusVars()
780
return com_status_vars.front();
784
Adds an array of drizzle_show_var entries to the output of SHOW STATUS
787
add_status_vars(drizzle_show_var *list)
788
list - an array of drizzle_show_var entries to add to all_status_vars
789
the last entry must be {0,0,SHOW_UNDEF}
792
The handling of all_status_vars[] is completely internal, it's allocated
793
automatically when something is added to it, and deleted completely when
794
the last entry is removed.
796
As a special optimization, if add_status_vars() is called before
797
init_status_vars(), it assumes "startup mode" - neither concurrent access
798
to the array nor SHOW STATUS are possible (thus it skips locks and qsort)
800
int add_status_vars(drizzle_show_var *list)
803
if (status_vars_inited)
804
pthread_mutex_lock(&LOCK_status);
806
all_status_vars.insert(all_status_vars.begin(), list++);
807
if (status_vars_inited)
808
sort(all_status_vars.begin(), all_status_vars.end(),
809
show_var_cmp_functor());
810
if (status_vars_inited)
811
pthread_mutex_unlock(&LOCK_status);
815
int add_com_status_vars(drizzle_show_var *list)
820
com_status_vars.insert(com_status_vars.begin(), list++);
821
if (status_vars_inited)
822
sort(com_status_vars.begin(), com_status_vars.end(),
823
show_var_cmp_functor());
829
Make all_status_vars[] usable for SHOW STATUS
832
See add_status_vars(). Before init_status_vars() call, add_status_vars()
833
works in a special fast "startup" mode. Thus init_status_vars()
834
should be called as late as possible but before enabling multi-threading.
836
void init_status_vars()
838
status_vars_inited= 1;
839
sort(all_status_vars.begin(), all_status_vars.end(),
840
show_var_cmp_functor());
841
sort(com_status_vars.begin(), com_status_vars.end(),
842
show_var_cmp_functor());
845
void reset_status_vars()
847
vector<drizzle_show_var *>::iterator p;
849
p= all_status_vars.begin();
850
while (p != all_status_vars.end())
852
/* Note that SHOW_LONG_NOFLUSH variables are not reset */
853
if ((*p)->type == SHOW_LONG)
858
p= com_status_vars.begin();
859
while (p != com_status_vars.end())
861
/* Note that SHOW_LONG_NOFLUSH variables are not reset */
862
if ((*p)->type == SHOW_LONG)
869
catch-all cleanup function, cleans up everything no matter what
872
This function is not strictly required if all add_to_status/
873
remove_status_vars are properly paired, but it's a safety measure that
874
deletes everything from the all_status_vars vector even if some
875
remove_status_vars were forgotten
877
void free_status_vars()
879
all_status_vars.clear();
880
com_status_vars.clear();
884
Removes an array of drizzle_show_var entries from the output of SHOW STATUS
887
remove_status_vars(drizzle_show_var *list)
888
list - an array of drizzle_show_var entries to remove to all_status_vars
889
the last entry must be {0,0,SHOW_UNDEF}
892
there's lots of room for optimizing this, especially in non-sorted mode,
893
but nobody cares - it may be called only in case of failed plugin
894
initialization in the mysqld startup.
897
void remove_status_vars(drizzle_show_var *list)
899
if (status_vars_inited)
901
pthread_mutex_lock(&LOCK_status);
902
drizzle_show_var *all= all_status_vars.front();
903
int a= 0, b= all_status_vars.size(), c= (a+b)/2;
905
for (; list->name; list++)
908
for (a= 0, b= all_status_vars.size(); b-a > 1; c= (a+b)/2)
910
res= show_var_cmp(list, all+c);
919
all[c].type= SHOW_UNDEF;
921
/* removes all the SHOW_UNDEF elements from the vector */
922
all_status_vars.erase(std::remove_if(all_status_vars.begin(),
923
all_status_vars.end(),show_var_remove_if()),
924
all_status_vars.end());
925
pthread_mutex_unlock(&LOCK_status);
929
drizzle_show_var *all= all_status_vars.front();
931
for (; list->name; list++)
933
for (i= 0; i < all_status_vars.size(); i++)
935
if (show_var_cmp(list, all+i))
937
all[i].type= SHOW_UNDEF;
941
/* removes all the SHOW_UNDEF elements from the vector */
942
all_status_vars.erase(std::remove_if(all_status_vars.begin(),
943
all_status_vars.end(),show_var_remove_if()),
944
all_status_vars.end());
948
/* collect status for all running threads */
950
void calc_sum_of_all_status(system_status_var *to)
952
/* Ensure that thread id not killed during loop */
953
pthread_mutex_lock(&LOCK_thread_count); // For unlink from list
955
/* Get global values as base */
956
*to= global_status_var;
958
/* Add to this status from existing threads */
959
for(vector<Session*>::iterator it= getSessionList().begin(); it != getSessionList().end(); ++it )
961
add_to_status(to, &((*it)->status_var));
964
pthread_mutex_unlock(&LOCK_thread_count);
969
static int make_table_list(Session *session, Select_Lex *sel,
970
LEX_STRING *db_name, LEX_STRING *table_name)
972
Table_ident *table_ident;
973
table_ident= new Table_ident(*db_name, *table_name);
975
if (! sel->add_table_to_list(session, table_ident, 0, 0, TL_READ))
982
@brief Get lookup value from the part of 'WHERE' condition
984
@details This function gets lookup value from
985
the part of 'WHERE' condition if it's possible and
986
fill appropriate lookup_field_vals struct field
989
@param[in] session thread Cursor
990
@param[in] item_func part of WHERE condition
991
@param[in] table I_S table
992
@param[in, out] lookup_field_vals Struct which holds lookup values
996
1 error, there can be no matching records for the condition
999
static bool get_lookup_value(Session *session, Item_func *item_func,
1001
LOOKUP_FIELD_VALUES *lookup_field_vals,
1002
plugin::InfoSchemaTable *schema_table)
1004
const char *field_name1= schema_table->getFirstColumnIndex() >= 0 ?
1005
schema_table->getColumnName(schema_table->getFirstColumnIndex()).c_str() : "";
1006
const char *field_name2= schema_table->getSecondColumnIndex() >= 0 ?
1007
schema_table->getColumnName(schema_table->getSecondColumnIndex()).c_str() : "";
1009
if (item_func->functype() == Item_func::EQ_FUNC ||
1010
item_func->functype() == Item_func::EQUAL_FUNC)
1012
int idx_field, idx_val;
1013
char tmp[MAX_FIELD_WIDTH];
1014
String *tmp_str, str_buff(tmp, sizeof(tmp), system_charset_info);
1015
Item_field *item_field;
1016
const CHARSET_INFO * const cs= system_charset_info;
1018
if (item_func->arguments()[0]->type() == Item::FIELD_ITEM &&
1019
item_func->arguments()[1]->const_item())
1024
else if (item_func->arguments()[1]->type() == Item::FIELD_ITEM &&
1025
item_func->arguments()[0]->const_item())
1033
item_field= (Item_field*) item_func->arguments()[idx_field];
1034
if (table->table != item_field->field->table)
1036
tmp_str= item_func->arguments()[idx_val]->val_str(&str_buff);
1038
/* impossible value */
1042
/* Lookup value is database name */
1043
if (!cs->coll->strnncollsp(cs, (unsigned char *) field_name1, strlen(field_name1),
1044
(unsigned char *) item_field->field_name,
1045
strlen(item_field->field_name), 0))
1047
session->make_lex_string(&lookup_field_vals->db_value, tmp_str->ptr(),
1048
tmp_str->length(), false);
1050
/* Lookup value is table name */
1051
else if (!cs->coll->strnncollsp(cs, (unsigned char *) field_name2,
1052
strlen(field_name2),
1053
(unsigned char *) item_field->field_name,
1054
strlen(item_field->field_name), 0))
1056
session->make_lex_string(&lookup_field_vals->table_value, tmp_str->ptr(),
1057
tmp_str->length(), false);
1065
@brief Calculates lookup values from 'WHERE' condition
1067
@details This function calculates lookup value(database name, table name)
1068
from 'WHERE' condition if it's possible and
1069
fill lookup_field_vals struct fields with these values.
1071
@param[in] session thread Cursor
1072
@param[in] cond WHERE condition
1073
@param[in] table I_S table
1074
@param[in, out] lookup_field_vals Struct which holds lookup values
1078
1 error, there can be no matching records for the condition
1081
bool calc_lookup_values_from_cond(Session *session, COND *cond, TableList *table,
1082
LOOKUP_FIELD_VALUES *lookup_field_vals,
1083
plugin::InfoSchemaTable *schema_table)
1088
if (cond->type() == Item::COND_ITEM)
1090
if (((Item_cond*) cond)->functype() == Item_func::COND_AND_FUNC)
1092
List_iterator<Item> li(*((Item_cond*) cond)->argument_list());
1094
while ((item= li++))
1096
if (item->type() == Item::FUNC_ITEM)
1098
if (get_lookup_value(session, (Item_func*)item, table, lookup_field_vals, schema_table))
1103
if (calc_lookup_values_from_cond(session, item, table, lookup_field_vals, schema_table))
1110
else if (cond->type() == Item::FUNC_ITEM &&
1111
get_lookup_value(session, (Item_func*) cond, table, lookup_field_vals, schema_table))
1117
static bool uses_only_table_name_fields(Item *item, Table *table, plugin::InfoSchemaTable *schema_table)
1119
if (item->type() == Item::FUNC_ITEM)
1121
Item_func *item_func= (Item_func*)item;
1122
for (uint32_t i=0; i<item_func->argument_count(); i++)
1124
if (! uses_only_table_name_fields(item_func->arguments()[i], table, schema_table))
1128
else if (item->type() == Item::FIELD_ITEM)
1130
Item_field *item_field= (Item_field*)item;
1131
const CHARSET_INFO * const cs= system_charset_info;
1132
const char *field_name1= schema_table->getFirstColumnIndex() >= 0 ?
1133
schema_table->getColumnName(schema_table->getFirstColumnIndex()).c_str() : "";
1134
const char *field_name2= schema_table->getSecondColumnIndex() >= 0 ?
1135
schema_table->getColumnName(schema_table->getSecondColumnIndex()).c_str() : "";
1136
if (table != item_field->field->table ||
1137
(cs->coll->strnncollsp(cs, (unsigned char *) field_name1, strlen(field_name1),
1138
(unsigned char *) item_field->field_name,
1139
strlen(item_field->field_name), 0) &&
1140
cs->coll->strnncollsp(cs, (unsigned char *) field_name2, strlen(field_name2),
1141
(unsigned char *) item_field->field_name,
1142
strlen(item_field->field_name), 0)))
1145
else if (item->type() == Item::REF_ITEM)
1146
return uses_only_table_name_fields(item->real_item(), table, schema_table);
1148
if (item->type() == Item::SUBSELECT_ITEM && !item->const_item())
1155
static COND * make_cond_for_info_schema(COND *cond, Table *table, plugin::InfoSchemaTable *schema_table)
1159
if (cond->type() == Item::COND_ITEM)
1161
if (((Item_cond*) cond)->functype() == Item_func::COND_AND_FUNC)
1163
/* Create new top level AND item */
1164
Item_cond_and *new_cond=new Item_cond_and;
1167
List_iterator<Item> li(*((Item_cond*) cond)->argument_list());
1171
Item *fix= make_cond_for_info_schema(item, table, schema_table);
1173
new_cond->argument_list()->push_back(fix);
1175
switch (new_cond->argument_list()->elements) {
1179
return new_cond->argument_list()->head();
1181
new_cond->quick_fix_field();
1187
Item_cond_or *new_cond=new Item_cond_or;
1190
List_iterator<Item> li(*((Item_cond*) cond)->argument_list());
1194
Item *fix=make_cond_for_info_schema(item, table, schema_table);
1197
new_cond->argument_list()->push_back(fix);
1199
new_cond->quick_fix_field();
1200
new_cond->top_level_item();
1205
if (! uses_only_table_name_fields(cond, table, schema_table))
1212
@brief Calculate lookup values(database name, table name)
1214
@details This function calculates lookup values(database name, table name)
1215
from 'WHERE' condition or wild values (for 'SHOW' commands only)
1216
from LEX struct and fill lookup_field_vals struct field
1219
@param[in] session thread Cursor
1220
@param[in] cond WHERE condition
1221
@param[in] tables I_S table
1222
@param[in, out] lookup_field_values Struct which holds lookup values
1226
1 error, there can be no matching records for the condition
1229
bool get_lookup_field_values(Session *session, COND *cond, TableList *tables,
1230
LOOKUP_FIELD_VALUES *lookup_field_values,
1231
plugin::InfoSchemaTable *schema_table)
1233
LEX *lex= session->lex;
1234
memset(lookup_field_values, 0, sizeof(LOOKUP_FIELD_VALUES));
1235
switch (lex->sql_command) {
1237
return calc_lookup_values_from_cond(session, cond, tables, lookup_field_values, schema_table);
1243
* Function used for sorting with std::sort within make_db_list.
1245
* @returns true if a < b, false otherwise
1248
static bool lex_string_sort(const LEX_STRING *a, const LEX_STRING *b)
1250
return (strcmp(a->str, b->str) < 0);
1256
* Create db names list. Information schema name always is first in list
1258
* @param[in] session Thread Cursor
1259
* @param[out] files List of db names
1260
* @param[in] wild Wild string
1261
* @param[in] idx_field_vals idx_field_vals->db_name contains db name or
1263
* @param[out] with_i_schema Returns 1 if we added 'IS' name to list
1264
* otherwise returns 0
1269
int make_db_list(Session *session, vector<LEX_STRING*> &files,
1270
LOOKUP_FIELD_VALUES *lookup_field_vals,
1271
bool *with_i_schema)
1273
LEX_STRING *i_s_name_copy= 0;
1274
i_s_name_copy= session->make_lex_string(i_s_name_copy,
1275
INFORMATION_SCHEMA_NAME.c_str(),
1276
INFORMATION_SCHEMA_NAME.length(), true);
1278
if (lookup_field_vals->wild_db_value)
1281
This part of code is only for SHOW DATABASES command.
1282
idx_field_vals->db_value can be 0 when we don't use
1283
LIKE clause (see also get_index_field_values() function)
1285
if (!lookup_field_vals->db_value.str ||
1286
!wild_case_compare(system_charset_info,
1287
INFORMATION_SCHEMA_NAME.c_str(),
1288
lookup_field_vals->db_value.str))
1291
files.push_back(i_s_name_copy);
1294
if (find_schemas(session, files, drizzle_data_home,
1295
lookup_field_vals->db_value.str) == true)
1300
sort(files.begin()+1, files.end(), lex_string_sort);
1306
If we have db lookup vaule we just add it to list and
1307
exit from the function
1309
if (lookup_field_vals->db_value.str)
1311
if (!my_strcasecmp(system_charset_info, INFORMATION_SCHEMA_NAME.c_str(),
1312
lookup_field_vals->db_value.str))
1315
files.push_back(i_s_name_copy);
1319
files.push_back(&lookup_field_vals->db_value);
1324
Create list of existing databases. It is used in case
1325
of select from information schema table
1327
files.push_back(i_s_name_copy);
1331
if (find_schemas(session, files, drizzle_data_home, NULL) == true)
1336
sort(files.begin()+1, files.end(), lex_string_sort);
1342
@brief Create table names list
1344
@details The function creates the list of table names in
1347
@param[in] session thread Cursor
1348
@param[in] table_names List of table names in database
1349
@param[in] lex pointer to LEX struct
1350
@param[in] lookup_field_vals pointer to LOOKUP_FIELD_VALUE struct
1351
@param[in] with_i_schema true means that we add I_S tables to list
1352
@param[in] db_name database name
1354
@return Operation status
1356
@retval 1 fatal error
1357
@retval 2 Not fatal error; Safe to ignore this cursor list
1361
make_table_name_list(Session *session, vector<LEX_STRING*> &table_names,
1362
LOOKUP_FIELD_VALUES *lookup_field_vals,
1363
bool with_i_schema, LEX_STRING *db_name)
1365
char path[FN_REFLEN];
1366
set<string> set_of_names;
1368
build_table_filename(path, sizeof(path), db_name->str, "", false);
1370
if (!lookup_field_vals->wild_table_value &&
1371
lookup_field_vals->table_value.str)
1375
if (plugin::InfoSchemaTable::getTable(lookup_field_vals->table_value.str))
1377
table_names.push_back(&lookup_field_vals->table_value);
1382
table_names.push_back(&lookup_field_vals->table_value);
1387
string db(db_name->str);
1388
plugin::StorageEngine::getTableNames(db, set_of_names);
1391
New I_S engine will make this go away, so ignore lack of foreach() usage.
1393
Notice how bad this design is... sure we created a set... but then we
1394
are just pushing to another set. --
1395
Also... callback design won't work, so we need to rewrite this to
1396
feed (which means new I_S). For the moment we will not optimize this.
1399
for (set<string>::iterator it= set_of_names.begin(); it != set_of_names.end(); it++)
1401
LEX_STRING *file_name= NULL;
1403
file_name= session->make_lex_string(file_name, (*it).c_str(),
1404
(*it).length(), true);
1405
const char* wild= lookup_field_vals->table_value.str;
1406
if (wild && internal::wild_compare((*it).c_str(), wild, 0))
1409
table_names.push_back(file_name);
1417
@brief Fill I_S table for SHOW COLUMNS|INDEX commands
1419
@param[in] session thread Cursor
1420
@param[in] tables TableList for I_S table
1421
@param[in] schema_table pointer to I_S structure
1422
@param[in] open_tables_state_backup pointer to Open_tables_state object
1423
which is used to save|restore original
1424
status of variables related to
1427
@return Operation status
1433
fill_schema_show_cols_or_idxs(Session *session, TableList *tables,
1434
plugin::InfoSchemaTable *schema_table,
1435
Open_tables_state *open_tables_state_backup)
1437
LEX *lex= session->lex;
1439
LEX_STRING tmp_lex_string, tmp_lex_string1, *db_name, *table_name;
1440
enum_sql_command save_sql_command= lex->sql_command;
1441
TableList *show_table_list= (TableList*) tables->schema_select_lex->
1443
Table *table= tables->table;
1446
lex->all_selects_list= tables->schema_select_lex;
1448
Restore session->temporary_tables to be able to process
1449
temporary tables(only for 'show index' & 'show columns').
1450
This should be changed when processing of temporary tables for
1451
I_S tables will be done.
1453
session->temporary_tables= open_tables_state_backup->temporary_tables;
1455
Let us set fake sql_command so views won't try to merge
1456
themselves into main statement. If we don't do this,
1457
SELECT * from information_schema.xxxx will cause problems.
1458
SQLCOM_SHOW_FIELDS is used because it satisfies 'only_view_structure()'
1460
lex->sql_command= SQLCOM_SHOW_FIELDS;
1461
res= session->openTables(show_table_list, DRIZZLE_LOCK_IGNORE_FLUSH);
1462
lex->sql_command= save_sql_command;
1464
get_all_tables() returns 1 on failure and 0 on success thus
1465
return only these and not the result code of ::process_table()
1467
We should use show_table_list->alias instead of
1468
show_table_list->table_name because table_name
1469
could be changed during opening of I_S tables. It's safe
1470
to use alias because alias contains original table name
1471
in this case(this part of code is used only for
1472
'show columns' & 'show statistics' commands).
1474
table_name= session->make_lex_string(&tmp_lex_string1, show_table_list->alias,
1475
strlen(show_table_list->alias), false);
1476
db_name= session->make_lex_string(&tmp_lex_string, show_table_list->db,
1477
show_table_list->db_length, false);
1480
table->setWriteSet();
1481
error= test(schema_table->processTable(session, show_table_list,
1482
table, res, db_name,
1484
session->temporary_tables= 0;
1485
session->close_tables_for_reopen(&show_table_list);
1492
@brief Fill I_S table for SHOW Table NAMES commands
1494
@param[in] session thread Cursor
1495
@param[in] table Table struct for I_S table
1496
@param[in] db_name database name
1497
@param[in] table_name table name
1498
@param[in] with_i_schema I_S table if true
1500
@return Operation status
1505
static int fill_schema_table_names(Session *session, Table *table,
1506
LEX_STRING *db_name, LEX_STRING *table_name,
1508
plugin::InfoSchemaTable *schema_table)
1512
table->field[3]->store(STRING_WITH_LEN("SYSTEM VIEW"),
1513
system_charset_info);
1517
char path[FN_REFLEN];
1518
(void) build_table_filename(path, sizeof(path), db_name->str,
1519
table_name->str, false);
1521
table->field[3]->store(STRING_WITH_LEN("BASE Table"),
1522
system_charset_info);
1524
if (session->is_error() && session->main_da.sql_errno() == ER_NO_SUCH_TABLE)
1526
session->clear_error();
1530
schema_table->addRow(table->record[0], table->s->reclength);
1534
int plugin::InfoSchemaMethods::fillTable(Session *session,
1536
plugin::InfoSchemaTable *schema_table)
1538
LEX *lex= session->lex;
1539
Select_Lex *old_all_select_lex= lex->all_selects_list;
1540
enum_sql_command save_sql_command= lex->sql_command;
1541
Select_Lex *lsel= table->pos_in_table_list->schema_select_lex;
1543
LOOKUP_FIELD_VALUES lookup_field_vals;
1545
vector<LEX_STRING*> db_names, table_names;
1546
/* the WHERE clause */
1547
COND *cond= table->reginfo.join_tab->select_cond;
1548
COND *partial_cond= 0;
1549
uint32_t derived_tables= lex->derived_tables;
1551
Open_tables_state open_tables_state_backup;
1552
Query_tables_list query_tables_list_backup;
1553
bool old_value= session->no_warnings_for_error;
1556
We should not introduce deadlocks even if we already have some
1557
tables open and locked, since we won't lock tables which we will
1558
open and will ignore possible name-locks for these tables.
1560
session->reset_n_backup_open_tables_state(&open_tables_state_backup);
1563
this branch processes SHOW FIELDS, SHOW INDEXES commands.
1564
see sql_parse.cc, prepare_schema_table() function where
1565
this values are initialized
1567
if (lsel && lsel->table_list.first)
1569
error= fill_schema_show_cols_or_idxs(session, table->pos_in_table_list, schema_table,
1570
&open_tables_state_backup);
1574
if (get_lookup_field_values(session,
1576
table->pos_in_table_list,
1584
if (!lookup_field_vals.wild_db_value && !lookup_field_vals.wild_table_value)
1587
if lookup value is empty string then
1588
it's impossible table name or db name
1590
if ((lookup_field_vals.db_value.str && !lookup_field_vals.db_value.str[0]) ||
1591
(lookup_field_vals.table_value.str && !lookup_field_vals.table_value.str[0]))
1598
if (lookup_field_vals.db_value.length &&
1599
!lookup_field_vals.wild_db_value)
1600
table->pos_in_table_list->has_db_lookup_value= true;
1602
if (lookup_field_vals.table_value.length &&
1603
!lookup_field_vals.wild_table_value)
1604
table->pos_in_table_list->has_table_lookup_value= true;
1606
if (table->pos_in_table_list->has_db_lookup_value &&
1607
table->pos_in_table_list->has_table_lookup_value)
1610
partial_cond= make_cond_for_info_schema(cond, table, schema_table);
1614
/* EXPLAIN SELECT */
1619
table->setWriteSet();
1620
if (make_db_list(session, db_names, &lookup_field_vals, &with_i_schema))
1623
for (vector<LEX_STRING*>::iterator db_name= db_names.begin(); db_name != db_names.end(); ++db_name )
1625
session->no_warnings_for_error= 1;
1626
table_names.clear();
1627
int res= make_table_name_list(session, table_names,
1629
with_i_schema, *db_name);
1631
if (res == 2) /* Not fatal error, continue */
1638
for (vector<LEX_STRING*>::iterator table_name= table_names.begin(); table_name != table_names.end(); ++table_name)
1640
table->restoreRecordAsDefault();
1641
table->field[schema_table->getFirstColumnIndex()]->
1642
store((*db_name)->str, (*db_name)->length, system_charset_info);
1643
table->field[schema_table->getSecondColumnIndex()]->
1644
store((*table_name)->str, (*table_name)->length, system_charset_info);
1646
if (!partial_cond || partial_cond->val_int())
1648
/* SHOW Table NAMES command */
1649
if (schema_table->getTableName().compare("TABLE_NAMES") == 0)
1651
if (fill_schema_table_names(session,
1661
LEX_STRING tmp_lex_string, orig_db_name;
1663
Set the parent lex of 'sel' because it is needed by
1664
sel.init_query() which is called inside make_table_list.
1666
session->no_warnings_for_error= 1;
1667
sel.parent_lex= lex;
1668
/* db_name can be changed in make_table_list() func */
1669
if (! session->make_lex_string(&orig_db_name,
1677
if (make_table_list(session, &sel, *db_name, *table_name))
1680
TableList *show_table_list= (TableList*) sel.table_list.first;
1681
lex->all_selects_list= &sel;
1682
lex->derived_tables= 0;
1683
lex->sql_command= SQLCOM_SHOW_FIELDS;
1684
show_table_list->i_s_requested_object=
1685
schema_table->getRequestedObject();
1686
res= session->openTables(show_table_list, DRIZZLE_LOCK_IGNORE_FLUSH);
1687
lex->sql_command= save_sql_command;
1689
XXX-> show_table_list has a flag i_is_requested,
1690
and when it's set, openTables()
1691
can return an error without setting an error message
1692
in Session, which is a hack. This is why we have to
1693
check for res, then for session->is_error() only then
1694
for session->main_da.sql_errno().
1696
if (res && session->is_error() &&
1697
session->main_da.sql_errno() == ER_NO_SUCH_TABLE)
1700
Hide error for not existing table.
1701
This error can occur for example when we use
1702
where condition with db name and table name and this
1703
table does not exist.
1706
session->clear_error();
1711
We should use show_table_list->alias instead of
1712
show_table_list->table_name because table_name
1713
could be changed during opening of I_S tables. It's safe
1714
to use alias because alias contains original table name
1717
session->make_lex_string(&tmp_lex_string, show_table_list->alias,
1718
strlen(show_table_list->alias), false);
1719
res= schema_table->processTable(session, show_table_list, table,
1722
session->close_tables_for_reopen(&show_table_list);
1724
assert(!lex->query_tables_own_last);
1731
If we have information schema its always the first table and only
1732
the first table. Reset for other tables.
1740
session->restore_backup_open_tables_state(&open_tables_state_backup);
1741
lex->derived_tables= derived_tables;
1742
lex->all_selects_list= old_all_select_lex;
1743
lex->sql_command= save_sql_command;
1744
session->no_warnings_for_error= old_value;
1750
@brief Store field characteristics into appropriate I_S table columns
1752
@param[in] table I_S table
1753
@param[in] field processed field
1754
@param[in] cs I_S table charset
1755
@param[in] offset offset from beginning of table
1756
to DATE_TYPE column in I_S table
1761
static void store_column_type(Table *table, Field *field,
1762
const CHARSET_INFO * const cs,
1766
int decimals, field_length;
1767
const char *tmp_buff;
1768
char column_type_buff[MAX_FIELD_WIDTH];
1769
String column_type(column_type_buff, sizeof(column_type_buff), cs);
1771
field->sql_type(column_type);
1772
/* DTD_IDENTIFIER column */
1773
table->field[offset + 7]->store(column_type.ptr(), column_type.length(), cs);
1774
table->field[offset + 7]->set_notnull();
1775
tmp_buff= strchr(column_type.ptr(), '(');
1776
/* DATA_TYPE column */
1777
table->field[offset]->store(column_type.ptr(),
1778
(tmp_buff ? tmp_buff - column_type.ptr() :
1779
column_type.length()), cs);
1780
is_blob= (field->type() == DRIZZLE_TYPE_BLOB);
1781
if (field->has_charset() || is_blob ||
1782
field->real_type() == DRIZZLE_TYPE_VARCHAR) // For varbinary type
1784
uint32_t octet_max_length= field->max_display_length();
1785
if (is_blob && octet_max_length != (uint32_t) 4294967295U)
1786
octet_max_length /= field->charset()->mbmaxlen;
1787
int64_t char_max_len= is_blob ?
1788
(int64_t) octet_max_length / field->charset()->mbminlen :
1789
(int64_t) octet_max_length / field->charset()->mbmaxlen;
1790
/* CHARACTER_MAXIMUM_LENGTH column*/
1791
table->field[offset + 1]->store(char_max_len, true);
1792
table->field[offset + 1]->set_notnull();
1793
/* CHARACTER_OCTET_LENGTH column */
1794
table->field[offset + 2]->store((int64_t) octet_max_length, true);
1795
table->field[offset + 2]->set_notnull();
1799
Calculate field_length and decimals.
1800
They are set to -1 if they should not be set (we should return NULL)
1803
decimals= field->decimals();
1804
switch (field->type()) {
1805
case DRIZZLE_TYPE_DECIMAL:
1806
field_length= ((Field_decimal*) field)->precision;
1808
case DRIZZLE_TYPE_LONG:
1809
case DRIZZLE_TYPE_LONGLONG:
1810
field_length= field->max_display_length() - 1;
1812
case DRIZZLE_TYPE_DOUBLE:
1813
field_length= field->field_length;
1814
if (decimals == NOT_FIXED_DEC)
1815
decimals= -1; // return NULL
1818
field_length= decimals= -1;
1822
/* NUMERIC_PRECISION column */
1823
if (field_length >= 0)
1825
table->field[offset + 3]->store((int64_t) field_length, true);
1826
table->field[offset + 3]->set_notnull();
1828
/* NUMERIC_SCALE column */
1831
table->field[offset + 4]->store((int64_t) decimals, true);
1832
table->field[offset + 4]->set_notnull();
1834
if (field->has_charset())
1836
/* CHARACTER_SET_NAME column*/
1837
tmp_buff= field->charset()->csname;
1838
table->field[offset + 5]->store(tmp_buff, strlen(tmp_buff), cs);
1839
table->field[offset + 5]->set_notnull();
1840
/* COLLATION_NAME column */
1841
tmp_buff= field->charset()->name;
1842
table->field[offset + 6]->store(tmp_buff, strlen(tmp_buff), cs);
1843
table->field[offset + 6]->set_notnull();
1848
int plugin::InfoSchemaMethods::processTable(
1849
plugin::InfoSchemaTable *store_table,
1852
Table *table, bool res,
1853
LEX_STRING *db_name,
1854
LEX_STRING *table_name)
1856
LEX *lex= session->lex;
1857
const char *wild= lex->wild ? lex->wild->ptr() : NULL;
1858
const CHARSET_INFO * const cs= system_charset_info;
1860
TableShare *show_table_share;
1861
Field **ptr, *field, *timestamp_field;
1866
if (lex->sql_command != SQLCOM_SHOW_FIELDS)
1869
I.e. we are in SELECT FROM INFORMATION_SCHEMA.COLUMS
1870
rather than in SHOW COLUMNS
1872
if (session->is_error())
1873
push_warning(session, DRIZZLE_ERROR::WARN_LEVEL_WARN,
1874
session->main_da.sql_errno(), session->main_da.message());
1875
session->clear_error();
1881
show_table= tables->table;
1882
show_table_share= show_table->s;
1885
ptr= show_table_share->field;
1886
timestamp_field= show_table_share->timestamp_field;
1888
/* For the moment we just set everything to read */
1889
if (!show_table->read_set)
1891
show_table->def_read_set.setAll();
1892
show_table->read_set= &show_table->def_read_set;
1894
show_table->use_all_columns(); // Required for default
1896
for (; (field= *ptr) ; ptr++)
1899
char tmp[MAX_FIELD_WIDTH];
1900
String type(tmp,sizeof(tmp), system_charset_info);
1903
/* to satisfy 'field->val_str' ASSERTs */
1904
field->table= show_table;
1905
show_table->in_use= session;
1907
if (wild && wild[0] &&
1908
wild_case_compare(system_charset_info, field->field_name,wild))
1912
/* Get default row, with all NULL fields set to NULL */
1913
table->restoreRecordAsDefault();
1915
table->field[1]->store(db_name->str, db_name->length, cs);
1916
table->field[2]->store(table_name->str, table_name->length, cs);
1917
table->field[3]->store(field->field_name, strlen(field->field_name),
1919
table->field[4]->store((int64_t) count, true);
1921
if (get_field_default_value(timestamp_field, field, &type, 0))
1923
table->field[5]->store(type.ptr(), type.length(), cs);
1924
table->field[5]->set_notnull();
1926
pos=(unsigned char*) ((field->flags & NOT_NULL_FLAG) ? "NO" : "YES");
1927
table->field[6]->store((const char*) pos,
1928
strlen((const char*) pos), cs);
1929
store_column_type(table, field, cs, 7);
1931
pos=(unsigned char*) ((field->flags & PRI_KEY_FLAG) ? "PRI" :
1932
(field->flags & UNIQUE_KEY_FLAG) ? "UNI" :
1933
(field->flags & MULTIPLE_KEY_FLAG) ? "MUL":"");
1934
table->field[15]->store((const char*) pos,
1935
strlen((const char*) pos), cs);
1938
if (field->unireg_check == Field::NEXT_NUMBER)
1939
table->field[16]->store(STRING_WITH_LEN("auto_increment"), cs);
1940
if (timestamp_field == field &&
1941
field->unireg_check != Field::TIMESTAMP_DN_FIELD)
1942
table->field[16]->store(STRING_WITH_LEN("on update CURRENT_TIMESTAMP"),
1944
table->field[18]->store(field->comment.str, field->comment.length, cs);
1946
enum column_format_type column_format= (enum column_format_type)
1947
((field->flags >> COLUMN_FORMAT_FLAGS) & COLUMN_FORMAT_MASK);
1948
pos=(unsigned char*)"Default";
1949
table->field[19]->store((const char*) pos,
1950
strlen((const char*) pos), cs);
1951
pos=(unsigned char*)(column_format == COLUMN_FORMAT_TYPE_DEFAULT ? "Default" :
1952
column_format == COLUMN_FORMAT_TYPE_FIXED ? "Fixed" :
1954
table->field[20]->store((const char*) pos,
1955
strlen((const char*) pos), cs);
1957
store_table->addRow(table->record[0], table->s->reclength);
1964
For old SHOW compatibility. It is used when
1965
old SHOW doesn't have generated column names
1966
Make list of fields for SHOW
1969
plugin::InfoSchemaMethods::oldFormat()
1970
session thread Cursor
1971
schema_table pointer to 'schema_tables' element
1978
int plugin::InfoSchemaMethods::oldFormat(Session *session, plugin::InfoSchemaTable *schema_table)
1981
Name_resolution_context *context= &session->lex->select_lex.context;
1982
const plugin::InfoSchemaTable::Columns columns= schema_table->getColumns();
1983
plugin::InfoSchemaTable::Columns::const_iterator iter= columns.begin();
1985
while (iter != columns.end())
1987
const plugin::ColumnInfo *column= *iter;
1988
if (column->getOldName().length() != 0)
1990
Item_field *field= new Item_field(context,
1992
column->getName().c_str());
1995
field->set_name(column->getOldName().c_str(),
1996
column->getOldName().length(),
1997
system_charset_info);
1998
if (session->add_item_to_list(field))
2009
Generate select from information_schema table
2012
make_schema_select()
2013
session thread Cursor
2014
sel pointer to Select_Lex
2015
schema_table_name name of 'schema_tables' element
2021
bool make_schema_select(Session *session, Select_Lex *sel,
2022
const string& schema_table_name)
2024
plugin::InfoSchemaTable *schema_table= plugin::InfoSchemaTable::getTable(schema_table_name.c_str());
2025
LEX_STRING db, table;
2027
We have to make non const db_name & table_name
2028
because of lower_case_table_names
2030
session->make_lex_string(&db, INFORMATION_SCHEMA_NAME.c_str(),
2031
INFORMATION_SCHEMA_NAME.length(), 0);
2032
session->make_lex_string(&table, schema_table->getTableName().c_str(),
2033
schema_table->getTableName().length(), 0);
2034
if (schema_table->oldFormat(session, schema_table) || /* Handle old syntax */
2035
! sel->add_table_to_list(session, new Table_ident(db, table), 0, 0, TL_READ))
297
bool buildColumns(Session *session, const char *schema_ident, Table_ident *table_ident)
299
session->getLex()->sql_command= SQLCOM_SELECT;
301
drizzled::statement::Show *select= new statement::Show(session);
302
session->getLex()->statement= select;
304
util::string::const_shared_ptr schema(session->schema());
307
select->setShowPredicate(schema_ident, table_ident->table.str);
309
else if (table_ident->db.str)
311
select->setShowPredicate(table_ident->db.str, table_ident->table.str);
315
select->setShowPredicate(*schema, table_ident->table.str);
319
my_error(ER_NO_DB_ERROR, MYF(0));
324
drizzled::identifier::Table identifier(select->getShowSchema().c_str(), table_ident->table.str);
325
if (not plugin::StorageEngine::doesTableExist(*session, identifier))
327
my_error(ER_TABLE_UNKNOWN, identifier);
331
if (prepare_new_schema_table(session, session->getLex(), "SHOW_COLUMNS"))
334
if (session->add_item_to_list( new Item_field(&session->lex->current_select->context, NULL, NULL, "*")))
337
(session->lex->current_select->with_wild)++;
342
void buildSelectWarning(Session *session)
344
(void) create_select_for_variable(session, "warning_count");
345
session->getLex()->statement= new statement::Show(session);
348
void buildSelectError(Session *session)
350
(void) create_select_for_variable(session, "error_count");
351
session->getLex()->statement= new statement::Show(session);
354
void buildWarnings(Session *session)
356
session->getLex()->statement= new statement::ShowWarnings(session);
359
void buildErrors(Session *session)
361
session->getLex()->statement= new statement::ShowErrors(session);
364
bool buildIndex(Session *session, const char *schema_ident, Table_ident *table_ident)
366
session->getLex()->sql_command= SQLCOM_SELECT;
367
drizzled::statement::Show *select= new statement::Show(session);
368
session->getLex()->statement= select;
370
util::string::const_shared_ptr schema(session->schema());
373
select->setShowPredicate(schema_ident, table_ident->table.str);
375
else if (table_ident->db.str)
377
select->setShowPredicate(table_ident->db.str, table_ident->table.str);
381
select->setShowPredicate(*schema, table_ident->table.str);
385
my_error(ER_NO_DB_ERROR, MYF(0));
390
drizzled::identifier::Table identifier(select->getShowSchema().c_str(), table_ident->table.str);
391
if (not plugin::StorageEngine::doesTableExist(*session, identifier))
393
my_error(ER_TABLE_UNKNOWN, identifier);
397
if (prepare_new_schema_table(session, session->getLex(), "SHOW_INDEXES"))
400
if (session->add_item_to_list( new Item_field(&session->lex->current_select->context, NULL, NULL, "*")))
403
(session->lex->current_select->with_wild)++;
408
bool buildStatus(Session *session, const drizzled::sql_var_t is_global)
410
session->getLex()->sql_command= SQLCOM_SELECT;
411
session->getLex()->statement= new statement::Show(session);
413
if (is_global == OPT_GLOBAL)
415
if (prepare_new_schema_table(session, session->getLex(), "GLOBAL_STATUS"))
420
if (prepare_new_schema_table(session, session->getLex(), "SESSION_STATUS"))
424
std::string key("Variable_name");
425
std::string value("Value");
427
Item_field *my_field= new Item_field(&session->lex->current_select->context, NULL, NULL, "VARIABLE_NAME");
428
my_field->is_autogenerated_name= false;
429
my_field->set_name(key.c_str(), key.length(), system_charset_info);
431
if (session->add_item_to_list(my_field))
434
my_field= new Item_field(&session->lex->current_select->context, NULL, NULL, "VARIABLE_VALUE");
435
my_field->is_autogenerated_name= false;
436
my_field->set_name(value.c_str(), value.length(), system_charset_info);
438
if (session->add_item_to_list(my_field))
444
bool buildCreateTable(Session *session, Table_ident *ident)
446
session->getLex()->sql_command= SQLCOM_SELECT;
447
statement::Show *select= new statement::Show(session);
448
session->getLex()->statement= select;
450
if (session->getLex()->statement == NULL)
453
if (prepare_new_schema_table(session, session->getLex(), "TABLE_SQL_DEFINITION"))
456
util::string::const_shared_ptr schema(session->schema());
459
select->setShowPredicate(ident->db.str, ident->table.str);
463
select->setShowPredicate(*schema, ident->table.str);
467
my_error(ER_NO_DB_ERROR, MYF(0));
471
std::string key("Table");
472
std::string value("Create Table");
474
Item_field *my_field= new Item_field(&session->lex->current_select->context, NULL, NULL, "TABLE_NAME");
475
my_field->is_autogenerated_name= false;
476
my_field->set_name(key.c_str(), key.length(), system_charset_info);
478
if (session->add_item_to_list(my_field))
481
my_field= new Item_field(&session->lex->current_select->context, NULL, NULL, "TABLE_SQL_DEFINITION");
482
my_field->is_autogenerated_name= false;
483
my_field->set_name(value.c_str(), value.length(), system_charset_info);
485
if (session->add_item_to_list(my_field))
491
bool buildProcesslist(Session *session)
493
session->getLex()->sql_command= SQLCOM_SELECT;
494
session->getLex()->statement= new statement::Show(session);
496
if (prepare_new_schema_table(session, session->getLex(), "PROCESSLIST"))
499
if (session->add_item_to_list( new Item_field(&session->lex->current_select->context, NULL, NULL, "*")))
502
(session->lex->current_select->with_wild)++;
507
bool buildVariables(Session *session, const drizzled::sql_var_t is_global)
509
session->getLex()->sql_command= SQLCOM_SELECT;
510
session->getLex()->statement= new statement::Show(session);
512
if (is_global == OPT_GLOBAL)
514
if (prepare_new_schema_table(session, session->getLex(), "GLOBAL_VARIABLES"))
519
if (prepare_new_schema_table(session, session->getLex(), "SESSION_VARIABLES"))
523
std::string key("Variable_name");
524
std::string value("Value");
526
Item_field *my_field= new Item_field(&session->lex->current_select->context, NULL, NULL, "VARIABLE_NAME");
527
my_field->is_autogenerated_name= false;
528
my_field->set_name(key.c_str(), key.length(), system_charset_info);
530
if (session->add_item_to_list(my_field))
533
my_field= new Item_field(&session->lex->current_select->context, NULL, NULL, "VARIABLE_VALUE");
534
my_field->is_autogenerated_name= false;
535
my_field->set_name(value.c_str(), value.length(), system_charset_info);
537
if (session->add_item_to_list(my_field))
543
bool buildCreateSchema(Session *session, LEX_STRING &ident)
545
session->getLex()->sql_command= SQLCOM_SELECT;
546
drizzled::statement::Show *select= new statement::Show(session);
547
session->getLex()->statement= select;
549
if (prepare_new_schema_table(session, session->getLex(), "SCHEMA_SQL_DEFINITION"))
552
util::string::const_shared_ptr schema(session->schema());
555
select->setShowPredicate(ident.str);
559
select->setShowPredicate(*schema);
563
my_error(ER_NO_DB_ERROR, MYF(0));
567
std::string key("Database");
568
std::string value("Create Database");
570
Item_field *my_field= new Item_field(&session->lex->current_select->context, NULL, NULL, "SCHEMA_NAME");
571
my_field->is_autogenerated_name= false;
572
my_field->set_name(key.c_str(), key.length(), system_charset_info);
574
if (session->add_item_to_list(my_field))
577
my_field= new Item_field(&session->lex->current_select->context, NULL, NULL, "SCHEMA_SQL_DEFINITION");
578
my_field->is_autogenerated_name= false;
579
my_field->set_name(value.c_str(), value.length(), system_charset_info);
581
if (session->add_item_to_list(my_field))
587
bool buildDescribe(Session *session, Table_ident *ident)
589
session->getLex()->lock_option= TL_READ;
590
init_select(session->getLex());
591
session->getLex()->current_select->parsing_place= SELECT_LIST;
592
session->getLex()->sql_command= SQLCOM_SELECT;
593
drizzled::statement::Show *select= new statement::Show(session);
594
session->getLex()->statement= select;
595
session->getLex()->select_lex.db= 0;
597
util::string::const_shared_ptr schema(session->schema());
600
select->setShowPredicate(ident->db.str, ident->table.str);
604
select->setShowPredicate(*schema, ident->table.str);
608
my_error(ER_NO_DB_ERROR, MYF(0));
613
drizzled::identifier::Table identifier(select->getShowSchema().c_str(), ident->table.str);
614
if (not plugin::StorageEngine::doesTableExist(*session, identifier))
616
my_error(ER_TABLE_UNKNOWN, identifier);
620
if (prepare_new_schema_table(session, session->getLex(), "SHOW_COLUMNS"))
625
if (session->add_item_to_list( new Item_field(&session->lex->current_select->
632
(session->lex->current_select->with_wild)++;
637
} /* namespace drizzled */
639
2042
} /* namespace drizzled */