summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/ha_berkeley.h3
-rw-r--r--sql/handler.h2
-rw-r--r--sql/opt_sum.cc13
-rw-r--r--sql/sql_select.cc11
-rw-r--r--sql/sql_show.cc2
-rw-r--r--sql/table.cc15
6 files changed, 23 insertions, 23 deletions
diff --git a/sql/ha_berkeley.h b/sql/ha_berkeley.h
index 52116710726..efc85d3928e 100644
--- a/sql/ha_berkeley.h
+++ b/sql/ha_berkeley.h
@@ -97,8 +97,7 @@ class ha_berkeley: public handler
ulong index_flags(uint idx, uint part) const
{
ulong flags=HA_READ_NEXT | HA_READ_PREV;
- if (part == (uint)~0 ||
- table->key_info[idx].key_part[part].field->key_type() != HA_KEYTYPE_TEXT)
+ if (table->key_info[idx].key_part[part].field->key_type() != HA_KEYTYPE_TEXT)
flags|= HA_READ_ORDER | HA_KEYREAD_ONLY | HA_READ_RANGE;
return flags;
}
diff --git a/sql/handler.h b/sql/handler.h
index ca452b6dedf..7274dd023f3 100644
--- a/sql/handler.h
+++ b/sql/handler.h
@@ -449,7 +449,7 @@ public:
virtual const char *table_type() const =0;
virtual const char **bas_ext() const =0;
virtual ulong table_flags(void) const =0;
- virtual ulong index_flags(uint idx, uint part=~0) const =0;
+ virtual ulong index_flags(uint idx, uint part=0) const =0;
virtual ulong index_ddl_flags(KEY *wanted_index) const
{ return (HA_DDL_SUPPORT); }
virtual int add_index(TABLE *table_arg, KEY *key_info, uint num_of_keys)
diff --git a/sql/opt_sum.cc b/sql/opt_sum.cc
index 75b00b97ce7..27f3f476fe7 100644
--- a/sql/opt_sum.cc
+++ b/sql/opt_sum.cc
@@ -629,7 +629,7 @@ static bool find_key_for_maxmin(bool max_fl, TABLE_REF *ref,
if (!(field->flags & PART_KEY_FLAG))
return 0; // Not key field
*prefix_len= 0;
-
+
TABLE *table= field->table;
uint idx= 0;
@@ -637,16 +637,17 @@ static bool find_key_for_maxmin(bool max_fl, TABLE_REF *ref,
for (keyinfo= table->key_info, keyinfo_end= keyinfo+table->keys ;
keyinfo != keyinfo_end;
keyinfo++,idx++)
- {
- if (!(table->file->index_flags(idx) & HA_READ_ORDER))
- break;
-
+ {
KEY_PART_INFO *part,*part_end;
key_part_map key_part_to_use= 0;
+ uint jdx= 0;
for (part= keyinfo->key_part, part_end= part+keyinfo->key_parts ;
part != part_end ;
- part++, key_part_to_use= (key_part_to_use << 1) | 1)
+ part++, jdx++, key_part_to_use= (key_part_to_use << 1) | 1)
{
+ if (!(table->file->index_flags(idx, jdx) & HA_READ_ORDER))
+ return 0;
+
if (field->eq(part->field))
{
ref->key= idx;
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index 2f8ede4b4cb..90636364459 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -2825,7 +2825,7 @@ find_best(JOIN *join,table_map rest_tables,uint idx,double record_count,
Set tmp to (previous record count) * (records / combination)
*/
if ((found_part & 1) &&
- (!(table->file->index_flags(key) & HA_ONLY_WHOLE_INDEX) ||
+ (!(table->file->index_flags(key,0) & HA_ONLY_WHOLE_INDEX) ||
found_part == PREV_BITS(uint,keyinfo->key_parts)))
{
max_key_part=max_part_bit(found_part);
@@ -7171,7 +7171,9 @@ test_if_skip_sort_order(JOIN_TAB *tab,ORDER *order,ha_rows select_limit,
*/
if (!select->quick->reverse_sorted())
{
- if (!(table->file->index_flags(ref_key) & HA_READ_PREV))
+ // here used_key_parts >0
+ if (!(table->file->index_flags(ref_key,used_key_parts-1)
+ & HA_READ_PREV))
DBUG_RETURN(0); // Use filesort
// ORDER BY range_key DESC
QUICK_SELECT_DESC *tmp=new QUICK_SELECT_DESC(select->quick,
@@ -7193,8 +7195,9 @@ test_if_skip_sort_order(JOIN_TAB *tab,ORDER *order,ha_rows select_limit,
Use a traversal function that starts by reading the last row
with key part (A) and then traverse the index backwards.
*/
- if (!(table->file->index_flags(ref_key) & HA_READ_PREV))
- DBUG_RETURN(0); // Use filesort
+ if (!(table->file->index_flags(ref_key,used_key_parts-1)
+ & HA_READ_PREV))
+ DBUG_RETURN(0); // Use filesort
tab->read_first_record= join_read_last_key;
tab->read_record.read_record= join_read_prev_same;
/* fall through */
diff --git a/sql/sql_show.cc b/sql/sql_show.cc
index 823552be3a4..467c774c2e1 100644
--- a/sql/sql_show.cc
+++ b/sql/sql_show.cc
@@ -995,7 +995,7 @@ mysqld_show_keys(THD *thd, TABLE_LIST *table_list)
str=(key_part->field ? key_part->field->field_name :
"?unknown field?");
protocol->store(str, system_charset_info);
- if (table->file->index_flags(i) & HA_READ_ORDER)
+ if (table->file->index_flags(i,j) & HA_READ_ORDER)
protocol->store(((key_part->key_part_flag & HA_REVERSE_SORT) ?
"D" : "A"), 1, system_charset_info);
else
diff --git a/sql/table.cc b/sql/table.cc
index 5024015c382..2b92583e777 100644
--- a/sql/table.cc
+++ b/sql/table.cc
@@ -167,9 +167,9 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag,
outparam->keys= keys= disk_buff[0];
outparam->key_parts= key_parts= disk_buff[1];
}
- outparam->keys_for_keyread.init(keys);
+ outparam->keys_for_keyread.init(0);
outparam->keys_in_use.init(keys);
- outparam->read_only_keys.init(0);
+ outparam->read_only_keys.init(keys);
outparam->quick_keys.init();
outparam->used_keys.init();
outparam->keys_in_use_for_query.init();
@@ -500,13 +500,6 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag,
if (outparam->key_info[key].flags & HA_FULLTEXT)
outparam->key_info[key].algorithm= HA_KEY_ALG_FULLTEXT;
- /* This has to be done after the above fulltext correction */
- if (!(outparam->file->index_flags(key) & HA_KEYREAD_ONLY))
- {
- outparam->read_only_keys.set_bit(key);
- outparam->keys_for_keyread.clear_bit(key);
- }
-
if (primary_key >= MAX_KEY && (keyinfo->flags & HA_NOSAME))
{
/*
@@ -577,7 +570,11 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag,
!(field->flags & BLOB_FLAG))
{
if (outparam->file->index_flags(key, i) & HA_KEYREAD_ONLY)
+ {
+ outparam->read_only_keys.clear_bit(key);
+ outparam->keys_for_keyread.set_bit(key);
field->part_of_key.set_bit(key);
+ }
if (outparam->file->index_flags(key, i) & HA_READ_ORDER)
field->part_of_sortkey.set_bit(key);
}