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
Sergei Golubchik
MDEV-35254 post-review fixes

* reduced PARSEC_ITERATIONS_MAX because PKCS5_PBKDF2_HMAC() takes
  a signed int
* instead of checking for '0'..'L' range (which includes punctuation,
  check for the valid result of base62_to_uchar()
* add a connection test with non-default parsec_iterations
* make parsec_iterations a normal command line option
* update C/C to allow larger number of iterations in the client parsec
Daniel Black
MDEV-40142 main.func_xxh fails under --view-protocol

Under --view-protocol, SET NAMES utf8mb4 isn't copied
to the connection the view protocol is running on. As
a result the SELECT statements, from which the view are
created, have string literals are interpreted as latin1.

Cast the string literals explicitly to utf8mb4 for
consistent results. Also rename the column on select
queries to ensure result name is compatible with latin1.

Reviewed-by: Yuchen Pei
Alexander Barkov
MDEV-37086 Service crashed on procedure call

sp_pcontext::retrieve_field_definitions() did not work correctly
in all combinations of mixed declarations of variables and cursors
with parameters.

Rewriting it in a 2-way merge style algorithm.
- The first tape is the array of variables in m_vars.
- The second tape is the children contexts in m_children,
  also containing variables and cursor parameters.
Vladislav Vaintroub
MDEV-39047 Impossible to create DB grant for long escaped DB name

Reject GRANT if the database name (or pattern) does not fit into the
mysql.db.Db column.

It was silently truncated previously.
While this does not fix users problem, at least it would complain at
"Incorrect database name" with the overlong name listed at GRANT time.
Dave Gosselin
MDEV-39914:  Crash in ST_SIMPLIFY used in an IN list

A geometry function writes its binary result into a buffer given by
the caller.  ST_SIMPLIFY did not set the charset of that buffer.  A
constant value in an IN list, though, is stored into the array that IN
builds for its comparisons, and that array has no charset.  Appending
the geometry then read an invalid charset and crashed the server.

Set the result buffer to the binary charset before writing the
geometry, matching what the other geometry functions already do.
Alexey (Holyfoot) Botchkov
MDEV-39654 No warning after CAST( AS xmltype).

Warning added.
Dave Gosselin
MDEV-40143: st_isvalid() does not clear NULL state between rows

The st_isvalid() function evaluates nullability on every row.  Previously,
it would preserve potentially stale null state between rows, so the first
row yielding a null result for st_isvalid() would propagate to the results
for the remaining rows.

Implementation-wise, this patch changes the Item_func_isvalid::val_int
method implementation to work like Item_func_validate::val_str in that it
assumes that the method will indicate a null result for the row unless
it returns a non-null result, at which point it clears the null_value flag.
PranavKTiwari
MDEV-40167: GTT created with the InnoDB incorrectly accept FULLTEXT/VECTOR indexes
Problem:
GLOBAL TEMPORARY tables were not subject to the same option/index restrictions as session TEMPORARY tables. Several InnoDB and server-layer checks tested only tmp_table(), so GLOBAL TEMPORARY tables could bypass validation for VECTOR/FULLTEXT indexes, DATA DIRECTORY, KEY_BLOCK_SIZE, and ROW_FORMAT=COMPRESSED.

Cause:
global_tmp_table() was added as a separate predicate from tmp_table(), but not all temp-table checks were updated to test both, so GLOBAL TEMPORARY tables fell through to "permanent table" logic in several places.

Fix:
Added global_tmp_table() alongside tmp_table() at each affected check:

Reject VECTOR and FULLTEXT indexes on GLOBAL TEMPORARY tables.
Reject/warn on DATA DIRECTORY, KEY_BLOCK_SIZE, and ROW_FORMAT=COMPRESSED for GLOBAL TEMPORARY tables, with accurate wording in the DATA DIRECTORY warning.
Fixed zip_allowed and related ut_ad assertions to exclude GLOBAL TEMPORARY tables.
Fixed m_use_file_per_table in set_tablespace_type() to exclude GLOBAL TEMPORARY tables (also fixes m_use_data_dir).
GLOBAL TEMPORARY tables now validate the same as session TEMPORARY tables across these options.
Alexey Yurchenko
MDEV-38147 error 1950 after mariabackup SST with gtid_strict_mode=ON

After a mariabackup SST the joiner could fail with

  ER_GTID_STRICT_OUT_OF_ORDER (error 1950)

while re-binlogging transactions received over IST.

The cause is that the binary log copied from the donor carries a
Gtid_list whose position can be ahead of the storage-engine snapshot:
BACKUP STAGE BLOCK_COMMIT blocks the engine commit (2PC step 3) but not
the binary log write (step 2), so transactions can be present in the
copied binlog that are not committed in the copied engine snapshot.
After the SST the joiner reports the (committed) engine position to the
cluster, IST resends those transactions, and re-binlogging them under
gtid_strict_mode=ON collides with the ahead Gtid_list -> error 1950.
(MDEV-34483 made the engine snapshot stop short of the binlog, which is
what exposed this.)

The copied binary log carries no transactions the joiner needs - only a
Gtid_list - so instead of shipping and then having to truncate/reconcile
it, the joiner now starts a fresh binary log and seeds its GTID position
from the storage-engine checkpoint during recovery. That checkpoint is
the committed cluster position, i.e. exactly where IST resumes, so the
joiner's binary log stays in lockstep with the rest of the cluster and
no out-of-order GTID can occur.

This works for both wsrep_gtid_mode settings; only the binlog domain of
the cluster stream differs:

  - wsrep_gtid_mode=ON : wsrep_gtid_domain_id (cluster writes are
    re-tagged to it), which is the domain stored in the checkpoint;
  - wsrep_gtid_mode=OFF: gtid_domain_id (cluster writes keep the node's
    configured domain).

Async-replica positions (mysql.gtid_slave_pos) are part of the engine
snapshot and survive the SST unchanged, so a Galera node can still serve
as an async master or replica across the SST.

This commit:
- sql/log.cc: adds wsrep_seed_binlog_gtid_state(), called from
  do_binlog_recovery() when the joiner has no binary log, seeding the
  binlog GTID state for the cluster domain to the SE checkpoint position.
- scripts/wsrep_sst_mariabackup.sh: no longer moves the donor's binary
  log into place on the joiner.
- extra/mariabackup: backward compatibility: keep shipping binlog file
  in SST but
  - on donor fix the race between rotation and shipping so that the file
    shipped is the one that had been rotated;
  - on joiner discard shipped binlog in favour of one generated by
    wsrep_seed_binlog_gtid_state().
- sql/wsrep_sst.cc: logs the position actually adopted from storage
  (the authoritative post-SST position) rather than the script-reported
  one.
- sql/handler.cc: downgrades the "Discovered discontinuity in recovered
  wsrep transaction XIDs" message in wsrep_order_and_check_continuity()
  from warning to debug level. With parallel appliers a snapshot
  routinely captures prepared XIDs that are not contiguous with the
  engine checkpoint, so this is normal during SST recovery and of no
  value in regular operation; the transactions past the checkpoint are
  re-delivered by the cluster (IST/SST) regardless.
- Adds an MDEV-38147 MTR test reproducing the issue.

Co-Authored-By: Claude Opus 4.8 <[email protected]>
Vladislav Vaintroub
MDEV-40242 Fix Infer NULLPTR_DEREFERENCE reports in tests

Infer flagged several test/unittest sites that dereference the result of
an allocation (or an allocating helper) without checking it for NULL:

- tests/async_queries.c: fatal() calls exit() but was not marked
  noreturn, so Infer assumed add_query() continued past the
  "if (!e || !q2) fatal(...)" guard. Mark fatal() ATTRIBUTE_NORETURN.
- tests/mysql_client_test.c: add the usual check_stmt() after
  mysql_stmt_init() in test_bug16143, test_bug16144 and test_bug38486.
- unittest/json_lib/json_normalize-t.c: check init_dynamic_string().
- unittest/mysys/bitmap-t.c: check my_bitmap_init().
- unittest/mysys/ma_dyncol-t.c: check the val/upd/res malloc()s.
- unittest/mysys/thr_template.c: replace assert(threads) (compiled out
  under NDEBUG) with an unconditional check.
- unittest/sql/mf_iocache-t.cc: check the buf/buf_i/buf_o malloc()s.

Test-only changes; on allocation failure the tests now abort cleanly
via BAIL_OUT() instead of dereferencing NULL.
Thirunarayanan Balathandayuthapani
MDEV-27569  Valgrind/MSAN errors in ha_partition::swap_blobs() for BLOB not in secondary index

Problem:
=======
On a partitioned table containing a BLOB/TEXT column, an ordered
index scan calls ha_partition::swap_blobs() for every buffered
row, because it is being called only when table has blob fields.

When the buffered row comes from a secondary index that does not
cover the blob (e.g. KEY(f2) on (f2,f1)), InnoDB's
row_sel_store_mysql_rec() populates only the templated columns.
The blob column's null bit and its value-pointer bytes in
table->record[0] are left uninitialized. The partition handler
memcpy() this record into rec_buf, then swap_blobs() evaluates
blob->is_null(), reading the uninitialized null bit leads to
"use-of-uninitialized-value".

Solution:
=========
row_sel_store_mysql_rec(): When the record is being stored
from a secondary index, seed the NULL bitmap of mysql_rec
from prebuilt->default_rec before populating the templated columns.
Columns present in the index template have their NULL bit rewritten
explicitly while the row is stored, so only the columns absent from
the template (the uncovered blob) rely on this seed.
default_rec marks such nullable columns as NULL and preserves the
reserved NULL bit, so the uncovered blob is now defined as NULL.

Because of this, ha_partition::swap_blobs() skips it via its
"!bitmap_is_set(read_set) || blob->is_null()" guard and
never calls Field_blob::cached()/get_ptr(). This avoids not
only the uninitialized null-bit read and the follow-on
uninitialized blob value-pointer read.
Kristian Nielsen
MDEV-40057: Virtual column included in after-image with unique BLOB index, asserts

Do not put any virtual column values into the before-image or after-image of
row events.

These virtual column values were causing assertion and probably other issues
as well. Concretely, a UNIQUE index on (int_col, blob_col) where the int_col
is being updated would include the hidden virtual column for the index in
the after-image, without including the value of the blob_col in
binlog_row_image=MINIMAL. This would cause an assertion during
TABLE::update_virtual_fields() due to missing bit in the bitmap.

Even if it doesn't cause an assertion, including the virtual column values
makes no sense, as they are recomputed anyway on the slave when applying the
row events.

Reviewed-by: Monty <[email protected]>
Brandon Nesterenko <[email protected]>
Signed-off-by: Kristian Nielsen <[email protected]>
sjaakola
MDEV-39681 delayed BF aborting with multi master load

Reason for the hanging, and occasional crashes turned out
to be orphaned innodb lock wait request of a BF aborted
local transaction, which had arrived in commit stage.

Reason is that wsrep BF-abort marks a transaction a deadlock
victim out-of-band, so (unlike native deadlock resolution)
the victim can still own a live LOCK_WAIT request;
if that orphaned waiter survives into commit/rollback,
another transaction granting it calls lock_wait_end() cross-thread
and corrupts the victim's state — surfacing as the lock_wait_end,
que_thr_step, and rollback_finish assertions.

This commit has fixes for claering lock wait status of BF aborted
transactions.

Commit has also a new mtr test: galera.galera_bf_abort_orphan_lock
to work as regression test for the fix.
forkfun
MDEV-39380 Assertion `arg2_int >= 0' failed in Item_func_additive_op::result_precision

A 0xHHHH / b'..' literal keeps its hex_hybrid type through COALESCE/IF/CASE/...,
but was evaluated, sized and stored as a string, so it behaved differently from
a bare literal (10+COALESCE(0x31) gave 11, not 59).

Type_handler_hex_hybrid now implements the numeric side to match the bare
literal: val_int/val_real/val_decimal read bytes as a hybrid, Item_decimal_precision
returns the integer precision, Item_save_in_field stores like the bare literal.
The traditional type merge keeps the hybrid through a typeless NULL (as for BIT),
and Item_hybrid_func_fix_attributes attributes it binary/unsigned.
Vladislav Vaintroub
MDEV-33480 Windows MSI installer, convert from WIX v3 to supported versions

Support both modern WiX (wix.exe, v5/v6) and legacy v3.x toolsets.
WXS sources stay in v3 format, the modern toolset builds them after
on-the-fly 'wix convert'. Modern WiX is preferred when installed,
use WITH_WIX3=1 to force legacy.
Rex
MDEV-35565 Server crashes simplifying group by <subquery>

During optimization, we may call update_depend_map_for_order()
on a group by list containing an expression with an outer reference.
The table map for this outer reference will be collected by
Item_subselect::recalc_used_tables and used to return a depend_map.
This map will indicate the presence of tables not in this select and
can cause erroneous results, poor execution plans or crashes.
We update the class used to collect these bitmaps to check whether the
containing select_lex is applicable, and if not, set the OUTER_REF_TABLE_BIT
bit in the table map.

Approved-by: Dave Gosselin ([email protected])
Raghunandan Bhat
MDEV-39744: Assertion `buf != end` failed in `decimal_mul`

Problem:
  With `div_precision_increment=0`, a division whose quotient rounds
  away to zero (e.g. -299/450) produced a decimal with no digit words
  (intg=0 and frac=0) while still keeping the sign bit set. That is a
  malformed value.

  Multiplying such a malformed zero value by another zero reached the
  negative-zero check in `decimal_mul`, where there were no digit words
  to scan, leading to assertion failure.

Fix:
  Fix `do_div_mod`, which produced the malformed zero. `do_div_mod`
  already normalizes this case to a canonical zero on the modulo path;
  do the same on the division path: when the quotient has no digits
  (intg0 = 0 && frac0 = 0) return a correct decimal zero instead of a
  digit-less, signed value.
Aleksey Midenkov
MDEV-38839 table_list->updating flag comment
Kristian Nielsen
MDEV-40057: Virtual column included in after-image with unique BLOB index, asserts

Do not put any virtual column values into the before-image or after-image of
row events.

These virtual column values were causing assertion and probably other issues
as well. Concretely, a UNIQUE index on (int_col, blob_col) where the int_col
is being updated would include the hidden virtual column for the index in
the after-image, without including the value of the blob_col in
binlog_row_image=MINIMAL. This would cause an assertion during
TABLE::update_virtual_fields() due to missing bit in the bitmap.

Even if it doesn't cause an assertion, including the virtual column values
makes no sense, as they are recomputed anyway on the slave when applying the
row events.

Reviewed-by: Monty <[email protected]>
Brandon Nesterenko <[email protected]>
Signed-off-by: Kristian Nielsen <[email protected]>
Alexander Barkov
MDEV-37086 Service crashed on procedure call

sp_pcontext::retrieve_field_definitions() did not work correctly
in all combinations of mixed declarations of variables and cursors
with parameters.

Rewriting it in a 2-way merge style algorithm.
- The first tape is the array of variables in m_vars.
- The second tape is the children contexts in m_children,
  also containing variables and cursor parameters.
Vladislav Vaintroub
MDEV-40214 Suppress false-positive Infer MEMORY_LEAK_C in mysql_client_test.c

The MEMORY_LEAK_C reports in this file are false positives. Real leaks are
reported by ASAN, which we run regularly. Suppress the leak checker for the
file with the documented @infer-ignore-every directive.
Dearsh Oberoi
MDEV-35254 Make iterations count configurable in PARSEC plugin

This patch adds a global and session level plugin variable
parsec_iterations to define the number of iterations to be
used when generating the key corresponding to the password.
It has a default value, lower and upper bounds.
Vladislav Vaintroub
MDEV-33480 Windows MSI installer, convert from WIX v3 to supported versions

Custom actions : get rid of wcautil and dutil library dependencies
They are not an official part of WiX distribution anymore.

Replace the functionality with native MSI api, the Wix helpers
we used were thin wrappers anyway.

Also replace the VBScript FakeFailure custom action with a native
one, VBScript is deprecated in Windows and scheduled for removal.
Aleksey Midenkov
MDEV-38839 table_list->updating flag comment
Vladislav Vaintroub
Add Windows x64 CI: build with ninja, test MSI install/uninstall, run MTR
Rex
MDEV-35565 Server crashes simplifying group by <subquery>

During optimization, we may call update_depend_map_for_order()
on a group by list containing an expression with an outer reference.
The table map for this outer reference will be collected by
Item_subselect::recalc_used_tables and used to return a depend_map.
This map will indicate the presence of tables not in this select and
can cause erroneous results, poor execution plans or crashes.
We update the class used to collect these bitmaps to check whether the
containing select_lex is applicable, and if not, set the OUTER_REF_TABLE_BIT
bit in the table map.

Approved-by: Dave Gosselin ([email protected])
Alexey Yurchenko
MDEV-40179 Found N prepared transactions after mariabackup SST

With log_bin=ON a transaction is committed via two-phase commit (the
binary log is the second participant), so it passes through the InnoDB
XA-prepare state. While a donor is held in BLOCK_COMMIT for a mariabackup
backup, its parallel appliers (wsrep_slave_threads > 1) leave one or more
such writesets prepared-but-not-yet-committed, and the snapshot captures
them. On a freshly SST'd joiner nothing resolves these prepared
transactions: binlog crash recovery does not run (the joiner has no in-use
binlog to recover from), and the wsrep continuity-based commit is inactive
because wsrep_emulate_bin_log is FALSE when log_bin is ON. The leftover
prepared transactions then abort startup with "Found <N> prepared
transactions!". Note this does not depend on the prepared set being
non-contiguous - even a contiguous run aborts, because nothing commits
or rolls it back.

Rollback these transactions in xarecover_handlerton().

Co-Authored-By: Claude Opus 4.8 <[email protected]>
Dave Gosselin
MDEV-39914:  Crash in ST_SIMPLIFY used in an IN list

A geometry function writes its binary result into a buffer given by
the caller.  ST_SIMPLIFY did not set the charset of that buffer.  A
constant value in an IN list, though, is stored into the array that IN
builds for its comparisons, and that array has no charset.  Appending
the geometry then read an invalid charset and crashed the server.

Set the result buffer to the binary charset before writing the
geometry, matching what the other geometry functions already do.
Dearsh Oberoi
MDEV-35254 refactor: Make my_bit.h an independent header

Removed type aliases and macros defined in my_global.h from my_bit.h,
making it possible to include it in plugins or external code without
pulling in my_global.h
Vladislav Vaintroub
MDEV-40243 Fix Infer MEMORY_LEAK_C leaks in mysqldump/mysqlshow

Infer reported MEMORY_LEAK_C at several client sites. Fix the genuine leaks:

client/mysqldump.c (dump_events_for_db): event_list_res (and, on the inner
paths, event_res) were leaked on the error DBUG_RETURN(1) paths
(switch_character_set_results, SHOW CREATE EVENT failure, create_delimiter,
switch_db_collation, restore_db_collation). Route those paths through a
single "err:" cleanup label that frees both results (event_res is kept NULL
outside the inner loop so the shared cleanup is safe) and also restores the
session state (results charset, and UNLOCK TABLES when locking) like the
normal exit does.

client/mysqlshow.c (list_fields): when --keys is given, the columns result
set was overwritten by the "show keys" result without being freed. Free it
before running the keys query, and NULL the pointer so it cannot dangle if
that query fails.

The client/mysqltest.cc reports are false positives (do_save_master_pos only
leaves the result unfreed right before a noreturn die(); read_stmt_results
frees on every path), so no change is needed there.
Teemu Ollakka
Merge branch '10.11' into 10.11-MDEV-38389
Dearsh Oberoi
MDEV-35254 Add get_current_thd() service function
Thirunarayanan Balathandayuthapani
MDEV-40085  TRUNCATE of temporary table with ENCRYPTED=NO crashes under innodb_encrypt_tables=FORCE

Problem:
=========
ha_innobase::truncate() recreates the table by calling
ha_innobase::create(). create_table_info_t::check_table_options()
rejects ENCRYPTED=NO when innodb_encrypt_tables=FORCE, which is the
rule that forbids creating a new unencrypted table under FORCE.

TRUNCATE therefore failed in create(). For a temporary table,
truncate() frees m_prebuilt before calling create(). If the create()
fails and left m_prebuilt=nullptr and a subsequent
ha_innobase::reset()/update_thd() dereferenced it.

Solution:
========
check_table_options(): skip the innodb_encrypt_tables=FORCE check on
the internal recreate path (indicated by a non-null m_trx,
which is set only during truncate()). This applies to non-temporary
table also.

ha_innobase::truncate(): validate the create options before dropping
the existing table. Any genuine validation failure
(missing encryption key, unsupported option combination etc)
now returns an error with the original table and m_prebuilt
left intact, instead of dropping the table and then
failing in create()
Vladislav Vaintroub
Merge branch '10.11' into MDEV-34074
Vladislav Vaintroub
MDEV-34074 server_audit crashes in get_loc_info() with NULL loc_info

THDVAR(thd, loc_info) can return NULL if the plugin was previously
uninstalled. get_loc_info() and its callers dereferenced it.

Guard against a NULL loc_info in get_loc_info(), auditing() and
log_current_query(). Such a session is not audited.
Pekka Lampio
MDEV-38389: Galera test failure on galera_3nodes.galera_vote_majority_dml

Fix the broken Galera MTR test galera_3nodes.galera_vote_majority_dml
by restoring the value of the AUTO_INCREMENT_OFFSET at the end of the
test.

Fix also two additional, platform-dependent failure modes were observed on
buildbot (aarch64-debian-12) that did not reproduce locally:

1) The test failed with "Found warnings/errors in server log file"
  on nodes 1 and 2:

    WSREP: Event 3 Write_rows_v1 apply failed: 1, seqno 5

  The mtr suppression only matched apply error code 3, but the
  apply-event return code (exec_res in wsrep_applier.cc) varies by
  platform and timing. Widen the suppression to match any error
  code with "apply failed: .*, seqno".

2) The test failed at:

    ALTER TABLE t1 MODIFY f2 LONGTEXT: ER_NO_SUCH_TABLE

  node_3 turned wsrep_on off and issued the ALTER before the
  CREATE TABLE from node_1 had been applied on node_3. Because
  wsrep_on was already off, no causality wait applied and the ALTER
  raced ahead of replication. Wait for t1 to exist on node_3 (while
  wsrep is still on) before disabling wsrep and altering the table.
Rex
MDEV-35565 Server crashes simplifying group by <subquery>

During optimization, we may call update_depend_map_for_order()
on a group by list containing an expression with an outer reference.
The table map for this outer reference will be collected by
Item_subselect::recalc_used_tables and used to return a depend_map.
This map will indicate the presence of tables not in this select and
can cause erroneous results, poor execution plans or crashes.
We update the class used to collect these bitmaps to check whether the
containing select_lex is applicable, and if not, set the OUTER_REF_TABLE_BIT
bit in the table map.

Approved-by: Dave Gosselin ([email protected])