Commit 9c72963d authored by Sergei Petrunia's avatar Sergei Petrunia Committed by Oleksandr Byelkin

MDEV-17171: RocksDB Tables do not have "Creation Date"

Variant#5 of the patch:
- take creation date from the .frm file, like InnoDB does
- Update_time is in-memory only (like in InnoDB).
parent 162f475c
...@@ -2306,6 +2306,8 @@ class Rdb_transaction { ...@@ -2306,6 +2306,8 @@ class Rdb_transaction {
bool m_is_delayed_snapshot = false; bool m_is_delayed_snapshot = false;
bool m_is_two_phase = false; bool m_is_two_phase = false;
std::unordered_set<Rdb_tbl_def*> modified_tables;
private: private:
/* /*
Number of write operations this transaction had when we took the last Number of write operations this transaction had when we took the last
...@@ -3001,6 +3003,26 @@ class Rdb_transaction { ...@@ -3001,6 +3003,26 @@ class Rdb_transaction {
virtual void start_tx() = 0; virtual void start_tx() = 0;
virtual void start_stmt() = 0; virtual void start_stmt() = 0;
protected:
// Non-virtual functions with actions to be done on transaction start and
// commit.
void on_commit() {
time_t tm;
tm = time(nullptr);
for (auto &it : modified_tables) {
it->update_time = tm;
}
modified_tables.clear();
}
void on_rollback() {
modified_tables.clear();
}
public:
// Inform the transaction that this table was modified
void log_table_write_op(Rdb_tbl_def *tbl) {
modified_tables.insert(tbl);
}
void set_initial_savepoint() { void set_initial_savepoint() {
/* /*
Set the initial savepoint. If the first statement in the transaction Set the initial savepoint. If the first statement in the transaction
...@@ -3185,7 +3207,9 @@ class Rdb_transaction_impl : public Rdb_transaction { ...@@ -3185,7 +3207,9 @@ class Rdb_transaction_impl : public Rdb_transaction {
goto error; goto error;
} }
on_commit();
error: error:
on_rollback();
/* Save the transaction object to be reused */ /* Save the transaction object to be reused */
release_tx(); release_tx();
...@@ -3201,6 +3225,7 @@ class Rdb_transaction_impl : public Rdb_transaction { ...@@ -3201,6 +3225,7 @@ class Rdb_transaction_impl : public Rdb_transaction {
public: public:
void rollback() override { void rollback() override {
on_rollback();
m_write_count = 0; m_write_count = 0;
m_insert_count = 0; m_insert_count = 0;
m_update_count = 0; m_update_count = 0;
...@@ -3522,7 +3547,9 @@ class Rdb_writebatch_impl : public Rdb_transaction { ...@@ -3522,7 +3547,9 @@ class Rdb_writebatch_impl : public Rdb_transaction {
res = true; res = true;
goto error; goto error;
} }
on_commit();
error: error:
on_rollback();
reset(); reset();
m_write_count = 0; m_write_count = 0;
...@@ -3555,6 +3582,7 @@ class Rdb_writebatch_impl : public Rdb_transaction { ...@@ -3555,6 +3582,7 @@ class Rdb_writebatch_impl : public Rdb_transaction {
} }
void rollback() override { void rollback() override {
on_rollback();
m_write_count = 0; m_write_count = 0;
m_insert_count = 0; m_insert_count = 0;
m_update_count = 0; m_update_count = 0;
...@@ -10335,6 +10363,8 @@ int ha_rocksdb::update_write_row(const uchar *const old_data, ...@@ -10335,6 +10363,8 @@ int ha_rocksdb::update_write_row(const uchar *const old_data,
row_info.tx->incr_insert_count(); row_info.tx->incr_insert_count();
} }
row_info.tx->log_table_write_op(m_tbl_def);
if (do_bulk_commit(row_info.tx)) { if (do_bulk_commit(row_info.tx)) {
DBUG_RETURN(HA_ERR_ROCKSDB_BULK_LOAD); DBUG_RETURN(HA_ERR_ROCKSDB_BULK_LOAD);
} }
...@@ -10814,6 +10844,7 @@ int ha_rocksdb::delete_row(const uchar *const buf) { ...@@ -10814,6 +10844,7 @@ int ha_rocksdb::delete_row(const uchar *const buf) {
} }
tx->incr_delete_count(); tx->incr_delete_count();
tx->log_table_write_op(m_tbl_def);
if (do_bulk_commit(tx)) { if (do_bulk_commit(tx)) {
DBUG_RETURN(HA_ERR_ROCKSDB_BULK_LOAD); DBUG_RETURN(HA_ERR_ROCKSDB_BULK_LOAD);
...@@ -11008,6 +11039,12 @@ int ha_rocksdb::info(uint flag) { ...@@ -11008,6 +11039,12 @@ int ha_rocksdb::info(uint flag) {
k->rec_per_key[j] = x; k->rec_per_key[j] = x;
} }
} }
stats.create_time = m_tbl_def->get_creation_time();
}
if (flag & HA_STATUS_TIME) {
stats.update_time = m_tbl_def->update_time;
} }
if (flag & HA_STATUS_ERRKEY) { if (flag & HA_STATUS_ERRKEY) {
......
...@@ -121,12 +121,12 @@ set rocksdb_bulk_load=0; ...@@ -121,12 +121,12 @@ set rocksdb_bulk_load=0;
--remove_file $file --remove_file $file
# Make sure row count index stats are correct # Make sure row count index stats are correct
--replace_column 6 # 7 # 8 # 9 # --replace_column 6 # 7 # 8 # 9 # 12 # 13 #
SHOW TABLE STATUS WHERE name LIKE 't%'; SHOW TABLE STATUS WHERE name LIKE 't%';
ANALYZE TABLE t1, t2, t3; ANALYZE TABLE t1, t2, t3;
--replace_column 6 # 7 # 8 # 9 # --replace_column 6 # 7 # 8 # 9 # 12 # 13 #
SHOW TABLE STATUS WHERE name LIKE 't%'; SHOW TABLE STATUS WHERE name LIKE 't%';
# Make sure all the data is there. # Make sure all the data is there.
......
...@@ -121,12 +121,12 @@ set rocksdb_bulk_load=0; ...@@ -121,12 +121,12 @@ set rocksdb_bulk_load=0;
--remove_file $file --remove_file $file
# Make sure row count index stats are correct # Make sure row count index stats are correct
--replace_column 6 # 7 # 8 # 9 # --replace_column 6 # 7 # 8 # 9 # 12 # 13 #
SHOW TABLE STATUS WHERE name LIKE 't%'; SHOW TABLE STATUS WHERE name LIKE 't%';
ANALYZE TABLE t1, t2, t3; ANALYZE TABLE t1, t2, t3;
--replace_column 6 # 7 # 8 # 9 # --replace_column 6 # 7 # 8 # 9 # 12 # 13 #
SHOW TABLE STATUS WHERE name LIKE 't%'; SHOW TABLE STATUS WHERE name LIKE 't%';
# Make sure all the data is there. # Make sure all the data is there.
......
...@@ -40,9 +40,9 @@ pk a b ...@@ -40,9 +40,9 @@ pk a b
set rocksdb_bulk_load=0; set rocksdb_bulk_load=0;
SHOW TABLE STATUS WHERE name LIKE 't%'; SHOW TABLE STATUS WHERE name LIKE 't%';
Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary
t1 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL NULL NULL NULL latin1_bin NULL 0 N t1 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL # # NULL latin1_bin NULL 0 N
t2 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL NULL NULL NULL latin1_bin NULL 0 N t2 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL # # NULL latin1_bin NULL 0 N
t3 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL NULL NULL NULL latin1_bin NULL partitioned 0 N t3 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL # # NULL latin1_bin NULL partitioned 0 N
ANALYZE TABLE t1, t2, t3; ANALYZE TABLE t1, t2, t3;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 analyze status OK test.t1 analyze status OK
...@@ -50,9 +50,9 @@ test.t2 analyze status OK ...@@ -50,9 +50,9 @@ test.t2 analyze status OK
test.t3 analyze status OK test.t3 analyze status OK
SHOW TABLE STATUS WHERE name LIKE 't%'; SHOW TABLE STATUS WHERE name LIKE 't%';
Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary
t1 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL NULL NULL NULL latin1_bin NULL 0 N t1 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL # # NULL latin1_bin NULL 0 N
t2 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL NULL NULL NULL latin1_bin NULL 0 N t2 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL # # NULL latin1_bin NULL 0 N
t3 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL NULL NULL NULL latin1_bin NULL partitioned 0 N t3 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL # # NULL latin1_bin NULL partitioned 0 N
select count(pk),count(a) from t1; select count(pk),count(a) from t1;
count(pk) count(a) count(pk) count(a)
2500000 2500000 2500000 2500000
......
...@@ -40,9 +40,9 @@ pk a b ...@@ -40,9 +40,9 @@ pk a b
set rocksdb_bulk_load=0; set rocksdb_bulk_load=0;
SHOW TABLE STATUS WHERE name LIKE 't%'; SHOW TABLE STATUS WHERE name LIKE 't%';
Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary
t1 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL NULL NULL NULL latin1_bin NULL 0 N t1 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL # # NULL latin1_bin NULL 0 N
t2 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL NULL NULL NULL latin1_bin NULL 0 N t2 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL # # NULL latin1_bin NULL 0 N
t3 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL NULL NULL NULL latin1_bin NULL partitioned 0 N t3 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL # # NULL latin1_bin NULL partitioned 0 N
ANALYZE TABLE t1, t2, t3; ANALYZE TABLE t1, t2, t3;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 analyze status OK test.t1 analyze status OK
...@@ -50,9 +50,9 @@ test.t2 analyze status OK ...@@ -50,9 +50,9 @@ test.t2 analyze status OK
test.t3 analyze status OK test.t3 analyze status OK
SHOW TABLE STATUS WHERE name LIKE 't%'; SHOW TABLE STATUS WHERE name LIKE 't%';
Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary
t1 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL NULL NULL NULL latin1_bin NULL 0 N t1 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL # # NULL latin1_bin NULL 0 N
t2 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL NULL NULL NULL latin1_bin NULL 0 N t2 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL # # NULL latin1_bin NULL 0 N
t3 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL NULL NULL NULL latin1_bin NULL partitioned 0 N t3 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL # # NULL latin1_bin NULL partitioned 0 N
select count(pk),count(a) from t1; select count(pk),count(a) from t1;
count(pk) count(a) count(pk) count(a)
2500000 2500000 2500000 2500000
......
...@@ -40,9 +40,9 @@ pk a b ...@@ -40,9 +40,9 @@ pk a b
set rocksdb_bulk_load=0; set rocksdb_bulk_load=0;
SHOW TABLE STATUS WHERE name LIKE 't%'; SHOW TABLE STATUS WHERE name LIKE 't%';
Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary
t1 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL NULL NULL NULL latin1_bin NULL 0 N t1 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL # # NULL latin1_bin NULL 0 N
t2 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL NULL NULL NULL latin1_bin NULL 0 N t2 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL # # NULL latin1_bin NULL 0 N
t3 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL NULL NULL NULL latin1_bin NULL partitioned 0 N t3 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL # # NULL latin1_bin NULL partitioned 0 N
ANALYZE TABLE t1, t2, t3; ANALYZE TABLE t1, t2, t3;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 analyze status OK test.t1 analyze status OK
...@@ -50,9 +50,9 @@ test.t2 analyze status OK ...@@ -50,9 +50,9 @@ test.t2 analyze status OK
test.t3 analyze status OK test.t3 analyze status OK
SHOW TABLE STATUS WHERE name LIKE 't%'; SHOW TABLE STATUS WHERE name LIKE 't%';
Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary
t1 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL NULL NULL NULL latin1_bin NULL 0 N t1 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL # # NULL latin1_bin NULL 0 N
t2 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL NULL NULL NULL latin1_bin NULL 0 N t2 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL # # NULL latin1_bin NULL 0 N
t3 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL NULL NULL NULL latin1_bin NULL partitioned 0 N t3 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL # # NULL latin1_bin NULL partitioned 0 N
select count(pk),count(a) from t1; select count(pk),count(a) from t1;
count(pk) count(a) count(pk) count(a)
2500000 2500000 2500000 2500000
......
...@@ -40,9 +40,9 @@ pk a b ...@@ -40,9 +40,9 @@ pk a b
set rocksdb_bulk_load=0; set rocksdb_bulk_load=0;
SHOW TABLE STATUS WHERE name LIKE 't%'; SHOW TABLE STATUS WHERE name LIKE 't%';
Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary
t1 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL NULL NULL NULL latin1_bin NULL 0 N t1 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL # # NULL latin1_bin NULL 0 N
t2 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL NULL NULL NULL latin1_bin NULL 0 N t2 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL # # NULL latin1_bin NULL 0 N
t3 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL NULL NULL NULL latin1_bin NULL partitioned 0 N t3 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL # # NULL latin1_bin NULL partitioned 0 N
ANALYZE TABLE t1, t2, t3; ANALYZE TABLE t1, t2, t3;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 analyze status OK test.t1 analyze status OK
...@@ -50,9 +50,9 @@ test.t2 analyze status OK ...@@ -50,9 +50,9 @@ test.t2 analyze status OK
test.t3 analyze status OK test.t3 analyze status OK
SHOW TABLE STATUS WHERE name LIKE 't%'; SHOW TABLE STATUS WHERE name LIKE 't%';
Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary
t1 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL NULL NULL NULL latin1_bin NULL 0 N t1 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL # # NULL latin1_bin NULL 0 N
t2 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL NULL NULL NULL latin1_bin NULL 0 N t2 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL # # NULL latin1_bin NULL 0 N
t3 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL NULL NULL NULL latin1_bin NULL partitioned 0 N t3 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL # # NULL latin1_bin NULL partitioned 0 N
select count(pk),count(a) from t1; select count(pk),count(a) from t1;
count(pk) count(a) count(pk) count(a)
2500000 2500000 2500000 2500000
......
...@@ -72,9 +72,9 @@ LOAD DATA INFILE <input_file> INTO TABLE t3; ...@@ -72,9 +72,9 @@ LOAD DATA INFILE <input_file> INTO TABLE t3;
set rocksdb_bulk_load=0; set rocksdb_bulk_load=0;
SHOW TABLE STATUS WHERE name LIKE 't%'; SHOW TABLE STATUS WHERE name LIKE 't%';
Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary
t1 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL NULL NULL NULL latin1_swedish_ci NULL 0 N t1 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL # # NULL latin1_swedish_ci NULL 0 N
t2 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL NULL NULL NULL latin1_swedish_ci NULL 0 N t2 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL # # NULL latin1_swedish_ci NULL 0 N
t3 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL NULL NULL NULL latin1_swedish_ci NULL partitioned 0 N t3 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL # # NULL latin1_swedish_ci NULL partitioned 0 N
ANALYZE TABLE t1, t2, t3; ANALYZE TABLE t1, t2, t3;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 analyze status OK test.t1 analyze status OK
...@@ -82,9 +82,9 @@ test.t2 analyze status OK ...@@ -82,9 +82,9 @@ test.t2 analyze status OK
test.t3 analyze status OK test.t3 analyze status OK
SHOW TABLE STATUS WHERE name LIKE 't%'; SHOW TABLE STATUS WHERE name LIKE 't%';
Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary
t1 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL NULL NULL NULL latin1_swedish_ci NULL 0 N t1 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL # # NULL latin1_swedish_ci NULL 0 N
t2 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL NULL NULL NULL latin1_swedish_ci NULL 0 N t2 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL # # NULL latin1_swedish_ci NULL 0 N
t3 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL NULL NULL NULL latin1_swedish_ci NULL partitioned 0 N t3 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL # # NULL latin1_swedish_ci NULL partitioned 0 N
select count(a),count(b) from t1; select count(a),count(b) from t1;
count(a) count(b) count(a) count(b)
2500000 2500000 2500000 2500000
......
...@@ -72,9 +72,9 @@ LOAD DATA INFILE <input_file> INTO TABLE t3; ...@@ -72,9 +72,9 @@ LOAD DATA INFILE <input_file> INTO TABLE t3;
set rocksdb_bulk_load=0; set rocksdb_bulk_load=0;
SHOW TABLE STATUS WHERE name LIKE 't%'; SHOW TABLE STATUS WHERE name LIKE 't%';
Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary
t1 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL NULL NULL NULL latin1_swedish_ci NULL 0 N t1 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL # # NULL latin1_swedish_ci NULL 0 N
t2 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL NULL NULL NULL latin1_swedish_ci NULL 0 N t2 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL # # NULL latin1_swedish_ci NULL 0 N
t3 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL NULL NULL NULL latin1_swedish_ci NULL partitioned 0 N t3 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL # # NULL latin1_swedish_ci NULL partitioned 0 N
ANALYZE TABLE t1, t2, t3; ANALYZE TABLE t1, t2, t3;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t1 analyze status OK test.t1 analyze status OK
...@@ -82,9 +82,9 @@ test.t2 analyze status OK ...@@ -82,9 +82,9 @@ test.t2 analyze status OK
test.t3 analyze status OK test.t3 analyze status OK
SHOW TABLE STATUS WHERE name LIKE 't%'; SHOW TABLE STATUS WHERE name LIKE 't%';
Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary
t1 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL NULL NULL NULL latin1_swedish_ci NULL 0 N t1 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL # # NULL latin1_swedish_ci NULL 0 N
t2 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL NULL NULL NULL latin1_swedish_ci NULL 0 N t2 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL # # NULL latin1_swedish_ci NULL 0 N
t3 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL NULL NULL NULL latin1_swedish_ci NULL partitioned 0 N t3 ROCKSDB 10 Fixed 2500000 # # # # 0 NULL # # NULL latin1_swedish_ci NULL partitioned 0 N
select count(a),count(b) from t1; select count(a),count(b) from t1;
count(a) count(b) count(a) count(b)
2500000 2500000 2500000 2500000
......
...@@ -2,7 +2,7 @@ CREATE TABLE t1 (pk BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT); ...@@ -2,7 +2,7 @@ CREATE TABLE t1 (pk BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT);
INSERT INTO t1 VALUES (5); INSERT INTO t1 VALUES (5);
SHOW TABLE STATUS LIKE 't1'; SHOW TABLE STATUS LIKE 't1';
Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary
t1 ROCKSDB # Fixed # # # # # # 6 NULL NULL NULL latin1_swedish_ci NULL 0 N t1 ROCKSDB # Fixed # # # # # # 6 # # NULL latin1_swedish_ci NULL 0 N
INSERT INTO t1 VALUES ('538647864786478647864'); INSERT INTO t1 VALUES ('538647864786478647864');
Warnings: Warnings:
Warning 1264 Out of range value for column 'pk' at row 1 Warning 1264 Out of range value for column 'pk' at row 1
...@@ -12,7 +12,7 @@ pk ...@@ -12,7 +12,7 @@ pk
9223372036854775807 9223372036854775807
SHOW TABLE STATUS LIKE 't1'; SHOW TABLE STATUS LIKE 't1';
Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary
t1 ROCKSDB 10 Fixed 2 22 44 0 0 0 9223372036854775807 NULL NULL NULL latin1_swedish_ci NULL 0 N t1 ROCKSDB 10 Fixed 2 22 44 0 0 0 9223372036854775807 # # NULL latin1_swedish_ci NULL 0 N
INSERT INTO t1 VALUES (); INSERT INTO t1 VALUES ();
ERROR 23000: Duplicate entry '9223372036854775807' for key 'PRIMARY' ERROR 23000: Duplicate entry '9223372036854775807' for key 'PRIMARY'
SELECT * FROM t1; SELECT * FROM t1;
...@@ -21,7 +21,7 @@ pk ...@@ -21,7 +21,7 @@ pk
9223372036854775807 9223372036854775807
SHOW TABLE STATUS LIKE 't1'; SHOW TABLE STATUS LIKE 't1';
Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary
t1 ROCKSDB # Fixed # # # # # # 9223372036854775807 NULL NULL NULL latin1_swedish_ci NULL 0 N t1 ROCKSDB # Fixed # # # # # # 9223372036854775807 # # NULL latin1_swedish_ci NULL 0 N
INSERT INTO t1 VALUES (); INSERT INTO t1 VALUES ();
ERROR 23000: Duplicate entry '9223372036854775807' for key 'PRIMARY' ERROR 23000: Duplicate entry '9223372036854775807' for key 'PRIMARY'
SELECT * FROM t1; SELECT * FROM t1;
...@@ -30,13 +30,13 @@ pk ...@@ -30,13 +30,13 @@ pk
9223372036854775807 9223372036854775807
SHOW TABLE STATUS LIKE 't1'; SHOW TABLE STATUS LIKE 't1';
Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary
t1 ROCKSDB # Fixed # # # # # # 9223372036854775807 NULL NULL NULL latin1_swedish_ci NULL 0 N t1 ROCKSDB # Fixed # # # # # # 9223372036854775807 # # NULL latin1_swedish_ci NULL 0 N
DROP TABLE t1; DROP TABLE t1;
CREATE TABLE t1 (pk TINYINT NOT NULL PRIMARY KEY AUTO_INCREMENT); CREATE TABLE t1 (pk TINYINT NOT NULL PRIMARY KEY AUTO_INCREMENT);
INSERT INTO t1 VALUES (5); INSERT INTO t1 VALUES (5);
SHOW TABLE STATUS LIKE 't1'; SHOW TABLE STATUS LIKE 't1';
Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary
t1 ROCKSDB # Fixed # # # # # # 6 NULL NULL NULL latin1_swedish_ci NULL 0 N t1 ROCKSDB # Fixed # # # # # # 6 # # NULL latin1_swedish_ci NULL 0 N
INSERT INTO t1 VALUES (1000); INSERT INTO t1 VALUES (1000);
Warnings: Warnings:
Warning 1264 Out of range value for column 'pk' at row 1 Warning 1264 Out of range value for column 'pk' at row 1
...@@ -46,7 +46,7 @@ pk ...@@ -46,7 +46,7 @@ pk
127 127
SHOW TABLE STATUS LIKE 't1'; SHOW TABLE STATUS LIKE 't1';
Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary
t1 ROCKSDB # Fixed # # # # # # 127 NULL NULL NULL latin1_swedish_ci NULL 0 N t1 ROCKSDB # Fixed # # # # # # 127 # # NULL latin1_swedish_ci NULL 0 N
INSERT INTO t1 VALUES (); INSERT INTO t1 VALUES ();
ERROR 23000: Duplicate entry '127' for key 'PRIMARY' ERROR 23000: Duplicate entry '127' for key 'PRIMARY'
SELECT * FROM t1; SELECT * FROM t1;
...@@ -55,7 +55,7 @@ pk ...@@ -55,7 +55,7 @@ pk
127 127
SHOW TABLE STATUS LIKE 't1'; SHOW TABLE STATUS LIKE 't1';
Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary
t1 ROCKSDB # Fixed # # # # # # 127 NULL NULL NULL latin1_swedish_ci NULL 0 N t1 ROCKSDB # Fixed # # # # # # 127 # # NULL latin1_swedish_ci NULL 0 N
INSERT INTO t1 VALUES (); INSERT INTO t1 VALUES ();
ERROR 23000: Duplicate entry '127' for key 'PRIMARY' ERROR 23000: Duplicate entry '127' for key 'PRIMARY'
SELECT * FROM t1; SELECT * FROM t1;
...@@ -64,5 +64,5 @@ pk ...@@ -64,5 +64,5 @@ pk
127 127
SHOW TABLE STATUS LIKE 't1'; SHOW TABLE STATUS LIKE 't1';
Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary
t1 ROCKSDB # Fixed # # # # # # 127 NULL NULL NULL latin1_swedish_ci NULL 0 N t1 ROCKSDB # Fixed # # # # # # 127 # # NULL latin1_swedish_ci NULL 0 N
DROP TABLE t1; DROP TABLE t1;
...@@ -1421,7 +1421,7 @@ create table t1 (i int primary key auto_increment) engine=RocksDB; ...@@ -1421,7 +1421,7 @@ create table t1 (i int primary key auto_increment) engine=RocksDB;
insert into t1 values (null),(null); insert into t1 values (null),(null);
show table status like 't1'; show table status like 't1';
Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary
t1 ROCKSDB 10 Fixed 1000 0 # 0 0 0 3 NULL NULL NULL latin1_swedish_ci NULL 0 N t1 ROCKSDB 10 Fixed 1000 0 # 0 0 0 3 # # NULL latin1_swedish_ci NULL 0 N
drop table t1; drop table t1;
# #
# Fix Issue #4: Crash when using pseudo-unique keys # Fix Issue #4: Crash when using pseudo-unique keys
...@@ -2594,7 +2594,7 @@ CREATE TABLE t1(a INT AUTO_INCREMENT KEY); ...@@ -2594,7 +2594,7 @@ CREATE TABLE t1(a INT AUTO_INCREMENT KEY);
INSERT INTO t1 VALUES(0),(-1),(0); INSERT INTO t1 VALUES(0),(-1),(0);
SHOW TABLE STATUS LIKE 't1'; SHOW TABLE STATUS LIKE 't1';
Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary
t1 ROCKSDB 10 Fixed 1000 0 0 0 0 0 3 NULL NULL NULL latin1_swedish_ci NULL 0 N t1 ROCKSDB 10 Fixed 1000 0 0 0 0 0 3 # # NULL latin1_swedish_ci NULL 0 N
SELECT * FROM t1; SELECT * FROM t1;
a a
-1 -1
...@@ -2605,7 +2605,7 @@ CREATE TABLE t1(a INT AUTO_INCREMENT KEY); ...@@ -2605,7 +2605,7 @@ CREATE TABLE t1(a INT AUTO_INCREMENT KEY);
INSERT INTO t1 VALUES(0),(10),(0); INSERT INTO t1 VALUES(0),(10),(0);
SHOW TABLE STATUS LIKE 't1'; SHOW TABLE STATUS LIKE 't1';
Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary
t1 ROCKSDB 10 Fixed 1000 0 0 0 0 0 12 NULL NULL NULL latin1_swedish_ci NULL 0 N t1 ROCKSDB 10 Fixed 1000 0 0 0 0 0 12 # # NULL latin1_swedish_ci NULL 0 N
SELECT * FROM t1; SELECT * FROM t1;
a a
1 1
......
...@@ -7,12 +7,12 @@ set global rocksdb_force_flush_memtable_now = true; ...@@ -7,12 +7,12 @@ set global rocksdb_force_flush_memtable_now = true;
CREATE TABLE t3 (a INT, b CHAR(8), pk INT PRIMARY KEY) ENGINE=rocksdb CHARACTER SET utf8; CREATE TABLE t3 (a INT, b CHAR(8), pk INT PRIMARY KEY) ENGINE=rocksdb CHARACTER SET utf8;
SHOW TABLE STATUS WHERE name IN ( 't1', 't2', 't3' ); SHOW TABLE STATUS WHERE name IN ( 't1', 't2', 't3' );
Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary
t1 ROCKSDB 10 Fixed 1000 # # 0 0 0 NULL NULL NULL NULL latin1_swedish_ci NULL 0 N t1 ROCKSDB 10 Fixed 1000 # # 0 0 0 NULL # # NULL latin1_swedish_ci NULL 0 N
t2 ROCKSDB 10 Fixed 1000 # # 0 0 0 NULL NULL NULL NULL latin1_swedish_ci NULL 0 N t2 ROCKSDB 10 Fixed 1000 # # 0 0 0 NULL # # NULL latin1_swedish_ci NULL 0 N
t3 ROCKSDB 10 Fixed 1000 # # 0 0 0 NULL NULL NULL NULL utf8_general_ci NULL 0 N t3 ROCKSDB 10 Fixed 1000 # # 0 0 0 NULL # # NULL utf8_general_ci NULL 0 N
SHOW TABLE STATUS WHERE name LIKE 't2'; SHOW TABLE STATUS WHERE name LIKE 't2';
Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary
t2 ROCKSDB 10 Fixed 1000 # # 0 0 0 NULL NULL NULL NULL latin1_swedish_ci NULL 0 N t2 ROCKSDB 10 Fixed 1000 # # 0 0 0 NULL # # NULL latin1_swedish_ci NULL 0 N
DROP TABLE t1, t2, t3; DROP TABLE t1, t2, t3;
CREATE DATABASE `db_new..............................................end`; CREATE DATABASE `db_new..............................................end`;
USE `db_new..............................................end`; USE `db_new..............................................end`;
...@@ -22,3 +22,91 @@ SELECT TABLE_SCHEMA, TABLE_NAME FROM information_schema.table_statistics WHERE T ...@@ -22,3 +22,91 @@ SELECT TABLE_SCHEMA, TABLE_NAME FROM information_schema.table_statistics WHERE T
TABLE_SCHEMA db_new..............................................end TABLE_SCHEMA db_new..............................................end
TABLE_NAME t1_new..............................................end TABLE_NAME t1_new..............................................end
DROP DATABASE `db_new..............................................end`; DROP DATABASE `db_new..............................................end`;
#
# MDEV-17171: Bug: RocksDB Tables do not have "Creation Date"
#
use test;
create table t1 (a int) engine=rocksdb;
select create_time is not null, update_time, check_time
from information_schema.tables where table_schema=database() and table_name='t1';
create_time is not null update_time check_time
1 NULL NULL
insert into t1 values (1);
select create_time is not null, update_time is not null, check_time
from information_schema.tables where table_schema=database() and table_name='t1';
create_time is not null update_time is not null check_time
1 1 NULL
flush tables;
select create_time is not null, update_time is not null, check_time
from information_schema.tables where table_schema=database() and table_name='t1';
create_time is not null update_time is not null check_time
1 1 NULL
select create_time, update_time into @create_tm, @update_tm
from information_schema.tables
where table_schema=database() and table_name='t1';
select sleep(3);
sleep(3)
0
insert into t1 values (2);
select
create_time=@create_tm /* should not change */ ,
timestampdiff(second, @update_tm, update_time) > 2,
check_time
from information_schema.tables
where table_schema=database() and table_name='t1';
create_time=@create_tm 1
timestampdiff(second, @update_tm, update_time) > 2 1
check_time NULL
#
# Check how create_time survives ALTER TABLE.
# First, an ALTER TABLE that re-creates the table:
alter table t1 add b int;
select
create_time<>@create_tm /* should change */,
create_time IS NOT NULL,
update_time IS NULL
from information_schema.tables
where table_schema=database() and table_name='t1';
create_time<>@create_tm 1
create_time IS NOT NULL 1
update_time IS NULL 1
insert into t1 values (5,5);
select create_time, update_time into @create_tm, @update_tm
from information_schema.tables
where table_schema=database() and table_name='t1';
# Then, an in-place ALTER TABLE:
alter table t1 add key (a);
select
create_time=@create_tm /* should not change */,
update_time
from information_schema.tables
where table_schema=database() and table_name='t1';
create_time=@create_tm 1
update_time NULL
#
# Check what is left after server restart
#
# Save t1's creation time
create table t2 as
select create_time
from information_schema.tables
where table_schema=database() and table_name='t1';
select
create_time=(select create_time from t2) /* should change */,
update_time
from information_schema.tables
where table_schema=database() and table_name='t1';
create_time=(select create_time from t2) 1
update_time NULL
drop table t1, t2;
#
# Check how it works for partitioned tables
#
create table t1 (pk int primary key) partition by hash(pk) partitions 2;
insert into t1 values (1);
select create_time IS NOT NULL , update_time IS NOT NULL
from information_schema.tables
where table_schema=database() and table_name='t1';
create_time IS NOT NULL 1
update_time IS NOT NULL 1
drop table t1;
...@@ -9,19 +9,19 @@ DROP TABLE t1; ...@@ -9,19 +9,19 @@ DROP TABLE t1;
CREATE TABLE t1 (a INT KEY AUTO_INCREMENT, c CHAR(8)) ENGINE=rocksdb; CREATE TABLE t1 (a INT KEY AUTO_INCREMENT, c CHAR(8)) ENGINE=rocksdb;
SHOW TABLE STATUS LIKE 't1'; SHOW TABLE STATUS LIKE 't1';
Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary
t1 ROCKSDB 10 Fixed # # # 0 0 0 1 NULL NULL NULL latin1_swedish_ci NULL 0 N t1 ROCKSDB 10 Fixed # # # 0 0 0 1 # # NULL latin1_swedish_ci NULL 0 N
INSERT INTO t1 (c) VALUES ('a'),('b'),('c'); INSERT INTO t1 (c) VALUES ('a'),('b'),('c');
SHOW TABLE STATUS LIKE 't1'; SHOW TABLE STATUS LIKE 't1';
Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary
t1 ROCKSDB 10 Fixed # # # 0 0 0 4 NULL NULL NULL latin1_swedish_ci NULL 0 N t1 ROCKSDB 10 Fixed # # # 0 0 0 4 # # NULL latin1_swedish_ci NULL 0 N
TRUNCATE TABLE t1; TRUNCATE TABLE t1;
SHOW TABLE STATUS LIKE 't1'; SHOW TABLE STATUS LIKE 't1';
Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary
t1 ROCKSDB 10 Fixed # # # 0 0 0 1 NULL NULL NULL latin1_swedish_ci NULL 0 N t1 ROCKSDB 10 Fixed # # # 0 0 0 1 # # NULL latin1_swedish_ci NULL 0 N
INSERT INTO t1 (c) VALUES ('d'); INSERT INTO t1 (c) VALUES ('d');
SHOW TABLE STATUS LIKE 't1'; SHOW TABLE STATUS LIKE 't1';
Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary
t1 ROCKSDB 10 Fixed # # # 0 0 0 2 NULL NULL NULL latin1_swedish_ci NULL 0 N t1 ROCKSDB 10 Fixed # # # 0 0 0 2 # # NULL latin1_swedish_ci NULL 0 N
SELECT a,c FROM t1; SELECT a,c FROM t1;
a c a c
1 d 1 d
......
...@@ -3,24 +3,25 @@ ...@@ -3,24 +3,25 @@
CREATE TABLE t1 (pk BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT); CREATE TABLE t1 (pk BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT);
INSERT INTO t1 VALUES (5); INSERT INTO t1 VALUES (5);
--replace_column 3 # 5 # 6 # 7 # 8 # 9 # 10 # --replace_column 3 # 5 # 6 # 7 # 8 # 9 # 10 # 12 # 13 #
SHOW TABLE STATUS LIKE 't1'; SHOW TABLE STATUS LIKE 't1';
INSERT INTO t1 VALUES ('538647864786478647864'); INSERT INTO t1 VALUES ('538647864786478647864');
--replace_column 3 # 5 # 6 # 7 # 8 # 9 # 10 # --replace_column 3 # 5 # 6 # 7 # 8 # 9 # 10 # 12 # 13 #
SELECT * FROM t1; SELECT * FROM t1;
--replace_column 12 # 13 #
SHOW TABLE STATUS LIKE 't1'; SHOW TABLE STATUS LIKE 't1';
--error ER_DUP_ENTRY --error ER_DUP_ENTRY
INSERT INTO t1 VALUES (); INSERT INTO t1 VALUES ();
SELECT * FROM t1; SELECT * FROM t1;
--replace_column 3 # 5 # 6 # 7 # 8 # 9 # 10 # --replace_column 3 # 5 # 6 # 7 # 8 # 9 # 10 # 12 # 13 #
SHOW TABLE STATUS LIKE 't1'; SHOW TABLE STATUS LIKE 't1';
--error ER_DUP_ENTRY --error ER_DUP_ENTRY
INSERT INTO t1 VALUES (); INSERT INTO t1 VALUES ();
SELECT * FROM t1; SELECT * FROM t1;
--replace_column 3 # 5 # 6 # 7 # 8 # 9 # 10 # --replace_column 3 # 5 # 6 # 7 # 8 # 9 # 10 # 12 # 13 #
SHOW TABLE STATUS LIKE 't1'; SHOW TABLE STATUS LIKE 't1';
DROP TABLE t1; DROP TABLE t1;
...@@ -28,24 +29,24 @@ DROP TABLE t1; ...@@ -28,24 +29,24 @@ DROP TABLE t1;
CREATE TABLE t1 (pk TINYINT NOT NULL PRIMARY KEY AUTO_INCREMENT); CREATE TABLE t1 (pk TINYINT NOT NULL PRIMARY KEY AUTO_INCREMENT);
INSERT INTO t1 VALUES (5); INSERT INTO t1 VALUES (5);
--replace_column 3 # 5 # 6 # 7 # 8 # 9 # 10 # --replace_column 3 # 5 # 6 # 7 # 8 # 9 # 10 # 12 # 13 #
SHOW TABLE STATUS LIKE 't1'; SHOW TABLE STATUS LIKE 't1';
INSERT INTO t1 VALUES (1000); INSERT INTO t1 VALUES (1000);
SELECT * FROM t1; SELECT * FROM t1;
--replace_column 3 # 5 # 6 # 7 # 8 # 9 # 10 # --replace_column 3 # 5 # 6 # 7 # 8 # 9 # 10 # 12 # 13 #
SHOW TABLE STATUS LIKE 't1'; SHOW TABLE STATUS LIKE 't1';
--error ER_DUP_ENTRY --error ER_DUP_ENTRY
INSERT INTO t1 VALUES (); INSERT INTO t1 VALUES ();
SELECT * FROM t1; SELECT * FROM t1;
--replace_column 3 # 5 # 6 # 7 # 8 # 9 # 10 # --replace_column 3 # 5 # 6 # 7 # 8 # 9 # 10 # 12 # 13 #
SHOW TABLE STATUS LIKE 't1'; SHOW TABLE STATUS LIKE 't1';
--error ER_DUP_ENTRY --error ER_DUP_ENTRY
INSERT INTO t1 VALUES (); INSERT INTO t1 VALUES ();
SELECT * FROM t1; SELECT * FROM t1;
--replace_column 3 # 5 # 6 # 7 # 8 # 9 # 10 # --replace_column 3 # 5 # 6 # 7 # 8 # 9 # 10 # 12 # 13 #
SHOW TABLE STATUS LIKE 't1'; SHOW TABLE STATUS LIKE 't1';
DROP TABLE t1; DROP TABLE t1;
...@@ -1207,7 +1207,7 @@ drop table t1; ...@@ -1207,7 +1207,7 @@ drop table t1;
create table t1 (i int primary key auto_increment) engine=RocksDB; create table t1 (i int primary key auto_increment) engine=RocksDB;
insert into t1 values (null),(null); insert into t1 values (null),(null);
--replace_column 7 # --replace_column 7 # 12 # 13 #
show table status like 't1'; show table status like 't1';
drop table t1; drop table t1;
...@@ -1914,11 +1914,13 @@ DROP TABLE t1; ...@@ -1914,11 +1914,13 @@ DROP TABLE t1;
# value is 4 while MyRocks will show it as 3. # value is 4 while MyRocks will show it as 3.
CREATE TABLE t1(a INT AUTO_INCREMENT KEY); CREATE TABLE t1(a INT AUTO_INCREMENT KEY);
INSERT INTO t1 VALUES(0),(-1),(0); INSERT INTO t1 VALUES(0),(-1),(0);
--replace_column 12 # 13 #
SHOW TABLE STATUS LIKE 't1'; SHOW TABLE STATUS LIKE 't1';
SELECT * FROM t1; SELECT * FROM t1;
DROP TABLE t1; DROP TABLE t1;
CREATE TABLE t1(a INT AUTO_INCREMENT KEY); CREATE TABLE t1(a INT AUTO_INCREMENT KEY);
INSERT INTO t1 VALUES(0),(10),(0); INSERT INTO t1 VALUES(0),(10),(0);
--replace_column 12 # 13 #
SHOW TABLE STATUS LIKE 't1'; SHOW TABLE STATUS LIKE 't1';
SELECT * FROM t1; SELECT * FROM t1;
DROP TABLE t1; DROP TABLE t1;
......
--source include/have_rocksdb.inc --source include/have_rocksdb.inc
--source include/have_partition.inc
--source include/not_windows.inc # decorated database names is too long, exceeded OS limits --source include/not_windows.inc # decorated database names is too long, exceeded OS limits
# #
...@@ -25,7 +26,7 @@ set global rocksdb_force_flush_memtable_now = true; ...@@ -25,7 +26,7 @@ set global rocksdb_force_flush_memtable_now = true;
CREATE TABLE t3 (a INT, b CHAR(8), pk INT PRIMARY KEY) ENGINE=rocksdb CHARACTER SET utf8; CREATE TABLE t3 (a INT, b CHAR(8), pk INT PRIMARY KEY) ENGINE=rocksdb CHARACTER SET utf8;
--replace_column 6 # 7 # --replace_column 6 # 7 # 12 # 13 #
SHOW TABLE STATUS WHERE name IN ( 't1', 't2', 't3' ); SHOW TABLE STATUS WHERE name IN ( 't1', 't2', 't3' );
# Some statistics don't get updated as quickly. The Data_length and # Some statistics don't get updated as quickly. The Data_length and
...@@ -49,7 +50,7 @@ set global rocksdb_force_flush_memtable_now = true; ...@@ -49,7 +50,7 @@ set global rocksdb_force_flush_memtable_now = true;
# We expect the number of rows to be 10000. Data_len and Avg_row_len # We expect the number of rows to be 10000. Data_len and Avg_row_len
# may vary, depending on built-in compression library. # may vary, depending on built-in compression library.
--replace_column 6 # 7 # --replace_column 6 # 7 # 12 # 13 #
SHOW TABLE STATUS WHERE name LIKE 't2'; SHOW TABLE STATUS WHERE name LIKE 't2';
DROP TABLE t1, t2, t3; DROP TABLE t1, t2, t3;
...@@ -63,3 +64,89 @@ CREATE TABLE `t1_new..............................................end`(a int) en ...@@ -63,3 +64,89 @@ CREATE TABLE `t1_new..............................................end`(a int) en
INSERT INTO `t1_new..............................................end` VALUES (1); INSERT INTO `t1_new..............................................end` VALUES (1);
--query_vertical SELECT TABLE_SCHEMA, TABLE_NAME FROM information_schema.table_statistics WHERE TABLE_NAME = 't1_new..............................................end' --query_vertical SELECT TABLE_SCHEMA, TABLE_NAME FROM information_schema.table_statistics WHERE TABLE_NAME = 't1_new..............................................end'
DROP DATABASE `db_new..............................................end`; DROP DATABASE `db_new..............................................end`;
--echo #
--echo # MDEV-17171: Bug: RocksDB Tables do not have "Creation Date"
--echo #
use test;
create table t1 (a int) engine=rocksdb;
select create_time is not null, update_time, check_time
from information_schema.tables where table_schema=database() and table_name='t1';
insert into t1 values (1);
select create_time is not null, update_time is not null, check_time
from information_schema.tables where table_schema=database() and table_name='t1';
flush tables;
select create_time is not null, update_time is not null, check_time
from information_schema.tables where table_schema=database() and table_name='t1';
select create_time, update_time into @create_tm, @update_tm
from information_schema.tables
where table_schema=database() and table_name='t1';
select sleep(3);
insert into t1 values (2);
--vertical_results
select
create_time=@create_tm /* should not change */ ,
timestampdiff(second, @update_tm, update_time) > 2,
check_time
from information_schema.tables
where table_schema=database() and table_name='t1';
--echo #
--echo # Check how create_time survives ALTER TABLE.
--echo # First, an ALTER TABLE that re-creates the table:
alter table t1 add b int;
select
create_time<>@create_tm /* should change */,
create_time IS NOT NULL,
update_time IS NULL
from information_schema.tables
where table_schema=database() and table_name='t1';
insert into t1 values (5,5);
select create_time, update_time into @create_tm, @update_tm
from information_schema.tables
where table_schema=database() and table_name='t1';
--echo # Then, an in-place ALTER TABLE:
alter table t1 add key (a);
select
create_time=@create_tm /* should not change */,
update_time
from information_schema.tables
where table_schema=database() and table_name='t1';
--echo #
--echo # Check what is left after server restart
--echo #
--echo # Save t1's creation time
create table t2 as
select create_time
from information_schema.tables
where table_schema=database() and table_name='t1';
select
create_time=(select create_time from t2) /* should change */,
update_time
from information_schema.tables
where table_schema=database() and table_name='t1';
drop table t1, t2;
--echo #
--echo # Check how it works for partitioned tables
--echo #
create table t1 (pk int primary key) partition by hash(pk) partitions 2;
insert into t1 values (1);
select create_time IS NOT NULL , update_time IS NOT NULL
from information_schema.tables
where table_schema=database() and table_name='t1';
drop table t1;
...@@ -29,22 +29,22 @@ DROP TABLE t1; ...@@ -29,22 +29,22 @@ DROP TABLE t1;
CREATE TABLE t1 (a INT KEY AUTO_INCREMENT, c CHAR(8)) ENGINE=rocksdb; CREATE TABLE t1 (a INT KEY AUTO_INCREMENT, c CHAR(8)) ENGINE=rocksdb;
#--replace_column 2 # 3 # 4 # 5 # 6 # 7 # 8 # 9 # 10 # 12 # 13 # 14 # 15 # 16 # 17 # 18 # #--replace_column 2 # 3 # 4 # 5 # 6 # 7 # 8 # 9 # 10 # 12 # 13 # 14 # 15 # 16 # 17 # 18 #
--replace_column 5 # 6 # 7 # --replace_column 5 # 6 # 7 # 12 # 13 #
SHOW TABLE STATUS LIKE 't1'; SHOW TABLE STATUS LIKE 't1';
INSERT INTO t1 (c) VALUES ('a'),('b'),('c'); INSERT INTO t1 (c) VALUES ('a'),('b'),('c');
#--replace_column 2 # 3 # 4 # 5 # 6 # 7 # 8 # 9 # 10 # 12 # 13 # 14 # 15 # 16 # 17 # 18 # #--replace_column 2 # 3 # 4 # 5 # 6 # 7 # 8 # 9 # 10 # 12 # 13 # 14 # 15 # 16 # 17 # 18 #
--replace_column 5 # 6 # 7 # --replace_column 5 # 6 # 7 # 12 # 13 #
SHOW TABLE STATUS LIKE 't1'; SHOW TABLE STATUS LIKE 't1';
TRUNCATE TABLE t1; TRUNCATE TABLE t1;
#--replace_column 2 # 3 # 4 # 5 # 6 # 7 # 8 # 9 # 10 # 12 # 13 # 14 # 15 # 16 # 17 # 18 # #--replace_column 2 # 3 # 4 # 5 # 6 # 7 # 8 # 9 # 10 # 12 # 13 # 14 # 15 # 16 # 17 # 18 #
--replace_column 5 # 6 # 7 # --replace_column 5 # 6 # 7 # 12 # 13 #
SHOW TABLE STATUS LIKE 't1'; SHOW TABLE STATUS LIKE 't1';
INSERT INTO t1 (c) VALUES ('d'); INSERT INTO t1 (c) VALUES ('d');
#--replace_column 2 # 3 # 4 # 5 # 6 # 7 # 8 # 9 # 10 # 12 # 13 # 14 # 15 # 16 # 17 # 18 # #--replace_column 2 # 3 # 4 # 5 # 6 # 7 # 8 # 9 # 10 # 12 # 13 # 14 # 15 # 16 # 17 # 18 #
--replace_column 5 # 6 # 7 # --replace_column 5 # 6 # 7 # 12 # 13 #
SHOW TABLE STATUS LIKE 't1'; SHOW TABLE STATUS LIKE 't1';
--sorted_result --sorted_result
......
...@@ -3592,6 +3592,26 @@ bool Rdb_tbl_def::put_dict(Rdb_dict_manager *const dict, ...@@ -3592,6 +3592,26 @@ bool Rdb_tbl_def::put_dict(Rdb_dict_manager *const dict,
return false; return false;
} }
time_t Rdb_tbl_def::get_creation_time() {
time_t create_time = m_create_time;
if (create_time == CREATE_TIME_UNKNOWN) {
// Read it from the .frm file. It's not a problem if several threads do this
// concurrently
char path[FN_REFLEN];
snprintf(path, sizeof(path), "%s/%s/%s%s", mysql_data_home,
m_dbname.c_str(), m_tablename.c_str(), reg_ext);
unpack_filename(path,path);
MY_STAT f_stat;
if (my_stat(path, &f_stat, MYF(0)))
create_time = f_stat.st_ctime;
else
create_time = 0; // will be shown as SQL NULL
m_create_time = create_time;
}
return create_time;
}
// Length that each index flag takes inside the record. // Length that each index flag takes inside the record.
// Each index in the array maps to the enum INDEX_FLAG // Each index in the array maps to the enum INDEX_FLAG
static const std::array<uint, 1> index_flag_lengths = { static const std::array<uint, 1> index_flag_lengths = {
......
...@@ -1092,22 +1092,28 @@ class Rdb_tbl_def { ...@@ -1092,22 +1092,28 @@ class Rdb_tbl_def {
Rdb_tbl_def &operator=(const Rdb_tbl_def &) = delete; Rdb_tbl_def &operator=(const Rdb_tbl_def &) = delete;
explicit Rdb_tbl_def(const std::string &name) explicit Rdb_tbl_def(const std::string &name)
: m_key_descr_arr(nullptr), m_hidden_pk_val(0), m_auto_incr_val(0) { : m_key_descr_arr(nullptr), m_hidden_pk_val(0), m_auto_incr_val(0),
m_create_time(CREATE_TIME_UNKNOWN) {
set_name(name); set_name(name);
} }
Rdb_tbl_def(const char *const name, const size_t len) Rdb_tbl_def(const char *const name, const size_t len)
: m_key_descr_arr(nullptr), m_hidden_pk_val(0), m_auto_incr_val(0) { : m_key_descr_arr(nullptr), m_hidden_pk_val(0), m_auto_incr_val(0),
m_create_time(CREATE_TIME_UNKNOWN) {
set_name(std::string(name, len)); set_name(std::string(name, len));
} }
explicit Rdb_tbl_def(const rocksdb::Slice &slice, const size_t pos = 0) explicit Rdb_tbl_def(const rocksdb::Slice &slice, const size_t pos = 0)
: m_key_descr_arr(nullptr), m_hidden_pk_val(0), m_auto_incr_val(0) { : m_key_descr_arr(nullptr), m_hidden_pk_val(0), m_auto_incr_val(0),
m_create_time(CREATE_TIME_UNKNOWN) {
set_name(std::string(slice.data() + pos, slice.size() - pos)); set_name(std::string(slice.data() + pos, slice.size() - pos));
} }
~Rdb_tbl_def(); ~Rdb_tbl_def();
time_t get_creation_time();
time_t update_time = 0; // in-memory only value, maintained right here
void check_and_set_read_free_rpl_table(); void check_and_set_read_free_rpl_table();
/* Number of indexes */ /* Number of indexes */
...@@ -1133,6 +1139,11 @@ class Rdb_tbl_def { ...@@ -1133,6 +1139,11 @@ class Rdb_tbl_def {
const std::string &base_tablename() const { return m_tablename; } const std::string &base_tablename() const { return m_tablename; }
const std::string &base_partition() const { return m_partition; } const std::string &base_partition() const { return m_partition; }
GL_INDEX_ID get_autoincr_gl_index_id(); GL_INDEX_ID get_autoincr_gl_index_id();
private:
const time_t CREATE_TIME_UNKNOWN= 1;
// CREATE_TIME_UNKNOWN means "didn't try to read, yet"
// 0 means "no data available"
std::atomic<time_t> m_create_time;
}; };
/* /*
......
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