17
17
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20
#ifndef DRIZZLED_SESSION_H
21
#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>
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; }
21
#ifndef DRIZZLED_SQL_CLASS_H
22
#define DRIZZLED_SQL_CLASS_H
24
/* Classes in mysql */
26
#include <drizzled/global.h>
27
#include <drizzled/log.h>
28
#include <drizzled/replication/tblmap.h>
29
#include <drizzled/protocol.h>
30
#include <libdrizzle/password.h> // rand_struct
31
#include <drizzled/sql_locale.h>
32
#include <drizzled/scheduler.h>
33
#include <drizzled/ha_trx_info.h>
37
class Query_log_event;
39
class Slave_log_event;
100
40
class Lex_input_stream;
101
class user_var_entry;
105
class TableShareInstance;
43
enum enum_enable_or_disable { LEAVE_AS_IS, ENABLE, DISABLE };
44
enum enum_delay_key_write { DELAY_KEY_WRITE_NONE, DELAY_KEY_WRITE_ON,
45
DELAY_KEY_WRITE_ALL };
46
enum enum_slave_exec_mode { SLAVE_EXEC_MODE_STRICT,
47
SLAVE_EXEC_MODE_IDEMPOTENT,
48
SLAVE_EXEC_MODE_LAST_BIT};
49
enum enum_mark_columns
50
{ MARK_COLUMNS_NONE, MARK_COLUMNS_READ, MARK_COLUMNS_WRITE};
51
enum enum_filetype { FILETYPE_CSV, FILETYPE_XML };
107
53
extern char internal_table_name[2];
108
54
extern char empty_c_string[1];
109
55
extern const char **errmesg;
57
#define TC_LOG_PAGE_SIZE 8192
58
#define TC_LOG_MIN_SIZE (3*TC_LOG_PAGE_SIZE)
111
60
#define TC_HEURISTIC_RECOVER_COMMIT 1
112
61
#define TC_HEURISTIC_RECOVER_ROLLBACK 2
113
62
extern uint32_t tc_heuristic_recover;
64
typedef struct st_user_var_events
66
user_var_entry *user_var_event;
70
uint32_t charset_number;
71
} BINLOG_USER_VAR_EVENT;
73
#define RP_LOCK_LOG_IS_ALREADY_LOCKED 1
74
#define RP_FORCE_ROTATE 2
77
The COPY_INFO structure is used by INSERT/REPLACE code.
78
The schema of the row counting by the INSERT/INSERT ... ON DUPLICATE KEY
80
If a row is inserted then the copied variable is incremented.
81
If a row is updated by the INSERT ... ON DUPLICATE KEY UPDATE and the
82
new data differs from the old one then the copied and the updated
83
variables are incremented.
84
The touched variable is incremented if a row was touched by the update part
85
of the INSERT ... ON DUPLICATE KEY UPDATE no matter whether the row
86
was actually changed or not.
88
typedef struct st_copy_info {
89
ha_rows records; /**< Number of processed records */
90
ha_rows deleted; /**< Number of deleted records */
91
ha_rows updated; /**< Number of updated records */
92
ha_rows copied; /**< Number of copied records */
94
ha_rows touched; /* Number of touched records */
95
enum enum_duplicates handle_duplicates;
96
int escape_char, last_errno;
98
/* for INSERT ... UPDATE */
99
List<Item> *update_fields;
100
List<Item> *update_values;
101
/* for VIEW ... WITH CHECK OPTION */
105
class Key_part_spec :public Sql_alloc {
107
LEX_STRING field_name;
109
Key_part_spec(const LEX_STRING &name, uint32_t len)
110
: field_name(name), length(len)
112
Key_part_spec(const char *name, const size_t name_len, uint32_t len)
114
{ field_name.str= (char *)name; field_name.length= name_len; }
115
bool operator==(const Key_part_spec& other) const;
117
Construct a copy of this Key_part_spec. field_name is copied
118
by-pointer as it is known to never change. At the same time
119
'length' may be reset in mysql_prepare_create_table, and this
120
is why we supply it with a copy.
122
@return If out of memory, 0 is returned and an error is set in
125
Key_part_spec *clone(MEM_ROOT *mem_root) const
126
{ return new (mem_root) Key_part_spec(*this); }
130
class Alter_drop :public Sql_alloc {
132
enum drop_type {KEY, COLUMN };
135
Alter_drop(enum drop_type par_type,const char *par_name)
136
:name(par_name), type(par_type) {}
138
Used to make a clone of this object for ALTER/CREATE TABLE
139
@sa comment for Key_part_spec::clone
141
Alter_drop *clone(MEM_ROOT *mem_root) const
142
{ return new (mem_root) Alter_drop(*this); }
146
class Alter_column :public Sql_alloc {
150
Alter_column(const char *par_name,Item *literal)
151
:name(par_name), def(literal) {}
153
Used to make a clone of this object for ALTER/CREATE TABLE
154
@sa comment for Key_part_spec::clone
156
Alter_column *clone(MEM_ROOT *mem_root) const
157
{ return new (mem_root) Alter_column(*this); }
161
class Key :public Sql_alloc {
163
enum Keytype { PRIMARY, UNIQUE, MULTIPLE, FOREIGN_KEY};
165
KEY_CREATE_INFO key_create_info;
166
List<Key_part_spec> columns;
170
Key(enum Keytype type_par, const LEX_STRING &name_arg,
171
KEY_CREATE_INFO *key_info_arg,
172
bool generated_arg, List<Key_part_spec> &cols)
173
:type(type_par), key_create_info(*key_info_arg), columns(cols),
174
name(name_arg), generated(generated_arg)
176
Key(enum Keytype type_par, const char *name_arg, size_t name_len_arg,
177
KEY_CREATE_INFO *key_info_arg, bool generated_arg,
178
List<Key_part_spec> &cols)
179
:type(type_par), key_create_info(*key_info_arg), columns(cols),
180
generated(generated_arg)
182
name.str= (char *)name_arg;
183
name.length= name_len_arg;
185
Key(const Key &rhs, MEM_ROOT *mem_root);
187
/* Equality comparison of keys (ignoring name) */
188
friend bool foreign_key_prefix(Key *a, Key *b);
190
Used to make a clone of this object for ALTER/CREATE TABLE
191
@sa comment for Key_part_spec::clone
193
virtual Key *clone(MEM_ROOT *mem_root) const
194
{ return new (mem_root) Key(*this, mem_root); }
199
class Foreign_key: public Key {
201
enum fk_match_opt { FK_MATCH_UNDEF, FK_MATCH_FULL,
202
FK_MATCH_PARTIAL, FK_MATCH_SIMPLE};
203
enum fk_option { FK_OPTION_UNDEF, FK_OPTION_RESTRICT, FK_OPTION_CASCADE,
204
FK_OPTION_SET_NULL, FK_OPTION_NO_ACTION, FK_OPTION_DEFAULT};
206
Table_ident *ref_table;
207
List<Key_part_spec> ref_columns;
208
uint32_t delete_opt, update_opt, match_opt;
209
Foreign_key(const LEX_STRING &name_arg, List<Key_part_spec> &cols,
210
Table_ident *table, List<Key_part_spec> &ref_cols,
211
uint32_t delete_opt_arg, uint32_t update_opt_arg, uint32_t match_opt_arg)
212
:Key(FOREIGN_KEY, name_arg, &default_key_create_info, 0, cols),
213
ref_table(table), ref_columns(ref_cols),
214
delete_opt(delete_opt_arg), update_opt(update_opt_arg),
215
match_opt(match_opt_arg)
217
Foreign_key(const Foreign_key &rhs, MEM_ROOT *mem_root);
219
Used to make a clone of this object for ALTER/CREATE TABLE
220
@sa comment for Key_part_spec::clone
222
virtual Key *clone(MEM_ROOT *mem_root) const
223
{ return new (mem_root) Foreign_key(*this, mem_root); }
224
/* Used to validate foreign key options */
225
bool validate(List<Create_field> &table_fields);
228
typedef struct st_mysql_lock
231
uint32_t table_count,lock_count;
232
THR_LOCK_DATA **locks;
236
class LEX_COLUMN : public Sql_alloc
241
LEX_COLUMN (const String& x,const uint& y ): column (x),rights (y) {}
115
244
class select_result;
118
247
#define Session_SENTRY_MAGIC 0xfeedd1ff
119
248
#define Session_SENTRY_GONE 0xdeadbeef
121
extern DRIZZLED_API struct drizzle_system_variables global_system_variables;
250
#define Session_CHECK_SENTRY(session) assert(session->dbug_sentry == Session_SENTRY_MAGIC)
252
struct system_variables
255
How dynamically allocated system variables are handled:
257
The global_system_variables and max_system_variables are "authoritative"
258
They both should have the same 'version' and 'size'.
259
When attempting to access a dynamic variable, if the session version
260
is out of date, then the session version is updated and realloced if
261
neccessary and bytes copied from global to make up for missing data.
263
ulong dynamic_variables_version;
264
char* dynamic_variables_ptr;
265
uint32_t dynamic_variables_head; /* largest valid variable offset */
266
uint32_t dynamic_variables_size; /* how many bytes are in use */
268
uint64_t myisam_max_extra_sort_file_size;
269
uint64_t myisam_max_sort_file_size;
270
uint64_t max_heap_table_size;
271
uint64_t tmp_table_size;
272
ha_rows select_limit;
273
ha_rows max_join_size;
274
ulong auto_increment_increment, auto_increment_offset;
275
ulong bulk_insert_buff_size;
276
ulong join_buff_size;
277
ulong max_allowed_packet;
278
ulong max_error_count;
279
ulong max_length_for_sort_data;
280
ulong max_sort_length;
281
ulong max_tmp_tables;
282
ulong min_examined_row_limit;
283
ulong myisam_repair_threads;
284
ulong myisam_sort_buff_size;
285
ulong myisam_stats_method;
286
ulong net_buffer_length;
287
ulong net_interactive_timeout;
288
ulong net_read_timeout;
289
ulong net_retry_count;
290
ulong net_wait_timeout;
291
ulong net_write_timeout;
292
ulong optimizer_prune_level;
293
ulong optimizer_search_depth;
295
Controls use of Engine-MRR:
296
0 - auto, based on cost
297
1 - force MRR when the storage engine is capable of doing it
300
ulong optimizer_use_mrr;
301
/* A bitmap for switching optimizations on/off */
302
ulong optimizer_switch;
303
ulong preload_buff_size;
304
ulong read_buff_size;
305
ulong read_rnd_buff_size;
306
ulong div_precincrement;
308
ulong thread_handling;
310
ulong completion_type;
311
/* Determines which non-standard SQL behaviour should be enabled */
313
ulong default_week_format;
314
ulong max_seeks_for_key;
315
ulong range_alloc_block_size;
316
ulong query_alloc_block_size;
317
ulong query_prealloc_size;
318
ulong trans_alloc_block_size;
319
ulong trans_prealloc_size;
321
ulong group_concat_max_len;
322
ulong binlog_format; // binlog format for this session (see enum_binlog_format)
324
In slave thread we need to know in behalf of which
325
thread the query is being run to replicate temp tables properly
327
/* TODO: change this to my_thread_id - but have to fix set_var first */
328
uint64_t pseudo_thread_id;
330
bool low_priority_updates;
333
compatibility option:
334
- index usage hints (USE INDEX without a FOR clause) behave as in 5.0
337
bool engine_condition_pushdown;
338
bool keep_files_on_create;
340
bool old_alter_table;
342
plugin_ref table_plugin;
344
/* Only charset part of these variables is sensible */
345
const CHARSET_INFO *character_set_filesystem;
346
const CHARSET_INFO *character_set_client;
347
const CHARSET_INFO *character_set_results;
349
/* Both charset and collation parts of these variables are important */
350
const CHARSET_INFO *collation_server;
351
const CHARSET_INFO *collation_database;
352
const CHARSET_INFO *collation_connection;
355
MY_LOCALE *lc_time_names;
357
Time_zone *time_zone;
359
/* DATE, DATETIME and DRIZZLE_TIME formats */
360
DATE_TIME_FORMAT *date_format;
361
DATE_TIME_FORMAT *datetime_format;
362
DATE_TIME_FORMAT *time_format;
367
extern struct system_variables global_system_variables;
369
#include "sql_lex.h" /* only for SQLCOM_END */
371
/* per thread status variables */
373
typedef struct system_status_var
375
uint64_t bytes_received;
378
ulong com_stat[(uint) SQLCOM_END];
379
ulong created_tmp_disk_tables;
380
ulong created_tmp_tables;
381
ulong ha_commit_count;
382
ulong ha_delete_count;
383
ulong ha_read_first_count;
384
ulong ha_read_last_count;
385
ulong ha_read_key_count;
386
ulong ha_read_next_count;
387
ulong ha_read_prev_count;
388
ulong ha_read_rnd_count;
389
ulong ha_read_rnd_next_count;
390
ulong ha_rollback_count;
391
ulong ha_update_count;
392
ulong ha_write_count;
393
ulong ha_prepare_count;
394
ulong ha_discover_count;
395
ulong ha_savepoint_count;
396
ulong ha_savepoint_rollback_count;
398
/* KEY_CACHE parts. These are copies of the original */
399
ulong key_blocks_changed;
400
ulong key_blocks_used;
401
ulong key_cache_r_requests;
402
ulong key_cache_read;
403
ulong key_cache_w_requests;
404
ulong key_cache_write;
405
/* END OF KEY_CACHE parts */
407
ulong net_big_packet_count;
410
ulong select_full_join_count;
411
ulong select_full_range_join_count;
412
ulong select_range_count;
413
ulong select_range_check_count;
414
ulong select_scan_count;
415
ulong long_query_count;
416
ulong filesort_merge_passes;
417
ulong filesort_range_count;
419
ulong filesort_scan_count;
420
/* Prepared statements and binary protocol */
421
ulong com_stmt_prepare;
422
ulong com_stmt_execute;
423
ulong com_stmt_send_long_data;
424
ulong com_stmt_fetch;
425
ulong com_stmt_reset;
426
ulong com_stmt_close;
428
Number of statements sent from the client
434
SEE last_system_status_var DEFINITION BELOW.
436
Below 'last_system_status_var' are all variables which doesn't make any
437
sense to add to the /global/ status variable counter.
439
double last_query_cost;
445
This is used for 'SHOW STATUS'. It must be updated to the last ulong
446
variable in system_status_var which is makes sens to add to the global
450
#define last_system_status_var questions
452
void mark_transaction_to_rollback(Session *session, bool all);
454
#ifdef DRIZZLE_SERVER
460
List of items created in the parser for this query. Every item puts
461
itself to the list on creation (see Item::Item() for details))
464
MEM_ROOT *mem_root; // Pointer to current memroot
466
Query_arena(MEM_ROOT *mem_root_arg) :
467
free_list(0), mem_root(mem_root_arg)
470
This constructor is used only when Query_arena is created as
471
backup storage for another instance of Query_arena.
475
virtual ~Query_arena() {};
477
inline void* alloc(size_t size) { return alloc_root(mem_root,size); }
478
inline void* calloc(size_t size)
481
if ((ptr=alloc_root(mem_root,size)))
482
memset(ptr, 0, size);
485
inline char *strdup(const char *str)
486
{ return strdup_root(mem_root,str); }
487
inline char *strmake(const char *str, size_t size)
488
{ return strmake_root(mem_root,str,size); }
489
inline void *memdup(const void *str, size_t size)
490
{ return memdup_root(mem_root,str,size); }
491
inline void *memdup_w_gap(const void *str, size_t size, uint32_t gap)
494
if ((ptr= alloc_root(mem_root,size+gap)))
495
memcpy(ptr,str,size);
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
505
@brief State of a single command executed against this connection.
507
One connection can contain a lot of simultaneously running statements,
508
some of which could be:
509
- prepared, that is, contain placeholders,
510
To perform some action with statement we reset Session part to the state of
511
that statement, do the action, and then save back modified state from Session
512
to the statement. It will be changed in near future, and Statement will
516
class Statement: public ilink, public Query_arena
518
Statement(const Statement &rhs); /* not implemented: */
519
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);
522
Uniquely identifies each statement object in thread scope; change during
523
statement lifetime. FIXME: must be const
160
528
MARK_COLUMNS_NONE: Means mark_used_colums is not set and no indicator to
297
575
the Session of that thread); that thread is (and must remain, for now) the
298
576
only responsible for freeing this member.
584
/* This constructor is called for backup statements */
587
Statement(LEX *lex_arg, MEM_ROOT *mem_root_arg, ulong id_arg);
591
struct st_savepoint {
592
struct st_savepoint *prev;
595
Ha_trx_info *ha_list;
598
enum xa_states {XA_NOTR=0, XA_ACTIVE, XA_IDLE, XA_PREPARED};
599
extern const char *xa_state_names[];
601
typedef struct st_xid_state {
602
/* For now, this is only used to catch duplicated external xids */
603
XID xid; // transaction identifier
604
enum xa_states xa_state; // used by external XA only
608
extern pthread_mutex_t LOCK_xid_cache;
609
extern HASH xid_cache;
610
bool xid_cache_init(void);
611
void xid_cache_free(void);
612
XID_STATE *xid_cache_search(XID *xid);
613
bool xid_cache_insert(XID *xid, enum xa_states xa_state);
614
bool xid_cache_insert(XID_STATE *xid_state);
615
void xid_cache_delete(XID_STATE *xid_state);
618
@class Security_context
619
@brief A set of Session members describing the current authenticated user.
622
class Security_context {
624
Security_context() {} /* Remove gcc warning */
626
host - host of the client
627
user - user of the client, set to NULL until the user has been read from
629
priv_user - The user privilege we are using. May be "" for anonymous user.
638
inline char *priv_host_name()
640
return (ip ? ip : (char *)"%");
646
A registry for item tree transformations performed during
647
query optimization. We register only those changes which require
648
a rollback to re-execute a prepared statement or stored procedure
652
struct Item_change_record;
653
typedef I_List<Item_change_record> Item_change_list;
657
Class that holds information about tables which were opened and locked
658
by the thread. It is also used to save/restore this information in
659
push_open_tables_state()/pop_open_tables_state().
662
class Open_tables_state
666
List of regular tables in use by this thread. Contains temporary and
667
base tables that were opened with @see open_tables().
671
List of temporary tables used by this thread. Contains user-level
672
temporary tables, created with CREATE TEMPORARY TABLE, and
673
internal temporary tables, created, e.g., to resolve a SELECT,
674
or for an intermediate table used in ALTER.
675
XXX Why are internal temporary tables added to this list?
677
Table *temporary_tables;
679
List of tables that were opened with HANDLER OPEN and are
680
still in use by this thread.
682
Table *handler_tables;
683
Table *derived_tables;
685
During a MySQL session, one can lock tables in two modes: automatic
686
or manual. In automatic mode all necessary tables are locked just before
687
statement execution, and all acquired locks are stored in 'lock'
688
member. Unlocking takes place automatically as well, when the
690
Manual mode comes into play when a user issues a 'LOCK TABLES'
691
statement. In this mode the user can only use the locked tables.
692
Trying to use any other tables will give an error. The locked tables are
693
stored in 'locked_tables' member. Manual locking is described in
694
the 'LOCK_TABLES' chapter of the MySQL manual.
695
See also lock_tables() for details.
699
Tables that were locked with explicit or implicit LOCK TABLES.
700
(Implicit LOCK TABLES happens when we are prelocking tables for
701
execution of statement which uses stored routines. See description
702
Session::prelocked_mode for more info.)
704
DRIZZLE_LOCK *locked_tables;
707
CREATE-SELECT keeps an extra lock for the table being
708
created. This field is used to keep the extra lock available for
709
lower level routines, which would otherwise miss that lock.
711
DRIZZLE_LOCK *extra_lock;
714
uint32_t current_tablenr;
717
BACKUPS_AVAIL = (1U << 0) /* There are backups available */
721
Flags with information about the open tables state.
723
uint32_t state_flags;
726
This constructor serves for creation of Open_tables_state instances
727
which are used as backup storage.
729
Open_tables_state() : state_flags(0U) { }
731
Open_tables_state(ulong version_arg);
733
void set_open_tables_state(Open_tables_state *state)
738
void reset_open_tables_state()
740
open_tables= temporary_tables= handler_tables= derived_tables= 0;
741
extra_lock= lock= locked_tables= 0;
747
/* Flags for the Session::system_thread variable */
748
enum enum_thread_type
751
SYSTEM_THREAD_SLAVE_IO,
752
SYSTEM_THREAD_SLAVE_SQL
757
This class represents the interface for internal error handlers.
758
Internal error handlers are exception handlers used by the server
761
class Internal_error_handler
764
Internal_error_handler() {}
765
virtual ~Internal_error_handler() {}
769
Handle an error condition.
770
This method can be implemented by a subclass to achieve any of the
772
- mask an error internally, prevent exposing it to the user,
773
- mask an error and throw another one instead.
774
When this method returns true, the error condition is considered
775
'handled', and will not be propagated to upper layers.
776
It is the responsability of the code installing an internal handler
777
to then check for trapped conditions, and implement logic to recover
778
from the anticipated conditions trapped during runtime.
780
This mechanism is similar to C++ try/throw/catch:
781
- 'try' correspond to <code>Session::push_internal_handler()</code>,
782
- 'throw' correspond to <code>my_error()</code>,
783
which invokes <code>my_message_sql()</code>,
784
- 'catch' correspond to checking how/if an internal handler was invoked,
785
before removing it from the exception stack with
786
<code>Session::pop_internal_handler()</code>.
788
@param sql_errno the error number
789
@param level the error level
790
@param session the calling thread
791
@return true if the error is handled
793
virtual bool handle_error(uint32_t sql_errno,
795
DRIZZLE_ERROR::enum_warning_level level,
796
Session *session) = 0;
801
Stores status of the currently executed statement.
802
Cleared at the beginning of the statement, and then
803
can hold either OK, ERROR, or EOF status.
804
Can not be assigned twice per statement.
807
class Diagnostics_area
810
enum enum_diagnostics_status
812
/** The area is cleared at start of a statement. */
814
/** Set whenever one calls my_ok(). */
816
/** Set whenever one calls my_eof(). */
818
/** Set whenever one calls my_error() or my_message(). */
820
/** Set in case of a custom response, such as one from COM_STMT_PREPARE. */
823
/** True if status information is sent to the client. */
825
/** Set to make set_error_status after set_{ok,eof}_status possible. */
826
bool can_overwrite_status;
828
void set_ok_status(Session *session, ha_rows affected_rows_arg,
829
uint64_t last_insert_id_arg,
830
const char *message);
831
void set_eof_status(Session *session);
832
void set_error_status(Session *session, uint32_t sql_errno_arg, const char *message_arg);
834
void disable_status();
836
void reset_diagnostics_area();
838
bool is_set() const { return m_status != DA_EMPTY; }
839
bool is_error() const { return m_status == DA_ERROR; }
840
bool is_eof() const { return m_status == DA_EOF; }
841
bool is_ok() const { return m_status == DA_OK; }
842
bool is_disabled() const { return m_status == DA_DISABLED; }
843
enum_diagnostics_status status() const { return m_status; }
845
const char *message() const
846
{ assert(m_status == DA_ERROR || m_status == DA_OK); return m_message; }
848
uint32_t sql_errno() const
849
{ assert(m_status == DA_ERROR); return m_sql_errno; }
851
uint32_t server_status() const
853
assert(m_status == DA_OK || m_status == DA_EOF);
854
return m_server_status;
857
ha_rows affected_rows() const
858
{ assert(m_status == DA_OK); return m_affected_rows; }
860
uint64_t last_insert_id() const
861
{ assert(m_status == DA_OK); return m_last_insert_id; }
863
uint32_t total_warn_count() const
865
assert(m_status == DA_OK || m_status == DA_EOF);
866
return m_total_warn_count;
869
Diagnostics_area() { reset_diagnostics_area(); }
301
util::string::shared_ptr _schema;
872
/** Message buffer. Can be used by OK or ERROR status. */
873
char m_message[DRIZZLE_ERRMSG_SIZE];
875
SQL error number. One of ER_ codes from share/errmsg.txt.
876
Set by set_error_status.
878
uint32_t m_sql_errno;
881
Copied from session->server_status when the diagnostics area is assigned.
882
We need this member as some places in the code use the following pattern:
883
session->server_status|= ...
885
session->server_status&= ~...
886
Assigned by OK, EOF or ERROR.
888
uint32_t m_server_status;
890
The number of rows affected by the last statement. This is
891
semantically close to session->row_count_func, but has a different
892
life cycle. session->row_count_func stores the value returned by
893
function ROW_COUNT() and is cleared only by statements that
894
update its value, such as INSERT, UPDATE, DELETE and few others.
895
This member is cleared at the beginning of the next statement.
897
We could possibly merge the two, but life cycle of session->row_count_func
900
ha_rows m_affected_rows;
902
Similarly to the previous member, this is a replacement of
903
session->first_successful_insert_id_in_prev_stmt, which is used
904
to implement LAST_INSERT_ID().
906
uint64_t m_last_insert_id;
907
/** The total number of warnings. */
908
uint m_total_warn_count;
909
enum_diagnostics_status m_status;
911
@todo: the following Session members belong here:
912
- warn_list, warn_count,
918
Storage engine specific thread local data.
924
Storage engine specific thread local data.
925
Lifetime: one user connection.
929
0: Life time: one statement within a transaction. If @@autocommit is
930
on, also represents the entire transaction.
931
@sa trans_register_ha()
933
1: Life time: one transaction within a connection.
934
If the storage engine does not participate in a transaction,
935
this should not be used.
936
@sa trans_register_ha()
938
Ha_trx_info ha_info[2];
940
Ha_data() :ha_ptr(NULL) {}
946
For each client connection we create a separate thread with Session serving as
947
a thread/connection descriptor
950
class Session :public Statement,
951
public Open_tables_state
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;
954
/* Used to execute base64 coded binlog events in MySQL server */
955
Relay_log_info* rli_fake;
316
958
Constant for Session::where initialization in the beginning of every query.
318
960
It's needed because we do not save/restore Session::where normally during
321
963
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;
965
NET net; // client connection descriptor
966
MEM_ROOT warn_root; // For warnings and errors
967
Protocol *protocol; // Current protocol
968
Protocol_text protocol_text; // Normal protocol
969
HASH user_vars; // hash for user variables
970
String packet; // dynamic buffer for network I/O
971
String convert_buffer; // buffer for charset conversions
972
struct rand_struct rand; // used for authentication
973
struct system_variables variables; // Changeable local variables
974
struct system_status_var status_var; // Per thread statistic vars
975
struct system_status_var *initial_status_var; /* used by show status */
976
THR_LOCK_INFO lock_info; // Locking info of this thread
977
THR_LOCK_OWNER main_lock_id; // To use for conventional queries
978
THR_LOCK_OWNER *lock_id; // If not main_lock_id, points to
979
// the lock_id of a cursor.
980
pthread_mutex_t LOCK_delete; // Locked before session is deleted
982
A pointer to the stack frame of handle_one_connection(),
983
which is called first in the thread for handling a client
988
Currently selected catalog.
994
Some members of Session (currently 'Statement::db',
995
'catalog' and 'query') are set and alloced by the slave SQL thread
996
(for the Session of that thread); that thread is (and must remain, for now)
997
the only responsible for freeing these 3 members. If you add members
998
here, and you add code to set them in replication, don't forget to
999
free_them_and_set_them_to_0 in replication properly. For details see
1000
the 'err:' label of the handle_slave_sql() in sql/slave.cc.
1002
@see handle_slave_sql
1005
Security_context main_security_ctx;
1006
Security_context *security_ctx;
1009
Points to info-string that we show in SHOW PROCESSLIST
1010
You are supposed to call Session_SET_PROC_INFO only if you have coded
1011
a time-consuming piece that MySQL can get stuck in for a long time.
1013
Set it using the session_proc_info(Session *thread, const char *message)
1016
void set_proc_info(const char *info) { proc_info= info; }
1017
const char* get_proc_info() const { return proc_info; }
415
1020
Used in error messages to tell user in what part of MySQL we found an
416
1021
error. E. g. when where= "having clause", if fix_fields() fails, user
417
1022
will know that the error was in having clause.
427
void setWhere(const char *arg)
1026
double tmp_double_value; /* Used in set_var.cc */
1027
ulong client_capabilities; /* What the client supports */
1028
ulong max_client_packet_length;
1030
HASH handler_tables_hash;
433
1032
One thread can hold up to one named user-level lock. This variable
434
1033
points to a lock object if the lock is present. See item_func.cc and
435
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()
1034
chapter 'Miscellaneous functions', for functions GET_LOCK, RELEASE_LOCK.
1036
uint32_t dbug_sentry; // watch out for memory corruption
1037
struct st_my_thread_var *mysys_var;
1039
Type of current query: COM_STMT_PREPARE, COM_QUERY, etc. Set from
1040
first byte of the packet in do_command()
472
1042
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;
1044
uint32_t file_id; // for LOAD DATA INFILE
1045
/* remote (peer) port */
1047
time_t start_time, user_time;
1048
uint64_t connect_utime, thr_create_utime; // track down slow pthread_create
1049
uint64_t start_utime, utime_after_lock;
502
1051
thr_lock_type update_lock_default;
505
Both of the following container points in session will be converted to an API.
509
1053
/* 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;
1054
Ha_data ha_data[MAX_HA];
1056
/* Place to store various things */
1057
void *session_marker;
1058
int binlog_setup_trx_data();
1061
Public interface to write RBR events to the binlog
1063
void binlog_start_trans_and_stmt();
1064
void binlog_set_stmt_begin();
1065
int binlog_write_table_map(Table *table, bool is_transactional);
1066
int binlog_write_row(Table* table, bool is_transactional,
1067
const unsigned char *new_data);
1068
int binlog_delete_row(Table* table, bool is_transactional,
1069
const unsigned char *old_data);
1070
int binlog_update_row(Table* table, bool is_transactional,
1071
const unsigned char *old_data, const unsigned char *new_data);
1073
void set_server_id(uint32_t sid) { server_id = sid; }
1076
Member functions to handle pending event for row-level logging.
1078
template <class RowsEventT> Rows_log_event*
1079
binlog_prepare_pending_rows_event(Table* table, uint32_t serv_id,
1081
bool is_transactional,
1083
Rows_log_event* binlog_get_pending_rows_event() const;
1084
void binlog_set_pending_rows_event(Rows_log_event* ev);
1085
int binlog_flush_pending_rows_event(bool stmt_end);
1088
uint32_t binlog_table_maps; // Number of table maps currently in the binlog
1090
enum enum_binlog_flag {
1091
BINLOG_FLAG_UNSAFE_STMT_PRINTED,
1096
Flags with per-thread information regarding the status of the
1099
uint32_t binlog_flags;
1101
uint32_t get_binlog_table_maps() const {
1102
return binlog_table_maps;
1104
void clear_binlog_table_maps() {
1105
binlog_table_maps= 0;
1110
struct st_transactions {
1111
SAVEPOINT *savepoints;
1112
Session_TRANS all; // Trans since BEGIN WORK
1113
Session_TRANS stmt; // Trans for current statement
1114
bool on; // see ha_enable_transaction()
1115
XID_STATE xid_state;
1116
Rows_log_event *m_pending_rows_event;
1119
Tables changed in transaction (that must be invalidated in query cache).
1120
List contain only transactional tables, that not invalidated in query
1121
cache (instead of full list of changed in transaction tables).
1123
CHANGED_TableList* changed_tables;
1124
MEM_ROOT mem_root; // Transaction-life memory allocation pool
1129
free_root(&mem_root,MYF(MY_KEEP_PREALLOC));
1133
memset(this, 0, sizeof(*this));
1134
xid_state.xid.null();
1135
init_sql_alloc(&mem_root, ALLOC_ROOT_MIN_BLOCK_SIZE, 0);
530
1139
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;
1141
This is to track items changed during execution of a prepared
1142
statement/stored procedure. It's created by
1143
register_item_tree_change() in memory root of Session, and freed in
1144
rollback_item_tree_changes(). For conventional execution it's always
1147
Item_change_list change_list;
548
1149
/* Tells if LAST_INSERT_ID(#) was called for the current statement */
549
1150
bool arg_of_last_insert_id_function;
552
1152
ALL OVER THIS FILE, "insert_id" means "*automatically generated* value for
553
1153
insertion into an auto_increment column".
556
1156
This is the first autogenerated insert id which was *successfully*
557
1157
inserted by the previous statement (exactly, if the previous statement
558
1158
didn't successfully insert an autogenerated insert id, then it's the one
595
1215
in the binlog is still needed; the list's minimum will contain 3.
597
1217
Discrete_intervals_list auto_inc_intervals_in_cur_stmt_for_binlog;
598
/** Used by replication and SET INSERT_ID */
1218
/* Used by replication and SET INSERT_ID */
599
1219
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
1221
There is BUG#19630 where statement-based replication of stored
887
1222
functions/triggers with two auto_increment columns breaks.
888
1223
We however ensure that it works when there is 0 or 1 auto_increment
938
1280
auto_inc_intervals_forced.append(next_id, UINT64_MAX, 0);
941
Session(plugin::Client *client_arg, catalog::Instance::shared_ptr catalog);
1283
uint64_t limit_found_rows;
1284
uint64_t options; /* Bitmap of states */
1285
int64_t row_count_func; /* For the ROW_COUNT() function */
1286
ha_rows cuted_fields;
1289
number of rows we actually sent to the client, including "synthetic"
1292
ha_rows sent_row_count;
1295
number of rows we read, sent or not, including in create_sort_index()
1297
ha_rows examined_row_count;
1300
The set of those tables whose fields are referenced in all subqueries
1302
TODO: possibly this it is incorrect to have used tables in Session because
1303
with more than one subquery, it is not clear what does the field mean.
1305
table_map used_tables;
1306
USER_CONN *user_connect;
1307
const CHARSET_INFO *db_charset;
1309
FIXME: this, and some other variables like 'count_cuted_fields'
1310
maybe should be statement/cursor local, that is, moved to Statement
1311
class. With current implementation warnings produced in each prepared
1312
statement/cursor settle here.
1314
List <DRIZZLE_ERROR> warn_list;
1315
uint warn_count[(uint) DRIZZLE_ERROR::WARN_LEVEL_END];
1316
uint total_warn_count;
1317
Diagnostics_area main_da;
1320
Id of current query. Statement can be reused to execute several queries
1321
query_id is global in context of the whole MySQL server.
1322
ID is automatically generated from mutex-protected counter.
1323
It's used in handler code for various purposes: to check which columns
1324
from table are necessary for this select, to check if it's necessary to
1325
update auto-updatable fields (like auto_increment and timestamp).
1327
query_id_t query_id, warn_id;
1330
#ifdef ERROR_INJECT_SUPPORT
1331
ulong error_inject_value;
1333
/* Statement id is thread-wide. This counter is used to generate ids */
1334
ulong statement_id_counter;
1335
ulong rand_saved_seed1, rand_saved_seed2;
1337
Row counter, mainly for errors and warnings. Not increased in
1338
create_sort_index(); may differ from examined_row_count.
1341
pthread_t real_id; /* For debugging */
1342
my_thread_id thread_id;
1343
uint tmp_table, global_read_lock;
1344
uint server_status,open_options;
1345
enum enum_thread_type system_thread;
1346
uint32_t select_number; //number of select (used for EXPLAIN)
1347
/* variables.transaction_isolation is reset to this after each commit */
1348
enum_tx_isolation session_tx_isolation;
1349
enum_check_fields count_cuted_fields;
1351
DYNAMIC_ARRAY user_var_events; /* For user variables replication */
1352
MEM_ROOT *user_var_events_alloc; /* Allocate above array elements here */
1360
KILLED_NO_VALUE /* means neither of the states */
1362
killed_state volatile killed;
1364
/* scramble - random string sent to client on handshake */
1365
char scramble[SCRAMBLE_LENGTH+1];
1367
bool slave_thread, one_shot_set;
1368
/* tells if current statement should binlog row-based(1) or stmt-based(0) */
1369
bool current_stmt_binlog_row_based;
1370
bool some_tables_deleted;
1371
bool last_cuted_field;
1372
bool no_errors, password;
1374
Set to true if execution of the current compound statement
1375
can not continue. In particular, disables activation of
1376
CONTINUE or EXIT handlers of stored routines.
1377
Reset in the end of processing of the current user request, in
1378
@see mysql_reset_session_for_next_command().
1380
bool is_fatal_error;
1382
Set by a storage engine to request the entire
1383
transaction (that possibly spans multiple engines) to
1384
rollback. Reset in ha_rollback.
1386
bool transaction_rollback_request;
1388
true if we are in a sub-statement and the current error can
1389
not be safely recovered until we left the sub-statement mode.
1390
In particular, disables activation of CONTINUE and EXIT
1391
handlers inside sub-statements. E.g. if it is a deadlock
1392
error and requires a transaction-wide rollback, this flag is
1393
raised (traditionally, MySQL first has to close all the reads
1394
via @see handler::ha_index_or_rnd_end() and only then perform
1396
Reset to false when we leave the sub-statement mode.
1398
bool is_fatal_sub_stmt_error;
1399
bool query_start_used, rand_used, time_zone_used;
1400
/* for IS NULL => = last_insert_id() fix in remove_eq_conds() */
1401
bool substitute_null_with_insert_id;
1402
bool in_lock_tables;
1404
True if a slave error. Causes the slave to stop. Not the same
1405
as the statement execution error (is_error()), since
1406
a statement may be expected to return an error, e.g. because
1407
it returned an error on master, and this is OK on the slave.
1409
bool is_slave_error;
1412
/** is set if some thread specific value(s) used in a statement. */
1413
bool thread_specific_used;
1414
bool charset_is_system_charset, charset_is_collation_connection;
1415
bool charset_is_character_set_filesystem;
1416
bool abort_on_warning;
1417
bool got_warning; /* Set on call to push_warning() */
1418
bool no_warnings_for_error; /* no warnings on call to my_error() */
1419
/* set during loop of derived table processing */
1420
bool derived_tables_processing;
1421
bool tablespace_op; /* This is true in DISCARD/IMPORT TABLESPACE */
1424
If we do a purge of binary logs, log index info of the threads
1425
that are currently reading it needs to be adjusted. To do that
1426
each thread that is using LOG_INFO needs to adjust the pointer to it
1428
LOG_INFO* current_linfo;
1429
NET* slave_net; // network connection from slave -> m.
1430
/* Used by the sys_var class to store temporary values */
1436
uint64_t uint64_t_value;
1441
If true, mysql_bin_log::write(Log_event) call will not write events to
1442
binlog, and maintain 2 below variables instead (use
1443
mysql_bin_log.start_union_events to turn this on)
1447
If true, at least one mysql_bin_log::write(Log_event) call has been
1448
made after last mysql_bin_log.start_union_events() call.
1450
bool unioned_events;
1452
If true, at least one mysql_bin_log::write(Log_event e), where
1453
e.cache_stmt == true call has been made after last
1454
mysql_bin_log.start_union_events() call.
1456
bool unioned_events_trans;
1459
'queries' (actually SP statements) that run under inside this binlog
1460
union have session->query_id >= first_query_id.
1462
query_id_t first_query_id;
1466
Character input stream consumed by the lexical analyser,
1467
used during parsing.
1468
Note that since the parser is not re-entrant, we keep only one input
1469
stream here. This member is valid only when executing code during parsing,
1470
and may point to invalid memory after that.
1472
Lex_input_stream *m_lip;
1479
Initialize memory roots necessary for query processing and (!)
1480
pre-allocate memory for it. We can't do that in Session constructor because
1481
there are use cases (acl_init, watcher threads,
1482
killing mysqld) where it's vital to not allocate excessive and not used
1483
memory. Note, that we still don't return error from init_for_queries():
1484
if preallocation fails, we should notice that at the first call to
1487
void init_for_queries();
1488
void change_user(void);
944
1489
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
1490
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&);
1491
bool store_globals();
1492
void awake(Session::killed_state state_to_set);
1494
enum enum_binlog_query_type {
1496
The query can be logged row-based or statement-based
1501
The query has to be logged statement-based
1506
The query represents a change to a table in the "mysql"
1507
database and is currently mapped to ROW_QUERY_TYPE.
1513
int binlog_query(enum_binlog_query_type qtype,
1514
char const *query, ulong query_len,
1515
bool is_trans, bool suppress_use,
1516
Session::killed_state killed_err_arg= Session::KILLED_NO_VALUE);
1049
1519
For enter_cond() / exit_cond() to work the mutex must be got before
1050
1520
enter_cond(); this mutex is then released by exit_cond().
1051
1521
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;
1523
inline const char* enter_cond(pthread_cond_t *cond, pthread_mutex_t* mutex,
1526
const char* old_msg = get_proc_info();
1527
safe_mutex_assert_owner(mutex);
1528
mysys_var->current_mutex = mutex;
1529
mysys_var->current_cond = cond;
1530
this->set_proc_info(msg);
1533
inline void exit_cond(const char* old_msg)
1536
Putting the mutex unlock in exit_cond() ensures that
1537
mysys_var->current_mutex is always unlocked _before_ mysys_var->mutex is
1538
locked (if that would not be the case, you'll get a deadlock if someone
1539
does a Session::awake() on you).
1541
pthread_mutex_unlock(mysys_var->current_mutex);
1542
pthread_mutex_lock(&mysys_var->mutex);
1543
mysys_var->current_mutex = 0;
1544
mysys_var->current_cond = 0;
1545
this->set_proc_info(old_msg);
1546
pthread_mutex_unlock(&mysys_var->mutex);
1548
inline time_t query_start() { query_start_used=1; return start_time; }
1549
inline void set_time()
1098
boost::posix_time::ptime mytime(boost::posix_time::microsec_clock::universal_time());
1099
t_mark= (mytime - _epoch).total_microseconds();
1553
start_time= user_time;
1554
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
1557
start_utime= utime_after_lock= my_micro_time_and_time(&start_time);
1559
inline void set_current_time() { start_time= my_time(MY_WME); }
1560
inline void set_time(time_t t)
1562
start_time= user_time= t;
1563
start_utime= utime_after_lock= my_micro_time();
1565
void set_time_after_lock() { utime_after_lock= my_micro_time(); }
1566
uint64_t current_utime() { return my_micro_time(); }
1567
inline uint64_t found_rows(void)
1132
1569
return limit_found_rows;
1135
/** Returns whether the session is currently inside a transaction */
1136
bool inTransaction() const
1571
inline bool active_transaction()
1138
1573
return server_status & SERVER_STATUS_IN_TRANS;
1575
inline bool fill_derived_tables()
1577
return !lex->only_view_structure();
1579
inline void* trans_alloc(unsigned int size)
1581
return alloc_root(&transaction.mem_root,size);
1141
1584
LEX_STRING *make_lex_string(LEX_STRING *lex_str,
1142
1585
const char* str, uint32_t length,
1143
1586
bool allocate_lex_string);
1145
LEX_STRING *make_lex_string(LEX_STRING *lex_str,
1146
const std::string &str,
1147
bool allocate_lex_string);
1588
bool convert_string(LEX_STRING *to, const CHARSET_INFO * const to_cs,
1589
const char *from, uint32_t from_length,
1590
const CHARSET_INFO * const from_cs);
1592
bool convert_string(String *s, const CHARSET_INFO * const from_cs, const CHARSET_INFO * const to_cs);
1594
void add_changed_table(Table *table);
1595
void add_changed_table(const char *key, long key_length);
1596
CHANGED_TableList * changed_table_dup(const char *key, long key_length);
1149
1597
int send_explain_fields(select_result *result);
1152
1599
Clear the current error, if any.
1153
1600
We do not clear is_fatal_error or is_fatal_sub_stmt_error since we
1468
1796
- for prepared queries, only to allocate runtime data. The parsed
1469
1797
tree itself is reused between executions and thus is stored elsewhere.
1471
memory::Root main_mem_root;
1474
* Marks all tables in the list which were used by current substatement
1475
* as free for reuse.
1477
* @param Head of the list of tables
1481
* The reason we reset query_id is that it's not enough to just test
1482
* if table->query_id != session->query_id to know if a table is in use.
1486
* SELECT f1_that_uses_t1() FROM t1;
1488
* In f1_that_uses_t1() we will see one instance of t1 where query_id is
1489
* set to query_id of original query.
1491
void mark_used_tables_as_free_for_reuse(Table *table);
1495
/** A short cut for session->main_da.set_ok_status(). */
1496
inline void my_ok(ha_rows affected_rows= 0, ha_rows found_rows_arg= 0,
1497
uint64_t passed_id= 0, const char *message= NULL)
1499
main_da.set_ok_status(this, affected_rows, found_rows_arg, passed_id, message);
1503
/** A short cut for session->main_da.set_eof_status(). */
1505
inline void my_eof()
1507
main_da.set_eof_status(this);
1510
/* Some inline functions for more speed */
1512
inline bool add_item_to_list(Item *item)
1514
return lex->current_select->add_item_to_list(this, item);
1517
inline bool add_value_to_list(Item *value)
1519
return lex->value_list.push_back(value);
1522
inline bool add_order_to_list(Item *item, bool asc)
1524
return lex->current_select->add_order_to_list(this, item, asc);
1527
inline bool add_group_to_list(Item *item, bool asc)
1529
return lex->current_select->add_group_to_list(this, item, asc);
1531
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;
1799
MEM_ROOT main_mem_root;
1803
/** A short cut for session->main_da.set_ok_status(). */
1806
my_ok(Session *session, ha_rows affected_rows= 0, uint64_t id= 0,
1807
const char *message= NULL)
1809
session->main_da.set_ok_status(session, affected_rows, id, message);
1813
/** A short cut for session->main_da.set_eof_status(). */
1816
my_eof(Session *session)
1818
session->main_da.set_eof_status(session);
1821
#define tmp_disable_binlog(A) \
1822
{uint64_t tmp_disable_binlog__save_options= (A)->options; \
1823
(A)->options&= ~OPTION_BIN_LOG
1825
#define reenable_binlog(A) (A)->options= tmp_disable_binlog__save_options;}
1829
Used to hold information about file and file structure in exchange
1830
via non-DB file (...INTO OUTFILE..., ...LOAD DATA...)
1831
XXX: We never call destructor for objects of this class.
1834
class sql_exchange :public Sql_alloc
1837
enum enum_filetype filetype; /* load XML, Added by Arnold & Erik */
1839
String *field_term,*enclosed,*line_term,*line_start,*escaped;
1843
const CHARSET_INFO *cs;
1844
sql_exchange(char *name, bool dumpfile_flag,
1845
enum_filetype filetype_arg= FILETYPE_CSV);
1848
#include "log_event.h"
1851
This is used to get result from a select
1856
class select_result :public Sql_alloc {
1859
SELECT_LEX_UNIT *unit;
1862
virtual ~select_result() {};
1863
virtual int prepare(List<Item> &,
1869
virtual int prepare2(void) { return 0; }
1871
Because of peculiarities of prepared statements protocol
1872
we need to know number of columns in the result set (if
1873
there is a result set) apart from sending columns metadata.
1875
virtual uint32_t field_count(List<Item> &fields) const
1876
{ return fields.elements; }
1877
virtual bool send_fields(List<Item> &list, uint32_t flags)=0;
1878
virtual bool send_data(List<Item> &items)=0;
1879
virtual bool initialize_tables (JOIN *)
1881
virtual void send_error(uint32_t errcode,const char *err);
1882
virtual bool send_eof()=0;
1884
Check if this query returns a result set and therefore is allowed in
1885
cursors and set an error message if it is not the case.
1887
@retval false success
1888
@retval true error, an error message is set
1890
virtual bool check_simple_select() const;
1891
virtual void abort() {}
1893
Cleanup instance of this class for next execution of a prepared
1894
statement/stored procedure.
1896
virtual void cleanup();
1897
void set_session(Session *session_arg) { session= session_arg; }
1898
void begin_dataset() {}
1903
Base class for select_result descendands which intercept and
1904
transform result set rows. As the rows are not sent to the client,
1905
sending of result set metadata should be suppressed as well.
1908
class select_result_interceptor: public select_result
1911
select_result_interceptor() {} /* Remove gcc warning */
1912
uint32_t field_count(List<Item> &) const
1914
bool send_fields(List<Item> &,
1920
class select_send :public select_result {
1922
True if we have sent result set metadata to the client.
1923
In this case the client always expects us to end the result
1924
set with an eof or error packet
1926
bool is_result_set_started;
1928
select_send() :is_result_set_started(false) {}
1929
bool send_fields(List<Item> &list, uint32_t flags);
1930
bool send_data(List<Item> &items);
1932
virtual bool check_simple_select() const { return false; }
1934
virtual void cleanup();
1938
class select_to_file :public select_result_interceptor {
1940
sql_exchange *exchange;
1944
char path[FN_REFLEN];
1947
select_to_file(sql_exchange *ex) :exchange(ex), file(-1),row_count(0L)
1950
void send_error(uint32_t errcode,const char *err);
1684
1956
#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
#include <drizzled/select_to_file.h>
1690
#include <drizzled/select_export.h>
1691
#include <drizzled/select_dump.h>
1692
#include <drizzled/select_insert.h>
1693
#include <drizzled/select_create.h>
1694
#include <drizzled/tmp_table_param.h>
1695
#include <drizzled/select_union.h>
1696
#include <drizzled/select_subselect.h>
1697
#include <drizzled/select_singlerow_subselect.h>
1698
#include <drizzled/select_max_min_finder_subselect.h>
1699
#include <drizzled/select_exists_subselect.h>
1705
* A structure used to describe sort information
1706
* for a field or item used in ORDER BY.
1960
List of all possible characters of a numeric value text representation.
1962
#define NUMERIC_CHARS ".0123456789e+-"
1965
class select_export :public select_to_file {
1966
uint32_t field_term_length;
1967
int field_sep_char,escape_char,line_sep_char;
1968
int field_term_char; // first char of FIELDS TERMINATED BY or MAX_INT
1970
The is_ambiguous_field_sep field is true if a value of the field_sep_char
1971
field is one of the 'n', 't', 'r' etc characters
1972
(see the READ_INFO::unescape method and the ESCAPE_CHARS constant value).
1974
bool is_ambiguous_field_sep;
1976
The is_ambiguous_field_term is true if field_sep_char contains the first
1977
char of the FIELDS TERMINATED BY (ENCLOSED BY is empty), and items can
1978
contain this character.
1980
bool is_ambiguous_field_term;
1982
The is_unsafe_field_sep field is true if a value of the field_sep_char
1983
field is one of the '0'..'9', '+', '-', '.' and 'e' characters
1984
(see the NUMERIC_CHARS constant value).
1986
bool is_unsafe_field_sep;
1987
bool fixed_row_size;
1989
select_export(sql_exchange *ex) :select_to_file(ex) {}
1991
int prepare(List<Item> &list, SELECT_LEX_UNIT *u);
1992
bool send_data(List<Item> &items);
1996
class select_dump :public select_to_file {
1998
select_dump(sql_exchange *ex) :select_to_file(ex) {}
1999
int prepare(List<Item> &list, SELECT_LEX_UNIT *u);
2000
bool send_data(List<Item> &items);
2004
class select_insert :public select_result_interceptor {
2006
TableList *table_list;
2009
uint64_t autoinc_value_of_last_inserted_row; // autogenerated or not
2011
bool insert_into_view;
2012
select_insert(TableList *table_list_par,
2013
Table *table_par, List<Item> *fields_par,
2014
List<Item> *update_fields, List<Item> *update_values,
2015
enum_duplicates duplic, bool ignore);
2017
int prepare(List<Item> &list, SELECT_LEX_UNIT *u);
2018
virtual int prepare2(void);
2019
bool send_data(List<Item> &items);
2020
virtual void store_values(List<Item> &values);
2021
virtual bool can_rollback_data() { return 0; }
2022
void send_error(uint32_t errcode,const char *err);
2025
/* not implemented: select_insert is never re-used in prepared statements */
2030
class select_create: public select_insert {
2032
TableList *create_table;
2033
HA_CREATE_INFO *create_info;
2034
TableList *select_tables;
2035
Alter_info *alter_info;
2037
/* lock data for tmp table */
2038
DRIZZLE_LOCK *m_lock;
2039
/* m_lock or session->extra_lock */
2040
DRIZZLE_LOCK **m_plock;
2042
select_create (TableList *table_arg,
2043
HA_CREATE_INFO *create_info_par,
2044
Alter_info *alter_info_arg,
2045
List<Item> &select_fields,enum_duplicates duplic, bool ignore,
2046
TableList *select_tables_arg)
2047
:select_insert (NULL, NULL, &select_fields, 0, 0, duplic, ignore),
2048
create_table(table_arg),
2049
create_info(create_info_par),
2050
select_tables(select_tables_arg),
2051
alter_info(alter_info_arg),
2054
int prepare(List<Item> &list, SELECT_LEX_UNIT *u);
2056
void binlog_show_create_table(Table **tables, uint32_t count);
2057
void store_values(List<Item> &values);
2058
void send_error(uint32_t errcode,const char *err);
2061
virtual bool can_rollback_data() { return 1; }
2063
// Needed for access from local class MY_HOOKS in prepare(), since session is proteted.
2064
const Session *get_session(void) { return session; }
2065
const HA_CREATE_INFO *get_create_info() { return create_info; };
2066
int prepare2(void) { return 0; }
2069
#include <storage/myisam/myisam.h>
2072
Param to create temporary tables when doing SELECT:s
2074
This structure is copied using memcpy as a part of JOIN.
2077
class TMP_TABLE_PARAM :public Sql_alloc
2080
/* Prevent use of these (not safe because of lists and copy_field) */
2081
TMP_TABLE_PARAM(const TMP_TABLE_PARAM &);
2082
void operator=(TMP_TABLE_PARAM &);
2085
List<Item> copy_funcs;
2086
List<Item> save_copy_funcs;
2087
Copy_field *copy_field, *copy_field_end;
2088
Copy_field *save_copy_field, *save_copy_field_end;
2089
unsigned char *group_buff;
2090
Item **items_to_copy; /* Fields in tmp table */
2091
MI_COLUMNDEF *recinfo,*start_recinfo;
2093
ha_rows end_write_records;
2094
uint field_count,sum_func_count,func_count;
2095
uint32_t hidden_field_count;
2096
uint group_parts,group_length,group_null_parts;
2098
bool using_indirect_summary_function;
2099
/* If >0 convert all blob fields to varchar(convert_blob_length) */
2100
uint32_t convert_blob_length;
2101
const CHARSET_INFO *table_charset;
2104
True if GROUP BY and its aggregate functions are already computed
2105
by a table access method (e.g. by loose index scan). In this case
2106
query execution should not perform aggregation and should treat
2107
aggregate functions as normal functions.
2109
bool precomputed_group_by;
2110
bool force_copy_fields;
2112
If true, create_tmp_field called from create_tmp_table will convert
2113
all BIT fields to 64-bit longs. This is a workaround the limitation
2114
that MEMORY tables cannot index BIT columns.
2116
bool bit_fields_as_long;
2119
:copy_field(0), group_parts(0),
2120
group_length(0), group_null_parts(0), convert_blob_length(0),
2121
schema_table(0), precomputed_group_by(0), force_copy_fields(0),
2122
bit_fields_as_long(0)
2129
inline void cleanup(void)
2131
if (copy_field) /* Fix for Intel compiler */
2133
delete [] copy_field;
2134
save_copy_field= copy_field= 0;
2139
class select_union :public select_result_interceptor
2141
TMP_TABLE_PARAM tmp_table_param;
2145
select_union() :table(0) {}
2146
int prepare(List<Item> &list, SELECT_LEX_UNIT *u);
2147
bool send_data(List<Item> &items);
2151
bool create_result_table(Session *session, List<Item> *column_types,
2152
bool is_distinct, uint64_t options,
2153
const char *alias, bool bit_fields_as_long);
2156
/* Base subselect interface class */
2157
class select_subselect :public select_result_interceptor
2160
Item_subselect *item;
2162
select_subselect(Item_subselect *item);
2163
bool send_data(List<Item> &items)=0;
2164
bool send_eof() { return 0; };
2167
/* Single value subselect interface class */
2168
class select_singlerow_subselect :public select_subselect
2171
select_singlerow_subselect(Item_subselect *item_arg)
2172
:select_subselect(item_arg)
2174
bool send_data(List<Item> &items);
2177
/* used in independent ALL/ANY optimisation */
2178
class select_max_min_finder_subselect :public select_subselect
2181
bool (select_max_min_finder_subselect::*op)();
2184
select_max_min_finder_subselect(Item_subselect *item_arg, bool mx)
2185
:select_subselect(item_arg), cache(0), fmax(mx)
2188
bool send_data(List<Item> &items);
2195
/* EXISTS subselect interface class */
2196
class select_exists_subselect :public select_subselect
2199
select_exists_subselect(Item_subselect *item_arg)
2200
:select_subselect(item_arg){}
2201
bool send_data(List<Item> &items);
2204
/* Structs used when sorting */
2206
typedef struct st_sort_field {
2207
Field *field; /* Field to sort */
2208
Item *item; /* Item if not sorting fields */
2209
uint length; /* Length of sort field */
2210
uint32_t suffix_length; /* Length suffix (0-4) */
2211
Item_result result_type; /* Type of item */
2212
bool reverse; /* if descending sort */
2213
bool need_strxnfrm; /* If we have to use strxnfrm() */
2217
typedef struct st_sort_buffer {
2218
uint32_t index; /* 0 or 1 */
2219
uint32_t sort_orders;
2220
uint32_t change_pos; /* If sort-fields changed */
2222
SORT_FIELD *sortorder;
2225
/* Structure for db & table in sql_yacc */
2227
class Table_ident :public Sql_alloc
2232
SELECT_LEX_UNIT *sel;
2233
inline Table_ident(Session *session, LEX_STRING db_arg, LEX_STRING table_arg,
2235
:table(table_arg), sel((SELECT_LEX_UNIT *)0)
2237
if (!force && (session->client_capabilities & CLIENT_NO_SCHEMA))
2242
inline Table_ident(LEX_STRING table_arg)
2243
:table(table_arg), sel((SELECT_LEX_UNIT *)0)
2248
This constructor is used only for the case when we create a derived
2249
table. A derived table has no name and doesn't belong to any database.
2250
Later, if there was an alias specified for the table, it will be set
2251
by add_table_to_list.
2253
inline Table_ident(SELECT_LEX_UNIT *s) : sel(s)
2255
/* We must have a table name here as this is used with add_table_to_list */
2256
db.str= empty_c_string; /* a subject to casedn_str */
2258
table.str= internal_table_name;
2261
bool is_derived_table() const { return test(sel); }
2262
inline void change_db(char *db_name)
2264
db.str= db_name; db.length= (uint) strlen(db_name);
2268
// this is needed for user_vars hash
2269
class user_var_entry
2272
user_var_entry() {} /* Remove gcc warning */
2276
query_id_t update_query_id, used_query_id;
2280
double val_real(bool *null_value);
2281
int64_t val_int(bool *null_value) const;
2282
String *val_str(bool *null_value, String *str, uint32_t decimals);
2283
my_decimal *val_decimal(bool *null_value, my_decimal *result);
2284
DTCollation collation;
2288
Unique -- class for unique (removing of duplicates).
2289
Puts all values to the TREE. If the tree becomes too big,
2290
it's dumped to the file. User can request sorted values, or
2291
just iterate through them. In the last case tree merging is performed in
2292
memory simultaneously with iteration, so it should be ~2-3x faster.
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 */
1735
#include <drizzled/table_ident.h>
1736
#include <drizzled/user_var_entry.h>
1737
#include <drizzled/unique.h>
1738
#include <drizzled/var.h>
1739
#include <drizzled/select_dumpvar.h>
2295
class Unique :public Sql_alloc
2297
DYNAMIC_ARRAY file_ptrs;
2299
uint64_t max_in_memory_size;
2302
unsigned char *record_pointers;
2308
Unique(qsort_cmp2 comp_func, void *comp_func_fixed_arg,
2309
uint32_t size_arg, uint64_t max_in_memory_size_arg);
2311
ulong elements_in_tree() { return tree.elements_in_tree; }
2312
inline bool unique_add(void *ptr)
2314
if (tree.elements_in_tree > max_elements && flush())
2316
return(!tree_insert(&tree, ptr, 0, tree.custom_arg));
2319
bool get(Table *table);
2320
static double get_use_cost(uint32_t *buffer, uint32_t nkeys, uint32_t key_size,
2321
uint64_t max_in_memory_size);
2322
inline static int get_cost_calc_buff_size(ulong nkeys, uint32_t key_size,
2323
uint64_t max_in_memory_size)
2325
register uint64_t max_elems_in_tree=
2326
(1 + max_in_memory_size / ALIGN_SIZE(sizeof(TREE_ELEMENT)+key_size));
2327
return (int) (sizeof(uint)*(1 + nkeys/max_elems_in_tree));
2331
bool walk(tree_walk_action action, void *walk_action_arg);
2333
friend int unique_write_to_file(unsigned char* key, element_count count, Unique *unique);
2334
friend int unique_write_to_ptrs(unsigned char* key, element_count count, Unique *unique);
2338
class multi_delete :public select_result_interceptor
2340
TableList *delete_tables, *table_being_deleted;
2342
ha_rows deleted, found;
2343
uint32_t num_of_tables;
2346
/* True if at least one table we delete from is transactional */
2347
bool transactional_tables;
2348
/* True if at least one table we delete from is not transactional */
2350
bool delete_while_scanning;
2352
error handling (rollback and binlogging) can happen in send_eof()
2353
so that afterward send_error() needs to find out that.
2358
multi_delete(TableList *dt, uint32_t num_of_tables);
2360
int prepare(List<Item> &list, SELECT_LEX_UNIT *u);
2361
bool send_data(List<Item> &items);
2362
bool initialize_tables (JOIN *join);
2363
void send_error(uint32_t errcode,const char *err);
2366
virtual void abort();
2370
class multi_update :public select_result_interceptor
2372
TableList *all_tables; /* query/update command tables */
2373
TableList *leaves; /* list of leves of join table tree */
2374
TableList *update_tables, *table_being_updated;
2375
Table **tmp_tables, *main_table, *table_to_update;
2376
TMP_TABLE_PARAM *tmp_table_param;
2377
ha_rows updated, found;
2378
List <Item> *fields, *values;
2379
List <Item> **fields_for_table, **values_for_table;
2380
uint32_t table_count;
2382
List of tables referenced in the CHECK OPTION condition of
2383
the updated view excluding the updated table.
2385
List <Table> unupdated_check_opt_tables;
2386
Copy_field *copy_field;
2387
enum enum_duplicates handle_duplicates;
2388
bool do_update, trans_safe;
2389
/* True if the update operation has made a change in a transactional table */
2390
bool transactional_tables;
2393
error handling (rollback and binlogging) can happen in send_eof()
2394
so that afterward send_error() needs to find out that.
2399
multi_update(TableList *ut, TableList *leaves_list,
2400
List<Item> *fields, List<Item> *values,
2401
enum_duplicates handle_duplicates, bool ignore);
2403
int prepare(List<Item> &list, SELECT_LEX_UNIT *u);
2404
bool send_data(List<Item> &items);
2405
bool initialize_tables (JOIN *join);
2406
void send_error(uint32_t errcode,const char *err);
2409
virtual void abort();
2412
class my_var : public Sql_alloc {
2417
enum_field_types type;
2418
my_var (LEX_STRING& j, bool i, uint32_t o, enum_field_types t)
2419
:s(j), local(i), offset(o), type(t)
2424
class select_dumpvar :public select_result_interceptor {
2427
List<my_var> var_list;
2428
select_dumpvar() { var_list.empty(); row_count= 0;}
2429
~select_dumpvar() {}
2430
int prepare(List<Item> &list, SELECT_LEX_UNIT *u);
2431
bool send_data(List<Item> &items);
2433
virtual bool check_simple_select() const;
1744
2437
/* Bits in sql_command_flags */
1746
enum sql_command_flag_bits
1748
CF_BIT_CHANGES_DATA,
1749
CF_BIT_HAS_ROW_COUNT,
1750
CF_BIT_STATUS_COMMAND,
1751
CF_BIT_SHOW_TABLE_COMMAND,
1752
CF_BIT_WRITE_LOGS_COMMAND,
1756
static const std::bitset<CF_BIT_SIZE> CF_CHANGES_DATA(1 << CF_BIT_CHANGES_DATA);
1757
static const std::bitset<CF_BIT_SIZE> CF_HAS_ROW_COUNT(1 << CF_BIT_HAS_ROW_COUNT);
1758
static const std::bitset<CF_BIT_SIZE> CF_STATUS_COMMAND(1 << CF_BIT_STATUS_COMMAND);
1759
static const std::bitset<CF_BIT_SIZE> CF_SHOW_TABLE_COMMAND(1 << CF_BIT_SHOW_TABLE_COMMAND);
1760
static const std::bitset<CF_BIT_SIZE> CF_WRITE_LOGS_COMMAND(1 << CF_BIT_WRITE_LOGS_COMMAND);
1763
const std::string &type(drizzled::Session::global_read_lock_t type);
1764
size_t max_string_length(drizzled::Session::global_read_lock_t type);
1766
} /* namespace display */
1768
} /* namespace drizzled */
1770
#endif /* DRIZZLED_SESSION_H */
2439
#define CF_CHANGES_DATA 1
2440
#define CF_HAS_ROW_COUNT 2
2441
#define CF_STATUS_COMMAND 4
2442
#define CF_SHOW_TABLE_COMMAND 8
2443
#define CF_WRITE_LOGS_COMMAND 16
2445
/* Functions in sql_class.cc */
2447
void add_to_status(STATUS_VAR *to_var, STATUS_VAR *from_var);
2449
void add_diff_to_status(STATUS_VAR *to_var, STATUS_VAR *from_var,
2450
STATUS_VAR *dec_var);
2452
void close_connection(Session *session, uint32_t errcode, bool lock);
2454
#endif /* DRIZZLE_SERVER */
2456
#endif /* DRIZZLED_SQL_CLASS_H */