mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 12:02:42 +01:00
Bug#18280 (RBR: Extreneous maps when writing to general_log and slow_log):
Filter out replication general_log and slow_log entirely from binary log. Caching result of table share-specific tests. mysql-test/r/binlog_row_drop_tmp_tbl.result: Result change mysql-test/r/rpl_row_log.result: Result change mysql-test/r/rpl_row_log_innodb.result: Result change mysql-test/r/rpl_row_max_relay_size.result: Result change sql/handler.cc: Refactoring code to support filtering many tables. Filtering out mysql.general_log and mysql.slow_log from binary log. Caching result from table share-specific tests. sql/sql_class.cc: Correcting comment sql/sql_parse.cc: Using binlog_query() instead of constructing Query_log_events sql/table.cc: Adding variable to cache table check parts for row-based logging. sql/table.h: Adding variable to cache table check parts for row-based logging.
This commit is contained in:
parent
2d360cd035
commit
604e0535d7
9 changed files with 63 additions and 32 deletions
|
@ -14,7 +14,5 @@ get_lock("a",10)
|
||||||
show binlog events;
|
show binlog events;
|
||||||
Log_name Pos Event_type Server_id End_log_pos Info
|
Log_name Pos Event_type Server_id End_log_pos Info
|
||||||
master-bin.000001 # Format_desc 1 # Server ver: VERSION, Binlog ver: 4
|
master-bin.000001 # Format_desc 1 # Server ver: VERSION, Binlog ver: 4
|
||||||
master-bin.000001 # Table_map 1 # table_id: # (mysql.proc)
|
|
||||||
master-bin.000001 # Write_rows 1 # table_id: # flags: STMT_END_F
|
|
||||||
master-bin.000001 # Query 1 # create database `drop-temp+table-test`
|
master-bin.000001 # Query 1 # create database `drop-temp+table-test`
|
||||||
drop database `drop-temp+table-test`;
|
drop database `drop-temp+table-test`;
|
||||||
|
|
|
@ -57,8 +57,6 @@ master-bin.000001 # Rotate 1 # master-bin.000002;pos=4
|
||||||
show binlog events in 'master-bin.000002';
|
show binlog events in 'master-bin.000002';
|
||||||
Log_name Pos Event_type Server_id End_log_pos Info
|
Log_name Pos Event_type Server_id End_log_pos Info
|
||||||
master-bin.000002 # Format_desc 1 # Server ver: VERSION, Binlog ver: 4
|
master-bin.000002 # Format_desc 1 # Server ver: VERSION, Binlog ver: 4
|
||||||
master-bin.000002 # Table_map 1 # table_id: # (mysql.slow_log)
|
|
||||||
master-bin.000002 # Table_map 1 # table_id: # (mysql.general_log)
|
|
||||||
master-bin.000002 # Query 1 # use `test`; create table t3 (a int)ENGINE=MyISAM
|
master-bin.000002 # Query 1 # use `test`; create table t3 (a int)ENGINE=MyISAM
|
||||||
master-bin.000002 # Query 1 # use `test`; create table t2 (n int)ENGINE=MyISAM
|
master-bin.000002 # Query 1 # use `test`; create table t2 (n int)ENGINE=MyISAM
|
||||||
master-bin.000002 # Table_map 1 # table_id: # (test.t2)
|
master-bin.000002 # Table_map 1 # table_id: # (test.t2)
|
||||||
|
@ -66,12 +64,12 @@ master-bin.000002 # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||||
show binary logs;
|
show binary logs;
|
||||||
Log_name File_size
|
Log_name File_size
|
||||||
master-bin.000001 1256
|
master-bin.000001 1256
|
||||||
master-bin.000002 483
|
master-bin.000002 373
|
||||||
start slave;
|
start slave;
|
||||||
show binary logs;
|
show binary logs;
|
||||||
Log_name File_size
|
Log_name File_size
|
||||||
slave-bin.000001 1354
|
slave-bin.000001 1354
|
||||||
slave-bin.000002 384
|
slave-bin.000002 274
|
||||||
show binlog events in 'slave-bin.000001' from 4;
|
show binlog events in 'slave-bin.000001' from 4;
|
||||||
Log_name Pos Event_type Server_id End_log_pos Info
|
Log_name Pos Event_type Server_id End_log_pos Info
|
||||||
slave-bin.000001 # Format_desc 2 # Server ver: VERSION, Binlog ver: 4
|
slave-bin.000001 # Format_desc 2 # Server ver: VERSION, Binlog ver: 4
|
||||||
|
@ -87,14 +85,12 @@ slave-bin.000001 # Rotate 2 # slave-bin.000002;pos=4
|
||||||
show binlog events in 'slave-bin.000002' from 4;
|
show binlog events in 'slave-bin.000002' from 4;
|
||||||
Log_name Pos Event_type Server_id End_log_pos Info
|
Log_name Pos Event_type Server_id End_log_pos Info
|
||||||
slave-bin.000002 # Format_desc 2 # Server ver: VERSION, Binlog ver: 4
|
slave-bin.000002 # Format_desc 2 # Server ver: VERSION, Binlog ver: 4
|
||||||
slave-bin.000002 # Table_map 2 # table_id: # (mysql.slow_log)
|
|
||||||
slave-bin.000002 # Table_map 2 # table_id: # (mysql.general_log)
|
|
||||||
slave-bin.000002 # Query 1 # use `test`; create table t2 (n int)ENGINE=MyISAM
|
slave-bin.000002 # Query 1 # use `test`; create table t2 (n int)ENGINE=MyISAM
|
||||||
slave-bin.000002 # Table_map 1 # table_id: # (test.t2)
|
slave-bin.000002 # Table_map 1 # table_id: # (test.t2)
|
||||||
slave-bin.000002 # Write_rows 1 # table_id: # flags: STMT_END_F
|
slave-bin.000002 # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||||
show slave status;
|
show slave status;
|
||||||
Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master
|
Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master
|
||||||
# 127.0.0.1 root MASTER_PORT 1 master-bin.000002 483 # # master-bin.000002 Yes Yes # 0 0 483 # None 0 No #
|
# 127.0.0.1 root MASTER_PORT 1 master-bin.000002 373 # # master-bin.000002 Yes Yes # 0 0 373 # None 0 No #
|
||||||
show binlog events in 'slave-bin.000005' from 4;
|
show binlog events in 'slave-bin.000005' from 4;
|
||||||
ERROR HY000: Error when executing command SHOW BINLOG EVENTS: Could not find target log
|
ERROR HY000: Error when executing command SHOW BINLOG EVENTS: Could not find target log
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
|
|
@ -61,8 +61,6 @@ master-bin.000001 # Rotate 1 # master-bin.000002;pos=4
|
||||||
show binlog events in 'master-bin.000002';
|
show binlog events in 'master-bin.000002';
|
||||||
Log_name Pos Event_type Server_id End_log_pos Info
|
Log_name Pos Event_type Server_id End_log_pos Info
|
||||||
master-bin.000002 # Format_desc 1 # Server ver: VERSION, Binlog ver: 4
|
master-bin.000002 # Format_desc 1 # Server ver: VERSION, Binlog ver: 4
|
||||||
master-bin.000002 # Table_map 1 # table_id: # (mysql.slow_log)
|
|
||||||
master-bin.000002 # Table_map 1 # table_id: # (mysql.general_log)
|
|
||||||
master-bin.000002 # Query 1 # use `test`; create table t3 (a int)ENGINE=InnoDB
|
master-bin.000002 # Query 1 # use `test`; create table t3 (a int)ENGINE=InnoDB
|
||||||
master-bin.000002 # Query 1 # use `test`; create table t2 (n int)ENGINE=InnoDB
|
master-bin.000002 # Query 1 # use `test`; create table t2 (n int)ENGINE=InnoDB
|
||||||
master-bin.000002 # Table_map 1 # table_id: # (test.t2)
|
master-bin.000002 # Table_map 1 # table_id: # (test.t2)
|
||||||
|
@ -71,12 +69,12 @@ master-bin.000002 # Xid 1 # COMMIT /* XID */
|
||||||
show binary logs;
|
show binary logs;
|
||||||
Log_name File_size
|
Log_name File_size
|
||||||
master-bin.000001 1310
|
master-bin.000001 1310
|
||||||
master-bin.000002 510
|
master-bin.000002 400
|
||||||
start slave;
|
start slave;
|
||||||
show binary logs;
|
show binary logs;
|
||||||
Log_name File_size
|
Log_name File_size
|
||||||
slave-bin.000001 1408
|
slave-bin.000001 1408
|
||||||
slave-bin.000002 411
|
slave-bin.000002 301
|
||||||
show binlog events in 'slave-bin.000001' from 4;
|
show binlog events in 'slave-bin.000001' from 4;
|
||||||
Log_name Pos Event_type Server_id End_log_pos Info
|
Log_name Pos Event_type Server_id End_log_pos Info
|
||||||
slave-bin.000001 # Format_desc 2 # Server ver: VERSION, Binlog ver: 4
|
slave-bin.000001 # Format_desc 2 # Server ver: VERSION, Binlog ver: 4
|
||||||
|
@ -94,15 +92,13 @@ slave-bin.000001 # Rotate 2 # slave-bin.000002;pos=4
|
||||||
show binlog events in 'slave-bin.000002' from 4;
|
show binlog events in 'slave-bin.000002' from 4;
|
||||||
Log_name Pos Event_type Server_id End_log_pos Info
|
Log_name Pos Event_type Server_id End_log_pos Info
|
||||||
slave-bin.000002 # Format_desc 2 # Server ver: VERSION, Binlog ver: 4
|
slave-bin.000002 # Format_desc 2 # Server ver: VERSION, Binlog ver: 4
|
||||||
slave-bin.000002 # Table_map 2 # table_id: # (mysql.slow_log)
|
|
||||||
slave-bin.000002 # Table_map 2 # table_id: # (mysql.general_log)
|
|
||||||
slave-bin.000002 # Query 1 # use `test`; create table t2 (n int)ENGINE=InnoDB
|
slave-bin.000002 # Query 1 # use `test`; create table t2 (n int)ENGINE=InnoDB
|
||||||
slave-bin.000002 # Table_map 1 # table_id: # (test.t2)
|
slave-bin.000002 # Table_map 1 # table_id: # (test.t2)
|
||||||
slave-bin.000002 # Write_rows 1 # table_id: # flags: STMT_END_F
|
slave-bin.000002 # Write_rows 1 # table_id: # flags: STMT_END_F
|
||||||
slave-bin.000002 # Xid 1 # COMMIT /* XID */
|
slave-bin.000002 # Xid 1 # COMMIT /* XID */
|
||||||
show slave status;
|
show slave status;
|
||||||
Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master
|
Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master
|
||||||
# 127.0.0.1 root MASTER_PORT 1 master-bin.000002 510 # # master-bin.000002 Yes Yes # 0 0 510 # None 0 No #
|
# 127.0.0.1 root MASTER_PORT 1 master-bin.000002 400 # # master-bin.000002 Yes Yes # 0 0 400 # None 0 No #
|
||||||
show binlog events in 'slave-bin.000005' from 4;
|
show binlog events in 'slave-bin.000005' from 4;
|
||||||
ERROR HY000: Error when executing command SHOW BINLOG EVENTS: Could not find target log
|
ERROR HY000: Error when executing command SHOW BINLOG EVENTS: Could not find target log
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
|
|
@ -58,4 +58,4 @@ Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File
|
||||||
flush logs;
|
flush logs;
|
||||||
show master status;
|
show master status;
|
||||||
File Position Binlog_Do_DB Binlog_Ignore_DB
|
File Position Binlog_Do_DB Binlog_Ignore_DB
|
||||||
master-bin.000002 212 <Binlog_Ignore_DB>
|
master-bin.000002 102 <Binlog_Ignore_DB>
|
||||||
|
|
|
@ -3150,16 +3150,47 @@ bool ha_show_status(THD *thd, handlerton *db_type, enum ha_stat_type stat)
|
||||||
declared static, but it works by putting it into an anonymous
|
declared static, but it works by putting it into an anonymous
|
||||||
namespace. */
|
namespace. */
|
||||||
namespace {
|
namespace {
|
||||||
|
struct st_table_data {
|
||||||
|
char const *db;
|
||||||
|
char const *name;
|
||||||
|
};
|
||||||
|
|
||||||
|
int table_name_compare(void const *a, void const *b)
|
||||||
|
{
|
||||||
|
st_table_data const *x = (st_table_data const*) a;
|
||||||
|
st_table_data const *y = (st_table_data const*) b;
|
||||||
|
|
||||||
|
/* Doing lexical compare in order (db,name) */
|
||||||
|
int const res= strcmp(x->db, y->db);
|
||||||
|
return res != 0 ? res : strcmp(x->name, y->name);
|
||||||
|
}
|
||||||
|
|
||||||
bool check_table_binlog_row_based(THD *thd, TABLE *table)
|
bool check_table_binlog_row_based(THD *thd, TABLE *table)
|
||||||
{
|
{
|
||||||
|
static st_table_data const ignore[] = {
|
||||||
|
{ "mysql", "event" },
|
||||||
|
{ "mysql", "general_log" },
|
||||||
|
{ "mysql", "slow_log" }
|
||||||
|
};
|
||||||
|
|
||||||
|
my_size_t const ignore_size = sizeof(ignore)/sizeof(*ignore);
|
||||||
|
st_table_data const item = { table->s->db.str, table->s->table_name.str };
|
||||||
|
|
||||||
|
if (table->s->cached_row_logging_check == -1)
|
||||||
|
table->s->cached_row_logging_check=
|
||||||
|
(table->s->tmp_table == NO_TMP_TABLE) &&
|
||||||
|
binlog_filter->db_ok(table->s->db.str) &&
|
||||||
|
bsearch(&item, ignore, ignore_size,
|
||||||
|
sizeof(st_table_data), table_name_compare) == NULL;
|
||||||
|
|
||||||
|
DBUG_ASSERT(table->s->cached_row_logging_check == 0 ||
|
||||||
|
table->s->cached_row_logging_check == 1);
|
||||||
|
|
||||||
return
|
return
|
||||||
thd->current_stmt_binlog_row_based &&
|
thd->current_stmt_binlog_row_based &&
|
||||||
thd && (thd->options & OPTION_BIN_LOG) &&
|
thd && (thd->options & OPTION_BIN_LOG) &&
|
||||||
(table->s->tmp_table == NO_TMP_TABLE) &&
|
|
||||||
mysql_bin_log.is_open() &&
|
mysql_bin_log.is_open() &&
|
||||||
binlog_filter->db_ok(table->s->db.str) &&
|
table->s->cached_row_logging_check;
|
||||||
(strcmp(table->s->db.str, "mysql") ||
|
|
||||||
strcmp(table->s->table_name.str, "event"));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2602,7 +2602,7 @@ int THD::binlog_query(THD::enum_binlog_query_type qtype,
|
||||||
moving back and forth between using RBR for replication of
|
moving back and forth between using RBR for replication of
|
||||||
system tables and not using it.
|
system tables and not using it.
|
||||||
|
|
||||||
Make sure to change in check_table_current_stmt_binlog_row_based according
|
Make sure to change in check_table_binlog_row_based() according
|
||||||
to how you treat this.
|
to how you treat this.
|
||||||
*/
|
*/
|
||||||
case THD::ROW_QUERY_TYPE:
|
case THD::ROW_QUERY_TYPE:
|
||||||
|
|
|
@ -3144,8 +3144,8 @@ end_with_restore_list:
|
||||||
if (mysql_bin_log.is_open())
|
if (mysql_bin_log.is_open())
|
||||||
{
|
{
|
||||||
thd->clear_error(); // No binlog error generated
|
thd->clear_error(); // No binlog error generated
|
||||||
Query_log_event qinfo(thd, thd->query, thd->query_length, 0, FALSE);
|
thd->binlog_query(THD::STMT_QUERY_TYPE,
|
||||||
mysql_bin_log.write(&qinfo);
|
thd->query, thd->query_length, 0, FALSE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
select_lex->table_list.first= (byte*) first_table;
|
select_lex->table_list.first= (byte*) first_table;
|
||||||
|
@ -3178,8 +3178,8 @@ end_with_restore_list:
|
||||||
if (mysql_bin_log.is_open())
|
if (mysql_bin_log.is_open())
|
||||||
{
|
{
|
||||||
thd->clear_error(); // No binlog error generated
|
thd->clear_error(); // No binlog error generated
|
||||||
Query_log_event qinfo(thd, thd->query, thd->query_length, 0, FALSE);
|
thd->binlog_query(THD::STMT_QUERY_TYPE,
|
||||||
mysql_bin_log.write(&qinfo);
|
thd->query, thd->query_length, 0, FALSE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
select_lex->table_list.first= (byte*) first_table;
|
select_lex->table_list.first= (byte*) first_table;
|
||||||
|
@ -3203,8 +3203,8 @@ end_with_restore_list:
|
||||||
if (mysql_bin_log.is_open())
|
if (mysql_bin_log.is_open())
|
||||||
{
|
{
|
||||||
thd->clear_error(); // No binlog error generated
|
thd->clear_error(); // No binlog error generated
|
||||||
Query_log_event qinfo(thd, thd->query, thd->query_length, 0, FALSE);
|
thd->binlog_query(THD::STMT_QUERY_TYPE,
|
||||||
mysql_bin_log.write(&qinfo);
|
thd->query, thd->query_length, 0, FALSE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
select_lex->table_list.first= (byte*) first_table;
|
select_lex->table_list.first= (byte*) first_table;
|
||||||
|
@ -3861,10 +3861,8 @@ end_with_restore_list:
|
||||||
if (!(res= mysql_create_user(thd, lex->users_list)))
|
if (!(res= mysql_create_user(thd, lex->users_list)))
|
||||||
{
|
{
|
||||||
if (mysql_bin_log.is_open())
|
if (mysql_bin_log.is_open())
|
||||||
{
|
|
||||||
thd->binlog_query(THD::MYSQL_QUERY_TYPE,
|
thd->binlog_query(THD::MYSQL_QUERY_TYPE,
|
||||||
thd->query, thd->query_length, FALSE, FALSE);
|
thd->query, thd->query_length, FALSE, FALSE);
|
||||||
}
|
|
||||||
send_ok(thd);
|
send_ok(thd);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -4054,8 +4052,8 @@ end_with_restore_list:
|
||||||
{
|
{
|
||||||
if (mysql_bin_log.is_open())
|
if (mysql_bin_log.is_open())
|
||||||
{
|
{
|
||||||
Query_log_event qinfo(thd, thd->query, thd->query_length, 0, FALSE);
|
thd->binlog_query(THD::STMT_QUERY_TYPE,
|
||||||
mysql_bin_log.write(&qinfo);
|
thd->query, thd->query_length, 0, FALSE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
send_ok(thd);
|
send_ok(thd);
|
||||||
|
|
|
@ -146,6 +146,8 @@ TABLE_SHARE *alloc_table_share(TABLE_LIST *table_list, char *key,
|
||||||
under the protection of the LOCK_open mutex.
|
under the protection of the LOCK_open mutex.
|
||||||
*/
|
*/
|
||||||
share->table_map_id= ~0UL;
|
share->table_map_id= ~0UL;
|
||||||
|
share->cached_row_logging_check= -1;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
memcpy((char*) &share->mem_root, (char*) &mem_root, sizeof(mem_root));
|
memcpy((char*) &share->mem_root, (char*) &mem_root, sizeof(mem_root));
|
||||||
|
@ -205,6 +207,7 @@ void init_tmp_table_share(TABLE_SHARE *share, const char *key,
|
||||||
*/
|
*/
|
||||||
share->table_map_version= ~(ulonglong)0;
|
share->table_map_version= ~(ulonglong)0;
|
||||||
share->table_map_id= ~0UL;
|
share->table_map_id= ~0UL;
|
||||||
|
share->cached_row_logging_check= -1;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
|
|
|
@ -191,6 +191,15 @@ typedef struct st_table_share
|
||||||
bool waiting_on_cond; /* Protection against free */
|
bool waiting_on_cond; /* Protection against free */
|
||||||
ulong table_map_id; /* for row-based replication */
|
ulong table_map_id; /* for row-based replication */
|
||||||
ulonglong table_map_version;
|
ulonglong table_map_version;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Cache for row-based replication table share checks that does not
|
||||||
|
need to be repeated. Possible values are: -1 when cache value is
|
||||||
|
not calculated yet, 0 when table *shall not* be replicated, 1 when
|
||||||
|
table *may* be replicated.
|
||||||
|
*/
|
||||||
|
int cached_row_logging_check;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
TRUE if this is a system table like 'mysql.proc', which we want to be
|
TRUE if this is a system table like 'mysql.proc', which we want to be
|
||||||
able to open and lock even when we already have some tables open and
|
able to open and lock even when we already have some tables open and
|
||||||
|
|
Loading…
Reference in a new issue