Commit 6069e780 authored by Sergey Vojtovich's avatar Sergey Vojtovich

MDEV-4786 - merge 10.0-monty → 10.0

Fixed sequence compilation failure.

storage/sequence/sequence.cc:
  Adjusted sequence according to:
  WL#4305 - storage-engine private data area per physical table.
parent 43946c08
...@@ -25,21 +25,33 @@ ...@@ -25,21 +25,33 @@
#include <table.h> #include <table.h>
#include <field.h> #include <field.h>
typedef struct st_share { class SHARE : public Handler_share {
public:
const char *name; const char *name;
THR_LOCK lock; THR_LOCK lock;
uint use_count;
struct st_share *next;
ulonglong from, to, step; ulonglong from, to, step;
bool reverse; bool reverse;
} SHARE;
SHARE(const char *name_arg, ulonglong from_arg, ulonglong to_arg,
ulonglong step_arg, bool reverse_arg):
name(name_arg), from(from_arg), to(to_arg), step(step_arg),
reverse(reverse_arg)
{
thr_lock_init(&lock);
}
~SHARE()
{
thr_lock_delete(&lock);
}
};
class ha_seq: public handler class ha_seq: public handler
{ {
private: private:
THR_LOCK_DATA lock; THR_LOCK_DATA lock;
SHARE *seqs; SHARE *seqs;
SHARE *get_share();
ulonglong cur; ulonglong cur;
public: public:
...@@ -229,12 +241,9 @@ ha_rows ha_seq::records_in_range(uint inx, key_range *min_key, ...@@ -229,12 +241,9 @@ ha_rows ha_seq::records_in_range(uint inx, key_range *min_key,
int ha_seq::open(const char *name, int mode, uint test_if_locked) int ha_seq::open(const char *name, int mode, uint test_if_locked)
{ {
mysql_mutex_lock(&table->s->LOCK_ha_data); if (!(seqs= get_share()))
seqs= (SHARE*)table->s->ha_data; return HA_ERR_OUT_OF_MEM;
DBUG_ASSERT(my_strcasecmp(table_alias_charset, name, seqs->name) == 0); DBUG_ASSERT(my_strcasecmp(table_alias_charset, name, seqs->name) == 0);
if (seqs->use_count++ == 0)
thr_lock_init(&seqs->lock);
mysql_mutex_unlock(&table->s->LOCK_ha_data);
ref_length= sizeof(cur); ref_length= sizeof(cur);
thr_lock_data_init(&seqs->lock,&lock,NULL); thr_lock_data_init(&seqs->lock,&lock,NULL);
...@@ -243,10 +252,6 @@ int ha_seq::open(const char *name, int mode, uint test_if_locked) ...@@ -243,10 +252,6 @@ int ha_seq::open(const char *name, int mode, uint test_if_locked)
int ha_seq::close(void) int ha_seq::close(void)
{ {
mysql_mutex_lock(&table->s->LOCK_ha_data);
if (--seqs->use_count == 0)
thr_lock_delete(&seqs->lock);
mysql_mutex_unlock(&table->s->LOCK_ha_data);
return 0; return 0;
} }
...@@ -271,6 +276,45 @@ static bool parse_table_name(const char *name, size_t name_length, ...@@ -271,6 +276,45 @@ static bool parse_table_name(const char *name, size_t name_length,
} }
SHARE *ha_seq::get_share()
{
SHARE *tmp_share;
lock_shared_ha_data();
if (!(tmp_share= static_cast<SHARE*>(get_ha_share_ptr())))
{
bool reverse;
ulonglong from, to, step;
parse_table_name(table_share->table_name.str,
table_share->table_name.length, &from, &to, &step);
if ((reverse = from > to))
{
if (step > from - to)
to = from;
else
swap_variables(ulonglong, from, to);
/*
when keyread is allowed, optimizer will always prefer an index to a
table scan for our tables, and we'll never see the range reversed.
*/
table_share->keys_for_keyread.clear_all();
}
to= (to - from) / step * step + step + from;
tmp_share= new SHARE(table_share->normalized_path.str, from, to, step, reverse);
if (!tmp_share)
goto err;
set_ha_share_ptr(static_cast<Handler_share*>(tmp_share));
}
err:
unlock_shared_ha_data();
return tmp_share;
}
static int discover_table(handlerton *hton, THD *thd, TABLE_SHARE *share) static int discover_table(handlerton *hton, THD *thd, TABLE_SHARE *share)
{ {
ulonglong from, to, step; ulonglong from, to, step;
...@@ -282,36 +326,7 @@ static int discover_table(handlerton *hton, THD *thd, TABLE_SHARE *share) ...@@ -282,36 +326,7 @@ static int discover_table(handlerton *hton, THD *thd, TABLE_SHARE *share)
return HA_WRONG_CREATE_OPTION; return HA_WRONG_CREATE_OPTION;
const char *sql="create table seq (seq bigint unsigned primary key)"; const char *sql="create table seq (seq bigint unsigned primary key)";
int res= share->init_from_sql_statement_string(thd, 0, sql, strlen(sql)); return share->init_from_sql_statement_string(thd, 0, sql, strlen(sql));
if (res)
return res;
bool reverse;
if ((reverse = from > to))
{
if (step > from - to)
to = from;
else
swap_variables(ulonglong, from, to);
/*
when keyread is allowed, optimizer will always prefer an index to a
table scan for our tables, and we'll never see the range reversed.
*/
share->keys_for_keyread.clear_all();
}
to= (to - from) / step * step + step + from;
SHARE *seqs= (SHARE*)alloc_root(&share->mem_root, sizeof(*seqs));
bzero(seqs, sizeof(*seqs));
seqs->name = share->normalized_path.str;
seqs->from= from;
seqs->to= to;
seqs->step= step;
seqs->reverse= reverse;
share->ha_data = seqs;
return 0;
} }
......
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