Internally, it looks like this:
ha_rocksdb::table_flags() advertises that the storage engine supports both kinds of binlogging:
ulonglong table_flags() const override {
|
DBUG_ENTER_FUNC();
|
...
|
DBUG_RETURN(HA_BINLOG_ROW_CAPABLE | HA_BINLOG_STMT_CAPABLE |
|
...
|
So if the SQL layer has logic to "use SBR if binlog_format=MIXED but storage engine doesn't support it", it will not be applied.
The statement proceeds to execute and hits this piece in ha_rocksdb::external_lock:
if (lock_type == F_WRLCK && !thd->rgi_slave && !unsafe_for_binlog &&
|
binlog_format != BINLOG_FORMAT_ROW &&
|
binlog_format != BINLOG_FORMAT_UNSPEC &&
|
thd->lex->sql_command != SQLCOM_LOCK_TABLES && // (*)
|
thd->lex->sql_command != SQLCOM_ANALYZE && // (**)
|
thd->lex->sql_command != SQLCOM_OPTIMIZE && // (**)
|
thd->lex->sql_command != SQLCOM_FLUSH && // (**)
|
my_core::thd_binlog_filter_ok(thd)) {
|
my_error(ER_REQUIRE_ROW_BINLOG_FORMAT, MYF(0));
|
DBUG_RETURN(HA_ERR_UNSUPPORTED);
|
}
|
when invoked from here:
#0 my_error (nr=4056, MyFlags=0) at /home/psergey/dev-git/10.3-r2/mysys/my_error.c:109
|
#1 0x00007ffff4be06e8 in myrocks::ha_rocksdb::external_lock (this=0x7fff7001b6d0, thd=0x7fff700009a8, lock_type=1) at /home/psergey/dev-git/10.3-r2/storage/rocksdb/ha_rocksdb.cc:10681
|
#2 0x0000555555cbdf6c in handler::ha_external_lock (this=0x7fff7001b6d0, thd=thd@entry=0x7fff700009a8, lock_type=lock_type@entry=1) at /home/psergey/dev-git/10.3-r2/sql/handler.cc:6121
|
#3 0x0000555555d8238a in lock_external (count=1, tables=0x7fff70012028, thd=0x7fff700009a8) at /home/psergey/dev-git/10.3-r2/sql/lock.cc:396
|
#4 mysql_lock_tables (thd=thd@entry=0x7fff700009a8, sql_lock=sql_lock@entry=0x7fff70011ff8, flags=<optimized out>, flags@entry=0) at /home/psergey/dev-git/10.3-r2/sql/lock.cc:342
|
#5 0x0000555555d82cda in mysql_lock_tables (thd=thd@entry=0x7fff700009a8, tables=0x7fff70011ff0, count=<optimized out>, flags=0) at /home/psergey/dev-git/10.3-r2/sql/lock.cc:304
|
#6 0x0000555555a90074 in lock_tables (thd=thd@entry=0x7fff700009a8, tables=0x7fff70011760, count=<optimized out>, flags=flags@entry=0) at /home/psergey/dev-git/10.3-r2/sql/sql_base.cc:5214
|
#7 0x0000555555a91683 in open_and_lock_tables (thd=thd@entry=0x7fff700009a8, options=..., tables=tables@entry=0x7fff70011760, derived=derived@entry=true, flags=flags@entry=0, prelocking_strategy=prelocking_strategy@entry=0x7fffe4b60ca0) at /home/psergey/dev-git/10.3-r2/sql/sql_base.cc:4958
|
and this is why the statement fails with an error.
Internally, it looks like this:
ha_rocksdb::table_flags() advertises that the storage engine supports both kinds of binlogging:
DBUG_ENTER_FUNC();
...
DBUG_RETURN(HA_BINLOG_ROW_CAPABLE | HA_BINLOG_STMT_CAPABLE |
...
So if the SQL layer has logic to "use SBR if binlog_format=MIXED but storage engine doesn't support it", it will not be applied.
The statement proceeds to execute and hits this piece in ha_rocksdb::external_lock:
binlog_format != BINLOG_FORMAT_ROW &&
binlog_format != BINLOG_FORMAT_UNSPEC &&
my_core::thd_binlog_filter_ok(thd)) {
my_error(ER_REQUIRE_ROW_BINLOG_FORMAT, MYF(0));
DBUG_RETURN(HA_ERR_UNSUPPORTED);
}
when invoked from here:
#0 my_error (nr=4056, MyFlags=0) at /home/psergey/dev-git/10.3-r2/mysys/my_error.c:109
#1 0x00007ffff4be06e8 in myrocks::ha_rocksdb::external_lock (this=0x7fff7001b6d0, thd=0x7fff700009a8, lock_type=1) at /home/psergey/dev-git/10.3-r2/storage/rocksdb/ha_rocksdb.cc:10681
#2 0x0000555555cbdf6c in handler::ha_external_lock (this=0x7fff7001b6d0, thd=thd@entry=0x7fff700009a8, lock_type=lock_type@entry=1) at /home/psergey/dev-git/10.3-r2/sql/handler.cc:6121
#3 0x0000555555d8238a in lock_external (count=1, tables=0x7fff70012028, thd=0x7fff700009a8) at /home/psergey/dev-git/10.3-r2/sql/lock.cc:396
#4 mysql_lock_tables (thd=thd@entry=0x7fff700009a8, sql_lock=sql_lock@entry=0x7fff70011ff8, flags=<optimized out>, flags@entry=0) at /home/psergey/dev-git/10.3-r2/sql/lock.cc:342
#5 0x0000555555d82cda in mysql_lock_tables (thd=thd@entry=0x7fff700009a8, tables=0x7fff70011ff0, count=<optimized out>, flags=0) at /home/psergey/dev-git/10.3-r2/sql/lock.cc:304
#6 0x0000555555a90074 in lock_tables (thd=thd@entry=0x7fff700009a8, tables=0x7fff70011760, count=<optimized out>, flags=flags@entry=0) at /home/psergey/dev-git/10.3-r2/sql/sql_base.cc:5214
#7 0x0000555555a91683 in open_and_lock_tables (thd=thd@entry=0x7fff700009a8, options=..., tables=tables@entry=0x7fff70011760, derived=derived@entry=true, flags=flags@entry=0, prelocking_strategy=prelocking_strategy@entry=0x7fffe4b60ca0) at /home/psergey/dev-git/10.3-r2/sql/sql_base.cc:4958
and this is why the statement fails with an error.