24
24
#include "config.h"
25
#include "drizzled/session.h"
26
#include "drizzled/session/cache.h"
25
#include <drizzled/session.h>
26
#include "drizzled/session_list.h"
27
27
#include <sys/stat.h>
28
#include "drizzled/error.h"
29
#include "drizzled/gettext.h"
30
#include "drizzled/query_id.h"
31
#include "drizzled/data_home.h"
32
#include "drizzled/sql_base.h"
33
#include "drizzled/lock.h"
34
#include "drizzled/item/cache.h"
35
#include "drizzled/item/float.h"
36
#include "drizzled/item/return_int.h"
37
#include "drizzled/item/empty_string.h"
38
#include "drizzled/show.h"
39
#include "drizzled/plugin/client.h"
28
#include <drizzled/error.h>
29
#include <drizzled/gettext.h>
30
#include <drizzled/query_id.h>
31
#include <drizzled/data_home.h>
32
#include <drizzled/sql_base.h>
33
#include <drizzled/lock.h>
34
#include <drizzled/item/cache.h>
35
#include <drizzled/item/float.h>
36
#include <drizzled/item/return_int.h>
37
#include <drizzled/item/empty_string.h>
38
#include <drizzled/show.h>
39
#include <drizzled/plugin/client.h>
40
40
#include "drizzled/plugin/scheduler.h"
41
41
#include "drizzled/plugin/authentication.h"
42
42
#include "drizzled/plugin/logging.h"
43
43
#include "drizzled/plugin/transactional_storage_engine.h"
44
#include "drizzled/plugin/query_rewrite.h"
45
44
#include "drizzled/probes.h"
46
45
#include "drizzled/table_proto.h"
47
46
#include "drizzled/db.h"
49
48
#include "drizzled/transaction_services.h"
50
49
#include "drizzled/drizzled.h"
52
#include "drizzled/table/instance.h"
51
#include "drizzled/table_share_instance.h"
54
53
#include "plugin/myisam/myisam.h"
55
54
#include "drizzled/internal/iocache.h"
56
#include "drizzled/internal/thread_var.h"
57
55
#include "drizzled/plugin/event_observer.h"
59
#include "drizzled/util/functors.h"
61
#include "drizzled/display.h"
64
58
#include <algorithm>
66
#include <boost/filesystem.hpp>
68
#include "drizzled/util/backtrace.h"
70
61
using namespace std;
72
namespace fs=boost::filesystem;
81
70
char empty_c_string[1]= {0}; /* used for not defined db */
83
72
const char * const Session::DEFAULT_WHERE= "field list";
73
extern pthread_key_t THR_Session;
74
extern pthread_key_t THR_Mem_root;
77
/****************************************************************************
79
****************************************************************************/
80
static unsigned char *get_var_key(user_var_entry *entry, size_t *length, bool)
82
*length= entry->name.length;
83
return (unsigned char*) entry->name.str;
86
static void free_user_var(user_var_entry *entry)
85
91
bool Key_part_spec::operator==(const Key_part_spec& other) const
87
93
return length == other.length &&
88
94
field_name.length == other.field_name.length &&
89
!my_strcasecmp(system_charset_info, field_name.str, other.field_name.str);
95
!strcmp(field_name.str, other.field_name.str);
92
98
Open_tables_state::Open_tables_state(uint64_t version_arg) :
154
160
return (int) session->lex->sql_command;
157
enum_tx_isolation session_tx_isolation(const Session *session)
163
int session_tx_isolation(const Session *session)
159
return (enum_tx_isolation)session->variables.tx_isolation;
165
return (int) session->variables.tx_isolation;
162
168
Session::Session(plugin::Client *client_arg) :
163
169
Open_tables_state(refresh_version),
164
170
mem_root(&main_mem_root),
167
query(new std::string),
168
_schema(new std::string("")),
170
173
client(client_arg),
172
175
scheduler_arg(NULL),
173
176
lock_id(&main_lock_id),
175
178
ha_data(plugin::num_trx_monitored_objects),
176
concurrent_execute_allowed(true),
177
179
arg_of_last_insert_id_function(false),
178
180
first_successful_insert_id_in_prev_stmt(0),
179
181
first_successful_insert_id_in_cur_stmt(0),
180
182
limit_found_rows(0),
181
_global_read_lock(NONE),
183
184
some_tables_deleted(false),
184
185
no_errors(false),
261
259
/* Initialize sub structures */
262
260
memory::init_sql_alloc(&warn_root, WARN_ALLOC_BLOCK_SIZE, WARN_ALLOC_PREALLOC_SIZE);
261
hash_init(&user_vars, system_charset_info, USER_VARS_HASH_SIZE, 0, 0,
262
(hash_get_key) get_var_key,
263
(hash_free_key) free_user_var, 0);
264
265
substitute_null_with_insert_id = false;
265
lock_info.init(); /* safety: will be reset after start */
266
thr_lock_info_init(&lock_info); /* safety: will be reset after start */
266
267
thr_lock_owner_init(&main_lock_id, &lock_info);
268
269
m_internal_handler= NULL;
302
303
return false; // 'false', as per coding style
305
void Session::setAbort(bool arg)
307
mysys_var->abort= arg;
310
void Session::lockOnSys()
316
boost_unique_lock_t scopedLock(mysys_var->mutex);
317
if (mysys_var->current_cond)
319
mysys_var->current_mutex->lock();
320
mysys_var->current_cond->notify_all();
321
mysys_var->current_mutex->unlock();
325
306
void Session::pop_internal_handler()
327
308
assert(m_internal_handler != NULL);
401
371
dbug_sentry= Session_SENTRY_GONE;
403
373
main_mem_root.free_root(MYF(0));
404
currentMemRoot().release();
405
currentSession().release();
374
pthread_setspecific(THR_Session, 0);
407
376
plugin::Logging::postEndDo(this);
408
377
plugin::EventObserver::deregisterSessionEvents(*this);
410
for (PropertyMap::iterator iter= life_properties.begin(); iter != life_properties.end(); iter++)
412
delete (*iter).second;
414
life_properties.clear();
417
void Session::setClient(plugin::Client *client_arg)
420
client->setSession(this);
423
void Session::awake(Session::killed_state_t state_to_set)
425
if ((state_to_set == Session::KILL_QUERY) and (command == COM_SLEEP))
379
/* Ensure that no one is using Session */
380
pthread_mutex_unlock(&LOCK_delete);
381
pthread_mutex_destroy(&LOCK_delete);
385
Add all status variables to another status variable array
389
to_var add to this array
390
from_var from this array
393
This function assumes that all variables are long/ulong.
394
If this assumption will change, then we have to explictely add
395
the other variables after the while loop
397
void add_to_status(system_status_var *to_var, system_status_var *from_var)
399
ulong *end= (ulong*) ((unsigned char*) to_var +
400
offsetof(system_status_var, last_system_status_var) +
402
ulong *to= (ulong*) to_var, *from= (ulong*) from_var;
409
Add the difference between two status variable arrays to another one.
413
to_var add to this array
414
from_var from this array
415
dec_var minus this array
418
This function assumes that all variables are long/ulong.
420
void add_diff_to_status(system_status_var *to_var, system_status_var *from_var,
421
system_status_var *dec_var)
423
ulong *end= (ulong*) ((unsigned char*) to_var + offsetof(system_status_var,
424
last_system_status_var) +
426
ulong *to= (ulong*) to_var, *from= (ulong*) from_var, *dec= (ulong*) dec_var;
429
*(to++)+= *(from++) - *(dec++);
432
void Session::awake(Session::killed_state state_to_set)
428
434
this->checkSentry();
430
setKilled(state_to_set);
431
scheduler->killSession(this);
435
safe_mutex_assert_owner(&LOCK_delete);
437
killed= state_to_set;
433
438
if (state_to_set != Session::KILL_QUERY)
440
scheduler->killSession(this);
435
441
DRIZZLE_CONNECTION_DONE(thread_id);
440
boost_unique_lock_t scopedLock(mysys_var->mutex);
445
pthread_mutex_lock(&mysys_var->mutex);
443
447
This broadcast could be up in the air if the victim thread
444
448
exits the cond in the time between read and broadcast, but that is
445
449
ok since all we want to do is to make the victim thread get out
568
569
current_global_counters.max_used_connections= connection_count;
571
current_global_counters.connections++;
572
arg->thread_id= arg->variables.pseudo_thread_id= global_thread_id++;
574
session::Cache::singleton().insert(arg);
576
if (unlikely(plugin::EventObserver::connectSession(*arg)))
578
// We should do something about an error...
581
if (plugin::Scheduler::getScheduler()->addSession(arg))
583
DRIZZLE_CONNECTION_START(arg->getSessionId());
572
thread_id= variables.pseudo_thread_id= global_thread_id++;
574
pthread_mutex_lock(&LOCK_thread_count);
575
getSessionList().push_back(this);
576
pthread_mutex_unlock(&LOCK_thread_count);
578
if (scheduler->addSession(this))
580
DRIZZLE_CONNECTION_START(thread_id);
584
581
char error_message_buff[DRIZZLE_ERRMSG_SIZE];
586
arg->setKilled(Session::KILL_CONNECTION);
583
killed= Session::KILL_CONNECTION;
588
arg->status_var.aborted_connects++;
585
status_var_increment(current_global_counters.aborted_connects);
590
587
/* Can't use my_error() since store_globals has not been called. */
591
588
/* TODO replace will better error message */
592
589
snprintf(error_message_buff, sizeof(error_message_buff),
593
590
ER(ER_CANT_CREATE_THREAD), 1);
594
arg->client->sendError(ER_CANT_CREATE_THREAD, error_message_buff);
591
client->sendError(ER_CANT_CREATE_THREAD, error_message_buff);
604
Is this session viewable by the current user?
606
bool Session::isViewable() const
608
return plugin::Authorization::isAuthorized(current_session->getSecurityContext(),
614
const char* Session::enter_cond(boost::condition_variable_any &cond, boost::mutex &mutex, const char* msg)
599
const char* Session::enter_cond(pthread_cond_t *cond,
600
pthread_mutex_t* mutex,
616
603
const char* old_msg = get_proc_info();
617
604
safe_mutex_assert_owner(mutex);
618
mysys_var->current_mutex = &mutex;
619
mysys_var->current_cond = &cond;
605
mysys_var->current_mutex = mutex;
606
mysys_var->current_cond = cond;
620
607
this->set_proc_info(msg);
629
616
locked (if that would not be the case, you'll get a deadlock if someone
630
617
does a Session::awake() on you).
632
mysys_var->current_mutex->unlock();
633
boost_unique_lock_t scopedLock(mysys_var->mutex);
619
pthread_mutex_unlock(mysys_var->current_mutex);
620
pthread_mutex_lock(&mysys_var->mutex);
634
621
mysys_var->current_mutex = 0;
635
622
mysys_var->current_cond = 0;
636
623
this->set_proc_info(old_msg);
624
pthread_mutex_unlock(&mysys_var->mutex);
639
627
bool Session::authenticate()
642
630
if (client->authenticate())
645
status_var.aborted_connects++;
633
status_var_increment(current_global_counters.aborted_connects);
650
bool Session::checkUser(const std::string &passwd_str,
651
const std::string &in_db)
637
bool Session::checkUser(const char *passwd, uint32_t passwd_len, const char *in_db)
639
const string passwd_str(passwd, passwd_len);
653
640
bool is_authenticated=
654
641
plugin::Authentication::isAuthenticated(getSecurityContext(),
657
644
if (is_authenticated != true)
659
status_var.access_denied++;
660
646
/* isAuthenticated has pushed the error message */
664
650
/* Change database if necessary */
665
if (not in_db.empty())
651
if (in_db && in_db[0])
667
653
SchemaIdentifier identifier(in_db);
668
654
if (mysql_change_db(this, identifier))
694
680
main_da.reset_diagnostics_area();
696
682
if (client->readCommand(&l_packet, &packet_length) == false)
701
if (getKilled() == KILL_CONNECTION)
704
685
if (packet_length == 0)
707
l_command= static_cast<enum_server_command>(l_packet[0]);
688
l_command= (enum enum_server_command) (unsigned char) l_packet[0];
709
690
if (command >= COM_END)
710
691
command= COM_END; // Wrong command
712
693
assert(packet_length);
713
return not dispatch_command(l_command, this, l_packet+1, (uint32_t) (packet_length-1));
694
return ! dispatch_command(l_command, this, l_packet+1, (uint32_t) (packet_length-1));
716
697
bool Session::readAndStoreQuery(const char *in_packet, uint32_t in_packet_length)
722
703
in_packet_length--;
724
705
const char *pos= in_packet + in_packet_length; /* Point at end null */
725
while (in_packet_length > 0 && (pos[-1] == ';' || my_isspace(charset() ,pos[-1])))
706
while (in_packet_length > 0 &&
707
(pos[-1] == ';' || my_isspace(charset() ,pos[-1])))
728
710
in_packet_length--;
731
std::string *new_query= new std::string(in_packet, in_packet + in_packet_length);
732
// We can not be entirely sure _schema has a value
735
plugin::QueryRewriter::rewriteQuery(*_schema, *new_query);
737
query.reset(new_query);
738
_state.reset(new State(in_packet, in_packet_length));
713
query.assign(in_packet, in_packet + in_packet_length);
1038
static int create_file(Session *session,
1039
fs::path &target_path,
1040
file_exchange *exchange,
1041
internal::IO_CACHE *cache)
1011
static int create_file(Session *session, char *path, file_exchange *exchange, internal::IO_CACHE *cache)
1043
fs::path to_file(exchange->file_name);
1046
if (not to_file.has_root_directory())
1014
uint32_t option= MY_UNPACK_FILENAME | MY_RELATIVE_PATH;
1016
#ifdef DONT_ALLOW_FULL_LOAD_DATA_PATHS
1017
option|= MY_REPLACE_DIR; // Force use of db directory
1020
if (!internal::dirname_length(exchange->file_name))
1048
target_path= fs::system_complete(getDataHomeCatalog());
1049
util::string::const_shared_ptr schema(session->schema());
1050
if (schema and not schema->empty())
1052
int count_elements= 0;
1053
for (fs::path::iterator iter= to_file.begin();
1054
iter != to_file.end();
1055
++iter, ++count_elements)
1058
if (count_elements == 1)
1060
target_path /= *schema;
1063
target_path /= to_file;
1022
strcpy(path, data_home_real);
1023
if (! session->db.empty())
1024
strncat(path, session->db.c_str(), FN_REFLEN-strlen(data_home_real)-1);
1025
(void) internal::fn_format(path, exchange->file_name, path, "", option);
1067
target_path = exchange->file_name;
1070
if (not secure_file_priv.string().empty())
1072
if (target_path.file_string().substr(0, secure_file_priv.file_string().size()) != secure_file_priv.file_string())
1074
/* Write only allowed to dir or subdir specified by secure_file_priv */
1075
my_error(ER_OPTION_PREVENTS_STATEMENT, MYF(0), "--secure-file-priv");
1080
if (!access(target_path.file_string().c_str(), F_OK))
1028
(void) internal::fn_format(path, exchange->file_name, data_home_real, "", option);
1030
if (opt_secure_file_priv &&
1031
strncmp(opt_secure_file_priv, path, strlen(opt_secure_file_priv)))
1033
/* Write only allowed to dir or subdir specified by secure_file_priv */
1034
my_error(ER_OPTION_PREVENTS_STATEMENT, MYF(0), "--secure-file-priv");
1038
if (!access(path, F_OK))
1082
1040
my_error(ER_FILE_EXISTS_ERROR, MYF(0), exchange->file_name);
1085
1043
/* Create the file world readable */
1086
if ((file= internal::my_create(target_path.file_string().c_str(), 0666, O_WRONLY|O_EXCL, MYF(MY_WME))) < 0)
1044
if ((file= internal::my_create(path, 0666, O_WRONLY|O_EXCL, MYF(MY_WME))) < 0)
1088
1046
(void) fchmod(file, 0666); // Because of umask()
1089
if (cache->init_io_cache(file, 0L, internal::WRITE_CACHE, 0L, 1, MYF(MY_WME)))
1047
if (init_io_cache(cache, file, 0L, internal::WRITE_CACHE, 0L, 1, MYF(MY_WME)))
1091
1049
internal::my_close(file, MYF(0));
1092
internal::my_delete(target_path.file_string().c_str(), MYF(0)); // Delete file on error, it was just created
1050
internal::my_delete(path, MYF(0)); // Delete file on error, it was just created
1319
1273
for (; length > sizeof(space) ; length-=sizeof(space))
1321
1275
if (my_b_write(cache,(unsigned char*) space,sizeof(space)))
1324
1278
if (my_b_write(cache,(unsigned char*) space,length))
1328
1282
if (res && enclosed)
1330
1284
if (my_b_write(cache, (unsigned char*) exchange->enclosed->ptr(),
1331
1285
exchange->enclosed->length()))
1334
1288
if (--items_left)
1336
1290
if (my_b_write(cache, (unsigned char*) exchange->field_term->ptr(),
1337
1291
field_term_length))
1341
1295
if (my_b_write(cache,(unsigned char*) exchange->line_term->ptr(),
1342
1296
exchange->line_term->length()))
1451
1406
switch (val_item->result_type())
1453
1408
case REAL_RESULT:
1454
op= &select_max_min_finder_subselect::cmp_real;
1409
op= &select_max_min_finder_subselect::cmp_real;
1456
1411
case INT_RESULT:
1457
op= &select_max_min_finder_subselect::cmp_int;
1412
op= &select_max_min_finder_subselect::cmp_int;
1459
1414
case STRING_RESULT:
1460
op= &select_max_min_finder_subselect::cmp_str;
1415
op= &select_max_min_finder_subselect::cmp_str;
1462
1417
case DECIMAL_RESULT:
1463
1418
op= &select_max_min_finder_subselect::cmp_decimal;
1465
1420
case ROW_RESULT:
1466
1421
// This case should never be choosen
1471
1426
cache->store(val_item);
1554
1509
void Session::end_statement()
1556
1511
/* Cleanup SQL processing state to reuse this statement in next query. */
1558
query_cache_key= ""; // reset the cache key
1559
resetResultsetMessage();
1562
1515
bool Session::copy_db_to(char **p_db, size_t *p_db_length)
1565
if (_schema and _schema->empty())
1567
my_message(ER_NO_DB_ERROR, ER(ER_NO_DB_ERROR), MYF(0));
1570
else if (not _schema)
1572
my_message(ER_NO_DB_ERROR, ER(ER_NO_DB_ERROR), MYF(0));
1577
*p_db= strmake(_schema->c_str(), _schema->size());
1578
*p_db_length= _schema->size();
1519
my_message(ER_NO_DB_ERROR, ER(ER_NO_DB_ERROR), MYF(0));
1522
*p_db= strmake(db.c_str(), db.length());
1523
*p_db_length= db.length();
1619
void Session::set_db(const std::string &new_db)
1563
bool Session::set_db(const std::string &new_db)
1621
1565
/* Do not reallocate memory if current chunk is big enough. */
1622
1566
if (new_db.length())
1624
_schema.reset(new std::string(new_db));
1628
_schema.reset(new std::string(""));
1578
Check the killed state of a user thread
1579
@param session user thread
1580
@retval 0 the user thread is active
1581
@retval 1 the user thread has been killed
1583
int session_killed(const Session *session)
1585
return(session->killed);
1589
const struct charset_info_st *session_charset(Session *session)
1591
return(session->charset());
1634
1595
Mark transaction to rollback and mark error as fatal to a sub-statement.
1651
1612
plugin_sessionvar_cleanup(this);
1653
1614
/* If necessary, log any aborted or unauthorized connections */
1654
if (getKilled() || client->wasAborted())
1615
if (killed || client->wasAborted())
1656
status_var.aborted_threads++;
1617
status_var_increment(current_global_counters.aborted_threads);
1659
1620
if (client->wasAborted())
1661
if (not getKilled() && variables.log_warnings > 1)
1622
if (! killed && variables.log_warnings > 1)
1663
1624
SecurityContext *sctx= &security_ctx;
1665
1626
errmsg_printf(ERRMSG_LVL_WARN, ER(ER_NEW_ABORTING_CONNECTION)
1667
, (_schema->empty() ? "unconnected" : _schema->c_str())
1628
, (db.empty() ? "unconnected" : db.c_str())
1668
1629
, sctx->getUser().empty() == false ? sctx->getUser().c_str() : "unauthenticated"
1669
1630
, sctx->getIp().c_str()
1670
1631
, (main_da.is_error() ? main_da.message() : ER(ER_UNKNOWN_ERROR)));
1774
1726
If this is needed, use close_temporary_table()
1777
void Open_tables_state::nukeTable(Table *table)
1729
void Session::nukeTable(Table *table)
1779
1731
plugin::StorageEngine *table_type= table->getShare()->db_type();
1781
1733
table->free_io_cache();
1782
table->delete_table();
1734
table->delete_table(false);
1784
1736
TableIdentifier identifier(table->getShare()->getSchemaName(), table->getShare()->getTableName(), table->getShare()->getPath());
1785
1737
rm_temporary_table(table_type, identifier);
1796
1748
void Session::refresh_status()
1750
pthread_mutex_lock(&LOCK_status);
1752
/* Add thread's status variabes to global status */
1753
add_to_status(&global_status_var, &status_var);
1798
1755
/* Reset thread's status variables */
1799
1756
memset(&status_var, 0, sizeof(status_var));
1758
/* Reset some global variables */
1759
reset_status_vars();
1761
/* Reset the counters of all key caches (default and named). */
1762
reset_key_cache_counters();
1801
1763
flush_status_time= time((time_t*) 0);
1802
1764
current_global_counters.max_used_connections= 1; /* We set it to one, because we know we exist */
1803
current_global_counters.connections= 0;
1765
pthread_mutex_unlock(&LOCK_status);
1806
1768
user_var_entry *Session::getVariable(LEX_STRING &name, bool create_if_not_exists)
1808
return getVariable(std::string(name.str, name.length), create_if_not_exists);
1811
user_var_entry *Session::getVariable(const std::string &name, bool create_if_not_exists)
1813
UserVarsRange ppp= user_vars.equal_range(name);
1815
for (UserVars::iterator iter= ppp.first;
1816
iter != ppp.second; ++iter)
1818
return (*iter).second;
1821
if (not create_if_not_exists)
1824
1770
user_var_entry *entry= NULL;
1825
entry= new (nothrow) user_var_entry(name.c_str(), query_id);
1830
std::pair<UserVars::iterator, bool> returnable= user_vars.insert(make_pair(name, entry));
1832
if (not returnable.second)
1772
entry= (user_var_entry*) hash_search(&user_vars, (unsigned char*) name.str, name.length);
1774
if ((entry == NULL) && create_if_not_exists)
1776
if (!hash_inited(&user_vars))
1778
entry= new (nothrow) user_var_entry(name.str, query_id);
1783
if (my_hash_insert(&user_vars, (unsigned char*) entry))
1840
void Session::setVariable(const std::string &name, const std::string &value)
1842
user_var_entry *updateable_var= getVariable(name.c_str(), true);
1844
updateable_var->update_hash(false,
1845
(void*)value.c_str(),
1846
static_cast<uint32_t>(value.length()), STRING_RESULT,
1848
DERIVATION_IMPLICIT, false);
1851
void Open_tables_state::mark_temp_tables_as_free_for_reuse()
1853
for (Table *table= temporary_tables ; table ; table= table->getNext())
1795
void Session::mark_temp_tables_as_free_for_reuse()
1797
for (Table *table= temporary_tables ; table ; table= table->next)
1855
if (table->query_id == getQueryId())
1799
if (table->query_id == query_id)
1857
1801
table->query_id= 0;
1858
1802
table->cursor->ha_reset();
1916
1861
handled either before writing a query log event (inside
1917
1862
binlog_query()) or when preparing a pending event.
1864
mysql_unlock_tables(this, lock);
1923
Note that we need to hold table::Cache::singleton().mutex() while changing the
1868
Note that we need to hold LOCK_open while changing the
1924
1869
open_tables list. Another thread may work on it.
1925
(See: table::Cache::singleton().removeTable(), mysql_wait_completed_table())
1870
(See: remove_table_from_cache(), mysql_wait_completed_table())
1926
1871
Closing a MERGE child before the parent would be fatal if the
1927
1872
other thread tries to abort the MERGE lock in between.
1961
1906
close_tables_for_reopen(&tables);
1963
1908
if ((mysql_handle_derived(lex, &mysql_derived_prepare) ||
1909
(fill_derived_tables() &&
1965
1910
mysql_handle_derived(lex, &mysql_derived_filling))))
1972
@note "best_effort" is used in cases were if a failure occurred on this
1973
operation it would not be surprising because we are only removing because there
1974
might be an issue (lame engines).
1916
bool Session::openTables(TableList *tables, uint32_t flags)
1919
bool ret= fill_derived_tables();
1920
assert(ret == false);
1921
if (open_tables_from_list(&tables, &counter, flags) ||
1922
mysql_handle_derived(lex, &mysql_derived_prepare))
1977
bool Open_tables_state::rm_temporary_table(const TableIdentifier &identifier, bool best_effort)
1927
bool Session::rm_temporary_table(TableIdentifier &identifier)
1979
if (plugin::StorageEngine::dropTable(*static_cast<Session *>(this), identifier))
1929
if (plugin::StorageEngine::dropTable(*this, identifier))
1981
if (not best_effort)
1984
identifier.getSQLPath(path);
1985
errmsg_printf(ERRMSG_LVL_WARN, _("Could not remove temporary table: '%s', error: %d"),
1986
path.c_str(), errno);
1931
errmsg_printf(ERRMSG_LVL_WARN, _("Could not remove temporary table: '%s', error: %d"),
1932
identifier.getSQLPath().c_str(), errno);
1933
dumpTemporaryTableNames("rm_temporary_table()");
1995
bool Open_tables_state::rm_temporary_table(plugin::StorageEngine *base, const TableIdentifier &identifier)
1941
bool Session::rm_temporary_table(plugin::StorageEngine *base, TableIdentifier &identifier)
1999
if (plugin::StorageEngine::dropTable(*static_cast<Session *>(this), *base, identifier))
1945
if (plugin::StorageEngine::dropTable(*this, *base, identifier))
2002
identifier.getSQLPath(path);
2003
1947
errmsg_printf(ERRMSG_LVL_WARN, _("Could not remove temporary table: '%s', error: %d"),
2004
path.c_str(), errno);
1948
identifier.getSQLPath().c_str(), errno);
1949
dumpTemporaryTableNames("rm_temporary_table()");
2037
1982
cerr << "\t\t Proto " << proto->schema() << " " << proto->name() << "\n";
2041
1985
cerr << "\tTabl;e Name " << table->getShare()->getSchemaName() << "." << table->getShare()->getTableName() << " : " << answer << "\n";
2046
bool Session::TableMessages::storeTableMessage(const TableIdentifier &identifier, message::Table &table_message)
1989
bool Session::storeTableMessage(TableIdentifier &identifier, message::Table &table_message)
2048
1991
table_message_cache.insert(make_pair(identifier.getPath(), table_message));
2053
bool Session::TableMessages::removeTableMessage(const TableIdentifier &identifier)
1996
bool Session::removeTableMessage(TableIdentifier &identifier)
2055
1998
TableMessageCache::iterator iter;
2114
table::Instance *Session::getInstanceTable()
2116
temporary_shares.push_back(new table::Instance()); // This will not go into the tableshare cache, so no key is used.
2118
table::Instance *tmp_share= temporary_shares.back();
2127
Create a reduced Table object with properly set up Field list from a
2128
list of field definitions.
2130
The created table doesn't have a table Cursor associated with
2131
it, has no keys, no group/distinct, no copy_funcs array.
2132
The sole purpose of this Table object is to use the power of Field
2133
class to read/write data to/from table->getInsertRecord(). Then one can store
2134
the record in any container (RB tree, hash, etc).
2135
The table is created in Session mem_root, so are the table's fields.
2136
Consequently, if you don't BLOB fields, you don't need to free it.
2138
@param session connection handle
2139
@param field_list list of column definitions
2142
0 if out of memory, Table object in case of success
2144
table::Instance *Session::getInstanceTable(List<CreateField> &field_list)
2146
temporary_shares.push_back(new table::Instance(this, field_list)); // This will not go into the tableshare cache, so no key is used.
2148
table::Instance *tmp_share= temporary_shares.back();
2157
static const std::string NONE= "NONE";
2158
static const std::string GOT_GLOBAL_READ_LOCK= "HAS GLOBAL READ LOCK";
2159
static const std::string MADE_GLOBAL_READ_LOCK_BLOCK_COMMIT= "HAS GLOBAL READ LOCK WITH BLOCKING COMMIT";
2161
const std::string &type(drizzled::Session::global_read_lock_t type)
2167
case Session::GOT_GLOBAL_READ_LOCK:
2168
return GOT_GLOBAL_READ_LOCK;
2169
case Session::MADE_GLOBAL_READ_LOCK_BLOCK_COMMIT:
2170
return MADE_GLOBAL_READ_LOCK_BLOCK_COMMIT;
2174
size_t max_string_length(drizzled::Session::global_read_lock_t)
2176
return MADE_GLOBAL_READ_LOCK_BLOCK_COMMIT.size();
2179
} /* namespace display */
2057
TableShareInstance *Session::getTemporaryShare()
2059
temporary_shares.push_back(new TableShareInstance()); // This will not go into the tableshare cache, so no key is used.
2061
TableShareInstance *tmp_share= temporary_shares.back();
2068
TableShareInstance *Session::getTemporaryShare(const char *tmpname_arg)
2070
assert(tmpname_arg);
2072
temporary_shares.push_back(new TableShareInstance(tmpname_arg)); // This will not go into the tableshare cache, so no key is used.
2074
TableShareInstance *tmp_share= temporary_shares.back();
2181
2081
} /* namespace drizzled */