mariadb/mysql-test/suite/maria/maria_partition.test
Michael Widenius 5364315229 Fix for MDEV-6493: Assertion `table->file->stats.records > 0 || error' failure, or 'Invalid write' valgrind warnings, or crash on scenario with Aria table, view, LOCK TABLES
This bug only happens in case of paritioned tables used in LOCK TABLES and implicit_commit() was called
(as part of trying to execute a CREATE TABLE withing lock tables)

The problem was that Aria could not move the tables from one transaction to the new one, as thd->open_tables contained
a partitioned tables and not an Aria table.

Fix:
- Store a list of all open tables that are part of a share in share->open_tables
- In maria::implict_commit() use transaction->used_tables & share->open_tables to find out which tables
  was part of the current transaction instead of using thd->open_tables, which may contain partitioned tables.


mysql-test/suite/maria/maria_partition.result:
  Added test case
mysql-test/suite/maria/maria_partition.test:
  Added test case
storage/maria/ha_maria.cc:
  Use trn->used tables and share->open_tables to find out which tables was part of the current transaction instead of using thd->open_tables.
storage/maria/ma_close.c:
  Remove closed table from share->open_list
storage/maria/ma_open.c:
  Add table to share->open_list
storage/maria/ma_state.c:
  Added comment
storage/maria/maria_def.h:
  Added share->open_list, a list of all tables that is using this share.
2014-07-30 13:27:52 +03:00

80 lines
2.2 KiB
Text

# Aria tests which require partitioning enabled
--source include/have_partition.inc
-- source include/have_maria.inc
let $default_engine=`select @@global.storage_engine`;
let $default_checksum=`select @@global.aria_page_checksum`;
set global storage_engine=aria;
set session storage_engine=aria;
set global aria_page_checksum=0;
# Initialise
--disable_warnings
drop table if exists t1,t2;
drop view if exists v1;
--enable_warnings
SET SQL_WARNINGS=1;
#
# Bug #39227 Aria: crash with ALTER TABLE PARTITION
#
create table t1 (s1 int);
insert into t1 values (1);
--error ER_NO_PARTITION_FOR_GIVEN_VALUE
alter table t1 partition by list (s1) (partition p1 values in (2));
drop table t1;
#
# Test outer join const propagation
#
create table t2(a blob) engine=aria;
create table t1(a int primary key) engine=aria;
insert into t2 values ('foo'),('bar');
select * from t2 left join t1 on (t2.a=t1.a) where t2.a='bbb';
insert into t1 values (1);
select * from t2 left join t1 on (t2.a=t1.a) where t2.a='bbb';
insert into t1 values (2);
select * from t2 left join t1 on (t2.a=t1.a) where t2.a='bbb';
drop table t1,t2;
create table t2(a blob);
create table t1(a int primary key) PARTITION BY HASH (a) PARTITIONS 2;
insert into t2 values ('foo'),('bar');
select * from t2 left join t1 on (t2.a=t1.a) where t2.a='bbb';
insert into t1 values (1);
select * from t2 left join t1 on (t2.a=t1.a) where t2.a='bbb';
insert into t1 values (2);
select * from t2 left join t1 on (t2.a=t1.a) where t2.a='bbb';
drop table t1,t2;
#
# MDEV-6493
# Assertion `table->file->stats.records > 0 || error'
# failure, or 'Invalid write' valgrind warnings, or crash on scenario
# with Aria table, view, LOCK TABLES #
#
CREATE TABLE t1 (pk INT PRIMARY KEY) ENGINE=Aria PARTITION BY KEY() PARTITIONS 2;
CREATE VIEW v1 AS SELECT * FROM t1;
LOCK TABLE v1 WRITE;
--error 1100
CREATE TABLE v1 (i INT);
INSERT INTO v1 VALUES (1);
UNLOCK TABLES;
check table t1;
SELECT * FROM t1;
drop table t1;
drop view v1;
# Set defaults back
--disable_result_log
--disable_query_log
eval set global storage_engine=$default_engine, aria_page_checksum=$default_checksum;
set global aria_log_file_size=default;
--enable_result_log
--enable_query_log