Skip to content
Permalink
Browse files

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
  facebook/mysql-5.6#376
  • Loading branch information...
spetrunia committed Dec 2, 2016
1 parent f2219fe commit 59d76665eed69974da81cdccba2df9f26b4e0967
Showing with 57 additions and 16 deletions.
  1. +16 −0 sql/ha_partition.cc
  2. +2 −0 sql/ha_partition.h
  3. +2 −0 sql/handler.h
  4. +32 −12 sql/table.cc
  5. +3 −2 storage/rocksdb/ha_rocksdb.cc
  6. +2 −2 storage/rocksdb/ha_rocksdb.h
@@ -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
@@ -307,6 +307,8 @@ class ha_partition :public handler
ha_partition *clone_arg,
MEM_ROOT *clone_mem_root_arg);
~ha_partition();

bool init_with_fields();
/*
A partition handler has no characteristics in itself. It only inherits
those from the underlying handlers. Here we set-up those constants to
@@ -2757,6 +2757,8 @@ class handler :public Sql_alloc
{
cached_table_flags= table_flags();
}

virtual bool init_with_fields() { return false; }
/* ha_ methods: pubilc wrappers for private virtual API */

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,
if (key == primary_key)
{
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)
{
@@ -2132,6 +2120,38 @@ int TABLE_SHARE::init_from_binary_frm_image(THD *thd, bool write,
(ha_option & HA_ANY_INDEX_MAY_BE_UNIQUE))
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 &&
(share->keys_in_use.is_set(primary_key)))
{
@@ -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();
}

#ifdef MARIAROCKS_NOT_YET

bool ha_rocksdb::init_with_fields()
{
uint pk= table_share->primary_key;
@@ -4090,7 +4090,7 @@ bool ha_rocksdb::init_with_fields()
cached_table_flags= table_flags();
return false; /* Ok */
}
#endif


/**
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)
DBUG_RETURN(err);
}

init_with_fields();
setup_field_converters();

info(HA_STATUS_NO_LOCK | HA_STATUS_VARIABLE | HA_STATUS_CONST);
@@ -592,9 +592,9 @@ class ha_rocksdb: public my_core::handler
HA_PARTIAL_COLUMN_READ |
HA_TABLE_SCAN_ON_INDEX;
}
#ifdef MARIAROCKS_NOT_YET
//#ifdef MARIAROCKS_NOT_YET
bool init_with_fields() override;
#endif
//#endif
/** @brief
This is a bitmap of flags that indicates how the storage engine
implements indexes. The current index flags are documented in

0 comments on commit 59d7666

Please sign in to comment.
You can’t perform that action at this time.