summaryrefslogtreecommitdiff
path: root/mysql-test
Commit message (Collapse)AuthorAgeFilesLines
* MDEV-30232: Increase timeouts to fix sporadic failsbb-10.4-MDEV-30232Angelique2023-05-152-9/+9
|
* MDEV-31250 ROW variables do not get assigned from subselectsbb-10.4-bar-MDEV-31250Alexander Barkov2023-05-122-0/+99
| | | | | | | | | | | | | | | ROW variables did not get assigned from subselects in these contexts: BEGIN DECLARE r ROW TYPE OF t1; SET r=(SELECT * FROM t1 WHERE a=1); END; BEGIN DECLARE r ROW TYPE OF t1 DEFAULT (SELECT * FROM t1 WHERE a=1); END; All fields of the ROW variable remained NULL.
* MDEV-31240 Crash with condition pushable into derived and containing outer ↵bb-10.4-MDEV-31240-v2Igor Babaev2023-05-122-0/+135
| | | | | | | | | | | | | | | | | | | | | | | reference This bug could affect queries containing a subquery over splittable derived tables and having an outer references in its WHERE clause. If such subquery contained an equality condition whose left part was a reference to a column of the derived table and the right part referred only to outer columns then the server crashed in the function st_join_table::choose_best_splitting() The crashing code was added in the commit ce7ffe61d836fe9f0cfc1087f058bc40d66e5cfb that made the code of the function sensitive to presence of the flag OUTER_REF_TABLE_BIT in the KEYUSE_EXT::needed_in_prefix fields. The field needed_in_prefix of the KEYUSE_EXT structure should not contain table maps with OUTER_REF_TABLE_BIT or RAND_TABLE_BIT. Note that this fix is quite conservative: for affected queries it just returns the query plans that were used before the above mentioned commit. In fact the equalities causing crashes should be pushed into derived tables without any usage of split optimization. Approved by Sergei Petrunia <sergey@mariadb.com>
* MDEV-28433 : Server crashes when wsrep_sst_donor and wsrep_cluster_address ↵bb-10.4-MDEV-28433-galeraJan Lindström2023-05-124-4/+72
| | | | | | | | | | | set to NULL Do not allow setting wsrep_sst_donor as NULL as it is incorrect value. User can use value '' (default) that represents same as NULL. Setting wsrep_cluster_address to NULL is already handled correctly. Signed-off-by: Julius Goryavsky <julius.goryavsky@mariadb.com>
* MDEV-30473 Remove test galera.MDEV-27713Daniele Sciascia2023-05-122-113/+0
| | | | | | | | Remove test galera.MDEV-27713. This test relies on GET_LOCK() and has stopped working since commit 844ddb1 (see MDEV-30473). This commit disabled GET_LOCK() in combination with Galera. Signed-off-by: Julius Goryavsky <julius.goryavsky@mariadb.com>
* MDEV-30388 : Assertion `!wsrep_has_changes(thd) || (thd->lex->sql_command == ↵Jan Lindström2023-05-117-53/+408
| | | | | | | | | | | | | | | | | | | | | | | | | | SQLCOM_CREATE_TABLE && !thd->is_current_stmt_binlog_format_row()) || thd->wsrep_cs().transaction().state() == wsrep::transaction::s_aborted' failed Problem for Galera is the fact that sequences are not really transactional. Sequence operation is committed immediately in sql_sequence.cd and later Galera could find out that we have changes but actual statement is not there anymore. Therefore, we must make some restrictions what kind of sequences Galera can support. (1) Galera cluster supports only sequences implemented by InnoDB storage engine. This is because Galera replication supports currently only InnoDB. (2) We do not allow LOCK TABLE on sequence object and we do not allow sequence creation under LOCK TABLE, instead lock is released and we issue warning. (3) We allow sequences with NOCACHE definition or with INCREMEMENT BY 0 CACHE=n definition. This makes sure that sequence values are unique accross Galera cluster. Signed-off-by: Julius Goryavsky <julius.goryavsky@mariadb.com>
* Merge branch '10.4' into 10.4.29 releasebb-10.4-releaseOleksandr Byelkin2023-05-1137-127/+674
|\
| * MDEV-30765 SHOW TABLES not working properly with lower_case_table_names=2bb-10.4-mdev-30765Oleg Smirnov2023-05-113-6/+57
| | | | | | | | | | | | | | | | | | lower_case_table_names=2 means "table names and database names are stored as declared, but they are compared in lowercase". But names of objects in grants are stored in lowercase for any value of lower_case_table_names. This caused an error when checking grants for objects containing uppercase letters since table_hash_search() didn't take into account lower_case_table_names value
| * MDEV-31224 Crash with EXPLAIN EXTENDED for multi-table update of system tableIgor Babaev2023-05-093-2/+39
| | | | | | | | | | | | | | | | EXPLAIN EXTENDED should always print the field item used in the left part of an equality expression from the SET clause of an update statement as a reference to table column. Approved by Oleksandr Byelkin <sanja@mariadb.com>
| * MDEV-31181 Crash with EXPLAIN EXTENDED for single-table DELETE using IN ↵Igor Babaev2023-05-082-0/+60
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | predicand This bug affected EXPLAIN EXTENDED command for single-table DELETE that used an IN subquery in its WHERE clause. A crash happened if the optimizer chose to employ index_subquery or unique_subquery access when processing such command. The crash happened when the command tried to print the transformed query. In the current code of 10.4 for single-table DELETE statements the output of any explain command is produced after the join structures of all used subqueries have been destroyed. JOIN::destroy() sets the field tab of the JOIN_TAB structures created for subquery tables to NULL. As a result subselect_indexsubquery_engine::print(), subselect_indexsubquery_engine() cannot use this field to get the alias name of the joined table. This patch suggests to use the field TABLE_LIST::TAB that can be accessed from JOIN_TAB::tab_list to get the alias name of the joined table. Approved by Oleksandr Byelkin <sanja@mariadb.com>
| * Fixed wrong test cases (embedded and ASAN)bb-10.4-montyMonty2023-05-0510-270/+248
| | | | | | | | | | | | | | | | | | | | - main.selectivity failed because one test produced different result with embedded (missing feature). Fixed by moving the failing part to selectivity_notembedded. - Disabled maria.encrypt-no-key for embedded as embedded does not support encryption - Moved test from join_cache to join_cache_notasan that tried to alloc() a buffer bigger than available memory.
| * Added missing test fileMonty2023-05-051-0/+0
| |
| * Fixed calculation of JOIN_CACHE::max_recordsMonty2023-05-051-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | The old code did set max_records to either number_of_rows (partial_join_cardinality) or memory size (join_buffer_space_limit) which did not make sense. Fixed by setting max_records to number of rows that fits into join_buffer_size. Other things: - Initialize buffer cache values in JOIN_CACHE constructors (safety) Reviewer: Sergei Petrunia <sergey@mariadb.com>
| * MDEV-28217 Incorrect Join Execution When Controlling Join Buffer SizeMonty2023-05-043-3/+60
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The problem was that join_buffer_size conflicted with join_buffer_space_limit, which caused the query to be run without join buffer. However this caused wrong results as the optimizer assumed that hash+join buffer would ensure that the equi-join condition would be satisfied, and didn't check it itself. Fixed by not using join_buffer_space_limit when optimize_join_buffer_size=off. This matches the documentation at https://mariadb.com/kb/en/block-based-join-algorithms Other things: - Removed not used variable JOIN_TAB::join_buffer_size_limit - Give an error if we cannot allocate a join buffer. This can only happen if the join_buffer variables are wrongly configured or we are running out of memory. In the future, instead of returning an error, we could properly convert the query plan that uses BNL-H join into one that doesn't use join buffering: make sure the equi-join condition is checked where appropriate. Reviewer: Sergei Petrunia <sergey@mariadb.com>
| * MDEV-30892 test galera.galera_log_bin is not deterministicbb-10.4-MDEV-30892-galerasara2023-05-036-12/+12
| | | | | | | | | | | | | | | | | | galera.galera_log_bin test created the test tables and executed initial DML into node 2 Then connection is switched to node 1, where ALTER TABLE was attempted. But there is no guarantee that the table to alter was yet replicated to node 1. The fix in this commit, creates the test tables in node 1 instead, so it is guaranteed that they are available for the later ALTER Signed-off-by: Julius Goryavsky <julius.goryavsky@mariadb.com>
| * MDEV-6768 Wrong result with aggregate with join with no result setMonty2023-05-024-0/+231
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | When a query does implicit grouping and join operation produces an empty result set, a NULL-complemented row combination is generated. However, constant table fields still show non-NULL values. What happens in the is that end_send_group() is called with a const row but without any rows matching the WHERE clause. This last part is shown by 'join->first_record' not being set. This causes item->no_rows_in_result() to be called for all items to reset all sum functions to their initial state. However fields are not set to NULL. The used fix is to produce NULL-complemented records for constant tables as well. Also, reset the constant table's records back in case we're in a subquery which may get re-executed. An alternative fix would have item->no_rows_in_result() also work with Item_field objects. There is some other issues with the code: - join->no_rows_in_result_called is used but never set. - Tables that are used with group functions are not properly marked as maybe_null, which is required if the table rows should be regarded as null-complemented (not existing). - The code that tries to detect if mixed_implicit_grouping should be set didn't take into account all usage of fields and sum functions. - Item_func::restore_to_before_no_rows_in_result() called the wrong function. - join->clear() does not use a table_map argument to clear_tables(), which caused it to ignore constant tables. - unclear_tables() does not correctly restore status to what is was before clear_tables(). Main bug fix was to always use a table_map argument to clear_tables() and always use join->clear() and clear_tables() together with unclear_tables(). Other fixes: - Fixed Item_func::restore_to_before_no_rows_in_result() - Set 'join->no_rows_in_result_called' when no_rows_in_result_set() is called. - Removed not used argument from setup_end_select_func(). - More code comments - Ensure that end_send_group() modifies the same fields as are in the result set. - Changed return_zero_rows() to use pointers instead of references, similar to the rest of the code.
| * MDEV-28054 Various crashes upon INSERT/UPDATE after changing Aria settingsMonty2023-05-029-44/+119
| | | | | | | | | | | | | | | | | | | | | | | | | | The cause of the crash was that test was setting aria_sort_buffer_size to MAX_LONG_LONG, which caused an overflow in my_malloc() when trying to allocate the buffer + 8 bytes. Fixed by reducing max size of sort_buffer for Aria and MyISAM Other things: - Added code in maria_repair_parallell() to not allocate a big sort buffer for small files. - Updated size of minumim sort buffer in Aria
| * MDEV-26258 Various crashes/asserts/corruptions when Aria encryption is ↵Monty2023-05-025-29/+87
| | | | | | | | | | | | | | | | | | | | | | | | | | enabled/used, but the encryption plugin is not loaded The reason for the MDEV reported failures is that the tests are enabling encryption for Aria but not providing any encryption keys. Fixed by checking if encryption keys exists before creating the table. Other things: - maria.encrypt_wrong-key changed as we now get the error on CREATE instead during insert.
* | MDEV-31194: Server crash or assertion failure with join_cache_level=4mariadb-10.4.29Sergei Petrunia2023-05-052-0/+39
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The problem, introduced in patch for MDEV-26301: When check_join_cache_usage() decides not to use join buffer, it must adjust the access method accordingly. For BNL-H joins this means switching from pseudo-"ref access"(with index=MAX_KEY) to some other access method. Failing to do this will cause assertions down the line when code that is not aware of BNL-H will try to initialize index use for ref access with index=MAX_KEY. The fix is to follow the regular code path to disable the join buffer for the join_tab ("goto no_join_cache") instead of just returning from check_join_cache_usage().
* | MDEV-31189 Server crash or assertion failure in upon 2nd execution of PS ↵Oleksandr Byelkin2023-05-042-0/+37
| | | | | | | | | | | | | | with views and HAVING Do not try to decide merge/materialize for derived if it was already decided (even if it is a view).
* | MDEV-31164 default current_timestamp() not working when used INSERT ON ↵Sergei Golubchik2023-05-042-0/+67
| | | | | | | | | | | | | | | | DUPLICATE KEY in some cases select_insert::store_values() must reset has_value_set bitmap before every row, just like mysql_insert() does. because ON DUPLICATE KEY UPDATE and triggers modify it
* | MDEV-31181 Server crash in subselect_uniquesubquery_engine::print upon ↵Oleksandr Byelkin2023-05-042-0/+37
| | | | | | | | | | | | EXPLAIN EXTENDED DELETE Temporary fix to avoid the server crash.
* | Fix of selectivity test to behave correctly with embedded and view protocols.Oleksandr Byelkin2023-05-047-217/+335
| |
* | MDEV-26301: Split optimization refills: Optimizer Trace coverageSergei Petrunia2023-05-032-0/+184
| | | | | | | | Add Optimizer Trace printouts.
* | MDEV-26301 Split optimization refills temporary table too many timesIgor Babaev2023-05-032-0/+724
| | | | | | | | | | | | | | | | This patch optimizes the number of refills for the lateral derived table to which a materialized derived table subject to split optimization is is converted. This optimized number of refills is now considered as the expected number of refills of the materialized derived table when searching for the best possible splitting of the table.
* | Merge branch '10.4' into bb-10.4-releaseOleksandr Byelkin2023-05-024-2/+62
|\ \ | |/
| * MDEV-30838 Assertion `m_thd == _current_thd()'Daniele Sciascia2023-05-022-0/+33
| | | | | | | | | | | | | | | | - Update wsrep-lib which contains fix for the assertion - Fix error handling for appending fragment to streaming log, make sure tables are closed after rollback. Signed-off-by: Julius Goryavsky <julius.goryavsky@mariadb.com>
| * MDEV-30414 sporadic failures with galera var retry autocommitsara2023-05-022-2/+29
| | | | | | | | | | | | changed tast case 2 to be deterministic Signed-off-by: Julius Goryavsky <julius.goryavsky@mariadb.com>
* | Merge branch '10.3' into 10.4Oleksandr Byelkin2023-05-023-0/+216
|\ \ | |/ |/|
| * MDEV-29621: Replica stopped by locks on sequenceAndrei2023-04-273-0/+127
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | When using binlog_row_image=FULL with sequence table inserts, a replica can deadlock because it treats full inserts in a sequence as DDL statements by getting an exclusive lock on the sequence table. It has been observed that with parallel replication, this exclusive lock on the sequence table can lead to a deadlock where one transaction has the exclusive lock and is waiting on a prior transaction to commit, whereas this prior transaction is waiting on the MDL lock. This fix for this is on the master side, to raise FL_DDL flag on the GTID of a full binlog_row_image write of a sequence table. This forces the slave to execute the statement serially so a deadlock cannot happen. A test verifies the deadlock also to prove it happen on the OLD (pre-fixes) slave. OLD (buggy master) -replication-> NEW (fixed slave) is provided. As the pre-fixes master's full row-image may represent both SELECT NEXT VALUE and INSERT, the parallel slave pessimistically waits for the prior transaction to have committed before to take on the critical part of the second (like INSERT in the test) event execution. The waiting exploits a parallel slave's retry mechanism which is controlled by `@@global.slave_transaction_retries`. Note that in order to avoid any persistent 'Deadlock found' 2013 error in OLD -> NEW, `slave_transaction_retries` may need to be set to a higher than the default value. START-SLAVE is an effective work-around if this still happens.
* | MDEV-30221: Move environmental macros to before master-slavebb-10.4-MDEV-30221Angelique2023-04-289-14/+14
| | | | | | | | The fix was introduced, along with re-ordering to do other macros that check test environment capabilities before master/slave is set up.
* | MDEV-31067: selectivity_from_histogram >1.0 for a DOUBLE_PREC_HB histogrambb-10.4-mdev31067-variant2Sergei Petrunia2023-04-284-14/+229
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Variant #2. When Histogram::point_selectivity() sees that the point value of interest falls into one bucket, it tries to guess whether the bucket has many different (unpopular) values or a few popular values. (The number of rows is fixed, as it's a Height-balanced histogram). The basis for this guess is the "width" of the value range the bucket covers. Buckets covering wider value ranges are assumed to contain values with proportionally lower frequencies. This is just a [brave] guesswork. For a very narrow bucket, it may produce an estimate that's larger than total #rows in the bucket or even in the whole table. Remove the guesswork and replace it with basic logic: return either the per-table average selectivity of col=const, or selectivity of one bucket, whichever is lower.
* | MDEV-22756 SQL Error (1364): Field 'DB_ROW_HASH_1' doesn't have a default valueSergei Golubchik2023-04-282-0/+13
| | | | | | | | exclude generated columns from the "has default value" check
* | MDEV-31113 Server crashes in store_length / ↵bb-10.4-mdev-31113Oleg Smirnov2023-04-282-0/+27
| | | | | | | | | | | | | | | | | | | | | | | | Type_handler_string_result::make_sort_key with DISTINCT and group function Fix-up for commit 476b24d084e7e717310155bb986eb086d3c1e1a6 Author: Monty Date: Thu Feb 16 14:19:33 2023 +0200 MDEV-20057 Distinct SUM on CROSS JOIN and grouped returns wrong result which misses initializing of sorder->suffix_length. In this commit the initialization is implemented by passing MY_ZEROFILL flag to the allocation of SORT_FIELD elements
* | MDEV-30218 update test resultSergei Golubchik2023-04-261-1/+1
| | | | | | | | followup for d1a46c68cd4
* | MDEV-11356 Option skip-core-file does not workSergei Golubchik2023-04-263-5/+6
| | | | | | | | | | remove ancient hard-coded treatment of --core-file. This enables normal my_getopt behavior for the already existing sysvar
* | MDEV-31121: ANALYZE statement produces 0 for all timings in embedded serverSergei Petrunia2023-04-252-0/+29
| | | | | | | | | | Timers require my_timer_init() call. It was made only in mysqld_main(). Call it also from init_embedded_server().
* | MDEV-30430: Enabling system versioning on tables without primary key breaks ↵Brandon Nesterenko2023-04-242-0/+58
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | replication When replicating MDL events for a table that uses system versioning without primary keys, ensure that for data sets with duplicate records, the updates to these records with duplicates are enacted on the correct row. That is, there was a bug (reported in MDEV-30430) such that the function to find the row to update would stop after finding the first matching record. However, in the absence of primary keys, the version of the record is needed to compare the row to ensure we are updating the correct one. The fix, therefore, updates the record comparison functionality to use system version columns when there are no primary keys on the table. Reviewed By: ============ Andrei Elkin <andrei.elkin@mariadb.com>
* | MDEV-28798: Cosmetic Changes OnlyBrandon Nesterenko2023-04-241-7/+7
| | | | | | | | Removed trailing whitespaces
* | MDEV-28798: Previously Binlog Encrypted Master Segfaults on Binlog Dump with ↵Brandon Nesterenko2023-04-246-5/+258
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Using_Gtid=Slave_Pos Problem: ======== A master can segfault if it can't set up decryption for its binary log during a binlog dump with Using_Gtid=Slave_Pos. If slave connects using GTID mode, the master will call into log.cc::get_gtid_list_event(), which iterate through binlog events looking for a Gtid_list_log_event. On an encrypted binlog that the master cannot decrypt, the first event will be a START_ENCRYPTION_EVENT which will call into the following decryption branch if (fdle->start_decryption((Start_encryption_log_event*) ev)) errormsg= ‘Could not set up decryption for binlog.’; The event iteration however, does not stop in spite of this error. The master will try to read the next event, but segfault while trying to decrypt it because decryption failed to initialize. Solution: ======== Break the event iteration if decryption cannot be set up. Reviewed By: ============ Andrei Elkin <andrei.elkin@mariadb.com>
* | MDEV-31102 Crash when pushing condition into view defined as unionIgor Babaev2023-04-242-0/+113
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This bug could manifest itself at the first execution of prepared statement created for queries using a materialized view defined as union. A crash could happen for sure if the query contained a condition pushable into the view and this condition was over the column defined via a complex string expression requiring implicit conversion from one charset to another for some of its sub-expressions. The bug could cause crashes when executing PS for some other queries whose optimization needed building clones for such expressions. This bug was introduced in the patch for MDEV-29988 where the class Item_direct_ref_to_item was added. The implementations of the virtual methods get_copy() and build_clone() were invalid for the class and this could cause crashes after the method build_clone() was called for expressions containing objects of the Item_direct_ref_to_item type. Approved by Sergei Golubchik <serg@mariadb.com>
* | MDEV-31085 Crash when processing multi-update using view with optimizer_trace onIgor Babaev2023-04-222-0/+375
| | | | | | | | | | | | | | | | | | This bug caused server crash when processing a multi-update statement that used views if optimizer tracing was enabled. The bug was introduced in the patch for MDEV-30539 that could incorrectly detect the most top level selects of queries if views were used in them. Approved by Oleksandr Byelkin <sanja@mariadb.com>
* | MDEV-30968 mariadb-backup does not copy Aria logs if aria_log_dir_path is usedAlexander Barkov2023-04-214-0/+191
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | - `mariadb-backup --backup` was fixed to fetch the value of the @@aria_log_dir_path server variable and copy aria_log* files from @@aria_log_dir_path directory to the backup directory. Absolute and relative (to --datadir) paths are supported. Before this change aria_log* files were copied to the backup only if they were in the default location in @@datadir. - `mariadb-backup --copy-back` now understands a new my.cnf and command line parameter --aria-log-dir-path. `mariadb-backup --copy-back` in the main loop in copy_back() (when copying back from the backup directory to --datadir) was fixed to ignore all aria_log* files. A new function copy_back_aria_logs() was added. It consists of a separate loop copying back aria_log* files from the backup directory to the directory specified in --aria-log-dir-path. Absolute and relative (to --datadir) paths are supported. If --aria-log-dir-path is not specified, aria_log* files are copied to --datadir by default. - The function is_absolute_path() was fixed to understand MTR style paths on Windows with forward slashes, e.g. --aria-log-dir-path=D:/Buildbot/amd64-windows/build/mysql-test/var/...
* | Merge branch '10.3' into 10.4Oleksandr Byelkin2023-04-217-92/+191
|\ \ | |/
| * MDEV-30818 invalid ssl prevents bootstrapSergei Golubchik2023-03-092-0/+8
| | | | | | | | | | in bootstrap the server reads stdin and does not listen to network. it won't use ssl anyway
| * main.bootstrap test cleanupSergei Golubchik2023-03-092-55/+89
| |
| * Merge branch '10.3' into bb-10.3-releaseOleksandr Byelkin2023-02-065-36/+95
| |\
| | * MDEV-30475 Windows, mtr - Remove outdated instructions on how to install ↵Vladislav Vaintroub2023-01-261-30/+3
| | | | | | | | | | | | | | | | | | | | | post-mortem debugger Also, use standard C:\symbols location for OS debugging symbols cache, rather than own invention C:\cdb_symbols.
| | * MDEV-30151 parse error 1=2 not between/inbb-10.3-bar-MDEV-30151Alexander Barkov2023-01-262-0/+52
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This patch fixes the problem by adding a new rule booleat_test. This makes the grammar clearer and less conflicting. Additionally, fixing %prec in this grammar branch: - | boolean_test IS NULL_SYM %prec PREC_BELOW_NOT + | boolean_test IS NULL_SYM %prec IS to have consistently "%prec IS" in all grammar branches starting with "boolean_test IS ...". It's not clear why these three rules needed different %prec before the fix: - boolean_test IS TRUE - boolean_test IS UNKNOWN - boolean_test IS NULL
| | * Revert "MDEV-30151 parse error 1=2 not between/in"Alexander Barkov2023-01-262-19/+0
| | | | | | | | | | | | | | | | | | This reverts commit eba099184e1f6704894694ea41f97f216eae5f21. A different patch with less shift-reduce conflicts is coming.