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>
37 #include <drizzled/catalog/instance.h>
51 inline const char* str_or_nil(
const char *str)
53 return str ? str :
"<nil>";
76 int get_quote_char_for_identifier()
83 bool buildSchemas(Session *session)
85 session->lex().sql_command= SQLCOM_SELECT;
86 session->lex().statement=
new statement::Show(session);
88 std::string column_name=
"Database";
89 if (session->lex().wild)
91 column_name.append(
" (");
92 column_name.append(session->lex().wild->ptr());
93 column_name.append(
")");
96 if (prepare_new_schema_table(session, session->lex(), session->lex().current_select->where ?
"SCHEMAS" :
"SHOW_SCHEMAS"))
99 Item_field *my_field=
new Item_field(&session->lex().current_select->context, NULL, NULL,
"SCHEMA_NAME");
100 my_field->is_autogenerated_name=
false;
101 my_field->set_name(column_name);
103 session->add_item_to_list(my_field);
104 session->add_order_to_list(my_field,
true);
108 bool buildTables(Session *session,
const char *ident)
110 session->lex().sql_command= SQLCOM_SELECT;
113 session->lex().statement= select;
115 std::string column_name=
"Tables_in_";
117 util::string::ptr schema(session->schema());
120 identifier::Schema identifier(session->catalog().identifier(),
122 column_name.append(ident);
123 session->lex().select_lex.db= ident;
124 if (not plugin::StorageEngine::doesSchemaExist(identifier))
126 my_error(ER_BAD_DB_ERROR, identifier);
128 select->setShowPredicate(ident,
"");
130 else if (schema and not schema->empty())
132 column_name.append(*schema);
133 select->setShowPredicate(*schema,
"");
137 my_error(ER_NO_DB_ERROR, MYF(0));
142 if (session->lex().wild)
144 column_name.append(
" (");
145 column_name.append(session->lex().wild->ptr());
146 column_name.append(
")");
149 if (prepare_new_schema_table(session, session->lex(),
"SHOW_TABLES"))
152 Item_field *my_field=
new Item_field(&session->lex().current_select->context, NULL, NULL,
"TABLE_NAME");
153 my_field->is_autogenerated_name=
false;
154 my_field->set_name(column_name);
156 session->add_item_to_list(my_field);
157 session->add_order_to_list(my_field,
true);
161 bool buildTemporaryTables(Session *session)
163 session->lex().sql_command= SQLCOM_SELECT;
164 session->lex().statement=
new statement::Show(session);
166 if (prepare_new_schema_table(session, session->lex(),
"SHOW_TEMPORARY_TABLES"))
169 session->add_item_to_list(
new Item_field(&session->lex().current_select->context, NULL, NULL,
"*"));
170 session->lex().current_select->with_wild++;
174 bool buildTableStatus(Session *session,
const char *ident)
176 session->lex().sql_command= SQLCOM_SELECT;
178 session->lex().statement= select;
180 std::string column_name=
"Tables_in_";
182 util::string::ptr schema(session->schema());
185 session->lex().select_lex.db= ident;
187 identifier::Schema identifier(session->catalog().identifier(),
189 if (not plugin::StorageEngine::doesSchemaExist(identifier))
191 my_error(ER_BAD_DB_ERROR, identifier);
194 select->setShowPredicate(ident,
"");
198 select->setShowPredicate(*schema,
"");
202 my_error(ER_NO_DB_ERROR, MYF(0));
206 if (prepare_new_schema_table(session, session->lex(),
"SHOW_TABLE_STATUS"))
209 session->add_item_to_list(
new Item_field(&session->lex().current_select->context, NULL, NULL,
"*"));
210 session->lex().current_select->with_wild++;
214 bool buildEngineStatus(Session *session,
str_ref)
216 session->lex().sql_command= SQLCOM_SELECT;
218 session->lex().statement= select;
220 my_error(ER_USE_DATA_DICTIONARY);
224 bool buildColumns(Session *session,
const char *schema_ident, Table_ident *table_ident)
226 session->lex().sql_command= SQLCOM_SELECT;
229 session->lex().statement= select;
231 util::string::ptr schema(session->schema());
234 select->setShowPredicate(schema_ident, table_ident->table.data());
236 else if (table_ident->db.data())
238 select->setShowPredicate(table_ident->db.data(), table_ident->table.data());
242 select->setShowPredicate(*schema, table_ident->table.data());
246 my_error(ER_NO_DB_ERROR, MYF(0));
252 select->getShowSchema(),
253 table_ident->table.data());
254 if (not plugin::StorageEngine::doesTableExist(*session, identifier))
256 my_error(ER_TABLE_UNKNOWN, identifier);
260 if (prepare_new_schema_table(session, session->lex(),
"SHOW_COLUMNS"))
263 session->add_item_to_list(
new Item_field(&session->lex().current_select->context, NULL, NULL,
"*"));
264 session->lex().current_select->with_wild++;
268 void buildSelectWarning(Session *session)
271 session->lex().statement=
new statement::Show(session);
274 void buildSelectError(Session *session)
277 session->lex().statement=
new statement::Show(session);
280 void buildWarnings(Session *session)
282 session->lex().statement=
new statement::ShowWarnings(session);
285 void buildErrors(Session *session)
287 session->lex().statement=
new statement::ShowErrors(session);
290 bool buildIndex(Session *session,
const char *schema_ident, Table_ident *table_ident)
292 session->lex().sql_command= SQLCOM_SELECT;
294 session->lex().statement= select;
296 util::string::ptr schema(session->schema());
299 select->setShowPredicate(schema_ident, table_ident->table.data());
301 else if (table_ident->db.data())
303 select->setShowPredicate(table_ident->db.data(), table_ident->table.data());
307 select->setShowPredicate(*schema, table_ident->table.data());
311 my_error(ER_NO_DB_ERROR, MYF(0));
317 select->getShowSchema(),
318 table_ident->table.data());
319 if (not plugin::StorageEngine::doesTableExist(*session, identifier))
321 my_error(ER_TABLE_UNKNOWN, identifier);
325 if (prepare_new_schema_table(session, session->lex(),
"SHOW_INDEXES"))
328 session->add_item_to_list(
new Item_field(&session->lex().current_select->context, NULL, NULL,
"*"));
329 session->lex().current_select->with_wild++;
333 bool buildStatus(Session *session,
const drizzled::sql_var_t is_global)
335 session->lex().sql_command= SQLCOM_SELECT;
336 session->lex().statement=
new statement::Show(session);
338 if (prepare_new_schema_table(session, session->lex(), is_global == OPT_GLOBAL ?
"GLOBAL_STATUS" :
"SESSION_STATUS"))
341 Item_field *my_field=
new Item_field(&session->lex().current_select->context, NULL, NULL,
"VARIABLE_NAME");
342 my_field->is_autogenerated_name=
false;
343 my_field->set_name(
"Variable_name");
344 session->add_item_to_list(my_field);
345 my_field=
new Item_field(&session->lex().current_select->context, NULL, NULL,
"VARIABLE_VALUE");
346 my_field->is_autogenerated_name=
false;
347 my_field->set_name(
"Value");
348 session->add_item_to_list(my_field);
352 bool buildCreateTable(Session *session, Table_ident *ident)
354 session->lex().sql_command= SQLCOM_SELECT;
355 statement::Show *select=
new statement::Show(session);
356 session->lex().statement= select;
358 if (session->lex().statement == NULL)
361 if (prepare_new_schema_table(session, session->lex(),
"TABLE_SQL_DEFINITION"))
364 util::string::ptr schema(session->schema());
365 if (ident->db.data())
367 select->setShowPredicate(ident->db.data(), ident->table.data());
371 select->setShowPredicate(*schema, ident->table.data());
375 my_error(ER_NO_DB_ERROR, MYF(0));
379 Item_field *my_field=
new Item_field(&session->lex().current_select->context, NULL, NULL,
"TABLE_NAME");
380 my_field->is_autogenerated_name=
false;
381 my_field->set_name(
"Table");
382 session->add_item_to_list(my_field);
383 my_field=
new Item_field(&session->lex().current_select->context, NULL, NULL,
"TABLE_SQL_DEFINITION");
384 my_field->is_autogenerated_name=
false;
385 my_field->set_name(
"Create Table");
386 session->add_item_to_list(my_field);
390 bool buildProcesslist(Session *session)
392 session->lex().sql_command= SQLCOM_SELECT;
393 session->lex().statement=
new statement::Show(session);
395 if (prepare_new_schema_table(session, session->lex(),
"PROCESSLIST"))
398 session->add_item_to_list(
new Item_field(&session->lex().current_select->context, NULL, NULL,
"*"));
399 session->lex().current_select->with_wild++;
403 bool buildVariables(Session *session,
const drizzled::sql_var_t is_global)
405 session->lex().sql_command= SQLCOM_SELECT;
406 session->lex().statement=
new statement::Show(session);
408 if (is_global == OPT_GLOBAL)
410 if (prepare_new_schema_table(session, session->lex(),
"GLOBAL_VARIABLES"))
415 if (prepare_new_schema_table(session, session->lex(),
"SESSION_VARIABLES"))
419 Item_field *my_field=
new Item_field(&session->lex().current_select->context, NULL, NULL,
"VARIABLE_NAME");
420 my_field->is_autogenerated_name=
false;
421 my_field->set_name(
"Variable_name");
422 session->add_item_to_list(my_field);
423 my_field=
new Item_field(&session->lex().current_select->context, NULL, NULL,
"VARIABLE_VALUE");
424 my_field->is_autogenerated_name=
false;
425 my_field->set_name(
"Value");
427 session->add_item_to_list(my_field);
431 bool buildCreateSchema(Session *session,
str_ref ident)
433 session->lex().sql_command= SQLCOM_SELECT;
435 session->lex().statement= select;
437 if (prepare_new_schema_table(session, session->lex(),
"SCHEMA_SQL_DEFINITION"))
440 util::string::ptr schema(session->schema());
443 select->setShowPredicate(ident.data());
447 select->setShowPredicate(*schema);
451 my_error(ER_NO_DB_ERROR, MYF(0));
455 Item_field *my_field=
new Item_field(&session->lex().current_select->context, NULL, NULL,
"SCHEMA_NAME");
456 my_field->is_autogenerated_name=
false;
457 my_field->set_name(
"Database");
458 session->add_item_to_list(my_field);
460 my_field=
new Item_field(&session->lex().current_select->context, NULL, NULL,
"SCHEMA_SQL_DEFINITION");
461 my_field->is_autogenerated_name=
false;
462 my_field->set_name(
"Create Database");
463 session->add_item_to_list(my_field);
467 bool buildDescribe(Session *session, Table_ident *ident)
469 session->lex().lock_option= TL_READ;
470 init_select(&session->lex());
471 session->lex().current_select->parsing_place= SELECT_LIST;
472 session->lex().sql_command= SQLCOM_SELECT;
474 session->lex().statement= select;
475 session->lex().select_lex.db= 0;
477 util::string::ptr schema(session->schema());
478 if (ident->db.data())
480 select->setShowPredicate(ident->db.data(), ident->table.data());
484 select->setShowPredicate(*schema, ident->table.data());
488 my_error(ER_NO_DB_ERROR, MYF(0));
494 select->getShowSchema(),
495 ident->table.data());
496 if (not plugin::StorageEngine::doesTableExist(*session, identifier))
498 my_error(ER_TABLE_UNKNOWN, identifier);
502 if (prepare_new_schema_table(session, session->lex(),
"SHOW_COLUMNS"))
506 session->add_item_to_list(
new Item_field(&session->lex().current_select->context, NULL, NULL,
"*"));
507 session->lex().current_select->with_wild++;
TODO: Rename this file - func.h is stupid.
void create_select_for_variable(Session *session, const char *var_name)