Skip to content

Commit

Permalink
MariaRocks port: Return correct value of HA_PRIMARY_KEY_IN_READ_INDEX…
Browse files Browse the repository at this point in the history
… 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 59d7666
Show file tree
Hide file tree
Showing 6 changed files with 57 additions and 16 deletions.
16 changes: 16 additions & 0 deletions sql/ha_partition.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 2 additions & 0 deletions sql/ha_partition.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 2 additions & 0 deletions sql/handler.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
44 changes: 32 additions & 12 deletions sql/table.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down Expand Up @@ -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)))
{
Expand Down
5 changes: 3 additions & 2 deletions storage/rocksdb/ha_rocksdb.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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
Expand Down Expand Up @@ -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);
Expand Down
4 changes: 2 additions & 2 deletions storage/rocksdb/ha_rocksdb.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 59d7666

Please sign in to comment.