Commit 59d76665 authored by Sergei Petrunia's avatar Sergei Petrunia

MariaRocks port: Return correct value of HA_PRIMARY_KEY_IN_READ_INDEX flag

This cset just re-uses the approach from facebook/mysql-5.6 (Perhaps we
will have something different for MariaDB in the end).

For now this is:
Port this fix
  dd7eeae69503cb8ab6ddc8fd9e2fef451cc31a32
  Issue#250: MyRocks/Innodb different output from query with order by on table with index and decimal type
  Summary:
  Make open_binary_frm() set TABLE_SHARE::primary_key before it computes

Also add the patch for
  https://github.com/facebook/mysql-5.6/issues/376
parent f2219fe9
...@@ -421,6 +421,22 @@ ha_partition::~ha_partition() ...@@ -421,6 +421,22 @@ ha_partition::~ha_partition()
} }
bool ha_partition::init_with_fields()
{
/* Pass the call to each partition */
for (uint i= 0; i < m_tot_parts; i++)
{
if (m_file[i]->init_with_fields())
return true;
}
/* Re-read table flags in case init_with_fields caused it to change */
cached_table_flags= (m_file[0]->ha_table_flags() &
~(PARTITION_DISABLED_TABLE_FLAGS)) |
PARTITION_ENABLED_TABLE_FLAGS;
return false;
}
/* /*
Initialize partition handler object Initialize partition handler object
......
...@@ -307,6 +307,8 @@ class ha_partition :public handler ...@@ -307,6 +307,8 @@ class ha_partition :public handler
ha_partition *clone_arg, ha_partition *clone_arg,
MEM_ROOT *clone_mem_root_arg); MEM_ROOT *clone_mem_root_arg);
~ha_partition(); ~ha_partition();
bool init_with_fields();
/* /*
A partition handler has no characteristics in itself. It only inherits A partition handler has no characteristics in itself. It only inherits
those from the underlying handlers. Here we set-up those constants to those from the underlying handlers. Here we set-up those constants to
......
...@@ -2757,6 +2757,8 @@ class handler :public Sql_alloc ...@@ -2757,6 +2757,8 @@ class handler :public Sql_alloc
{ {
cached_table_flags= table_flags(); cached_table_flags= table_flags();
} }
virtual bool init_with_fields() { return false; }
/* ha_ methods: pubilc wrappers for private virtual API */ /* ha_ methods: pubilc wrappers for private virtual API */
int ha_open(TABLE *table, const char *name, int mode, uint test_if_locked); int ha_open(TABLE *table, const char *name, int mode, uint test_if_locked);
......
...@@ -2061,18 +2061,6 @@ int TABLE_SHARE::init_from_binary_frm_image(THD *thd, bool write, ...@@ -2061,18 +2061,6 @@ int TABLE_SHARE::init_from_binary_frm_image(THD *thd, bool write,
if (key == primary_key) if (key == primary_key)
{ {
field->flags|= PRI_KEY_FLAG; field->flags|= PRI_KEY_FLAG;
/*
If this field is part of the primary key and all keys contains
the primary key, then we can use any key to find this column
*/
if (ha_option & HA_PRIMARY_KEY_IN_READ_INDEX)
{
if (field->key_length() == key_part->length &&
!(field->flags & BLOB_FLAG))
field->part_of_key= share->keys_in_use;
if (field->part_of_sortkey.is_set(key))
field->part_of_sortkey= share->keys_in_use;
}
} }
if (field->key_length() != key_part->length) if (field->key_length() != key_part->length)
{ {
...@@ -2132,6 +2120,38 @@ int TABLE_SHARE::init_from_binary_frm_image(THD *thd, bool write, ...@@ -2132,6 +2120,38 @@ int TABLE_SHARE::init_from_binary_frm_image(THD *thd, bool write,
(ha_option & HA_ANY_INDEX_MAY_BE_UNIQUE)) (ha_option & HA_ANY_INDEX_MAY_BE_UNIQUE))
set_if_bigger(share->max_unique_length,keyinfo->key_length); set_if_bigger(share->max_unique_length,keyinfo->key_length);
} }
/*
The next call is here for MyRocks/MariaRocks: Now, we have filled in
field and key definitions, give the storage engine a chance to adjust
its properties.
MyRocks may (and typically does) adjust HA_PRIMARY_KEY_IN_READ_INDEX
flag in this call.
*/
if (handler_file->init_with_fields())
goto err;
if (primary_key < MAX_KEY && (handler_file->ha_table_flags() &
HA_PRIMARY_KEY_IN_READ_INDEX))
{
keyinfo= &share->key_info[primary_key];
key_part= keyinfo->key_part;
for (i=0 ; i < keyinfo->user_defined_key_parts ; key_part++,i++)
{
Field *field= key_part->field;
/*
If this field is part of the primary key and all keys contains
the primary key, then we can use any key to find this column
*/
if (field->key_length() == key_part->length &&
!(field->flags & BLOB_FLAG))
field->part_of_key= share->keys_in_use;
if (field->part_of_sortkey.is_set(primary_key))
field->part_of_sortkey= share->keys_in_use;
}
}
if (primary_key < MAX_KEY && if (primary_key < MAX_KEY &&
(share->keys_in_use.is_set(primary_key))) (share->keys_in_use.is_set(primary_key)))
{ {
......
...@@ -4075,7 +4075,7 @@ bool ha_rocksdb::same_table(const ha_rocksdb& other) const ...@@ -4075,7 +4075,7 @@ bool ha_rocksdb::same_table(const ha_rocksdb& other) const
return m_tbl_def->base_tablename() == other.m_tbl_def->base_tablename(); return m_tbl_def->base_tablename() == other.m_tbl_def->base_tablename();
} }
#ifdef MARIAROCKS_NOT_YET
bool ha_rocksdb::init_with_fields() bool ha_rocksdb::init_with_fields()
{ {
uint pk= table_share->primary_key; uint pk= table_share->primary_key;
...@@ -4090,7 +4090,7 @@ bool ha_rocksdb::init_with_fields() ...@@ -4090,7 +4090,7 @@ bool ha_rocksdb::init_with_fields()
cached_table_flags= table_flags(); cached_table_flags= table_flags();
return false; /* Ok */ return false; /* Ok */
} }
#endif
/** /**
Convert record from table->record[0] form into a form that can be written Convert record from table->record[0] form into a form that can be written
...@@ -4884,6 +4884,7 @@ int ha_rocksdb::open(const char *name, int mode, uint test_if_locked) ...@@ -4884,6 +4884,7 @@ int ha_rocksdb::open(const char *name, int mode, uint test_if_locked)
DBUG_RETURN(err); DBUG_RETURN(err);
} }
init_with_fields();
setup_field_converters(); setup_field_converters();
info(HA_STATUS_NO_LOCK | HA_STATUS_VARIABLE | HA_STATUS_CONST); info(HA_STATUS_NO_LOCK | HA_STATUS_VARIABLE | HA_STATUS_CONST);
......
...@@ -592,9 +592,9 @@ class ha_rocksdb: public my_core::handler ...@@ -592,9 +592,9 @@ class ha_rocksdb: public my_core::handler
HA_PARTIAL_COLUMN_READ | HA_PARTIAL_COLUMN_READ |
HA_TABLE_SCAN_ON_INDEX; HA_TABLE_SCAN_ON_INDEX;
} }
#ifdef MARIAROCKS_NOT_YET //#ifdef MARIAROCKS_NOT_YET
bool init_with_fields() override; bool init_with_fields() override;
#endif //#endif
/** @brief /** @brief
This is a bitmap of flags that indicates how the storage engine This is a bitmap of flags that indicates how the storage engine
implements indexes. The current index flags are documented in implements indexes. The current index flags are documented in
......
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