summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/hash.h2
-rw-r--r--sql/sp.cc4
-rw-r--r--sql/sql_lex.cc11
-rw-r--r--sql/sql_lex.h6
4 files changed, 21 insertions, 2 deletions
diff --git a/include/hash.h b/include/hash.h
index 8f5ff21ae5e..4d6ee77fa0c 100644
--- a/include/hash.h
+++ b/include/hash.h
@@ -65,6 +65,8 @@ my_bool hash_check(HASH *hash); /* Only in debug library */
#define hash_clear(H) bzero((char*) (H),sizeof(*(H)))
#define hash_inited(H) ((H)->array.buffer != 0)
+#define hash_init_opt(A,B,C,D,E,F,G,H) \
+ (!hash_inited(A) && _hash_init(A,B,C,D,E,F,G, H CALLER_INFO))
#ifdef __cplusplus
}
diff --git a/sql/sp.cc b/sql/sp.cc
index 49dbed79fe5..5d5c2b148d4 100644
--- a/sql/sp.cc
+++ b/sql/sp.cc
@@ -1369,6 +1369,10 @@ static bool add_used_routine(LEX *lex, Query_arena *arena,
const LEX_STRING *key,
TABLE_LIST *belong_to_view)
{
+ hash_init_opt(&lex->sroutines, system_charset_info,
+ Query_tables_list::START_SROUTINES_HASH_SIZE,
+ 0, 0, sp_sroutine_key, 0, 0);
+
if (!hash_search(&lex->sroutines, (byte *)key->str, key->length))
{
Sroutine_hash_entry *rn=
diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc
index 405f576ac04..24b9766a658 100644
--- a/sql/sql_lex.cc
+++ b/sql/sql_lex.cc
@@ -1634,9 +1634,18 @@ void Query_tables_list::reset_query_tables_list(bool init)
query_tables_last= &query_tables;
query_tables_own_last= 0;
if (init)
- hash_init(&sroutines, system_charset_info, 0, 0, 0, sp_sroutine_key, 0, 0);
+ {
+ /*
+ We delay real initialization of hash (and therefore related
+ memory allocation) until first insertion into this hash.
+ */
+ hash_clear(&sroutines);
+ }
else if (sroutines.records)
+ {
+ /* Non-zero sroutines.records means that hash was initialized. */
my_hash_reset(&sroutines);
+ }
sroutines_list.empty();
sroutines_list_own_last= sroutines_list.next;
sroutines_list_own_elements= 0;
diff --git a/sql/sql_lex.h b/sql/sql_lex.h
index 378f968118e..bfe7d9518f3 100644
--- a/sql/sql_lex.h
+++ b/sql/sql_lex.h
@@ -742,7 +742,11 @@ public:
0 - indicates that this query does not need prelocking.
*/
TABLE_LIST **query_tables_own_last;
- /* Set of stored routines called by statement. */
+ /*
+ Set of stored routines called by statement.
+ (Note that we use lazy-initialization for this hash).
+ */
+ enum { START_SROUTINES_HASH_SIZE= 16 };
HASH sroutines;
/*
List linking elements of 'sroutines' set. Allows you to add new elements