diff options
author | unknown <msvensson@neptunus.(none)> | 2005-03-30 12:14:37 +0200 |
---|---|---|
committer | unknown <msvensson@neptunus.(none)> | 2005-03-30 12:14:37 +0200 |
commit | af2ab040ccf9b8814052b3253900c7bc5f6ed58b (patch) | |
tree | 26b93e9c58fdf59cd458bd87abc33b197e9f1e4c /sql | |
parent | 8287938b79b52a5c6c6a2304414e9a6d41b79e87 (diff) | |
download | mariadb-git-af2ab040ccf9b8814052b3253900c7bc5f6ed58b.tar.gz |
BUG#8807 Select crash server
- Add function Item_param::fix_fields which will update any subselect they are part of and indicate that the subsleect is not const during prepare phase, and thus should not be executed during prepare.
mysql-test/include/ps_query.inc:
Adde new test case
mysql-test/r/ps_2myisam.result:
Update test result
mysql-test/r/ps_3innodb.result:
Update test result
mysql-test/r/ps_4heap.result:
Update test result
mysql-test/r/ps_5merge.result:
Update test result
mysql-test/r/ps_6bdb.result:
Update test result
mysql-test/r/ps_7ndb.result:
Update test result
sql/item.cc:
Add function Item_param::fix_fields, which will mark any subselects they are part of as not being a constant expression unless the param value is specified, ie. it will be not be constant during prepare phase.
sql/item.h:
Adde Item_param::fix_fields
sql/item_subselect.h:
Make Item_param::fix_field friend of Item_subselect
Diffstat (limited to 'sql')
-rw-r--r-- | sql/item.cc | 28 | ||||
-rw-r--r-- | sql/item.h | 1 | ||||
-rw-r--r-- | sql/item_subselect.h | 1 |
3 files changed, 30 insertions, 0 deletions
diff --git a/sql/item.cc b/sql/item.cc index 2250bd9b32c..ba495cef03e 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -1319,6 +1319,34 @@ bool Item_param::convert_str_value(THD *thd) return rc; } +bool Item_param::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref) +{ + DBUG_ASSERT(fixed == 0); + SELECT_LEX *cursel= (SELECT_LEX *) thd->lex->current_select; + + /* + Parameters in a subselect should mark the subselect as not constant + during prepare + */ + if (state == NO_VALUE) + { + /* + SELECT_LEX_UNIT::item set only for subqueries, so test of it presence + can be barrier to stop before derived table SELECT or very outer SELECT + */ + for(; + cursel->master_unit()->item; + cursel= cursel->outer_select()) + { + Item_subselect *subselect_item= cursel->master_unit()->item; + subselect_item->used_tables_cache|= OUTER_REF_TABLE_BIT; + subselect_item->const_item_cache= 0; + } + } + fixed= 1; + return 0; +} + /* End of Item_param related */ diff --git a/sql/item.h b/sql/item.h index a90bb184449..969a0cc52d0 100644 --- a/sql/item.h +++ b/sql/item.h @@ -559,6 +559,7 @@ public: bool get_time(TIME *tm); bool get_date(TIME *tm, uint fuzzydate); int save_in_field(Field *field, bool no_conversions); + bool fix_fields(THD *, struct st_table_list *, Item **); void set_null(); void set_int(longlong i, uint32 max_length_arg); diff --git a/sql/item_subselect.h b/sql/item_subselect.h index ab2d441ed7a..02bb77ce643 100644 --- a/sql/item_subselect.h +++ b/sql/item_subselect.h @@ -119,6 +119,7 @@ public: friend class Item_in_optimizer; friend bool Item_field::fix_fields(THD *, TABLE_LIST *, Item **); friend bool Item_ref::fix_fields(THD *, TABLE_LIST *, Item **); + friend bool Item_param::fix_fields(THD *, TABLE_LIST *, Item **); }; /* single value subselect */ |