142
88
List<Item> *update_fields;
143
89
List<Item> *update_values;
144
90
/* for VIEW ... WITH CHECK OPTION */
162
} /* namespace drizzled */
164
/** @TODO why is this in the middle of the file */
165
#include <drizzled/lex_column.h>
94
class Key_part_spec :public Sql_alloc {
96
LEX_STRING field_name;
98
Key_part_spec(const LEX_STRING &name, uint len)
99
: field_name(name), length(len)
101
Key_part_spec(const char *name, const size_t name_len, uint len)
103
{ field_name.str= (char *)name; field_name.length= name_len; }
104
bool operator==(const Key_part_spec& other) const;
106
Construct a copy of this Key_part_spec. field_name is copied
107
by-pointer as it is known to never change. At the same time
108
'length' may be reset in mysql_prepare_create_table, and this
109
is why we supply it with a copy.
111
@return If out of memory, 0 is returned and an error is set in
114
Key_part_spec *clone(MEM_ROOT *mem_root) const
115
{ return new (mem_root) Key_part_spec(*this); }
119
class Alter_drop :public Sql_alloc {
121
enum drop_type {KEY, COLUMN };
124
Alter_drop(enum drop_type par_type,const char *par_name)
125
:name(par_name), type(par_type) {}
127
Used to make a clone of this object for ALTER/CREATE TABLE
128
@sa comment for Key_part_spec::clone
130
Alter_drop *clone(MEM_ROOT *mem_root) const
131
{ return new (mem_root) Alter_drop(*this); }
135
class Alter_column :public Sql_alloc {
139
Alter_column(const char *par_name,Item *literal)
140
:name(par_name), def(literal) {}
142
Used to make a clone of this object for ALTER/CREATE TABLE
143
@sa comment for Key_part_spec::clone
145
Alter_column *clone(MEM_ROOT *mem_root) const
146
{ return new (mem_root) Alter_column(*this); }
150
class Key :public Sql_alloc {
152
enum Keytype { PRIMARY, UNIQUE, MULTIPLE, FOREIGN_KEY};
154
KEY_CREATE_INFO key_create_info;
155
List<Key_part_spec> columns;
159
Key(enum Keytype type_par, const LEX_STRING &name_arg,
160
KEY_CREATE_INFO *key_info_arg,
161
bool generated_arg, List<Key_part_spec> &cols)
162
:type(type_par), key_create_info(*key_info_arg), columns(cols),
163
name(name_arg), generated(generated_arg)
165
Key(enum Keytype type_par, const char *name_arg, size_t name_len_arg,
166
KEY_CREATE_INFO *key_info_arg, bool generated_arg,
167
List<Key_part_spec> &cols)
168
:type(type_par), key_create_info(*key_info_arg), columns(cols),
169
generated(generated_arg)
171
name.str= (char *)name_arg;
172
name.length= name_len_arg;
174
Key(const Key &rhs, MEM_ROOT *mem_root);
176
/* Equality comparison of keys (ignoring name) */
177
friend bool foreign_key_prefix(Key *a, Key *b);
179
Used to make a clone of this object for ALTER/CREATE TABLE
180
@sa comment for Key_part_spec::clone
182
virtual Key *clone(MEM_ROOT *mem_root) const
183
{ return new (mem_root) Key(*this, mem_root); }
188
class Foreign_key: public Key {
190
enum fk_match_opt { FK_MATCH_UNDEF, FK_MATCH_FULL,
191
FK_MATCH_PARTIAL, FK_MATCH_SIMPLE};
192
enum fk_option { FK_OPTION_UNDEF, FK_OPTION_RESTRICT, FK_OPTION_CASCADE,
193
FK_OPTION_SET_NULL, FK_OPTION_NO_ACTION, FK_OPTION_DEFAULT};
195
Table_ident *ref_table;
196
List<Key_part_spec> ref_columns;
197
uint delete_opt, update_opt, match_opt;
198
Foreign_key(const LEX_STRING &name_arg, List<Key_part_spec> &cols,
199
Table_ident *table, List<Key_part_spec> &ref_cols,
200
uint delete_opt_arg, uint update_opt_arg, uint match_opt_arg)
201
:Key(FOREIGN_KEY, name_arg, &default_key_create_info, 0, cols),
202
ref_table(table), ref_columns(ref_cols),
203
delete_opt(delete_opt_arg), update_opt(update_opt_arg),
204
match_opt(match_opt_arg)
206
Foreign_key(const Foreign_key &rhs, MEM_ROOT *mem_root);
208
Used to make a clone of this object for ALTER/CREATE TABLE
209
@sa comment for Key_part_spec::clone
211
virtual Key *clone(MEM_ROOT *mem_root) const
212
{ return new (mem_root) Foreign_key(*this, mem_root); }
215
typedef struct st_mysql_lock
218
uint table_count,lock_count;
219
THR_LOCK_DATA **locks;
223
class LEX_COLUMN : public Sql_alloc
228
LEX_COLUMN (const String& x,const uint& y ): column (x),rights (y) {}
231
#include "sql_lex.h" /* Must be here */
170
233
class select_result;
173
#define Session_SENTRY_MAGIC 0xfeedd1ff
174
#define Session_SENTRY_GONE 0xdeadbeef
176
struct drizzle_system_variables
236
#define THD_SENTRY_MAGIC 0xfeedd1ff
237
#define THD_SENTRY_GONE 0xdeadbeef
239
#define THD_CHECK_SENTRY(thd) assert(thd->dbug_sentry == THD_SENTRY_MAGIC)
241
struct system_variables
178
drizzle_system_variables()
181
244
How dynamically allocated system variables are handled:
183
246
The global_system_variables and max_system_variables are "authoritative"
184
247
They both should have the same 'version' and 'size'.
185
248
When attempting to access a dynamic variable, if the session version
186
249
is out of date, then the session version is updated and realloced if
187
250
neccessary and bytes copied from global to make up for missing data.
189
252
ulong dynamic_variables_version;
190
char * dynamic_variables_ptr;
191
uint32_t dynamic_variables_head; /* largest valid variable offset */
192
uint32_t dynamic_variables_size; /* how many bytes are in use */
253
char* dynamic_variables_ptr;
254
uint dynamic_variables_head; /* largest valid variable offset */
255
uint dynamic_variables_size; /* how many bytes are in use */
194
257
uint64_t myisam_max_extra_sort_file_size;
258
uint64_t myisam_max_sort_file_size;
195
259
uint64_t max_heap_table_size;
196
260
uint64_t tmp_table_size;
261
uint64_t long_query_time;
197
262
ha_rows select_limit;
198
263
ha_rows max_join_size;
199
uint64_t auto_increment_increment;
200
uint64_t auto_increment_offset;
201
uint64_t bulk_insert_buff_size;
202
uint64_t join_buff_size;
203
uint32_t max_allowed_packet;
204
uint64_t max_error_count;
205
uint64_t max_length_for_sort_data;
206
size_t max_sort_length;
207
uint64_t min_examined_row_limit;
208
bool optimizer_prune_level;
211
uint32_t optimizer_search_depth;
212
uint32_t div_precincrement;
213
uint64_t preload_buff_size;
214
uint32_t read_buff_size;
215
uint32_t read_rnd_buff_size;
216
bool replicate_query;
217
size_t sortbuff_size;
218
uint32_t thread_handling;
219
uint32_t tx_isolation;
220
size_t transaction_message_threshold;
221
uint32_t completion_type;
264
ulong auto_increment_increment, auto_increment_offset;
265
ulong bulk_insert_buff_size;
266
ulong join_buff_size;
267
ulong max_allowed_packet;
268
ulong max_error_count;
269
ulong max_length_for_sort_data;
270
ulong max_sort_length;
271
ulong max_tmp_tables;
272
ulong min_examined_row_limit;
273
ulong myisam_repair_threads;
274
ulong myisam_sort_buff_size;
275
ulong myisam_stats_method;
276
ulong net_buffer_length;
277
ulong net_interactive_timeout;
278
ulong net_read_timeout;
279
ulong net_retry_count;
280
ulong net_wait_timeout;
281
ulong net_write_timeout;
282
ulong optimizer_prune_level;
283
ulong optimizer_search_depth;
285
Controls use of Engine-MRR:
286
0 - auto, based on cost
287
1 - force MRR when the storage engine is capable of doing it
290
ulong optimizer_use_mrr;
291
/* A bitmap for switching optimizations on/off */
292
ulong optimizer_switch;
293
ulong preload_buff_size;
294
ulong profiling_history_size;
295
ulong query_cache_type;
296
ulong read_buff_size;
297
ulong read_rnd_buff_size;
298
ulong div_precincrement;
300
ulong thread_handling;
302
ulong completion_type;
222
303
/* Determines which non-standard SQL behaviour should be enabled */
224
uint64_t max_seeks_for_key;
225
size_t range_alloc_block_size;
226
uint32_t query_alloc_block_size;
227
uint32_t query_prealloc_size;
228
uint64_t group_concat_max_len;
229
uint64_t pseudo_thread_id;
231
plugin::StorageEngine *storage_engine;
305
ulong default_week_format;
306
ulong max_seeks_for_key;
307
ulong range_alloc_block_size;
308
ulong query_alloc_block_size;
309
ulong query_prealloc_size;
310
ulong trans_alloc_block_size;
311
ulong trans_prealloc_size;
313
ulong group_concat_max_len;
314
ulong binlog_format; // binlog format for this thd (see enum_binlog_format)
316
In slave thread we need to know in behalf of which
317
thread the query is being run to replicate temp tables properly
319
my_thread_id pseudo_thread_id;
321
bool low_priority_updates;
324
compatibility option:
325
- index usage hints (USE INDEX without a FOR clause) behave as in 5.0
328
bool engine_condition_pushdown;
329
bool keep_files_on_create;
331
bool old_alter_table;
333
plugin_ref table_plugin;
233
335
/* Only charset part of these variables is sensible */
234
336
const CHARSET_INFO *character_set_filesystem;
337
const CHARSET_INFO *character_set_client;
338
const CHARSET_INFO *character_set_results;
236
340
/* Both charset and collation parts of these variables are important */
237
341
const CHARSET_INFO *collation_server;
239
inline const CHARSET_INFO *getCollation(void)
241
return collation_server;
342
const CHARSET_INFO *collation_database;
343
const CHARSET_INFO *collation_connection;
244
345
/* Locale Support */
245
346
MY_LOCALE *lc_time_names;
247
348
Time_zone *time_zone;
250
extern struct drizzle_system_variables global_system_variables;
252
} /* namespace drizzled */
254
#include "drizzled/sql_lex.h"
259
void mark_transaction_to_rollback(Session *session, bool all);
262
Storage engine specific thread local data.
267
Storage engine specific thread local data.
268
Lifetime: one user connection.
272
* Resource contexts for both the "statement" and "normal"
275
* Resource context at index 0:
277
* Life time: one statement within a transaction. If @@autocommit is
278
* on, also represents the entire transaction.
280
* Resource context at index 1:
282
* Life time: one transaction within a connection.
286
* If the storage engine does not participate in a transaction,
287
* there will not be a resource context.
289
drizzled::ResourceContext resource_context[2];
291
Ha_data() :ha_ptr(NULL) {}
295
* Represents a client connection to the database server.
297
* Contains the client/server protocol object, the current statement
298
* being executed, local-to-session variables and status counters, and
299
* a host of other information.
303
* The Session class should have a vector of Statement object pointers which
304
* comprise the statements executed on the Session. Until this architectural
305
* change is done, we can forget about parallel operations inside a session.
309
* Make member variables private and have inlined accessors and setters. Hide
310
* all member variables that are not critical to non-internal operations of the
313
typedef int64_t session_id_t;
315
class Session : public Open_tables_state
318
// Plugin storage in Session.
319
typedef boost::unordered_map<std::string, util::Storable *, util::insensitive_hash, util::insensitive_equal_to> PropertyMap;
320
typedef Session* Ptr;
321
typedef boost::shared_ptr<Session> shared_ptr;
350
/* DATE, DATETIME and DRIZZLE_TIME formats */
351
DATE_TIME_FORMAT *date_format;
352
DATE_TIME_FORMAT *datetime_format;
353
DATE_TIME_FORMAT *time_format;
359
/* per thread status variables */
361
typedef struct system_status_var
363
uint64_t bytes_received;
366
ulong com_stat[(uint) SQLCOM_END];
367
ulong created_tmp_disk_tables;
368
ulong created_tmp_tables;
369
ulong ha_commit_count;
370
ulong ha_delete_count;
371
ulong ha_read_first_count;
372
ulong ha_read_last_count;
373
ulong ha_read_key_count;
374
ulong ha_read_next_count;
375
ulong ha_read_prev_count;
376
ulong ha_read_rnd_count;
377
ulong ha_read_rnd_next_count;
378
ulong ha_rollback_count;
379
ulong ha_update_count;
380
ulong ha_write_count;
381
ulong ha_prepare_count;
382
ulong ha_discover_count;
383
ulong ha_savepoint_count;
384
ulong ha_savepoint_rollback_count;
386
/* KEY_CACHE parts. These are copies of the original */
387
ulong key_blocks_changed;
388
ulong key_blocks_used;
389
ulong key_cache_r_requests;
390
ulong key_cache_read;
391
ulong key_cache_w_requests;
392
ulong key_cache_write;
393
/* END OF KEY_CACHE parts */
395
ulong net_big_packet_count;
398
ulong select_full_join_count;
399
ulong select_full_range_join_count;
400
ulong select_range_count;
401
ulong select_range_check_count;
402
ulong select_scan_count;
403
ulong long_query_count;
404
ulong filesort_merge_passes;
405
ulong filesort_range_count;
407
ulong filesort_scan_count;
408
/* Prepared statements and binary protocol */
409
ulong com_stmt_prepare;
410
ulong com_stmt_execute;
411
ulong com_stmt_send_long_data;
412
ulong com_stmt_fetch;
413
ulong com_stmt_reset;
414
ulong com_stmt_close;
416
Number of statements sent from the client
422
SEE last_system_status_var DEFINITION BELOW.
424
Below 'last_system_status_var' are all variables which doesn't make any
425
sense to add to the /global/ status variable counter.
427
double last_query_cost;
433
This is used for 'SHOW STATUS'. It must be updated to the last ulong
434
variable in system_status_var which is makes sens to add to the global
438
#define last_system_status_var questions
440
void mark_transaction_to_rollback(THD *thd, bool all);
442
#ifdef DRIZZLE_SERVER
444
#define INIT_ARENA_DBUG_INFO is_backup_arena= 0
450
List of items created in the parser for this query. Every item puts
451
itself to the list on creation (see Item::Item() for details))
454
MEM_ROOT *mem_root; // Pointer to current memroot
455
bool is_backup_arena; /* True if this arena is used for backup. */
458
The states relfects three diffrent life cycles for three
459
different types of statements:
460
Prepared statement: INITIALIZED -> PREPARED -> EXECUTED.
461
Stored procedure: INITIALIZED_FOR_SP -> EXECUTED.
462
Other statements: CONVENTIONAL_EXECUTION never changes.
467
CONVENTIONAL_EXECUTION= 3, EXECUTED= 4, ERROR= -1
472
Query_arena(MEM_ROOT *mem_root_arg, enum enum_state state_arg) :
473
free_list(0), mem_root(mem_root_arg), state(state_arg)
474
{ INIT_ARENA_DBUG_INFO; }
476
This constructor is used only when Query_arena is created as
477
backup storage for another instance of Query_arena.
479
Query_arena() { INIT_ARENA_DBUG_INFO; }
481
virtual ~Query_arena() {};
483
inline bool is_conventional() const
484
{ assert(state == CONVENTIONAL_EXECUTION); return state == CONVENTIONAL_EXECUTION; }
486
inline void* alloc(size_t size) { return alloc_root(mem_root,size); }
487
inline void* calloc(size_t size)
490
if ((ptr=alloc_root(mem_root,size)))
491
memset(ptr, 0, size);
494
inline char *strdup(const char *str)
495
{ return strdup_root(mem_root,str); }
496
inline char *strmake(const char *str, size_t size)
497
{ return strmake_root(mem_root,str,size); }
498
inline void *memdup(const void *str, size_t size)
499
{ return memdup_root(mem_root,str,size); }
500
inline void *memdup_w_gap(const void *str, size_t size, uint gap)
503
if ((ptr= alloc_root(mem_root,size+gap)))
504
memcpy(ptr,str,size);
508
void set_query_arena(Query_arena *set);
511
/* Close the active state associated with execution of this statement */
512
virtual void cleanup_stmt();
518
@brief State of a single command executed against this connection.
520
One connection can contain a lot of simultaneously running statements,
521
some of which could be:
522
- prepared, that is, contain placeholders,
523
To perform some action with statement we reset THD part to the state of
524
that statement, do the action, and then save back modified state from THD
525
to the statement. It will be changed in near future, and Statement will
529
class Statement: public ilink, public Query_arena
531
Statement(const Statement &rhs); /* not implemented: */
532
Statement &operator=(const Statement &rhs); /* non-copyable */
535
Uniquely identifies each statement object in thread scope; change during
536
statement lifetime. FIXME: must be const
324
541
MARK_COLUMNS_NONE: Means mark_used_colums is not set and no indicator to
325
542
handler of fields used is set
326
543
MARK_COLUMNS_READ: Means a bit in read set is set to inform handler
327
544
that the field is to be read. If field list contains
328
duplicates, then session->dup_field is set to point
545
duplicates, then thd->dup_field is set to point
329
546
to the last found duplicate.
330
547
MARK_COLUMNS_WRITE: Means a bit is set in write set to inform handler
331
548
that it needs to update this field in write_row
334
551
enum enum_mark_columns mark_used_columns;
335
inline void* alloc(size_t size)
337
return mem_root->alloc_root(size);
339
inline void* calloc(size_t size)
342
if ((ptr= mem_root->alloc_root(size)))
343
memset(ptr, 0, size);
346
inline char *strdup(const char *str)
348
return mem_root->strdup_root(str);
350
inline char *strmake(const char *str, size_t size)
352
return mem_root->strmake_root(str,size);
354
inline void *memdup(const void *str, size_t size)
356
return mem_root->memdup_root(str, size);
358
inline void *memdup_w_gap(const void *str, size_t size, uint32_t gap)
361
if ((ptr= mem_root->alloc_root(size + gap)))
362
memcpy(ptr,str,size);
365
/** Frees all items attached to this Statement */
368
* List of items created in the parser for this query. Every item puts
369
* itself to the list on creation (see Item::Item() for details))
372
memory::Root *mem_root; /**< Pointer to current memroot */
375
memory::Root *getMemRoot()
387
void setXaId(uint64_t in_xa_id)
393
* Uniquely identifies each statement object in thread scope; change during
394
* statement lifetime.
396
* @todo should be const
399
LEX *lex; /**< parse tree descriptor */
405
/** query associated with this statement */
406
typedef boost::shared_ptr<const std::string> QueryString;
408
boost::shared_ptr<std::string> query;
410
// Never allow for a modification of this outside of the class. c_str()
411
// requires under some setup non const, you must copy the QueryString in
414
QueryString getQueryString() const
419
void resetQueryString()
553
LEX_STRING name; /* name for named prepared statements */
554
LEX *lex; // parse tree descriptor
426
We need to copy the lock on the string in order to make sure we have a stable string.
427
Once this is done we can use it to build a const char* which can be handed off for
428
a method to use (Innodb is currently the only engine using this).
556
Points to the query associated with this statement. It's const, but
557
we need to declare it char * because all table handlers are written
558
in C and need to point to it.
560
Note that (A) if we set query = NULL, we must at the same time set
561
query_length = 0, and protect the whole operation with the
562
LOCK_thread_count mutex. And (B) we are ONLY allowed to set query to a
563
non-NULL value if its previous value is NULL. We do not need to protect
564
operation (B) with any mutex. To avoid crashes in races, if we do not
565
know that thd->query cannot change at the moment, one should print
566
thd->query like this:
567
(1) reserve the LOCK_thread_count mutex;
568
(2) check if thd->query is NULL;
569
(3) if not NULL, then print at most thd->query_length characters from
570
it. We will see the query_length field as either 0, or the right value
572
Assuming that the write and read of an n-bit memory field in an n-bit
573
computer is atomic, we can avoid races in the above way.
574
This printing is needed at least in SHOW PROCESSLIST and SHOW INNODB
430
const char *getQueryStringCopy(size_t &length)
432
QueryString tmp_string(getQueryString());
441
length= tmp_string->length();
442
char *to_return= strmake(tmp_string->c_str(), tmp_string->length());
447
std::vector <char> _query;
450
typedef boost::shared_ptr<State> const_shared_ptr;
452
State(const char *in_packet, size_t in_packet_length)
454
if (in_packet_length)
456
size_t minimum= std::min(in_packet_length, static_cast<size_t>(PROCESS_LIST_WIDTH));
457
_query.resize(minimum + 1);
458
memcpy(&_query[0], in_packet, minimum);
466
const char *query() const
474
const char *query(size_t &size) const
478
size= _query.size() -1;
486
friend class Session;
487
typedef boost::shared_ptr<State> shared_ptr;
490
State::shared_ptr _state;
493
State::const_shared_ptr state()
578
uint32_t query_length; // current query length
499
581
Name of the current (default) database.
504
586
valid database name.
506
588
@note this attribute is set and alloced by the slave SQL thread (for
507
the Session of that thread); that thread is (and must remain, for now) the
589
the THD of that thread); that thread is (and must remain, for now) the
508
590
only responsible for freeing this member.
598
/* This constructor is called for backup statements */
601
Statement(LEX *lex_arg, MEM_ROOT *mem_root_arg,
602
enum enum_state state_arg, ulong id_arg);
605
/* Assign execution context (note: not all members) of given stmt to self */
606
void set_statement(Statement *stmt);
607
void set_n_backup_statement(Statement *stmt, Statement *backup);
608
void restore_backup_statement(Statement *stmt, Statement *backup);
611
struct st_savepoint {
612
struct st_savepoint *prev;
615
Ha_trx_info *ha_list;
618
enum xa_states {XA_NOTR=0, XA_ACTIVE, XA_IDLE, XA_PREPARED};
619
extern const char *xa_state_names[];
621
typedef struct st_xid_state {
622
/* For now, this is only used to catch duplicated external xids */
623
XID xid; // transaction identifier
624
enum xa_states xa_state; // used by external XA only
628
extern pthread_mutex_t LOCK_xid_cache;
629
extern HASH xid_cache;
630
bool xid_cache_init(void);
631
void xid_cache_free(void);
632
XID_STATE *xid_cache_search(XID *xid);
633
bool xid_cache_insert(XID *xid, enum xa_states xa_state);
634
bool xid_cache_insert(XID_STATE *xid_state);
635
void xid_cache_delete(XID_STATE *xid_state);
638
@class Security_context
639
@brief A set of THD members describing the current authenticated user.
642
class Security_context {
644
Security_context() {} /* Remove gcc warning */
646
host - host of the client
647
user - user of the client, set to NULL until the user has been read from
649
priv_user - The user privilege we are using. May be "" for anonymous user.
658
inline char *priv_host_name()
660
return (ip ? ip : (char *)"%");
666
A registry for item tree transformations performed during
667
query optimization. We register only those changes which require
668
a rollback to re-execute a prepared statement or stored procedure
672
struct Item_change_record;
673
typedef I_List<Item_change_record> Item_change_list;
677
Class that holds information about tables which were opened and locked
678
by the thread. It is also used to save/restore this information in
679
push_open_tables_state()/pop_open_tables_state().
682
class Open_tables_state
686
List of regular tables in use by this thread. Contains temporary and
687
base tables that were opened with @see open_tables().
691
List of temporary tables used by this thread. Contains user-level
692
temporary tables, created with CREATE TEMPORARY TABLE, and
693
internal temporary tables, created, e.g., to resolve a SELECT,
694
or for an intermediate table used in ALTER.
695
XXX Why are internal temporary tables added to this list?
697
Table *temporary_tables;
699
List of tables that were opened with HANDLER OPEN and are
700
still in use by this thread.
702
Table *handler_tables;
703
Table *derived_tables;
705
During a MySQL session, one can lock tables in two modes: automatic
706
or manual. In automatic mode all necessary tables are locked just before
707
statement execution, and all acquired locks are stored in 'lock'
708
member. Unlocking takes place automatically as well, when the
710
Manual mode comes into play when a user issues a 'LOCK TABLES'
711
statement. In this mode the user can only use the locked tables.
712
Trying to use any other tables will give an error. The locked tables are
713
stored in 'locked_tables' member. Manual locking is described in
714
the 'LOCK_TABLES' chapter of the MySQL manual.
715
See also lock_tables() for details.
719
Tables that were locked with explicit or implicit LOCK TABLES.
720
(Implicit LOCK TABLES happens when we are prelocking tables for
721
execution of statement which uses stored routines. See description
722
THD::prelocked_mode for more info.)
724
DRIZZLE_LOCK *locked_tables;
727
CREATE-SELECT keeps an extra lock for the table being
728
created. This field is used to keep the extra lock available for
729
lower level routines, which would otherwise miss that lock.
731
DRIZZLE_LOCK *extra_lock;
734
uint current_tablenr;
737
BACKUPS_AVAIL = (1U << 0) /* There are backups available */
741
Flags with information about the open tables state.
746
This constructor serves for creation of Open_tables_state instances
747
which are used as backup storage.
749
Open_tables_state() : state_flags(0U) { }
751
Open_tables_state(ulong version_arg);
753
void set_open_tables_state(Open_tables_state *state)
758
void reset_open_tables_state()
760
open_tables= temporary_tables= handler_tables= derived_tables= 0;
761
extra_lock= lock= locked_tables= 0;
767
@class Sub_statement_state
768
@brief Used to save context when executing a function or trigger
771
/* Defines used for Sub_statement_state::in_sub_stmt */
773
#define SUB_STMT_TRIGGER 1
774
#define SUB_STMT_FUNCTION 2
777
class Sub_statement_state
781
uint64_t first_successful_insert_id_in_prev_stmt;
782
uint64_t first_successful_insert_id_in_cur_stmt, insert_id_for_cur_row;
783
Discrete_interval auto_inc_interval_for_cur_row;
784
Discrete_intervals_list auto_inc_intervals_forced;
785
uint64_t limit_found_rows;
786
ha_rows cuted_fields, sent_row_count, examined_row_count;
787
ulong client_capabilities;
789
bool enable_slow_log;
790
bool last_insert_id_used;
791
SAVEPOINT *savepoints;
795
/* Flags for the THD::system_thread variable */
796
enum enum_thread_type
799
SYSTEM_THREAD_SLAVE_IO,
800
SYSTEM_THREAD_SLAVE_SQL
805
This class represents the interface for internal error handlers.
806
Internal error handlers are exception handlers used by the server
809
class Internal_error_handler
812
Internal_error_handler() {}
813
virtual ~Internal_error_handler() {}
817
Handle an error condition.
818
This method can be implemented by a subclass to achieve any of the
820
- mask an error internally, prevent exposing it to the user,
821
- mask an error and throw another one instead.
822
When this method returns true, the error condition is considered
823
'handled', and will not be propagated to upper layers.
824
It is the responsability of the code installing an internal handler
825
to then check for trapped conditions, and implement logic to recover
826
from the anticipated conditions trapped during runtime.
828
This mechanism is similar to C++ try/throw/catch:
829
- 'try' correspond to <code>THD::push_internal_handler()</code>,
830
- 'throw' correspond to <code>my_error()</code>,
831
which invokes <code>my_message_sql()</code>,
832
- 'catch' correspond to checking how/if an internal handler was invoked,
833
before removing it from the exception stack with
834
<code>THD::pop_internal_handler()</code>.
836
@param sql_errno the error number
837
@param level the error level
838
@param thd the calling thread
839
@return true if the error is handled
841
virtual bool handle_error(uint sql_errno,
843
DRIZZLE_ERROR::enum_warning_level level,
849
Stores status of the currently executed statement.
850
Cleared at the beginning of the statement, and then
851
can hold either OK, ERROR, or EOF status.
852
Can not be assigned twice per statement.
855
class Diagnostics_area
858
enum enum_diagnostics_status
860
/** The area is cleared at start of a statement. */
862
/** Set whenever one calls my_ok(). */
864
/** Set whenever one calls my_eof(). */
866
/** Set whenever one calls my_error() or my_message(). */
868
/** Set in case of a custom response, such as one from COM_STMT_PREPARE. */
871
/** True if status information is sent to the client. */
873
/** Set to make set_error_status after set_{ok,eof}_status possible. */
874
bool can_overwrite_status;
876
void set_ok_status(THD *thd, ha_rows affected_rows_arg,
877
uint64_t last_insert_id_arg,
878
const char *message);
879
void set_eof_status(THD *thd);
880
void set_error_status(THD *thd, uint sql_errno_arg, const char *message_arg);
882
void disable_status();
884
void reset_diagnostics_area();
886
bool is_set() const { return m_status != DA_EMPTY; }
887
bool is_error() const { return m_status == DA_ERROR; }
888
bool is_eof() const { return m_status == DA_EOF; }
889
bool is_ok() const { return m_status == DA_OK; }
890
bool is_disabled() const { return m_status == DA_DISABLED; }
891
enum_diagnostics_status status() const { return m_status; }
893
const char *message() const
894
{ assert(m_status == DA_ERROR || m_status == DA_OK); return m_message; }
896
uint sql_errno() const
897
{ assert(m_status == DA_ERROR); return m_sql_errno; }
899
uint server_status() const
901
assert(m_status == DA_OK || m_status == DA_EOF);
902
return m_server_status;
905
ha_rows affected_rows() const
906
{ assert(m_status == DA_OK); return m_affected_rows; }
908
uint64_t last_insert_id() const
909
{ assert(m_status == DA_OK); return m_last_insert_id; }
911
uint total_warn_count() const
913
assert(m_status == DA_OK || m_status == DA_EOF);
914
return m_total_warn_count;
917
Diagnostics_area() { reset_diagnostics_area(); }
511
util::string::shared_ptr _schema;
920
/** Message buffer. Can be used by OK or ERROR status. */
921
char m_message[DRIZZLE_ERRMSG_SIZE];
923
SQL error number. One of ER_ codes from share/errmsg.txt.
924
Set by set_error_status.
929
Copied from thd->server_status when the diagnostics area is assigned.
930
We need this member as some places in the code use the following pattern:
931
thd->server_status|= ...
933
thd->server_status&= ~...
934
Assigned by OK, EOF or ERROR.
936
uint m_server_status;
938
The number of rows affected by the last statement. This is
939
semantically close to thd->row_count_func, but has a different
940
life cycle. thd->row_count_func stores the value returned by
941
function ROW_COUNT() and is cleared only by statements that
942
update its value, such as INSERT, UPDATE, DELETE and few others.
943
This member is cleared at the beginning of the next statement.
945
We could possibly merge the two, but life cycle of thd->row_count_func
948
ha_rows m_affected_rows;
950
Similarly to the previous member, this is a replacement of
951
thd->first_successful_insert_id_in_prev_stmt, which is used
952
to implement LAST_INSERT_ID().
954
uint64_t m_last_insert_id;
955
/** The total number of warnings. */
956
uint m_total_warn_count;
957
enum_diagnostics_status m_status;
959
@todo: the following THD members belong here:
960
- warn_list, warn_count,
966
Storage engine specific thread local data.
972
Storage engine specific thread local data.
973
Lifetime: one user connection.
977
0: Life time: one statement within a transaction. If @@autocommit is
978
on, also represents the entire transaction.
979
@sa trans_register_ha()
981
1: Life time: one transaction within a connection.
982
If the storage engine does not participate in a transaction,
983
this should not be used.
984
@sa trans_register_ha()
986
Ha_trx_info ha_info[2];
988
Ha_data() :ha_ptr(NULL) {}
994
For each client connection we create a separate thread with THD serving as
995
a thread/connection descriptor
998
class THD :public Statement,
999
public Open_tables_state
514
util::string::const_shared_ptr schema() const
519
return util::string::const_shared_ptr(new std::string(""));
522
/* current cache key */
523
std::string query_cache_key;
525
Constant for Session::where initialization in the beginning of every query.
527
It's needed because we do not save/restore Session::where normally during
1002
/* Used to execute base64 coded binlog events in MySQL server */
1003
Relay_log_info* rli_fake;
1006
Constant for THD::where initialization in the beginning of every query.
1008
It's needed because we do not save/restore THD::where normally during
528
1009
primary (non subselect) query execution.
530
1011
static const char * const DEFAULT_WHERE;
532
memory::Root warn_root; /**< Allocation area for warnings and errors */
533
plugin::Client *client; /**< Pointer to client object */
535
void setClient(plugin::Client *client_arg);
537
plugin::Client *getClient()
542
plugin::Scheduler *scheduler; /**< Pointer to scheduler object */
543
void *scheduler_arg; /**< Pointer to the optional scheduler argument */
545
typedef boost::unordered_map< std::string, user_var_entry *, util::insensitive_hash, util::insensitive_equal_to> UserVars;
547
typedef std::pair< UserVars::iterator, UserVars::iterator > UserVarsRange;
548
UserVars user_vars; /**< Hash of user variables defined during the session's lifetime */
552
const UserVars &getUserVariables() const
557
drizzle_system_variables variables; /**< Mutable local variables local to the session */
558
struct system_status_var status_var; /**< Session-local status counters */
559
THR_LOCK_INFO lock_info; /**< Locking information for this session */
560
THR_LOCK_OWNER main_lock_id; /**< To use for conventional queries */
561
THR_LOCK_OWNER *lock_id; /**< If not main_lock_id, points to the lock_id of a cursor. */
564
* A pointer to the stack frame of the scheduler thread
565
* which is called first in the thread for handling a client
570
SecurityContext security_ctx;
572
int32_t scoreboard_index;
574
inline void checkSentry() const
576
assert(this->dbug_sentry == Session_SENTRY_MAGIC);
579
const SecurityContext& getSecurityContext() const
584
SecurityContext& getSecurityContext()
589
int32_t getScoreboardIndex()
591
return scoreboard_index;
594
void setScoreboardIndex(int32_t in_scoreboard_index)
596
scoreboard_index= in_scoreboard_index;
600
* Is this session viewable by the current user?
602
bool isViewable() const;
1013
NET net; // client connection descriptor
1014
MEM_ROOT warn_root; // For warnings and errors
1015
Protocol *protocol; // Current protocol
1016
Protocol_text protocol_text; // Normal protocol
1017
HASH user_vars; // hash for user variables
1018
String packet; // dynamic buffer for network I/O
1019
String convert_buffer; // buffer for charset conversions
1020
struct rand_struct rand; // used for authentication
1021
struct system_variables variables; // Changeable local variables
1022
struct system_status_var status_var; // Per thread statistic vars
1023
struct system_status_var *initial_status_var; /* used by show status */
1024
THR_LOCK_INFO lock_info; // Locking info of this thread
1025
THR_LOCK_OWNER main_lock_id; // To use for conventional queries
1026
THR_LOCK_OWNER *lock_id; // If not main_lock_id, points to
1027
// the lock_id of a cursor.
1028
pthread_mutex_t LOCK_delete; // Locked before thd is deleted
1030
A pointer to the stack frame of handle_one_connection(),
1031
which is called first in the thread for handling a client
1036
Currently selected catalog.
1042
Some members of THD (currently 'Statement::db',
1043
'catalog' and 'query') are set and alloced by the slave SQL thread
1044
(for the THD of that thread); that thread is (and must remain, for now)
1045
the only responsible for freeing these 3 members. If you add members
1046
here, and you add code to set them in replication, don't forget to
1047
free_them_and_set_them_to_0 in replication properly. For details see
1048
the 'err:' label of the handle_slave_sql() in sql/slave.cc.
1050
@see handle_slave_sql
1053
Security_context main_security_ctx;
1054
Security_context *security_ctx;
1057
Points to info-string that we show in SHOW PROCESSLIST
1058
You are supposed to call THD_SET_PROC_INFO only if you have coded
1059
a time-consuming piece that MySQL can get stuck in for a long time.
1061
Set it using the thd_proc_info(THD *thread, const char *message)
1064
void set_proc_info(const char *info) { proc_info= info; }
1065
const char* get_proc_info() const { return proc_info; }
605
1068
Used in error messages to tell user in what part of MySQL we found an
606
1069
error. E. g. when where= "having clause", if fix_fields() fails, user
607
1070
will know that the error was in having clause.
609
1072
const char *where;
1074
double tmp_double_value; /* Used in set_var.cc */
1075
ulong client_capabilities; /* What the client supports */
1076
ulong max_client_packet_length;
1078
HASH handler_tables_hash;
612
1080
One thread can hold up to one named user-level lock. This variable
613
1081
points to a lock object if the lock is present. See item_func.cc and
614
chapter 'Miscellaneous functions', for functions GET_LOCK, RELEASE_LOCK.
616
uint32_t dbug_sentry; /**< watch for memory corruption */
618
boost::thread::id boost_thread_id;
619
boost_thread_shared_ptr _thread;
620
boost::this_thread::disable_interruption *interrupt;
622
internal::st_my_thread_var *mysys_var;
625
boost_thread_shared_ptr &getThread()
630
void pushInterrupt(boost::this_thread::disable_interruption *interrupt_arg)
632
interrupt= interrupt_arg;
635
boost::this_thread::disable_interruption &getThreadInterupt()
641
internal::st_my_thread_var *getThreadVar()
647
* Type of current query: COM_STMT_PREPARE, COM_QUERY, etc. Set from
648
* first byte of the packet in executeStatement()
1082
chapter 'Miscellaneous functions', for functions GET_LOCK, RELEASE_LOCK.
1084
uint dbug_sentry; // watch out for memory corruption
1085
struct st_my_thread_var *mysys_var;
1087
Type of current query: COM_STMT_PREPARE, COM_QUERY, etc. Set from
1088
first byte of the packet in do_command()
650
1090
enum enum_server_command command;
651
uint32_t file_id; /**< File ID for LOAD DATA INFILE */
652
/* @note the following three members should likely move to Client */
653
uint32_t max_client_packet_length; /**< Maximum number of bytes a client can send in a single packet */
656
uint64_t thr_create_utime; /**< track down slow pthread_create */
657
uint64_t start_utime;
658
uint64_t utime_after_lock;
1092
uint32_t file_id; // for LOAD DATA INFILE
1093
/* remote (peer) port */
1095
time_t start_time, user_time;
1096
uint64_t connect_utime, thr_create_utime; // track down slow pthread_create
1097
uint64_t start_utime, utime_after_lock;
660
1099
thr_lock_type update_lock_default;
663
Both of the following container points in session will be converted to an API.
1101
/* <> 0 if we are inside of trigger or stored function. */
667
1104
/* container for handler's private per-connection data */
668
std::vector<Ha_data> ha_data;
670
Id of current query. Statement can be reused to execute several queries
671
query_id is global in context of the whole MySQL server.
672
ID is automatically generated from an atomic counter.
673
It's used in Cursor code for various purposes: to check which columns
674
from table are necessary for this select, to check if it's necessary to
675
update auto-updatable fields (like auto_increment and timestamp).
678
query_id_t warn_query_id;
680
void **getEngineData(const plugin::MonitoredInTransaction *monitored);
681
ResourceContext *getResourceContext(const plugin::MonitoredInTransaction *monitored,
1105
Ha_data ha_data[MAX_HA];
1107
/* Place to store various things */
1109
#ifndef DRIZZLE_CLIENT
1110
int binlog_setup_trx_data();
1113
Public interface to write RBR events to the binlog
1115
void binlog_start_trans_and_stmt();
1116
void binlog_set_stmt_begin();
1117
int binlog_write_table_map(Table *table, bool is_transactional);
1118
int binlog_write_row(Table* table, bool is_transactional,
1119
const uchar *new_data);
1120
int binlog_delete_row(Table* table, bool is_transactional,
1121
const uchar *old_data);
1122
int binlog_update_row(Table* table, bool is_transactional,
1123
const uchar *old_data, const uchar *new_data);
1125
void set_server_id(uint32_t sid) { server_id = sid; }
1128
Member functions to handle pending event for row-level logging.
1130
template <class RowsEventT> Rows_log_event*
1131
binlog_prepare_pending_rows_event(Table* table, uint32_t serv_id,
1133
bool is_transactional,
1135
Rows_log_event* binlog_get_pending_rows_event() const;
1136
void binlog_set_pending_rows_event(Rows_log_event* ev);
1137
int binlog_flush_pending_rows_event(bool stmt_end);
1140
uint binlog_table_maps; // Number of table maps currently in the binlog
1142
enum enum_binlog_flag {
1143
BINLOG_FLAG_UNSAFE_STMT_PRINTED,
685
* Structure used to manage "statement transactions" and
686
* "normal transactions". In autocommit mode, the normal transaction is
687
* equivalent to the statement transaction.
689
* Storage engines will be registered here when they participate in
690
* a transaction. No engine is registered more than once.
1148
Flags with per-thread information regarding the status of the
1151
uint32_t binlog_flags;
1153
uint get_binlog_table_maps() const {
1154
return binlog_table_maps;
1156
void clear_binlog_table_maps() {
1157
binlog_table_maps= 0;
1159
#endif /* DRIZZLE_CLIENT */
692
1163
struct st_transactions {
693
std::deque<NamedSavepoint> savepoints;
696
* The normal transaction (since BEGIN WORK).
698
* Contains a list of all engines that have participated in any of the
699
* statement transactions started within the context of the normal
702
* @note In autocommit mode, this is empty.
704
TransactionContext all;
707
* The statment transaction.
709
* Contains a list of all engines participating in the given statement.
711
* @note In autocommit mode, this will be used to commit/rollback the
712
* normal transaction.
714
TransactionContext stmt;
1164
SAVEPOINT *savepoints;
1165
THD_TRANS all; // Trans since BEGIN WORK
1166
THD_TRANS stmt; // Trans for current statement
1167
bool on; // see ha_enable_transaction()
716
1168
XID_STATE xid_state;
1169
Rows_log_event *m_pending_rows_event;
1172
Tables changed in transaction (that must be invalidated in query cache).
1173
List contain only transactional tables, that not invalidated in query
1174
cache (instead of full list of changed in transaction tables).
1176
CHANGED_TableList* changed_tables;
1177
MEM_ROOT mem_root; // Transaction-life memory allocation pool
1182
free_root(&mem_root,MYF(MY_KEEP_PREALLOC));
1186
memset(this, 0, sizeof(*this));
1187
xid_state.xid.null();
1188
init_sql_alloc(&mem_root, ALLOC_ROOT_MIN_BLOCK_SIZE, 0);
731
1192
sigset_t signals;
733
// As of right now we do not allow a concurrent execute to launch itself
735
bool concurrent_execute_allowed;
738
void setConcurrentExecute(bool arg)
740
concurrent_execute_allowed= arg;
743
bool isConcurrentExecuteAllowed() const
745
return concurrent_execute_allowed;
1193
#ifdef SIGNAL_WITH_VIO_CLOSE
1197
This is to track items changed during execution of a prepared
1198
statement/stored procedure. It's created by
1199
register_item_tree_change() in memory root of THD, and freed in
1200
rollback_item_tree_changes(). For conventional execution it's always
1203
Item_change_list change_list;
1206
A permanent memory area of the statement. For conventional
1207
execution, the parsed tree and execution runtime reside in the same
1208
memory root. In this case stmt_arena points to THD. In case of
1209
a prepared statement or a stored procedure statement, thd->mem_root
1210
conventionally points to runtime memory, and thd->stmt_arena
1211
points to the memory of the PS/SP, where the parsed tree of the
1212
statement resides. Whenever you need to perform a permanent
1213
transformation of a parsed tree, you should allocate new memory in
1214
stmt_arena, to allow correct re-execution of PS/SP.
1215
Note: in the parser, stmt_arena == thd, even for PS/SP.
1217
Query_arena *stmt_arena;
748
1218
/* Tells if LAST_INSERT_ID(#) was called for the current statement */
749
1219
bool arg_of_last_insert_id_function;
752
1221
ALL OVER THIS FILE, "insert_id" means "*automatically generated* value for
753
1222
insertion into an auto_increment column".
756
1225
This is the first autogenerated insert id which was *successfully*
757
1226
inserted by the previous statement (exactly, if the previous statement
758
1227
didn't successfully insert an autogenerated insert id, then it's the one
795
1284
in the binlog is still needed; the list's minimum will contain 3.
797
1286
Discrete_intervals_list auto_inc_intervals_in_cur_stmt_for_binlog;
798
/** Used by replication and SET INSERT_ID */
1287
/* Used by replication and SET INSERT_ID */
799
1288
Discrete_intervals_list auto_inc_intervals_forced;
801
uint64_t limit_found_rows;
802
uint64_t options; /**< Bitmap of options */
803
int64_t row_count_func; /**< For the ROW_COUNT() function */
804
ha_rows cuted_fields; /**< Count of "cut" or truncated fields. @todo Kill this friggin thing. */
807
* Number of rows we actually sent to the client, including "synthetic"
808
* rows in ROLLUP etc.
810
ha_rows sent_row_count;
813
* Number of rows we read, sent or not, including in create_sort_index()
815
ha_rows examined_row_count;
818
* The set of those tables whose fields are referenced in all subqueries
823
* Possibly this it is incorrect to have used tables in Session because
824
* with more than one subquery, it is not clear what does the field mean.
826
table_map used_tables;
831
This, and some other variables like 'count_cuted_fields'
832
maybe should be statement/cursor local, that is, moved to Statement
833
class. With current implementation warnings produced in each prepared
834
statement/cursor settle here.
836
List<DRIZZLE_ERROR> warn_list;
837
uint32_t warn_count[(uint32_t) DRIZZLE_ERROR::WARN_LEVEL_END];
838
uint32_t total_warn_count;
839
Diagnostics_area main_da;
843
/* Statement id is thread-wide. This counter is used to generate ids */
844
uint32_t statement_id_counter;
845
uint32_t rand_saved_seed1;
846
uint32_t rand_saved_seed2;
848
Row counter, mainly for errors and warnings. Not increased in
849
create_sort_index(); may differ from examined_row_count.
852
session_id_t thread_id;
854
enum global_read_lock_t
857
GOT_GLOBAL_READ_LOCK= 1,
858
MADE_GLOBAL_READ_LOCK_BLOCK_COMMIT= 2
861
global_read_lock_t _global_read_lock;
865
global_read_lock_t isGlobalReadLock() const
867
return _global_read_lock;
870
void setGlobalReadLock(global_read_lock_t arg)
872
_global_read_lock= arg;
875
DrizzleLock *lockTables(Table **tables, uint32_t count, uint32_t flags, bool *need_reopen);
876
bool lockGlobalReadLock();
877
bool lock_table_names(TableList *table_list);
878
bool lock_table_names_exclusively(TableList *table_list);
879
bool makeGlobalReadLockBlockCommit();
880
bool abortLockForThread(Table *table);
881
bool wait_if_global_read_lock(bool abort_on_refresh, bool is_not_commit);
882
int lock_table_name(TableList *table_list);
883
void abortLock(Table *table);
884
void removeLock(Table *table);
885
void unlockReadTables(DrizzleLock *sql_lock);
886
void unlockSomeTables(Table **table, uint32_t count);
887
void unlockTables(DrizzleLock *sql_lock);
888
void startWaitingGlobalReadLock();
889
void unlockGlobalReadLock();
892
int unlock_external(Table **table, uint32_t count);
893
int lock_external(Table **tables, uint32_t count);
894
bool wait_for_locked_table_names(TableList *table_list);
895
DrizzleLock *get_lock_data(Table **table_ptr, uint32_t count,
896
bool should_lock, Table **write_lock_used);
899
uint32_t server_status;
900
uint32_t open_options;
901
uint32_t select_number; /**< number of select (used for EXPLAIN) */
902
/* variables.transaction_isolation is reset to this after each commit */
903
enum_tx_isolation session_tx_isolation;
904
enum_check_fields count_cuted_fields;
912
KILLED_NO_VALUE /* means none of the above states apply */
915
killed_state_t volatile _killed;
919
void setKilled(killed_state_t arg)
924
killed_state_t getKilled()
929
volatile killed_state_t *getKilledPtr() // Do not use this method, it is here for historical convience.
934
bool is_admin_connection;
935
bool some_tables_deleted;
939
Set to true if execution of the current compound statement
940
can not continue. In particular, disables activation of
941
CONTINUE or EXIT handlers of stored routines.
942
Reset in the end of processing of the current user request, in
943
@see mysql_reset_session_for_next_command().
947
Set by a storage engine to request the entire
948
transaction (that possibly spans multiple engines) to
949
rollback. Reset in ha_rollback.
951
bool transaction_rollback_request;
953
true if we are in a sub-statement and the current error can
954
not be safely recovered until we left the sub-statement mode.
955
In particular, disables activation of CONTINUE and EXIT
956
handlers inside sub-statements. E.g. if it is a deadlock
957
error and requires a transaction-wide rollback, this flag is
958
raised (traditionally, MySQL first has to close all the reads
959
via @see handler::ha_index_or_rnd_end() and only then perform
961
Reset to false when we leave the sub-statement mode.
963
bool is_fatal_sub_stmt_error;
964
/** for IS NULL => = last_insert_id() fix in remove_eq_conds() */
965
bool substitute_null_with_insert_id;
968
bool abort_on_warning;
969
bool got_warning; /**< Set on call to push_warning() */
970
bool no_warnings_for_error; /**< no warnings on call to my_error() */
971
/** set during loop of derived table processing */
972
bool derived_tables_processing;
973
bool tablespace_op; /**< This is true in DISCARD/IMPORT TABLESPACE */
975
/** Used by the sys_var class to store temporary values */
979
uint32_t uint32_t_value;
980
int32_t int32_t_value;
981
uint64_t uint64_t_value;
985
Character input stream consumed by the lexical analyser,
987
Note that since the parser is not re-entrant, we keep only one input
988
stream here. This member is valid only when executing code during parsing,
989
and may point to invalid memory after that.
991
Lex_input_stream *m_lip;
993
/** Place to store various things */
994
void *session_marker;
996
/** Keeps a copy of the previous table around in case we are just slamming on particular table */
1000
Points to info-string that we show in SHOW PROCESSLIST
1001
You are supposed to call Session_SET_PROC_INFO only if you have coded
1002
a time-consuming piece that MySQL can get stuck in for a long time.
1004
Set it using the session_proc_info(Session *thread, const char *message)
1007
inline void set_proc_info(const char *info)
1011
inline const char* get_proc_info() const
1016
/** Sets this Session's current query ID */
1017
inline void setQueryId(query_id_t in_query_id)
1019
query_id= in_query_id;
1022
/** Returns the current query ID */
1023
query_id_t getQueryId() const
1029
/** Sets this Session's warning query ID */
1030
inline void setWarningQueryId(query_id_t in_query_id)
1032
warn_query_id= in_query_id;
1035
/** Returns the Session's warning query ID */
1036
inline query_id_t getWarningQueryId() const
1038
return warn_query_id;
1041
/** Accessor method returning the session's ID. */
1042
inline session_id_t getSessionId() const
1047
/** Accessor method returning the server's ID. */
1048
inline uint32_t getServerId() const
1050
/* We return the global server ID. */
1054
/** Returns the current transaction ID for the session's current statement */
1055
inline my_xid getTransactionId()
1057
return transaction.xid_state.xid.quick_get_my_xid();
1060
1290
There is BUG#19630 where statement-based replication of stored
1061
1291
functions/triggers with two auto_increment columns breaks.
1062
1292
We however ensure that it works when there is 0 or 1 auto_increment
1112
1349
auto_inc_intervals_forced.append(next_id, UINT64_MAX, 0);
1115
Session(plugin::Client *client_arg);
1352
uint64_t limit_found_rows;
1353
uint64_t options; /* Bitmap of states */
1354
int64_t row_count_func; /* For the ROW_COUNT() function */
1355
ha_rows cuted_fields;
1358
number of rows we actually sent to the client, including "synthetic"
1361
ha_rows sent_row_count;
1364
number of rows we read, sent or not, including in create_sort_index()
1366
ha_rows examined_row_count;
1369
The set of those tables whose fields are referenced in all subqueries
1371
TODO: possibly this it is incorrect to have used tables in THD because
1372
with more than one subquery, it is not clear what does the field mean.
1374
table_map used_tables;
1375
USER_CONN *user_connect;
1376
const CHARSET_INFO *db_charset;
1378
FIXME: this, and some other variables like 'count_cuted_fields'
1379
maybe should be statement/cursor local, that is, moved to Statement
1380
class. With current implementation warnings produced in each prepared
1381
statement/cursor settle here.
1383
List <DRIZZLE_ERROR> warn_list;
1384
uint warn_count[(uint) DRIZZLE_ERROR::WARN_LEVEL_END];
1385
uint total_warn_count;
1386
Diagnostics_area main_da;
1389
Id of current query. Statement can be reused to execute several queries
1390
query_id is global in context of the whole MySQL server.
1391
ID is automatically generated from mutex-protected counter.
1392
It's used in handler code for various purposes: to check which columns
1393
from table are necessary for this select, to check if it's necessary to
1394
update auto-updatable fields (like auto_increment and timestamp).
1396
query_id_t query_id, warn_id;
1399
#ifdef ERROR_INJECT_SUPPORT
1400
ulong error_inject_value;
1402
/* Statement id is thread-wide. This counter is used to generate ids */
1403
ulong statement_id_counter;
1404
ulong rand_saved_seed1, rand_saved_seed2;
1406
Row counter, mainly for errors and warnings. Not increased in
1407
create_sort_index(); may differ from examined_row_count.
1410
pthread_t real_id; /* For debugging */
1411
my_thread_id thread_id;
1412
uint tmp_table, global_read_lock;
1413
uint server_status,open_options;
1414
enum enum_thread_type system_thread;
1415
uint select_number; //number of select (used for EXPLAIN)
1416
/* variables.transaction_isolation is reset to this after each commit */
1417
enum_tx_isolation session_tx_isolation;
1418
enum_check_fields count_cuted_fields;
1420
DYNAMIC_ARRAY user_var_events; /* For user variables replication */
1421
MEM_ROOT *user_var_events_alloc; /* Allocate above array elements here */
1427
KILL_CONNECTION=ER_SERVER_SHUTDOWN,
1428
KILL_QUERY=ER_QUERY_INTERRUPTED,
1429
KILLED_NO_VALUE /* means neither of the states */
1431
killed_state volatile killed;
1433
/* scramble - random string sent to client on handshake */
1434
char scramble[SCRAMBLE_LENGTH+1];
1436
bool slave_thread, one_shot_set;
1437
/* tells if current statement should binlog row-based(1) or stmt-based(0) */
1438
bool current_stmt_binlog_row_based;
1439
bool some_tables_deleted;
1440
bool last_cuted_field;
1441
bool no_errors, password;
1443
Set to true if execution of the current compound statement
1444
can not continue. In particular, disables activation of
1445
CONTINUE or EXIT handlers of stored routines.
1446
Reset in the end of processing of the current user request, in
1447
@see mysql_reset_thd_for_next_command().
1449
bool is_fatal_error;
1451
Set by a storage engine to request the entire
1452
transaction (that possibly spans multiple engines) to
1453
rollback. Reset in ha_rollback.
1455
bool transaction_rollback_request;
1457
true if we are in a sub-statement and the current error can
1458
not be safely recovered until we left the sub-statement mode.
1459
In particular, disables activation of CONTINUE and EXIT
1460
handlers inside sub-statements. E.g. if it is a deadlock
1461
error and requires a transaction-wide rollback, this flag is
1462
raised (traditionally, MySQL first has to close all the reads
1463
via @see handler::ha_index_or_rnd_end() and only then perform
1465
Reset to false when we leave the sub-statement mode.
1467
bool is_fatal_sub_stmt_error;
1468
bool query_start_used, rand_used, time_zone_used;
1469
/* for IS NULL => = last_insert_id() fix in remove_eq_conds() */
1470
bool substitute_null_with_insert_id;
1471
bool in_lock_tables;
1473
True if a slave error. Causes the slave to stop. Not the same
1474
as the statement execution error (is_error()), since
1475
a statement may be expected to return an error, e.g. because
1476
it returned an error on master, and this is OK on the slave.
1478
bool is_slave_error;
1479
bool bootstrap, cleanup_done;
1481
/** is set if some thread specific value(s) used in a statement. */
1482
bool thread_specific_used;
1483
bool charset_is_system_charset, charset_is_collation_connection;
1484
bool charset_is_character_set_filesystem;
1485
bool enable_slow_log; /* enable slow log for current statement */
1486
bool abort_on_warning;
1487
bool got_warning; /* Set on call to push_warning() */
1488
bool no_warnings_for_error; /* no warnings on call to my_error() */
1489
/* set during loop of derived table processing */
1490
bool derived_tables_processing;
1491
bool tablespace_op; /* This is true in DISCARD/IMPORT TABLESPACE */
1494
If we do a purge of binary logs, log index info of the threads
1495
that are currently reading it needs to be adjusted. To do that
1496
each thread that is using LOG_INFO needs to adjust the pointer to it
1498
LOG_INFO* current_linfo;
1499
NET* slave_net; // network connection from slave -> m.
1500
/* Used by the sys_var class to store temporary values */
1506
uint64_t uint64_t_value;
1511
If true, mysql_bin_log::write(Log_event) call will not write events to
1512
binlog, and maintain 2 below variables instead (use
1513
mysql_bin_log.start_union_events to turn this on)
1517
If true, at least one mysql_bin_log::write(Log_event) call has been
1518
made after last mysql_bin_log.start_union_events() call.
1520
bool unioned_events;
1522
If true, at least one mysql_bin_log::write(Log_event e), where
1523
e.cache_stmt == true call has been made after last
1524
mysql_bin_log.start_union_events() call.
1526
bool unioned_events_trans;
1529
'queries' (actually SP statements) that run under inside this binlog
1530
union have thd->query_id >= first_query_id.
1532
query_id_t first_query_id;
1536
Character input stream consumed by the lexical analyser,
1537
used during parsing.
1538
Note that since the parser is not re-entrant, we keep only one input
1539
stream here. This member is valid only when executing code during parsing,
1540
and may point to invalid memory after that.
1542
Lex_input_stream *m_lip;
1549
Initialize memory roots necessary for query processing and (!)
1550
pre-allocate memory for it. We can't do that in THD constructor because
1551
there are use cases (acl_init, watcher threads,
1552
killing mysqld) where it's vital to not allocate excessive and not used
1553
memory. Note, that we still don't return error from init_for_queries():
1554
if preallocation fails, we should notice that at the first call to
1557
void init_for_queries();
1558
void change_user(void);
1118
1559
void cleanup(void);
1120
* Cleans up after query.
1124
* This function is used to reset thread data to its default state.
1126
* This function is not suitable for setting thread data to some
1127
* non-default values, as there is only one replication thread, so
1128
* different master threads may overwrite data of each other on
1131
1560
void cleanup_after_query();
1132
bool storeGlobals();
1133
void awake(Session::killed_state_t state_to_set);
1135
* Pulls thread-specific variables into Session state.
1137
* Returns true most times, or false if there was a problem
1138
* allocating resources for thread-specific storage.
1140
* @TODO Kill this. It's not necessary once my_thr_init() is bye bye.
1146
Initialize memory roots necessary for query processing and (!)
1147
pre-allocate memory for it. We can't do that in Session constructor because
1148
there are use cases where it's vital to not allocate excessive and not used
1151
void prepareForQueries();
1154
* Executes a single statement received from the
1155
* client connection.
1157
* Returns true if the statement was successful, or false
1162
* For profiling to work, it must never be called recursively.
1164
* In MySQL, this used to be the do_command() C function whic
1165
* accepted a single parameter of the THD pointer.
1167
bool executeStatement();
1170
* Reads a query from packet and stores it.
1172
* Returns true if query is read and allocated successfully,
1173
* false otherwise. On a return of false, Session::fatal_error
1176
* @note Used in COM_QUERY and COM_STMT_PREPARE.
1178
* Sets the following Session variables:
1182
* @param The packet pointer to read from
1183
* @param The length of the query to read
1185
bool readAndStoreQuery(const char *in_packet, uint32_t in_packet_length);
1188
* Ends the current transaction and (maybe) begins the next.
1190
* Returns true if the transaction completed successfully,
1193
* @param Completion type
1195
bool endTransaction(enum enum_mysql_completiontype completion);
1196
bool endActiveTransaction();
1197
bool startTransaction(start_transaction_option_t opt= START_TRANS_NO_OPTIONS);
1200
* Authenticates users, with error reporting.
1202
* Returns true on success, or false on failure.
1204
bool authenticate();
1209
* This will initialize the session and begin the command loop.
1214
* Schedule a session to be run on the default scheduler.
1216
static bool schedule(Session::shared_ptr&);
1218
static void unlink(Session::shared_ptr&);
1561
bool store_globals();
1562
#ifdef SIGNAL_WITH_VIO_CLOSE
1563
inline void set_active_vio(Vio* vio)
1565
pthread_mutex_lock(&LOCK_delete);
1567
pthread_mutex_unlock(&LOCK_delete);
1569
inline void clear_active_vio()
1571
pthread_mutex_lock(&LOCK_delete);
1573
pthread_mutex_unlock(&LOCK_delete);
1575
void close_active_vio();
1577
void awake(THD::killed_state state_to_set);
1579
#ifndef DRIZZLE_CLIENT
1580
enum enum_binlog_query_type {
1582
The query can be logged row-based or statement-based
1587
The query has to be logged statement-based
1592
The query represents a change to a table in the "mysql"
1593
database and is currently mapped to ROW_QUERY_TYPE.
1599
int binlog_query(enum_binlog_query_type qtype,
1600
char const *query, ulong query_len,
1601
bool is_trans, bool suppress_use,
1602
THD::killed_state killed_err_arg= THD::KILLED_NO_VALUE);
1221
1606
For enter_cond() / exit_cond() to work the mutex must be got before
1222
1607
enter_cond(); this mutex is then released by exit_cond().
1223
1608
Usage must be: lock mutex; enter_cond(); your code; exit_cond().
1225
const char* enter_cond(boost::condition_variable_any &cond, boost::mutex &mutex, const char* msg);
1226
void exit_cond(const char* old_msg);
1228
inline time_t query_start() { return start_time; }
1610
inline const char* enter_cond(pthread_cond_t *cond, pthread_mutex_t* mutex,
1613
const char* old_msg = get_proc_info();
1614
safe_mutex_assert_owner(mutex);
1615
mysys_var->current_mutex = mutex;
1616
mysys_var->current_cond = cond;
1617
thd_proc_info(this, msg);
1620
inline void exit_cond(const char* old_msg)
1623
Putting the mutex unlock in exit_cond() ensures that
1624
mysys_var->current_mutex is always unlocked _before_ mysys_var->mutex is
1625
locked (if that would not be the case, you'll get a deadlock if someone
1626
does a THD::awake() on you).
1628
pthread_mutex_unlock(mysys_var->current_mutex);
1629
pthread_mutex_lock(&mysys_var->mutex);
1630
mysys_var->current_mutex = 0;
1631
mysys_var->current_cond = 0;
1632
thd_proc_info(this, old_msg);
1633
pthread_mutex_unlock(&mysys_var->mutex);
1635
inline time_t query_start() { query_start_used=1; return start_time; }
1229
1636
inline void set_time()
1231
boost::posix_time::ptime mytime(boost::posix_time::microsec_clock::local_time());
1232
boost::posix_time::ptime epoch(boost::gregorian::date(1970,1,1));
1233
start_utime= utime_after_lock= (mytime-epoch).total_microseconds();
1237
1640
start_time= user_time;
1238
connect_microseconds= start_utime;
1641
start_utime= utime_after_lock= my_micro_time();
1241
start_time= (mytime-epoch).total_seconds();
1644
start_utime= utime_after_lock= my_micro_time_and_time(&start_time);
1243
inline void set_current_time() { start_time= time(NULL); }
1646
inline void set_current_time() { start_time= my_time(MY_WME); }
1244
1647
inline void set_time(time_t t)
1246
1649
start_time= user_time= t;
1247
boost::posix_time::ptime mytime(boost::posix_time::microsec_clock::local_time());
1248
boost::posix_time::ptime epoch(boost::gregorian::date(1970,1,1));
1249
uint64_t t_mark= (mytime-epoch).total_microseconds();
1251
start_utime= utime_after_lock= t_mark;
1253
void set_time_after_lock() {
1254
boost::posix_time::ptime mytime(boost::posix_time::microsec_clock::local_time());
1255
boost::posix_time::ptime epoch(boost::gregorian::date(1970,1,1));
1256
utime_after_lock= (mytime-epoch).total_microseconds();
1259
* Returns the current micro-timestamp
1261
inline uint64_t getCurrentTimestamp()
1263
boost::posix_time::ptime mytime(boost::posix_time::microsec_clock::local_time());
1264
boost::posix_time::ptime epoch(boost::gregorian::date(1970,1,1));
1265
uint64_t t_mark= (mytime-epoch).total_microseconds();
1650
start_utime= utime_after_lock= my_micro_time();
1652
void set_time_after_lock() { utime_after_lock= my_micro_time(); }
1653
uint64_t current_utime() { return my_micro_time(); }
1269
1654
inline uint64_t found_rows(void)
1271
1656
return limit_found_rows;
1273
/** Returns whether the session is currently inside a transaction */
1274
inline bool inTransaction()
1658
inline bool active_transaction()
1276
1660
return server_status & SERVER_STATUS_IN_TRANS;
1278
LEX_STRING *make_lex_string(LEX_STRING *lex_str,
1279
const char* str, uint32_t length,
1280
bool allocate_lex_string);
1281
LEX_STRING *make_lex_string(LEX_STRING *lex_str,
1282
const std::string &str,
1283
bool allocate_lex_string);
1662
inline bool fill_derived_tables()
1664
return !lex->only_view_structure();
1666
inline void* trans_alloc(unsigned int size)
1668
return alloc_root(&transaction.mem_root,size);
1671
LEX_STRING *make_lex_string(LEX_STRING *lex_str,
1672
const char* str, uint length,
1673
bool allocate_lex_string);
1675
bool convert_string(LEX_STRING *to, const CHARSET_INFO * const to_cs,
1676
const char *from, uint from_length,
1677
const CHARSET_INFO * const from_cs);
1679
bool convert_string(String *s, const CHARSET_INFO * const from_cs, const CHARSET_INFO * const to_cs);
1681
void add_changed_table(Table *table);
1682
void add_changed_table(const char *key, long key_length);
1683
CHANGED_TableList * changed_table_dup(const char *key, long key_length);
1285
1684
int send_explain_fields(select_result *result);
1287
1686
Clear the current error, if any.
1596
1912
- for prepared queries, only to allocate runtime data. The parsed
1597
1913
tree itself is reused between executions and thus is stored elsewhere.
1599
memory::Root main_mem_root;
1602
* Marks all tables in the list which were used by current substatement
1603
* as free for reuse.
1605
* @param Head of the list of tables
1609
* The reason we reset query_id is that it's not enough to just test
1610
* if table->query_id != session->query_id to know if a table is in use.
1614
* SELECT f1_that_uses_t1() FROM t1;
1616
* In f1_that_uses_t1() we will see one instance of t1 where query_id is
1617
* set to query_id of original query.
1619
void mark_used_tables_as_free_for_reuse(Table *table);
1623
/** A short cut for session->main_da.set_ok_status(). */
1624
inline void my_ok(ha_rows affected_rows= 0, ha_rows found_rows_arg= 0,
1625
uint64_t passed_id= 0, const char *message= NULL)
1627
main_da.set_ok_status(this, affected_rows, found_rows_arg, passed_id, message);
1631
/** A short cut for session->main_da.set_eof_status(). */
1633
inline void my_eof()
1635
main_da.set_eof_status(this);
1638
/* Some inline functions for more speed */
1640
inline bool add_item_to_list(Item *item)
1642
return lex->current_select->add_item_to_list(this, item);
1645
inline bool add_value_to_list(Item *value)
1647
return lex->value_list.push_back(value);
1650
inline bool add_order_to_list(Item *item, bool asc)
1652
return lex->current_select->add_order_to_list(this, item, asc);
1655
inline bool add_group_to_list(Item *item, bool asc)
1657
return lex->current_select->add_group_to_list(this, item, asc);
1659
void refresh_status();
1660
user_var_entry *getVariable(LEX_STRING &name, bool create_if_not_exists);
1661
user_var_entry *getVariable(const std::string &name, bool create_if_not_exists);
1662
void setVariable(const std::string &name, const std::string &value);
1665
* Closes all tables used by the current substatement, or all tables
1666
* used by this thread if we are on the upper level.
1668
void close_thread_tables();
1669
void close_old_data_files(bool morph_locks= false,
1670
bool send_refresh= false);
1671
void close_open_tables();
1672
void close_data_files_and_morph_locks(const TableIdentifier &identifier);
1675
bool free_cached_table();
1679
* Prepares statement for reopening of tables and recalculation of set of
1682
* @param Pointer to a pointer to a list of tables which we were trying to open and lock
1684
void close_tables_for_reopen(TableList **tables);
1688
* Open all tables in list, locks them (all, including derived)
1690
* @param Pointer to a list of tables for open & locking
1699
* The lock will automaticaly be freed by close_thread_tables()
1701
bool openTablesLock(TableList *tables);
1703
int open_tables_from_list(TableList **start, uint32_t *counter, uint32_t flags= 0);
1705
Table *openTableLock(TableList *table_list, thr_lock_type lock_type);
1706
Table *openTable(TableList *table_list, bool *refresh, uint32_t flags= 0);
1708
void unlink_open_table(Table *find);
1709
void drop_open_table(Table *table, const TableIdentifier &identifier);
1710
void close_cached_table(Table *table);
1712
/* Create a lock in the cache */
1713
table::Placeholder *table_cache_insert_placeholder(const TableIdentifier &identifier);
1714
bool lock_table_name_if_not_cached(const TableIdentifier &identifier, Table **table);
1716
typedef boost::unordered_map<std::string, message::Table, util::insensitive_hash, util::insensitive_equal_to> TableMessageCache;
1720
TableMessageCache table_message_cache;
1723
bool storeTableMessage(const TableIdentifier &identifier, message::Table &table_message);
1724
bool removeTableMessage(const TableIdentifier &identifier);
1725
bool getTableMessage(const TableIdentifier &identifier, message::Table &table_message);
1726
bool doesTableMessageExist(const TableIdentifier &identifier);
1727
bool renameTableMessage(const TableIdentifier &from, const TableIdentifier &to);
1731
TableMessages _table_message_cache;
1734
TableMessages &getMessageCache()
1736
return _table_message_cache;
1739
/* Reopen operations */
1740
bool reopen_tables(bool get_locks, bool mark_share_as_old);
1741
bool close_cached_tables(TableList *tables, bool wait_for_refresh, bool wait_for_placeholders);
1743
void wait_for_condition(boost::mutex &mutex, boost::condition_variable_any &cond);
1744
int setup_conds(TableList *leaves, COND **conds);
1745
int lock_tables(TableList *tables, uint32_t count, bool *need_reopen);
1747
drizzled::util::Storable *getProperty(const std::string &arg)
1749
return life_properties[arg];
1753
bool setProperty(const std::string &arg, T *value)
1755
life_properties[arg]= value;
1761
Return the default storage engine
1763
@param getDefaultStorageEngine()
1766
pointer to plugin::StorageEngine
1768
plugin::StorageEngine *getDefaultStorageEngine()
1770
if (variables.storage_engine)
1771
return variables.storage_engine;
1772
return global_system_variables.storage_engine;
1775
void get_xid(DRIZZLE_XID *xid); // Innodb only
1777
table::Instance *getInstanceTable();
1778
table::Instance *getInstanceTable(List<CreateField> &field_list);
1783
if (getrusage(RUSAGE_THREAD, &usage))
1792
void setUsage(bool arg)
1797
const struct rusage &getUsage()
1803
// This lives throughout the life of Session
1805
PropertyMap life_properties;
1806
std::vector<table::Instance *> temporary_shares;
1807
struct rusage usage;
1915
MEM_ROOT main_mem_root;
1919
/** A short cut for thd->main_da.set_ok_status(). */
1922
my_ok(THD *thd, ha_rows affected_rows= 0, uint64_t id= 0,
1923
const char *message= NULL)
1925
thd->main_da.set_ok_status(thd, affected_rows, id, message);
1929
/** A short cut for thd->main_da.set_eof_status(). */
1934
thd->main_da.set_eof_status(thd);
1937
#define tmp_disable_binlog(A) \
1938
{uint64_t tmp_disable_binlog__save_options= (A)->options; \
1939
(A)->options&= ~OPTION_BIN_LOG
1941
#define reenable_binlog(A) (A)->options= tmp_disable_binlog__save_options;}
1945
Used to hold information about file and file structure in exchange
1946
via non-DB file (...INTO OUTFILE..., ...LOAD DATA...)
1947
XXX: We never call destructor for objects of this class.
1950
class sql_exchange :public Sql_alloc
1953
enum enum_filetype filetype; /* load XML, Added by Arnold & Erik */
1955
String *field_term,*enclosed,*line_term,*line_start,*escaped;
1959
const CHARSET_INFO *cs;
1960
sql_exchange(char *name, bool dumpfile_flag,
1961
enum_filetype filetype_arg= FILETYPE_CSV);
1964
#include "log_event.h"
1967
This is used to get result from a select
1972
class select_result :public Sql_alloc {
1975
SELECT_LEX_UNIT *unit;
1978
virtual ~select_result() {};
1979
virtual int prepare(List<Item> &list __attribute__((unused)),
1985
virtual int prepare2(void) { return 0; }
1987
Because of peculiarities of prepared statements protocol
1988
we need to know number of columns in the result set (if
1989
there is a result set) apart from sending columns metadata.
1991
virtual uint field_count(List<Item> &fields) const
1992
{ return fields.elements; }
1993
virtual bool send_fields(List<Item> &list, uint flags)=0;
1994
virtual bool send_data(List<Item> &items)=0;
1995
virtual bool initialize_tables (JOIN __attribute__((unused)) *join=0)
1997
virtual void send_error(uint errcode,const char *err);
1998
virtual bool send_eof()=0;
2000
Check if this query returns a result set and therefore is allowed in
2001
cursors and set an error message if it is not the case.
2003
@retval false success
2004
@retval true error, an error message is set
2006
virtual bool check_simple_select() const;
2007
virtual void abort() {}
2009
Cleanup instance of this class for next execution of a prepared
2010
statement/stored procedure.
2012
virtual void cleanup();
2013
void set_thd(THD *thd_arg) { thd= thd_arg; }
2014
void begin_dataset() {}
2019
Base class for select_result descendands which intercept and
2020
transform result set rows. As the rows are not sent to the client,
2021
sending of result set metadata should be suppressed as well.
2024
class select_result_interceptor: public select_result
2027
select_result_interceptor() {} /* Remove gcc warning */
2028
uint field_count(List<Item> &fields __attribute__((unused))) const
2030
bool send_fields(List<Item> &fields __attribute__((unused)),
2031
uint flag __attribute__((unused))) { return false; }
2035
class select_send :public select_result {
2037
True if we have sent result set metadata to the client.
2038
In this case the client always expects us to end the result
2039
set with an eof or error packet
2041
bool is_result_set_started;
2043
select_send() :is_result_set_started(false) {}
2044
bool send_fields(List<Item> &list, uint flags);
2045
bool send_data(List<Item> &items);
2047
virtual bool check_simple_select() const { return false; }
2049
virtual void cleanup();
2053
class select_to_file :public select_result_interceptor {
2055
sql_exchange *exchange;
2059
char path[FN_REFLEN];
2062
select_to_file(sql_exchange *ex) :exchange(ex), file(-1),row_count(0L)
2065
void send_error(uint errcode,const char *err);
1812
2071
#define ESCAPE_CHARS "ntrb0ZN" // keep synchronous with READ_INFO::unescape
1814
} /* namespace drizzled */
1816
/** @TODO why is this in the middle of the file */
1817
#include <drizzled/select_to_file.h>
1818
#include <drizzled/select_export.h>
1819
#include <drizzled/select_dump.h>
1820
#include <drizzled/select_insert.h>
1821
#include <drizzled/select_create.h>
1822
#include <drizzled/tmp_table_param.h>
1823
#include <drizzled/select_union.h>
1824
#include <drizzled/select_subselect.h>
1825
#include <drizzled/select_singlerow_subselect.h>
1826
#include <drizzled/select_max_min_finder_subselect.h>
1827
#include <drizzled/select_exists_subselect.h>
1833
* A structure used to describe sort information
1834
* for a field or item used in ORDER BY.
2075
List of all possible characters of a numeric value text representation.
2077
#define NUMERIC_CHARS ".0123456789e+-"
2080
class select_export :public select_to_file {
2081
uint field_term_length;
2082
int field_sep_char,escape_char,line_sep_char;
2083
int field_term_char; // first char of FIELDS TERMINATED BY or MAX_INT
2085
The is_ambiguous_field_sep field is true if a value of the field_sep_char
2086
field is one of the 'n', 't', 'r' etc characters
2087
(see the READ_INFO::unescape method and the ESCAPE_CHARS constant value).
2089
bool is_ambiguous_field_sep;
2091
The is_ambiguous_field_term is true if field_sep_char contains the first
2092
char of the FIELDS TERMINATED BY (ENCLOSED BY is empty), and items can
2093
contain this character.
2095
bool is_ambiguous_field_term;
2097
The is_unsafe_field_sep field is true if a value of the field_sep_char
2098
field is one of the '0'..'9', '+', '-', '.' and 'e' characters
2099
(see the NUMERIC_CHARS constant value).
2101
bool is_unsafe_field_sep;
2102
bool fixed_row_size;
2104
select_export(sql_exchange *ex) :select_to_file(ex) {}
2106
int prepare(List<Item> &list, SELECT_LEX_UNIT *u);
2107
bool send_data(List<Item> &items);
2111
class select_dump :public select_to_file {
2113
select_dump(sql_exchange *ex) :select_to_file(ex) {}
2114
int prepare(List<Item> &list, SELECT_LEX_UNIT *u);
2115
bool send_data(List<Item> &items);
2119
class select_insert :public select_result_interceptor {
2121
TableList *table_list;
2124
uint64_t autoinc_value_of_last_inserted_row; // autogenerated or not
2126
bool insert_into_view;
2127
select_insert(TableList *table_list_par,
2128
Table *table_par, List<Item> *fields_par,
2129
List<Item> *update_fields, List<Item> *update_values,
2130
enum_duplicates duplic, bool ignore);
2132
int prepare(List<Item> &list, SELECT_LEX_UNIT *u);
2133
virtual int prepare2(void);
2134
bool send_data(List<Item> &items);
2135
virtual void store_values(List<Item> &values);
2136
virtual bool can_rollback_data() { return 0; }
2137
void send_error(uint errcode,const char *err);
2140
/* not implemented: select_insert is never re-used in prepared statements */
2145
class select_create: public select_insert {
2147
TableList *create_table;
2148
HA_CREATE_INFO *create_info;
2149
TableList *select_tables;
2150
Alter_info *alter_info;
2152
/* lock data for tmp table */
2153
DRIZZLE_LOCK *m_lock;
2154
/* m_lock or thd->extra_lock */
2155
DRIZZLE_LOCK **m_plock;
2157
select_create (TableList *table_arg,
2158
HA_CREATE_INFO *create_info_par,
2159
Alter_info *alter_info_arg,
2160
List<Item> &select_fields,enum_duplicates duplic, bool ignore,
2161
TableList *select_tables_arg)
2162
:select_insert (NULL, NULL, &select_fields, 0, 0, duplic, ignore),
2163
create_table(table_arg),
2164
create_info(create_info_par),
2165
select_tables(select_tables_arg),
2166
alter_info(alter_info_arg),
2169
int prepare(List<Item> &list, SELECT_LEX_UNIT *u);
2171
void binlog_show_create_table(Table **tables, uint count);
2172
void store_values(List<Item> &values);
2173
void send_error(uint errcode,const char *err);
2176
virtual bool can_rollback_data() { return 1; }
2178
// Needed for access from local class MY_HOOKS in prepare(), since thd is proteted.
2179
const THD *get_thd(void) { return thd; }
2180
const HA_CREATE_INFO *get_create_info() { return create_info; };
2181
int prepare2(void) { return 0; }
2184
#include <storage/myisam/myisam.h>
2187
Param to create temporary tables when doing SELECT:s
2189
This structure is copied using memcpy as a part of JOIN.
2192
class TMP_TABLE_PARAM :public Sql_alloc
2195
/* Prevent use of these (not safe because of lists and copy_field) */
2196
TMP_TABLE_PARAM(const TMP_TABLE_PARAM &);
2197
void operator=(TMP_TABLE_PARAM &);
2200
List<Item> copy_funcs;
2201
List<Item> save_copy_funcs;
2202
Copy_field *copy_field, *copy_field_end;
2203
Copy_field *save_copy_field, *save_copy_field_end;
2205
Item **items_to_copy; /* Fields in tmp table */
2206
MI_COLUMNDEF *recinfo,*start_recinfo;
2208
ha_rows end_write_records;
2209
uint field_count,sum_func_count,func_count;
2210
uint hidden_field_count;
2211
uint group_parts,group_length,group_null_parts;
2213
bool using_indirect_summary_function;
2214
/* If >0 convert all blob fields to varchar(convert_blob_length) */
2215
uint convert_blob_length;
2216
const CHARSET_INFO *table_charset;
2219
True if GROUP BY and its aggregate functions are already computed
2220
by a table access method (e.g. by loose index scan). In this case
2221
query execution should not perform aggregation and should treat
2222
aggregate functions as normal functions.
2224
bool precomputed_group_by;
2225
bool force_copy_fields;
2227
If true, create_tmp_field called from create_tmp_table will convert
2228
all BIT fields to 64-bit longs. This is a workaround the limitation
2229
that MEMORY tables cannot index BIT columns.
2231
bool bit_fields_as_long;
2234
:copy_field(0), group_parts(0),
2235
group_length(0), group_null_parts(0), convert_blob_length(0),
2236
schema_table(0), precomputed_group_by(0), force_copy_fields(0),
2237
bit_fields_as_long(0)
2244
inline void cleanup(void)
2246
if (copy_field) /* Fix for Intel compiler */
2248
delete [] copy_field;
2249
save_copy_field= copy_field= 0;
2254
class select_union :public select_result_interceptor
2256
TMP_TABLE_PARAM tmp_table_param;
2260
select_union() :table(0) {}
2261
int prepare(List<Item> &list, SELECT_LEX_UNIT *u);
2262
bool send_data(List<Item> &items);
2266
bool create_result_table(THD *thd, List<Item> *column_types,
2267
bool is_distinct, uint64_t options,
2268
const char *alias, bool bit_fields_as_long);
2271
/* Base subselect interface class */
2272
class select_subselect :public select_result_interceptor
2275
Item_subselect *item;
2277
select_subselect(Item_subselect *item);
2278
bool send_data(List<Item> &items)=0;
2279
bool send_eof() { return 0; };
2282
/* Single value subselect interface class */
2283
class select_singlerow_subselect :public select_subselect
2286
select_singlerow_subselect(Item_subselect *item_arg)
2287
:select_subselect(item_arg)
2289
bool send_data(List<Item> &items);
2292
/* used in independent ALL/ANY optimisation */
2293
class select_max_min_finder_subselect :public select_subselect
2296
bool (select_max_min_finder_subselect::*op)();
2299
select_max_min_finder_subselect(Item_subselect *item_arg, bool mx)
2300
:select_subselect(item_arg), cache(0), fmax(mx)
2303
bool send_data(List<Item> &items);
2310
/* EXISTS subselect interface class */
2311
class select_exists_subselect :public select_subselect
2314
select_exists_subselect(Item_subselect *item_arg)
2315
:select_subselect(item_arg){}
2316
bool send_data(List<Item> &items);
2319
/* Structs used when sorting */
2321
typedef struct st_sort_field {
2322
Field *field; /* Field to sort */
2323
Item *item; /* Item if not sorting fields */
2324
uint length; /* Length of sort field */
2325
uint suffix_length; /* Length suffix (0-4) */
2326
Item_result result_type; /* Type of item */
2327
bool reverse; /* if descending sort */
2328
bool need_strxnfrm; /* If we have to use strxnfrm() */
2332
typedef struct st_sort_buffer {
2333
uint index; /* 0 or 1 */
2335
uint change_pos; /* If sort-fields changed */
2337
SORT_FIELD *sortorder;
2340
/* Structure for db & table in sql_yacc */
2342
class Table_ident :public Sql_alloc
2347
SELECT_LEX_UNIT *sel;
2348
inline Table_ident(THD *thd, LEX_STRING db_arg, LEX_STRING table_arg,
2350
:table(table_arg), sel((SELECT_LEX_UNIT *)0)
2352
if (!force && (thd->client_capabilities & CLIENT_NO_SCHEMA))
2357
inline Table_ident(LEX_STRING table_arg)
2358
:table(table_arg), sel((SELECT_LEX_UNIT *)0)
2363
This constructor is used only for the case when we create a derived
2364
table. A derived table has no name and doesn't belong to any database.
2365
Later, if there was an alias specified for the table, it will be set
2366
by add_table_to_list.
2368
inline Table_ident(SELECT_LEX_UNIT *s) : sel(s)
2370
/* We must have a table name here as this is used with add_table_to_list */
2371
db.str= empty_c_string; /* a subject to casedn_str */
2373
table.str= internal_table_name;
2376
bool is_derived_table() const { return test(sel); }
2377
inline void change_db(char *db_name)
2379
db.str= db_name; db.length= (uint) strlen(db_name);
2383
// this is needed for user_vars hash
2384
class user_var_entry
2387
user_var_entry() {} /* Remove gcc warning */
2391
query_id_t update_query_id, used_query_id;
2395
double val_real(bool *null_value);
2396
int64_t val_int(bool *null_value) const;
2397
String *val_str(bool *null_value, String *str, uint decimals);
2398
my_decimal *val_decimal(bool *null_value, my_decimal *result);
2399
DTCollation collation;
2403
Unique -- class for unique (removing of duplicates).
2404
Puts all values to the TREE. If the tree becomes too big,
2405
it's dumped to the file. User can request sorted values, or
2406
just iterate through them. In the last case tree merging is performed in
2407
memory simultaneously with iteration, so it should be ~2-3x faster.
1839
Field *field; /**< Field to sort */
1840
Item *item; /**< Item if not sorting fields */
1841
size_t length; /**< Length of sort field */
1842
uint32_t suffix_length; /**< Length suffix (0-4) */
1843
Item_result result_type; /**< Type of item */
1844
bool reverse; /**< if descending sort */
1845
bool need_strxnfrm; /**< If we have to use strxnfrm() */
1852
result_type(STRING_RESULT),
1859
} /* namespace drizzled */
1861
/** @TODO why is this in the middle of the file */
1863
#include <drizzled/table_ident.h>
1864
#include <drizzled/user_var_entry.h>
1865
#include <drizzled/unique.h>
1866
#include <drizzled/var.h>
1867
#include <drizzled/select_dumpvar.h>
2410
class Unique :public Sql_alloc
2412
DYNAMIC_ARRAY file_ptrs;
2414
uint64_t max_in_memory_size;
2417
uchar *record_pointers;
2423
Unique(qsort_cmp2 comp_func, void *comp_func_fixed_arg,
2424
uint size_arg, uint64_t max_in_memory_size_arg);
2426
ulong elements_in_tree() { return tree.elements_in_tree; }
2427
inline bool unique_add(void *ptr)
2429
if (tree.elements_in_tree > max_elements && flush())
2431
return(!tree_insert(&tree, ptr, 0, tree.custom_arg));
2434
bool get(Table *table);
2435
static double get_use_cost(uint *buffer, uint nkeys, uint key_size,
2436
uint64_t max_in_memory_size);
2437
inline static int get_cost_calc_buff_size(ulong nkeys, uint key_size,
2438
uint64_t max_in_memory_size)
2440
register uint64_t max_elems_in_tree=
2441
(1 + max_in_memory_size / ALIGN_SIZE(sizeof(TREE_ELEMENT)+key_size));
2442
return (int) (sizeof(uint)*(1 + nkeys/max_elems_in_tree));
2446
bool walk(tree_walk_action action, void *walk_action_arg);
2448
friend int unique_write_to_file(uchar* key, element_count count, Unique *unique);
2449
friend int unique_write_to_ptrs(uchar* key, element_count count, Unique *unique);
2453
class multi_delete :public select_result_interceptor
2455
TableList *delete_tables, *table_being_deleted;
2457
ha_rows deleted, found;
2461
/* True if at least one table we delete from is transactional */
2462
bool transactional_tables;
2463
/* True if at least one table we delete from is not transactional */
2465
bool delete_while_scanning;
2467
error handling (rollback and binlogging) can happen in send_eof()
2468
so that afterward send_error() needs to find out that.
2473
multi_delete(TableList *dt, uint num_of_tables);
2475
int prepare(List<Item> &list, SELECT_LEX_UNIT *u);
2476
bool send_data(List<Item> &items);
2477
bool initialize_tables (JOIN *join);
2478
void send_error(uint errcode,const char *err);
2481
virtual void abort();
2485
class multi_update :public select_result_interceptor
2487
TableList *all_tables; /* query/update command tables */
2488
TableList *leaves; /* list of leves of join table tree */
2489
TableList *update_tables, *table_being_updated;
2490
Table **tmp_tables, *main_table, *table_to_update;
2491
TMP_TABLE_PARAM *tmp_table_param;
2492
ha_rows updated, found;
2493
List <Item> *fields, *values;
2494
List <Item> **fields_for_table, **values_for_table;
2497
List of tables referenced in the CHECK OPTION condition of
2498
the updated view excluding the updated table.
2500
List <Table> unupdated_check_opt_tables;
2501
Copy_field *copy_field;
2502
enum enum_duplicates handle_duplicates;
2503
bool do_update, trans_safe;
2504
/* True if the update operation has made a change in a transactional table */
2505
bool transactional_tables;
2508
error handling (rollback and binlogging) can happen in send_eof()
2509
so that afterward send_error() needs to find out that.
2514
multi_update(TableList *ut, TableList *leaves_list,
2515
List<Item> *fields, List<Item> *values,
2516
enum_duplicates handle_duplicates, bool ignore);
2518
int prepare(List<Item> &list, SELECT_LEX_UNIT *u);
2519
bool send_data(List<Item> &items);
2520
bool initialize_tables (JOIN *join);
2521
void send_error(uint errcode,const char *err);
2524
virtual void abort();
2527
class my_var : public Sql_alloc {
2532
enum_field_types type;
2533
my_var (LEX_STRING& j, bool i, uint o, enum_field_types t)
2534
:s(j), local(i), offset(o), type(t)
2539
class select_dumpvar :public select_result_interceptor {
2542
List<my_var> var_list;
2543
select_dumpvar() { var_list.empty(); row_count= 0;}
2544
~select_dumpvar() {}
2545
int prepare(List<Item> &list, SELECT_LEX_UNIT *u);
2546
bool send_data(List<Item> &items);
2548
virtual bool check_simple_select() const;
1872
2552
/* Bits in sql_command_flags */
1874
enum sql_command_flag_bits
1876
CF_BIT_CHANGES_DATA,
1877
CF_BIT_HAS_ROW_COUNT,
1878
CF_BIT_STATUS_COMMAND,
1879
CF_BIT_SHOW_TABLE_COMMAND,
1880
CF_BIT_WRITE_LOGS_COMMAND,
1884
static const std::bitset<CF_BIT_SIZE> CF_CHANGES_DATA(1 << CF_BIT_CHANGES_DATA);
1885
static const std::bitset<CF_BIT_SIZE> CF_HAS_ROW_COUNT(1 << CF_BIT_HAS_ROW_COUNT);
1886
static const std::bitset<CF_BIT_SIZE> CF_STATUS_COMMAND(1 << CF_BIT_STATUS_COMMAND);
1887
static const std::bitset<CF_BIT_SIZE> CF_SHOW_TABLE_COMMAND(1 << CF_BIT_SHOW_TABLE_COMMAND);
1888
static const std::bitset<CF_BIT_SIZE> CF_WRITE_LOGS_COMMAND(1 << CF_BIT_WRITE_LOGS_COMMAND);
1891
const std::string &type(drizzled::Session::global_read_lock_t type);
1892
size_t max_string_length(drizzled::Session::global_read_lock_t type);
1893
} /* namespace display */
1895
} /* namespace drizzled */
1897
#endif /* DRIZZLED_SESSION_H */
2554
#define CF_CHANGES_DATA 1
2555
#define CF_HAS_ROW_COUNT 2
2556
#define CF_STATUS_COMMAND 4
2557
#define CF_SHOW_TABLE_COMMAND 8
2558
#define CF_WRITE_LOGS_COMMAND 16
2560
/* Functions in sql_class.cc */
2562
void add_to_status(STATUS_VAR *to_var, STATUS_VAR *from_var);
2564
void add_diff_to_status(STATUS_VAR *to_var, STATUS_VAR *from_var,
2565
STATUS_VAR *dec_var);
2567
#endif /* DRIZZLE_SERVER */