220
int thd_in_lock_tables(const THD *thd)
222
return test(thd->in_lock_tables);
227
int thd_tablespace_op(const THD *thd)
229
return test(thd->tablespace_op);
234
const char *set_thd_proc_info(THD *thd, const char *info,
235
const char *calling_function __attribute__((unused)),
236
const char *calling_file __attribute__((unused)),
237
const unsigned int calling_line __attribute__((unused)))
239
const char *old_info= thd->get_proc_info();
240
thd->set_proc_info(info);
245
void **thd_ha_data(const THD *thd, const struct handlerton *hton)
247
return (void **) &thd->ha_data[hton->slot].ha_ptr;
251
int64_t thd_test_options(const THD *thd, int64_t test_options)
253
return thd->options & test_options;
257
int thd_sql_command(const THD *thd)
259
return (int) thd->lex->sql_command;
263
int thd_tx_isolation(const THD *thd)
265
return (int) thd->variables.tx_isolation;
269
void thd_inc_row_count(THD *thd)
275
Clear this diagnostics area.
277
Normally called at the end of a statement.
281
Diagnostics_area::reset_diagnostics_area()
283
can_overwrite_status= false;
284
/** Don't take chances in production */
290
m_total_warn_count= 0;
292
/** Tiny reset in debug mode to see garbage right away */
298
Set OK status -- ends commands that do not return a
299
result set, e.g. INSERT/UPDATE/DELETE.
303
Diagnostics_area::set_ok_status(THD *thd, ha_rows affected_rows_arg,
304
uint64_t last_insert_id_arg,
305
const char *message_arg)
309
In production, refuse to overwrite an error or a custom response
312
if (is_error() || is_disabled())
314
/** Only allowed to report success if has not yet reported an error */
316
m_server_status= thd->server_status;
317
m_total_warn_count= thd->total_warn_count;
318
m_affected_rows= affected_rows_arg;
319
m_last_insert_id= last_insert_id_arg;
321
strmake(m_message, message_arg, sizeof(m_message) - 1);
333
Diagnostics_area::set_eof_status(THD *thd)
335
/** Only allowed to report eof if has not yet reported an error */
339
In production, refuse to overwrite an error or a custom response
342
if (is_error() || is_disabled())
345
m_server_status= thd->server_status;
347
If inside a stored procedure, do not return the total
348
number of warnings, since they are not available to the client
351
m_total_warn_count= thd->total_warn_count;
361
Diagnostics_area::set_error_status(THD *thd __attribute__((unused)),
362
uint32_t sql_errno_arg,
363
const char *message_arg)
366
Only allowed to report error if has not yet reported a success
367
The only exception is when we flush the message to the client,
368
an error can happen during the flush.
370
assert(! is_set() || can_overwrite_status);
372
In production, refuse to overwrite a custom response with an
378
m_sql_errno= sql_errno_arg;
379
strmake(m_message, message_arg, sizeof(m_message) - 1);
386
Mark the diagnostics area as 'DISABLED'.
388
This is used in rare cases when the COM_ command at hand sends a response
389
in a custom format. One example is the query cache, another is
394
Diagnostics_area::disable_status()
397
m_status= DA_DISABLED;
119
int session_in_lock_tables(const Session *session)
121
return test(session->in_lock_tables);
126
int session_tablespace_op(const Session *session)
128
return test(session->tablespace_op);
133
Set the process info field of the Session structure.
135
This function is used by plug-ins. Internally, the
136
Session::set_proc_info() function should be used.
138
@see Session::set_proc_info
141
set_session_proc_info(Session *session, const char *info)
143
session->set_proc_info(info);
147
const char *get_session_proc_info(Session *session)
149
return session->get_proc_info();
153
void **session_ha_data(const Session *session, const struct handlerton *hton)
155
return (void **) &session->ha_data[hton->slot].ha_ptr;
159
int64_t session_test_options(const Session *session, int64_t test_options)
161
return session->options & test_options;
165
int session_sql_command(const Session *session)
167
return (int) session->lex->sql_command;
171
int session_tx_isolation(const Session *session)
173
return (int) session->variables.tx_isolation;
177
void session_inc_row_count(Session *session)
179
session->row_count++;
402
183
:Statement(&main_lex, &main_mem_root,
403
184
/* statement id */ 0),
404
Open_tables_state(refresh_version), rli_fake(0),
185
Open_tables_state(refresh_version),
405
186
lock_id(&main_lock_id),
406
user_time(0), in_sub_stmt(0),
407
binlog_table_maps(0), binlog_flags(0UL),
408
188
arg_of_last_insert_id_function(false),
409
189
first_successful_insert_id_in_prev_stmt(0),
410
first_successful_insert_id_in_prev_stmt_for_binlog(0),
411
190
first_successful_insert_id_in_cur_stmt(0),
412
stmt_depends_on_first_successful_insert_id_in_prev_stmt(false),
413
191
global_read_lock(0),
414
192
is_fatal_error(0),
415
193
transaction_rollback_request(0),
416
194
is_fatal_sub_stmt_error(0),
419
195
in_lock_tables(0),
421
196
derived_tables_processing(false),
427
203
Pass nominal parameters to init_alloc_root only to ensure that
841
583
assert(thread_stack);
843
if (my_pthread_setspecific_ptr(THR_THD, this) ||
844
my_pthread_setspecific_ptr(THR_MALLOC, &mem_root))
585
if (pthread_setspecific(THR_Session, this) ||
586
pthread_setspecific(THR_Mem_root, &mem_root))
846
588
mysys_var=my_thread_var;
848
590
Let mysqld define the thread id (not mysys)
849
This allows us to move THD to different threads if needed.
591
This allows us to move Session to different threads if needed.
851
593
mysys_var->id= thread_id;
852
594
real_id= pthread_self(); // For debugging
855
We have to call thr_lock_info_init() again here as THD may have been
597
We have to call thr_lock_info_init() again here as Session may have been
856
598
created in another thread
858
600
thr_lock_info_init(&lock_info);
604
void Session::prepareForQueries()
606
if (variables.max_join_size == HA_POS_ERROR)
607
options |= OPTION_BIG_SELECTS;
608
if (client_capabilities & CLIENT_COMPRESS)
611
version= refresh_version;
617
/* In the past this would only run of the user did not have SUPER_ACL */
618
if (sys_init_connect.value_length)
620
execute_init_command(this, &sys_init_connect, &LOCK_sys_init_connect);
623
Security_context *sctx= &security_ctx;
624
killed= Session::KILL_CONNECTION;
625
errmsg_printf(ERRMSG_LVL_WARN
626
, ER(ER_NEW_ABORTING_CONNECTION)
628
, (db ? db : "unconnected")
629
, sctx->user.empty() == false ? sctx->user.c_str() : "unauthenticated"
630
, sctx->ip.c_str(), "init_connect command failed");
631
errmsg_printf(ERRMSG_LVL_WARN, "%s", main_da.message());
639
bool Session::initGlobals()
643
disconnect(ER_OUT_OF_RESOURCES, true);
644
statistic_increment(aborted_connects, &LOCK_status);
645
thread_scheduler.end_thread(this, 0);
651
bool Session::authenticate()
653
/* Use "connect_timeout" value during connection phase */
654
drizzleclient_net_set_read_timeout(&net, connect_timeout);
655
drizzleclient_net_set_write_timeout(&net, connect_timeout);
659
bool connection_is_valid= check_connection();
660
drizzleclient_net_end_statement(this);
662
if (! connection_is_valid)
664
/* We got wrong permissions from check_connection() */
665
statistic_increment(aborted_connects, &LOCK_status);
669
/* Connect completed, set read/write timeouts back to default */
670
drizzleclient_net_set_read_timeout(&net, variables.net_read_timeout);
671
drizzleclient_net_set_write_timeout(&net, variables.net_write_timeout);
675
bool Session::check_connection()
684
if (drizzleclient_net_peer_addr(&net, ip, &peer_port, NI_MAXHOST))
686
my_error(ER_BAD_HOST_ERROR, MYF(0), security_ctx.ip.c_str());
690
security_ctx.ip.assign(ip);
692
drizzleclient_net_keepalive(&net, true);
694
uint32_t server_capabilites;
696
/* buff[] needs to big enough to hold the server_version variable */
697
char buff[SERVER_VERSION_LENGTH + SCRAMBLE_LENGTH + 64];
699
server_capabilites= CLIENT_BASIC_FLAGS;
702
server_capabilites|= CLIENT_COMPRESS;
703
#endif /* HAVE_COMPRESS */
705
end= buff + strlen(server_version);
706
if ((end - buff) >= SERVER_VERSION_LENGTH)
707
end= buff + (SERVER_VERSION_LENGTH - 1);
708
memcpy(buff, server_version, end - buff);
712
int4store((unsigned char*) end, thread_id);
715
So as check_connection is the only entry point to authorization
716
procedure, scramble is set here. This gives us new scramble for
719
drizzleclient_create_random_string(scramble, SCRAMBLE_LENGTH, &rand);
721
Old clients does not understand long scrambles, but can ignore packet
722
tail: that's why first part of the scramble is placed here, and second
723
part at the end of packet.
725
end= strncpy(end, scramble, SCRAMBLE_LENGTH_323);
726
end+= SCRAMBLE_LENGTH_323;
728
*end++= 0; /* an empty byte for some reason */
730
int2store(end, server_capabilites);
731
/* write server characteristics: up to 16 bytes allowed */
732
end[2]=(char) default_charset_info->number;
733
int2store(end+3, server_status);
734
memset(end+5, 0, 13);
736
/* write scramble tail */
737
size_t scramble_len= SCRAMBLE_LENGTH - SCRAMBLE_LENGTH_323;
738
end= strncpy(end, scramble + SCRAMBLE_LENGTH_323, scramble_len);
741
*end++= 0; /* an empty byte for some reason */
743
/* At this point we write connection message and read reply */
744
if (drizzleclient_net_write_command(&net
745
, (unsigned char) protocol_version
746
, (unsigned char*) ""
748
, (unsigned char*) buff
749
, (size_t) (end-buff))
750
|| (pkt_len= drizzleclient_net_read(&net)) == packet_error
751
|| pkt_len < MIN_HANDSHAKE_SIZE)
753
my_error(ER_HANDSHAKE_ERROR, MYF(0), security_ctx.ip.c_str());
757
if (packet.alloc(variables.net_buffer_length))
758
return false; /* The error is set by alloc(). */
760
client_capabilities= uint2korr(net.read_pos);
763
client_capabilities|= ((uint32_t) uint2korr(net.read_pos + 2)) << 16;
764
max_client_packet_length= uint4korr(net.read_pos + 4);
766
end= (char*) net.read_pos + 32;
769
Disable those bits which are not supported by the server.
770
This is a precautionary measure, if the client lies. See Bug#27944.
772
client_capabilities&= server_capabilites;
774
if (end >= (char*) net.read_pos + pkt_len + 2)
776
my_error(ER_HANDSHAKE_ERROR, MYF(0), security_ctx.ip.c_str());
780
net.return_status= &server_status;
783
char *passwd= strchr(user, '\0')+1;
784
uint32_t user_len= passwd - user - 1;
786
char db_buff[NAME_LEN + 1]; // buffer to store db in utf8
787
char user_buff[USERNAME_LENGTH + 1]; // buffer to store user in utf8
788
uint32_t dummy_errors;
791
Old clients send null-terminated string as password; new clients send
792
the size (1 byte) + string (not null-terminated). Hence in case of empty
793
password both send '\0'.
795
This strlen() can't be easily deleted without changing protocol.
797
Cast *passwd to an unsigned char, so that it doesn't extend the sign for
798
*passwd > 127 and become 2**32-127+ after casting to uint.
800
uint32_t passwd_len= client_capabilities & CLIENT_SECURE_CONNECTION ?
801
(unsigned char)(*passwd++) : strlen(passwd);
802
l_db= client_capabilities & CLIENT_CONNECT_WITH_DB ? l_db + passwd_len + 1 : 0;
804
/* strlen() can't be easily deleted without changing protocol */
805
uint32_t db_len= l_db ? strlen(l_db) : 0;
807
if (passwd + passwd_len + db_len > (char *) net.read_pos + pkt_len)
809
my_error(ER_HANDSHAKE_ERROR, MYF(0), security_ctx.ip.c_str());
813
/* Since 4.1 all database names are stored in utf8 */
816
db_buff[copy_and_convert(db_buff, sizeof(db_buff)-1,
819
charset(), &dummy_errors)]= 0;
823
user_buff[user_len= copy_and_convert(user_buff, sizeof(user_buff)-1,
824
system_charset_info, user, user_len,
825
charset(), &dummy_errors)]= '\0';
828
/* If username starts and ends in "'", chop them off */
829
if (user_len > 1 && user[0] == '\'' && user[user_len - 1] == '\'')
836
security_ctx.user.assign(user);
838
return check_user(passwd, passwd_len, l_db);
841
bool Session::check_user(const char *passwd, uint32_t passwd_len, const char *in_db)
843
LEX_STRING db_str= { (char *) in_db, in_db ? strlen(in_db) : 0 };
844
bool is_authenticated;
847
Clear session->db as it points to something, that will be freed when
848
connection is closed. We don't want to accidentally free a wrong
849
pointer if connect failed. Also in case of 'CHANGE USER' failure,
850
current database will be switched to 'no database selected'.
854
if (passwd_len != 0 && passwd_len != SCRAMBLE_LENGTH)
856
my_error(ER_HANDSHAKE_ERROR, MYF(0), security_ctx.ip.c_str());
860
is_authenticated= authenticate_user(this, passwd);
862
if (is_authenticated != true)
864
my_error(ER_ACCESS_DENIED_ERROR, MYF(0),
865
security_ctx.user.c_str(),
866
security_ctx.ip.c_str(),
867
passwd_len ? ER(ER_YES) : ER(ER_NO));
872
security_ctx.skip_grants();
874
/* Change database if necessary */
875
if (in_db && in_db[0])
877
if (mysql_change_db(this, &db_str, false))
879
/* mysql_change_db() has pushed the error message. */
884
password= test(passwd_len); // remember for error messages
886
/* Ready to handle queries */
890
bool Session::executeStatement()
894
uint32_t packet_length;
896
enum enum_server_command l_command;
899
indicator of uninitialized lex => normal flow of errors handling
902
lex->current_select= 0;
905
This thread will do a blocking read from the client which
906
will be interrupted when the next command is received from
907
the client, the connection is closed or "net_wait_timeout"
908
number of seconds has passed
910
drizzleclient_net_set_read_timeout(&net, variables.net_wait_timeout);
913
XXX: this code is here only to clear possible errors of init_connect.
914
Consider moving to init_connect() instead.
916
clear_error(); // Clear error message
917
main_da.reset_diagnostics_area();
919
net_new_transaction(&net);
921
packet_length= drizzleclient_net_read(&net);
922
if (packet_length == packet_error)
924
/* Check if we can continue without closing the connection */
926
if(net.last_errno== CR_NET_PACKET_TOO_LARGE)
927
my_error(ER_NET_PACKET_TOO_LARGE, MYF(0));
928
/* Assert is invalid for dirty connection shutdown
929
* assert(session->is_error());
931
drizzleclient_net_end_statement(this);
935
return_value= false; // We have to close it.
944
l_packet= (char*) net.read_pos;
946
'packet_length' contains length of data, as it was stored in packet
947
header. In case of malformed header, drizzleclient_net_read returns zero.
948
If packet_length is not zero, drizzleclient_net_read ensures that the returned
949
number of bytes was actually read from network.
950
There is also an extra safety measure in drizzleclient_net_read:
951
it sets packet[packet_length]= 0, but only for non-zero packets.
953
if (packet_length == 0) /* safety */
955
/* Initialize with COM_SLEEP packet */
956
l_packet[0]= (unsigned char) COM_SLEEP;
959
/* Do not rely on drizzleclient_net_read, extra safety against programming errors. */
960
l_packet[packet_length]= '\0'; /* safety */
962
l_command= (enum enum_server_command) (unsigned char) l_packet[0];
964
if (command >= COM_END)
965
command= COM_END; // Wrong command
967
/* Restore read timeout value */
968
drizzleclient_net_set_read_timeout(&net, variables.net_read_timeout);
970
assert(packet_length);
971
return_value= ! dispatch_command(l_command, this, l_packet+1, (uint32_t) (packet_length-1));
977
bool Session::readAndStoreQuery(const char *in_packet, uint32_t in_packet_length)
979
/* Remove garbage at start and end of query */
980
while (in_packet_length > 0 && my_isspace(charset(), in_packet[0]))
985
const char *pos= in_packet + in_packet_length; /* Point at end null */
986
while (in_packet_length > 0 &&
987
(pos[-1] == ';' || my_isspace(charset() ,pos[-1])))
993
/* We must allocate some extra memory for the cached query string */
994
query_length= 0; /* Extra safety: Avoid races */
995
query= (char*) memdup_w_gap((unsigned char*) in_packet, in_packet_length, db_length + 1);
999
query[in_packet_length]=0;
1000
query_length= in_packet_length;
1002
/* Reclaim some memory */
1003
packet.shrink(variables.net_buffer_length);
1004
convert_buffer.shrink(variables.net_buffer_length);
1009
bool Session::endTransaction(enum enum_mysql_completiontype completion)
1014
if (transaction.xid_state.xa_state != XA_NOTR)
1016
my_error(ER_XAER_RMFAIL, MYF(0), xa_state_names[transaction.xid_state.xa_state]);
1023
* We don't use endActiveTransaction() here to ensure that this works
1024
* even if there is a problem with the OPTION_AUTO_COMMIT flag
1025
* (Which of course should never happen...)
1027
server_status&= ~SERVER_STATUS_IN_TRANS;
1028
if (ha_commit(this))
1030
options&= ~(OPTION_BEGIN | OPTION_KEEP_LOG);
1031
transaction.all.modified_non_trans_table= false;
1033
case COMMIT_RELEASE:
1034
do_release= 1; /* fall through */
1035
case COMMIT_AND_CHAIN:
1036
result= endActiveTransaction();
1037
if (result == true && completion == COMMIT_AND_CHAIN)
1038
result= startTransaction();
1040
case ROLLBACK_RELEASE:
1041
do_release= 1; /* fall through */
1043
case ROLLBACK_AND_CHAIN:
1045
server_status&= ~SERVER_STATUS_IN_TRANS;
1046
if (ha_rollback(this))
1048
options&= ~(OPTION_BEGIN | OPTION_KEEP_LOG);
1049
transaction.all.modified_non_trans_table= false;
1050
if (result == true && (completion == ROLLBACK_AND_CHAIN))
1051
result= startTransaction();
1055
my_error(ER_UNKNOWN_COM_ERROR, MYF(0));
1059
if (result == false)
1060
my_error(killed_errno(), MYF(0));
1061
else if ((result == true) && do_release)
1062
killed= Session::KILL_CONNECTION;
1067
bool Session::endActiveTransaction()
1071
if (transaction.xid_state.xa_state != XA_NOTR)
1073
my_error(ER_XAER_RMFAIL, MYF(0), xa_state_names[transaction.xid_state.xa_state]);
1076
if (options & (OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN | OPTION_TABLE_LOCK))
1078
/* Safety if one did "drop table" on locked tables */
1079
if (! locked_tables)
1080
options&= ~OPTION_TABLE_LOCK;
1081
server_status&= ~SERVER_STATUS_IN_TRANS;
1082
if (ha_commit(this))
1085
options&= ~(OPTION_BEGIN | OPTION_KEEP_LOG);
1086
transaction.all.modified_non_trans_table= false;
1090
bool Session::startTransaction()
1096
lock= locked_tables;
1097
locked_tables= 0; // Will be automatically closed
1098
close_thread_tables(this); // Free tables
1100
if (! endActiveTransaction())
1104
options|= OPTION_BEGIN;
1105
server_status|= SERVER_STATUS_IN_TRANS;
1106
if (lex->start_transaction_opt & DRIZZLE_START_TRANS_OPT_WITH_CONS_SNAPSHOT)
1107
if (ha_start_consistent_snapshot(this))
864
1114
Cleanup after query.
867
THD::cleanup_after_query()
1117
Session::cleanup_after_query()
870
1120
This function is used to reset thread data to its default state.
1141
1381
Protocol::SEND_NUM_ROWS | Protocol::SEND_EOF));
1145
struct Item_change_record: public ilink
1149
/* Placement new was hidden by `new' in ilink (TODO: check): */
1150
static void *operator new(size_t size __attribute__((unused)),
1153
static void operator delete(void *ptr __attribute__((unused)),
1154
size_t size __attribute__((unused)))
1156
static void operator delete(void *ptr __attribute__((unused)),
1157
void *mem __attribute__((unused)))
1158
{ /* never called */ }
1163
Register an item tree tree transformation, performed by the query
1164
optimizer. We need a pointer to runtime_memroot because it may be !=
1165
thd->mem_root (this may no longer be a true statement)
1168
void THD::nocheck_register_item_tree_change(Item **place, Item *old_value,
1169
MEM_ROOT *runtime_memroot)
1171
Item_change_record *change;
1173
Now we use one node per change, which adds some memory overhead,
1174
but still is rather fast as we use alloc_root for allocations.
1175
A list of item tree changes of an average query should be short.
1177
void *change_mem= alloc_root(runtime_memroot, sizeof(*change));
1178
if (change_mem == 0)
1181
OOM, thd->fatal_error() is called by the error handler of the
1182
memroot. Just return.
1186
change= new (change_mem) Item_change_record;
1187
change->place= place;
1188
change->old_value= old_value;
1189
change_list.append(change);
1193
void THD::rollback_item_tree_changes()
1195
I_List_iterator<Item_change_record> it(change_list);
1196
Item_change_record *change;
1198
while ((change= it++))
1199
*change->place= change->old_value;
1200
/* We can forget about changes memory: it's allocated in runtime memroot */
1201
change_list.empty();
1206
/*****************************************************************************
1207
** Functions to provide a interface to select results
1208
*****************************************************************************/
1210
select_result::select_result()
1215
void select_result::send_error(uint32_t errcode,const char *err)
1217
my_message(errcode, err, MYF(0));
1221
void select_result::cleanup()
1226
bool select_result::check_simple_select() const
1228
my_error(ER_SP_BAD_CURSOR_QUERY, MYF(0));
1233
static String default_line_term("\n",default_charset_info);
1234
static String default_escaped("\\",default_charset_info);
1235
static String default_field_term("\t",default_charset_info);
1237
sql_exchange::sql_exchange(char *name, bool flag,
1238
enum enum_filetype filetype_arg)
1239
:file_name(name), opt_enclosed(0), dumpfile(flag), skip_lines(0)
1241
filetype= filetype_arg;
1242
field_term= &default_field_term;
1243
enclosed= line_start= &my_empty_string;
1244
line_term= &default_line_term;
1245
escaped= &default_escaped;
1249
bool select_send::send_fields(List<Item> &list, uint32_t flags)
1252
if (!(res= thd->protocol->send_fields(&list, flags)))
1253
is_result_set_started= 1;
1257
void select_send::abort()
1264
Cleanup an instance of this class for re-use
1265
at next execution of a prepared statement/
1266
stored procedure statement.
1269
void select_send::cleanup()
1271
is_result_set_started= false;
1274
/* Send data to client. Returns 0 if ok */
1276
bool select_send::send_data(List<Item> &items)
1278
if (unit->offset_limit_cnt)
1279
{ // using limit offset,count
1280
unit->offset_limit_cnt--;
1285
We may be passing the control from mysqld to the client: release the
1286
InnoDB adaptive hash S-latch to avoid thread deadlocks if it was reserved
1289
ha_release_temporary_latches(thd);
1291
List_iterator_fast<Item> li(items);
1292
Protocol *protocol= thd->protocol;
1293
char buff[MAX_FIELD_WIDTH];
1294
String buffer(buff, sizeof(buff), &my_charset_bin);
1296
protocol->prepare_for_resend();
1300
if (item->send(protocol, &buffer))
1302
protocol->free(); // Free used buffer
1303
my_message(ER_OUT_OF_RESOURCES, ER(ER_OUT_OF_RESOURCES), MYF(0));
1307
thd->sent_row_count++;
1308
if (thd->is_error())
1310
protocol->remove_last_row();
1314
return(protocol->write());
1318
bool select_send::send_eof()
1321
We may be passing the control from mysqld to the client: release the
1322
InnoDB adaptive hash S-latch to avoid thread deadlocks if it was reserved
1325
ha_release_temporary_latches(thd);
1327
/* Unlock tables before sending packet to gain some speed */
1330
mysql_unlock_tables(thd, thd->lock);
1334
is_result_set_started= 0;
1339
1384
/************************************************************************
1340
1385
Handling writing to file
1341
1386
************************************************************************/
2115
bool Session::set_db(const char *new_db, size_t new_db_len)
2117
/* Do not reallocate memory if current chunk is big enough. */
2118
if (db && new_db && db_length >= new_db_len)
2119
memcpy(db, new_db, new_db_len+1);
2126
db= (char *)malloc(new_db_len + 1);
2129
memcpy(db, new_db, new_db_len);
2136
db_length= db ? new_db_len : 0;
2137
return new_db && !db;
2175
2142
Check the killed state of a user thread
2176
@param thd user thread
2143
@param session user thread
2177
2144
@retval 0 the user thread is active
2178
2145
@retval 1 the user thread has been killed
2180
extern "C" int thd_killed(const DRIZZLE_THD thd)
2147
extern "C" int session_killed(const Session *session)
2182
return(thd->killed);
2149
return(session->killed);
2186
2153
Return the thread id of a user thread
2187
@param thd user thread
2154
@param session user thread
2188
2155
@return thread id
2190
extern "C" unsigned long thd_get_thread_id(const DRIZZLE_THD thd)
2192
return((unsigned long)thd->thread_id);
2196
#ifdef INNODB_COMPATIBILITY_HOOKS
2197
extern "C" const struct charset_info_st *thd_charset(DRIZZLE_THD thd)
2199
return(thd->charset());
2202
extern "C" char **thd_query(DRIZZLE_THD thd)
2204
return(&thd->query);
2207
extern "C" int thd_slave_thread(const DRIZZLE_THD thd)
2209
return(thd->slave_thread);
2212
extern "C" int thd_non_transactional_update(const DRIZZLE_THD thd)
2214
return(thd->transaction.all.modified_non_trans_table);
2217
extern "C" int thd_binlog_format(const DRIZZLE_THD thd)
2219
return (int) thd->variables.binlog_format;
2222
extern "C" void thd_mark_transaction_to_rollback(DRIZZLE_THD thd, bool all)
2224
mark_transaction_to_rollback(thd, all);
2226
#endif // INNODB_COMPATIBILITY_HOOKS */
2157
extern "C" unsigned long session_get_thread_id(const Session *session)
2159
return((unsigned long)session->thread_id);
2164
LEX_STRING *session_make_lex_string(Session *session, LEX_STRING *lex_str,
2165
const char *str, unsigned int size,
2166
int allocate_lex_string)
2168
return session->make_lex_string(lex_str, str, size,
2169
(bool) allocate_lex_string);
2172
extern "C" const struct charset_info_st *session_charset(Session *session)
2174
return(session->charset());
2177
extern "C" char **session_query(Session *session)
2179
return(&session->query);
2182
extern "C" int session_non_transactional_update(const Session *session)
2184
return(session->transaction.all.modified_non_trans_table);
2187
extern "C" void session_mark_transaction_to_rollback(Session *session, bool all)
2189
mark_transaction_to_rollback(session, all);
2230
2194
Mark transaction to rollback and mark error as fatal to a sub-statement.
2232
@param thd Thread handle
2196
@param session Thread handle
2233
2197
@param all true <=> rollback main transaction.
2236
void mark_transaction_to_rollback(THD *thd, bool all)
2240
thd->is_fatal_sub_stmt_error= true;
2241
thd->transaction_rollback_request= all;
2244
/***************************************************************************
2245
Handling of XA id cacheing
2246
***************************************************************************/
2248
pthread_mutex_t LOCK_xid_cache;
2251
extern "C" unsigned char *xid_get_hash_key(const unsigned char *, size_t *, bool);
2252
extern "C" void xid_free_hash(void *);
2254
unsigned char *xid_get_hash_key(const unsigned char *ptr, size_t *length,
2255
bool not_used __attribute__((unused)))
2257
*length=((XID_STATE*)ptr)->xid.key_length();
2258
return ((XID_STATE*)ptr)->xid.key();
2261
void xid_free_hash(void *ptr)
2263
if (!((XID_STATE*)ptr)->in_thd)
2264
free((unsigned char*)ptr);
2267
bool xid_cache_init()
2269
pthread_mutex_init(&LOCK_xid_cache, MY_MUTEX_INIT_FAST);
2270
return hash_init(&xid_cache, &my_charset_bin, 100, 0, 0,
2271
xid_get_hash_key, xid_free_hash, 0) != 0;
2274
void xid_cache_free()
2276
if (hash_inited(&xid_cache))
2278
hash_free(&xid_cache);
2279
pthread_mutex_destroy(&LOCK_xid_cache);
2283
XID_STATE *xid_cache_search(XID *xid)
2285
pthread_mutex_lock(&LOCK_xid_cache);
2286
XID_STATE *res=(XID_STATE *)hash_search(&xid_cache, xid->key(), xid->key_length());
2287
pthread_mutex_unlock(&LOCK_xid_cache);
2292
bool xid_cache_insert(XID *xid, enum xa_states xa_state)
2296
pthread_mutex_lock(&LOCK_xid_cache);
2297
if (hash_search(&xid_cache, xid->key(), xid->key_length()))
2299
else if (!(xs=(XID_STATE *)my_malloc(sizeof(*xs), MYF(MY_WME))))
2303
xs->xa_state=xa_state;
2306
res=my_hash_insert(&xid_cache, (unsigned char*)xs);
2308
pthread_mutex_unlock(&LOCK_xid_cache);
2313
bool xid_cache_insert(XID_STATE *xid_state)
2315
pthread_mutex_lock(&LOCK_xid_cache);
2316
assert(hash_search(&xid_cache, xid_state->xid.key(),
2317
xid_state->xid.key_length())==0);
2318
bool res=my_hash_insert(&xid_cache, (unsigned char*)xid_state);
2319
pthread_mutex_unlock(&LOCK_xid_cache);
2324
void xid_cache_delete(XID_STATE *xid_state)
2326
pthread_mutex_lock(&LOCK_xid_cache);
2327
hash_delete(&xid_cache, (unsigned char *)xid_state);
2328
pthread_mutex_unlock(&LOCK_xid_cache);
2332
Implementation of interface to write rows to the binary log through the
2333
thread. The thread is responsible for writing the rows it has
2334
inserted/updated/deleted.
2339
Template member function for ensuring that there is an rows log
2340
event of the apropriate type before proceeding.
2343
- Events of type 'RowEventT' have the type code 'type_code'.
2346
If a non-NULL pointer is returned, the pending event for thread 'thd' will
2347
be an event of type 'RowEventT' (which have the type code 'type_code')
2348
will either empty or have enough space to hold 'needed' bytes. In
2349
addition, the columns bitmap will be correct for the row, meaning that
2350
the pending event will be flushed if the columns in the event differ from
2351
the columns suppled to the function.
2354
If no error, a non-NULL pending event (either one which already existed or
2355
the newly created one).
2359
template <class RowsEventT> Rows_log_event*
2360
THD::binlog_prepare_pending_rows_event(Table* table, uint32_t serv_id,
2362
bool is_transactional,
2363
RowsEventT *hint __attribute__((unused)))
2365
/* Pre-conditions */
2366
assert(table->s->table_map_id != UINT32_MAX);
2368
/* Fetch the type code for the RowsEventT template parameter */
2369
int const type_code= RowsEventT::TYPE_CODE;
2372
There is no good place to set up the transactional data, so we
2375
if (binlog_setup_trx_data())
2378
Rows_log_event* pending= binlog_get_pending_rows_event();
2380
if (unlikely(pending && !pending->is_valid()))
2384
Check if the current event is non-NULL and a write-rows
2385
event. Also check if the table provided is mapped: if it is not,
2386
then we have switched to writing to a new table.
2387
If there is no pending event, we need to create one. If there is a pending
2388
event, but it's not about the same table id, or not of the same type
2389
(between Write, Update and Delete), or not the same affected columns, or
2390
going to be too big, flush this event to disk and create a new pending
2393
The last test is necessary for the Cluster injector to work
2394
correctly. The reason is that the Cluster can inject two write
2395
rows with different column bitmaps if there is an insert followed
2396
by an update in the same transaction, and these are grouped into a
2397
single epoch/transaction when fed to the injector.
2399
TODO: Fix the code so that the last test can be removed.
2402
pending->server_id != serv_id ||
2403
pending->get_table_id() != table->s->table_map_id ||
2404
pending->get_type_code() != type_code ||
2405
pending->get_data_size() + needed > opt_binlog_rows_event_max_size ||
2406
!bitmap_cmp(pending->get_cols(), table->write_set))
2408
/* Create a new RowsEventT... */
2409
Rows_log_event* const
2410
ev= new RowsEventT(this, table, table->s->table_map_id,
2414
ev->server_id= serv_id; // I don't like this, it's too easy to forget.
2416
flush the pending event and replace it with the newly created
2419
if (unlikely(mysql_bin_log.flush_and_set_pending_rows_event(this, ev)))
2425
return(ev); /* This is the new pending event */
2427
return(pending); /* This is the current pending event */
2430
#ifdef HAVE_EXPLICIT_TEMPLATE_INSTANTIATION
2432
Instantiate the versions we need, we have -fno-implicit-template as
2435
template Rows_log_event*
2436
THD::binlog_prepare_pending_rows_event(Table*, uint32_t, size_t, bool,
2437
Write_rows_log_event*);
2439
template Rows_log_event*
2440
THD::binlog_prepare_pending_rows_event(Table*, uint32_t, size_t, bool,
2441
Delete_rows_log_event *);
2443
template Rows_log_event*
2444
THD::binlog_prepare_pending_rows_event(Table*, uint32_t, size_t, bool,
2445
Update_rows_log_event *);
2450
Class to handle temporary allocation of memory for row data.
2452
The responsibilities of the class is to provide memory for
2453
packing one or two rows of packed data (depending on what
2454
constructor is called).
2456
In order to make the allocation more efficient for "simple" rows,
2457
i.e., rows that do not contain any blobs, a pointer to the
2458
allocated memory is of memory is stored in the table structure
2459
for simple rows. If memory for a table containing a blob field
2460
is requested, only memory for that is allocated, and subsequently
2461
released when the object is destroyed.
2464
class Row_data_memory {
2467
Build an object to keep track of a block-local piece of memory
2468
for storing a row of data.
2471
Table where the pre-allocated memory is stored.
2474
Length of data that is needed, if the record contain blobs.
2476
Row_data_memory(Table *table, size_t const len1)
2479
m_alloc_checked= false;
2480
allocate_memory(table, len1);
2481
m_ptr[0]= has_memory() ? m_memory : 0;
2485
Row_data_memory(Table *table, size_t const len1, size_t const len2)
2488
m_alloc_checked= false;
2489
allocate_memory(table, len1 + len2);
2490
m_ptr[0]= has_memory() ? m_memory : 0;
2491
m_ptr[1]= has_memory() ? m_memory + len1 : 0;
2496
if (m_memory != 0 && m_release_memory_on_destruction)
2497
free((unsigned char*) m_memory);
2501
Is there memory allocated?
2503
@retval true There is memory allocated
2504
@retval false Memory allocation failed
2506
bool has_memory() const {
2507
m_alloc_checked= true;
2508
return m_memory != 0;
2511
unsigned char *slot(uint32_t s)
2513
assert(s < sizeof(m_ptr)/sizeof(*m_ptr));
2514
assert(m_ptr[s] != 0);
2515
assert(m_alloc_checked == true);
2520
void allocate_memory(Table *const table, size_t const total_length)
2522
if (table->s->blob_fields == 0)
2525
The maximum length of a packed record is less than this
2526
length. We use this value instead of the supplied length
2527
when allocating memory for records, since we don't know how
2528
the memory will be used in future allocations.
2530
Since table->s->reclength is for unpacked records, we have
2531
to add two bytes for each field, which can potentially be
2532
added to hold the length of a packed field.
2534
size_t const maxlen= table->s->reclength + 2 * table->s->fields;
2537
Allocate memory for two records if memory hasn't been
2538
allocated. We allocate memory for two records so that it can
2539
be used when processing update rows as well.
2541
if (table->write_row_record == 0)
2542
table->write_row_record=
2543
(unsigned char *) alloc_root(&table->mem_root, 2 * maxlen);
2544
m_memory= table->write_row_record;
2545
m_release_memory_on_destruction= false;
2549
m_memory= (unsigned char *) my_malloc(total_length, MYF(MY_WME));
2550
m_release_memory_on_destruction= true;
2554
mutable bool m_alloc_checked;
2555
bool m_release_memory_on_destruction;
2556
unsigned char *m_memory;
2557
unsigned char *m_ptr[2];
2562
int THD::binlog_write_row(Table* table, bool is_trans,
2563
unsigned char const *record)
2565
assert(current_stmt_binlog_row_based && mysql_bin_log.is_open());
2568
Pack records into format for transfer. We are allocating more
2569
memory than needed, but that doesn't matter.
2571
Row_data_memory memory(table, table->max_row_length(record));
2572
if (!memory.has_memory())
2573
return HA_ERR_OUT_OF_MEM;
2575
unsigned char *row_data= memory.slot(0);
2577
size_t const len= pack_row(table, table->write_set, row_data, record);
2579
Rows_log_event* const ev=
2580
binlog_prepare_pending_rows_event(table, server_id, len, is_trans,
2581
static_cast<Write_rows_log_event*>(0));
2583
if (unlikely(ev == 0))
2584
return HA_ERR_OUT_OF_MEM;
2586
return ev->add_row_data(row_data, len);
2589
int THD::binlog_update_row(Table* table, bool is_trans,
2590
const unsigned char *before_record,
2591
const unsigned char *after_record)
2593
assert(current_stmt_binlog_row_based && mysql_bin_log.is_open());
2595
size_t const before_maxlen = table->max_row_length(before_record);
2596
size_t const after_maxlen = table->max_row_length(after_record);
2598
Row_data_memory row_data(table, before_maxlen, after_maxlen);
2599
if (!row_data.has_memory())
2600
return HA_ERR_OUT_OF_MEM;
2602
unsigned char *before_row= row_data.slot(0);
2603
unsigned char *after_row= row_data.slot(1);
2605
size_t const before_size= pack_row(table, table->read_set, before_row,
2607
size_t const after_size= pack_row(table, table->write_set, after_row,
2610
Rows_log_event* const ev=
2611
binlog_prepare_pending_rows_event(table, server_id,
2612
before_size + after_size, is_trans,
2613
static_cast<Update_rows_log_event*>(0));
2615
if (unlikely(ev == 0))
2616
return HA_ERR_OUT_OF_MEM;
2619
ev->add_row_data(before_row, before_size) ||
2620
ev->add_row_data(after_row, after_size);
2623
int THD::binlog_delete_row(Table* table, bool is_trans,
2624
unsigned char const *record)
2626
assert(current_stmt_binlog_row_based && mysql_bin_log.is_open());
2629
Pack records into format for transfer. We are allocating more
2630
memory than needed, but that doesn't matter.
2632
Row_data_memory memory(table, table->max_row_length(record));
2633
if (unlikely(!memory.has_memory()))
2634
return HA_ERR_OUT_OF_MEM;
2636
unsigned char *row_data= memory.slot(0);
2638
size_t const len= pack_row(table, table->read_set, row_data, record);
2640
Rows_log_event* const ev=
2641
binlog_prepare_pending_rows_event(table, server_id, len, is_trans,
2642
static_cast<Delete_rows_log_event*>(0));
2644
if (unlikely(ev == 0))
2645
return HA_ERR_OUT_OF_MEM;
2647
return ev->add_row_data(row_data, len);
2651
int THD::binlog_flush_pending_rows_event(bool stmt_end)
2654
We shall flush the pending event even if we are not in row-based
2655
mode: it might be the case that we left row-based mode before
2656
flushing anything (e.g., if we have explicitly locked tables).
2658
if (!mysql_bin_log.is_open())
2662
Mark the event as the last event of a statement if the stmt_end
2666
if (Rows_log_event *pending= binlog_get_pending_rows_event())
2670
pending->set_flags(Rows_log_event::STMT_END_F);
2671
pending->flags|= LOG_EVENT_UPDATE_TABLE_MAP_VERSION_F;
2672
binlog_table_maps= 0;
2675
error= mysql_bin_log.flush_and_set_pending_rows_event(this, 0);
2683
Member function that will log query, either row-based or
2684
statement-based depending on the value of the 'current_stmt_binlog_row_based'
2685
the value of the 'qtype' flag.
2687
This function should be called after the all calls to ha_*_row()
2688
functions have been issued, but before tables are unlocked and
2692
There shall be no writes to any system table after calling
2693
binlog_query(), so these writes has to be moved to before the call
2694
of binlog_query() for correct functioning.
2696
This is necessesary not only for RBR, but the master might crash
2697
after binlogging the query but before changing the system tables.
2698
This means that the slave and the master are not in the same state
2699
(after the master has restarted), so therefore we have to
2700
eliminate this problem.
2703
Error code, or 0 if no error.
2705
int THD::binlog_query(THD::enum_binlog_query_type qtype, char const *query_arg,
2706
ulong query_len, bool is_trans, bool suppress_use,
2707
THD::killed_state killed_status_arg)
2709
assert(query_arg && mysql_bin_log.is_open());
2711
if (int error= binlog_flush_pending_rows_event(true))
2715
If we are in statement mode and trying to log an unsafe statement,
2716
we should print a warning.
2718
if (lex->is_stmt_unsafe() &&
2719
variables.binlog_format == BINLOG_FORMAT_STMT)
2721
assert(this->query != NULL);
2722
push_warning(this, DRIZZLE_ERROR::WARN_LEVEL_WARN,
2723
ER_BINLOG_UNSAFE_STATEMENT,
2724
ER(ER_BINLOG_UNSAFE_STATEMENT));
2725
if (!(binlog_flags & BINLOG_FLAG_UNSAFE_STMT_PRINTED))
2727
char warn_buf[DRIZZLE_ERRMSG_SIZE];
2728
snprintf(warn_buf, DRIZZLE_ERRMSG_SIZE, "%s Statement: %s",
2729
ER(ER_BINLOG_UNSAFE_STATEMENT), this->query);
2730
sql_print_warning(warn_buf);
2731
binlog_flags|= BINLOG_FLAG_UNSAFE_STMT_PRINTED;
2736
case THD::ROW_QUERY_TYPE:
2737
if (current_stmt_binlog_row_based)
2739
/* Otherwise, we fall through */
2740
case THD::DRIZZLE_QUERY_TYPE:
2742
Using this query type is a conveniece hack, since we have been
2743
moving back and forth between using RBR for replication of
2744
system tables and not using it.
2746
Make sure to change in check_table_binlog_row_based() according
2747
to how you treat this.
2749
case THD::STMT_QUERY_TYPE:
2751
The DRIZZLE_LOG::write() function will set the STMT_END_F flag and
2752
flush the pending rows event if necessary.
2755
Query_log_event qinfo(this, query_arg, query_len, is_trans, suppress_use,
2757
qinfo.flags|= LOG_EVENT_UPDATE_TABLE_MAP_VERSION_F;
2759
Binlog table maps will be irrelevant after a Query_log_event
2760
(they are just removed on the slave side) so after the query
2761
log event is written to the binary log, we pretend that no
2762
table maps were written.
2764
int error= mysql_bin_log.write(&qinfo);
2765
binlog_table_maps= 0;
2770
case THD::QUERY_TYPE_COUNT:
2772
assert(0 <= qtype && qtype < QUERY_TYPE_COUNT);
2777
bool Discrete_intervals_list::append(uint64_t start, uint64_t val,
2780
/* first, see if this can be merged with previous */
2781
if ((head == NULL) || tail->merge_if_contiguous(start, val, incr))
2783
/* it cannot, so need to add a new interval */
2784
Discrete_interval *new_interval= new Discrete_interval(start, val, incr);
2785
return(append(new_interval));
2790
bool Discrete_intervals_list::append(Discrete_interval *new_interval)
2792
if (unlikely(new_interval == NULL))
2795
head= current= new_interval;
2797
tail->next= new_interval;
2200
void mark_transaction_to_rollback(Session *session, bool all)
2204
session->is_fatal_sub_stmt_error= true;
2205
session->transaction_rollback_request= all;
2209
void Session::disconnect(uint32_t errcode, bool should_lock)
2211
/* Allow any plugins to cleanup their session variables */
2212
plugin_sessionvar_cleanup(this);
2214
/* If necessary, log any aborted or unauthorized connections */
2215
if (killed || (net.error && net.vio != 0))
2216
statistic_increment(aborted_threads, &LOCK_status);
2218
if (net.error && net.vio != 0)
2220
if (! killed && variables.log_warnings > 1)
2222
Security_context *sctx= &security_ctx;
2224
errmsg_printf(ERRMSG_LVL_WARN, ER(ER_NEW_ABORTING_CONNECTION)
2226
, (db ? db : "unconnected")
2227
, sctx->user.empty() == false ? sctx->user.c_str() : "unauthenticated"
2229
, (main_da.is_error() ? main_da.message() : ER(ER_UNKNOWN_ERROR)));
2233
/* Close out our connection to the client */
2236
(void) pthread_mutex_lock(&LOCK_thread_count);
2237
killed= Session::KILL_CONNECTION;
2238
if ((vio= net.vio) != 0)
2241
net_send_error(this, errcode, ER(errcode)); /* purecov: inspected */
2242
drizzleclient_net_close(&net); /* vio is freed in delete session */
2245
(void) pthread_mutex_unlock(&LOCK_thread_count);
2249
Reset Session part responsible for command processing state.
2251
This needs to be called before execution of every statement
2252
(prepared or conventional).
2253
It is not called by substatements of routines.
2256
Make it a method of Session and align its name with the rest of
2257
reset/end/start/init methods.
2259
Call it after we use Session for queries, not before.
2262
void Session::reset_for_next_command()
2267
Those two lines below are theoretically unneeded as
2268
Session::cleanup_after_query() should take care of this already.
2270
auto_inc_intervals_in_cur_stmt_for_binlog.empty();
2273
server_status&= ~ (SERVER_MORE_RESULTS_EXISTS |
2274
SERVER_QUERY_NO_INDEX_USED |
2275
SERVER_QUERY_NO_GOOD_INDEX_USED);
2277
If in autocommit mode and not in a transaction, reset
2278
OPTION_STATUS_NO_TRANS_UPDATE | OPTION_KEEP_LOG to not get warnings
2279
in ha_rollback_trans() about some tables couldn't be rolled back.
2281
if (!(options & (OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN)))
2283
options&= ~OPTION_KEEP_LOG;
2284
transaction.all.modified_non_trans_table= false;
2286
thread_specific_used= false;
2289
main_da.reset_diagnostics_area();
2290
total_warn_count=0; // Warnings for this query
2291
sent_row_count= examined_row_count= 0;
2297
Close all temporary tables created by 'CREATE TEMPORARY TABLE' for thread
2298
creates one DROP TEMPORARY Table binlog event for each pseudo-thread
2301
void Session::close_temporary_tables()
2306
if (!temporary_tables)
2309
for (table= temporary_tables; table; table= tmp_next)
2311
tmp_next= table->next;
2312
close_temporary(table, 1, 1);
2314
temporary_tables= 0;
2320
/** Clear most status variables. */
2321
extern time_t flush_status_time;
2322
extern uint32_t max_used_connections;
2324
void Session::refresh_status()
2326
pthread_mutex_lock(&LOCK_status);
2328
/* Add thread's status variabes to global status */
2329
add_to_status(&global_status_var, &status_var);
2331
/* Reset thread's status variables */
2332
memset(&status_var, 0, sizeof(status_var));
2334
/* Reset some global variables */
2335
reset_status_vars();
2337
/* Reset the counters of all key caches (default and named). */
2338
process_key_caches(reset_key_cache_counters);
2339
flush_status_time= time((time_t*) 0);
2340
max_used_connections= 1; /* We set it to one, because we know we exist */
2341
pthread_mutex_unlock(&LOCK_status);