Commit bf683af4 authored by monty@mashka.mysql.fi's avatar monty@mashka.mysql.fi

Post merge fix

Allow empty key list in USE|IGNORE|FORCE INDEX()
parent f8e660d8
...@@ -332,29 +332,35 @@ t1 1 a 2 b A 5 NULL NULL YES BTREE ...@@ -332,29 +332,35 @@ t1 1 a 2 b A 5 NULL NULL YES BTREE
t1 1 c_2 1 c A 5 NULL NULL YES BTREE t1 1 c_2 1 c A 5 NULL NULL YES BTREE
t1 1 c_2 2 a A 5 NULL NULL BTREE t1 1 c_2 2 a A 5 NULL NULL BTREE
explain select * from t1,t2 where t1.a=t2.a; explain select * from t1,t2 where t1.a=t2.a;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ALL a NULL NULL NULL 5 1 SIMPLE t1 ALL a NULL NULL NULL 5
t2 ALL a NULL NULL NULL 2 Using where 1 SIMPLE t2 ALL a NULL NULL NULL 2 Using where
explain select * from t1,t2 force index(a) where t1.a=t2.a; explain select * from t1,t2 force index(a) where t1.a=t2.a;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t2 ALL a NULL NULL NULL 2 1 SIMPLE t2 ALL a NULL NULL NULL 2
t1 ALL a NULL NULL NULL 5 Using where 1 SIMPLE t1 ALL a NULL NULL NULL 5 Using where
explain select * from t1 force index(a),t2 force index(a) where t1.a=t2.a; explain select * from t1 force index(a),t2 force index(a) where t1.a=t2.a;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t2 ALL a NULL NULL NULL 2 1 SIMPLE t2 ALL a NULL NULL NULL 2
t1 ref a a 4 t2.a 3 1 SIMPLE t1 ref a a 4 t2.a 3
explain select * from t1,t2 where t1.b=t2.b; explain select * from t1,t2 where t1.b=t2.b;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t2 ALL b NULL NULL NULL 2 1 SIMPLE t2 ALL b NULL NULL NULL 2
t1 ref b b 5 t2.b 1 Using where 1 SIMPLE t1 ref b b 5 t2.b 1 Using where
explain select * from t1,t2 force index(c) where t1.a=t2.a; explain select * from t1,t2 force index(c) where t1.a=t2.a;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ALL a NULL NULL NULL 5 1 SIMPLE t1 ALL a NULL NULL NULL 5
t2 ALL NULL NULL NULL NULL 2 Using where 1 SIMPLE t2 ALL NULL NULL NULL NULL 2 Using where
explain select * from t1 where a=0 or a=2; explain select * from t1 where a=0 or a=2;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 ALL a NULL NULL NULL 5 Using where 1 SIMPLE t1 ALL a NULL NULL NULL 5 Using where
explain select * from t1 force index (a) where a=0 or a=2; explain select * from t1 force index (a) where a=0 or a=2;
table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
t1 range a a 4 NULL 4 Using where 1 SIMPLE t1 range a a 4 NULL 4 Using where
explain select * from t1 where c=1;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 ref c,c_2 c 5 const 1 Using where
explain select * from t1 use index() where c=1;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 ALL NULL NULL NULL NULL 5 Using where
drop table t1,t2; drop table t1,t2;
...@@ -349,4 +349,6 @@ explain select * from t1,t2 where t1.b=t2.b; ...@@ -349,4 +349,6 @@ explain select * from t1,t2 where t1.b=t2.b;
explain select * from t1,t2 force index(c) where t1.a=t2.a; explain select * from t1,t2 force index(c) where t1.a=t2.a;
explain select * from t1 where a=0 or a=2; explain select * from t1 where a=0 or a=2;
explain select * from t1 force index (a) where a=0 or a=2; explain select * from t1 force index (a) where a=0 or a=2;
explain select * from t1 where c=1;
explain select * from t1 use index() where c=1;
drop table t1,t2; drop table t1,t2;
This diff is collapsed.
...@@ -1171,13 +1171,14 @@ List<String>* st_select_lex_node::get_use_index() { return 0; } ...@@ -1171,13 +1171,14 @@ List<String>* st_select_lex_node::get_use_index() { return 0; }
List<String>* st_select_lex_node::get_ignore_index() { return 0; } List<String>* st_select_lex_node::get_ignore_index() { return 0; }
TABLE_LIST *st_select_lex_node::add_table_to_list(THD *thd, Table_ident *table, TABLE_LIST *st_select_lex_node::add_table_to_list(THD *thd, Table_ident *table,
LEX_STRING *alias, LEX_STRING *alias,
bool updating, ulong table_join_options,
thr_lock_type flags, thr_lock_type flags,
List<String> *use_index, List<String> *use_index,
List<String> *ignore_index) List<String> *ignore_index)
{ {
return 0; return 0;
} }
ulong st_select_lex_node::get_table_join_options() { return 0; }
/* /*
This is used for UNION & subselect to create a new table list of all used This is used for UNION & subselect to create a new table list of all used
...@@ -1334,6 +1335,11 @@ List<String>* st_select_lex::get_ignore_index() ...@@ -1334,6 +1335,11 @@ List<String>* st_select_lex::get_ignore_index()
return ignore_index_ptr; return ignore_index_ptr;
} }
ulong st_select_lex::get_table_join_options()
{
return table_join_options;
}
/* /*
There are st_select_lex::add_table_to_list & There are st_select_lex::add_table_to_list &
st_select_lex::set_lock_for_tables in sql_parse.cc st_select_lex::set_lock_for_tables in sql_parse.cc
......
...@@ -243,7 +243,7 @@ class st_select_lex_node { ...@@ -243,7 +243,7 @@ class st_select_lex_node {
virtual List<Item>* get_item_list(); virtual List<Item>* get_item_list();
virtual List<String>* get_use_index(); virtual List<String>* get_use_index();
virtual List<String>* get_ignore_index(); virtual List<String>* get_ignore_index();
virtual ulong table_join_options(); virtual ulong get_table_join_options();
virtual TABLE_LIST *add_table_to_list(THD *thd, Table_ident *table, virtual TABLE_LIST *add_table_to_list(THD *thd, Table_ident *table,
LEX_STRING *alias, LEX_STRING *alias,
ulong table_options, ulong table_options,
...@@ -375,7 +375,7 @@ class st_select_lex: public st_select_lex_node ...@@ -375,7 +375,7 @@ class st_select_lex: public st_select_lex_node
List<Item>* get_item_list(); List<Item>* get_item_list();
List<String>* get_use_index(); List<String>* get_use_index();
List<String>* get_ignore_index(); List<String>* get_ignore_index();
ulong table_join_options(); ulong get_table_join_options();
TABLE_LIST* add_table_to_list(THD *thd, Table_ident *table, TABLE_LIST* add_table_to_list(THD *thd, Table_ident *table,
LEX_STRING *alias, LEX_STRING *alias,
ulong table_options, ulong table_options,
......
...@@ -3598,11 +3598,30 @@ bool add_to_list(THD *thd, SQL_LIST &list,Item *item,bool asc) ...@@ -3598,11 +3598,30 @@ bool add_to_list(THD *thd, SQL_LIST &list,Item *item,bool asc)
} }
/*
Add a table to list of used tables
SYNOPSIS
add_table_to_list()
table Table to add
alias alias for table (or null if no alias)
table_options A set of the following bits:
TL_OPTION_UPDATING Table will be updated
TL_OPTION_FORCE_INDEX Force usage of index
lock_type How table should be locked
use_index List of indexed used in USE INDEX
ignore_index List of indexed used in IGNORE INDEX
RETURN
0 Error
# Pointer to TABLE_LIST element added to the total table list
*/
TABLE_LIST *st_select_lex::add_table_to_list(THD *thd, TABLE_LIST *st_select_lex::add_table_to_list(THD *thd,
Table_ident *table, Table_ident *table,
LEX_STRING *alias, LEX_STRING *alias,
bool updating, ulong table_options,
thr_lock_type flags, thr_lock_type lock_type,
List<String> *use_index, List<String> *use_index,
List<String> *ignore_index) List<String> *ignore_index)
{ {
...@@ -3659,8 +3678,9 @@ TABLE_LIST *st_select_lex::add_table_to_list(THD *thd, ...@@ -3659,8 +3678,9 @@ TABLE_LIST *st_select_lex::add_table_to_list(THD *thd,
} }
ptr->real_name=table->table.str; ptr->real_name=table->table.str;
ptr->real_name_length=table->table.length; ptr->real_name_length=table->table.length;
ptr->lock_type=flags; ptr->lock_type= lock_type;
ptr->updating=updating; ptr->updating= test(table_options & TL_OPTION_UPDATING);
ptr->force_index= test(table_options & TL_OPTION_FORCE_INDEX);
ptr->derived= (SELECT_LEX_UNIT *) table->sel; ptr->derived= (SELECT_LEX_UNIT *) table->sel;
if (use_index) if (use_index)
ptr->use_index=(List<String> *) thd->memdup((gptr) use_index, ptr->use_index=(List<String> *) thd->memdup((gptr) use_index,
......
...@@ -1359,7 +1359,7 @@ opt_unique_or_fulltext: ...@@ -1359,7 +1359,7 @@ opt_unique_or_fulltext:
key_alg: key_alg:
/* empty */ { $$= HA_KEY_ALG_UNDEF; } /* empty */ { $$= HA_KEY_ALG_UNDEF; }
| USING opt_btree_or_rtree { $$= $2; }; | USING opt_btree_or_rtree { $$= $2; };
| TYPE opt_btree_or_rtree { $$= $2; }; | TYPE_SYM opt_btree_or_rtree { $$= $2; };
opt_btree_or_rtree: opt_btree_or_rtree:
BTREE_SYM { $$= HA_KEY_ALG_BTREE; } BTREE_SYM { $$= HA_KEY_ALG_BTREE; }
...@@ -2516,14 +2516,14 @@ join_table: ...@@ -2516,14 +2516,14 @@ join_table:
{ {
SELECT_LEX *sel= Select->select_lex(); SELECT_LEX *sel= Select->select_lex();
sel->use_index_ptr=sel->ignore_index_ptr=0; sel->use_index_ptr=sel->ignore_index_ptr=0;
sel->table_join_ptions= 0; sel->table_join_options= 0;
} }
table_ident opt_table_alias opt_key_definition table_ident opt_table_alias opt_key_definition
{ {
LEX *lex= Lex; LEX *lex= Lex;
SELECT_LEX_NODE *sel= lex->current_select; SELECT_LEX_NODE *sel= lex->current_select;
if (!($$= sel->add_table_to_list(lex->thd, $2, $3, if (!($$= sel->add_table_to_list(lex->thd, $2, $3,
lex->table_join_options(), sel->get_table_join_options(),
lex->lock_option, lex->lock_option,
sel->get_use_index(), sel->get_use_index(),
sel->get_ignore_index()))) sel->get_ignore_index())))
...@@ -2569,6 +2569,13 @@ opt_key_definition: ...@@ -2569,6 +2569,13 @@ opt_key_definition:
sel->use_index= *$2; sel->use_index= *$2;
sel->use_index_ptr= &sel->use_index; sel->use_index_ptr= &sel->use_index;
} }
| FORCE_SYM key_usage_list
{
SELECT_LEX *sel= Select->select_lex();
sel->use_index= *$2;
sel->use_index_ptr= &sel->use_index;
sel->table_join_options|= TL_OPTION_FORCE_INDEX;
}
| IGNORE_SYM key_usage_list | IGNORE_SYM key_usage_list
{ {
SELECT_LEX *sel= Select->select_lex(); SELECT_LEX *sel= Select->select_lex();
...@@ -2578,8 +2585,14 @@ opt_key_definition: ...@@ -2578,8 +2585,14 @@ opt_key_definition:
key_usage_list: key_usage_list:
key_or_index { Select->select_lex()->interval_list.empty(); } key_or_index { Select->select_lex()->interval_list.empty(); }
'(' key_usage_list2 ')' '(' key_list_or_empty ')'
{ $$= &Select->select_lex()->interval_list; }; { $$= &Select->select_lex()->interval_list; }
;
key_list_or_empty:
/* empty */ {}
| key_usage_list2 {}
;
key_usage_list2: key_usage_list2:
key_usage_list2 ',' ident key_usage_list2 ',' ident
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment