Merge 10.2 into 10.3

This commit is contained in:
Marko Mäkelä 2019-03-25 11:02:03 +02:00
commit c3a6c683e2
24 changed files with 129 additions and 109 deletions

View File

@ -25,7 +25,8 @@ ENDIF()
MESSAGE(STATUS "Running cmake version ${CMAKE_VERSION}") 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. # Use a default manufacturer if no manufacturer was identified.
IF(NOT DEFINED MANUFACTURER) IF(NOT DEFINED MANUFACTURER)

View File

@ -50,7 +50,11 @@ endif()
# load the original CPackRPM.cmake # load the original CPackRPM.cmake
set(orig_CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH}) set(orig_CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH})
unset(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}) set(CMAKE_MODULE_PATH ${orig_CMAKE_MODULE_PATH})
restore(LICENSE) restore(LICENSE)

View File

@ -87,6 +87,7 @@ IF(FEATURE_SET)
ENDIF() ENDIF()
SET(WITH_INNODB_SNAPPY OFF CACHE STRING "") SET(WITH_INNODB_SNAPPY OFF CACHE STRING "")
SET(WITH_NUMA 0 CACHE BOOL "")
IF(WIN32) IF(WIN32)
SET(INSTALL_MYSQLTESTDIR "" CACHE STRING "") SET(INSTALL_MYSQLTESTDIR "" CACHE STRING "")
SET(INSTALL_SQLBENCHDIR "" CACHE STRING "") SET(INSTALL_SQLBENCHDIR "" CACHE STRING "")
@ -96,18 +97,15 @@ ELSEIF(RPM)
SET(WITH_ZLIB system CACHE STRING "") SET(WITH_ZLIB system CACHE STRING "")
SET(CHECKMODULE /usr/bin/checkmodule CACHE STRING "") SET(CHECKMODULE /usr/bin/checkmodule CACHE STRING "")
SET(SEMODULE_PACKAGE /usr/bin/semodule_package CACHE STRING "") SET(SEMODULE_PACKAGE /usr/bin/semodule_package CACHE STRING "")
SET(WITH_LIBARCHIVE ON CACHE STRING "")
ELSEIF(DEB) ELSEIF(DEB)
SET(WITH_SSL system CACHE STRING "") SET(WITH_SSL system CACHE STRING "")
SET(WITH_ZLIB system CACHE STRING "") SET(WITH_ZLIB system CACHE STRING "")
SET(WITH_LIBWRAP ON) SET(WITH_LIBWRAP ON)
SET(HAVE_EMBEDDED_PRIVILEGE_CONTROL ON) SET(HAVE_EMBEDDED_PRIVILEGE_CONTROL ON)
SET(WITH_LIBARCHIVE ON CACHE STRING "")
ELSE() ELSE()
SET(WITH_SSL bundled CACHE STRING "") SET(WITH_SSL bundled CACHE STRING "")
SET(WITH_ZLIB bundled CACHE STRING "") SET(WITH_ZLIB bundled CACHE STRING "")
SET(WITH_JEMALLOC static CACHE STRING "") SET(WITH_JEMALLOC static CACHE STRING "")
SET(WITH_LIBARCHIVE STATIC CACHE STRING "")
ENDIF() ENDIF()
IF(NOT COMPILATION_COMMENT) IF(NOT COMPILATION_COMMENT)

View File

@ -434,7 +434,7 @@ drop table t1;
# #
create table t1 (a int); create table t1 (a int);
create or replace table t1 (a int default b, b int default a); 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; show create table t1;
ERROR 42S02: Table 'test.t1' doesn't exist 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 as (a));
create or replace table t1 (a int not null, b int default (a+1)); create or replace table t1 (a int not null, b int default (a+1));
create or replace table t1 (a int default a); 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 b, b int default (1+1));
create or replace table t1 (a int default 1, b int as (c), c int as (a+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))); 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))); 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); 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 # Allow defaults to refer to not default fields
# #
@ -519,7 +519,7 @@ Got one of the listed errors
CREATE TABLE t1 (a INT DEFAULT(?)); CREATE TABLE t1 (a INT DEFAULT(?));
Got one of the listed errors Got one of the listed errors
CREATE TABLE t1 (a INT DEFAULT (b), b INT DEFAULT(a)); 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')); 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` ERROR HY000: Function or expression 'name_const()' cannot be used in the DEFAULT clause of `a`
CREATE TABLE t1 (a INT DEFAULT COUNT(*)); 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 4 5 5 the value of the DEFAULT(a), that is b
drop table t1; drop table t1;
create table t1 (col1 int default(-(default(col1)))); 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))))); create table t1 (col int default (yearweek((exp(710)))));
ERROR 22003: DOUBLE value is out of range in 'exp(710)' ERROR 22003: DOUBLE value is out of range in 'exp(710)'
# #

View File

@ -255,9 +255,9 @@ a b c
4 -4 -3 4 -4 -3
drop table t1; drop table t1;
create table t1 (a int, b int generated always as(-b) virtual, c int generated always as (b + 1) virtual); 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); 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); 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` 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 # 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() # THD->CHANGE_LIST.IS_EMPTY()
# #
CREATE TABLE t1(a bigint AS (a between 1 and 1)); 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 # Bug#20757211: GENERATED COLUMNS: ALTER TABLE CRASHES
# IN FIND_FIELD_IN_TABLE # IN FIND_FIELD_IN_TABLE
# #

View File

@ -255,9 +255,9 @@ a b c
4 -4 -3 4 -4 -3
drop table t1; drop table t1;
create table t1 (a int, b int generated always as(-b) virtual, c int generated always as (b + 1) virtual); 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); 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); 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` 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 # 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() # THD->CHANGE_LIST.IS_EMPTY()
# #
CREATE TABLE t1(a bigint AS (a between 1 and 1)); 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 # Bug#20757211: GENERATED COLUMNS: ALTER TABLE CRASHES
# IN FIND_FIELD_IN_TABLE # IN FIND_FIELD_IN_TABLE
# #

View File

@ -316,7 +316,7 @@ drop table t1;
# MDEV-5611: self-referencing virtual column # MDEV-5611: self-referencing virtual column
# #
create table t1 (a int, b int as (b is null) virtual); 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); create table t1 (a int as (1+1), b int as (a is null) virtual);
drop table t1; drop table t1;
# end of 5.3 tests # end of 5.3 tests

View File

@ -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: Fields are initialized in this order:
- All fields that have default value as a constant are initialized first. - All fields that have default value as a constant are initialized first.

View File

@ -7623,7 +7623,7 @@ ER_ERROR_EVALUATING_EXPRESSION
ER_CALCULATING_DEFAULT_VALUE ER_CALCULATING_DEFAULT_VALUE
eng "Got an error when calculating default value for %`s" eng "Got an error when calculating default value for %`s"
ER_EXPRESSION_REFERS_TO_UNINIT_FIELD 01000 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 ER_PARTITION_DEFAULT_ERROR
eng "Only one DEFAULT partition allowed" eng "Only one DEFAULT partition allowed"
ukr "Припустимо мати тільки один DEFAULT розділ" ukr "Припустимо мати тільки один DEFAULT розділ"

View File

@ -1132,7 +1132,7 @@ bool parse_vcol_defs(THD *thd, MEM_ROOT *mem_root, TABLE *table,
if (check_constraint_ptr) if (check_constraint_ptr)
*check_constraint_ptr= 0; *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++) for (field_ptr= table->field; *field_ptr; field_ptr++)
{ {
Field *field= *field_ptr; Field *field= *field_ptr;

View File

@ -2,7 +2,7 @@
Copyright (c) 1994, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 1994, 2016, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2012, Facebook Inc. 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 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 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 = buf_block_get_frame(block);
page_zip = buf_block_get_page_zip(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; err = DB_CORRUPTION;
} else if (dict_index_is_clust(index)) { } else if (dict_index_is_clust(index)) {
@ -1161,11 +1160,11 @@ btr_free_root_check(
buf_block_dbg_add_level(block, SYNC_TREE_NODE); buf_block_dbg_add_level(block, SYNC_TREE_NODE);
if (fil_page_index_page_check(block->frame) 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. /* This should be a root page.
It should not be possible to reassign the same It should not be possible to reassign the same
index_id for some other index in the tablespace. */ index_id for some other index in the tablespace. */
ut_ad(page_is_root(block->frame)); ut_ad(!page_has_siblings(block->frame));
} else { } else {
block = NULL; block = NULL;
} }
@ -1356,7 +1355,8 @@ btr_free_but_not_root(
ibool finished; ibool finished;
mtr_t mtr; 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: leaf_loop:
mtr_start(&mtr); mtr_start(&mtr);
mtr_set_log_mode(&mtr, log_mode); mtr_set_log_mode(&mtr, log_mode);
@ -1427,7 +1427,6 @@ btr_free_if_exists(
return; return;
} }
ut_ad(page_is_root(root->frame));
btr_free_but_not_root(root, mtr->get_log_mode()); btr_free_but_not_root(root, mtr->get_log_mode());
mtr->set_named_space_id(page_id.space()); mtr->set_named_space_id(page_id.space());
btr_free_root(root, mtr); btr_free_root(root, mtr);
@ -1450,8 +1449,6 @@ btr_free(
page_id, page_size, RW_X_LATCH, &mtr); page_id, page_size, RW_X_LATCH, &mtr);
if (block) { if (block) {
ut_ad(page_is_root(block->frame));
btr_free_but_not_root(block, MTR_LOG_NO_REDO); btr_free_but_not_root(block, MTR_LOG_NO_REDO);
btr_free_root(block, &mtr); 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)); ut_ad(mtr_memo_contains(mtr, block, MTR_MEMO_PAGE_X_FIX));
btr_assert_not_corrupted(block, index); 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 #ifdef UNIV_ZIP_DEBUG
ut_a(!page_zip || page_zip_validate(page_zip, page, index)); ut_a(!page_zip || page_zip_validate(page_zip, page, index));
#endif /* UNIV_ZIP_DEBUG */ #endif /* UNIV_ZIP_DEBUG */
data_size1 = page_get_data_size(page); data_size1 = page_get_data_size(page);
max_ins_size1 = page_get_max_insert_size_after_reorganize(page, 1); max_ins_size1 = page_get_max_insert_size_after_reorganize(page, 1);
/* Turn logging off */ /* Turn logging off */
mtr_log_t log_mode = mtr_set_log_mode(mtr, MTR_LOG_NONE); 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 || page_get_max_trx_id(page) == 0
|| (dict_index_is_sec_or_ibuf(index) || (dict_index_is_sec_or_ibuf(index)
? page_is_leaf(temp_page) ? 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 /* If innodb_log_compressed_pages is ON, page reorganize should log the
compressed page image.*/ compressed page image.*/
@ -1731,7 +1733,7 @@ func_exit:
ut_a(!page_zip || page_zip_validate(page_zip, page, index)); ut_a(!page_zip || page_zip_validate(page_zip, page, index));
#endif /* UNIV_ZIP_DEBUG */ #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) { && fil_page_get_type(temp_page) == FIL_PAGE_TYPE_INSTANT) {
/* Preserve the PAGE_INSTANT information. */ /* Preserve the PAGE_INSTANT information. */
ut_ad(!page_zip); 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(mtr_memo_contains(mtr, block, MTR_MEMO_PAGE_X_FIX));
ut_ad(page_zip == buf_block_get_page_zip(block)); 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 #ifdef UNIV_ZIP_DEBUG
ut_a(!page_zip || page_zip_validate(page_zip, page, index)); ut_a(!page_zip || page_zip_validate(page_zip, page, index));
#endif /* UNIV_ZIP_DEBUG */ #endif /* UNIV_ZIP_DEBUG */
@ -1916,7 +1920,8 @@ btr_page_empty(
/* Preserve PAGE_ROOT_AUTO_INC when creating a clustered index /* Preserve PAGE_ROOT_AUTO_INC when creating a clustered index
root page. */ root page. */
const ib_uint64_t autoinc 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) ? page_get_autoinc(page)
: 0; : 0;
@ -4233,6 +4238,8 @@ btr_discard_only_page_on_level(
ulint page_level = 0; ulint page_level = 0;
trx_id_t max_trx_id; trx_id_t max_trx_id;
ut_ad(!index->is_dummy);
/* Save the PAGE_MAX_TRX_ID from the leaf page. */ /* Save the PAGE_MAX_TRX_ID from the leaf page. */
max_trx_id = page_get_max_trx_id(buf_block_get_frame(block)); 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_get_n_recs(page) == 1);
ut_a(page_level == btr_page_get_level(page)); ut_a(page_level == btr_page_get_level(page));
ut_a(!page_has_siblings(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)); ut_ad(mtr_memo_contains(mtr, block, MTR_MEMO_PAGE_X_FIX));
btr_search_drop_page_hash_index(block); 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 /* block is the root page, which must be empty, except
for the node pointer to the (now discarded) block(s). */ 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 #ifdef UNIV_BTR_DEBUG
if (!dict_index_is_ibuf(index)) { if (!dict_index_is_ibuf(index)) {

View File

@ -3,7 +3,7 @@
Copyright (c) 1994, 2018, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 1994, 2018, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2008, Google Inc. Copyright (c) 2008, Google Inc.
Copyright (c) 2012, Facebook 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 Portions of this file contain modifications contributed and copyrighted by
Google, Inc. Those modifications are gratefully acknowledged and are described Google, Inc. Those modifications are gratefully acknowledged and are described
@ -557,7 +557,11 @@ index root page.
@return whether the page is corrupted */ @return whether the page is corrupted */
bool btr_cur_instant_root_init(dict_index_t* index, const page_t* page) 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(!page_is_comp(page) == !dict_table_is_comp(index->table));
ut_ad(index->is_primary()); ut_ad(index->is_primary());
ut_ad(!index->is_instant()); ut_ad(!index->is_instant());
@ -5441,14 +5445,14 @@ btr_cur_optimistic_delete_func(
ut_ad(flags == 0 || flags == BTR_CREATE_FLAG); ut_ad(flags == 0 || flags == BTR_CREATE_FLAG);
ut_ad(mtr_memo_contains(mtr, btr_cur_get_block(cursor), ut_ad(mtr_memo_contains(mtr, btr_cur_get_block(cursor),
MTR_MEMO_PAGE_X_FIX)); 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(mtr->is_named_space(cursor->index->table->space));
ut_ad(!cursor->index->is_dummy);
/* This is intended only for leaf page deletions */ /* This is intended only for leaf page deletions */
block = btr_cur_get_block(cursor); 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(page_is_leaf(buf_block_get_frame(block)));
ut_ad(!dict_index_is_online_ddl(cursor->index) ut_ad(!dict_index_is_online_ddl(cursor->index)
|| dict_index_is_clust(cursor->index) || dict_index_is_clust(cursor->index)
@ -5456,7 +5460,7 @@ btr_cur_optimistic_delete_func(
rec = btr_cur_get_rec(cursor); 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 && page_get_n_recs(block->frame) == 1
+ (cursor->index->is_instant() + (cursor->index->is_instant()
&& !rec_is_metadata(rec, cursor->index)))) { && !rec_is_metadata(rec, cursor->index)))) {
@ -5635,6 +5639,8 @@ btr_cur_pessimistic_delete(
| MTR_MEMO_SX_LOCK)); | MTR_MEMO_SX_LOCK));
ut_ad(mtr_memo_contains(mtr, block, MTR_MEMO_PAGE_X_FIX)); ut_ad(mtr_memo_contains(mtr, block, MTR_MEMO_PAGE_X_FIX));
ut_ad(mtr->is_named_space(index->table->space)); 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) { if (!has_reserved_extents) {
/* First reserve enough free space for the file segments /* First reserve enough free space for the file segments
@ -5688,7 +5694,7 @@ btr_cur_pessimistic_delete(
lock_update_delete(block, rec); 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) { if (page_get_n_recs(page) < 2) {
goto discard_page; goto discard_page;
} }

View File

@ -1,7 +1,7 @@
/***************************************************************************** /*****************************************************************************
Copyright (C) 2013, 2014 Facebook, Inc. All Rights Reserved. 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 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 the terms of the GNU General Public License as published by the Free Software
@ -181,7 +181,8 @@ btr_defragment_add_index(
return NULL; 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)) { if (page_is_leaf(page)) {
// Index root is a leaf page, no need to defragment. // Index root is a leaf page, no need to defragment.

View File

@ -100,7 +100,6 @@ btr_pcur_store_position(
buf_block_t* block; buf_block_t* block;
rec_t* rec; rec_t* rec;
dict_index_t* index; dict_index_t* index;
page_t* page;
ulint offs; ulint offs;
ut_ad(cursor->pos_state == BTR_PCUR_IS_POSITIONED); 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); page_cursor = btr_pcur_get_page_cur(cursor);
rec = page_cur_get_rec(page_cursor); rec = page_cur_get_rec(page_cursor);
page = page_align(rec); offs = rec - block->frame;
offs = page_offset(rec); ut_ad(block->page.id.page_no() == page_get_page_no(block->frame));
ut_ad(block->page.buf_fix_count); ut_ad(block->page.buf_fix_count);
/* For spatial index, when we do positioning on parent /* For spatial index, when we do positioning on parent
buffer if necessary, it might not hold latches, but the buffer if necessary, it might not hold latches, but the
@ -129,14 +127,14 @@ btr_pcur_store_position(
cursor->old_stored = true; 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 /* It must be an empty index tree; NOTE that in this case
we do not store the modify_clock, but always do a search we do not store the modify_clock, but always do a search
if we restore the cursor position */ if we restore the cursor position */
ut_a(!page_has_siblings(page)); ut_a(!page_has_siblings(block->frame));
ut_ad(page_is_leaf(page)); ut_ad(page_is_leaf(block->frame));
ut_ad(page_get_page_no(page) == index->page); ut_ad(block->page.id.page_no() == index->page);
if (page_rec_is_supremum_low(offs)) { if (page_rec_is_supremum_low(offs)) {
cursor->rel_pos = BTR_PCUR_AFTER_LAST_IN_TREE; cursor->rel_pos = BTR_PCUR_AFTER_LAST_IN_TREE;
@ -159,10 +157,10 @@ before_first:
rec = page_rec_get_next(rec); rec = page_rec_get_next(rec);
if (rec_is_metadata(rec, index)) { 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); rec = page_rec_get_next(rec);
if (page_rec_is_supremum(rec)) { if (page_rec_is_supremum(rec)) {
ut_ad(page_has_next(page)); ut_ad(page_has_next(block->frame));
goto before_first; goto before_first;
} }
} }

View File

@ -251,12 +251,6 @@ void set_my_errno(int err)
errno = 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. /** Checks whether the file name belongs to a partition of a table.
@param[in] file_name file name @param[in] file_name file name
@return pointer to the end of the table name part of the file name, or NULL */ @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]; 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; return NULL;
} }
@ -7459,7 +7454,7 @@ build_template_field(
&templ->rec_prefix_field_no); &templ->rec_prefix_field_no);
} }
} else { } 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; col = &dict_table_get_nth_v_col(index->table, v_no)->m_col;
templ->clust_rec_field_no = v_no; templ->clust_rec_field_no = v_no;
templ->rec_prefix_field_no = ULINT_UNDEFINED; templ->rec_prefix_field_no = ULINT_UNDEFINED;
@ -7848,7 +7843,8 @@ no_icp:
contain = dict_index_contains_col_or_prefix( contain = dict_index_contains_col_or_prefix(
index, i - num_v, index, i - num_v,
false); false);
} else if (dict_index_is_clust(index)) { } else if (skip_virtual
|| dict_index_is_clust(index)) {
num_v++; num_v++;
continue; continue;
} else { } else {
@ -8345,7 +8341,7 @@ calc_row_difference(
trx_t* const trx = prebuilt->trx; trx_t* const trx = prebuilt->trx;
doc_id_t doc_id = FTS_NULL_DOC_ID; doc_id_t doc_id = FTS_NULL_DOC_ID;
ulint num_v = 0; 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); ut_ad(!srv_read_only_mode);
@ -10899,7 +10895,7 @@ create_table_info_t::create_table_def()
/* Find out the number of virtual columns. */ /* Find out the number of virtual columns. */
ulint num_v = 0; 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 const ulint n_cols = omit_virtual
? m_form->s->stored_fields : m_form->s->fields; ? m_form->s->stored_fields : m_form->s->fields;

View File

@ -22,6 +22,8 @@ this program; if not, write to the Free Software Foundation, Inc.,
# include "../../../wsrep/wsrep_api.h" # include "../../../wsrep/wsrep_api.h"
#endif /* WITH_WSREP */ #endif /* WITH_WSREP */
#include "table.h"
/* The InnoDB handler: the interface between MySQL and InnoDB. */ /* The InnoDB handler: the interface between MySQL and InnoDB. */
/** "GEN_CLUST_INDEX" is the name reserved for InnoDB default /** "GEN_CLUST_INDEX" is the name reserved for InnoDB default
@ -422,8 +424,15 @@ public:
Item* idx_cond_push(uint keyno, Item* idx_cond); 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 MySQL calls this method at the end of each statement. This method
exists for readability only, called from reset(). The name reset() exists for readability only, called from reset(). The name reset()
@ -440,7 +449,6 @@ protected:
@see build_template() */ @see build_template() */
void reset_template(); void reset_template();
protected:
inline void update_thd(THD* thd); inline void update_thd(THD* thd);
void update_thd(); void update_thd();

View File

@ -3294,7 +3294,8 @@ innobase_build_col_map(
>= altered_table->s->fields + DATA_N_SYS_COLS); >= altered_table->s->fields + DATA_N_SYS_COLS);
DBUG_ASSERT(dict_table_get_n_cols(old_table) DBUG_ASSERT(dict_table_get_n_cols(old_table)
+ dict_table_get_n_v_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 DBUG_ASSERT(!!defaults == !!(ha_alter_info->handler_flags
& INNOBASE_DEFAULTS)); & INNOBASE_DEFAULTS));
DBUG_ASSERT(!defaults || dtuple_get_n_fields(defaults) DBUG_ASSERT(!defaults || dtuple_get_n_fields(defaults)
@ -4428,7 +4429,9 @@ innobase_add_instant_try(
} else if (page_rec_is_supremum(rec)) { } else if (page_rec_is_supremum(rec)) {
empty_table: empty_table:
/* The table is empty. */ /* 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); btr_page_empty(block, NULL, index, 0, &mtr);
index->remove_instant(); index->remove_instant();
err = DB_SUCCESS; err = DB_SUCCESS;

View File

@ -1,6 +1,6 @@
/***************************************************************************** /*****************************************************************************
Copyright (c) 1994, 2016, Oracle and/or its affiliates. All Rights Reserved. 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 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 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. /** Determine whether a page has any siblings.
@param[in] page page frame @param[in] page page frame
@return true if the page has any siblings */ @return true if the page has any siblings */
inline inline bool page_has_siblings(const page_t* page)
bool
page_has_siblings(const page_t* page)
{ {
compile_time_assert(!(FIL_PAGE_PREV % 8)); compile_time_assert(!(FIL_PAGE_PREV % 8));
compile_time_assert(FIL_PAGE_NEXT == FIL_PAGE_PREV + 4); compile_time_assert(FIL_PAGE_NEXT == FIL_PAGE_PREV + 4);
@ -743,22 +741,10 @@ page_has_siblings(const page_t* page)
!= ~uint64_t(0); != ~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. /** Determine whether a page has a predecessor.
@param[in] page page frame @param[in] page page frame
@return true if the page has a predecessor */ @return true if the page has a predecessor */
inline inline bool page_has_prev(const page_t* page)
bool
page_has_prev(const page_t* page)
{ {
return *reinterpret_cast<const uint32_t*>(page + FIL_PAGE_PREV) return *reinterpret_cast<const uint32_t*>(page + FIL_PAGE_PREV)
!= FIL_NULL; != FIL_NULL;
@ -767,9 +753,7 @@ page_has_prev(const page_t* page)
/** Determine whether a page has a successor. /** Determine whether a page has a successor.
@param[in] page page frame @param[in] page page frame
@return true if the page has a successor */ @return true if the page has a successor */
inline inline bool page_has_next(const page_t* page)
bool
page_has_next(const page_t* page)
{ {
return *reinterpret_cast<const uint32_t*>(page + FIL_PAGE_NEXT) return *reinterpret_cast<const uint32_t*>(page + FIL_PAGE_NEXT)
!= FIL_NULL; != FIL_NULL;

View File

@ -1,7 +1,7 @@
/***************************************************************************** /*****************************************************************************
Copyright (c) 1994, 2015, Oracle and/or its affiliates. All Rights Reserved. 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 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 the terms of the GNU General Public License as published by the Free Software
@ -91,7 +91,8 @@ UNIV_INLINE
ib_uint64_t ib_uint64_t
page_get_autoinc(const page_t* page) 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)); 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(page);
ut_ad(field <= PAGE_N_RECS); 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 < srv_page_size);
ut_ad(field != PAGE_N_HEAP || (val & 0x7fff) < srv_page_size); ut_ad(field != PAGE_N_HEAP || (val & 0x7fff) < srv_page_size);

View File

@ -2,7 +2,7 @@
Copyright (c) 1994, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 1994, 2016, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2012, Facebook Inc. 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 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 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); return(rec_end);
} }
ut_ad(fil_page_index_page_check(block->frame));
/* This function is never invoked on the clustered index root page, /* This function is never invoked on the clustered index root page,
except in the redo log apply of except in the redo log apply of
page_copy_rec_list_end_to_created_page() which was logged by. page_copy_rec_list_end_to_created_page() which was logged by.
page_copy_rec_list_to_created_page_write_log(). page_copy_rec_list_to_created_page_write_log().
For other pages, this field must be zero-initialized. */ 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) { while (ptr < rec_end) {
ptr = page_cur_parse_insert_rec(TRUE, ptr, end_ptr, 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_dir_get_n_heap(new_page) == PAGE_HEAP_NO_USER_LOW);
ut_ad(page_align(rec) != new_page); ut_ad(page_align(rec) != new_page);
ut_ad(page_rec_is_comp(rec) == page_is_comp(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, /* This function is never invoked on the clustered index root page,
except in btr_lift_page_up(). */ 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)) { if (page_rec_is_infimum(rec)) {
@ -2144,6 +2147,8 @@ page_copy_rec_list_end_to_created_page(
rec = page_rec_get_next(rec); rec = page_rec_get_next(rec);
} while (!page_rec_is_supremum(rec)); } while (!page_rec_is_supremum(rec));
ut_ad(n_recs);
if ((slot_index > 0) && (count + 1 if ((slot_index > 0) && (count + 1
+ (PAGE_DIR_SLOT_MAX_N_OWNED + 1) / 2 + (PAGE_DIR_SLOT_MAX_N_OWNED + 1) / 2
<= PAGE_DIR_SLOT_MAX_N_OWNED)) { <= PAGE_DIR_SLOT_MAX_N_OWNED)) {

View File

@ -2,7 +2,7 @@
Copyright (c) 1994, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 1994, 2016, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2012, Facebook Inc. 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 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 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); page_zip_des_t* page_zip= buf_block_get_page_zip(block);
ut_ad(fil_page_index_page_check(page)); 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 /* Multiple transactions cannot simultaneously operate on the
same temp-table in parallel. same temp-table in parallel.
@ -535,7 +537,7 @@ page_create_empty(
&& page_is_leaf(page)) { && page_is_leaf(page)) {
max_trx_id = page_get_max_trx_id(page); max_trx_id = page_get_max_trx_id(page);
ut_ad(max_trx_id); 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. */ /* Preserve PAGE_ROOT_AUTO_INC. */
max_trx_id = page_get_max_trx_id(page); max_trx_id = page_get_max_trx_id(page);
} else { } else {
@ -1231,6 +1233,7 @@ delete_all:
page_header_set_field(page, NULL, PAGE_GARBAGE, size page_header_set_field(page, NULL, PAGE_GARBAGE, size
+ page_header_get_field(page, PAGE_GARBAGE)); + 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, page_header_set_field(page, NULL, PAGE_N_RECS,
(ulint)(page_get_n_recs(page) - n_recs)); (ulint)(page_get_n_recs(page) - n_recs));
} }

View File

@ -2,7 +2,7 @@
Copyright (c) 2005, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2005, 2016, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2012, Facebook Inc. 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 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 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)); slot_rec = page_zip_dir_find(page_zip, page_offset(rec));
ut_a(slot_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(). */ /* This could not be done before page_zip_dir_find(). */
page_header_set_field(page, page_zip, PAGE_N_RECS, page_header_set_field(page, page_zip, PAGE_N_RECS,
(ulint)(page_get_n_recs(page) - 1)); n_recs - 1);
if (UNIV_UNLIKELY(!free)) { if (UNIV_UNLIKELY(!free)) {
/* Make the last slot the start of the free list. */ /* Make the last slot the start of the free list. */
@ -4801,7 +4803,7 @@ page_zip_reorganize(
clustered index root pages. */ clustered index root pages. */
ut_ad(page_get_max_trx_id(page) == 0 ut_ad(page_get_max_trx_id(page) == 0
|| (dict_index_is_clust(index) || (dict_index_is_clust(index)
? page_is_root(temp_page) ? !page_has_siblings(temp_page)
: page_is_leaf(temp_page))); : page_is_leaf(temp_page)));
/* Restore logging. */ /* Restore logging. */

View File

@ -661,7 +661,7 @@ dberr_t FetchIndexRootPages::operator()(buf_block_t* block) UNIV_NOTHROW
return set_current_xdes(block->page.id.page_no(), page); return set_current_xdes(block->page.id.page_no(), page);
} else if (fil_page_index_page_check(page) } else if (fil_page_index_page_check(page)
&& !is_free(block->page.id.page_no()) && !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); 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); page, m_page_zip_ptr, m_index->m_srv_index->id, 0);
if (dict_index_is_clust(m_index->m_srv_index)) { if (dict_index_is_clust(m_index->m_srv_index)) {
if (page_is_root(page)) { dict_index_t* index = const_cast<dict_index_t*>(
dict_index_t* index = const_cast<dict_index_t*>( m_index->m_srv_index);
m_index->m_srv_index); if (block->page.id.page_no() == index->page) {
/* Preserve the PAGE_ROOT_AUTO_INC. */ /* Preserve the PAGE_ROOT_AUTO_INC. */
if (index->table->supports_instant()) { if (index->table->supports_instant()) {
if (btr_cur_instant_root_init(index, page)) { if (btr_cur_instant_root_init(index, page)) {
@ -1855,7 +1855,7 @@ PageConverter::update_index_page(
if (page_is_empty(page)) { if (page_is_empty(page)) {
/* Only a root page can be empty. */ /* 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 // TODO: We should relax this and skip secondary
// indexes. Mark them as corrupt because they can // indexes. Mark them as corrupt because they can
// always be rebuilt. // always be rebuilt.

View File

@ -1,7 +1,7 @@
/***************************************************************************** /*****************************************************************************
Copyright (c) 2011, 2018, Oracle and/or its affiliates. All Rights Reserved. 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 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 the terms of the GNU General Public License as published by the Free Software
@ -963,7 +963,8 @@ row_log_table_low(
break; break;
case FIL_PAGE_TYPE_INSTANT: case FIL_PAGE_TYPE_INSTANT:
ut_ad(index->is_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; break;
default: default:
ut_ad(!"wrong page type"); ut_ad(!"wrong page type");