summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorunknown <msvensson@neptunus.(none)>2005-03-30 12:14:37 +0200
committerunknown <msvensson@neptunus.(none)>2005-03-30 12:14:37 +0200
commitaf2ab040ccf9b8814052b3253900c7bc5f6ed58b (patch)
tree26b93e9c58fdf59cd458bd87abc33b197e9f1e4c /sql
parent8287938b79b52a5c6c6a2304414e9a6d41b79e87 (diff)
downloadmariadb-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.cc28
-rw-r--r--sql/item.h1
-rw-r--r--sql/item_subselect.h1
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 */