summaryrefslogtreecommitdiff
path: root/sql/sql_class.cc
diff options
context:
space:
mode:
Diffstat (limited to 'sql/sql_class.cc')
-rw-r--r--sql/sql_class.cc140
1 files changed, 106 insertions, 34 deletions
diff --git a/sql/sql_class.cc b/sql/sql_class.cc
index 0469497790a..606ecdbecbb 100644
--- a/sql/sql_class.cc
+++ b/sql/sql_class.cc
@@ -88,21 +88,20 @@ THD::THD():user_time(0), is_fatal_error(0),
insert_id_used(0), rand_used(0), in_lock_tables(0),
global_read_lock(0), bootstrap(0)
{
- host=user=priv_user=db=query=ip=0;
- lex= &main_lex;
+ host= user= priv_user= db= ip=0;
host_or_ip= "connecting host";
locked=killed=some_tables_deleted=no_errors=password= 0;
query_start_used= 0;
count_cuted_fields= CHECK_FIELD_IGNORE;
- db_length=query_length=col_access=0;
+ db_length= col_access= 0;
query_error= tmp_table_used= 0;
next_insert_id=last_insert_id=0;
open_tables= temporary_tables= handler_tables= derived_tables= 0;
- handler_items=0;
tmp_table=0;
lock=locked_tables=0;
used_tables=0;
- cuted_fields= sent_row_count= current_stmt_id= 0L;
+ cuted_fields= sent_row_count= 0L;
+ statement_id_counter= 0UL;
// Must be reset to handle error with THD's created for init of mysqld
lex->current_select= 0;
start_time=(time_t) 0;
@@ -138,7 +137,6 @@ THD::THD():user_time(0), is_fatal_error(0),
server_id = ::server_id;
slave_net = 0;
command=COM_CONNECT;
- set_query_id=1;
#ifndef NO_EMBEDDED_ACCESS_CHECKS
db_access=NO_ACCESS;
#endif
@@ -146,10 +144,11 @@ THD::THD():user_time(0), is_fatal_error(0),
*scramble= '\0';
init();
+ init_sql_alloc(&mem_root, // must be after init()
+ variables.query_alloc_block_size,
+ variables.query_prealloc_size);
/* Initialize sub structures */
- bzero((char*) &mem_root,sizeof(mem_root));
bzero((char*) &transaction.mem_root,sizeof(transaction.mem_root));
- bzero((char*) &con_root,sizeof(con_root));
bzero((char*) &warn_root,sizeof(warn_root));
init_alloc_root(&warn_root, WARN_ALLOC_BLOCK_SIZE, WARN_ALLOC_PREALLOC_SIZE);
user_connect=(USER_CONN *)0;
@@ -166,12 +165,6 @@ THD::THD():user_time(0), is_fatal_error(0),
else
bzero((char*) &user_var_events, sizeof(user_var_events));
- /* Prepared statements */
- last_prepared_stmt= 0;
- init_tree(&prepared_statements, 0, 0, sizeof(PREP_STMT),
- (qsort_cmp2) compare_prep_stmt, 1,
- (tree_element_free) free_prep_stmt, 0);
-
/* Protocol */
protocol= &protocol_simple; // Default protocol
protocol_simple.init(this);
@@ -189,7 +182,9 @@ THD::THD():user_time(0), is_fatal_error(0),
transaction.trans_log.end_of_file= max_binlog_cache_size;
}
#endif
-
+ init_sql_alloc(&transaction.mem_root,
+ variables.trans_alloc_block_size,
+ variables.trans_prealloc_size);
/*
We need good random number initialization for new thread
Just coping global one will not work
@@ -233,22 +228,6 @@ void THD::init(void)
/*
- Init THD for query processing
-
- This has to be called once before we call mysql_parse()
-*/
-
-void THD::init_for_queries()
-{
- init_sql_alloc(&mem_root, variables.query_alloc_block_size,
- variables.query_prealloc_size);
- init_sql_alloc(&transaction.mem_root,
- variables.trans_alloc_block_size,
- variables.trans_prealloc_size);
-}
-
-
-/*
Do what's needed when one invokes change user
SYNOPSIS
@@ -276,7 +255,6 @@ void THD::cleanup(void)
{
DBUG_ENTER("THD::cleanup");
ha_rollback(this);
- delete_tree(&prepared_statements);
if (locked_tables)
{
lock=locked_tables; locked_tables=0;
@@ -340,8 +318,6 @@ THD::~THD()
safeFree(user);
safeFree(db);
safeFree(ip);
- free_root(&mem_root,MYF(0));
- free_root(&con_root,MYF(0));
free_root(&warn_root,MYF(0));
free_root(&transaction.mem_root,MYF(0));
mysys_var=0; // Safety (shouldn't be needed)
@@ -1193,6 +1169,102 @@ int select_dumpvar::prepare(List<Item> &list, SELECT_LEX_UNIT *u)
}
return 0;
}
+
+
+/*
+ Statement functions
+*/
+
+Statement::Statement(THD *thd)
+ :id(++thd->statement_id_counter),
+ query_id(thd->query_id),
+ set_query_id(1),
+ allow_sum_func(0),
+ command(thd->command),
+ lex(&main_lex),
+ query(0),
+ query_length(0),
+ free_list(0)
+{
+ init_sql_alloc(&mem_root,
+ thd->variables.query_alloc_block_size,
+ thd->variables.query_prealloc_size);
+}
+
+/*
+ This constructor is called when statement is a subobject of THD:
+ Some variables are initialized in THD::init due to locking problems
+ This statement object will be used to
+*/
+
+Statement::Statement()
+ :id(0),
+ query_id(0), /* initialized later */
+ set_query_id(1),
+ allow_sum_func(0), /* initialized later */
+ command(COM_SLEEP), /* initialized later */
+ lex(&main_lex),
+ query(0), /* these two are set */
+ query_length(0), /* in alloc_query() */
+ free_list(0)
+{
+ bzero((char *) &mem_root, sizeof(mem_root));
+}
+
+
+Statement::Type Statement::type() const
+{
+ return STATEMENT;
+}
+
+
+void Statement::set_statement(Statement *stmt)
+{
+ id= stmt->id;
+ query_id= stmt->query_id;
+ set_query_id= stmt->set_query_id;
+ allow_sum_func= stmt->allow_sum_func;
+ command= stmt->command;
+ lex= stmt->lex;
+ query= stmt->query;
+ query_length= stmt->query_length;
+ free_list= stmt->free_list;
+ mem_root= stmt->mem_root;
+}
+
+
+Statement::~Statement()
+{
+ free_root(&mem_root, MYF(0));
+}
+
+C_MODE_START
+
+static byte *
+get_statement_id_as_hash_key(const byte *record, uint *key_length,
+ my_bool not_used __attribute__((unused)))
+{
+ const Statement *statement= (const Statement *) record;
+ *key_length= sizeof(statement->id);
+ return (byte *) &((const Statement *) statement)->id;
+}
+
+static void delete_statement_as_hash_key(void *key)
+{
+ delete (Statement *) key;
+}
+
+C_MODE_END
+
+Statement_map::Statement_map() :
+ last_found_statement(0)
+{
+ enum { START_HASH_SIZE = 16 };
+ hash_init(&st_hash, default_charset_info, START_HASH_SIZE, 0, 0,
+ get_statement_id_as_hash_key,
+ delete_statement_as_hash_key, MYF(0));
+}
+
bool select_dumpvar::send_data(List<Item> &items)
{
List_iterator_fast<Item_func_set_user_var> li(vars);