25 #include <drizzled/data_home.h>
26 #include <drizzled/error.h>
27 #include <drizzled/internal/my_sys.h>
28 #include <drizzled/plugin/storage_engine.h>
29 #include <drizzled/session.h>
31 #include <drizzled/sql_select.h>
32 #include <drizzled/statement/show.h>
33 #include <drizzled/statement/show_errors.h>
34 #include <drizzled/statement/show_warnings.h>
35 #include <drizzled/sql_lex.h>
36 #include <drizzled/table_ident.h>
50 inline const char* str_or_nil(
const char *str)
52 return str ? str :
"<nil>";
75 int get_quote_char_for_identifier()
82 bool buildSchemas(Session *session)
84 session->lex().sql_command= SQLCOM_SELECT;
85 session->lex().statement=
new statement::Show(session);
87 std::string column_name=
"Database";
88 if (session->lex().wild)
90 column_name.append(
" (");
91 column_name.append(session->lex().wild->ptr());
92 column_name.append(
")");
95 if (prepare_new_schema_table(session, session->lex(), session->lex().current_select->where ?
"SCHEMAS" :
"SHOW_SCHEMAS"))
98 Item_field *my_field=
new Item_field(&session->lex().current_select->context, NULL, NULL,
"SCHEMA_NAME");
99 my_field->is_autogenerated_name=
false;
100 my_field->set_name(column_name);
102 session->add_item_to_list(my_field);
103 session->add_order_to_list(my_field,
true);
107 bool buildTables(Session *session,
const char *ident)
109 session->lex().sql_command= SQLCOM_SELECT;
112 session->lex().statement= select;
114 std::string column_name=
"Tables_in_";
116 util::string::ptr schema(session->schema());
119 identifier::Schema identifier=
str_ref(ident);
120 column_name.append(ident);
121 session->lex().select_lex.db= ident;
122 if (not plugin::StorageEngine::doesSchemaExist(identifier))
124 my_error(ER_BAD_DB_ERROR, identifier);
126 select->setShowPredicate(ident,
"");
128 else if (schema and not schema->empty())
130 column_name.append(*schema);
131 select->setShowPredicate(*schema,
"");
135 my_error(ER_NO_DB_ERROR, MYF(0));
140 if (session->lex().wild)
142 column_name.append(
" (");
143 column_name.append(session->lex().wild->ptr());
144 column_name.append(
")");
147 if (prepare_new_schema_table(session, session->lex(),
"SHOW_TABLES"))
150 Item_field *my_field=
new Item_field(&session->lex().current_select->context, NULL, NULL,
"TABLE_NAME");
151 my_field->is_autogenerated_name=
false;
152 my_field->set_name(column_name);
154 session->add_item_to_list(my_field);
155 session->add_order_to_list(my_field,
true);
159 bool buildTemporaryTables(Session *session)
161 session->lex().sql_command= SQLCOM_SELECT;
162 session->lex().statement=
new statement::Show(session);
164 if (prepare_new_schema_table(session, session->lex(),
"SHOW_TEMPORARY_TABLES"))
167 session->add_item_to_list(
new Item_field(&session->lex().current_select->context, NULL, NULL,
"*"));
168 session->lex().current_select->with_wild++;
172 bool buildTableStatus(Session *session,
const char *ident)
174 session->lex().sql_command= SQLCOM_SELECT;
176 session->lex().statement= select;
178 std::string column_name=
"Tables_in_";
180 util::string::ptr schema(session->schema());
183 session->lex().select_lex.db= ident;
185 identifier::Schema identifier=
str_ref(ident);
186 if (not plugin::StorageEngine::doesSchemaExist(identifier))
188 my_error(ER_BAD_DB_ERROR, identifier);
191 select->setShowPredicate(ident,
"");
195 select->setShowPredicate(*schema,
"");
199 my_error(ER_NO_DB_ERROR, MYF(0));
203 if (prepare_new_schema_table(session, session->lex(),
"SHOW_TABLE_STATUS"))
206 session->add_item_to_list(
new Item_field(&session->lex().current_select->context, NULL, NULL,
"*"));
207 session->lex().current_select->with_wild++;
211 bool buildEngineStatus(Session *session,
str_ref)
213 session->lex().sql_command= SQLCOM_SELECT;
215 session->lex().statement= select;
217 my_error(ER_USE_DATA_DICTIONARY);
221 bool buildColumns(Session *session,
const char *schema_ident, Table_ident *table_ident)
223 session->lex().sql_command= SQLCOM_SELECT;
226 session->lex().statement= select;
228 util::string::ptr schema(session->schema());
231 select->setShowPredicate(schema_ident, table_ident->table.data());
233 else if (table_ident->db.data())
235 select->setShowPredicate(table_ident->db.data(), table_ident->table.data());
239 select->setShowPredicate(*schema, table_ident->table.data());
243 my_error(ER_NO_DB_ERROR, MYF(0));
249 if (not plugin::StorageEngine::doesTableExist(*session, identifier))
251 my_error(ER_TABLE_UNKNOWN, identifier);
255 if (prepare_new_schema_table(session, session->lex(),
"SHOW_COLUMNS"))
258 session->add_item_to_list(
new Item_field(&session->lex().current_select->context, NULL, NULL,
"*"));
259 session->lex().current_select->with_wild++;
263 void buildSelectWarning(Session *session)
266 session->lex().statement=
new statement::Show(session);
269 void buildSelectError(Session *session)
272 session->lex().statement=
new statement::Show(session);
275 void buildWarnings(Session *session)
277 session->lex().statement=
new statement::ShowWarnings(session);
280 void buildErrors(Session *session)
282 session->lex().statement=
new statement::ShowErrors(session);
285 bool buildIndex(Session *session,
const char *schema_ident, Table_ident *table_ident)
287 session->lex().sql_command= SQLCOM_SELECT;
289 session->lex().statement= select;
291 util::string::ptr schema(session->schema());
294 select->setShowPredicate(schema_ident, table_ident->table.data());
296 else if (table_ident->db.data())
298 select->setShowPredicate(table_ident->db.data(), table_ident->table.data());
302 select->setShowPredicate(*schema, table_ident->table.data());
306 my_error(ER_NO_DB_ERROR, MYF(0));
312 if (not plugin::StorageEngine::doesTableExist(*session, identifier))
314 my_error(ER_TABLE_UNKNOWN, identifier);
318 if (prepare_new_schema_table(session, session->lex(),
"SHOW_INDEXES"))
321 session->add_item_to_list(
new Item_field(&session->lex().current_select->context, NULL, NULL,
"*"));
322 session->lex().current_select->with_wild++;
326 bool buildStatus(Session *session,
const drizzled::sql_var_t is_global)
328 session->lex().sql_command= SQLCOM_SELECT;
329 session->lex().statement=
new statement::Show(session);
331 if (prepare_new_schema_table(session, session->lex(), is_global == OPT_GLOBAL ?
"GLOBAL_STATUS" :
"SESSION_STATUS"))
334 Item_field *my_field=
new Item_field(&session->lex().current_select->context, NULL, NULL,
"VARIABLE_NAME");
335 my_field->is_autogenerated_name=
false;
336 my_field->set_name(
"Variable_name");
337 session->add_item_to_list(my_field);
338 my_field=
new Item_field(&session->lex().current_select->context, NULL, NULL,
"VARIABLE_VALUE");
339 my_field->is_autogenerated_name=
false;
340 my_field->set_name(
"Value");
341 session->add_item_to_list(my_field);
345 bool buildCreateTable(Session *session, Table_ident *ident)
347 session->lex().sql_command= SQLCOM_SELECT;
348 statement::Show *select=
new statement::Show(session);
349 session->lex().statement= select;
351 if (session->lex().statement == NULL)
354 if (prepare_new_schema_table(session, session->lex(),
"TABLE_SQL_DEFINITION"))
357 util::string::ptr schema(session->schema());
358 if (ident->db.data())
360 select->setShowPredicate(ident->db.data(), ident->table.data());
364 select->setShowPredicate(*schema, ident->table.data());
368 my_error(ER_NO_DB_ERROR, MYF(0));
372 Item_field *my_field=
new Item_field(&session->lex().current_select->context, NULL, NULL,
"TABLE_NAME");
373 my_field->is_autogenerated_name=
false;
374 my_field->set_name(
"Table");
375 session->add_item_to_list(my_field);
376 my_field=
new Item_field(&session->lex().current_select->context, NULL, NULL,
"TABLE_SQL_DEFINITION");
377 my_field->is_autogenerated_name=
false;
378 my_field->set_name(
"Create Table");
379 session->add_item_to_list(my_field);
383 bool buildProcesslist(Session *session)
385 session->lex().sql_command= SQLCOM_SELECT;
386 session->lex().statement=
new statement::Show(session);
388 if (prepare_new_schema_table(session, session->lex(),
"PROCESSLIST"))
391 session->add_item_to_list(
new Item_field(&session->lex().current_select->context, NULL, NULL,
"*"));
392 session->lex().current_select->with_wild++;
396 bool buildVariables(Session *session,
const drizzled::sql_var_t is_global)
398 session->lex().sql_command= SQLCOM_SELECT;
399 session->lex().statement=
new statement::Show(session);
401 if (is_global == OPT_GLOBAL)
403 if (prepare_new_schema_table(session, session->lex(),
"GLOBAL_VARIABLES"))
408 if (prepare_new_schema_table(session, session->lex(),
"SESSION_VARIABLES"))
412 Item_field *my_field=
new Item_field(&session->lex().current_select->context, NULL, NULL,
"VARIABLE_NAME");
413 my_field->is_autogenerated_name=
false;
414 my_field->set_name(
"Variable_name");
415 session->add_item_to_list(my_field);
416 my_field=
new Item_field(&session->lex().current_select->context, NULL, NULL,
"VARIABLE_VALUE");
417 my_field->is_autogenerated_name=
false;
418 my_field->set_name(
"Value");
420 session->add_item_to_list(my_field);
424 bool buildCreateSchema(Session *session,
str_ref ident)
426 session->lex().sql_command= SQLCOM_SELECT;
428 session->lex().statement= select;
430 if (prepare_new_schema_table(session, session->lex(),
"SCHEMA_SQL_DEFINITION"))
433 util::string::ptr schema(session->schema());
436 select->setShowPredicate(ident.data());
440 select->setShowPredicate(*schema);
444 my_error(ER_NO_DB_ERROR, MYF(0));
448 Item_field *my_field=
new Item_field(&session->lex().current_select->context, NULL, NULL,
"SCHEMA_NAME");
449 my_field->is_autogenerated_name=
false;
450 my_field->set_name(
"Database");
451 session->add_item_to_list(my_field);
453 my_field=
new Item_field(&session->lex().current_select->context, NULL, NULL,
"SCHEMA_SQL_DEFINITION");
454 my_field->is_autogenerated_name=
false;
455 my_field->set_name(
"Create Database");
456 session->add_item_to_list(my_field);
460 bool buildDescribe(Session *session, Table_ident *ident)
462 session->lex().lock_option= TL_READ;
463 init_select(&session->lex());
464 session->lex().current_select->parsing_place= SELECT_LIST;
465 session->lex().sql_command= SQLCOM_SELECT;
467 session->lex().statement= select;
468 session->lex().select_lex.db= 0;
470 util::string::ptr schema(session->schema());
471 if (ident->db.data())
473 select->setShowPredicate(ident->db.data(), ident->table.data());
477 select->setShowPredicate(*schema, ident->table.data());
481 my_error(ER_NO_DB_ERROR, MYF(0));
487 if (not plugin::StorageEngine::doesTableExist(*session, identifier))
489 my_error(ER_TABLE_UNKNOWN, identifier);
493 if (prepare_new_schema_table(session, session->lex(),
"SHOW_COLUMNS"))
497 session->add_item_to_list(
new Item_field(&session->lex().current_select->context, NULL, NULL,
"*"));
498 session->lex().current_select->with_wild++;