Home - Waterfall Grid T-Grid Console Builders Recent Builds Buildslaves Changesources - JSON API - About

Console View


Categories: connectors experimental galera main
Legend:   Passed Failed Warnings Failed Again Running Exception Offline No data

connectors experimental galera main
Rion Bora
MDEV-40545 mariadb-binlog --force-read loops on truncated events

What was wrong:
With --force-read, Log_event::read_log_event() returned a synthetic
"Encrypted event" (Unknown_log_event) for every read error. A
truncated event is such an error, so mariadb-binlog printed a fake
event instead of stopping, and on most truncated binlogs it then never
stopped at all.

How it is fixed:
The synthetic event is meant for encrypted events that mariadb-binlog
cannot decrypt (MDEV-11319). It is now returned only for a decryption
failure. Other read errors, like a truncated event or an out of memory
error, are critical: continuing after them cannot produce meaningful
output, so they are reported and mariadb-binlog stops as it does
without --force-read.

How it is tested:
main.mysqlbinlog_force_read_truncated reads two truncated binlogs from
std_data, one with a truncated event header and one with a truncated
event body. The test loops forever without the fix.
Thirunarayanan Balathandayuthapani
MDEV-41666 Corruption on statement rollback when ON UPDATE SET NULL affects the base column

Problem:
=======
  - When a foreign key column is the base column of a
virtual column that is indexed together with other virtual
columns, a cascaded update (ON UPDATE/DELETE SET NULL)
computed the old value of only the dependent virtual column.
The other virtual key parts of the index stayed NULL in
update->old_vrow. If the statement was rolled back,
row_upd_store_v_row() used those NULLs, so
row_upd_sec_index_entry() searched the secondary
index for a record  that did not exist and hit
the "Record in index was not found on update" assertion.

Solution:
=========
dict_mem_fill_vcol_set_for_base_col():  Add every virtual key part
of each index that contains the dependent virtual column to
dict_foreign_t::v_cols, as dict_mem_fill_vcol_from_v_indexes()
already does. row_ins_foreign_fill_virtual() then computes the
old values of all of them.

Based on mysql/mysql-server@c48fa1e57a8e810f89b43d3e94bcbefa1fd69806
Anway Durge
MDEV-41241 I_S.TABLES assert when a function creates a temp table

Do not use the fast path when the statement uses a stored routine.
Evaluating that function during fill changes THD open-table state and
trips restore_backup_open_tables_state().
Kristian Nielsen
Binlog-in-engine: fix couple typos

Signed-off-by: Kristian Nielsen <[email protected]>
Anway Durge
MDEV-41199 PROCEDURE ANALYSE() on INFORMATION_SCHEMA.TABLES

Add MTR coverage that PROCEDURE ANALYSE() is applied instead of being
silently ignored on the fast path.
Miroslav Rajcic
Bug#39905057: MySQL ExtractValue unclosed CDATA length underflow causes mysqld heap overflow / crash

Problem:
========
The XML scanner reports an unterminated <![CDATA[ section as a valid
CDATA token. Its end pointer remains at the opening delimiter, while
the parser unconditionally removes the opening and closing delimiters.

This underflows the value length. ExtractValue() can subsequently pass
that length to String::append(), causing a heap overwrite and mysqld
crash.

Root Cause:
===========
my_xml_scan() only sets the token end when it finds ]]>, but
my_xml_parse() assumes every CDATA token is complete.

Solution:
=========
Detect EOF before the CDATA terminator and return a parse error before
calling the XML value handler.

Add an ExtractValue() regression test verifying that unterminated CDATA
is rejected with a warning.

Change-Id: I142bafd9ddea185f6b2e87a80af4894f10168291

Fixes MDEV-39571, MDEV-41407
Kristian Nielsen
Merge branch 'knielsen_log_event_read_validation_base_12.3' into 12.3
Kristian Nielsen
MDEV-41442: Too large InnoDB mtr with large binlog_cache_size

The binlog-in-engine code limits the maximum size of engine binlog writes by
forcing OOB-spill, eg. to avoid exceeding InnoDB max mtr size. However there
was a case missed: When the transaction is larger than binlog_max_spill_size
but smaller than the binlog_cache_size, there was no check to force
OOB-spilling, and the code would do a too large binlog write that asserts or
fails inside InnoDB.

Signed-off-by: Kristian Nielsen <[email protected]>
Rex Johnston
MDEV-41631 Check the class of the copy made by Item::shallow_copy()

Item::shallow_copy() was meant to create a copy of the same class as the
item it is called on, but nothing enforced that. A class that does not
declare its own override inherits the one of its nearest concrete parent,
and get_item_copy<Parent>() then silently creates an object of the parent
class, losing the child's virtual behaviour (see MDEV-38801 for an earlier
instance with Item_cache_year).

Add the ITEM_SHALLOW_COPY(CLASS) macro, which declares the override, and
Item::dbug_check_shallow_copy_type(), a debug-only check called from
Query_arena::free_items() for every item freed. Once per dynamic type it
creates a shallow copy and asserts that it has the same typeid as the
original. Then, the copy is destroyed, which provides additional
coverage.

The check found these classes copied as their parent class, now fixed with
ITEM_SHALLOW_COPY():
  Item_join_operator_plus, Item_null_result, Item_old_field, Item_datetime,
  Item_empty_string, Item_return_int, Item_trigger_type_of_statement,
  in_string::Item_string_for_in_vector, Item_is_not_null_test,
  Item_interval_DDhhmmssff_typecast, Item_string_xml_non_const,
  Item_func_trt_trx_sees_eq, Item_field_refcursor (type_cursor plugin),
  Item_field_packable_scalar (type_assoc_array plugin).

These two classes do not support copying so the patch makes their
shallow_copy() to return NULL:
  Item_cache_wrapper, Item_sum_sp

Item_field_packable_row::shallow_copy() has assert(0). The patch makes
it return NULL.

This commit was prepared with help of Claude Code (Opus 5).
Sergei Petrunia added "delete item_copy" and did other minor edits.
Sergei Golubchik
fixup! gis-precise
Anway Durge
MDEV-41167 Wrong result (missing row) with LIMIT 1 on INFORMATION_SCHEMA.TABLES

Stop the I_S.TABLES fast path after a matching row is sent, not after
the first scanned table. Honour LIMIT / @@sql_select_limit via
plan->max_rows so filtered rows do not count.
Kristian Nielsen
mysqltest: Implement --enable_sync_gtid option

The --enable_sync_gtid option switches to use GTID-based
--sync_slave_with_master (eg. using MASTER_GTID_WAIT() instead of
MASTER_POS_WAIT()).

This is useful to run adapt existing test cases for use with
--binlog-storage-engine. But it is also useful in general for replication
using GTID (which is the default).

The option is off by default to not randomly break existing tests.

Signed-off-by: Kristian Nielsen <[email protected]>
Oleksandr Byelkin
make compiler happy
Anway Durge
MDEV-31342: Optimize INFORMATION_SCHEMA.TABLES queries to skip temp table writes

For simple single-schema SELECT queries on information_schema.tables,
bypass ha_write_tmp_row() and stream rows directly via the protocol.
Add EXPLAIN is_fast_path visibility and MTR coverage, including Windows
EXPLAIN casing normalization.
Oleksandr Byelkin
Merge branch 'bb-13.1-release' into bb-13.2-release
Anway Durge
MDEV-41204 --cursor-protocol on INFORMATION_SCHEMA.TABLES

Document that the I_S.TABLES fast path is disabled for cursor protocol
so MTR --cursor-protocol does not report ER_UNKNOWN_ERROR.
Anway Durge
MDEV-41240 I_S.TABLES crash with TABLE_NAME and a subquery

Do not use the fast path when the query has a subquery. Evaluating
that predicate while get_all_tables() uses a temporary MEM_ROOT
freed the subquery JOIN before outer JOIN cleanup.
Vladislav Vaintroub
MDEV-41691 PROXY protocol v1 header parser is too lenient

Follow the specification: the line is at most 107 bytes including CRLF,
ends with CRLF (not a bare LF), and fields are separated by exactly one
space, with nothing trailing (except after UNKNOWN). Ports are decimal
numbers up to 65535, without signs or leading zeroes. Also reject NUL
bytes and unknown address families (these were accepted before).

test_proxy_header_limits() now checks that malformed headers are
rejected, and also avoid DNS name resolution.

Assisted-by: Claude:claude-sonnet-5-5
Dave Gosselin
MDEV-39173:  Use snprintf in the remaining sprintf calls

Convert all three calls to snprintf.  12.3 already has the same change
for slave.cc, made in merge commit 9f98f82b14a.

MDEV-39173 replaced sprintf with snprintf in 10.11 and removed the
pragma in violite.h that hid deprecation warnings.  Two calls in
slave.cc and one in mysqltest.cc were added after 10.11, so 11.4 was
out of date and produces sprintf deprecation warnings (at least on
macOS).

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
Kristian Nielsen
Fix safemalloc error in mysqltest --enable_sync_gtid

Signed-off-by: Kristian Nielsen <[email protected]>
Anway Durge
MDEV-41165 ANALYZE SELECT from INFORMATION_SCHEMA.TABLES

Add MTR coverage that ANALYZE SELECT uses the fallback path and does
not assert or send a double EOF.
Kristian Nielsen
Merge branch 'knielsen_log_event_read_validation_base_11.4' into 11.4
Anway Durge
MDEV-41171 SQL_SELECT_LIMIT and FOUND_ROWS() on the I_S.TABLES fast path

Set limit_found_rows from matching rows sent on the fast path so
FOUND_ROWS() matches the fallback path when SQL_CALC_FOUND_ROWS is
not used.
David Schilling
MDEV-41450 TOI DDL BF-aborts InnoDB purge, purge loops forever

Fix for MDEV-38218 changed MDL conflict handling to allow high priority
cluster threads to BF abort any conflicting MDL lock holder.
With this, the InnoDB purge coordinator became also potential target
for BF aborts.
However, InnoDB purge thread has no statement boundary and could never
reset THD::killed state, after the BF abort. Purge THDs are taken
from a pool of innodb_purge_threads_MAX THDs, so about 32 purge runs
later the killed THD coordinates purge again. From then on every
open_purge_table() for a table with an indexed virtual column fails,
and purge_sys_t::close_and_reopen() retries forever. Purge stops and
server shutdown hangs.

Separately, open_purge_table() allocates a TABLE_LIST on thd->mem_root
and the coordinator THD never freed its mem_root, so it grew with every
purge batch and every close_and_reopen() retry.

Fix:
- wsrep_handle_mdl_conflict(): when the granted thread is a
  SYSTEM_THREAD_GENERIC THD holding explicit MDL, make the BF requestor
  wait instead of aborting it. In practice this covers the InnoDB
  background threads (purge, statistics, FTS optimizer), which release
  their locks on their own. This restores the pre-MDEV-38218 behaviour
  for these threads only.
- open_purge_table(): open with MYSQL_OPEN_IGNORE_KILLED so that a stale
  kill flag cannot block purge.
- trx_purge_close_tables(): call reset_thd() instead of
  close_thread_tables() to free the coordinator's mem_root per batch.

This commit has a new mtr test galera.MDEV-41450

This work is based on pull request https://github.com/MariaDB/server/pull/5854
by David Schilling, which is now rebased to MariaDB 10.11 and extended to
have a mtr test.

Assisted-by: https://mariadb.org/governance/governance-ai-policy/
Kristian Nielsen
Merge branch 'knielsen_log_event_read_validation_base_11.8' into 11.8

Signed-off-by: Kristian Nielsen <[email protected]>
Kristian Nielsen
MDEV-41264: binlog-in-engine dump thread not stopping at server shutdown

The binlog-in-engine code for binlog dump thread didn't check
should_stop(info, true) to stop on KILL_SERVER when it reaches the end of
the current binlog. This caused the dump threads to hang indefinitely during
SHUTDOWN WAIT FOR ALL SLAVES, and thus the shutdown to hang as well.

Signed-off-by: Kristian Nielsen <[email protected]>
Oleksandr Byelkin
Merge branch '11.8' into 12.3
Oleksandr Byelkin
Merge branch 'bb-12.3-release' into bb-13.1-release
Kristian Nielsen
Merge branch 'knielsen_log_event_read_validation_base_13.1' into 13.1
Anway Durge
MDEV-41196 SQL_BUFFER_RESULT on INFORMATION_SCHEMA.TABLES

Add MTR coverage that SQL_BUFFER_RESULT uses the fallback path and
returns the actual column values.
Anway Durge
MDEV-41164 SELECT INTO OUTFILE from INFORMATION_SCHEMA.TABLES

Keep the I_S.TABLES fast path only for plain client SELECTs. Fall back
when the result must go through a file, ANALYZE, SQL_BUFFER_RESULT,
PROCEDURE ANALYSE(), or the cursor protocol.
Oleksandr Byelkin
Merge branch '10.11' into 11.4
Oleksandr Byelkin
Merge branch '12.3' into 13.1
Oleksandr Byelkin
Merge branch '11.4' into 11.8
Sergei Golubchik
fixup! gis-precise
Sergei Golubchik
connect win
Thirunarayanan Balathandayuthapani
MDEV-41667 InnoDB: Failing assertion: buf <= (byte*) original_upd_buff + buff_len

Problem:
=======
An UPDATE on an InnoDB table with several indexed virtual columns
could corrupt the heap in calc_row_difference() because the
write pointer went past the end of the update buffer.

ha_innobase::update_row() sized the buffer from the row length, the
maximum key length and fixed padding. That did not allow for the
extra packed values calc_row_difference() stores for indexed
virtual columns for both the new value and the old value.

Solution:
========
  When allocating the update buffer in ha_innobase::update_row(),
add pack_length() of every virtual column. The row length
already counts each virtual column once, so the buffer can now
hold both the new and old packed values. All virtual columns
are counted, not only the indexed ones, because the buffer
is reused and a column may become indexed after it is allocated.

Based on mysql/mysql-server@12655140610674db615547cdf86af1f7cbf563c1
Kristian Nielsen
Small docs update for binlog-in-engine

Signed-off-by: Kristian Nielsen <[email protected]>
Oleksandr Byelkin
MDEV-41566 Allow ROW_NUMBER as unquoted column name

MDEV-26611 made ROW_NUMBER an always-recognized keyword (for
GET DIAGNOSTICS / SIGNAL) and put it in the reserved keyword list,
so it could no longer be used as an unquoted identifier.

Make ROW_NUMBER_SYM a non-reserved keyword (keyword_sp_var_and_label,
like LAST_VALUE), so ROW_NUMBER() still parses only as the window
function.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Kristian Nielsen
MDEV-41045: Missing virtual columns in binlog break backwards compat for CDCs

Fix a regression for third-party readers of binlog events, where it was
expected that binlog_row_image=FULL would include also values of virtual
columns.

Virtual column values are not useful on the slave (as they will instead be
re-computed from the other column values), but such recomputation can be
difficult to do outside of the server source. It seems reasonable to allow
these column values to be present in the FULL format (even though they are
redundant), as the FULL format in any case usually contains redundant column
values.

Signed-off-by: Kristian Nielsen <[email protected]>