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"
24
/* Classes in mysql */
26
#include <drizzled/protocol.h>
27
#include <drizzled/sql_locale.h>
28
#include <drizzled/ha_trx_info.h>
29
#include <mysys/my_alloc.h>
30
#include <mysys/my_tree.h>
31
#include <drizzled/handler.h>
32
#include <drizzled/current_session.h>
33
#include <drizzled/sql_error.h>
34
#include <drizzled/file_exchange.h>
35
#include <drizzled/select_result_interceptor.h>
36
#include <drizzled/authentication.h>
37
#include <drizzled/db.h>
38
#include <drizzled/xid.h>
47
#include <sys/resource.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
44
#define MIN_HANDSHAKE_SIZE 6
86
class EventObserverList;
96
namespace internal { struct st_my_thread_var; }
98
namespace table { class Placeholder; }
100
46
class Lex_input_stream;
101
47
class user_var_entry;
103
49
class Table_ident;
105
class TableShareInstance;
107
51
extern char internal_table_name[2];
108
52
extern char empty_c_string[1];
109
53
extern const char **errmesg;
112
56
#define TC_HEURISTIC_RECOVER_ROLLBACK 2
113
57
extern uint32_t tc_heuristic_recover;
60
The COPY_INFO structure is used by INSERT/REPLACE code.
61
The schema of the row counting by the INSERT/INSERT ... ON DUPLICATE KEY
63
If a row is inserted then the copied variable is incremented.
64
If a row is updated by the INSERT ... ON DUPLICATE KEY UPDATE and the
65
new data differs from the old one then the copied and the updated
66
variables are incremented.
67
The touched variable is incremented if a row was touched by the update part
68
of the INSERT ... ON DUPLICATE KEY UPDATE no matter whether the row
69
was actually changed or not.
71
typedef struct st_copy_info
73
ha_rows records; /**< Number of processed records */
74
ha_rows deleted; /**< Number of deleted records */
75
ha_rows updated; /**< Number of updated records */
76
ha_rows copied; /**< Number of copied records */
78
ha_rows touched; /* Number of touched records */
79
enum enum_duplicates handle_duplicates;
80
int escape_char, last_errno;
82
/* for INSERT ... UPDATE */
83
List<Item> *update_fields;
84
List<Item> *update_values;
85
/* for VIEW ... WITH CHECK OPTION */
88
typedef struct drizzled_lock_st
93
THR_LOCK_DATA **locks;
96
#include <drizzled/lex_column.h>
115
98
class select_result;
118
101
#define Session_SENTRY_MAGIC 0xfeedd1ff
119
102
#define Session_SENTRY_GONE 0xdeadbeef
121
extern DRIZZLED_API struct drizzle_system_variables global_system_variables;
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
104
#define Session_CHECK_SENTRY(session) assert(session->dbug_sentry == Session_SENTRY_MAGIC)
106
struct system_variables
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)
108
system_variables() {};
110
How dynamically allocated system variables are handled:
112
The global_system_variables and max_system_variables are "authoritative"
113
They both should have the same 'version' and 'size'.
114
When attempting to access a dynamic variable, if the session version
115
is out of date, then the session version is updated and realloced if
116
neccessary and bytes copied from global to make up for missing data.
118
ulong dynamic_variables_version;
119
char * dynamic_variables_ptr;
120
uint32_t dynamic_variables_head; /* largest valid variable offset */
121
uint32_t dynamic_variables_size; /* how many bytes are in use */
123
uint64_t myisam_max_extra_sort_file_size;
124
uint64_t max_heap_table_size;
125
uint64_t tmp_table_size;
126
ha_rows select_limit;
127
ha_rows max_join_size;
128
uint64_t auto_increment_increment;
129
uint64_t auto_increment_offset;
130
uint64_t bulk_insert_buff_size;
131
uint64_t join_buff_size;
132
uint32_t max_allowed_packet;
133
uint32_t myisam_stats_method;
134
uint64_t max_error_count;
135
uint64_t max_length_for_sort_data;
136
size_t max_sort_length;
137
uint64_t max_tmp_tables;
138
uint64_t min_examined_row_limit;
139
uint32_t net_buffer_length;
140
uint32_t net_read_timeout;
141
uint32_t net_retry_count;
142
uint32_t net_wait_timeout;
143
uint32_t net_write_timeout;
144
bool optimizer_prune_level;
146
bool engine_condition_pushdown;
147
bool keep_files_on_create;
149
uint32_t optimizer_search_depth;
151
Controls use of Engine-MRR:
152
0 - auto, based on cost
153
1 - force MRR when the storage engine is capable of doing it
156
uint32_t optimizer_use_mrr;
157
/* A bitmap for switching optimizations on/off */
158
uint32_t optimizer_switch;
159
uint32_t div_precincrement;
160
uint64_t preload_buff_size;
161
uint32_t read_buff_size;
162
uint32_t read_rnd_buff_size;
163
size_t sortbuff_size;
164
uint32_t thread_handling;
165
uint32_t tx_isolation;
166
uint32_t completion_type;
167
/* Determines which non-standard SQL behaviour should be enabled */
169
uint64_t max_seeks_for_key;
170
size_t range_alloc_block_size;
171
uint32_t query_alloc_block_size;
172
uint32_t query_prealloc_size;
173
uint32_t trans_alloc_block_size;
174
uint32_t trans_prealloc_size;
175
uint64_t group_concat_max_len;
176
/* TODO: change this to my_thread_id - but have to fix set_var first */
177
uint64_t pseudo_thread_id;
179
StorageEngine *storage_engine;
181
/* Only charset part of these variables is sensible */
182
const CHARSET_INFO *character_set_filesystem;
184
/* Both charset and collation parts of these variables are important */
185
const CHARSET_INFO *collation_server;
187
inline const CHARSET_INFO *getCollation(void)
155
assert(instance_arg);
156
return boost::make_shared<Session>(client, instance_arg);
189
return collation_server;
193
MY_LOCALE *lc_time_names;
195
Time_zone *time_zone;
198
extern struct system_variables global_system_variables;
203
* Per-session local status counters
205
typedef struct system_status_var
207
uint64_t bytes_received;
210
ulong com_stat[(uint32_t) SQLCOM_END];
211
ulong created_tmp_disk_tables;
212
ulong created_tmp_tables;
213
ulong ha_commit_count;
214
ulong ha_delete_count;
215
ulong ha_read_first_count;
216
ulong ha_read_last_count;
217
ulong ha_read_key_count;
218
ulong ha_read_next_count;
219
ulong ha_read_prev_count;
220
ulong ha_read_rnd_count;
221
ulong ha_read_rnd_next_count;
222
ulong ha_rollback_count;
223
ulong ha_update_count;
224
ulong ha_write_count;
225
ulong ha_prepare_count;
226
ulong ha_savepoint_count;
227
ulong ha_savepoint_rollback_count;
229
/* KEY_CACHE parts. These are copies of the original */
230
ulong key_blocks_changed;
231
ulong key_blocks_used;
232
ulong key_cache_r_requests;
233
ulong key_cache_read;
234
ulong key_cache_w_requests;
235
ulong key_cache_write;
236
/* END OF KEY_CACHE parts */
238
ulong net_big_packet_count;
241
ulong select_full_join_count;
242
ulong select_full_range_join_count;
243
ulong select_range_count;
244
ulong select_range_check_count;
245
ulong select_scan_count;
246
ulong long_query_count;
247
ulong filesort_merge_passes;
248
ulong filesort_range_count;
250
ulong filesort_scan_count;
252
Number of statements sent from the client
258
SEE last_system_status_var DEFINITION BELOW.
260
Below 'last_system_status_var' are all variables which doesn't make any
261
sense to add to the /global/ status variable counter.
263
double last_query_cost;
267
This is used for 'SHOW STATUS'. It must be updated to the last ulong
268
variable in system_status_var which is makes sens to add to the global
272
#define last_system_status_var questions
274
void mark_transaction_to_rollback(Session *session, bool all);
277
* Single command executed against this connection.
281
* One connection can contain a lot of simultaneously running statements,
282
* some of which could be prepared, that is, contain placeholders.
284
* To perform some action with statement we reset Session part to the state of
285
* that statement, do the action, and then save back modified state from Session
286
* to the statement. It will be changed in near future, and Statement will
287
* be used explicitly.
291
* The above comment is bullshit in Drizzle. See TODO markers on Session to
292
* completely detach the inheritance of Session from Statement.
296
Statement(const Statement &rhs); /* not implemented: */
297
Statement &operator=(const Statement &rhs); /* non-copyable */
300
* List of items created in the parser for this query. Every item puts
301
* itself to the list on creation (see Item::Item() for details))
304
MEM_ROOT *mem_root; /**< Pointer to current memroot */
306
* Uniquely identifies each statement object in thread scope; change during
307
* statement lifetime.
309
* @todo should be const
160
314
MARK_COLUMNS_NONE: Means mark_used_colums is not set and no indicator to
161
315
handler of fields used is set
170
324
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
326
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()
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).
328
Points to the query associated with this statement. It's const, but
329
we need to declare it char * because all table handlers are written
330
in C and need to point to it.
332
Note that (A) if we set query = NULL, we must at the same time set
333
query_length = 0, and protect the whole operation with the
334
LOCK_thread_count mutex. And (B) we are ONLY allowed to set query to a
335
non-NULL value if its previous value is NULL. We do not need to protect
336
operation (B) with any mutex. To avoid crashes in races, if we do not
337
know that session->query cannot change at the moment, one should print
338
session->query like this:
339
(1) reserve the LOCK_thread_count mutex;
340
(2) check if session->query is NULL;
341
(3) if not NULL, then print at most session->query_length characters from
342
it. We will see the query_length field as either 0, or the right value
344
Assuming that the write and read of an n-bit memory field in an n-bit
345
computer is atomic, we can avoid races in the above way.
346
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()
350
uint32_t query_length; /**< current query length */
289
353
Name of the current (default) database.
297
361
the Session of that thread); that thread is (and must remain, for now) the
298
362
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;
365
uint32_t db_length; /**< Length of current schema name */
369
/* This constructor is called for backup statements */
372
Statement(LEX *lex_arg, MEM_ROOT *mem_root_arg, uint32_t id_arg)
375
mem_root(mem_root_arg),
377
mark_used_columns(MARK_COLUMNS_READ),
384
virtual ~Statement() {}
385
inline void* alloc(size_t size)
387
return alloc_root(mem_root,size);
389
inline void* calloc(size_t size)
392
if ((ptr= alloc_root(mem_root,size)))
393
memset(ptr, 0, size);
396
inline char *strdup(const char *str)
398
return strdup_root(mem_root,str);
400
inline char *strmake(const char *str, size_t size)
402
return strmake_root(mem_root,str,size);
404
inline void *memdup(const void *str, size_t size)
406
return memdup_root(mem_root,str,size);
408
inline void *memdup_w_gap(const void *str, size_t size, uint32_t gap)
411
if ((ptr= alloc_root(mem_root,size+gap)))
412
memcpy(ptr,str,size);
415
/** Frees all items attached to this Statement */
421
struct st_savepoint *prev;
424
Ha_trx_info *ha_list;
427
extern pthread_mutex_t LOCK_xid_cache;
428
extern HASH xid_cache;
430
#include <drizzled/security_context.h>
431
#include <drizzled/open_tables_state.h>
433
#include <drizzled/internal_error_handler.h>
434
#include <drizzled/diagnostics_area.h>
437
Storage engine specific thread local data.
442
Storage engine specific thread local data.
443
Lifetime: one user connection.
447
0: Life time: one statement within a transaction. If @@autocommit is
448
on, also represents the entire transaction.
449
@sa trans_register_ha()
451
1: Life time: one transaction within a connection.
452
If the storage engine does not participate in a transaction,
453
this should not be used.
454
@sa trans_register_ha()
456
Ha_trx_info ha_info[2];
458
Ha_data() :ha_ptr(NULL) {}
462
* Represents a client connection to the database server.
464
* Contains the client/server protocol object, the current statement
465
* being executed, local-to-session variables and status counters, and
466
* a host of other information.
470
* Session should NOT inherit from Statement, but rather it should have a
471
* vector of Statement object pointers which comprise the statements executed
472
* on the Session. Until this architectural change is done, we can forget
473
* about parallel operations inside a session.
477
* Make member variables private and have inlined accessors and setters. Hide
478
* all member variables that are not critical to non-internal operations of the
481
class Session :public Statement, public Open_tables_state
316
485
Constant for Session::where initialization in the beginning of every query.
321
490
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;
492
MEM_ROOT warn_root; /**< Allocation area for warnings and errors */
493
Protocol *protocol; /**< Pointer to the current protocol */
494
HASH user_vars; /**< Hash of user variables defined during the session's lifetime */
495
String packet; /**< dynamic buffer for network I/O */
496
String convert_buffer; /**< A buffer for charset conversions */
497
struct system_variables variables; /**< Mutable local variables local to the session */
363
498
struct system_status_var status_var; /**< Session-local status counters */
499
struct system_status_var *initial_status_var; /* used by show status */
364
500
THR_LOCK_INFO lock_info; /**< Locking information for this session */
365
501
THR_LOCK_OWNER main_lock_id; /**< To use for conventional queries */
366
502
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
503
pthread_mutex_t LOCK_delete; /**< Locked before session is deleted */
506
* A peek into the query string for the session. This is a best effort
507
* delivery, there is no guarantee whether the content is meaningful.
509
char process_list_info[PROCESS_LIST_WIDTH+1];
512
* A pointer to the stack frame of handle_one_connection(),
370
513
* which is called first in the thread for handling a client
372
515
char *thread_stack;
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;
519
Some members of Session (currently 'Statement::db',
520
'query') are set and alloced by the slave SQL thread
521
(for the Session of that thread); that thread is (and must remain, for now)
522
the only responsible for freeing these 3 members. If you add members
523
here, and you add code to set them in replication, don't forget to
524
free_them_and_set_them_to_0 in replication properly. For details see
525
the 'err:' label of the handle_slave_sql() in sql/slave.cc.
527
@see handle_slave_sql
529
Security_context security_ctx;
415
532
Used in error messages to tell user in what part of MySQL we found an
416
533
error. E. g. when where= "having clause", if fix_fields() fails, user
417
534
will know that the error was in having clause.
427
void setWhere(const char *arg)
433
539
One thread can hold up to one named user-level lock. This variable
435
541
chapter 'Miscellaneous functions', for functions GET_LOCK, RELEASE_LOCK.
437
543
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()
544
struct st_my_thread_var *mysys_var;
469
546
* Type of current query: COM_STMT_PREPARE, COM_QUERY, etc. Set from
470
547
* first byte of the packet in executeStatement()
472
549
enum enum_server_command command;
473
550
uint32_t file_id; /**< File ID for LOAD DATA INFILE */
474
/* @note the following three members should likely move to Client */
551
/* @note the following three members should likely move to Protocol */
552
uint32_t client_capabilities; /**< What the client supports */
553
uint16_t peer_port; /**< The remote (peer) port */
475
554
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;
557
uint64_t connect_utime;
558
uint64_t thr_create_utime; /**< track down slow pthread_create */
559
uint64_t start_utime;
560
uint64_t utime_after_lock;
502
562
thr_lock_type update_lock_default;
505
565
Both of the following container points in session will be converted to an API.
509
568
/* 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;
523
void **getEngineData(const plugin::MonitoredInTransaction *monitored);
524
ResourceContext *getResourceContext(const plugin::MonitoredInTransaction *monitored,
527
session::Transactions transaction;
569
Ha_data ha_data[MAX_HA];
571
/* container for replication data */
572
void *replication_data;
574
struct st_transactions {
575
SAVEPOINT *savepoints;
576
Session_TRANS all; // Trans since BEGIN WORK
577
Session_TRANS stmt; // Trans for current statement
578
bool on; // see ha_enable_transaction()
582
Tables changed in transaction (that must be invalidated in query cache).
583
List contain only transactional tables, that not invalidated in query
584
cache (instead of full list of changed in transaction tables).
586
CHANGED_TableList* changed_tables;
587
MEM_ROOT mem_root; // Transaction-life memory allocation pool
592
free_root(&mem_root,MYF(MY_KEEP_PREALLOC));
596
memset(this, 0, sizeof(*this));
597
xid_state.xid.null();
598
init_sql_alloc(&mem_root, ALLOC_ROOT_MIN_BLOCK_SIZE, 0);
529
601
Field *dup_field;
530
602
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;
548
604
/* Tells if LAST_INSERT_ID(#) was called for the current statement */
549
605
bool arg_of_last_insert_id_function;
552
607
ALL OVER THIS FILE, "insert_id" means "*automatically generated* value for
553
608
insertion into an auto_increment column".
655
717
create_sort_index(); may differ from examined_row_count.
657
719
uint32_t row_count;
659
uint32_t getRowCount() const
664
session_id_t thread_id;
720
pthread_t real_id; /**< For debugging */
721
my_thread_id thread_id;
665
722
uint32_t tmp_table;
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);
723
uint32_t global_read_lock;
711
724
uint32_t server_status;
712
725
uint32_t open_options;
713
726
uint32_t select_number; /**< number of select (used for EXPLAIN) */
1031
1015
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&);
1049
1018
For enter_cond() / exit_cond() to work the mutex must be got before
1050
1019
enter_cond(); this mutex is then released by exit_cond().
1051
1020
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();
1022
inline const char* enter_cond(pthread_cond_t *cond, pthread_mutex_t* mutex, const char* msg)
1024
const char* old_msg = get_proc_info();
1025
safe_mutex_assert_owner(mutex);
1026
mysys_var->current_mutex = mutex;
1027
mysys_var->current_cond = cond;
1028
this->set_proc_info(msg);
1031
inline void exit_cond(const char* old_msg)
1034
Putting the mutex unlock in exit_cond() ensures that
1035
mysys_var->current_mutex is always unlocked _before_ mysys_var->mutex is
1036
locked (if that would not be the case, you'll get a deadlock if someone
1037
does a Session::awake() on you).
1039
pthread_mutex_unlock(mysys_var->current_mutex);
1040
pthread_mutex_lock(&mysys_var->mutex);
1041
mysys_var->current_mutex = 0;
1042
mysys_var->current_cond = 0;
1043
this->set_proc_info(old_msg);
1044
pthread_mutex_unlock(&mysys_var->mutex);
1046
inline time_t query_start() { return start_time; }
1047
inline void set_time()
1051
start_time= user_time;
1052
start_utime= utime_after_lock= my_micro_time();
1055
start_utime= utime_after_lock= my_micro_time_and_time(&start_time);
1057
inline void set_current_time() { start_time= time(NULL); }
1058
inline void set_time(time_t t)
1060
start_time= user_time= t;
1061
start_utime= utime_after_lock= my_micro_time();
1063
void set_time_after_lock() { utime_after_lock= my_micro_time(); }
1090
1065
* Returns the current micro-timestamp
1092
type::Time::epoch_t getCurrentTimestamp(bool actual= true) const
1094
type::Time::epoch_t t_mark;
1098
boost::posix_time::ptime mytime(boost::posix_time::microsec_clock::universal_time());
1099
t_mark= (mytime - _epoch).total_microseconds();
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
1067
inline uint64_t getCurrentTimestamp()
1069
return my_micro_time();
1071
inline uint64_t found_rows(void)
1132
1073
return limit_found_rows;
1135
1075
/** Returns whether the session is currently inside a transaction */
1136
bool inTransaction() const
1076
inline bool inTransaction()
1138
1078
return server_status & SERVER_STATUS_IN_TRANS;
1080
inline bool fill_derived_tables()
1082
return !lex->only_view_structure();
1084
inline void* trans_alloc(unsigned int size)
1086
return alloc_root(&transaction.mem_root,size);
1141
1089
LEX_STRING *make_lex_string(LEX_STRING *lex_str,
1142
1090
const char* str, uint32_t length,
1143
1091
bool allocate_lex_string);
1145
LEX_STRING *make_lex_string(LEX_STRING *lex_str,
1146
const std::string &str,
1147
bool allocate_lex_string);
1093
void add_changed_table(Table *table);
1094
void add_changed_table(const char *key, long key_length);
1095
CHANGED_TableList * changed_table_dup(const char *key, long key_length);
1149
1096
int send_explain_fields(select_result *result);
1152
1098
Clear the current error, if any.
1153
1099
We do not clear is_fatal_error or is_fatal_sub_stmt_error since we
1312
1264
* Current implementation does not depend on that, but future changes
1313
1265
* 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()
1267
* @param Scrambled password received from client
1268
* @param Length of scrambled password
1269
* @param Database name to connect to, may be NULL
1271
bool checkUser(const char *passwd, uint32_t passwd_len, const char *db);
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
1274
const char *proc_info;
1454
1276
/** The current internal error handler for this thread, or NULL. */
1572
1392
* 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);
1394
int open_and_lock_tables(TableList *tables);
1396
* Open all tables in list and process derived tables
1398
* @param Pointer to a list of tables for open
1399
* @param Bitmap of flags to modify how the tables will be open:
1400
* DRIZZLE_LOCK_IGNORE_FLUSH - open table even if someone has
1401
* done a flush or namelock on it.
1410
* This is to be used on prepare stage when you don't read any
1411
* data from the tables.
1413
bool open_normal_and_derived_tables(TableList *tables, uint32_t flags);
1414
int open_tables_from_list(TableList **start, uint32_t *counter, uint32_t flags);
1415
Table *open_ltable(TableList *table_list, thr_lock_type lock_type);
1416
Table *open_table(TableList *table_list, bool *refresh, uint32_t flags);
1581
1417
void unlink_open_table(Table *find);
1582
void drop_open_table(Table *table, const identifier::Table &identifier);
1418
void drop_open_table(Table *table, const char *db_name,
1419
const char *table_name);
1583
1420
void close_cached_table(Table *table);
1585
1422
/* 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;
1423
Table *table_cache_insert_placeholder(const char *key, uint32_t key_length);
1424
bool lock_table_name_if_not_cached(const char *db,
1425
const char *table_name, Table **table);
1427
/* Work with temporary tables */
1428
Table *find_temporary_table(TableList *table_list);
1429
Table *find_temporary_table(const char *db, const char *table_name);
1430
void close_temporary_tables();
1431
void close_temporary_table(Table *table, bool free_share, bool delete_table);
1432
int drop_temporary_table(TableList *table_list);
1598
1434
/* 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;
1435
bool reopen_tables(bool get_locks, bool mark_share_as_old);
1436
bool reopen_name_locked_table(TableList* table_list, bool link_in);
1438
void wait_for_condition(pthread_mutex_t *mutex, pthread_cond_t *cond);
1684
1443
#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
1445
#include <drizzled/select_to_file.h>
1690
1446
#include <drizzled/select_export.h>
1691
1447
#include <drizzled/select_dump.h>
1692
1448
#include <drizzled/select_insert.h>
1693
1449
#include <drizzled/select_create.h>
1450
#include <plugin/myisam/myisam.h>
1694
1451
#include <drizzled/tmp_table_param.h>
1695
1452
#include <drizzled/select_union.h>
1696
1453
#include <drizzled/select_subselect.h>