17
17
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20
21
#ifndef DRIZZLED_SESSION_H
21
22
#define DRIZZLED_SESSION_H
23
#include "drizzled/cursor.h"
24
#include "drizzled/diagnostics_area.h"
25
#include "drizzled/file_exchange.h"
26
#include "drizzled/identifier.h"
27
#include "drizzled/internal_error_handler.h"
28
#include "drizzled/my_hash.h"
29
#include "drizzled/named_savepoint.h"
30
#include "drizzled/open_tables_state.h"
31
#include "drizzled/plugin.h"
32
#include "drizzled/plugin/authorization.h"
33
#include "drizzled/pthread_globals.h"
34
#include "drizzled/query_id.h"
35
#include "drizzled/resource_context.h"
36
#include "drizzled/select_result_interceptor.h"
37
#include "drizzled/sql_error.h"
38
#include "drizzled/sql_locale.h"
39
#include "drizzled/statistics_variables.h"
40
#include "drizzled/transaction_context.h"
41
#include "drizzled/util/storable.h"
42
#include "drizzled/xid.h"
47
#include <sys/resource.h>
24
/* Classes in mysql */
26
#include <drizzled/global.h>
27
#include <drizzled/protocol.h>
28
#include <libdrizzleclient/password.h> // rand_struct
29
#include <drizzled/sql_locale.h>
30
#include <drizzled/ha_trx_info.h>
31
#include <mysys/my_tree.h>
32
#include <drizzled/handler.h>
33
#include <drizzled/current_session.h>
34
#include <drizzled/sql_error.h>
35
#include <drizzled/query_arena.h>
36
#include <drizzled/file_exchange.h>
37
#include <drizzled/select_result_interceptor.h>
54
#include "drizzled/catalog/instance.h"
55
#include "drizzled/catalog/local.h"
57
#include <drizzled/session/property_map.h>
58
#include <drizzled/session/state.h>
59
#include <drizzled/session/table_messages.h>
60
#include <drizzled/session/transactions.h>
61
#include <drizzled/system_variables.h>
62
#include <drizzled/copy_info.h>
63
#include <drizzled/system_variables.h>
64
#include <drizzled/ha_data.h>
66
#include <boost/thread/thread.hpp>
67
#include <boost/thread/mutex.hpp>
68
#include <boost/thread/shared_mutex.hpp>
69
#include <boost/thread/condition_variable.hpp>
70
#include <boost/make_shared.hpp>
72
#include <drizzled/lex_column.h>
73
#include "drizzled/sql_lex.h"
75
#include "drizzled/visibility.h"
77
#define MIN_HANDSHAKE_SIZE 6
86
class EventObserverList;
96
namespace internal { struct st_my_thread_var; }
98
namespace table { class Placeholder; }
100
41
class Lex_input_stream;
101
42
class user_var_entry;
103
44
class Table_ident;
105
class TableShareInstance;
107
47
extern char internal_table_name[2];
108
48
extern char empty_c_string[1];
112
52
#define TC_HEURISTIC_RECOVER_ROLLBACK 2
113
53
extern uint32_t tc_heuristic_recover;
56
The COPY_INFO structure is used by INSERT/REPLACE code.
57
The schema of the row counting by the INSERT/INSERT ... ON DUPLICATE KEY
59
If a row is inserted then the copied variable is incremented.
60
If a row is updated by the INSERT ... ON DUPLICATE KEY UPDATE and the
61
new data differs from the old one then the copied and the updated
62
variables are incremented.
63
The touched variable is incremented if a row was touched by the update part
64
of the INSERT ... ON DUPLICATE KEY UPDATE no matter whether the row
65
was actually changed or not.
67
typedef struct st_copy_info {
68
ha_rows records; /**< Number of processed records */
69
ha_rows deleted; /**< Number of deleted records */
70
ha_rows updated; /**< Number of updated records */
71
ha_rows copied; /**< Number of copied records */
73
ha_rows touched; /* Number of touched records */
74
enum enum_duplicates handle_duplicates;
75
int escape_char, last_errno;
77
/* for INSERT ... UPDATE */
78
List<Item> *update_fields;
79
List<Item> *update_values;
80
/* for VIEW ... WITH CHECK OPTION */
84
typedef struct drizzled_lock_st
87
uint32_t table_count,lock_count;
88
THR_LOCK_DATA **locks;
92
#include <drizzled/lex_column.h>
115
94
class select_result;
118
97
#define Session_SENTRY_MAGIC 0xfeedd1ff
119
98
#define Session_SENTRY_GONE 0xdeadbeef
121
extern DRIZZLED_API struct drizzle_system_variables global_system_variables;
100
#define Session_CHECK_SENTRY(session) assert(session->dbug_sentry == Session_SENTRY_MAGIC)
102
struct system_variables
104
system_variables() {};
106
How dynamically allocated system variables are handled:
108
The global_system_variables and max_system_variables are "authoritative"
109
They both should have the same 'version' and 'size'.
110
When attempting to access a dynamic variable, if the session version
111
is out of date, then the session version is updated and realloced if
112
neccessary and bytes copied from global to make up for missing data.
114
ulong dynamic_variables_version;
115
char* dynamic_variables_ptr;
116
uint32_t dynamic_variables_head; /* largest valid variable offset */
117
uint32_t dynamic_variables_size; /* how many bytes are in use */
119
uint64_t myisam_max_extra_sort_file_size;
120
uint64_t max_heap_table_size;
121
uint64_t tmp_table_size;
122
ha_rows select_limit;
123
ha_rows max_join_size;
124
uint64_t auto_increment_increment;
125
uint64_t auto_increment_offset;
126
uint64_t bulk_insert_buff_size;
127
uint64_t join_buff_size;
128
uint32_t max_allowed_packet;
129
uint64_t max_error_count;
130
uint64_t max_length_for_sort_data;
131
uint64_t max_sort_length;
132
uint64_t max_tmp_tables;
133
uint64_t min_examined_row_limit;
134
uint32_t myisam_stats_method;
135
uint32_t net_buffer_length;
136
uint32_t net_interactive_timeout;
137
uint32_t net_read_timeout;
138
uint32_t net_retry_count;
139
uint32_t net_wait_timeout;
140
uint32_t net_write_timeout;
141
bool optimizer_prune_level;
142
uint32_t optimizer_search_depth;
144
Controls use of Engine-MRR:
145
0 - auto, based on cost
146
1 - force MRR when the storage engine is capable of doing it
149
uint32_t optimizer_use_mrr;
150
/* A bitmap for switching optimizations on/off */
151
uint32_t optimizer_switch;
152
uint64_t preload_buff_size;
153
uint32_t read_buff_size;
154
uint32_t read_rnd_buff_size;
155
uint32_t div_precincrement;
156
size_t sortbuff_size;
157
uint32_t thread_handling;
158
uint32_t tx_isolation;
159
uint32_t completion_type;
160
/* Determines which non-standard SQL behaviour should be enabled */
162
uint64_t max_seeks_for_key;
163
size_t range_alloc_block_size;
164
uint32_t query_alloc_block_size;
165
uint32_t query_prealloc_size;
166
uint32_t trans_alloc_block_size;
167
uint32_t trans_prealloc_size;
169
uint64_t group_concat_max_len;
170
/* TODO: change this to my_thread_id - but have to fix set_var first */
171
uint64_t pseudo_thread_id;
173
bool low_priority_updates;
176
compatibility option:
177
- index usage hints (USE INDEX without a FOR clause) behave as in 5.0
180
bool engine_condition_pushdown;
181
bool keep_files_on_create;
183
bool old_alter_table;
185
plugin_ref table_plugin;
187
/* Only charset part of these variables is sensible */
188
const CHARSET_INFO *character_set_filesystem;
190
/* Both charset and collation parts of these variables are important */
191
const CHARSET_INFO *collation_server;
192
const CHARSET_INFO *collation_database;
194
inline const CHARSET_INFO *getCollation(void)
196
return collation_database ? collation_database : collation_server;
200
MY_LOCALE *lc_time_names;
202
Time_zone *time_zone;
208
extern struct system_variables global_system_variables;
210
#include "sql_lex.h" /* only for SQLCOM_END */
212
/* per thread status variables */
214
typedef struct system_status_var
216
uint64_t bytes_received;
219
ulong com_stat[(uint32_t) SQLCOM_END];
220
ulong created_tmp_disk_tables;
221
ulong created_tmp_tables;
222
ulong ha_commit_count;
223
ulong ha_delete_count;
224
ulong ha_read_first_count;
225
ulong ha_read_last_count;
226
ulong ha_read_key_count;
227
ulong ha_read_next_count;
228
ulong ha_read_prev_count;
229
ulong ha_read_rnd_count;
230
ulong ha_read_rnd_next_count;
231
ulong ha_rollback_count;
232
ulong ha_update_count;
233
ulong ha_write_count;
234
ulong ha_prepare_count;
235
ulong ha_savepoint_count;
236
ulong ha_savepoint_rollback_count;
238
/* KEY_CACHE parts. These are copies of the original */
239
ulong key_blocks_changed;
240
ulong key_blocks_used;
241
ulong key_cache_r_requests;
242
ulong key_cache_read;
243
ulong key_cache_w_requests;
244
ulong key_cache_write;
245
/* END OF KEY_CACHE parts */
247
ulong net_big_packet_count;
250
ulong select_full_join_count;
251
ulong select_full_range_join_count;
252
ulong select_range_count;
253
ulong select_range_check_count;
254
ulong select_scan_count;
255
ulong long_query_count;
256
ulong filesort_merge_passes;
257
ulong filesort_range_count;
259
ulong filesort_scan_count;
261
Number of statements sent from the client
267
SEE last_system_status_var DEFINITION BELOW.
269
Below 'last_system_status_var' are all variables which doesn't make any
270
sense to add to the /global/ status variable counter.
272
double last_query_cost;
278
This is used for 'SHOW STATUS'. It must be updated to the last ulong
279
variable in system_status_var which is makes sens to add to the global
283
#define last_system_status_var questions
285
void mark_transaction_to_rollback(Session *session, bool all);
124
* Represents a client connection to the database server.
126
* Contains the client/server protocol object, the current statement
127
* being executed, local-to-session variables and status counters, and
128
* a host of other information.
132
* The Session class should have a vector of Statement object pointers which
133
* comprise the statements executed on the Session. Until this architectural
134
* change is done, we can forget about parallel operations inside a session.
138
* Make member variables private and have inlined accessors and setters. Hide
139
* all member variables that are not critical to non-internal operations of the
143
class DRIZZLED_API Session : public Open_tables_state
289
@brief State of a single command executed against this connection.
291
One connection can contain a lot of simultaneously running statements,
292
some of which could be:
293
- prepared, that is, contain placeholders,
294
To perform some action with statement we reset Session part to the state of
295
that statement, do the action, and then save back modified state from Session
296
to the statement. It will be changed in near future, and Statement will
300
class Statement: public ilink, public Query_arena
302
Statement(const Statement &rhs); /* not implemented: */
303
Statement &operator=(const Statement &rhs); /* non-copyable */
146
// Plugin storage in Session.
147
typedef boost::shared_ptr<Session> shared_ptr;
148
typedef Session& reference;
149
typedef const Session& const_reference;
150
typedef const Session* const_pointer;
151
typedef Session* pointer;
153
static shared_ptr make_shared(plugin::Client *client, catalog::Instance::shared_ptr instance_arg)
155
assert(instance_arg);
156
return boost::make_shared<Session>(client, instance_arg);
306
Uniquely identifies each statement object in thread scope; change during
307
statement lifetime. FIXME: must be const
160
312
MARK_COLUMNS_NONE: Means mark_used_colums is not set and no indicator to
170
322
enum enum_mark_columns mark_used_columns;
171
inline void* calloc(size_t size)
174
if ((ptr= mem_root->alloc_root(size)))
175
memset(ptr, 0, size);
178
inline char *strmake(const char *str, size_t size)
180
return mem_root->strmake_root(str,size);
183
inline void *memdup_w_gap(const void *str, size_t size, uint32_t gap)
186
if ((ptr= mem_root->alloc_root(size + gap)))
187
memcpy(ptr,str,size);
190
/** Frees all items attached to this Statement */
194
* List of items created in the parser for this query. Every item puts
195
* itself to the list on creation (see Item::Item() for details))
198
memory::Root *mem_root; /**< Pointer to current memroot */
201
memory::Root *getMemRoot()
213
void setXaId(uint64_t in_xa_id)
219
* Uniquely identifies each statement object in thread scope; change during
220
* statement lifetime.
222
* @todo should be const
225
LEX *lex; /**< parse tree descriptor */
232
enum_sql_command getSqlCommand() const
234
return lex->sql_command;
237
/** query associated with this statement */
238
typedef boost::shared_ptr<const std::string> QueryString;
241
boost::shared_ptr<std::string> query;
243
// Never allow for a modification of this outside of the class. c_str()
244
// requires under some setup non const, you must copy the QueryString in
247
QueryString getQueryString() const
252
void resetQueryString()
324
LEX *lex; // parse tree descriptor
259
We need to copy the lock on the string in order to make sure we have a stable string.
260
Once this is done we can use it to build a const char* which can be handed off for
261
a method to use (Innodb is currently the only engine using this).
326
Points to the query associated with this statement. It's const, but
327
we need to declare it char * because all table handlers are written
328
in C and need to point to it.
330
Note that (A) if we set query = NULL, we must at the same time set
331
query_length = 0, and protect the whole operation with the
332
LOCK_thread_count mutex. And (B) we are ONLY allowed to set query to a
333
non-NULL value if its previous value is NULL. We do not need to protect
334
operation (B) with any mutex. To avoid crashes in races, if we do not
335
know that session->query cannot change at the moment, one should print
336
session->query like this:
337
(1) reserve the LOCK_thread_count mutex;
338
(2) check if session->query is NULL;
339
(3) if not NULL, then print at most session->query_length characters from
340
it. We will see the query_length field as either 0, or the right value
342
Assuming that the write and read of an n-bit memory field in an n-bit
343
computer is atomic, we can avoid races in the above way.
344
This printing is needed at least in SHOW PROCESSLIST and SHOW INNODB
263
const char *getQueryStringCopy(size_t &length)
265
QueryString tmp_string(getQueryString());
273
length= tmp_string->length();
274
char *to_return= strmake(tmp_string->c_str(), tmp_string->length());
279
session::State::shared_ptr _state;
283
session::State::const_shared_ptr state()
348
uint32_t query_length; // current query length
289
351
Name of the current (default) database.
297
359
the Session of that thread); that thread is (and must remain, for now) the
298
360
only responsible for freeing this member.
301
util::string::shared_ptr _schema;
305
util::string::const_shared_ptr schema() const
310
return util::string::const_shared_ptr(new std::string(""));
313
/* current cache key */
314
std::string query_cache_key;
368
/* This constructor is called for backup statements */
371
Statement(LEX *lex_arg, MEM_ROOT *mem_root_arg, ulong id_arg);
375
struct st_savepoint {
376
struct st_savepoint *prev;
379
Ha_trx_info *ha_list;
382
enum xa_states {XA_NOTR=0, XA_ACTIVE, XA_IDLE, XA_PREPARED};
383
extern const char *xa_state_names[];
385
typedef struct st_xid_state {
386
/* For now, this is only used to catch duplicated external xids */
387
XID xid; // transaction identifier
388
enum xa_states xa_state; // used by external XA only
392
extern pthread_mutex_t LOCK_xid_cache;
393
extern HASH xid_cache;
394
bool xid_cache_init(void);
395
void xid_cache_free(void);
396
XID_STATE *xid_cache_search(XID *xid);
397
bool xid_cache_insert(XID *xid, enum xa_states xa_state);
398
bool xid_cache_insert(XID_STATE *xid_state);
399
void xid_cache_delete(XID_STATE *xid_state);
401
#include <drizzled/security_context.h>
404
A registry for item tree transformations performed during
405
query optimization. We register only those changes which require
406
a rollback to re-execute a prepared statement or stored procedure
410
struct Item_change_record;
411
typedef I_List<Item_change_record> Item_change_list;
414
#include <drizzled/open_tables_state.h>
416
/* Flags for the Session::system_thread variable */
417
enum enum_thread_type
424
#include <drizzled/internal_error_handler.h>
425
#include <drizzled/diagnostics_area.h>
428
Storage engine specific thread local data.
434
Storage engine specific thread local data.
435
Lifetime: one user connection.
439
0: Life time: one statement within a transaction. If @@autocommit is
440
on, also represents the entire transaction.
441
@sa trans_register_ha()
443
1: Life time: one transaction within a connection.
444
If the storage engine does not participate in a transaction,
445
this should not be used.
446
@sa trans_register_ha()
448
Ha_trx_info ha_info[2];
450
Ha_data() :ha_ptr(NULL) {}
456
For each client connection we create a separate thread with Session serving as
457
a thread/connection descriptor
460
class Session :public Statement,
461
public Open_tables_state
316
465
Constant for Session::where initialization in the beginning of every query.
318
467
It's needed because we do not save/restore Session::where normally during
321
470
static const char * const DEFAULT_WHERE;
323
memory::Root warn_root; /**< Allocation area for warnings and errors */
325
plugin::Client *client; /**< Pointer to client object */
329
void setClient(plugin::Client *client_arg);
331
plugin::Client *getClient()
336
plugin::Client *getClient() const
341
plugin::Scheduler *scheduler; /**< Pointer to scheduler object */
342
void *scheduler_arg; /**< Pointer to the optional scheduler argument */
344
typedef boost::unordered_map< std::string, user_var_entry *, util::insensitive_hash, util::insensitive_equal_to> UserVars;
347
typedef std::pair< UserVars::iterator, UserVars::iterator > UserVarsRange;
348
UserVars user_vars; /**< Hash of user variables defined during the session's lifetime */
351
const UserVars &getUserVariables() const
356
drizzle_system_variables variables; /**< Mutable local variables local to the session */
358
enum_tx_isolation getTxIsolation()
360
return (enum_tx_isolation)variables.tx_isolation;
363
struct system_status_var status_var; /**< Session-local status counters */
364
THR_LOCK_INFO lock_info; /**< Locking information for this session */
365
THR_LOCK_OWNER main_lock_id; /**< To use for conventional queries */
366
THR_LOCK_OWNER *lock_id; /**< If not main_lock_id, points to the lock_id of a cursor. */
369
* A pointer to the stack frame of the scheduler thread
370
* which is called first in the thread for handling a client
375
identifier::User::shared_ptr security_ctx;
377
int32_t scoreboard_index;
379
inline void checkSentry() const
381
assert(this->dbug_sentry == Session_SENTRY_MAGIC);
385
identifier::User::const_shared_ptr user() const
390
return identifier::User::const_shared_ptr();
393
void setUser(identifier::User::shared_ptr arg)
398
int32_t getScoreboardIndex()
400
return scoreboard_index;
403
void setScoreboardIndex(int32_t in_scoreboard_index)
405
scoreboard_index= in_scoreboard_index;
409
* Is this session viewable by the current user?
411
bool isViewable(identifier::User::const_reference) const;
472
NET net; // client connection descriptor
473
MEM_ROOT warn_root; // For warnings and errors
474
Protocol *protocol; // Current protocol
475
Protocol_text protocol_text; // Normal protocol
476
HASH user_vars; // hash for user variables
477
String packet; // dynamic buffer for network I/O
478
String convert_buffer; // buffer for charset conversions
479
struct rand_struct rand; // used for authentication
480
struct system_variables variables; // Changeable local variables
481
struct system_status_var status_var; // Per thread statistic vars
482
struct system_status_var *initial_status_var; /* used by show status */
483
THR_LOCK_INFO lock_info; // Locking info of this thread
484
THR_LOCK_OWNER main_lock_id; // To use for conventional queries
485
THR_LOCK_OWNER *lock_id; // If not main_lock_id, points to
486
// the lock_id of a cursor.
487
pthread_mutex_t LOCK_delete; // Locked before session is deleted
489
A pointer to the stack frame of handle_one_connection(),
490
which is called first in the thread for handling a client
495
Currently selected catalog.
501
Some members of Session (currently 'Statement::db',
502
'catalog' and 'query') are set and alloced by the slave SQL thread
503
(for the Session of that thread); that thread is (and must remain, for now)
504
the only responsible for freeing these 3 members. If you add members
505
here, and you add code to set them in replication, don't forget to
506
free_them_and_set_them_to_0 in replication properly. For details see
507
the 'err:' label of the handle_slave_sql() in sql/slave.cc.
509
@see handle_slave_sql
512
Security_context security_ctx;
515
Points to info-string that we show in SHOW PROCESSLIST
516
You are supposed to call Session_SET_PROC_INFO only if you have coded
517
a time-consuming piece that MySQL can get stuck in for a long time.
519
Set it using the session_proc_info(Session *thread, const char *message)
522
void set_proc_info(const char *info) { proc_info= info; }
523
const char* get_proc_info() const { return proc_info; }
415
526
Used in error messages to tell user in what part of MySQL we found an
416
527
error. E. g. when where= "having clause", if fix_fields() fails, user
417
528
will know that the error was in having clause.
427
void setWhere(const char *arg)
532
double tmp_double_value; /* Used in set_var.cc */
533
ulong client_capabilities; /* What the client supports */
534
ulong max_client_packet_length;
536
HASH handler_tables_hash;
433
538
One thread can hold up to one named user-level lock. This variable
434
539
points to a lock object if the lock is present. See item_func.cc and
435
540
chapter 'Miscellaneous functions', for functions GET_LOCK, RELEASE_LOCK.
437
uint32_t dbug_sentry; /**< watch for memory corruption */
440
boost::thread::id boost_thread_id;
441
boost_thread_shared_ptr _thread;
442
boost::this_thread::disable_interruption *interrupt;
444
internal::st_my_thread_var *mysys_var;
447
boost_thread_shared_ptr &getThread()
452
void pushInterrupt(boost::this_thread::disable_interruption *interrupt_arg)
454
interrupt= interrupt_arg;
457
boost::this_thread::disable_interruption &getThreadInterupt()
463
internal::st_my_thread_var *getThreadVar()
469
* Type of current query: COM_STMT_PREPARE, COM_QUERY, etc. Set from
470
* first byte of the packet in executeStatement()
542
uint32_t dbug_sentry; // watch out for memory corruption
543
struct st_my_thread_var *mysys_var;
545
Type of current query: COM_STMT_PREPARE, COM_QUERY, etc. Set from
546
first byte of the packet in do_command()
472
548
enum enum_server_command command;
473
uint32_t file_id; /**< File ID for LOAD DATA INFILE */
474
/* @note the following three members should likely move to Client */
475
uint32_t max_client_packet_length; /**< Maximum number of bytes a client can send in a single packet */
478
boost::posix_time::ptime _epoch;
479
boost::posix_time::ptime _connect_time;
480
boost::posix_time::ptime _start_timer;
481
boost::posix_time::ptime _end_timer;
483
boost::posix_time::ptime _user_time;
485
uint64_t utime_after_lock; // This used by Innodb.
489
_user_time= boost::posix_time::not_a_date_time;
492
const boost::posix_time::ptime &start_timer() const
497
void getTimeDifference(boost::posix_time::time_duration &result_arg, const boost::posix_time::ptime &arg) const
499
result_arg= arg - _start_timer;
550
uint32_t file_id; // for LOAD DATA INFILE
551
/* remote (peer) port */
553
time_t start_time, user_time;
554
uint64_t connect_utime, thr_create_utime; // track down slow pthread_create
555
uint64_t start_utime, utime_after_lock;
502
557
thr_lock_type update_lock_default;
505
560
Both of the following container points in session will be converted to an API.
509
563
/* container for handler's private per-connection data */
510
std::vector<Ha_data> ha_data;
512
Id of current query. Statement can be reused to execute several queries
513
query_id is global in context of the whole MySQL server.
514
ID is automatically generated from an atomic counter.
515
It's used in Cursor code for various purposes: to check which columns
516
from table are necessary for this select, to check if it's necessary to
517
update auto-updatable fields (like auto_increment and timestamp).
520
query_id_t warn_query_id;
564
Ha_data ha_data[MAX_HA];
566
/* container for replication data */
567
void *replication_data;
568
inline void setReplicationData (void *data) { replication_data= data; }
569
inline void *getReplicationData () { return replication_data; }
571
/* Place to store various things */
572
void *session_marker;
574
void set_server_id(uint32_t sid) { server_id = sid; }
523
void **getEngineData(const plugin::MonitoredInTransaction *monitored);
524
ResourceContext *getResourceContext(const plugin::MonitoredInTransaction *monitored,
527
session::Transactions transaction;
578
struct st_transactions {
579
SAVEPOINT *savepoints;
580
Session_TRANS all; // Trans since BEGIN WORK
581
Session_TRANS stmt; // Trans for current statement
582
bool on; // see ha_enable_transaction()
586
Tables changed in transaction (that must be invalidated in query cache).
587
List contain only transactional tables, that not invalidated in query
588
cache (instead of full list of changed in transaction tables).
590
CHANGED_TableList* changed_tables;
591
MEM_ROOT mem_root; // Transaction-life memory allocation pool
596
free_root(&mem_root,MYF(MY_KEEP_PREALLOC));
600
memset(this, 0, sizeof(*this));
601
xid_state.xid.null();
602
init_sql_alloc(&mem_root, ALLOC_ROOT_MIN_BLOCK_SIZE, 0);
530
606
sigset_t signals;
532
// As of right now we do not allow a concurrent execute to launch itself
534
bool concurrent_execute_allowed;
538
void setConcurrentExecute(bool arg)
540
concurrent_execute_allowed= arg;
543
bool isConcurrentExecuteAllowed() const
545
return concurrent_execute_allowed;
608
This is to track items changed during execution of a prepared
609
statement/stored procedure. It's created by
610
register_item_tree_change() in memory root of Session, and freed in
611
rollback_item_tree_changes(). For conventional execution it's always
614
Item_change_list change_list;
548
616
/* Tells if LAST_INSERT_ID(#) was called for the current statement */
549
617
bool arg_of_last_insert_id_function;
552
619
ALL OVER THIS FILE, "insert_id" means "*automatically generated* value for
553
620
insertion into an auto_increment column".
556
623
This is the first autogenerated insert id which was *successfully*
557
624
inserted by the previous statement (exactly, if the previous statement
558
625
didn't successfully insert an autogenerated insert id, then it's the one
595
663
in the binlog is still needed; the list's minimum will contain 3.
597
665
Discrete_intervals_list auto_inc_intervals_in_cur_stmt_for_binlog;
598
/** Used by replication and SET INSERT_ID */
666
/* Used by replication and SET INSERT_ID */
599
667
Discrete_intervals_list auto_inc_intervals_forced;
601
uint64_t limit_found_rows;
602
uint64_t options; /**< Bitmap of options */
603
int64_t row_count_func; /**< For the ROW_COUNT() function */
605
int64_t rowCount() const
607
return row_count_func;
610
ha_rows cuted_fields; /**< Count of "cut" or truncated fields. @todo Kill this friggin thing. */
613
* Number of rows we actually sent to the client, including "synthetic"
614
* rows in ROLLUP etc.
616
ha_rows sent_row_count;
619
* Number of rows we read, sent or not, including in create_sort_index()
621
ha_rows examined_row_count;
624
* The set of those tables whose fields are referenced in all subqueries
629
* Possibly this it is incorrect to have used tables in Session because
630
* with more than one subquery, it is not clear what does the field mean.
632
table_map used_tables;
637
This, and some other variables like 'count_cuted_fields'
638
maybe should be statement/cursor local, that is, moved to Statement
639
class. With current implementation warnings produced in each prepared
640
statement/cursor settle here.
642
List<DRIZZLE_ERROR> warn_list;
643
uint32_t warn_count[(uint32_t) DRIZZLE_ERROR::WARN_LEVEL_END];
644
uint32_t total_warn_count;
645
Diagnostics_area main_da;
649
/* Statement id is thread-wide. This counter is used to generate ids */
650
uint32_t statement_id_counter;
651
uint32_t rand_saved_seed1;
652
uint32_t rand_saved_seed2;
654
Row counter, mainly for errors and warnings. Not increased in
655
create_sort_index(); may differ from examined_row_count.
659
uint32_t getRowCount() const
664
session_id_t thread_id;
666
enum global_read_lock_t
669
GOT_GLOBAL_READ_LOCK= 1,
670
MADE_GLOBAL_READ_LOCK_BLOCK_COMMIT= 2
673
global_read_lock_t _global_read_lock;
677
global_read_lock_t isGlobalReadLock() const
679
return _global_read_lock;
682
void setGlobalReadLock(global_read_lock_t arg)
684
_global_read_lock= arg;
687
DrizzleLock *lockTables(Table **tables, uint32_t count, uint32_t flags);
688
bool lockGlobalReadLock();
689
bool lock_table_names(TableList *table_list);
690
bool lock_table_names_exclusively(TableList *table_list);
691
bool makeGlobalReadLockBlockCommit();
692
bool abortLockForThread(Table *table);
693
bool wait_if_global_read_lock(bool abort_on_refresh, bool is_not_commit);
694
int lock_table_name(TableList *table_list);
695
void abortLock(Table *table);
696
void removeLock(Table *table);
697
void unlockReadTables(DrizzleLock *sql_lock);
698
void unlockSomeTables(Table **table, uint32_t count);
699
void unlockTables(DrizzleLock *sql_lock);
700
void startWaitingGlobalReadLock();
701
void unlockGlobalReadLock();
704
int unlock_external(Table **table, uint32_t count);
705
int lock_external(Table **tables, uint32_t count);
706
bool wait_for_locked_table_names(TableList *table_list);
707
DrizzleLock *get_lock_data(Table **table_ptr, uint32_t count,
708
bool should_lock, Table **write_lock_used);
711
uint32_t server_status;
712
uint32_t open_options;
713
uint32_t select_number; /**< number of select (used for EXPLAIN) */
714
/* variables.transaction_isolation is reset to this after each commit */
715
enum_tx_isolation session_tx_isolation;
716
enum_check_fields count_cuted_fields;
724
KILLED_NO_VALUE /* means none of the above states apply */
727
killed_state_t volatile _killed;
731
void setKilled(killed_state_t arg)
736
killed_state_t getKilled()
741
volatile killed_state_t *getKilledPtr() // Do not use this method, it is here for historical convience.
746
bool is_admin_connection;
747
bool some_tables_deleted;
751
Set to true if execution of the current compound statement
752
can not continue. In particular, disables activation of
753
CONTINUE or EXIT handlers of stored routines.
754
Reset in the end of processing of the current user request, in
755
@see reset_session_for_next_command().
759
Set by a storage engine to request the entire
760
transaction (that possibly spans multiple engines) to
761
rollback. Reset in ha_rollback.
763
bool transaction_rollback_request;
765
true if we are in a sub-statement and the current error can
766
not be safely recovered until we left the sub-statement mode.
767
In particular, disables activation of CONTINUE and EXIT
768
handlers inside sub-statements. E.g. if it is a deadlock
769
error and requires a transaction-wide rollback, this flag is
770
raised (traditionally, MySQL first has to close all the reads
771
via @see handler::ha_index_or_rnd_end() and only then perform
773
Reset to false when we leave the sub-statement mode.
775
bool is_fatal_sub_stmt_error;
776
/** for IS NULL => = last_insert_id() fix in remove_eq_conds() */
777
bool substitute_null_with_insert_id;
781
bool abort_on_warning;
782
bool tablespace_op; /**< This is true in DISCARD/IMPORT TABLESPACE */
785
bool got_warning; /**< Set on call to push_warning() */
786
bool no_warnings_for_error; /**< no warnings on call to my_error() */
787
/** set during loop of derived table processing */
788
bool derived_tables_processing;
790
bool doing_tablespace_operation(void)
792
return tablespace_op;
795
void setDoingTablespaceOperation(bool doing)
797
tablespace_op= doing;
801
/** Used by the sys_var class to store temporary values */
805
uint32_t uint32_t_value;
806
int32_t int32_t_value;
807
uint64_t uint64_t_value;
811
Character input stream consumed by the lexical analyser,
813
Note that since the parser is not re-entrant, we keep only one input
814
stream here. This member is valid only when executing code during parsing,
815
and may point to invalid memory after that.
817
Lex_input_stream *m_lip;
819
/** Place to store various things */
820
void *session_marker;
822
/** Keeps a copy of the previous table around in case we are just slamming on particular table */
826
Points to info-string that we show in SHOW PROCESSLIST
827
You are supposed to call Session_SET_PROC_INFO only if you have coded
828
a time-consuming piece that MySQL can get stuck in for a long time.
830
Set it using the session_proc_info(Session *thread, const char *message)
833
inline void set_proc_info(const char *info)
837
inline const char* get_proc_info() const
842
/** Sets this Session's current query ID */
843
inline void setQueryId(query_id_t in_query_id)
845
query_id= in_query_id;
848
/** Returns the current query ID */
849
query_id_t getQueryId() const
855
/** Sets this Session's warning query ID */
856
inline void setWarningQueryId(query_id_t in_query_id)
858
warn_query_id= in_query_id;
861
/** Returns the Session's warning query ID */
862
inline query_id_t getWarningQueryId() const
864
return warn_query_id;
867
/** Accessor method returning the session's ID. */
868
inline session_id_t getSessionId() const
873
/** Accessor method returning the server's ID. */
874
inline uint32_t getServerId() const
876
/* We return the global server ID. */
880
/** Returns the current transaction ID for the session's current statement */
881
inline my_xid getTransactionId()
883
return transaction.xid_state.xid.quick_get_my_xid();
886
669
There is BUG#19630 where statement-based replication of stored
887
670
functions/triggers with two auto_increment columns breaks.
888
671
We however ensure that it works when there is 0 or 1 auto_increment
938
721
auto_inc_intervals_forced.append(next_id, UINT64_MAX, 0);
941
Session(plugin::Client *client_arg, catalog::Instance::shared_ptr catalog);
724
uint64_t limit_found_rows;
725
uint64_t options; /* Bitmap of states */
726
int64_t row_count_func; /* For the ROW_COUNT() function */
727
ha_rows cuted_fields;
730
number of rows we actually sent to the client, including "synthetic"
733
ha_rows sent_row_count;
736
number of rows we read, sent or not, including in create_sort_index()
738
ha_rows examined_row_count;
741
The set of those tables whose fields are referenced in all subqueries
743
TODO: possibly this it is incorrect to have used tables in Session because
744
with more than one subquery, it is not clear what does the field mean.
746
table_map used_tables;
747
USER_CONN *user_connect;
748
const CHARSET_INFO *db_charset;
750
FIXME: this, and some other variables like 'count_cuted_fields'
751
maybe should be statement/cursor local, that is, moved to Statement
752
class. With current implementation warnings produced in each prepared
753
statement/cursor settle here.
755
List <DRIZZLE_ERROR> warn_list;
756
uint warn_count[(uint32_t) DRIZZLE_ERROR::WARN_LEVEL_END];
757
uint total_warn_count;
758
Diagnostics_area main_da;
761
Id of current query. Statement can be reused to execute several queries
762
query_id is global in context of the whole MySQL server.
763
ID is automatically generated from mutex-protected counter.
764
It's used in handler code for various purposes: to check which columns
765
from table are necessary for this select, to check if it's necessary to
766
update auto-updatable fields (like auto_increment and timestamp).
768
query_id_t query_id, warn_id;
771
#ifdef ERROR_INJECT_SUPPORT
772
ulong error_inject_value;
774
/* Statement id is thread-wide. This counter is used to generate ids */
775
ulong statement_id_counter;
776
ulong rand_saved_seed1, rand_saved_seed2;
778
Row counter, mainly for errors and warnings. Not increased in
779
create_sort_index(); may differ from examined_row_count.
782
pthread_t real_id; /* For debugging */
783
my_thread_id thread_id;
784
uint tmp_table, global_read_lock;
785
uint server_status,open_options;
786
enum enum_thread_type system_thread;
787
uint32_t select_number; //number of select (used for EXPLAIN)
788
/* variables.transaction_isolation is reset to this after each commit */
789
enum_tx_isolation session_tx_isolation;
790
enum_check_fields count_cuted_fields;
798
KILLED_NO_VALUE /* means neither of the states */
800
killed_state volatile killed;
802
/* scramble - random string sent to client on handshake */
803
char scramble[SCRAMBLE_LENGTH+1];
805
bool some_tables_deleted;
806
bool last_cuted_field;
807
bool no_errors, password;
809
Set to true if execution of the current compound statement
810
can not continue. In particular, disables activation of
811
CONTINUE or EXIT handlers of stored routines.
812
Reset in the end of processing of the current user request, in
813
@see mysql_reset_session_for_next_command().
817
Set by a storage engine to request the entire
818
transaction (that possibly spans multiple engines) to
819
rollback. Reset in ha_rollback.
821
bool transaction_rollback_request;
823
true if we are in a sub-statement and the current error can
824
not be safely recovered until we left the sub-statement mode.
825
In particular, disables activation of CONTINUE and EXIT
826
handlers inside sub-statements. E.g. if it is a deadlock
827
error and requires a transaction-wide rollback, this flag is
828
raised (traditionally, MySQL first has to close all the reads
829
via @see handler::ha_index_or_rnd_end() and only then perform
831
Reset to false when we leave the sub-statement mode.
833
bool is_fatal_sub_stmt_error;
834
/* for IS NULL => = last_insert_id() fix in remove_eq_conds() */
835
bool substitute_null_with_insert_id;
839
/** is set if some thread specific value(s) used in a statement. */
840
bool thread_specific_used;
841
bool charset_is_system_charset, charset_is_collation_connection;
842
bool charset_is_character_set_filesystem;
843
bool abort_on_warning;
844
bool got_warning; /* Set on call to push_warning() */
845
bool no_warnings_for_error; /* no warnings on call to my_error() */
846
/* set during loop of derived table processing */
847
bool derived_tables_processing;
848
bool tablespace_op; /* This is true in DISCARD/IMPORT TABLESPACE */
850
/* Used by the sys_var class to store temporary values */
856
uint64_t uint64_t_value;
860
Character input stream consumed by the lexical analyser,
862
Note that since the parser is not re-entrant, we keep only one input
863
stream here. This member is valid only when executing code during parsing,
864
and may point to invalid memory after that.
866
Lex_input_stream *m_lip;
873
Initialize memory roots necessary for query processing and (!)
874
pre-allocate memory for it. We can't do that in Session constructor because
875
there are use cases (acl_init, watcher threads,
876
killing mysqld) where it's vital to not allocate excessive and not used
877
memory. Note, that we still don't return error from init_for_queries():
878
if preallocation fails, we should notice that at the first call to
881
void init_for_queries();
944
882
void cleanup(void);
946
* Cleans up after query.
950
* This function is used to reset thread data to its default state.
952
* This function is not suitable for setting thread data to some
953
* non-default values, as there is only one replication thread, so
954
* different master threads may overwrite data of each other on
957
883
void cleanup_after_query();
959
void awake(Session::killed_state_t state_to_set);
961
* Pulls thread-specific variables into Session state.
963
* Returns true most times, or false if there was a problem
964
* allocating resources for thread-specific storage.
966
* @TODO Kill this. It's not necessary once my_thr_init() is bye bye.
972
Initialize memory roots necessary for query processing and (!)
973
pre-allocate memory for it. We can't do that in Session constructor because
974
there are use cases where it's vital to not allocate excessive and not used
977
void prepareForQueries();
980
* Executes a single statement received from the
983
* Returns true if the statement was successful, or false
988
* For profiling to work, it must never be called recursively.
990
* In MySQL, this used to be the do_command() C function whic
991
* accepted a single parameter of the THD pointer.
993
bool executeStatement();
996
* Reads a query from packet and stores it.
998
* Returns true if query is read and allocated successfully,
999
* false otherwise. On a return of false, Session::fatal_error
1002
* @note Used in COM_QUERY and COM_STMT_PREPARE.
1004
* Sets the following Session variables:
1008
* @param The packet pointer to read from
1009
* @param The length of the query to read
1011
bool readAndStoreQuery(const char *in_packet, uint32_t in_packet_length);
1014
* Ends the current transaction and (maybe) begins the next.
1016
* Returns true if the transaction completed successfully,
1019
* @param Completion type
1021
bool endTransaction(enum enum_mysql_completiontype completion);
1022
bool endActiveTransaction();
1023
bool startTransaction(start_transaction_option_t opt= START_TRANS_NO_OPTIONS);
1024
void markTransactionForRollback(bool all);
1027
* Authenticates users, with error reporting.
1029
* Returns true on success, or false on failure.
1031
bool authenticate();
1036
* This will initialize the session and begin the command loop.
1041
* Schedule a session to be run on the default scheduler.
1043
static bool schedule(Session::shared_ptr&);
1045
static void unlink(session_id_t &session_id);
1046
static void unlink(Session::shared_ptr&);
884
bool store_globals();
885
void awake(Session::killed_state state_to_set);
1049
888
For enter_cond() / exit_cond() to work the mutex must be got before
1050
889
enter_cond(); this mutex is then released by exit_cond().
1051
890
Usage must be: lock mutex; enter_cond(); your code; exit_cond().
1053
const char* enter_cond(boost::condition_variable_any &cond, boost::mutex &mutex, const char* msg);
1054
void exit_cond(const char* old_msg);
1056
type::Time::epoch_t query_start()
1058
return getCurrentTimestampEpoch();
1063
_end_timer= _start_timer= boost::posix_time::microsec_clock::universal_time();
1064
utime_after_lock= (_start_timer - _epoch).total_microseconds();
1067
void set_time(time_t t) // This is done by a sys_var, as long as user_time is set, we will use that for all references to time
1069
_user_time= boost::posix_time::from_time_t(t);
1072
void set_time_after_lock()
1074
boost::posix_time::ptime mytime(boost::posix_time::microsec_clock::universal_time());
1075
utime_after_lock= (mytime - _epoch).total_microseconds();
1078
void set_end_timer()
1080
_end_timer= boost::posix_time::microsec_clock::universal_time();
1081
status_var.execution_time_nsec+=(_end_timer - _start_timer).total_microseconds();
1084
uint64_t getElapsedTime() const
1086
return (_end_timer - _start_timer).total_microseconds();
1090
* Returns the current micro-timestamp
1092
type::Time::epoch_t getCurrentTimestamp(bool actual= true) const
1094
type::Time::epoch_t t_mark;
892
inline const char* enter_cond(pthread_cond_t *cond, pthread_mutex_t* mutex, const char* msg)
894
const char* old_msg = get_proc_info();
895
safe_mutex_assert_owner(mutex);
896
mysys_var->current_mutex = mutex;
897
mysys_var->current_cond = cond;
898
this->set_proc_info(msg);
901
inline void exit_cond(const char* old_msg)
904
Putting the mutex unlock in exit_cond() ensures that
905
mysys_var->current_mutex is always unlocked _before_ mysys_var->mutex is
906
locked (if that would not be the case, you'll get a deadlock if someone
907
does a Session::awake() on you).
909
pthread_mutex_unlock(mysys_var->current_mutex);
910
pthread_mutex_lock(&mysys_var->mutex);
911
mysys_var->current_mutex = 0;
912
mysys_var->current_cond = 0;
913
this->set_proc_info(old_msg);
914
pthread_mutex_unlock(&mysys_var->mutex);
916
inline time_t query_start() { return start_time; }
917
inline void set_time()
1098
boost::posix_time::ptime mytime(boost::posix_time::microsec_clock::universal_time());
1099
t_mark= (mytime - _epoch).total_microseconds();
921
start_time= user_time;
922
start_utime= utime_after_lock= my_micro_time();
1103
t_mark= (_end_timer - _epoch).total_microseconds();
1109
// We may need to set user on this
1110
type::Time::epoch_t getCurrentTimestampEpoch() const
1112
if (not _user_time.is_not_a_date_time())
1113
return (_user_time - _epoch).total_seconds();
1115
return (_start_timer - _epoch).total_seconds();
1118
type::Time::epoch_t getCurrentTimestampEpoch(type::Time::usec_t &fraction_arg) const
1120
if (not _user_time.is_not_a_date_time())
1123
return (_user_time - _epoch).total_seconds();
1126
fraction_arg= _start_timer.time_of_day().fractional_seconds() % 1000000;
1127
return (_start_timer - _epoch).total_seconds();
1130
uint64_t found_rows(void) const
925
start_utime= utime_after_lock= my_micro_time_and_time(&start_time);
927
inline void set_current_time() { start_time= time(NULL); }
928
inline void set_time(time_t t)
930
start_time= user_time= t;
931
start_utime= utime_after_lock= my_micro_time();
933
void set_time_after_lock() { utime_after_lock= my_micro_time(); }
934
uint64_t current_utime() { return my_micro_time(); }
935
inline uint64_t found_rows(void)
1132
937
return limit_found_rows;
1135
/** Returns whether the session is currently inside a transaction */
1136
bool inTransaction() const
939
inline bool active_transaction()
1138
941
return server_status & SERVER_STATUS_IN_TRANS;
943
inline bool fill_derived_tables()
945
return !lex->only_view_structure();
947
inline void* trans_alloc(unsigned int size)
949
return alloc_root(&transaction.mem_root,size);
1141
952
LEX_STRING *make_lex_string(LEX_STRING *lex_str,
1142
953
const char* str, uint32_t length,
1143
954
bool allocate_lex_string);
1145
LEX_STRING *make_lex_string(LEX_STRING *lex_str,
1146
const std::string &str,
1147
bool allocate_lex_string);
956
bool convert_string(LEX_STRING *to, const CHARSET_INFO * const to_cs,
957
const char *from, uint32_t from_length,
958
const CHARSET_INFO * const from_cs);
960
bool convert_string(String *s, const CHARSET_INFO * const from_cs, const CHARSET_INFO * const to_cs);
962
void add_changed_table(Table *table);
963
void add_changed_table(const char *key, long key_length);
964
CHANGED_TableList * changed_table_dup(const char *key, long key_length);
1149
965
int send_explain_fields(select_result *result);
1152
967
Clear the current error, if any.
1153
968
We do not clear is_fatal_error or is_fatal_sub_stmt_error since we
1279
1103
void pop_internal_handler();
1282
Resets Session part responsible for command processing state.
1284
This needs to be called before execution of every statement
1285
(prepared or conventional).
1286
It is not called by substatements of routines.
1289
Make it a method of Session and align its name with the rest of
1290
reset/end/start/init methods.
1292
Call it after we use Session for queries, not before.
1106
Reset object after executing commands.
1294
1108
void reset_for_next_command();
1297
* Disconnects the session from a client connection and
1298
* updates any status variables necessary.
1300
* @param errcode Error code to print to console
1302
* @note For the connection that is doing shutdown, this is called twice
1304
void disconnect(enum error_t errcode= EE_OK);
1307
* Check if user exists and the password supplied is correct.
1309
* Returns true on success, and false on failure.
1311
* @note Host, user and passwd may point to communication buffer.
1312
* Current implementation does not depend on that, but future changes
1313
* should be done with this in mind;
1315
* @param passwd Scrambled password received from client
1316
* @param db Database name to connect to, may be NULL
1318
bool checkUser(const std::string &passwd, const std::string &db);
1321
* Returns the timestamp (in microseconds) of when the Session
1322
* connected to the server.
1324
uint64_t getConnectMicroseconds() const
1326
return (_connect_time - _epoch).total_microseconds();
1329
uint64_t getConnectSeconds() const
1331
return (_connect_time - _epoch).total_seconds();
1335
* Returns a pointer to the active Transaction message for this
1336
* Session being managed by the ReplicationServices component, or
1337
* NULL if no active message.
1339
message::Transaction *getTransactionMessage() const
1341
return transaction_message;
1345
* Returns a pointer to the active Statement message for this
1346
* Session, or NULL if no active message.
1348
message::Statement *getStatementMessage() const
1350
return statement_message;
1354
* Returns a pointer to the current Resulset message for this
1355
* Session, or NULL if no active message.
1357
message::Resultset *getResultsetMessage() const
1362
* Sets the active transaction message used by the ReplicationServices
1365
* @param[in] Pointer to the message
1367
void setTransactionMessage(message::Transaction *in_message)
1369
transaction_message= in_message;
1373
* Sets the active statement message used by the ReplicationServices
1376
* @param[in] Pointer to the message
1378
void setStatementMessage(message::Statement *in_message)
1380
statement_message= in_message;
1384
* Sets the active Resultset message used by the Query Cache
1387
* @param[in] Pointer to the message
1389
void setResultsetMessage(message::Resultset *in_message)
1391
resultset= in_message;
1394
* reset the active Resultset message used by the Query Cache
1398
void resetResultsetMessage()
1111
Close the current connection.
1113
void close_connection(uint32_t errcode, bool lock);
1114
void close_temporary_tables();
1404
/** Pointers to memory managed by the ReplicationServices component */
1405
message::Transaction *transaction_message;
1406
message::Statement *statement_message;
1407
/* Pointer to the current resultset of Select query */
1408
message::Resultset *resultset;
1409
plugin::EventObserverList *session_event_observers;
1411
/* Schema observers are mapped to databases. */
1412
std::map<std::string, plugin::EventObserverList *> schema_event_observers;
1416
plugin::EventObserverList *getSessionObservers()
1418
return session_event_observers;
1421
void setSessionObservers(plugin::EventObserverList *observers)
1423
session_event_observers= observers;
1426
/* For schema event observers there is one set of observers per database. */
1427
plugin::EventObserverList *getSchemaObservers(const std::string &db_name)
1429
std::map<std::string, plugin::EventObserverList *>::iterator it;
1431
it= schema_event_observers.find(db_name);
1432
if (it == schema_event_observers.end())
1438
void setSchemaObservers(const std::string &db_name, plugin::EventObserverList *observers)
1440
std::map<std::string, plugin::EventObserverList *>::iterator it;
1442
it= schema_event_observers.find(db_name);
1443
if (it != schema_event_observers.end())
1444
schema_event_observers.erase(it);;
1447
schema_event_observers[db_name] = observers;
1452
1117
const char *proc_info;
1454
1119
/** The current internal error handler for this thread, or NULL. */
1529
1172
return lex->current_select->add_group_to_list(this, item, asc);
1531
1174
void refresh_status();
1532
user_var_entry *getVariable(LEX_STRING &name, bool create_if_not_exists);
1533
user_var_entry *getVariable(const std::string &name, bool create_if_not_exists);
1534
void setVariable(const std::string &name, const std::string &value);
1537
* Closes all tables used by the current substatement, or all tables
1538
* used by this thread if we are on the upper level.
1540
void close_thread_tables();
1541
void close_old_data_files(bool morph_locks= false,
1542
bool send_refresh= false);
1543
void close_open_tables();
1544
void close_data_files_and_morph_locks(const identifier::Table &identifier);
1547
bool free_cached_table(boost::mutex::scoped_lock &scopedLock);
1552
* Prepares statement for reopening of tables and recalculation of set of
1555
* @param Pointer to a pointer to a list of tables which we were trying to open and lock
1557
void close_tables_for_reopen(TableList **tables);
1561
* Open all tables in list, locks them (all, including derived)
1563
* @param Pointer to a list of tables for open & locking
1572
* The lock will automaticaly be freed by close_thread_tables()
1574
bool openTablesLock(TableList *tables);
1576
int open_tables_from_list(TableList **start, uint32_t *counter, uint32_t flags= 0);
1578
Table *openTableLock(TableList *table_list, thr_lock_type lock_type);
1579
Table *openTable(TableList *table_list, bool *refresh, uint32_t flags= 0);
1581
void unlink_open_table(Table *find);
1582
void drop_open_table(Table *table, const identifier::Table &identifier);
1583
void close_cached_table(Table *table);
1585
/* Create a lock in the cache */
1586
table::Placeholder *table_cache_insert_placeholder(const identifier::Table &identifier);
1587
bool lock_table_name_if_not_cached(const identifier::Table &identifier, Table **table);
1590
session::TableMessages _table_message_cache;
1593
session::TableMessages &getMessageCache()
1595
return _table_message_cache;
1598
/* Reopen operations */
1599
bool reopen_tables();
1600
bool close_cached_tables(TableList *tables, bool wait_for_refresh, bool wait_for_placeholders);
1602
void wait_for_condition(boost::mutex &mutex, boost::condition_variable_any &cond);
1603
int setup_conds(TableList *leaves, COND **conds);
1604
int lock_tables(TableList *tables, uint32_t count, bool *need_reopen);
1606
drizzled::util::Storable *getProperty(const std::string &arg)
1608
return life_properties.getProperty(arg);
1612
bool setProperty(const std::string &arg, T *value)
1614
life_properties.setProperty(arg, value);
1620
Return the default storage engine
1622
@param getDefaultStorageEngine()
1625
pointer to plugin::StorageEngine
1627
plugin::StorageEngine *getDefaultStorageEngine()
1629
if (variables.storage_engine)
1630
return variables.storage_engine;
1631
return global_system_variables.storage_engine;
1634
void get_xid(DRIZZLE_XID *xid); // Innodb only
1636
table::Singular *getInstanceTable();
1637
table::Singular *getInstanceTable(List<CreateField> &field_list);
1642
if (getrusage(RUSAGE_THREAD, &usage))
1652
void setUsage(bool arg)
1657
const struct rusage &getUsage()
1662
catalog::Instance::const_reference catalog() const
1664
return *(_catalog.get());
1667
catalog::Instance::reference catalog()
1669
return *(_catalog.get());
1673
catalog::Instance::shared_ptr _catalog;
1675
// This lives throughout the life of Session
1677
session::PropertyMap life_properties;
1678
std::vector<table::Singular *> temporary_shares;
1679
struct rusage usage;
1178
This is used to get result from a select
1684
1184
#define ESCAPE_CHARS "ntrb0ZN" // keep synchronous with READ_INFO::unescape
1686
} /* namespace drizzled */
1688
/** @TODO why is this in the middle of the file */
1689
1186
#include <drizzled/select_to_file.h>
1690
1188
#include <drizzled/select_export.h>
1691
1190
#include <drizzled/select_dump.h>
1692
1192
#include <drizzled/select_insert.h>
1693
1194
#include <drizzled/select_create.h>
1198
#include <storage/myisam/myisam.h>
1694
1200
#include <drizzled/tmp_table_param.h>
1695
1202
#include <drizzled/select_union.h>
1696
1204
#include <drizzled/select_subselect.h>
1697
1206
#include <drizzled/select_singlerow_subselect.h>
1698
1207
#include <drizzled/select_max_min_finder_subselect.h>
1699
1208
#include <drizzled/select_exists_subselect.h>
1705
* A structure used to describe sort information
1706
* for a field or item used in ORDER BY.
1711
Field *field; /**< Field to sort */
1712
Item *item; /**< Item if not sorting fields */
1713
size_t length; /**< Length of sort field */
1714
uint32_t suffix_length; /**< Length suffix (0-4) */
1715
Item_result result_type; /**< Type of item */
1716
bool reverse; /**< if descending sort */
1717
bool need_strxnfrm; /**< If we have to use strxnfrm() */
1724
result_type(STRING_RESULT),
1731
} /* namespace drizzled */
1733
/** @TODO why is this in the middle of the file */
1210
/* Structs used when sorting */
1212
typedef struct st_sort_field {
1213
Field *field; /* Field to sort */
1214
Item *item; /* Item if not sorting fields */
1215
size_t length; /* Length of sort field */
1216
uint32_t suffix_length; /* Length suffix (0-4) */
1217
Item_result result_type; /* Type of item */
1218
bool reverse; /* if descending sort */
1219
bool need_strxnfrm; /* If we have to use strxnfrm() */
1223
typedef struct st_sort_buffer {
1224
uint32_t index; /* 0 or 1 */
1225
uint32_t sort_orders;
1226
uint32_t change_pos; /* If sort-fields changed */
1228
SORT_FIELD *sortorder;
1735
1232
#include <drizzled/table_ident.h>
1736
1233
#include <drizzled/user_var_entry.h>
1737
1234
#include <drizzled/unique.h>
1738
#include <drizzled/var.h>
1235
#include <drizzled/multi_delete.h>
1236
#include <drizzled/multi_update.h>
1237
#include <drizzled/my_var.h>
1739
1238
#include <drizzled/select_dumpvar.h>
1744
1240
/* Bits in sql_command_flags */
1746
enum sql_command_flag_bits
1242
enum sql_command_flag_bits {
1748
1243
CF_BIT_CHANGES_DATA,
1749
1244
CF_BIT_HAS_ROW_COUNT,
1750
1245
CF_BIT_STATUS_COMMAND,