94
93
/* for VIEW ... WITH CHECK OPTION */
98
class Key_part_spec :public Sql_alloc {
100
LEX_STRING field_name;
102
Key_part_spec(const LEX_STRING &name, uint32_t len)
103
: field_name(name), length(len)
105
Key_part_spec(const char *name, const size_t name_len, uint32_t len)
107
{ field_name.str= (char *)name; field_name.length= name_len; }
108
bool operator==(const Key_part_spec& other) const;
110
Construct a copy of this Key_part_spec. field_name is copied
111
by-pointer as it is known to never change. At the same time
112
'length' may be reset in mysql_prepare_create_table, and this
113
is why we supply it with a copy.
115
@return If out of memory, 0 is returned and an error is set in
118
Key_part_spec *clone(MEM_ROOT *mem_root) const
119
{ return new (mem_root) Key_part_spec(*this); }
123
class Alter_drop :public Sql_alloc {
125
enum drop_type {KEY, COLUMN };
128
Alter_drop(enum drop_type par_type,const char *par_name)
129
:name(par_name), type(par_type) {}
131
Used to make a clone of this object for ALTER/CREATE TABLE
132
@sa comment for Key_part_spec::clone
134
Alter_drop *clone(MEM_ROOT *mem_root) const
135
{ return new (mem_root) Alter_drop(*this); }
139
class Alter_column :public Sql_alloc {
143
Alter_column(const char *par_name,Item *literal)
144
:name(par_name), def(literal) {}
146
Used to make a clone of this object for ALTER/CREATE TABLE
147
@sa comment for Key_part_spec::clone
149
Alter_column *clone(MEM_ROOT *mem_root) const
150
{ return new (mem_root) Alter_column(*this); }
154
class Key :public Sql_alloc {
156
enum Keytype { PRIMARY, UNIQUE, MULTIPLE, FOREIGN_KEY};
158
KEY_CREATE_INFO key_create_info;
159
List<Key_part_spec> columns;
163
Key(enum Keytype type_par, const LEX_STRING &name_arg,
164
KEY_CREATE_INFO *key_info_arg,
165
bool generated_arg, List<Key_part_spec> &cols)
166
:type(type_par), key_create_info(*key_info_arg), columns(cols),
167
name(name_arg), generated(generated_arg)
169
Key(enum Keytype type_par, const char *name_arg, size_t name_len_arg,
170
KEY_CREATE_INFO *key_info_arg, bool generated_arg,
171
List<Key_part_spec> &cols)
172
:type(type_par), key_create_info(*key_info_arg), columns(cols),
173
generated(generated_arg)
175
name.str= (char *)name_arg;
176
name.length= name_len_arg;
178
Key(const Key &rhs, MEM_ROOT *mem_root);
180
/* Equality comparison of keys (ignoring name) */
181
friend bool foreign_key_prefix(Key *a, Key *b);
183
Used to make a clone of this object for ALTER/CREATE TABLE
184
@sa comment for Key_part_spec::clone
186
virtual Key *clone(MEM_ROOT *mem_root) const
187
{ return new (mem_root) Key(*this, mem_root); }
192
class Foreign_key: public Key {
194
enum fk_match_opt { FK_MATCH_UNDEF, FK_MATCH_FULL,
195
FK_MATCH_PARTIAL, FK_MATCH_SIMPLE};
196
enum fk_option { FK_OPTION_UNDEF, FK_OPTION_RESTRICT, FK_OPTION_CASCADE,
197
FK_OPTION_SET_NULL, FK_OPTION_NO_ACTION, FK_OPTION_DEFAULT};
199
Table_ident *ref_table;
200
List<Key_part_spec> ref_columns;
201
uint32_t delete_opt, update_opt, match_opt;
202
Foreign_key(const LEX_STRING &name_arg, List<Key_part_spec> &cols,
203
Table_ident *table, List<Key_part_spec> &ref_cols,
204
uint32_t delete_opt_arg, uint32_t update_opt_arg, uint32_t match_opt_arg)
205
:Key(FOREIGN_KEY, name_arg, &default_key_create_info, 0, cols),
206
ref_table(table), ref_columns(ref_cols),
207
delete_opt(delete_opt_arg), update_opt(update_opt_arg),
208
match_opt(match_opt_arg)
210
Foreign_key(const Foreign_key &rhs, MEM_ROOT *mem_root);
212
Used to make a clone of this object for ALTER/CREATE TABLE
213
@sa comment for Key_part_spec::clone
215
virtual Key *clone(MEM_ROOT *mem_root) const
216
{ return new (mem_root) Foreign_key(*this, mem_root); }
219
typedef struct st_mysql_lock
96
typedef struct drizzled_lock_st
222
uint32_t table_count,lock_count;
223
101
THR_LOCK_DATA **locks;
227
class LEX_COLUMN : public Sql_alloc
232
LEX_COLUMN (const String& x,const uint& y ): column (x),rights (y) {}
104
#include <drizzled/lex_column.h>
235
106
class select_result;
238
#define THD_SENTRY_MAGIC 0xfeedd1ff
239
#define THD_SENTRY_GONE 0xdeadbeef
109
#define Session_SENTRY_MAGIC 0xfeedd1ff
110
#define Session_SENTRY_GONE 0xdeadbeef
241
#define THD_CHECK_SENTRY(thd) assert(thd->dbug_sentry == THD_SENTRY_MAGIC)
112
#define Session_CHECK_SENTRY(session) assert(session->dbug_sentry == Session_SENTRY_MAGIC)
243
114
struct system_variables
116
system_variables() {};
246
118
How dynamically allocated system variables are handled:
248
120
The global_system_variables and max_system_variables are "authoritative"
249
121
They both should have the same 'version' and 'size'.
250
122
When attempting to access a dynamic variable, if the session version
251
123
is out of date, then the session version is updated and realloced if
252
124
neccessary and bytes copied from global to make up for missing data.
254
126
ulong dynamic_variables_version;
255
char* dynamic_variables_ptr;
127
char * dynamic_variables_ptr;
256
128
uint32_t dynamic_variables_head; /* largest valid variable offset */
257
129
uint32_t dynamic_variables_size; /* how many bytes are in use */
259
131
uint64_t myisam_max_extra_sort_file_size;
260
uint64_t myisam_max_sort_file_size;
261
132
uint64_t max_heap_table_size;
262
133
uint64_t tmp_table_size;
263
uint64_t long_query_time;
264
134
ha_rows select_limit;
265
135
ha_rows max_join_size;
266
ulong auto_increment_increment, auto_increment_offset;
267
ulong bulk_insert_buff_size;
268
ulong join_buff_size;
269
ulong max_allowed_packet;
270
ulong max_error_count;
271
ulong max_length_for_sort_data;
272
ulong max_sort_length;
273
ulong max_tmp_tables;
274
ulong min_examined_row_limit;
275
ulong myisam_repair_threads;
276
ulong myisam_sort_buff_size;
277
ulong myisam_stats_method;
278
ulong net_buffer_length;
279
ulong net_interactive_timeout;
280
ulong net_read_timeout;
281
ulong net_retry_count;
282
ulong net_wait_timeout;
283
ulong net_write_timeout;
284
ulong optimizer_prune_level;
285
ulong optimizer_search_depth;
287
Controls use of Engine-MRR:
288
0 - auto, based on cost
289
1 - force MRR when the storage engine is capable of doing it
292
ulong optimizer_use_mrr;
136
uint64_t auto_increment_increment;
137
uint64_t auto_increment_offset;
138
uint64_t bulk_insert_buff_size;
139
uint64_t join_buff_size;
140
uint32_t max_allowed_packet;
141
uint64_t max_error_count;
142
uint64_t max_length_for_sort_data;
143
size_t max_sort_length;
144
uint64_t min_examined_row_limit;
145
uint32_t net_buffer_length;
146
bool optimizer_prune_level;
149
uint32_t optimizer_search_depth;
293
150
/* A bitmap for switching optimizations on/off */
294
ulong optimizer_switch;
295
ulong preload_buff_size;
296
ulong profiling_history_size;
297
ulong query_cache_type;
298
ulong read_buff_size;
299
ulong read_rnd_buff_size;
300
ulong div_precincrement;
302
ulong thread_handling;
304
ulong completion_type;
151
uint32_t optimizer_switch;
152
uint32_t div_precincrement;
153
uint64_t preload_buff_size;
154
uint32_t read_buff_size;
155
uint32_t read_rnd_buff_size;
156
size_t sortbuff_size;
157
uint32_t thread_handling;
158
uint32_t tx_isolation;
159
uint32_t completion_type;
305
160
/* Determines which non-standard SQL behaviour should be enabled */
307
ulong default_week_format;
308
ulong max_seeks_for_key;
309
ulong range_alloc_block_size;
310
ulong query_alloc_block_size;
311
ulong query_prealloc_size;
312
ulong trans_alloc_block_size;
313
ulong trans_prealloc_size;
315
ulong group_concat_max_len;
316
ulong binlog_format; // binlog format for this thd (see enum_binlog_format)
318
In slave thread we need to know in behalf of which
319
thread the query is being run to replicate temp tables properly
321
my_thread_id pseudo_thread_id;
323
bool low_priority_updates;
326
compatibility option:
327
- index usage hints (USE INDEX without a FOR clause) behave as in 5.0
330
bool engine_condition_pushdown;
331
bool keep_files_on_create;
333
bool old_alter_table;
335
plugin_ref table_plugin;
162
uint64_t max_seeks_for_key;
163
size_t range_alloc_block_size;
164
uint32_t query_alloc_block_size;
165
uint32_t query_prealloc_size;
166
uint32_t trans_alloc_block_size;
167
uint32_t trans_prealloc_size;
168
uint64_t group_concat_max_len;
169
/* TODO: change this to my_thread_id - but have to fix set_var first */
170
uint64_t pseudo_thread_id;
172
drizzled::plugin::StorageEngine *storage_engine;
337
174
/* Only charset part of these variables is sensible */
338
175
const CHARSET_INFO *character_set_filesystem;
339
const CHARSET_INFO *character_set_client;
340
const CHARSET_INFO *character_set_results;
342
177
/* Both charset and collation parts of these variables are important */
343
178
const CHARSET_INFO *collation_server;
344
const CHARSET_INFO *collation_database;
345
const CHARSET_INFO *collation_connection;
180
inline const CHARSET_INFO *getCollation(void)
182
return collation_server;
347
185
/* Locale Support */
348
186
MY_LOCALE *lc_time_names;
350
188
Time_zone *time_zone;
352
/* DATE, DATETIME and DRIZZLE_TIME formats */
353
DATE_TIME_FORMAT *date_format;
354
DATE_TIME_FORMAT *datetime_format;
355
DATE_TIME_FORMAT *time_format;
360
#include "sql_lex.h" /* only for SQLCOM_END */
362
/* per thread status variables */
191
extern struct system_variables global_system_variables;
196
* Per-session local status counters
364
198
typedef struct system_status_var
366
200
uint64_t bytes_received;
367
201
uint64_t bytes_sent;
369
ulong com_stat[(uint) SQLCOM_END];
203
ulong com_stat[(uint32_t) SQLCOM_END];
370
204
ulong created_tmp_disk_tables;
371
205
ulong created_tmp_tables;
372
206
ulong ha_commit_count;
563
422
valid database name.
565
424
@note this attribute is set and alloced by the slave SQL thread (for
566
the THD of that thread); that thread is (and must remain, for now) the
425
the Session of that thread); that thread is (and must remain, for now) the
567
426
only responsible for freeing this member.
575
/* This constructor is called for backup statements */
578
Statement(LEX *lex_arg, MEM_ROOT *mem_root_arg, ulong id_arg);
582
struct st_savepoint {
583
struct st_savepoint *prev;
586
Ha_trx_info *ha_list;
589
enum xa_states {XA_NOTR=0, XA_ACTIVE, XA_IDLE, XA_PREPARED};
590
extern const char *xa_state_names[];
592
typedef struct st_xid_state {
593
/* For now, this is only used to catch duplicated external xids */
594
XID xid; // transaction identifier
595
enum xa_states xa_state; // used by external XA only
599
extern pthread_mutex_t LOCK_xid_cache;
600
extern HASH xid_cache;
601
bool xid_cache_init(void);
602
void xid_cache_free(void);
603
XID_STATE *xid_cache_search(XID *xid);
604
bool xid_cache_insert(XID *xid, enum xa_states xa_state);
605
bool xid_cache_insert(XID_STATE *xid_state);
606
void xid_cache_delete(XID_STATE *xid_state);
609
@class Security_context
610
@brief A set of THD members describing the current authenticated user.
613
class Security_context {
615
Security_context() {} /* Remove gcc warning */
617
host - host of the client
618
user - user of the client, set to NULL until the user has been read from
620
priv_user - The user privilege we are using. May be "" for anonymous user.
629
inline char *priv_host_name()
631
return (ip ? ip : (char *)"%");
637
A registry for item tree transformations performed during
638
query optimization. We register only those changes which require
639
a rollback to re-execute a prepared statement or stored procedure
643
struct Item_change_record;
644
typedef I_List<Item_change_record> Item_change_list;
648
Class that holds information about tables which were opened and locked
649
by the thread. It is also used to save/restore this information in
650
push_open_tables_state()/pop_open_tables_state().
653
class Open_tables_state
657
List of regular tables in use by this thread. Contains temporary and
658
base tables that were opened with @see open_tables().
662
List of temporary tables used by this thread. Contains user-level
663
temporary tables, created with CREATE TEMPORARY TABLE, and
664
internal temporary tables, created, e.g., to resolve a SELECT,
665
or for an intermediate table used in ALTER.
666
XXX Why are internal temporary tables added to this list?
668
Table *temporary_tables;
670
List of tables that were opened with HANDLER OPEN and are
671
still in use by this thread.
673
Table *handler_tables;
674
Table *derived_tables;
676
During a MySQL session, one can lock tables in two modes: automatic
677
or manual. In automatic mode all necessary tables are locked just before
678
statement execution, and all acquired locks are stored in 'lock'
679
member. Unlocking takes place automatically as well, when the
681
Manual mode comes into play when a user issues a 'LOCK TABLES'
682
statement. In this mode the user can only use the locked tables.
683
Trying to use any other tables will give an error. The locked tables are
684
stored in 'locked_tables' member. Manual locking is described in
685
the 'LOCK_TABLES' chapter of the MySQL manual.
686
See also lock_tables() for details.
690
Tables that were locked with explicit or implicit LOCK TABLES.
691
(Implicit LOCK TABLES happens when we are prelocking tables for
692
execution of statement which uses stored routines. See description
693
THD::prelocked_mode for more info.)
695
DRIZZLE_LOCK *locked_tables;
698
CREATE-SELECT keeps an extra lock for the table being
699
created. This field is used to keep the extra lock available for
700
lower level routines, which would otherwise miss that lock.
702
DRIZZLE_LOCK *extra_lock;
705
uint32_t current_tablenr;
708
BACKUPS_AVAIL = (1U << 0) /* There are backups available */
712
Flags with information about the open tables state.
714
uint32_t state_flags;
717
This constructor serves for creation of Open_tables_state instances
718
which are used as backup storage.
720
Open_tables_state() : state_flags(0U) { }
722
Open_tables_state(ulong version_arg);
724
void set_open_tables_state(Open_tables_state *state)
729
void reset_open_tables_state()
731
open_tables= temporary_tables= handler_tables= derived_tables= 0;
732
extra_lock= lock= locked_tables= 0;
738
/* Flags for the THD::system_thread variable */
739
enum enum_thread_type
742
SYSTEM_THREAD_SLAVE_IO,
743
SYSTEM_THREAD_SLAVE_SQL
748
This class represents the interface for internal error handlers.
749
Internal error handlers are exception handlers used by the server
752
class Internal_error_handler
755
Internal_error_handler() {}
756
virtual ~Internal_error_handler() {}
760
Handle an error condition.
761
This method can be implemented by a subclass to achieve any of the
763
- mask an error internally, prevent exposing it to the user,
764
- mask an error and throw another one instead.
765
When this method returns true, the error condition is considered
766
'handled', and will not be propagated to upper layers.
767
It is the responsability of the code installing an internal handler
768
to then check for trapped conditions, and implement logic to recover
769
from the anticipated conditions trapped during runtime.
771
This mechanism is similar to C++ try/throw/catch:
772
- 'try' correspond to <code>THD::push_internal_handler()</code>,
773
- 'throw' correspond to <code>my_error()</code>,
774
which invokes <code>my_message_sql()</code>,
775
- 'catch' correspond to checking how/if an internal handler was invoked,
776
before removing it from the exception stack with
777
<code>THD::pop_internal_handler()</code>.
779
@param sql_errno the error number
780
@param level the error level
781
@param thd the calling thread
782
@return true if the error is handled
784
virtual bool handle_error(uint32_t sql_errno,
786
DRIZZLE_ERROR::enum_warning_level level,
792
Stores status of the currently executed statement.
793
Cleared at the beginning of the statement, and then
794
can hold either OK, ERROR, or EOF status.
795
Can not be assigned twice per statement.
798
class Diagnostics_area
801
enum enum_diagnostics_status
803
/** The area is cleared at start of a statement. */
805
/** Set whenever one calls my_ok(). */
807
/** Set whenever one calls my_eof(). */
809
/** Set whenever one calls my_error() or my_message(). */
811
/** Set in case of a custom response, such as one from COM_STMT_PREPARE. */
814
/** True if status information is sent to the client. */
816
/** Set to make set_error_status after set_{ok,eof}_status possible. */
817
bool can_overwrite_status;
819
void set_ok_status(THD *thd, ha_rows affected_rows_arg,
820
uint64_t last_insert_id_arg,
821
const char *message);
822
void set_eof_status(THD *thd);
823
void set_error_status(THD *thd, uint32_t sql_errno_arg, const char *message_arg);
825
void disable_status();
827
void reset_diagnostics_area();
829
bool is_set() const { return m_status != DA_EMPTY; }
830
bool is_error() const { return m_status == DA_ERROR; }
831
bool is_eof() const { return m_status == DA_EOF; }
832
bool is_ok() const { return m_status == DA_OK; }
833
bool is_disabled() const { return m_status == DA_DISABLED; }
834
enum_diagnostics_status status() const { return m_status; }
836
const char *message() const
837
{ assert(m_status == DA_ERROR || m_status == DA_OK); return m_message; }
839
uint32_t sql_errno() const
840
{ assert(m_status == DA_ERROR); return m_sql_errno; }
842
uint32_t server_status() const
844
assert(m_status == DA_OK || m_status == DA_EOF);
845
return m_server_status;
848
ha_rows affected_rows() const
849
{ assert(m_status == DA_OK); return m_affected_rows; }
851
uint64_t last_insert_id() const
852
{ assert(m_status == DA_OK); return m_last_insert_id; }
854
uint32_t total_warn_count() const
856
assert(m_status == DA_OK || m_status == DA_EOF);
857
return m_total_warn_count;
860
Diagnostics_area() { reset_diagnostics_area(); }
863
/** Message buffer. Can be used by OK or ERROR status. */
864
char m_message[DRIZZLE_ERRMSG_SIZE];
866
SQL error number. One of ER_ codes from share/errmsg.txt.
867
Set by set_error_status.
869
uint32_t m_sql_errno;
872
Copied from thd->server_status when the diagnostics area is assigned.
873
We need this member as some places in the code use the following pattern:
874
thd->server_status|= ...
876
thd->server_status&= ~...
877
Assigned by OK, EOF or ERROR.
879
uint32_t m_server_status;
881
The number of rows affected by the last statement. This is
882
semantically close to thd->row_count_func, but has a different
883
life cycle. thd->row_count_func stores the value returned by
884
function ROW_COUNT() and is cleared only by statements that
885
update its value, such as INSERT, UPDATE, DELETE and few others.
886
This member is cleared at the beginning of the next statement.
888
We could possibly merge the two, but life cycle of thd->row_count_func
891
ha_rows m_affected_rows;
893
Similarly to the previous member, this is a replacement of
894
thd->first_successful_insert_id_in_prev_stmt, which is used
895
to implement LAST_INSERT_ID().
897
uint64_t m_last_insert_id;
898
/** The total number of warnings. */
899
uint m_total_warn_count;
900
enum_diagnostics_status m_status;
902
@todo: the following THD members belong here:
903
- warn_list, warn_count,
909
Storage engine specific thread local data.
915
Storage engine specific thread local data.
916
Lifetime: one user connection.
920
0: Life time: one statement within a transaction. If @@autocommit is
921
on, also represents the entire transaction.
922
@sa trans_register_ha()
924
1: Life time: one transaction within a connection.
925
If the storage engine does not participate in a transaction,
926
this should not be used.
927
@sa trans_register_ha()
929
Ha_trx_info ha_info[2];
931
Ha_data() :ha_ptr(NULL) {}
937
For each client connection we create a separate thread with THD serving as
938
a thread/connection descriptor
941
class THD :public Statement,
942
public Open_tables_state
945
/* Used to execute base64 coded binlog events in MySQL server */
946
Relay_log_info* rli_fake;
949
Constant for THD::where initialization in the beginning of every query.
951
It's needed because we do not save/restore THD::where normally during
429
uint32_t db_length; /**< Length of current schema name */
432
Constant for Session::where initialization in the beginning of every query.
434
It's needed because we do not save/restore Session::where normally during
952
435
primary (non subselect) query execution.
954
437
static const char * const DEFAULT_WHERE;
956
NET net; // client connection descriptor
957
MEM_ROOT warn_root; // For warnings and errors
958
Protocol *protocol; // Current protocol
959
Protocol_text protocol_text; // Normal protocol
960
HASH user_vars; // hash for user variables
961
String packet; // dynamic buffer for network I/O
962
String convert_buffer; // buffer for charset conversions
963
struct rand_struct rand; // used for authentication
964
struct system_variables variables; // Changeable local variables
965
struct system_status_var status_var; // Per thread statistic vars
966
struct system_status_var *initial_status_var; /* used by show status */
967
THR_LOCK_INFO lock_info; // Locking info of this thread
968
THR_LOCK_OWNER main_lock_id; // To use for conventional queries
969
THR_LOCK_OWNER *lock_id; // If not main_lock_id, points to
970
// the lock_id of a cursor.
971
pthread_mutex_t LOCK_delete; // Locked before thd is deleted
973
A pointer to the stack frame of handle_one_connection(),
974
which is called first in the thread for handling a client
979
Currently selected catalog.
439
MEM_ROOT warn_root; /**< Allocation area for warnings and errors */
440
drizzled::plugin::Client *client; /**< Pointer to client object */
441
drizzled::plugin::Scheduler *scheduler; /**< Pointer to scheduler object */
442
void *scheduler_arg; /**< Pointer to the optional scheduler argument */
443
HASH user_vars; /**< Hash of user variables defined during the session's lifetime */
444
String packet; /**< dynamic buffer for network I/O */
445
String convert_buffer; /**< A buffer for charset conversions */
446
struct system_variables variables; /**< Mutable local variables local to the session */
447
struct system_status_var status_var; /**< Session-local status counters */
448
struct system_status_var *initial_status_var; /* used by show status */
449
THR_LOCK_INFO lock_info; /**< Locking information for this session */
450
THR_LOCK_OWNER main_lock_id; /**< To use for conventional queries */
451
THR_LOCK_OWNER *lock_id; /**< If not main_lock_id, points to the lock_id of a cursor. */
452
pthread_mutex_t LOCK_delete; /**< Locked before session is deleted */
455
* A peek into the query string for the session. This is a best effort
456
* delivery, there is no guarantee whether the content is meaningful.
458
char process_list_info[PROCESS_LIST_WIDTH+1];
461
* A pointer to the stack frame of the scheduler thread
462
* which is called first in the thread for handling a client
985
Some members of THD (currently 'Statement::db',
986
'catalog' and 'query') are set and alloced by the slave SQL thread
987
(for the THD of that thread); that thread is (and must remain, for now)
468
Some members of Session (currently 'Statement::db',
469
'query') are set and alloced by the slave SQL thread
470
(for the Session of that thread); that thread is (and must remain, for now)
988
471
the only responsible for freeing these 3 members. If you add members
989
472
here, and you add code to set them in replication, don't forget to
990
473
free_them_and_set_them_to_0 in replication properly. For details see
1209
596
in the binlog is still needed; the list's minimum will contain 3.
1211
598
Discrete_intervals_list auto_inc_intervals_in_cur_stmt_for_binlog;
1212
/* Used by replication and SET INSERT_ID */
599
/** Used by replication and SET INSERT_ID */
1213
600
Discrete_intervals_list auto_inc_intervals_forced;
602
uint64_t limit_found_rows;
603
uint64_t options; /**< Bitmap of options */
604
int64_t row_count_func; /**< For the ROW_COUNT() function */
605
ha_rows cuted_fields; /**< Count of "cut" or truncated fields. @todo Kill this friggin thing. */
608
* Number of rows we actually sent to the client, including "synthetic"
609
* rows in ROLLUP etc.
611
ha_rows sent_row_count;
614
* Number of rows we read, sent or not, including in create_sort_index()
616
ha_rows examined_row_count;
619
* The set of those tables whose fields are referenced in all subqueries
624
* Possibly this it is incorrect to have used tables in Session because
625
* with more than one subquery, it is not clear what does the field mean.
627
table_map used_tables;
632
This, and some other variables like 'count_cuted_fields'
633
maybe should be statement/cursor local, that is, moved to Statement
634
class. With current implementation warnings produced in each prepared
635
statement/cursor settle here.
637
List<DRIZZLE_ERROR> warn_list;
638
uint32_t warn_count[(uint32_t) DRIZZLE_ERROR::WARN_LEVEL_END];
639
uint32_t total_warn_count;
640
Diagnostics_area main_da;
643
Id of current query. Statement can be reused to execute several queries
644
query_id is global in context of the whole MySQL server.
645
ID is automatically generated from mutex-protected counter.
646
It's used in handler code for various purposes: to check which columns
647
from table are necessary for this select, to check if it's necessary to
648
update auto-updatable fields (like auto_increment and timestamp).
654
/* Statement id is thread-wide. This counter is used to generate ids */
655
uint32_t statement_id_counter;
656
uint32_t rand_saved_seed1;
657
uint32_t rand_saved_seed2;
659
Row counter, mainly for errors and warnings. Not increased in
660
create_sort_index(); may differ from examined_row_count.
663
pthread_t real_id; /**< For debugging */
664
my_thread_id thread_id;
666
uint32_t global_read_lock;
667
uint32_t server_status;
668
uint32_t open_options;
669
uint32_t select_number; /**< number of select (used for EXPLAIN) */
670
/* variables.transaction_isolation is reset to this after each commit */
671
enum_tx_isolation session_tx_isolation;
672
enum_check_fields count_cuted_fields;
680
KILLED_NO_VALUE /* means none of the above states apply */
682
killed_state volatile killed;
684
bool some_tables_deleted;
688
Set to true if execution of the current compound statement
689
can not continue. In particular, disables activation of
690
CONTINUE or EXIT handlers of stored routines.
691
Reset in the end of processing of the current user request, in
692
@see mysql_reset_session_for_next_command().
696
Set by a storage engine to request the entire
697
transaction (that possibly spans multiple engines) to
698
rollback. Reset in ha_rollback.
700
bool transaction_rollback_request;
702
true if we are in a sub-statement and the current error can
703
not be safely recovered until we left the sub-statement mode.
704
In particular, disables activation of CONTINUE and EXIT
705
handlers inside sub-statements. E.g. if it is a deadlock
706
error and requires a transaction-wide rollback, this flag is
707
raised (traditionally, MySQL first has to close all the reads
708
via @see handler::ha_index_or_rnd_end() and only then perform
710
Reset to false when we leave the sub-statement mode.
712
bool is_fatal_sub_stmt_error;
713
/** for IS NULL => = last_insert_id() fix in remove_eq_conds() */
714
bool substitute_null_with_insert_id;
717
bool abort_on_warning;
718
bool got_warning; /**< Set on call to push_warning() */
719
bool no_warnings_for_error; /**< no warnings on call to my_error() */
720
/** set during loop of derived table processing */
721
bool derived_tables_processing;
722
bool tablespace_op; /**< This is true in DISCARD/IMPORT TABLESPACE */
724
/** Used by the sys_var class to store temporary values */
728
uint32_t uint32_t_value;
729
int32_t int32_t_value;
730
uint64_t uint64_t_value;
734
Character input stream consumed by the lexical analyser,
736
Note that since the parser is not re-entrant, we keep only one input
737
stream here. This member is valid only when executing code during parsing,
738
and may point to invalid memory after that.
740
Lex_input_stream *m_lip;
742
/** Place to store various things */
743
void *session_marker;
744
/** Keeps a copy of the previous table around in case we are just slamming on particular table */
748
Points to info-string that we show in SHOW PROCESSLIST
749
You are supposed to call Session_SET_PROC_INFO only if you have coded
750
a time-consuming piece that MySQL can get stuck in for a long time.
752
Set it using the session_proc_info(Session *thread, const char *message)
755
inline void set_proc_info(const char *info)
759
inline const char* get_proc_info() const
764
inline void setReplicationData (void *data)
766
replication_data= data;
768
inline void *getReplicationData () const
770
return replication_data;
773
/** Returns the current query ID */
774
inline query_id_t getQueryId() const
779
/** Returns the current query text */
780
inline const char *getQueryString() const
785
/** Returns the length of the current query text */
786
inline size_t getQueryLength() const
789
return strlen(query);
794
/** Accessor method returning the session's ID. */
795
inline uint64_t getSessionId() const
800
/** Accessor method returning the server's ID. */
801
inline uint32_t getServerId() const
803
/* We return the global server ID. */
807
/** Returns the current transaction ID for the session's current statement */
808
inline my_xid getTransactionId()
810
return transaction.xid_state.xid.quick_get_my_xid();
1215
813
There is BUG#19630 where statement-based replication of stored
1216
814
functions/triggers with two auto_increment columns breaks.
1217
815
We however ensure that it works when there is 0 or 1 auto_increment
1274
865
auto_inc_intervals_forced.append(next_id, UINT64_MAX, 0);
1277
uint64_t limit_found_rows;
1278
uint64_t options; /* Bitmap of states */
1279
int64_t row_count_func; /* For the ROW_COUNT() function */
1280
ha_rows cuted_fields;
1283
number of rows we actually sent to the client, including "synthetic"
1286
ha_rows sent_row_count;
1289
number of rows we read, sent or not, including in create_sort_index()
1291
ha_rows examined_row_count;
1294
The set of those tables whose fields are referenced in all subqueries
1296
TODO: possibly this it is incorrect to have used tables in THD because
1297
with more than one subquery, it is not clear what does the field mean.
1299
table_map used_tables;
1300
USER_CONN *user_connect;
1301
const CHARSET_INFO *db_charset;
1303
FIXME: this, and some other variables like 'count_cuted_fields'
1304
maybe should be statement/cursor local, that is, moved to Statement
1305
class. With current implementation warnings produced in each prepared
1306
statement/cursor settle here.
1308
List <DRIZZLE_ERROR> warn_list;
1309
uint warn_count[(uint) DRIZZLE_ERROR::WARN_LEVEL_END];
1310
uint total_warn_count;
1311
Diagnostics_area main_da;
1314
Id of current query. Statement can be reused to execute several queries
1315
query_id is global in context of the whole MySQL server.
1316
ID is automatically generated from mutex-protected counter.
1317
It's used in handler code for various purposes: to check which columns
1318
from table are necessary for this select, to check if it's necessary to
1319
update auto-updatable fields (like auto_increment and timestamp).
1321
query_id_t query_id, warn_id;
1324
#ifdef ERROR_INJECT_SUPPORT
1325
ulong error_inject_value;
1327
/* Statement id is thread-wide. This counter is used to generate ids */
1328
ulong statement_id_counter;
1329
ulong rand_saved_seed1, rand_saved_seed2;
1331
Row counter, mainly for errors and warnings. Not increased in
1332
create_sort_index(); may differ from examined_row_count.
1335
pthread_t real_id; /* For debugging */
1336
my_thread_id thread_id;
1337
uint tmp_table, global_read_lock;
1338
uint server_status,open_options;
1339
enum enum_thread_type system_thread;
1340
uint32_t select_number; //number of select (used for EXPLAIN)
1341
/* variables.transaction_isolation is reset to this after each commit */
1342
enum_tx_isolation session_tx_isolation;
1343
enum_check_fields count_cuted_fields;
1345
DYNAMIC_ARRAY user_var_events; /* For user variables replication */
1346
MEM_ROOT *user_var_events_alloc; /* Allocate above array elements here */
1352
KILL_CONNECTION=ER_SERVER_SHUTDOWN,
1353
KILL_QUERY=ER_QUERY_INTERRUPTED,
1354
KILLED_NO_VALUE /* means neither of the states */
1356
killed_state volatile killed;
1358
/* scramble - random string sent to client on handshake */
1359
char scramble[SCRAMBLE_LENGTH+1];
1361
bool slave_thread, one_shot_set;
1362
/* tells if current statement should binlog row-based(1) or stmt-based(0) */
1363
bool current_stmt_binlog_row_based;
1364
bool some_tables_deleted;
1365
bool last_cuted_field;
1366
bool no_errors, password;
1368
Set to true if execution of the current compound statement
1369
can not continue. In particular, disables activation of
1370
CONTINUE or EXIT handlers of stored routines.
1371
Reset in the end of processing of the current user request, in
1372
@see mysql_reset_thd_for_next_command().
1374
bool is_fatal_error;
1376
Set by a storage engine to request the entire
1377
transaction (that possibly spans multiple engines) to
1378
rollback. Reset in ha_rollback.
1380
bool transaction_rollback_request;
1382
true if we are in a sub-statement and the current error can
1383
not be safely recovered until we left the sub-statement mode.
1384
In particular, disables activation of CONTINUE and EXIT
1385
handlers inside sub-statements. E.g. if it is a deadlock
1386
error and requires a transaction-wide rollback, this flag is
1387
raised (traditionally, MySQL first has to close all the reads
1388
via @see handler::ha_index_or_rnd_end() and only then perform
1390
Reset to false when we leave the sub-statement mode.
1392
bool is_fatal_sub_stmt_error;
1393
bool query_start_used, rand_used, time_zone_used;
1394
/* for IS NULL => = last_insert_id() fix in remove_eq_conds() */
1395
bool substitute_null_with_insert_id;
1396
bool in_lock_tables;
1398
True if a slave error. Causes the slave to stop. Not the same
1399
as the statement execution error (is_error()), since
1400
a statement may be expected to return an error, e.g. because
1401
it returned an error on master, and this is OK on the slave.
1403
bool is_slave_error;
1404
bool bootstrap, cleanup_done;
1406
/** is set if some thread specific value(s) used in a statement. */
1407
bool thread_specific_used;
1408
bool charset_is_system_charset, charset_is_collation_connection;
1409
bool charset_is_character_set_filesystem;
1410
bool enable_slow_log; /* enable slow log for current statement */
1411
bool abort_on_warning;
1412
bool got_warning; /* Set on call to push_warning() */
1413
bool no_warnings_for_error; /* no warnings on call to my_error() */
1414
/* set during loop of derived table processing */
1415
bool derived_tables_processing;
1416
bool tablespace_op; /* This is true in DISCARD/IMPORT TABLESPACE */
1419
If we do a purge of binary logs, log index info of the threads
1420
that are currently reading it needs to be adjusted. To do that
1421
each thread that is using LOG_INFO needs to adjust the pointer to it
1423
LOG_INFO* current_linfo;
1424
NET* slave_net; // network connection from slave -> m.
1425
/* Used by the sys_var class to store temporary values */
1431
uint64_t uint64_t_value;
1436
If true, mysql_bin_log::write(Log_event) call will not write events to
1437
binlog, and maintain 2 below variables instead (use
1438
mysql_bin_log.start_union_events to turn this on)
1442
If true, at least one mysql_bin_log::write(Log_event) call has been
1443
made after last mysql_bin_log.start_union_events() call.
1445
bool unioned_events;
1447
If true, at least one mysql_bin_log::write(Log_event e), where
1448
e.cache_stmt == true call has been made after last
1449
mysql_bin_log.start_union_events() call.
1451
bool unioned_events_trans;
1454
'queries' (actually SP statements) that run under inside this binlog
1455
union have thd->query_id >= first_query_id.
1457
query_id_t first_query_id;
1461
Character input stream consumed by the lexical analyser,
1462
used during parsing.
1463
Note that since the parser is not re-entrant, we keep only one input
1464
stream here. This member is valid only when executing code during parsing,
1465
and may point to invalid memory after that.
1467
Lex_input_stream *m_lip;
1474
Initialize memory roots necessary for query processing and (!)
1475
pre-allocate memory for it. We can't do that in THD constructor because
1476
there are use cases (acl_init, watcher threads,
1477
killing mysqld) where it's vital to not allocate excessive and not used
1478
memory. Note, that we still don't return error from init_for_queries():
1479
if preallocation fails, we should notice that at the first call to
1482
void init_for_queries();
1483
void change_user(void);
868
Session(drizzled::plugin::Client *client_arg);
1484
871
void cleanup(void);
873
* Cleans up after query.
877
* This function is used to reset thread data to its default state.
879
* This function is not suitable for setting thread data to some
880
* non-default values, as there is only one replication thread, so
881
* different master threads may overwrite data of each other on
1485
884
void cleanup_after_query();
1486
bool store_globals();
1487
void awake(THD::killed_state state_to_set);
1489
enum enum_binlog_query_type {
1491
The query can be logged row-based or statement-based
1496
The query has to be logged statement-based
1501
The query represents a change to a table in the "mysql"
1502
database and is currently mapped to ROW_QUERY_TYPE.
1508
int binlog_query(enum_binlog_query_type qtype,
1509
char const *query, ulong query_len,
1510
bool is_trans, bool suppress_use,
1511
THD::killed_state killed_err_arg= THD::KILLED_NO_VALUE);
886
void awake(Session::killed_state state_to_set);
888
* Pulls thread-specific variables into Session state.
890
* Returns true most times, or false if there was a problem
891
* allocating resources for thread-specific storage.
893
* @TODO Kill this. It's not necessary once my_thr_init() is bye bye.
899
Initialize memory roots necessary for query processing and (!)
900
pre-allocate memory for it. We can't do that in Session constructor because
901
there are use cases where it's vital to not allocate excessive and not used
904
void prepareForQueries();
907
* Executes a single statement received from the
910
* Returns true if the statement was successful, or false
915
* For profiling to work, it must never be called recursively.
917
* In MySQL, this used to be the do_command() C function whic
918
* accepted a single parameter of the THD pointer.
920
bool executeStatement();
923
* Reads a query from packet and stores it.
925
* Returns true if query is read and allocated successfully,
926
* false otherwise. On a return of false, Session::fatal_error
929
* @note Used in COM_QUERY and COM_STMT_PREPARE.
931
* Sets the following Session variables:
935
* @param The packet pointer to read from
936
* @param The length of the query to read
938
bool readAndStoreQuery(const char *in_packet, uint32_t in_packet_length);
941
* Ends the current transaction and (maybe) begins the next.
943
* Returns true if the transaction completed successfully,
946
* @param Completion type
948
bool endTransaction(enum enum_mysql_completiontype completion);
949
bool endActiveTransaction();
950
bool startTransaction();
953
* Authenticates users, with error reporting.
955
* Returns true on success, or false on failure.
962
* This will initialize the session and begin the command loop.
967
* Schedule a session to be run on the default scheduler.
1514
972
For enter_cond() / exit_cond() to work the mutex must be got before
1515
973
enter_cond(); this mutex is then released by exit_cond().
1516
974
Usage must be: lock mutex; enter_cond(); your code; exit_cond().
1518
inline const char* enter_cond(pthread_cond_t *cond, pthread_mutex_t* mutex,
976
inline const char* enter_cond(pthread_cond_t *cond, pthread_mutex_t* mutex, const char* msg)
1521
978
const char* old_msg = get_proc_info();
1522
979
safe_mutex_assert_owner(mutex);
1523
980
mysys_var->current_mutex = mutex;
1524
981
mysys_var->current_cond = cond;
1525
thd_proc_info(this, msg);
982
this->set_proc_info(msg);
1528
985
inline void exit_cond(const char* old_msg)
1815
1256
tree itself is reused between executions and thus is stored elsewhere.
1817
1258
MEM_ROOT main_mem_root;
1821
/** A short cut for thd->main_da.set_ok_status(). */
1824
my_ok(THD *thd, ha_rows affected_rows= 0, uint64_t id= 0,
1825
const char *message= NULL)
1827
thd->main_da.set_ok_status(thd, affected_rows, id, message);
1831
/** A short cut for thd->main_da.set_eof_status(). */
1836
thd->main_da.set_eof_status(thd);
1839
#define tmp_disable_binlog(A) \
1840
{uint64_t tmp_disable_binlog__save_options= (A)->options; \
1841
(A)->options&= ~OPTION_BIN_LOG
1843
#define reenable_binlog(A) (A)->options= tmp_disable_binlog__save_options;}
1847
Used to hold information about file and file structure in exchange
1848
via non-DB file (...INTO OUTFILE..., ...LOAD DATA...)
1849
XXX: We never call destructor for objects of this class.
1852
class sql_exchange :public Sql_alloc
1855
enum enum_filetype filetype; /* load XML, Added by Arnold & Erik */
1857
String *field_term,*enclosed,*line_term,*line_start,*escaped;
1861
const CHARSET_INFO *cs;
1862
sql_exchange(char *name, bool dumpfile_flag,
1863
enum_filetype filetype_arg= FILETYPE_CSV);
1866
#include "log_event.h"
1869
This is used to get result from a select
1261
* Marks all tables in the list which were used by current substatement
1262
* as free for reuse.
1264
* @param Head of the list of tables
1268
* The reason we reset query_id is that it's not enough to just test
1269
* if table->query_id != session->query_id to know if a table is in use.
1273
* SELECT f1_that_uses_t1() FROM t1;
1275
* In f1_that_uses_t1() we will see one instance of t1 where query_id is
1276
* set to query_id of original query.
1278
void mark_used_tables_as_free_for_reuse(Table *table);
1280
Mark all temporary tables which were used by the current statement or
1281
substatement as free for reuse, but only if the query_id can be cleared.
1283
@param session thread context
1285
@remark For temp tables associated with a open SQL HANDLER the query_id
1286
is not reset until the HANDLER is closed.
1288
void mark_temp_tables_as_free_for_reuse();
1292
/** A short cut for session->main_da.set_ok_status(). */
1293
inline void my_ok(ha_rows affected_rows= 0, ha_rows found_rows_arg= 0,
1294
uint64_t passed_id= 0, const char *message= NULL)
1296
main_da.set_ok_status(this, affected_rows, found_rows_arg, passed_id, message);
1300
/** A short cut for session->main_da.set_eof_status(). */
1302
inline void my_eof()
1304
main_da.set_eof_status(this);
1307
/* Some inline functions for more speed */
1309
inline bool add_item_to_list(Item *item)
1311
return lex->current_select->add_item_to_list(this, item);
1314
inline bool add_value_to_list(Item *value)
1316
return lex->value_list.push_back(value);
1319
inline bool add_order_to_list(Item *item, bool asc)
1321
return lex->current_select->add_order_to_list(this, item, asc);
1324
inline bool add_group_to_list(Item *item, bool asc)
1326
return lex->current_select->add_group_to_list(this, item, asc);
1328
void refresh_status();
1329
user_var_entry *getVariable(LEX_STRING &name, bool create_if_not_exists);
1332
* Closes all tables used by the current substatement, or all tables
1333
* used by this thread if we are on the upper level.
1335
void close_thread_tables();
1336
void close_old_data_files(bool morph_locks= false,
1337
bool send_refresh= false);
1338
void close_open_tables();
1339
void close_data_files_and_morph_locks(const char *db, const char *table_name);
1342
bool free_cached_table();
1346
* Prepares statement for reopening of tables and recalculation of set of
1349
* @param Pointer to a pointer to a list of tables which we were trying to open and lock
1351
void close_tables_for_reopen(TableList **tables);
1355
* Open all tables in list, locks them (all, including derived)
1357
* @param Pointer to a list of tables for open & locking
1366
* The lock will automaticaly be freed by close_thread_tables()
1368
bool openTablesLock(TableList *tables);
1371
* Open all tables in list and process derived tables
1373
* @param Pointer to a list of tables for open
1374
* @param Bitmap of flags to modify how the tables will be open:
1375
* DRIZZLE_LOCK_IGNORE_FLUSH - open table even if someone has
1376
* done a flush or namelock on it.
1385
* This is to be used on prepare stage when you don't read any
1386
* data from the tables.
1388
bool openTables(TableList *tables, uint32_t flags= 0);
1390
int open_tables_from_list(TableList **start, uint32_t *counter, uint32_t flags= 0);
1392
Table *openTableLock(TableList *table_list, thr_lock_type lock_type);
1393
Table *openTable(TableList *table_list, bool *refresh, uint32_t flags= 0);
1395
void unlink_open_table(Table *find);
1396
void drop_open_table(Table *table, const char *db_name,
1397
const char *table_name);
1398
void close_cached_table(Table *table);
1400
/* Create a lock in the cache */
1401
Table *table_cache_insert_placeholder(const char *key, uint32_t key_length);
1402
bool lock_table_name_if_not_cached(const char *db,
1403
const char *table_name, Table **table);
1405
/* Work with temporary tables */
1406
Table *find_temporary_table(TableList *table_list);
1407
Table *find_temporary_table(const char *db, const char *table_name);
1408
void close_temporary_tables();
1409
void close_temporary_table(Table *table, bool free_share, bool delete_table);
1410
void close_temporary(Table *table, bool free_share, bool delete_table);
1411
int drop_temporary_table(TableList *table_list);
1412
bool rm_temporary_table(drizzled::plugin::StorageEngine *base, char *path);
1413
Table *open_temporary_table(const char *path, const char *db,
1414
const char *table_name, bool link_in_list,
1415
open_table_mode open_mode);
1417
/* Reopen operations */
1418
bool reopen_tables(bool get_locks, bool mark_share_as_old);
1419
bool reopen_name_locked_table(TableList* table_list, bool link_in);
1420
bool close_cached_tables(TableList *tables, bool wait_for_refresh, bool wait_for_placeholders);
1422
void wait_for_condition(pthread_mutex_t *mutex, pthread_cond_t *cond);
1423
int setup_conds(TableList *leaves, COND **conds);
1424
int lock_tables(TableList *tables, uint32_t count, bool *need_reopen);
1874
class select_result :public Sql_alloc {
1877
SELECT_LEX_UNIT *unit;
1880
virtual ~select_result() {};
1881
virtual int prepare(List<Item> &list __attribute__((unused)),
1887
virtual int prepare2(void) { return 0; }
1889
Because of peculiarities of prepared statements protocol
1890
we need to know number of columns in the result set (if
1891
there is a result set) apart from sending columns metadata.
1893
virtual uint32_t field_count(List<Item> &fields) const
1894
{ return fields.elements; }
1895
virtual bool send_fields(List<Item> &list, uint32_t flags)=0;
1896
virtual bool send_data(List<Item> &items)=0;
1897
virtual bool initialize_tables (JOIN __attribute__((unused)) *join=0)
1899
virtual void send_error(uint32_t errcode,const char *err);
1900
virtual bool send_eof()=0;
1902
Check if this query returns a result set and therefore is allowed in
1903
cursors and set an error message if it is not the case.
1905
@retval false success
1906
@retval true error, an error message is set
1908
virtual bool check_simple_select() const;
1909
virtual void abort() {}
1911
Cleanup instance of this class for next execution of a prepared
1912
statement/stored procedure.
1914
virtual void cleanup();
1915
void set_thd(THD *thd_arg) { thd= thd_arg; }
1916
void begin_dataset() {}
1921
Base class for select_result descendands which intercept and
1922
transform result set rows. As the rows are not sent to the client,
1923
sending of result set metadata should be suppressed as well.
1926
class select_result_interceptor: public select_result
1929
select_result_interceptor() {} /* Remove gcc warning */
1930
uint32_t field_count(List<Item> &fields __attribute__((unused))) const
1932
bool send_fields(List<Item> &fields __attribute__((unused)),
1933
uint32_t flag __attribute__((unused))) { return false; }
1937
class select_send :public select_result {
1939
True if we have sent result set metadata to the client.
1940
In this case the client always expects us to end the result
1941
set with an eof or error packet
1943
bool is_result_set_started;
1945
select_send() :is_result_set_started(false) {}
1946
bool send_fields(List<Item> &list, uint32_t flags);
1947
bool send_data(List<Item> &items);
1949
virtual bool check_simple_select() const { return false; }
1951
virtual void cleanup();
1955
class select_to_file :public select_result_interceptor {
1957
sql_exchange *exchange;
1961
char path[FN_REFLEN];
1964
select_to_file(sql_exchange *ex) :exchange(ex), file(-1),row_count(0L)
1967
void send_error(uint32_t errcode,const char *err);
1973
1429
#define ESCAPE_CHARS "ntrb0ZN" // keep synchronous with READ_INFO::unescape
1977
List of all possible characters of a numeric value text representation.
1979
#define NUMERIC_CHARS ".0123456789e+-"
1982
class select_export :public select_to_file {
1983
uint32_t field_term_length;
1984
int field_sep_char,escape_char,line_sep_char;
1985
int field_term_char; // first char of FIELDS TERMINATED BY or MAX_INT
1987
The is_ambiguous_field_sep field is true if a value of the field_sep_char
1988
field is one of the 'n', 't', 'r' etc characters
1989
(see the READ_INFO::unescape method and the ESCAPE_CHARS constant value).
1991
bool is_ambiguous_field_sep;
1993
The is_ambiguous_field_term is true if field_sep_char contains the first
1994
char of the FIELDS TERMINATED BY (ENCLOSED BY is empty), and items can
1995
contain this character.
1997
bool is_ambiguous_field_term;
1999
The is_unsafe_field_sep field is true if a value of the field_sep_char
2000
field is one of the '0'..'9', '+', '-', '.' and 'e' characters
2001
(see the NUMERIC_CHARS constant value).
2003
bool is_unsafe_field_sep;
2004
bool fixed_row_size;
2006
select_export(sql_exchange *ex) :select_to_file(ex) {}
2008
int prepare(List<Item> &list, SELECT_LEX_UNIT *u);
2009
bool send_data(List<Item> &items);
2013
class select_dump :public select_to_file {
2015
select_dump(sql_exchange *ex) :select_to_file(ex) {}
2016
int prepare(List<Item> &list, SELECT_LEX_UNIT *u);
2017
bool send_data(List<Item> &items);
2021
class select_insert :public select_result_interceptor {
2023
TableList *table_list;
2026
uint64_t autoinc_value_of_last_inserted_row; // autogenerated or not
2028
bool insert_into_view;
2029
select_insert(TableList *table_list_par,
2030
Table *table_par, List<Item> *fields_par,
2031
List<Item> *update_fields, List<Item> *update_values,
2032
enum_duplicates duplic, bool ignore);
2034
int prepare(List<Item> &list, SELECT_LEX_UNIT *u);
2035
virtual int prepare2(void);
2036
bool send_data(List<Item> &items);
2037
virtual void store_values(List<Item> &values);
2038
virtual bool can_rollback_data() { return 0; }
2039
void send_error(uint32_t errcode,const char *err);
2042
/* not implemented: select_insert is never re-used in prepared statements */
2047
class select_create: public select_insert {
2049
TableList *create_table;
2050
HA_CREATE_INFO *create_info;
2051
TableList *select_tables;
2052
Alter_info *alter_info;
2054
/* lock data for tmp table */
2055
DRIZZLE_LOCK *m_lock;
2056
/* m_lock or thd->extra_lock */
2057
DRIZZLE_LOCK **m_plock;
2059
select_create (TableList *table_arg,
2060
HA_CREATE_INFO *create_info_par,
2061
Alter_info *alter_info_arg,
2062
List<Item> &select_fields,enum_duplicates duplic, bool ignore,
2063
TableList *select_tables_arg)
2064
:select_insert (NULL, NULL, &select_fields, 0, 0, duplic, ignore),
2065
create_table(table_arg),
2066
create_info(create_info_par),
2067
select_tables(select_tables_arg),
2068
alter_info(alter_info_arg),
2071
int prepare(List<Item> &list, SELECT_LEX_UNIT *u);
2073
void binlog_show_create_table(Table **tables, uint32_t count);
2074
void store_values(List<Item> &values);
2075
void send_error(uint32_t errcode,const char *err);
2078
virtual bool can_rollback_data() { return 1; }
2080
// Needed for access from local class MY_HOOKS in prepare(), since thd is proteted.
2081
const THD *get_thd(void) { return thd; }
2082
const HA_CREATE_INFO *get_create_info() { return create_info; };
2083
int prepare2(void) { return 0; }
2086
#include <storage/myisam/myisam.h>
2089
Param to create temporary tables when doing SELECT:s
2091
This structure is copied using memcpy as a part of JOIN.
2094
class TMP_TABLE_PARAM :public Sql_alloc
2097
/* Prevent use of these (not safe because of lists and copy_field) */
2098
TMP_TABLE_PARAM(const TMP_TABLE_PARAM &);
2099
void operator=(TMP_TABLE_PARAM &);
2102
List<Item> copy_funcs;
2103
List<Item> save_copy_funcs;
2104
Copy_field *copy_field, *copy_field_end;
2105
Copy_field *save_copy_field, *save_copy_field_end;
2106
unsigned char *group_buff;
2107
Item **items_to_copy; /* Fields in tmp table */
2108
MI_COLUMNDEF *recinfo,*start_recinfo;
2110
ha_rows end_write_records;
2111
uint field_count,sum_func_count,func_count;
2112
uint32_t hidden_field_count;
2113
uint group_parts,group_length,group_null_parts;
2115
bool using_indirect_summary_function;
2116
/* If >0 convert all blob fields to varchar(convert_blob_length) */
2117
uint32_t convert_blob_length;
2118
const CHARSET_INFO *table_charset;
2121
True if GROUP BY and its aggregate functions are already computed
2122
by a table access method (e.g. by loose index scan). In this case
2123
query execution should not perform aggregation and should treat
2124
aggregate functions as normal functions.
2126
bool precomputed_group_by;
2127
bool force_copy_fields;
2129
If true, create_tmp_field called from create_tmp_table will convert
2130
all BIT fields to 64-bit longs. This is a workaround the limitation
2131
that MEMORY tables cannot index BIT columns.
2133
bool bit_fields_as_long;
2136
:copy_field(0), group_parts(0),
2137
group_length(0), group_null_parts(0), convert_blob_length(0),
2138
schema_table(0), precomputed_group_by(0), force_copy_fields(0),
2139
bit_fields_as_long(0)
2146
inline void cleanup(void)
2148
if (copy_field) /* Fix for Intel compiler */
2150
delete [] copy_field;
2151
save_copy_field= copy_field= 0;
2156
class select_union :public select_result_interceptor
2158
TMP_TABLE_PARAM tmp_table_param;
2162
select_union() :table(0) {}
2163
int prepare(List<Item> &list, SELECT_LEX_UNIT *u);
2164
bool send_data(List<Item> &items);
2168
bool create_result_table(THD *thd, List<Item> *column_types,
2169
bool is_distinct, uint64_t options,
2170
const char *alias, bool bit_fields_as_long);
2173
/* Base subselect interface class */
2174
class select_subselect :public select_result_interceptor
2177
Item_subselect *item;
2179
select_subselect(Item_subselect *item);
2180
bool send_data(List<Item> &items)=0;
2181
bool send_eof() { return 0; };
2184
/* Single value subselect interface class */
2185
class select_singlerow_subselect :public select_subselect
2188
select_singlerow_subselect(Item_subselect *item_arg)
2189
:select_subselect(item_arg)
2191
bool send_data(List<Item> &items);
2194
/* used in independent ALL/ANY optimisation */
2195
class select_max_min_finder_subselect :public select_subselect
2198
bool (select_max_min_finder_subselect::*op)();
2201
select_max_min_finder_subselect(Item_subselect *item_arg, bool mx)
2202
:select_subselect(item_arg), cache(0), fmax(mx)
2205
bool send_data(List<Item> &items);
2212
/* EXISTS subselect interface class */
2213
class select_exists_subselect :public select_subselect
2216
select_exists_subselect(Item_subselect *item_arg)
2217
:select_subselect(item_arg){}
2218
bool send_data(List<Item> &items);
2221
/* Structs used when sorting */
2223
typedef struct st_sort_field {
2224
Field *field; /* Field to sort */
2225
Item *item; /* Item if not sorting fields */
2226
uint length; /* Length of sort field */
2227
uint32_t suffix_length; /* Length suffix (0-4) */
2228
Item_result result_type; /* Type of item */
2229
bool reverse; /* if descending sort */
2230
bool need_strxnfrm; /* If we have to use strxnfrm() */
1431
#include <drizzled/select_to_file.h>
1432
#include <drizzled/select_export.h>
1433
#include <drizzled/select_dump.h>
1434
#include <drizzled/select_insert.h>
1435
#include <drizzled/select_create.h>
1436
#include <plugin/myisam/myisam.h>
1437
#include <drizzled/tmp_table_param.h>
1438
#include <drizzled/select_union.h>
1439
#include <drizzled/select_subselect.h>
1440
#include <drizzled/select_singlerow_subselect.h>
1441
#include <drizzled/select_max_min_finder_subselect.h>
1442
#include <drizzled/select_exists_subselect.h>
1445
* A structure used to describe sort information
1446
* for a field or item used in ORDER BY.
1448
typedef struct st_sort_field
1450
Field *field; /**< Field to sort */
1451
Item *item; /**< Item if not sorting fields */
1452
size_t length; /**< Length of sort field */
1453
uint32_t suffix_length; /**< Length suffix (0-4) */
1454
Item_result result_type; /**< Type of item */
1455
bool reverse; /**< if descending sort */
1456
bool need_strxnfrm; /**< If we have to use strxnfrm() */
2234
typedef struct st_sort_buffer {
2235
uint32_t index; /* 0 or 1 */
1459
typedef struct st_sort_buffer
1461
uint32_t index; /* 0 or 1 */
2236
1462
uint32_t sort_orders;
2237
uint32_t change_pos; /* If sort-fields changed */
1463
uint32_t change_pos; /* If sort-fields changed */
2239
1465
SORT_FIELD *sortorder;
2242
/* Structure for db & table in sql_yacc */
2244
class Table_ident :public Sql_alloc
2249
SELECT_LEX_UNIT *sel;
2250
inline Table_ident(THD *thd, LEX_STRING db_arg, LEX_STRING table_arg,
2252
:table(table_arg), sel((SELECT_LEX_UNIT *)0)
2254
if (!force && (thd->client_capabilities & CLIENT_NO_SCHEMA))
2259
inline Table_ident(LEX_STRING table_arg)
2260
:table(table_arg), sel((SELECT_LEX_UNIT *)0)
2265
This constructor is used only for the case when we create a derived
2266
table. A derived table has no name and doesn't belong to any database.
2267
Later, if there was an alias specified for the table, it will be set
2268
by add_table_to_list.
2270
inline Table_ident(SELECT_LEX_UNIT *s) : sel(s)
2272
/* We must have a table name here as this is used with add_table_to_list */
2273
db.str= empty_c_string; /* a subject to casedn_str */
2275
table.str= internal_table_name;
2278
bool is_derived_table() const { return test(sel); }
2279
inline void change_db(char *db_name)
2281
db.str= db_name; db.length= (uint) strlen(db_name);
2285
// this is needed for user_vars hash
2286
class user_var_entry
2289
user_var_entry() {} /* Remove gcc warning */
2293
query_id_t update_query_id, used_query_id;
2297
double val_real(bool *null_value);
2298
int64_t val_int(bool *null_value) const;
2299
String *val_str(bool *null_value, String *str, uint32_t decimals);
2300
my_decimal *val_decimal(bool *null_value, my_decimal *result);
2301
DTCollation collation;
2305
Unique -- class for unique (removing of duplicates).
2306
Puts all values to the TREE. If the tree becomes too big,
2307
it's dumped to the file. User can request sorted values, or
2308
just iterate through them. In the last case tree merging is performed in
2309
memory simultaneously with iteration, so it should be ~2-3x faster.
2312
class Unique :public Sql_alloc
2314
DYNAMIC_ARRAY file_ptrs;
2316
uint64_t max_in_memory_size;
2319
unsigned char *record_pointers;
2325
Unique(qsort_cmp2 comp_func, void *comp_func_fixed_arg,
2326
uint32_t size_arg, uint64_t max_in_memory_size_arg);
2328
ulong elements_in_tree() { return tree.elements_in_tree; }
2329
inline bool unique_add(void *ptr)
2331
if (tree.elements_in_tree > max_elements && flush())
2333
return(!tree_insert(&tree, ptr, 0, tree.custom_arg));
2336
bool get(Table *table);
2337
static double get_use_cost(uint32_t *buffer, uint32_t nkeys, uint32_t key_size,
2338
uint64_t max_in_memory_size);
2339
inline static int get_cost_calc_buff_size(ulong nkeys, uint32_t key_size,
2340
uint64_t max_in_memory_size)
2342
register uint64_t max_elems_in_tree=
2343
(1 + max_in_memory_size / ALIGN_SIZE(sizeof(TREE_ELEMENT)+key_size));
2344
return (int) (sizeof(uint)*(1 + nkeys/max_elems_in_tree));
2348
bool walk(tree_walk_action action, void *walk_action_arg);
2350
friend int unique_write_to_file(unsigned char* key, element_count count, Unique *unique);
2351
friend int unique_write_to_ptrs(unsigned char* key, element_count count, Unique *unique);
2355
class multi_delete :public select_result_interceptor
2357
TableList *delete_tables, *table_being_deleted;
2359
ha_rows deleted, found;
2360
uint32_t num_of_tables;
2363
/* True if at least one table we delete from is transactional */
2364
bool transactional_tables;
2365
/* True if at least one table we delete from is not transactional */
2367
bool delete_while_scanning;
2369
error handling (rollback and binlogging) can happen in send_eof()
2370
so that afterward send_error() needs to find out that.
2375
multi_delete(TableList *dt, uint32_t num_of_tables);
2377
int prepare(List<Item> &list, SELECT_LEX_UNIT *u);
2378
bool send_data(List<Item> &items);
2379
bool initialize_tables (JOIN *join);
2380
void send_error(uint32_t errcode,const char *err);
2383
virtual void abort();
2387
class multi_update :public select_result_interceptor
2389
TableList *all_tables; /* query/update command tables */
2390
TableList *leaves; /* list of leves of join table tree */
2391
TableList *update_tables, *table_being_updated;
2392
Table **tmp_tables, *main_table, *table_to_update;
2393
TMP_TABLE_PARAM *tmp_table_param;
2394
ha_rows updated, found;
2395
List <Item> *fields, *values;
2396
List <Item> **fields_for_table, **values_for_table;
2397
uint32_t table_count;
2399
List of tables referenced in the CHECK OPTION condition of
2400
the updated view excluding the updated table.
2402
List <Table> unupdated_check_opt_tables;
2403
Copy_field *copy_field;
2404
enum enum_duplicates handle_duplicates;
2405
bool do_update, trans_safe;
2406
/* True if the update operation has made a change in a transactional table */
2407
bool transactional_tables;
2410
error handling (rollback and binlogging) can happen in send_eof()
2411
so that afterward send_error() needs to find out that.
2416
multi_update(TableList *ut, TableList *leaves_list,
2417
List<Item> *fields, List<Item> *values,
2418
enum_duplicates handle_duplicates, bool ignore);
2420
int prepare(List<Item> &list, SELECT_LEX_UNIT *u);
2421
bool send_data(List<Item> &items);
2422
bool initialize_tables (JOIN *join);
2423
void send_error(uint32_t errcode,const char *err);
2426
virtual void abort();
2429
class my_var : public Sql_alloc {
2434
enum_field_types type;
2435
my_var (LEX_STRING& j, bool i, uint32_t o, enum_field_types t)
2436
:s(j), local(i), offset(o), type(t)
2441
class select_dumpvar :public select_result_interceptor {
2444
List<my_var> var_list;
2445
select_dumpvar() { var_list.empty(); row_count= 0;}
2446
~select_dumpvar() {}
2447
int prepare(List<Item> &list, SELECT_LEX_UNIT *u);
2448
bool send_data(List<Item> &items);
2450
virtual bool check_simple_select() const;
1468
#include <drizzled/table_ident.h>
1469
#include <drizzled/user_var_entry.h>
1470
#include <drizzled/unique.h>
1471
#include <drizzled/my_var.h>
1472
#include <drizzled/select_dumpvar.h>
2454
1474
/* Bits in sql_command_flags */
2456
#define CF_CHANGES_DATA 1
2457
#define CF_HAS_ROW_COUNT 2
2458
#define CF_STATUS_COMMAND 4
2459
#define CF_SHOW_TABLE_COMMAND 8
2460
#define CF_WRITE_LOGS_COMMAND 16
1476
enum sql_command_flag_bits
1478
CF_BIT_CHANGES_DATA,
1479
CF_BIT_HAS_ROW_COUNT,
1480
CF_BIT_STATUS_COMMAND,
1481
CF_BIT_SHOW_TABLE_COMMAND,
1482
CF_BIT_WRITE_LOGS_COMMAND,
1486
static const std::bitset<CF_BIT_SIZE> CF_CHANGES_DATA(1 << CF_BIT_CHANGES_DATA);
1487
static const std::bitset<CF_BIT_SIZE> CF_HAS_ROW_COUNT(1 << CF_BIT_HAS_ROW_COUNT);
1488
static const std::bitset<CF_BIT_SIZE> CF_STATUS_COMMAND(1 << CF_BIT_STATUS_COMMAND);
1489
static const std::bitset<CF_BIT_SIZE> CF_SHOW_TABLE_COMMAND(1 << CF_BIT_SHOW_TABLE_COMMAND);
1490
static const std::bitset<CF_BIT_SIZE> CF_WRITE_LOGS_COMMAND(1 << CF_BIT_WRITE_LOGS_COMMAND);
2462
1492
/* Functions in sql_class.cc */
2464
1493
void add_to_status(STATUS_VAR *to_var, STATUS_VAR *from_var);
2466
1495
void add_diff_to_status(STATUS_VAR *to_var, STATUS_VAR *from_var,
2467
1496
STATUS_VAR *dec_var);
2469
#endif /* DRIZZLE_SERVER */
1498
#endif /* DRIZZLED_SESSION_H */