Bug #108950 binlog_row_image assertion error
Submitted: 1 Nov 2022 11:00 Modified: 15 Feb 2023 8:18
Reporter: Pedro Ferreira Email Updates:
Status: Verified Impact on me:
None 
Category:MySQL Server: DML Severity:S6 (Debug Builds)
Version:8.0.31 OS:Ubuntu (22.04)
Assigned to: CPU Architecture:x86 (x86_64)
Tags: binlog_row_image

[1 Nov 2022 11:00] Pedro Ferreira
Description:
The following queries:

CREATE TABLE t0 AS (SELECT 5);
SET SESSION BINLOG_ROW_IMAGE = MINIMAL;
ALTER TABLE t0 ADD COLUMN c2 INT AS (1);
DELETE FROM t0;

Trigger an assertion error at field.cc:3713

ASSERT_COLUMN_MARKED_FOR_WRITE;

The compilation parameters are the same as issue 108148:

-DWITH_DEBUG=1 -DWITH_ASAN=ON -DWITH_UBSAN=ON and boost library version 1.77

How to repeat:
Run the queries above.
[2 Nov 2022 12:07] MySQL Verification Team
Hello Pedro Ferreira,

Thank you for the report and feedback.
Observed that 8.0.31 debug build is affected.

regards,
Umesh
[2 Nov 2022 12:08] MySQL Verification Team
- 
-- build 8.0.31 build

scl enable devtoolset-10 bash
MYSQL_VERSION="8031_ASAN"
TARGET=/export/home/tmp/ushastry/src/$MYSQL_VERSION
rm -rf /export/home/tmp/ushastry/src/$MYSQL_VERSION
rm -rf bld/
mkdir bld && cd bld
rm -rf CMakeCache.txt
/home/umshastr/work/binaries/utils/cmake-3.19/bin/cmake ..                    \
-DBUILD_CONFIG=mysql_release             \
-DCMAKE_INSTALL_PREFIX=$TARGET           \
-DWITH_BOOST=../boost                    \
-DCOMPILATION_COMMENT=`date +"%m-%d-%Y"` \
-DWITH_DEBUG=1                           \
-DWITH_ASAN=ON -DWITH_ASAN_SCOPE=ON      \
-DWITH_UBSAN=ON -DWITH_MYSQLX=OFF                        \
-DWITH_ROUTER=OFF -DCMAKE_C_COMPILER=/opt/rh/devtoolset-10/root/usr/bin/gcc -DCMAKE_CXX_COMPILER=/opt/rh/devtoolset-10/root/usr/bin/g++                       
make -j 16
make install

 ./mtr bug108950
Logging: ./mtr  bug108950
MySQL Version 8.0.31
Checking supported features
 - Binaries are debug compiled
Using 'all' suites
Collecting tests
Checking leftover processes
Removing old var directory
Creating var directory '/export/home/tmp/ushastry/src/8031_ASAN/mysql-test/var'
Installing system database
Using parallel: 1

==============================================================================
                  TEST NAME                       RESULT  TIME (ms) COMMENT
------------------------------------------------------------------------------
[ 50%] main.bug108950                            [ fail ]
        Test ended at 2022-11-02 13:06:14

.
2022-11-02T12:06:12.580473Z 0 [System] [MY-010931] [Server] /export/home/tmp/ushastry/src/8031_ASAN/bin/mysqld: ready for connections. Version: '8.0.31-debug-asan-ubsan'  socket: '/export/home/tmp/ushastry/src/8031_ASAN/mysql-test/var/tmp/mysqld.1.sock'  port: 13000  11-02-2022.
mysqld: /export/home/tmp/ushastry/src/mysql-8.0.31/sql/field.cc:3713: virtual type_conversion_status Field_long::store(longlong, bool): Assertion `!table || (!table->write_set || bitmap_is_set(table->write_set, field_index()))' failed.
2022-11-02T12:06:14Z UTC - mysqld got signal 6 ;
Most likely, you have hit a bug, but this error can also be caused by malfunctioning hardware.
BuildID[sha1]=7551e7610e81794bcbec163a29e7776b4901fb42
Thread pointer: 0x627000428100
Attempting backtrace. You can use the following information to find out
where mysqld died. If you see no messages after this, something went
terribly wrong...
stack_bottom = 7fc25ac96970 thread_stack 0x100000
/lib64/libasan.so.6(+0x45dae) [0x7fc288173dae]
/export/home/tmp/ushastry/src/8031_ASAN/bin/mysqld(my_print_stacktrace(unsigned char const*, unsigned long)+0xbe) [0x8d9f990]
/export/home/tmp/ushastry/src/8031_ASAN/bin/mysqld(print_fatal_signal(int)+0x799) [0x3eebd02]
/export/home/tmp/ushastry/src/8031_ASAN/bin/mysqld(handle_fatal_signal+0xa8) [0x3eec3dc]
/lib64/libpthread.so.0(+0xf630) [0x7fc287f21630]
/lib64/libc.so.6(gsignal+0x37) [0x7fc28536e387]
/lib64/libc.so.6(abort+0x148) [0x7fc28536fa78]
/lib64/libc.so.6(+0x2f1a6) [0x7fc2853671a6]
/lib64/libc.so.6(+0x2f252) [0x7fc285367252]
/export/home/tmp/ushastry/src/8031_ASAN/bin/mysqld(Field_long::store(long long, bool)+0x73a) [0x4503f62]
/export/home/tmp/ushastry/src/8031_ASAN/bin/mysqld() [0x4755033]
/export/home/tmp/ushastry/src/8031_ASAN/bin/mysqld(Item_int::save_in_field_inner(Field*, bool)+0x2a5) [0x4767a3b]
/export/home/tmp/ushastry/src/8031_ASAN/bin/mysqld(Item::save_in_field(Field*, bool)+0x215) [0x486a90f]
/export/home/tmp/ushastry/src/8031_ASAN/bin/mysqld() [0x3c9efdd]
/export/home/tmp/ushastry/src/8031_ASAN/bin/mysqld(update_generated_read_fields(unsigned char*, TABLE*, unsigned int)+0x3b9) [0x3c9f4e1]
/export/home/tmp/ushastry/src/8031_ASAN/bin/mysqld(handler::ha_rnd_next(unsigned char*)+0x14ac) [0x4608ec2]
/export/home/tmp/ushastry/src/8031_ASAN/bin/mysqld(TableScanIterator::Read()+0x320) [0x501ae4a]
/export/home/tmp/ushastry/src/8031_ASAN/bin/mysqld(Sql_cmd_delete::delete_from_single_table(THD*)+0x6dd4) [0x579da9e]
/export/home/tmp/ushastry/src/8031_ASAN/bin/mysqld(Sql_cmd_delete::execute_inner(THD*)+0x869) [0x57a03f3]
/export/home/tmp/ushastry/src/8031_ASAN/bin/mysqld(Sql_cmd_dml::execute(THD*)+0x27f0) [0x385230e]
/export/home/tmp/ushastry/src/8031_ASAN/bin/mysqld(mysql_execute_command(THD*, bool)+0x7f83) [0x35976e1]
/export/home/tmp/ushastry/src/8031_ASAN/bin/mysqld(dispatch_sql_command(THD*, Parser_state*)+0x2e00) [0x35b0176]
/export/home/tmp/ushastry/src/8031_ASAN/bin/mysqld(dispatch_command(THD*, COM_DATA const*, enum_server_command)+0x66f4) [0x35b91ea]
/export/home/tmp/ushastry/src/8031_ASAN/bin/mysqld(do_command(THD*)+0x23c4) [0x35c5504]
/export/home/tmp/ushastry/src/8031_ASAN/bin/mysqld() [0x3e9d511]
/export/home/tmp/ushastry/src/8031_ASAN/bin/mysqld() [0xac9d6d9]
/lib64/libpthread.so.0(+0x7ea5) [0x7fc287f19ea5]
/lib64/libc.so.6(clone+0x6d) [0x7fc285436b0d]

Trying to get some variables.
Some pointers may be invalid and cause the dump to abort.
Query (6060014004b0): DELETE FROM t0
Connection ID (thread ID): 9
Status: NOT_KILLED
[15 Feb 2023 8:18] Pedro Ferreira
Reproduced today with 'NOBLOB':

CREATE TABLE t0(c1 TEXT AS (1), c0 INT);
INSERT INTO t0(c0) VALUES ROW(1);
SET SESSION BINLOG_ROW_IMAGE = 'NOBLOB';
DELETE FROM t0;
[2 May 2023 13:10] MySQL Verification Team
It is just about the status.