diff options
author | unknown <konstantin@mysql.com> | 2005-06-23 20:22:08 +0400 |
---|---|---|
committer | unknown <konstantin@mysql.com> | 2005-06-23 20:22:08 +0400 |
commit | 91180cb8ab4924fc9907ee16ba3479f88c309bc2 (patch) | |
tree | 2939d7b4b2b50f100273331463568fdfbab27116 /sql/sql_class.h | |
parent | 5ae3967c878ac7cfb8475eeeb50c2ebd81f39cf6 (diff) | |
download | mariadb-git-91180cb8ab4924fc9907ee16ba3479f88c309bc2.tar.gz |
- implement inheritance of sp_instr: public Query_arena.
We need every instruction to have its own arena, because we want to
track instruction's state (INITIALIZED_FOR_SP -> EXECUTED). Because of
`if' statements and other conditional instructions used in stored
procedures, not every instruction of a stored procedure gets executed
during the first (or even subsequent) execution of the procedure.
So it's better if we track the execution state of every instruction
independently.
All instructions of a given procedure now also share sp_head's
mem_root, but keep their own free_list.
This simplifies juggling with free Item lists in sp_head::execute.
- free_items() moved to be a member of Query_arena.
- logic of 'backup_arena' debug member of Query_arena has been
changed to support
multi-backups. Until now, TRUE 'backup_arena' meant that there is
exactly one active backup of the THD arena. Now it means simply that
the arena is used for backup, so that we can't accidentally overwrite an
existing backup. This allows doing multiple backups, e.g. in
sp_head::execute and Cursor::fetch, when THD arena is already backed up
but we want to set yet another arena (usually the 'permanent' arena,
to save permanent transformations/optimizations of a parsed tree).
sql/sp_head.cc:
- use Query_arena support in sp_head::execute() as now sp_instr inherites
from it.
sql/sp_head.h:
- inherite sp_instr from Query_arena
sql/sql_class.cc:
- changed the principle of Query_arena::backup_arena; free_items is now
a member of Query_arena.
sql/sql_class.h:
- changed the principle of Query_arena::backup_arena; free_items is now
a member of Query_arena.
sql/sql_prepare.cc:
free_items() is now a member of Query_arena.
sql/sql_select.cc:
free_items() now automatically sets free_list to zero.
Diffstat (limited to 'sql/sql_class.h')
-rw-r--r-- | sql/sql_class.h | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/sql/sql_class.h b/sql/sql_class.h index a635a126f84..adc164085f9 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -663,7 +663,10 @@ public: Item *free_list; MEM_ROOT *mem_root; // Pointer to current memroot #ifndef DBUG_OFF - bool backup_arena; + bool is_backup_arena; /* True if this arena is used for backup. */ +#define INIT_ARENA_DBUG_INFO is_backup_arena= 0 +#else +#define INIT_ARENA_DBUG_INFO #endif enum enum_state { @@ -681,12 +684,14 @@ public: Query_arena(MEM_ROOT *mem_root_arg, enum enum_state state_arg) : free_list(0), mem_root(mem_root_arg), state(state_arg) - {} + { INIT_ARENA_DBUG_INFO; } /* This constructor is used only when Query_arena is created as backup storage for another instance of Query_arena. */ - Query_arena() {}; + Query_arena() { INIT_ARENA_DBUG_INFO; } + +#undef INIT_ARENA_DBUG_INFO virtual Type type() const; virtual ~Query_arena() {}; @@ -726,6 +731,8 @@ public: void set_n_backup_item_arena(Query_arena *set, Query_arena *backup); void restore_backup_item_arena(Query_arena *set, Query_arena *backup); void set_item_arena(Query_arena *set); + + void free_items(); }; |