diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2019-03-25 11:02:03 +0200 |
---|---|---|
committer | Marko Mäkelä <marko.makela@mariadb.com> | 2019-03-25 11:03:19 +0200 |
commit | c3a6c683e2bba4111a69a34303af13ff9a45b46a (patch) | |
tree | d769537a9ef4b6602ce548bf4ccf037e1a78519f | |
parent | f03f4da66373161d604b8ecf3c23ae18d08c0461 (diff) | |
parent | 72b934e3f7d5f0c717cb98b718c9529c74741b4a (diff) | |
download | mariadb-git-c3a6c683e2bba4111a69a34303af13ff9a45b46a.tar.gz |
Merge 10.2 into 10.3
24 files changed, 129 insertions, 109 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index a8e6307e975..77e8dc22210 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -25,7 +25,8 @@ ENDIF() MESSAGE(STATUS "Running cmake version ${CMAKE_VERSION}") -SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/cmake) +SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} + ${CMAKE_SOURCE_DIR}/cmake ${CMAKE_SOURCE_DIR}/cmake/Internal/CPack) # Use a default manufacturer if no manufacturer was identified. IF(NOT DEFINED MANUFACTURER) diff --git a/cmake/CPackRPM.cmake b/cmake/Internal/CPack/CPackRPM.cmake index 326013f06b3..2729667e319 100644 --- a/cmake/CPackRPM.cmake +++ b/cmake/Internal/CPack/CPackRPM.cmake @@ -50,7 +50,11 @@ endif() # load the original CPackRPM.cmake set(orig_CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH}) unset(CMAKE_MODULE_PATH) -include(CPackRPM) +if (CMAKE_VERSION VERSION_GREATER "3.12.99") + include(Internal/CPack/CPackRPM) +else() + include(CPackRPM) +endif() set(CMAKE_MODULE_PATH ${orig_CMAKE_MODULE_PATH}) restore(LICENSE) diff --git a/cmake/build_configurations/mysql_release.cmake b/cmake/build_configurations/mysql_release.cmake index a6eb8fad3d2..3d2ba4fd18c 100644 --- a/cmake/build_configurations/mysql_release.cmake +++ b/cmake/build_configurations/mysql_release.cmake @@ -87,6 +87,7 @@ IF(FEATURE_SET) ENDIF() SET(WITH_INNODB_SNAPPY OFF CACHE STRING "") +SET(WITH_NUMA 0 CACHE BOOL "") IF(WIN32) SET(INSTALL_MYSQLTESTDIR "" CACHE STRING "") SET(INSTALL_SQLBENCHDIR "" CACHE STRING "") @@ -96,18 +97,15 @@ ELSEIF(RPM) SET(WITH_ZLIB system CACHE STRING "") SET(CHECKMODULE /usr/bin/checkmodule CACHE STRING "") SET(SEMODULE_PACKAGE /usr/bin/semodule_package CACHE STRING "") - SET(WITH_LIBARCHIVE ON CACHE STRING "") ELSEIF(DEB) SET(WITH_SSL system CACHE STRING "") SET(WITH_ZLIB system CACHE STRING "") SET(WITH_LIBWRAP ON) SET(HAVE_EMBEDDED_PRIVILEGE_CONTROL ON) - SET(WITH_LIBARCHIVE ON CACHE STRING "") ELSE() SET(WITH_SSL bundled CACHE STRING "") SET(WITH_ZLIB bundled CACHE STRING "") SET(WITH_JEMALLOC static CACHE STRING "") - SET(WITH_LIBARCHIVE STATIC CACHE STRING "") ENDIF() IF(NOT COMPILATION_COMMENT) diff --git a/mysql-test/main/default.result b/mysql-test/main/default.result index 3b1912f4a55..73417d0d64e 100644 --- a/mysql-test/main/default.result +++ b/mysql-test/main/default.result @@ -434,7 +434,7 @@ drop table t1; # create table t1 (a int); create or replace table t1 (a int default b, b int default a); -ERROR 01000: Expression for field `a` is refering to uninitialized field `b` +ERROR 01000: Expression for field `a` is referring to uninitialized field `b` show create table t1; ERROR 42S02: Table 'test.t1' doesn't exist # @@ -451,16 +451,16 @@ create or replace table t1 (a varchar(128) default @@version); create or replace table t1 (a int not null, b int as (a)); create or replace table t1 (a int not null, b int default (a+1)); create or replace table t1 (a int default a); -ERROR 01000: Expression for field `a` is refering to uninitialized field `a` +ERROR 01000: Expression for field `a` is referring to uninitialized field `a` create or replace table t1 (a int default b, b int default (1+1)); create or replace table t1 (a int default 1, b int as (c), c int as (a+1)); -ERROR 01000: Expression for field `b` is refering to uninitialized field `c` +ERROR 01000: Expression for field `b` is referring to uninitialized field `c` CREATE TABLE t1 (a INT DEFAULT (DEFAULT(a))); -ERROR 01000: Expression for field `a` is refering to uninitialized field `a` +ERROR 01000: Expression for field `a` is referring to uninitialized field `a` CREATE TABLE t1 (a INT DEFAULT(DEFAULT(b)), b INT DEFAULT(DEFAULT(a))); -ERROR 01000: Expression for field `a` is refering to uninitialized field `b` +ERROR 01000: Expression for field `a` is referring to uninitialized field `b` CREATE TABLE t1 (a INT DEFAULT(DEFAULT(b)) NOT NULL, b INT DEFAULT(DEFAULT(a)) NOT NULL); -ERROR 01000: Expression for field `a` is refering to uninitialized field `b` +ERROR 01000: Expression for field `a` is referring to uninitialized field `b` # # Allow defaults to refer to not default fields # @@ -519,7 +519,7 @@ Got one of the listed errors CREATE TABLE t1 (a INT DEFAULT(?)); Got one of the listed errors CREATE TABLE t1 (a INT DEFAULT (b), b INT DEFAULT(a)); -ERROR 01000: Expression for field `a` is refering to uninitialized field `b` +ERROR 01000: Expression for field `a` is referring to uninitialized field `b` CREATE TABLE t1 (a INT DEFAULT(NAME_CONST('xxx', 'yyy')); ERROR HY000: Function or expression 'name_const()' cannot be used in the DEFAULT clause of `a` CREATE TABLE t1 (a INT DEFAULT COUNT(*)); @@ -3369,7 +3369,7 @@ a b t 4 5 5 the value of the DEFAULT(a), that is b drop table t1; create table t1 (col1 int default(-(default(col1)))); -ERROR 01000: Expression for field `col1` is refering to uninitialized field `col1` +ERROR 01000: Expression for field `col1` is referring to uninitialized field `col1` create table t1 (col int default (yearweek((exp(710))))); ERROR 22003: DOUBLE value is out of range in 'exp(710)' # diff --git a/mysql-test/suite/gcol/r/gcol_column_def_options_innodb.result b/mysql-test/suite/gcol/r/gcol_column_def_options_innodb.result index 1f3a1b641ba..6c2cd8a18c8 100644 --- a/mysql-test/suite/gcol/r/gcol_column_def_options_innodb.result +++ b/mysql-test/suite/gcol/r/gcol_column_def_options_innodb.result @@ -255,9 +255,9 @@ a b c 4 -4 -3 drop table t1; create table t1 (a int, b int generated always as(-b) virtual, c int generated always as (b + 1) virtual); -ERROR 01000: Expression for field `b` is refering to uninitialized field `b` +ERROR 01000: Expression for field `b` is referring to uninitialized field `b` create table t1 (a int, b int generated always as(-c) virtual, c int generated always as (b + 1) virtual); -ERROR 01000: Expression for field `b` is refering to uninitialized field `c` +ERROR 01000: Expression for field `b` is referring to uninitialized field `c` create table t1 (pk int auto_increment primary key, col_int_nokey int generated always as (pk + col_int_key) stored, col_int_key int); ERROR HY000: Function or expression 'AUTO_INCREMENT' cannot be used in the GENERATED ALWAYS AS clause of `pk` # Bug#20339347: FAIL TO USE CREATE ....SELECT STATEMENT TO CREATE A NEW TABLE @@ -277,7 +277,7 @@ drop table t1,tt; # THD->CHANGE_LIST.IS_EMPTY() # CREATE TABLE t1(a bigint AS (a between 1 and 1)); -ERROR 01000: Expression for field `a` is refering to uninitialized field `a` +ERROR 01000: Expression for field `a` is referring to uninitialized field `a` # Bug#20757211: GENERATED COLUMNS: ALTER TABLE CRASHES # IN FIND_FIELD_IN_TABLE # diff --git a/mysql-test/suite/gcol/r/gcol_column_def_options_myisam.result b/mysql-test/suite/gcol/r/gcol_column_def_options_myisam.result index 40029079943..85370d42af8 100644 --- a/mysql-test/suite/gcol/r/gcol_column_def_options_myisam.result +++ b/mysql-test/suite/gcol/r/gcol_column_def_options_myisam.result @@ -255,9 +255,9 @@ a b c 4 -4 -3 drop table t1; create table t1 (a int, b int generated always as(-b) virtual, c int generated always as (b + 1) virtual); -ERROR 01000: Expression for field `b` is refering to uninitialized field `b` +ERROR 01000: Expression for field `b` is referring to uninitialized field `b` create table t1 (a int, b int generated always as(-c) virtual, c int generated always as (b + 1) virtual); -ERROR 01000: Expression for field `b` is refering to uninitialized field `c` +ERROR 01000: Expression for field `b` is referring to uninitialized field `c` create table t1 (pk int auto_increment primary key, col_int_nokey int generated always as (pk + col_int_key) stored, col_int_key int); ERROR HY000: Function or expression 'AUTO_INCREMENT' cannot be used in the GENERATED ALWAYS AS clause of `pk` # Bug#20339347: FAIL TO USE CREATE ....SELECT STATEMENT TO CREATE A NEW TABLE @@ -277,7 +277,7 @@ drop table t1,tt; # THD->CHANGE_LIST.IS_EMPTY() # CREATE TABLE t1(a bigint AS (a between 1 and 1)); -ERROR 01000: Expression for field `a` is refering to uninitialized field `a` +ERROR 01000: Expression for field `a` is referring to uninitialized field `a` # Bug#20757211: GENERATED COLUMNS: ALTER TABLE CRASHES # IN FIND_FIELD_IN_TABLE # diff --git a/mysql-test/suite/vcol/r/vcol_misc.result b/mysql-test/suite/vcol/r/vcol_misc.result index f3edfa9c026..958ccd7ad33 100644 --- a/mysql-test/suite/vcol/r/vcol_misc.result +++ b/mysql-test/suite/vcol/r/vcol_misc.result @@ -316,7 +316,7 @@ drop table t1; # MDEV-5611: self-referencing virtual column # create table t1 (a int, b int as (b is null) virtual); -ERROR 01000: Expression for field `b` is refering to uninitialized field `b` +ERROR 01000: Expression for field `b` is referring to uninitialized field `b` create table t1 (a int as (1+1), b int as (a is null) virtual); drop table t1; # end of 5.3 tests diff --git a/sql/item.cc b/sql/item.cc index 7f4e69a3523..faae5c5ad03 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -992,7 +992,7 @@ bool Item_field::register_field_in_write_map(void *arg) } /** - Check that we are not refering to any not yet initialized fields + Check that we are not referring to any not yet initialized fields Fields are initialized in this order: - All fields that have default value as a constant are initialized first. diff --git a/sql/share/errmsg-utf8.txt b/sql/share/errmsg-utf8.txt index 9112795b754..aa7235e5d5a 100644 --- a/sql/share/errmsg-utf8.txt +++ b/sql/share/errmsg-utf8.txt @@ -7623,7 +7623,7 @@ ER_ERROR_EVALUATING_EXPRESSION ER_CALCULATING_DEFAULT_VALUE eng "Got an error when calculating default value for %`s" ER_EXPRESSION_REFERS_TO_UNINIT_FIELD 01000 - eng "Expression for field %`-.64s is refering to uninitialized field %`s" + eng "Expression for field %`-.64s is referring to uninitialized field %`s" ER_PARTITION_DEFAULT_ERROR eng "Only one DEFAULT partition allowed" ukr "Припустимо мати тільки один DEFAULT розділ" diff --git a/sql/table.cc b/sql/table.cc index 10543a1b4f0..4c61cba83cd 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -1132,7 +1132,7 @@ bool parse_vcol_defs(THD *thd, MEM_ROOT *mem_root, TABLE *table, if (check_constraint_ptr) *check_constraint_ptr= 0; - /* Check that expressions aren't refering to not yet initialized fields */ + /* Check that expressions aren't referring to not yet initialized fields */ for (field_ptr= table->field; *field_ptr; field_ptr++) { Field *field= *field_ptr; diff --git a/storage/innobase/btr/btr0btr.cc b/storage/innobase/btr/btr0btr.cc index 96be7349b46..df0ea3cebe1 100644 --- a/storage/innobase/btr/btr0btr.cc +++ b/storage/innobase/btr/btr0btr.cc @@ -2,7 +2,7 @@ Copyright (c) 1994, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2012, Facebook Inc. -Copyright (c) 2014, 2018, MariaDB Corporation. +Copyright (c) 2014, 2019, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -378,8 +378,7 @@ btr_root_adjust_on_import( page = buf_block_get_frame(block); page_zip = buf_block_get_page_zip(block); - if (!page_is_root(page)) { - + if (!fil_page_index_page_check(page) || page_has_siblings(page)) { err = DB_CORRUPTION; } else if (dict_index_is_clust(index)) { @@ -1161,11 +1160,11 @@ btr_free_root_check( buf_block_dbg_add_level(block, SYNC_TREE_NODE); if (fil_page_index_page_check(block->frame) - && index_id == btr_page_get_index_id(block->frame)) { + && index_id == btr_page_get_index_id(block->frame)) { /* This should be a root page. It should not be possible to reassign the same index_id for some other index in the tablespace. */ - ut_ad(page_is_root(block->frame)); + ut_ad(!page_has_siblings(block->frame)); } else { block = NULL; } @@ -1356,7 +1355,8 @@ btr_free_but_not_root( ibool finished; mtr_t mtr; - ut_ad(page_is_root(block->frame)); + ut_ad(fil_page_index_page_check(block->frame)); + ut_ad(!page_has_siblings(block->frame)); leaf_loop: mtr_start(&mtr); mtr_set_log_mode(&mtr, log_mode); @@ -1427,7 +1427,6 @@ btr_free_if_exists( return; } - ut_ad(page_is_root(root->frame)); btr_free_but_not_root(root, mtr->get_log_mode()); mtr->set_named_space_id(page_id.space()); btr_free_root(root, mtr); @@ -1450,8 +1449,6 @@ btr_free( page_id, page_size, RW_X_LATCH, &mtr); if (block) { - ut_ad(page_is_root(block->frame)); - btr_free_but_not_root(block, MTR_LOG_NO_REDO); btr_free_root(block, &mtr); } @@ -1598,12 +1595,17 @@ btr_page_reorganize_low( ut_ad(mtr_memo_contains(mtr, block, MTR_MEMO_PAGE_X_FIX)); btr_assert_not_corrupted(block, index); + ut_ad(fil_page_index_page_check(block->frame)); + ut_ad(index->is_dummy + || block->page.id.space() == index->table->space->id); + ut_ad(index->is_dummy + || block->page.id.page_no() != index->page + || !page_has_siblings(page)); #ifdef UNIV_ZIP_DEBUG ut_a(!page_zip || page_zip_validate(page_zip, page, index)); #endif /* UNIV_ZIP_DEBUG */ data_size1 = page_get_data_size(page); max_ins_size1 = page_get_max_insert_size_after_reorganize(page, 1); - /* Turn logging off */ mtr_log_t log_mode = mtr_set_log_mode(mtr, MTR_LOG_NONE); @@ -1661,7 +1663,7 @@ btr_page_reorganize_low( || page_get_max_trx_id(page) == 0 || (dict_index_is_sec_or_ibuf(index) ? page_is_leaf(temp_page) - : page_is_root(temp_page))); + : block->page.id.page_no() == index->page)); /* If innodb_log_compressed_pages is ON, page reorganize should log the compressed page image.*/ @@ -1731,7 +1733,7 @@ func_exit: ut_a(!page_zip || page_zip_validate(page_zip, page, index)); #endif /* UNIV_ZIP_DEBUG */ - if (!recovery && page_is_root(temp_page) + if (!recovery && block->page.id.page_no() == index->page && fil_page_get_type(temp_page) == FIL_PAGE_TYPE_INSTANT) { /* Preserve the PAGE_INSTANT information. */ ut_ad(!page_zip); @@ -1904,6 +1906,8 @@ btr_page_empty( ut_ad(mtr_memo_contains(mtr, block, MTR_MEMO_PAGE_X_FIX)); ut_ad(page_zip == buf_block_get_page_zip(block)); + ut_ad(!index->is_dummy); + ut_ad(index->table->space->id == block->page.id.space()); #ifdef UNIV_ZIP_DEBUG ut_a(!page_zip || page_zip_validate(page_zip, page, index)); #endif /* UNIV_ZIP_DEBUG */ @@ -1916,7 +1920,8 @@ btr_page_empty( /* Preserve PAGE_ROOT_AUTO_INC when creating a clustered index root page. */ const ib_uint64_t autoinc - = dict_index_is_clust(index) && page_is_root(page) + = dict_index_is_clust(index) + && index->page == block->page.id.page_no() ? page_get_autoinc(page) : 0; @@ -4233,6 +4238,8 @@ btr_discard_only_page_on_level( ulint page_level = 0; trx_id_t max_trx_id; + ut_ad(!index->is_dummy); + /* Save the PAGE_MAX_TRX_ID from the leaf page. */ max_trx_id = page_get_max_trx_id(buf_block_get_frame(block)); @@ -4244,7 +4251,8 @@ btr_discard_only_page_on_level( ut_a(page_get_n_recs(page) == 1); ut_a(page_level == btr_page_get_level(page)); ut_a(!page_has_siblings(page)); - + ut_ad(fil_page_index_page_check(page)); + ut_ad(block->page.id.space() == index->table->space->id); ut_ad(mtr_memo_contains(mtr, block, MTR_MEMO_PAGE_X_FIX)); btr_search_drop_page_hash_index(block); @@ -4271,7 +4279,7 @@ btr_discard_only_page_on_level( /* block is the root page, which must be empty, except for the node pointer to the (now discarded) block(s). */ - ut_ad(page_is_root(block->frame)); + ut_ad(!page_has_siblings(block->frame)); #ifdef UNIV_BTR_DEBUG if (!dict_index_is_ibuf(index)) { diff --git a/storage/innobase/btr/btr0cur.cc b/storage/innobase/btr/btr0cur.cc index c8951f7e01c..65035fd20e7 100644 --- a/storage/innobase/btr/btr0cur.cc +++ b/storage/innobase/btr/btr0cur.cc @@ -3,7 +3,7 @@ Copyright (c) 1994, 2018, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2008, Google Inc. Copyright (c) 2012, Facebook Inc. -Copyright (c) 2015, 2018, MariaDB Corporation. +Copyright (c) 2015, 2019, MariaDB Corporation. Portions of this file contain modifications contributed and copyrighted by Google, Inc. Those modifications are gratefully acknowledged and are described @@ -557,7 +557,11 @@ index root page. @return whether the page is corrupted */ bool btr_cur_instant_root_init(dict_index_t* index, const page_t* page) { - ut_ad(page_is_root(page)); + ut_ad(!index->is_dummy); + ut_ad(fil_page_index_page_check(page)); + ut_ad(!page_has_siblings(page)); + ut_ad(page_get_space_id(page) == index->table->space_id); + ut_ad(page_get_page_no(page) == index->page); ut_ad(!page_is_comp(page) == !dict_table_is_comp(index->table)); ut_ad(index->is_primary()); ut_ad(!index->is_instant()); @@ -5441,14 +5445,14 @@ btr_cur_optimistic_delete_func( ut_ad(flags == 0 || flags == BTR_CREATE_FLAG); ut_ad(mtr_memo_contains(mtr, btr_cur_get_block(cursor), MTR_MEMO_PAGE_X_FIX)); - ut_ad(mtr_memo_contains(mtr, btr_cur_get_block(cursor), - MTR_MEMO_PAGE_X_FIX)); ut_ad(mtr->is_named_space(cursor->index->table->space)); + ut_ad(!cursor->index->is_dummy); /* This is intended only for leaf page deletions */ block = btr_cur_get_block(cursor); + ut_ad(block->page.id.space() == cursor->index->table->space->id); ut_ad(page_is_leaf(buf_block_get_frame(block))); ut_ad(!dict_index_is_online_ddl(cursor->index) || dict_index_is_clust(cursor->index) @@ -5456,7 +5460,7 @@ btr_cur_optimistic_delete_func( rec = btr_cur_get_rec(cursor); - if (UNIV_UNLIKELY(page_is_root(block->frame) + if (UNIV_UNLIKELY(block->page.id.page_no() == cursor->index->page && page_get_n_recs(block->frame) == 1 + (cursor->index->is_instant() && !rec_is_metadata(rec, cursor->index)))) { @@ -5635,6 +5639,8 @@ btr_cur_pessimistic_delete( | MTR_MEMO_SX_LOCK)); ut_ad(mtr_memo_contains(mtr, block, MTR_MEMO_PAGE_X_FIX)); ut_ad(mtr->is_named_space(index->table->space)); + ut_ad(!index->is_dummy); + ut_ad(block->page.id.space() == index->table->space->id); if (!has_reserved_extents) { /* First reserve enough free space for the file segments @@ -5688,7 +5694,7 @@ btr_cur_pessimistic_delete( lock_update_delete(block, rec); } - if (!page_is_root(page)) { + if (block->page.id.page_no() != index->page) { if (page_get_n_recs(page) < 2) { goto discard_page; } diff --git a/storage/innobase/btr/btr0defragment.cc b/storage/innobase/btr/btr0defragment.cc index e3c7ef8a768..a649256120c 100644 --- a/storage/innobase/btr/btr0defragment.cc +++ b/storage/innobase/btr/btr0defragment.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (C) 2013, 2014 Facebook, Inc. All Rights Reserved. -Copyright (C) 2014, 2018, MariaDB Corporation. +Copyright (C) 2014, 2019, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -181,7 +181,8 @@ btr_defragment_add_index( return NULL; } - ut_ad(page_is_root(page)); + ut_ad(fil_page_index_page_check(page)); + ut_ad(!page_has_siblings(page)); if (page_is_leaf(page)) { // Index root is a leaf page, no need to defragment. diff --git a/storage/innobase/btr/btr0pcur.cc b/storage/innobase/btr/btr0pcur.cc index d998ec70672..2cbc9767cb4 100644 --- a/storage/innobase/btr/btr0pcur.cc +++ b/storage/innobase/btr/btr0pcur.cc @@ -100,7 +100,6 @@ btr_pcur_store_position( buf_block_t* block; rec_t* rec; dict_index_t* index; - page_t* page; ulint offs; ut_ad(cursor->pos_state == BTR_PCUR_IS_POSITIONED); @@ -112,9 +111,8 @@ btr_pcur_store_position( page_cursor = btr_pcur_get_page_cur(cursor); rec = page_cur_get_rec(page_cursor); - page = page_align(rec); - offs = page_offset(rec); - + offs = rec - block->frame; + ut_ad(block->page.id.page_no() == page_get_page_no(block->frame)); ut_ad(block->page.buf_fix_count); /* For spatial index, when we do positioning on parent buffer if necessary, it might not hold latches, but the @@ -129,14 +127,14 @@ btr_pcur_store_position( cursor->old_stored = true; - if (page_is_empty(page)) { + if (page_is_empty(block->frame)) { /* It must be an empty index tree; NOTE that in this case we do not store the modify_clock, but always do a search if we restore the cursor position */ - ut_a(!page_has_siblings(page)); - ut_ad(page_is_leaf(page)); - ut_ad(page_get_page_no(page) == index->page); + ut_a(!page_has_siblings(block->frame)); + ut_ad(page_is_leaf(block->frame)); + ut_ad(block->page.id.page_no() == index->page); if (page_rec_is_supremum_low(offs)) { cursor->rel_pos = BTR_PCUR_AFTER_LAST_IN_TREE; @@ -159,10 +157,10 @@ before_first: rec = page_rec_get_next(rec); if (rec_is_metadata(rec, index)) { - ut_ad(!page_has_prev(page)); + ut_ad(!page_has_prev(block->frame)); rec = page_rec_get_next(rec); if (page_rec_is_supremum(rec)) { - ut_ad(page_has_next(page)); + ut_ad(page_has_next(block->frame)); goto before_first; } } diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc index 89fba217d85..ada9f2b6f5e 100644 --- a/storage/innobase/handler/ha_innodb.cc +++ b/storage/innobase/handler/ha_innodb.cc @@ -251,12 +251,6 @@ void set_my_errno(int err) errno = err; } -static uint omits_virtual_cols(const TABLE_SHARE &share) -{ - return share.frm_version < FRM_VER_EXPRESSSIONS && - share.virtual_fields; -} - /** Checks whether the file name belongs to a partition of a table. @param[in] file_name file name @return pointer to the end of the table name part of the file name, or NULL */ @@ -7302,7 +7296,8 @@ build_template_needs_field( { const Field* field = table->field[i]; - if (!field->stored_in_db() && omits_virtual_cols(*table->s)) { + if (!field->stored_in_db() + && ha_innobase::omits_virtual_cols(*table->s)) { return NULL; } @@ -7459,7 +7454,7 @@ build_template_field( &templ->rec_prefix_field_no); } } else { - ut_ad(!omits_virtual_cols(*table->s)); + DBUG_ASSERT(!ha_innobase::omits_virtual_cols(*table->s)); col = &dict_table_get_nth_v_col(index->table, v_no)->m_col; templ->clust_rec_field_no = v_no; templ->rec_prefix_field_no = ULINT_UNDEFINED; @@ -7848,7 +7843,8 @@ no_icp: contain = dict_index_contains_col_or_prefix( index, i - num_v, false); - } else if (dict_index_is_clust(index)) { + } else if (skip_virtual + || dict_index_is_clust(index)) { num_v++; continue; } else { @@ -8345,7 +8341,7 @@ calc_row_difference( trx_t* const trx = prebuilt->trx; doc_id_t doc_id = FTS_NULL_DOC_ID; ulint num_v = 0; - const bool skip_virtual = omits_virtual_cols(*table->s); + const bool skip_virtual = ha_innobase::omits_virtual_cols(*table->s); ut_ad(!srv_read_only_mode); @@ -10899,7 +10895,7 @@ create_table_info_t::create_table_def() /* Find out the number of virtual columns. */ ulint num_v = 0; - const bool omit_virtual = omits_virtual_cols(*m_form->s); + const bool omit_virtual = ha_innobase::omits_virtual_cols(*m_form->s); const ulint n_cols = omit_virtual ? m_form->s->stored_fields : m_form->s->fields; diff --git a/storage/innobase/handler/ha_innodb.h b/storage/innobase/handler/ha_innodb.h index 4cc99581c3e..945aeacfd20 100644 --- a/storage/innobase/handler/ha_innodb.h +++ b/storage/innobase/handler/ha_innodb.h @@ -22,6 +22,8 @@ this program; if not, write to the Free Software Foundation, Inc., # include "../../../wsrep/wsrep_api.h" #endif /* WITH_WSREP */ +#include "table.h" + /* The InnoDB handler: the interface between MySQL and InnoDB. */ /** "GEN_CLUST_INDEX" is the name reserved for InnoDB default @@ -422,8 +424,15 @@ public: Item* idx_cond_push(uint keyno, Item* idx_cond); /* @} */ -protected: + /** Check if InnoDB is not storing virtual column metadata for a table. + @param s table definition (based on .frm file) + @return whether InnoDB will omit virtual column metadata */ + static bool omits_virtual_cols(const TABLE_SHARE& s) + { + return s.frm_version<FRM_VER_EXPRESSSIONS && s.virtual_fields; + } +protected: /** MySQL calls this method at the end of each statement. This method exists for readability only, called from reset(). The name reset() @@ -440,7 +449,6 @@ protected: @see build_template() */ void reset_template(); -protected: inline void update_thd(THD* thd); void update_thd(); diff --git a/storage/innobase/handler/handler0alter.cc b/storage/innobase/handler/handler0alter.cc index c64287799de..96cef4eabd0 100644 --- a/storage/innobase/handler/handler0alter.cc +++ b/storage/innobase/handler/handler0alter.cc @@ -3294,7 +3294,8 @@ innobase_build_col_map( >= altered_table->s->fields + DATA_N_SYS_COLS); DBUG_ASSERT(dict_table_get_n_cols(old_table) + dict_table_get_n_v_cols(old_table) - >= table->s->fields + DATA_N_SYS_COLS); + >= table->s->fields + DATA_N_SYS_COLS + || ha_innobase::omits_virtual_cols(*table->s)); DBUG_ASSERT(!!defaults == !!(ha_alter_info->handler_flags & INNOBASE_DEFAULTS)); DBUG_ASSERT(!defaults || dtuple_get_n_fields(defaults) @@ -4428,7 +4429,9 @@ innobase_add_instant_try( } else if (page_rec_is_supremum(rec)) { empty_table: /* The table is empty. */ - ut_ad(page_is_root(block->frame)); + ut_ad(fil_page_index_page_check(block->frame)); + ut_ad(!page_has_siblings(block->frame)); + ut_ad(block->page.id.page_no() == index->page); btr_page_empty(block, NULL, index, 0, &mtr); index->remove_instant(); err = DB_SUCCESS; diff --git a/storage/innobase/include/page0page.h b/storage/innobase/include/page0page.h index 58115b767d2..e5113980c4c 100644 --- a/storage/innobase/include/page0page.h +++ b/storage/innobase/include/page0page.h @@ -1,6 +1,6 @@ /***************************************************************************** Copyright (c) 1994, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2013, 2018, MariaDB Corporation. +Copyright (c) 2013, 2019, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -732,9 +732,7 @@ page_rec_get_heap_no( /** Determine whether a page has any siblings. @param[in] page page frame @return true if the page has any siblings */ -inline -bool -page_has_siblings(const page_t* page) +inline bool page_has_siblings(const page_t* page) { compile_time_assert(!(FIL_PAGE_PREV % 8)); compile_time_assert(FIL_PAGE_NEXT == FIL_PAGE_PREV + 4); @@ -743,22 +741,10 @@ page_has_siblings(const page_t* page) != ~uint64_t(0); } -/** Determine whether a page is an index root page. -@param[in] page page frame -@return true if the page is a root page of an index */ -inline -bool -page_is_root(const page_t* page) -{ - return fil_page_index_page_check(page) && !page_has_siblings(page); -} - /** Determine whether a page has a predecessor. @param[in] page page frame @return true if the page has a predecessor */ -inline -bool -page_has_prev(const page_t* page) +inline bool page_has_prev(const page_t* page) { return *reinterpret_cast<const uint32_t*>(page + FIL_PAGE_PREV) != FIL_NULL; @@ -767,9 +753,7 @@ page_has_prev(const page_t* page) /** Determine whether a page has a successor. @param[in] page page frame @return true if the page has a successor */ -inline -bool -page_has_next(const page_t* page) +inline bool page_has_next(const page_t* page) { return *reinterpret_cast<const uint32_t*>(page + FIL_PAGE_NEXT) != FIL_NULL; diff --git a/storage/innobase/include/page0page.ic b/storage/innobase/include/page0page.ic index 307803367c0..224e5b08985 100644 --- a/storage/innobase/include/page0page.ic +++ b/storage/innobase/include/page0page.ic @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1994, 2015, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2016, 2018, MariaDB Corporation. +Copyright (c) 2016, 2019, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -91,7 +91,8 @@ UNIV_INLINE ib_uint64_t page_get_autoinc(const page_t* page) { - ut_ad(page_is_root(page)); + ut_ad(fil_page_index_page_check(page)); + ut_ad(!page_has_siblings(page)); return(mach_read_from_8(PAGE_HEADER + PAGE_ROOT_AUTO_INC + page)); } @@ -172,6 +173,7 @@ page_header_set_field( { ut_ad(page); ut_ad(field <= PAGE_N_RECS); + ut_ad(field != PAGE_N_RECS || val); ut_ad(field == PAGE_N_HEAP || val < srv_page_size); ut_ad(field != PAGE_N_HEAP || (val & 0x7fff) < srv_page_size); diff --git a/storage/innobase/page/page0cur.cc b/storage/innobase/page/page0cur.cc index b4775d19e1d..d545a004002 100644 --- a/storage/innobase/page/page0cur.cc +++ b/storage/innobase/page/page0cur.cc @@ -2,7 +2,7 @@ Copyright (c) 1994, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2012, Facebook Inc. -Copyright (c) 2018, MariaDB Corporation. +Copyright (c) 2018, 2019, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -1988,12 +1988,14 @@ page_parse_copy_rec_list_to_created_page( return(rec_end); } + ut_ad(fil_page_index_page_check(block->frame)); /* This function is never invoked on the clustered index root page, except in the redo log apply of page_copy_rec_list_end_to_created_page() which was logged by. page_copy_rec_list_to_created_page_write_log(). For other pages, this field must be zero-initialized. */ - ut_ad(!page_get_instant(block->frame) || page_is_root(block->frame)); + ut_ad(!page_get_instant(block->frame) + || !page_has_siblings(block->frame)); while (ptr < rec_end) { ptr = page_cur_parse_insert_rec(TRUE, ptr, end_ptr, @@ -2049,9 +2051,10 @@ page_copy_rec_list_end_to_created_page( ut_ad(page_dir_get_n_heap(new_page) == PAGE_HEAP_NO_USER_LOW); ut_ad(page_align(rec) != new_page); ut_ad(page_rec_is_comp(rec) == page_is_comp(new_page)); + ut_ad(fil_page_index_page_check(new_page)); /* This function is never invoked on the clustered index root page, except in btr_lift_page_up(). */ - ut_ad(!page_get_instant(new_page) || page_is_root(new_page)); + ut_ad(!page_get_instant(new_page) || !page_has_siblings(new_page)); if (page_rec_is_infimum(rec)) { @@ -2144,6 +2147,8 @@ page_copy_rec_list_end_to_created_page( rec = page_rec_get_next(rec); } while (!page_rec_is_supremum(rec)); + ut_ad(n_recs); + if ((slot_index > 0) && (count + 1 + (PAGE_DIR_SLOT_MAX_N_OWNED + 1) / 2 <= PAGE_DIR_SLOT_MAX_N_OWNED)) { diff --git a/storage/innobase/page/page0page.cc b/storage/innobase/page/page0page.cc index f56d944697f..8c146948b2c 100644 --- a/storage/innobase/page/page0page.cc +++ b/storage/innobase/page/page0page.cc @@ -2,7 +2,7 @@ Copyright (c) 1994, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2012, Facebook Inc. -Copyright (c) 2017, 2018, MariaDB Corporation. +Copyright (c) 2017, 2019, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -525,6 +525,8 @@ page_create_empty( page_zip_des_t* page_zip= buf_block_get_page_zip(block); ut_ad(fil_page_index_page_check(page)); + ut_ad(!index->is_dummy); + ut_ad(block->page.id.space() == index->table->space->id); /* Multiple transactions cannot simultaneously operate on the same temp-table in parallel. @@ -535,7 +537,7 @@ page_create_empty( && page_is_leaf(page)) { max_trx_id = page_get_max_trx_id(page); ut_ad(max_trx_id); - } else if (page_is_root(page)) { + } else if (block->page.id.page_no() == index->page) { /* Preserve PAGE_ROOT_AUTO_INC. */ max_trx_id = page_get_max_trx_id(page); } else { @@ -1231,6 +1233,7 @@ delete_all: page_header_set_field(page, NULL, PAGE_GARBAGE, size + page_header_get_field(page, PAGE_GARBAGE)); + ut_ad(page_get_n_recs(page) > n_recs); page_header_set_field(page, NULL, PAGE_N_RECS, (ulint)(page_get_n_recs(page) - n_recs)); } diff --git a/storage/innobase/page/page0zip.cc b/storage/innobase/page/page0zip.cc index 05889b617bc..8b07b2b953d 100644 --- a/storage/innobase/page/page0zip.cc +++ b/storage/innobase/page/page0zip.cc @@ -2,7 +2,7 @@ Copyright (c) 2005, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2012, Facebook Inc. -Copyright (c) 2014, 2018, MariaDB Corporation. +Copyright (c) 2014, 2019, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -4524,10 +4524,12 @@ page_zip_dir_delete( slot_rec = page_zip_dir_find(page_zip, page_offset(rec)); ut_a(slot_rec); - + uint16_t n_recs = page_get_n_recs(page); + ut_ad(n_recs); + ut_ad(n_recs > 1 || page_get_page_no(page) == index->page); /* This could not be done before page_zip_dir_find(). */ page_header_set_field(page, page_zip, PAGE_N_RECS, - (ulint)(page_get_n_recs(page) - 1)); + n_recs - 1); if (UNIV_UNLIKELY(!free)) { /* Make the last slot the start of the free list. */ @@ -4801,7 +4803,7 @@ page_zip_reorganize( clustered index root pages. */ ut_ad(page_get_max_trx_id(page) == 0 || (dict_index_is_clust(index) - ? page_is_root(temp_page) + ? !page_has_siblings(temp_page) : page_is_leaf(temp_page))); /* Restore logging. */ diff --git a/storage/innobase/row/row0import.cc b/storage/innobase/row/row0import.cc index 9174a922cdb..20c4b613064 100644 --- a/storage/innobase/row/row0import.cc +++ b/storage/innobase/row/row0import.cc @@ -661,7 +661,7 @@ dberr_t FetchIndexRootPages::operator()(buf_block_t* block) UNIV_NOTHROW return set_current_xdes(block->page.id.page_no(), page); } else if (fil_page_index_page_check(page) && !is_free(block->page.id.page_no()) - && page_is_root(page)) { + && !page_has_siblings(page)) { index_id_t id = btr_page_get_index_id(page); @@ -1819,9 +1819,9 @@ PageConverter::update_index_page( page, m_page_zip_ptr, m_index->m_srv_index->id, 0); if (dict_index_is_clust(m_index->m_srv_index)) { - if (page_is_root(page)) { - dict_index_t* index = const_cast<dict_index_t*>( - m_index->m_srv_index); + dict_index_t* index = const_cast<dict_index_t*>( + m_index->m_srv_index); + if (block->page.id.page_no() == index->page) { /* Preserve the PAGE_ROOT_AUTO_INC. */ if (index->table->supports_instant()) { if (btr_cur_instant_root_init(index, page)) { @@ -1855,7 +1855,7 @@ PageConverter::update_index_page( if (page_is_empty(page)) { /* Only a root page can be empty. */ - if (!page_is_root(page)) { + if (page_has_siblings(page)) { // TODO: We should relax this and skip secondary // indexes. Mark them as corrupt because they can // always be rebuilt. diff --git a/storage/innobase/row/row0log.cc b/storage/innobase/row/row0log.cc index 6594340a529..bfa7d1e378f 100644 --- a/storage/innobase/row/row0log.cc +++ b/storage/innobase/row/row0log.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 2011, 2018, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2017, 2018, MariaDB Corporation. +Copyright (c) 2017, 2019, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -963,7 +963,8 @@ row_log_table_low( break; case FIL_PAGE_TYPE_INSTANT: ut_ad(index->is_instant()); - ut_ad(page_is_root(page_align(rec))); + ut_ad(!page_has_siblings(page_align(rec))); + ut_ad(page_get_page_no(page_align(rec)) == index->page); break; default: ut_ad(!"wrong page type"); |