Commit 39990135 authored by Sergei Golubchik's avatar Sergei Golubchik

MDEV-28020 CHECKSUM TABLE calculates different checksums

Two bugs here:

1. CHECKSUM TABLE asserted that all fields in the table are arranged
   sequentially in the record, but virtual columns are always at the
   end, violating this assertion
2. virtual columns were not calculated for CHECKSUM, so CHECKSUM
   was using, essentially, garbage left from the previous statement.
   (that's why the test must use INSERT IGNORE to have this "previous
   statement" mark vcols not null)

Fix: don't include virtual columns into the table CHECKSUM. Indeed,
they cannot be included as the engine does not see virtual columns,
so in-engine checksum cannot include them, meaning in-server checksum
should not either
parent 44e7c312
drop table if exists t1;
create table t1 (a int null, v varchar(100)) engine=myisam checksum=0; create table t1 (a int null, v varchar(100)) engine=myisam checksum=0;
insert into t1 values(null, null), (1, "hello"); insert into t1 values(null, null), (1, "hello");
checksum table t1; checksum table t1;
...@@ -98,4 +97,48 @@ CHECKSUM TABLE t1 EXTENDED; ...@@ -98,4 +97,48 @@ CHECKSUM TABLE t1 EXTENDED;
Table Checksum Table Checksum
test.t1 2326430205 test.t1 2326430205
drop table t1; drop table t1;
#
# End of 5.5 tests # End of 5.5 tests
#
#
# MDEV-28020 CHECKSUM TABLE calculates different checksums
#
create table t1 ( a int, b int as (a) virtual, c text) engine=myisam checksum=1;
insert ignore t1 values (1,2,'foo'),(2,3,'bar');
Warnings:
Warning 1906 The value specified for generated column 'b' in table 't1' has been ignored
Warning 1906 The value specified for generated column 'b' in table 't1' has been ignored
checksum table t1 extended;
Table Checksum
test.t1 4101438232
checksum table t1;
Table Checksum
test.t1 4101438232
drop table t1;
create table t1 ( a int, b int as (a) virtual, c text, key(b)) engine=myisam checksum=1;
insert ignore t1 values (1,2,'foo'),(2,3,'bar');
Warnings:
Warning 1906 The value specified for generated column 'b' in table 't1' has been ignored
Warning 1906 The value specified for generated column 'b' in table 't1' has been ignored
checksum table t1 extended;
Table Checksum
test.t1 4101438232
checksum table t1;
Table Checksum
test.t1 4101438232
drop table t1;
create table t1 ( a int, b int as (a) stored, c text) engine=myisam checksum=1;
insert ignore t1 values (1,2,'foo'),(2,3,'bar');
Warnings:
Warning 1906 The value specified for generated column 'b' in table 't1' has been ignored
Warning 1906 The value specified for generated column 'b' in table 't1' has been ignored
checksum table t1 extended;
Table Checksum
test.t1 2897795735
checksum table t1;
Table Checksum
test.t1 2897795735
drop table t1;
#
# End of 10.2 tests
#
drop table if exists t1;
create table t1 (a int null, v varchar(100)) engine=myisam checksum=0; create table t1 (a int null, v varchar(100)) engine=myisam checksum=0;
insert into t1 values(null, null), (1, "hello"); insert into t1 values(null, null), (1, "hello");
checksum table t1; checksum table t1;
...@@ -98,4 +97,48 @@ CHECKSUM TABLE t1 EXTENDED; ...@@ -98,4 +97,48 @@ CHECKSUM TABLE t1 EXTENDED;
Table Checksum Table Checksum
test.t1 2326430205 test.t1 2326430205
drop table t1; drop table t1;
#
# End of 5.5 tests # End of 5.5 tests
#
#
# MDEV-28020 CHECKSUM TABLE calculates different checksums
#
create table t1 ( a int, b int as (a) virtual, c text) engine=myisam checksum=1;
insert ignore t1 values (1,2,'foo'),(2,3,'bar');
Warnings:
Warning 1906 The value specified for generated column 'b' in table 't1' has been ignored
Warning 1906 The value specified for generated column 'b' in table 't1' has been ignored
checksum table t1 extended;
Table Checksum
test.t1 4101438232
checksum table t1;
Table Checksum
test.t1 4101438232
drop table t1;
create table t1 ( a int, b int as (a) virtual, c text, key(b)) engine=myisam checksum=1;
insert ignore t1 values (1,2,'foo'),(2,3,'bar');
Warnings:
Warning 1906 The value specified for generated column 'b' in table 't1' has been ignored
Warning 1906 The value specified for generated column 'b' in table 't1' has been ignored
checksum table t1 extended;
Table Checksum
test.t1 4101438232
checksum table t1;
Table Checksum
test.t1 4101438232
drop table t1;
create table t1 ( a int, b int as (a) stored, c text) engine=myisam checksum=1;
insert ignore t1 values (1,2,'foo'),(2,3,'bar');
Warnings:
Warning 1906 The value specified for generated column 'b' in table 't1' has been ignored
Warning 1906 The value specified for generated column 'b' in table 't1' has been ignored
checksum table t1 extended;
Table Checksum
test.t1 2897795735
checksum table t1;
Table Checksum
test.t1 2897795735
drop table t1;
#
# End of 10.2 tests
#
...@@ -2,12 +2,8 @@ ...@@ -2,12 +2,8 @@
# Test checksum # Test checksum
# #
-- source include/have_innodb.inc --source include/have_innodb.inc
-- source include/have_maria.inc --source include/have_maria.inc
--disable_warnings
drop table if exists t1;
--enable_warnings
create table t1 (a int null, v varchar(100)) engine=myisam checksum=0; create table t1 (a int null, v varchar(100)) engine=myisam checksum=0;
insert into t1 values(null, null), (1, "hello"); insert into t1 values(null, null), (1, "hello");
...@@ -76,4 +72,31 @@ CHECKSUM TABLE t1 EXTENDED; ...@@ -76,4 +72,31 @@ CHECKSUM TABLE t1 EXTENDED;
drop table t1; drop table t1;
--echo #
--echo # End of 5.5 tests --echo # End of 5.5 tests
--echo #
--echo #
--echo # MDEV-28020 CHECKSUM TABLE calculates different checksums
--echo #
create table t1 ( a int, b int as (a) virtual, c text) engine=myisam checksum=1;
insert ignore t1 values (1,2,'foo'),(2,3,'bar');
checksum table t1 extended;
checksum table t1;
drop table t1;
create table t1 ( a int, b int as (a) virtual, c text, key(b)) engine=myisam checksum=1;
insert ignore t1 values (1,2,'foo'),(2,3,'bar');
checksum table t1 extended;
checksum table t1;
drop table t1;
create table t1 ( a int, b int as (a) stored, c text) engine=myisam checksum=1;
insert ignore t1 values (1,2,'foo'),(2,3,'bar');
checksum table t1 extended;
checksum table t1;
drop table t1;
--echo #
--echo # End of 10.2 tests
--echo #
...@@ -10631,6 +10631,8 @@ bool mysql_checksum_table(THD *thd, TABLE_LIST *tables, ...@@ -10631,6 +10631,8 @@ bool mysql_checksum_table(THD *thd, TABLE_LIST *tables,
for (uint i= 0; i < t->s->fields; i++ ) for (uint i= 0; i < t->s->fields; i++ )
{ {
Field *f= t->field[i]; Field *f= t->field[i];
if (!f->stored_in_db())
continue;
if (! thd->variables.old_mode && f->is_real_null(0)) if (! thd->variables.old_mode && f->is_real_null(0))
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment