Commit graph

202297 commits

Author SHA1 Message Date
Nikita Malyavin
b29b30e75e MDEV-35737 MSAN errors in check_table_referential_checks_needed upon LOAD INDEX
LOAD INDEX doesn't initialize Lex->check_opt and mysql_preload_keys doesn't use
it. However, Check_table_prelocking_strategy did, and it's always used in
opening table.

One solution could be using a different prelocking strategy for
mysql_preload_keys.

Let's instead just pass a correct check_opt to Check_table_prelocking_strategy.

Base task: MDEV-34309
2025-01-14 22:49:42 +01:00
Nikita Malyavin
d4707d3206 MDEV-35731 Assertion `(mem_root->flags & 4) == 0' failed upon 2nd exec of CHECK
... TABLE with FK

The normal order of things in prepared statement is:
1. open tables during prepare
2. use them during all the executions

Currently, tables are opened in the body of CHECK TABLE's execution part.
This is motivated by the nature of this statement: we have to run the checks for
all the tables specified in the list, event if some of them fail to open.

Rewriting it as in normal order is possible, but is out of scope of this task.

That is, we shouldn't activate stmt_arena when constructing the referential
tables list.

It's not enough, since the next statement execution will try to reuse all the
TABLE_LIST's in lex->query_list, but the referential tables are allocated on the
normal query arena, so they should be cleaned up from that list.

Given how specific the open_only_one_table work is, we only have to re-link
table lists as they were before the tables are opened. It's enough to just
assign next_local to next_global for each table specified by
user, i.e. in lex->first_select_lex().

lex->query_tables_last and other lex fields are already maintained by that
function.

Base task: MDEV-34309
2025-01-14 22:41:43 +01:00
Nikita Malyavin
2af2808f57 MDEV-35730 Server crashes in Field::ptr_in_record
In BIT -> TIME reference, BIT length is 1, and TIME length is 4.
It's likely a quirk, that such relation is possible, since 0 -> 0 is not a valid
 reference.

However, some parts of key_copy should be fixed:
1. Make sure that key_length is deduced according to to_key_info key_parts.
2. Mind the case when to_key_part is NOT NULL, but key_part is NULL.
3. Use correct length in field->get_key_image call.

Also fix the double run of checks of self-referencing keys.

Base task: MDEV-34309
2025-01-14 02:21:42 +01:00
Nikita Malyavin
f0a0e0bf92 MDEV-35733 ASAN errors in row_mysql_store_col_in_innobase_format
Fix keymap size

Base task: MDEV-34309
2025-01-13 04:14:41 +01:00
Nikita Malyavin
01b0c6c996 MDEV-34309 [2/2] CHECK TABLE: implement referential integrity check 2024-12-17 00:17:36 +01:00
Nikita Malyavin
1115f790dd MDEV-34309 [1/2] prelock referentially related tables for CHECK TABLE 2024-12-17 00:17:36 +01:00
Nikita Malyavin
5d7f6f7e6e cleanup: replace thd->calloc<T>(N) with operator new T[N] {}
### Preamble

C++ initializes objects in three stages:
1. Optionally, zero-initializes the object fields.
2. Member-initializes fields that are explicitly set.
3. If applicable, calls a constructor.

The following expressions:
x = new T[N];
x = new T;
T x;

only member-initialize and call a default constructor. Stage 1 is skipped,
because () braces are omitted.

This is known as default-initialization.

Apart from Stage 2, the following:
x = new T[N]();
x = new T();
const T &x = T();

Is known as value-initialization:
If no default constructor is present, infer zero-initialization.
Otherwise, the default constructor is called.

Note that it's not possible to write `T x();`, as it is ambiguous to a function
call.

Since C++11, it's also possible to zero initialize objects with '{}' braces:
x = new T[N]{};
x = new T{};
T x{};

This also both zero-initializes and calls a default constructor.

There is no much difference in between empty-braced () and {}. Both call a
default constructor or initializer-list constructor, when available. Having both
constructors is ambiguous.

Scalars (i.e. fundamental data types) and POD types have no constructor.
Therefore, stage 2 for them is skipped.

Other than that, there is no much difference in the result

Exambles:
new char[123] -- would return an uninitialized array of char.
new char[123]() -- forces zero-initialization
new char[123]{} -- forces zero-initialization
new char[123]{123} -- forces zero-initialization, and also value-initializes
 the first element to 123

struct A {
  int x = 0xaf;
  int y;
}

All of the following:
A a;
A *a = new A;
A *a = new A[123];

Causes member A::x be initialized to 0xaf, since it happens at
value-initialization stage. A::y is left uninitialized.

A *a = new A[123] {};
and other similars result in {.x=0xaf, .y=0}.

### In this commit

Change all the calls to thd->calloc() to new(thd) T[N]{}, or new(thd) T{}.

POD types will be zero-initialized, so a special attention should be put to
classes with default constructors.

Among all uses, two cases of interest were found:
1. TABLE_LIST: has a default constructor TABLE_LIST() = default. This infers
zero-initialization behavior (i.e. as if there's no constructor).
2. USER_AUTH: has a default constructor, that initializes all fields. Strings
are initialized to "", which is fine.
3. Security_context: had a custom default constructor, initializing only two
fields. It was removed, and fields are made member-initialized.
2024-12-17 00:17:36 +01:00
Nikita Malyavin
be0e61d5ce cleanup: remove virtual QUICK_RANGE_SELECT::clone
QUICK_RANGE_SELECT::clone is never used, and besides it does not inherit
Sql_alloc, so the usage of `new` without agruments would be leak-prone.

So, remove it.
2024-12-17 00:17:36 +01:00
Nikita Malyavin
a7c1ef9776 cleanup: further replace thd->alloc() with operator new
Remove THD:alloc() completely.

THD::calloc will still stay. It's still possible to use thd_alloc() as a plain C
replacement.

my_bitmap.h: add my_bitmap_array_size(bits) to count in my_bitmap_map, which is
ulonglong

All the bitmap arrays are now allocated with new my_bitmap_map[size]. This is
bigger than it was before, but essentially aligns the allocated array to
my_bitmap_map size, which was violated before.

sql_select: replace thd->alloc() with thd_alloc()

table_status_by_host_context: add default

sql_parse.cc: add_proc_to_list: add struct Order_Item

Made as a part of MDEV-34309
2024-12-13 19:56:30 +01:00
Nikita Malyavin
019f40218e cleanup: add operator new(size_t, const THD*) for single-object allocations
Made as a part of MDEV-34309
2024-12-13 19:53:30 +01:00
Nikita Malyavin
8260743ada cleanup: add operator new[](size_t, const THD*)
Note that List and QUICK_RANGE inherit Sql_alloc, so they use new (mem_root).

sql_select.cc: remove rollup_fields->empty() since it's now done by a List
constructor.

Made as a part of MDEV-34309
2024-12-13 19:48:36 +01:00
Nikita Malyavin
9b4ac2539a cleanup: add new(thd) to Sql_alloc and Item
Sql_alloc: add operator new(size_t, const THD *) noexcept. Also change throw()
to noexcept in other Sql_alloc operators.

Item: add operator new(size_t, const THD *).

The implementations are in the bottom of item.cc and sql_class.cc.

Made as a part of MDEV-34309
2024-12-13 16:11:52 +01:00
Nikita Malyavin
aa3000fe58 FOREIGN_KEY_INFO: Store Lex_* strings without extra pointer indirection.
Made as a part of MDEV-34309
2024-12-09 23:55:19 +01:00
Nikita Malyavin
12ef85c4ac Fix deallocation of Sql_cmd_dml::result
Made as a part of MDEV-34309
2024-12-09 23:55:19 +01:00
Marko Mäkelä
f5821aaf77 Merge 11.7 into main 2024-12-04 10:02:00 +02:00
Marko Mäkelä
0796bb8216 Merge 11.4 into 11.7 2024-12-04 09:42:46 +02:00
Marko Mäkelä
e41145f76b Update libmariadb 2024-12-04 09:30:18 +02:00
Thirunarayanan Balathandayuthapani
b24ecd7ca6 MDEV-32250 Enable --no-autocommit by default in mysqldump
- mariadb-dump utility performs logical backups by producing
set of sql statements that can be executed. By enabling this
no-autocommit option, InnoDB can load the data in an efficient
way and writes the only one undo log for the whole operation.
Only first insert statement undergoes bulk insert operation,
remaining insert statement doesn't write undo log and undergoes
normal insert code path.
2024-12-03 20:25:04 +05:30
Marko Mäkelä
f0961301c8 Merge 11.7 into main 2024-12-02 17:55:44 +02:00
Marko Mäkelä
33907f9ec6 Merge 11.4 into 11.7 2024-12-02 17:51:17 +02:00
Marko Mäkelä
2719cc4925 Merge 10.11 into 11.4 2024-12-02 11:35:34 +02:00
Marko Mäkelä
4d9548876e MDEV-31340 fixup: clang++-20 -Wdeprecated-literal-operator 2024-12-02 10:44:06 +02:00
Marko Mäkelä
3d23adb766 Merge 10.6 into 10.11 2024-11-29 13:43:17 +02:00
Marko Mäkelä
7d4077cc11 Merge 10.5 into 10.6 2024-11-29 12:37:46 +02:00
Marko Mäkelä
19acb0257e MDEV-35508 Race condition between purge and secondary index INSERT or UPDATE
row_purge_remove_sec_if_poss_leaf(): If there is an active transaction
that is not newer than PAGE_MAX_TRX_ID, return the bogus value 1
so that row_purge_remove_sec_if_poss_tree() is guaranteed to recheck if
the record needs to be purged. It could be the case that an active
transaction would insert this record between the time this check
completed and row_purge_remove_sec_if_poss_tree() acquired a latch
on the secondary index leaf page again.

row_purge_del_mark_error(), row_purge_check(): Some unlikely code
refactored into separate non-inline functions.

trx_sys_t::find_same_or_older_low(): Move the unlikely and bulky
part of trx_sys_t::find_same_or_older() to a non-inline function.

trx_sys_t::find_same_or_older_in_purge(): A variant of
trx_sys_t::find_same_or_older() for use in the purge subsystem,
with potential concurrent access of the same trx_t object from
multiple threads.

trx_t::max_inactive_id_atomic: An Atomic_relaxed alias of the
regular data field trx_t::max_inactive_id, which we
use on systems that have native 64-bit loads or stores.
On any 64-bit system that seems to be supported by GCC, Clang or MSVC,
relaxed atomic loads and stores use the regular load and store
instructions. On -march=i686 the 64-bit atomic loads and stores
would use an XMM register.

This fixes a regression that had been introduced in
commit b7b9f3ce82 (MDEV-34515).
There would be messages
[ERROR] InnoDB: tried to purge non-delete-marked record in index
in the server error log, and an assertion ut_ad(0) would cause a
crash of debug instrumented builds. This could also cause incorrect
results for MVCC reads and corrupted secondary indexes.

The debug instrumented test case was written by Debarun Banerjee.

Reviewed by: Debarun Banerjee
2024-11-29 10:44:38 +02:00
Daniele Sciascia
1d76fdfcb9 Adapt galera_sr.GCF-572 to make it work with innodb-snapshot-isolation
Make galera_sr.GCF-572 behave the same with and without option
innodb-snapshot-isolation. It is sufficient to remove a SELECT
statement from a transaction to delay the creation of the read
view in innodb. Avoiding the detection of a write-write conflict
under innodb-snapshot-isolation.
2024-11-29 08:06:32 +01:00
Daniele Sciascia
e821c9fa7c MDEV-35281 SR transaction crashes with innodb_snapshot_isolation
Ignore snapshot isolation conflict during fragment removal, before
streaming transaction commits. This happens when a streaming
transaction creates a read view that precedes the INSERTion of
fragments into the streaming_log table. Fragments are INSERTed
using a different transaction. These fragment are then removed
as part of COMMIT of the streaming transaction. This fragment
removal operation could fail when the fragments were not part
the transaction's read view, thus violating snapshot isolation.
2024-11-29 08:06:32 +01:00
Alexander Barkov
fdb6db6b47 MDEV-29462 ASAN: heap-use-after-free in Binary_string::copy on DO CONVERT
Item_char_typecast::val_str_generic() uses Item::str_value as a buffer.
Item::val_str_ascii() also used Item::str_value as a buffer.
As a result, str_value tried to copy to itself.

Fixing val_str_ascii() to use a local buffer instead of str_value.
2024-11-28 16:34:32 +04:00
Daniel Black
27c7e73f9a MDEV-35513 fails to compile on riscv32
Misplaced brace in my_rdtsc.h results in RV32 failing to compile.

ref: https://github.com/MariaDB/server/pull/1981/files#r1859762957

Thanks Jessica Clarke for the note.
2024-11-28 03:13:15 +02:00
Jan Lindström
f39217da0c MDEV-35473 : Sporadic failures in the galera_3nodes.galera_evs_suspect_timeout mtr test
Remove unnecessary sleep and replace it with proper wait_conditions.

Signed-off-by: Julius Goryavsky <julius.goryavsky@mariadb.com>
2024-11-28 01:02:35 +01:00
Jan Lindström
e7e06b3cb7 MDEV-35481 : ER_LOCK_DEADLOCK instead of ER_NO_SUCH_TABLE in galera_var_ignore_apply_errors
Add wait_condition before select and set wsrep_sync_wait=0 to avoid
possible deadlock.

Signed-off-by: Julius Goryavsky <julius.goryavsky@mariadb.com>
2024-11-28 01:02:35 +01:00
Jan Lindström
ff45fdac29 MDEV-35440 : Protocol error warning in the galera_wsrep_schema_detached test
Make sure that node_1 remains in primary view by increasing it's
weight. Add suppression on expected warnings because we kill
node_2.

Signed-off-by: Julius Goryavsky <julius.goryavsky@mariadb.com>
2024-11-28 01:02:35 +01:00
Julius Goryavsky
8bc254dd62 MDEV-26516: WSREP: Record locking is disabled in this thread, but the table being modified
We periodically observe assertion failures in the mtr tests,
specifically in the /storage/innobase/row/row0ins.cc file,
following a WSREP error. The error message is: 'WSREP: record
locking is disabled in this thread, but the table being modified
is not mysql/wsrep_streaming_log: mysql/innodb_table_stats.'"
This issue seems to occur because, upon opening the table,
innodb_stats_auto_recalc may trigger, which Galera does not
anticipate. This commit should fix this bug.
2024-11-28 01:02:35 +01:00
Oleksandr Byelkin
0ea19c12fd MDEV-35507 ed25519 authentication plugin create user statement trigger plain text password in audit log
Mask also all cases of "password(PWD" in CREATE/ALTER USER and GRANT.
(minimal fix)
2024-11-27 19:45:33 +01:00
Ivan Prisyazhnyy
f39a61505f MDEV-33075 [backport/2f5174e556] use more robust self-pipe to wake up poll() in break_connect_loop()
Backport of 2f5174e556:
MDEV-33075 Resolve server shutdown issues on macOS, Solaris, and FreeBSD.

This commit addresses multiple server shutdown problems observed on macOS,
Solaris, and FreeBSD:

1. Corrected a non-portable assumption where socket shutdown was expected
to wake up poll() with listening sockets in the main thread.

Use more robust self-pipe to wake up poll() by writing to the pipe's write
end.

Signed-off-by: Ivan Prisyazhnyy <john.koepi@gmail.com>
2024-11-27 14:59:50 +02:00
Ivan Prisyazhnyy
c4cadb768f MDEV-33075 [backport/2f5174e556] fix rnd crash on macOS from pthread_kill(signal_handler)
Backport of 2f5174e556:
MDEV-33075 Resolve server shutdown issues on macOS, Solaris, and FreeBSD.

This commit addresses multiple server shutdown problems observed on macOS,
Solaris, and FreeBSD:

2. Fixed a random crash on macOS from pthread_kill(signal_handler)
when the signal_handler was detached and the thread had already exited.

Use more robust `kill(getpid(), SIGTERM)` to wake up the signal handler
thread.

Additionally, the shutdown code underwent light refactoring
for better readability and maintainability:

- Modified `break_connect_loop()` to no longer wait for the main thread,
  aligning behavior with Windows (since 10.4).
2024-11-27 14:59:50 +02:00
Ivan Prisyazhnyy
8214707699 MDEV-33075 [backport/2f5174e556] fix signal handler thread exit on abort
Backport of 2f5174e556:
MDEV-33075 Resolve server shutdown issues on macOS, Solaris, and FreeBSD.

This commit addresses multiple server shutdown problems observed on macOS,
Solaris, and FreeBSD:

3. Made sure, that signal handler thread always exits once `abort_loop` is
set, and also calls `my_thread_end()` and clears `signal_thread_in_use`
when exiting.

This fixes warning "1 thread did not exit"  by `my_global_thread_end()`
seen on FreeBSD/macOS when the process is terminated via signal.

Additionally, the shutdown code underwent light refactoring
for better readability and maintainability:

- Removed dead code related to the unused `USE_ONE_SIGNAL_HAND`
  preprocessor constant.

Signed-off-by: Ivan Prisyazhnyy <john.koepi@gmail.com>
2024-11-27 14:59:50 +02:00
Ivan Prisyazhnyy
490274e850 MDEV-33075 [backport/2f5174e556] eliminated support for #ifndef HAVE_POLL
Backport of 2f5174e556:
MDEV-33075 Resolve server shutdown issues on macOS, Solaris, and FreeBSD.

Eliminated support for `#ifndef HAVE_POLL` in `handle_connection_sockets`
This code is also dead, since 10.4

Signed-off-by: Ivan Prisyazhnyy <john.koepi@gmail.com>
2024-11-27 14:59:50 +02:00
Jan Lindström
f5aed74573 MDEV-35486 : MDEV-33997 test failed
Problem was that at wsrep_to_isolation_end saved_lock_wait_timeout
variable was set to thd->variables.lock_wait_timeout when RSU
is used and variable value was 0 leading sporadic lock wait timeout
errors. Fixed by removing incorrect variable set.

Signed-off-by: Julius Goryavsky <julius.goryavsky@mariadb.com>
2024-11-27 13:00:08 +01:00
Alexander Barkov
8b057889d7 MDEV-34981 Functions missing from INFORMATION_SCHEMA.SQL_FUNCTIONS
Plugin functions are now displayed in I_S.SQL_FUNCTIONS
2024-11-27 14:24:52 +04:00
Thirunarayanan Balathandayuthapani
9ba18d1aa0 MDEV-35394 Innochecksum misinterprets freed pages
- Innochecksum misinterprets the freed pages as active one.
This leads the user to think there are too many valid
pages exist.

- To avoid this confusion, innochecksum introduced one
more option --skip-freed-pages and -r to avoid the freed
pages while dumping or printing the summary of the tablespace.

- Innochecksum can safely assume the page is freed if
the respective extent doesn't belong to a segment and marked as
freed in XDES_BITMAP in extent descriptor page.

- Innochecksum shouldn't assume that zero-filled page as extent
descriptor page.

Reviewed-by: Marko Mäkelä
2024-11-27 13:00:51 +05:30
Yuchen Pei
5be859d52c
MDEV-30649 Adding a spider testcase showing copying from a remote to a local table
Also deleted some trailing whitespace in mdev_30191.test.
2024-11-27 10:25:14 +11:00
Yuchen Pei
a8cc40d9a4
MDEV-35064 Reduce the default spider connect retry counts to 2
The existing default value 1000 is too big and could result in
"hanging" when failing to connect a remote server. Three tries in
total is a more sensible default.
2024-11-27 10:25:14 +11:00
Monty
c34a2feceb MDEV-35509 mariabackup.alter_copy_race crashes with abort in backup_file_op_fail
The bug was that backup_file_op_fail() was using a static variable
initialized by arguments. This does not work as static variables
will only be initialized on the first call and not change for future
calls, even when the arguments changes.

Fixed by removing 'static'.
2024-11-26 22:30:52 +02:00
Nikita Malyavin
e64857c25b Provide a safe range for RocksDB errors
Last time, commit b9f579317 (MDEV-9101) has updated HA_ERR_LAST, breaking the
rocksdb error codes. According to the commit history, this happens each time a
new HA error is added.

This patch fixes the range to start from '500', hopefully resolving the problem
for the close future.

In addition, fix incorrect error codes enumeration.
2024-11-26 19:21:12 +01:00
ParadoxV5
0fabe1dc18 Create FUNDING.yml
Configure a Sponsor button to surface a link to mariadb.org/donate
2024-11-26 17:39:37 +02:00
Monty
142851f120 Update my_print_defaults to accept --mariadbd as an option
--mariadbd and --mysqld are now synonymes for my_print_defaults

Other things
- Removed safemalloc warnings when using an unknown argument to
  my_print_defaults
2024-11-26 14:23:31 +02:00
Monty
f09020b3bb Fixed bug in subselect3.inc (not notable) 2024-11-26 14:23:31 +02:00
Alexander Barkov
225c17d35c MDEV-34090 Client allows to set character set to utf32 and crashes on the next command
Disallowing character sets with mbminlen>1 in the client.
2024-11-26 13:57:55 +04:00
Ahmed Ibrahim
a35f744d78 MDEV-31736: format_bytes implementation 2024-11-26 13:10:01 +04:00