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
Rucha Deodhar
MDEV-33843: Server crashes by stack-overflow with UPDATEXML

Analysis:
The stack size if insufficient and there is no stack overrun check.

Fix:
Add stack overrun check.
ParadoxV5
MDEV-39240 10.6-11.4 Replication Allows Full Range for 32-bit Unsigned Timestamps

Row-based Replication did not validate serialized timestamps,
which allows (pre-11.5) slaves to accept “negative” timestamps
(between the Year 2038 limit and the 4-byte limit) via replication.
In particular, a completely valid source of those timestamps is 11.5.1+
masters, where MDEV-32188 has increased the upper limit of
timestamps to Year 2106 by utilizing this previously invalid range.

This commit fills in this pre-processing:
swap the Year 2106 max with the Year 2038 max,
or throw an “Incorrect timestamp value” error for the others.

Reviewed-by: Brandon Nesterenko <[email protected]>
Oleg Smirnov
MDEV-32868 Cleanup (no change of logic)

Switch branches of the `if` condition to make the code
flow more naturally.
Aleksey Midenkov
MDEV-27569 Followup fix
Mohammad El-Shennawy
MDEV-31669: replace MD5 with XXH3_128bits for SQL digests

- XXH is significantly faster than both MD5 and SHA-256
- Here we use the 128-bit XXH3
- Keep DIGEST_HASH_SIZE at 16 bytes (same as MD5)
- Reduce COL_DIGEST_SIZE to 32 chars
- Keep DIGEST columns as VARCHAR(32)
Sergei Golubchik
MDEV-39141 MariaDB crashes in THD::THD() due to misalignment

fix my_malloc() to return 16-aligned pointers

(type_assoc_array.sp-assoc-array-64bit prints changes in memory_used,
and my_malloc() wastes less memory now)
rusher
[misc] update CI
Raghunandan Bhat
MDEV-39118: `test_if_hard_path` crashes on recursively resolving `$HOME`

Problem:
  When `$HOME` is set to `~/` (or any string starting with `~/`), the
  `home_dir` is initialized to that value. When `test_if_hard_path` is
  called on a path starting with `~/`, it replaces the `~/` prefix by
  recursively calling `test_if_hard_path(home_dir)` leading to infinite
  recursion and a crash.

Fix:
  Add a check in `test_if_hard_path` to see if `home_dir` itself begins
  with `~/`. If it does, skip the recursive call to prevent the
  infinite loop.
rusher
[misc] add maxscale testing
rusher
[misc] add maxscale testing
Aleksey Midenkov
MDEV-38798 followup cleanup for MDL_NOT_INITIALIZED

As C++ style initialization of TABLE_LIST now works correctly after
Byte_zero refactoring. We may remove MDL_NOT_INITIALIZED double
initialiation.
HNOONa-0
MDEV-35369: Refactor Yes_or_empty to Yes_or_no

- Rename Yes_or_empty to Yes_or_no, returning YES/NO instead of Yes/"".
- Globally replace store_yesno() with Yes_or_no::value().
- Preserve legacy output ("Yes"/"") in I_S.COLLATIONS and
  I_S.COLLATION_CHARACTER_SET_APPLICABILITY for backward compatibility.
- Assign CYCLE_OPTION variable "Yes"/"No" values
Sergei Petrunia
MDEV-38072 Optimizer choosing the wrong plan

(Variant 3, more comments)
When multiple indexes produce ordering that matches the
ORDER BY ... LIMIT clause, like

  INDEX idx1(kp1, kp2)
  INDEX idx2(kp2)
and the query with
  WHERE kp1=const ORDER BY kp2 LIMIT 2

then test_if_cheaper_ordering() in pre-11.0 versions will choose
the index with the smallest KEY::user_defined_key_parts (idx2 in
this example). This can produce a much worse query plan.

The fix is to do what MariaDB 11.0 would do: use the index for which
we have the cheapest access method. The cost of access method here
takes into account that we will stop after producing #LIMIT rows.

The fix is controlled by the
  @@optimizer_adjust_secondary_key_costs=fix_order_by_index_choice
flag and is OFF by default.
Sergei Golubchik
cleanup: change sql_command_flags from uint to cf_flags_t

introduce a dedicated enum type for sql_command_flags
to simplify debugging:

(gdb) p sql_command_flags[SQLCOM_SELECT]
$2 = (CF_REEXECUTION_FRAGILE | CF_CAN_GENERATE_ROW_EVENTS | CF_PREOPEN_TMP_TABLES | CF_CAN_BE_EXPLAINED | CF_OPTIMIZER_TRACE)
Aleksey Midenkov
MDEV-38798 followup cleanup for MDL_NOT_INITIALIZED

As C++ style initialization of TABLE_LIST now works correctly after
Byte_zero refactoring. We may remove MDL_NOT_INITIALIZED double
initialiation.
Aleksey Midenkov
Potential fix for pull request finding

Co-authored-by: Copilot Autofix powered by AI <[email protected]>
Rucha Deodhar
MDEV-33843: Server crashes by stack-overflow with UPDATEXML

Analysis:
The stack size if insufficient and there is no stack overrun check.

Fix:
Add stack overrun check.
Thirunarayanan Balathandayuthapani
MDEV-39261 MariaDB crash on startup in presence of indexed virtual columns

Problem:
========
A single InnoDB purge worker thread can process undo logs from different
tables within the same batch. But get_purge_table(), open_purge_table()
incorrectly assumes that a 1:1 relationship between a purge worker thread
and a table within a single batch. Based on this wrong assumtion,
InnoDB attempts to reuse TABLE objects cached in thd->open_tables for
virtual column computation.

1) Purge worker opens Table A and caches the TABLE pointer in thd->open_tables.
2) Same purge worker moves to Table B in the same batch, get_purge_table()
retrieves the cached pointer for Table A instead of opening Table B.
3) Because innobase::open() is ignored for Table B, the virtual column
template is never initialized.
4) virtual column computation for Table B aborts the server

Solution:
========
- Introduced purge_table class which has the following
purge_table: Stores either TABLE* (for tables with indexed virtual
columns) or MDL_ticket* (for tables without) in a single union
using LSB as a flag.
For tables with indexed virtual columns: opens TABLE*, accesses
MDL_ticket* via TABLE->mdl_ticket
For tables without indexed virtual columns: stores only MDL_ticket*.

trx_purge_attach_undo_recs(): Coordinator opens both dict_table_t*
and TABLE* with proper MDL protection. Workers access cached
table pointers from purge_node_t->tables without opening
their own handles

purge_sys.coordinator_thd: Distinguish coordinator from workers
in cleanup logic. Skip innobase_reset_background_thd() for
coordinator thread to prevent premature table closure during
batch processing. Workers still call cleanup to release their
thread-local resources

trx_purge_close_tables():
Rewrite for purge coordinator thread
1) Close all dict_table_t* objects first
2) Call close_thread_tables() once for all TABLE* objects
3) Release MDL tickets last, after tables are closed

Added table->lock_mutex protection when reading (or) writing
vc_templ->mysql_table and mysql_table_query_id. Clear cached
TABLE* pointers before closing tables to prevent stale pointer
access

Declared open_purge_table() and close_thread_tables() in trx0purge.cc
Declared reset_thd() in row0purge.cc and dict0stats_bg.cc.
Removed innobase_reset_background_thd()
Aleksey Midenkov
MDEV-38798 followup cleanup for MDL_NOT_INITIALIZED

As C++ style initialization of TABLE_LIST now works correctly after
Byte_zero refactoring. We may remove MDL_NOT_INITIALIZED double
initialiation.
Aleksey Midenkov
MDEV-38798 followup TABLE_LIST C++-friendly initialization refactoring

The problem with the current initialization is that TABLE_LIST ctors
as will as init_one_table*() functions call reset() that byte-zeroes
the object after encapsulated objects were initialized by their
constructors. That specifically creates the wrong value for
mdl_request.type which must be MDL_NOT_INITIALIZED (-1) by default and
bzero() reverts it to MDL_INTENTION_EXCLUSIVE (0). And these constant
values is not easy (if not possible) to change.

The fix introduces utility base class Byte_zero which moves bzero()
call before the encapsulated ctors (as parent classes' ctors are
called first). So now encapsulated ctors are not called redundantly
and no double initialization is needed.

All the C++-constructed objects call init_one_table*() as before, only
without reset(). The C-alloced objects call init_one_tab*_r() versions
that call reset(). These will be replaced back to no-reset() versions
after their allocation is refactored to C++ version.
ParadoxV5
Fix `$target_temp_format` in `rpl.rpl_typeconv`

The MTR snippet `suite/rpl/include/check_type.inc`
was setting `@@GLOBAL.mysql56_temporal_format` with the wrong variable.
ParadoxV5
MDEV-38600: Annotate the binlogging of recreating MEMORY tables

The data in MEMORY tables is temporary and is lost when the server
restarts. Thus, it is well-intentioned to record TRUNCATE statements
to the binary log when these tables are rediscovered empty. However,
as entries with no explicit user query associated (especially the lack
of SHUTDOWN on crashes), those unaware of this mechanism can find them
unexpected, not to mention their significance downstream in replication.

This commit adds a comment to these automatically generated
TRUNCATE entries to briefly self-describe their source and purpose.
As a part of the generated query, this comment is visible together
with the TRUNCATE itself in SHOW BINLOG EVENTS and `mariadb-binlog`,
while maintaining seamlessness in replication.

There are no other changes in behaviour or storage engine API.

Reviewed-by: Andrei Elkin <[email protected]>
Daniel Black
MDEV-30953: Add MariaDB-server-galera (RPM) fix

The wsrep SST scripts weren't part of the server-galera
component so CPack didn't put them in the MariaDB-server-galera
package.

The previous existing per file component wasn't used so this
was simplified.
Aleksey Midenkov
MDEV-38798 followup TABLE_LIST C++-friendly initialization refactoring

The problem with the current initialization is that TABLE_LIST ctors
as will as init_one_table*() functions call reset() that byte-zeroes
the object after encapsulated objects were initialized by their
constructors. That specifically creates the wrong value for
mdl_request.type which must be MDL_NOT_INITIALIZED (-1) by default and
bzero() reverts it to MDL_INTENTION_EXCLUSIVE (0). And these constant
values is not easy (if not possible) to change.

The fix introduces utility base class Byte_zero which moves bzero()
call before the encapsulated ctors (as parent classes' ctors are
called first). So now encapsulated ctors are not called redundantly
and no double initialization is needed.

All the C++-constructed objects call init_one_table*() as before, only
without reset(). The C-alloced objects call init_one_tab*_r() versions
that call reset(). These will be replaced back to no-reset() versions
after their allocation is refactored to C++ version.
Michael Widenius
MDEV-32745 Add a simple MySQL to MariaDB upgrade helper

The tool is named mariadb-migrate-config-file.
The main purpose of the tool is to change MySQL option
files to work both for MySQL and MariaDB.
There are options to do the changes in the options file inline,
or at-end-of-file. One can also remove or comment unknown options.

The list of supported options is generated compile time from
mariadbd --help. All server options, including compiled plugins, are
supported.

The bulk of the code comes from Väinö.
Monty has updated it with a lot of extra options.
Wlad helped with cmake integration

Other things:
- Fixed a memory leak in sql_plugin.cc
- plugin-load will now in case of errors try to load all given plugins
  before aborted
- If silent-startup is used, plugin-load will not give errors for
  plugins it cannot load or warnings about plugin marturity level.
- my_rm_tree() will now delete symlinks, not the actual file, if
  MY_NOSYMLINK flag is used.
- my_stat() will now give data for symlink if MY_NOSYMLINKS is used.
- Added 'number of lines' option to mysqltest --cat_file

@Authors: Väinö Mäkelä <[email protected]>,[email protected]
Aleksey Midenkov
MDEV-36362 MariaDB crashes when parsing fuzzer generated PARTITION

Function calls in INTERVAL expression of DDL have little
sense. SETVAL() fails because sequences require opened tables and
vers_set_interval() is called at earlier stage.

The fix throws ER_SUBQUERIES_NOT_SUPPORTED for sequence functions
SETVAL(), NEXTVAL(), LASTVAL() when the context does not allow
subselect (determined by clause_that_disallows_subselect).
ParadoxV5
Fix `$target_temp_format` in `rpl.rpl_typeconv`

The MTR snippet `suite/rpl/include/check_type.inc`
was setting `@@GLOBAL.mysql56_temporal_format` with the wrong variable.
Rex Johnston
MDEV-38347 Debugging functions

Extend current dbug_print* functions in such a way as to facilitate easy
high level debugging.  Introduce a single overloaded print function
defined in dbp.h, DBUG_PRINT_FUNCTION, settable to your preference.
Allow a shell environment variable DBUG_PRINT_FUNCTION to override
this definition.
Sergei Golubchik
MDEV-38806 Non-debug assertion failure in btr_pcur_t::restore_position upon HANDLER operations

amend the fix from MDEV-37832 to restore old locking behavior for HANDLER,
even if it's not an "updating" command.

Also let's do the same for CHECKSUM/ANALYZE. There is CHECKSUM and
ANALYZE specific code inside that if(), it should be either restored
to work or removed there's no reason to leave dead code there.
I prefer to be conservative here and restore it to work.
Sergei Golubchik
correct sql_command_flags: add CF_CHANGES_DATA as needed

SQLCOM_REVOKE_ALL needs it because SQLCOM_REVOKE does.
SQLCOM_DROP_ROLE needs it because SQLCOM_DROP_USER does.
SQLCOM_CREATE_SERVER / SQLCOM_ALTER_SERVER / SQLCOM_DROP_SERVER
need it because SQLCOM_CREATE_USER / etc do.
Sergei Petrunia
MDEV-38072 Optimizer choosing the wrong plan

(Variant 3, more comments)
When multiple indexes produce ordering that matches the
ORDER BY ... LIMIT clause, like

  INDEX idx1(kp1, kp2)
  INDEX idx2(kp2)
and the query with
  WHERE kp1=const ORDER BY kp2 LIMIT 2

then test_if_cheaper_ordering() in pre-11.0 versions will choose
the index with the smallest KEY::user_defined_key_parts (idx2 in
this example). This can produce a much worse query plan.

The fix is to do what MariaDB 11.0 would do: use the index for which
we have the cheapest access method. The cost of access method here
takes into account that we will stop after producing #LIMIT rows.

The fix is controlled by the
  @@optimizer_adjust_secondary_key_costs=fix_order_by_index_choice
flag and is OFF by default.
Raghunandan Bhat
MDEV-35717: UBSAN: runtime error: applying zero offset to null pointer in `my_strnncoll_utf8mb3_general1400_as_ci`

Problem:
  UBSAN reports runtime errors in string comparision functions when
  pointer arithmetic is done without checking NULL.

Fix:
  - Add debug asserts in `strnncoll` function to catch NULL pointers.
  - Define a new function `streq_safe` as a replacement for `streq`,
    capable of handling NULL pointers. Replace `streq` with `streq_safe`
    at multiple call sites, identified by the debug asserts.
  - Add empty identifier checks in `is_infoschema_db` and
    `is_perfschema_db` before calling the deep character-set based
    comparision.
rusher
[misc] update CI
HNOONa-0
MDEV-35369: Add IS_DEPRECATED to SYSTEM_VARIABLES

- Add IS_DEPRECATED and DEPRECATION_REPLACEMENT columns to the
  SYSTEM_VARIABLES information schema table
- Add a mysql-test case to verify the new columns output correctly
ParadoxV5
MDEV-39190 mariadb-dump --dump-slave outputs partial output for old servers

When dumping from older servers, the MDEV-37146 optimization was
clever to reuse the SHOW ALL SLAVES STATUS from an earlier step.
But it forgot to rewind the tape before playing again,
so it only saw a blank screen.
It also left an extra “SHOW ALL SLAVES STATUS” text in dead code.

This commit fixes both of these oversights.
Aleksey Midenkov
MDEV-38798 followup TABLE_LIST C++-friendly initialization refactoring

The problem with the current initialization is that TABLE_LIST ctors
as well as init_one_table*() functions call reset() that byte-zeroes
the object after encapsulated objects were initialized by their
constructors. That specifically creates the wrong value for
mdl_request.type which must be MDL_NOT_INITIALIZED (-1) by default and
bzero() reverts it to MDL_INTENTION_EXCLUSIVE (0). And these constant
values is not easy (if not possible) to change.

The fix introduces utility base class Byte_zero which moves bzero()
call before the encapsulated ctors (as parent classes' ctors are
called first). So now encapsulated ctors are not called redundantly
and no double initialization is needed.

All the C++-constructed objects call init_one_table*() as before, only
without reset(). The C-alloced objects call init_one_tab*_r() versions
that call reset(). These will be replaced back to no-reset() versions
after their allocation is refactored to C++ version.
Oleg Smirnov
MDEV-32868 SELECT NULL,NULL IN (SUBQUERY) returns 0 instead of NULL

When evaluating (SELECT NULL, NULL) IN (SELECT 1, 2 FROM t), the result
was incorrectly 0 instead of NULL.

The IN-to-EXISTS transformation wraps comparison predicates with
trigcond() guards:

  WHERE trigcond(NULL = 1) AND trigcond(NULL = 2)

During optimization, make_join_select() evaluated this as a "constant
condition". With guards ON, the condition evaluated to FALSE (NULL
treated as FALSE), triggering "Impossible WHERE". At runtime, guards
would be turned OFF for NULL columns, but the optimizer had already
marked the subquery as returning no rows.

Fix: check can_eval_in_optimize() instead of is_expensive() in
make_join_select(). Unlike is_expensive(), can_eval_in_optimize()
also verifies const_item(), which returns FALSE for Item_func_trig_cond
Sergei Golubchik
Revert "check_digest() tests"

This reverts commit 485773adce55ed3dcae3d20028a218f2f694775d.

We need at least one test that actually shows P_S digests
Rucha Deodhar
MDEV-39179: Incorrect NULL handling in UPDATE ... RETURNING result

Analysis:
OLD_VALUE() swapped only field->ptr, leaving null_ptr pointing to the
current record. This caused incorrect NULL results.

Fix:
Store null_ptr_old for record[1] and swap it together with ptr to
preserve correct NULL semantics.