mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
Bug#18888 Trying to overwrite sql/lex_hash.h during build
- As a sideeffect of the patch to generate lex_hash.h only once on the machine where the source dist was produced, a problem was found when compiling a mysqld without partition support - it would crash when looking up the lex symbols due to mismatch between lex.h and the generated lex_hash.h - Remove the ifdef for partition in lex.h - Fix minor problem with"EXPLAIN PARTITION" when not compiled with partition(existed also without the above patch) - Add test case that will be run when we don't have partition support compiled into mysqld - Return error ER_FEATURE_DISABLED if user tries to use PARTITION when there is no support for it.
This commit is contained in:
2
mysql-test/r/not_partition.require
Normal file
2
mysql-test/r/not_partition.require
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
Variable_name Value
|
||||||
|
have_partitioning NO
|
48
mysql-test/r/not_partition.result
Normal file
48
mysql-test/r/not_partition.result
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
CREATE TABLE t1 (
|
||||||
|
firstname VARCHAR(25) NOT NULL,
|
||||||
|
lastname VARCHAR(25) NOT NULL,
|
||||||
|
username VARCHAR(16) NOT NULL,
|
||||||
|
email VARCHAR(35),
|
||||||
|
joined DATE NOT NULL
|
||||||
|
)
|
||||||
|
PARTITION BY KEY(joined)
|
||||||
|
PARTITIONS 6;
|
||||||
|
ERROR HY000: The 'partitioning' feature is disabled; you need MySQL built with '--with-partition' to have it working
|
||||||
|
ALTER TABLE t1 PARTITION BY KEY(joined) PARTITIONS 2;
|
||||||
|
ERROR HY000: The 'partitioning' feature is disabled; you need MySQL built with '--with-partition' to have it working
|
||||||
|
drop table t1;
|
||||||
|
ERROR 42S02: Unknown table 't1'
|
||||||
|
CREATE TABLE t1 (
|
||||||
|
firstname VARCHAR(25) NOT NULL,
|
||||||
|
lastname VARCHAR(25) NOT NULL,
|
||||||
|
username VARCHAR(16) NOT NULL,
|
||||||
|
email VARCHAR(35),
|
||||||
|
joined DATE NOT NULL
|
||||||
|
)
|
||||||
|
PARTITION BY RANGE( YEAR(joined) ) (
|
||||||
|
PARTITION p0 VALUES LESS THAN (1960),
|
||||||
|
PARTITION p1 VALUES LESS THAN (1970),
|
||||||
|
PARTITION p2 VALUES LESS THAN (1980),
|
||||||
|
PARTITION p3 VALUES LESS THAN (1990),
|
||||||
|
PARTITION p4 VALUES LESS THAN MAXVALUE
|
||||||
|
);
|
||||||
|
ERROR HY000: The 'partitioning' feature is disabled; you need MySQL built with '--with-partition' to have it working
|
||||||
|
drop table t1;
|
||||||
|
ERROR 42S02: Unknown table 't1'
|
||||||
|
CREATE TABLE t1 (id INT, purchased DATE)
|
||||||
|
PARTITION BY RANGE( YEAR(purchased) )
|
||||||
|
SUBPARTITION BY HASH( TO_DAYS(purchased) )
|
||||||
|
SUBPARTITIONS 2 (
|
||||||
|
PARTITION p0 VALUES LESS THAN (1990),
|
||||||
|
PARTITION p1 VALUES LESS THAN (2000),
|
||||||
|
PARTITION p2 VALUES LESS THAN MAXVALUE
|
||||||
|
);
|
||||||
|
ERROR HY000: The 'partitioning' feature is disabled; you need MySQL built with '--with-partition' to have it working
|
||||||
|
drop table t1;
|
||||||
|
ERROR 42S02: Unknown table 't1'
|
||||||
|
create table t1 (a varchar(10) charset latin1 collate latin1_bin);
|
||||||
|
insert into t1 values (''),(' '),('a'),('a '),('a ');
|
||||||
|
explain partitions select * from t1 where a='a ' OR a='a';
|
||||||
|
id select_type table partitions type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE t1 NULL ALL NULL NULL NULL NULL 5 Using where
|
||||||
|
drop table t1;
|
62
mysql-test/t/not_partition.test
Normal file
62
mysql-test/t/not_partition.test
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
--disable_abort_on_error
|
||||||
|
# Run this tets only when mysqld don't has partitioning
|
||||||
|
# the statements are not expected to work, just check that we
|
||||||
|
# can't crash the server
|
||||||
|
-- require r/not_partition.require
|
||||||
|
disable_query_log;
|
||||||
|
show variables like "have_partitioning";
|
||||||
|
enable_query_log;
|
||||||
|
|
||||||
|
|
||||||
|
--error ER_FEATURE_DISABLED
|
||||||
|
CREATE TABLE t1 (
|
||||||
|
firstname VARCHAR(25) NOT NULL,
|
||||||
|
lastname VARCHAR(25) NOT NULL,
|
||||||
|
username VARCHAR(16) NOT NULL,
|
||||||
|
email VARCHAR(35),
|
||||||
|
joined DATE NOT NULL
|
||||||
|
)
|
||||||
|
PARTITION BY KEY(joined)
|
||||||
|
PARTITIONS 6;
|
||||||
|
|
||||||
|
--error ER_FEATURE_DISABLED
|
||||||
|
ALTER TABLE t1 PARTITION BY KEY(joined) PARTITIONS 2;
|
||||||
|
|
||||||
|
--error ER_BAD_TABLE_ERROR
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
|
--error ER_FEATURE_DISABLED
|
||||||
|
CREATE TABLE t1 (
|
||||||
|
firstname VARCHAR(25) NOT NULL,
|
||||||
|
lastname VARCHAR(25) NOT NULL,
|
||||||
|
username VARCHAR(16) NOT NULL,
|
||||||
|
email VARCHAR(35),
|
||||||
|
joined DATE NOT NULL
|
||||||
|
)
|
||||||
|
PARTITION BY RANGE( YEAR(joined) ) (
|
||||||
|
PARTITION p0 VALUES LESS THAN (1960),
|
||||||
|
PARTITION p1 VALUES LESS THAN (1970),
|
||||||
|
PARTITION p2 VALUES LESS THAN (1980),
|
||||||
|
PARTITION p3 VALUES LESS THAN (1990),
|
||||||
|
PARTITION p4 VALUES LESS THAN MAXVALUE
|
||||||
|
);
|
||||||
|
--error ER_BAD_TABLE_ERROR
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
|
--error ER_FEATURE_DISABLED
|
||||||
|
CREATE TABLE t1 (id INT, purchased DATE)
|
||||||
|
PARTITION BY RANGE( YEAR(purchased) )
|
||||||
|
SUBPARTITION BY HASH( TO_DAYS(purchased) )
|
||||||
|
SUBPARTITIONS 2 (
|
||||||
|
PARTITION p0 VALUES LESS THAN (1990),
|
||||||
|
PARTITION p1 VALUES LESS THAN (2000),
|
||||||
|
PARTITION p2 VALUES LESS THAN MAXVALUE
|
||||||
|
);
|
||||||
|
--error ER_BAD_TABLE_ERROR
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
|
# Create a table without partitions to test "EXPLAIN PARTITIONS"
|
||||||
|
create table t1 (a varchar(10) charset latin1 collate latin1_bin);
|
||||||
|
insert into t1 values (''),(' '),('a'),('a '),('a ');
|
||||||
|
explain partitions select * from t1 where a='a ' OR a='a';
|
||||||
|
drop table t1;
|
@ -45,6 +45,10 @@ SYM_GROUP sym_group_rtree= {"RTree keys", "HAVE_RTREE_KEYS"};
|
|||||||
Symbols are broken into separated arrays to allow field names with
|
Symbols are broken into separated arrays to allow field names with
|
||||||
same name as functions.
|
same name as functions.
|
||||||
These are kept sorted for human lookup (the symbols are hashed).
|
These are kept sorted for human lookup (the symbols are hashed).
|
||||||
|
|
||||||
|
NOTE! The symbol tables should be the same regardless of what features
|
||||||
|
are compiled into the server. Don't add ifdef'ed symbols to the
|
||||||
|
lists
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static SYMBOL symbols[] = {
|
static SYMBOL symbols[] = {
|
||||||
@ -383,11 +387,9 @@ static SYMBOL symbols[] = {
|
|||||||
{ "PACK_KEYS", SYM(PACK_KEYS_SYM)},
|
{ "PACK_KEYS", SYM(PACK_KEYS_SYM)},
|
||||||
{ "PARSER", SYM(PARSER_SYM)},
|
{ "PARSER", SYM(PARSER_SYM)},
|
||||||
{ "PARTIAL", SYM(PARTIAL)},
|
{ "PARTIAL", SYM(PARTIAL)},
|
||||||
#ifdef WITH_PARTITION_STORAGE_ENGINE
|
|
||||||
{ "PARTITION", SYM(PARTITION_SYM)},
|
{ "PARTITION", SYM(PARTITION_SYM)},
|
||||||
{ "PARTITIONING", SYM(PARTITIONING_SYM)},
|
{ "PARTITIONING", SYM(PARTITIONING_SYM)},
|
||||||
{ "PARTITIONS", SYM(PARTITIONS_SYM)},
|
{ "PARTITIONS", SYM(PARTITIONS_SYM)},
|
||||||
#endif
|
|
||||||
{ "PASSWORD", SYM(PASSWORD)},
|
{ "PASSWORD", SYM(PASSWORD)},
|
||||||
{ "PHASE", SYM(PHASE_SYM)},
|
{ "PHASE", SYM(PHASE_SYM)},
|
||||||
{ "PLUGIN", SYM(PLUGIN_SYM)},
|
{ "PLUGIN", SYM(PLUGIN_SYM)},
|
||||||
|
@ -859,7 +859,6 @@ int THD::send_explain_fields(select_result *result)
|
|||||||
field_list.push_back(new Item_empty_string("select_type", 19, cs));
|
field_list.push_back(new Item_empty_string("select_type", 19, cs));
|
||||||
field_list.push_back(item= new Item_empty_string("table", NAME_LEN, cs));
|
field_list.push_back(item= new Item_empty_string("table", NAME_LEN, cs));
|
||||||
item->maybe_null= 1;
|
item->maybe_null= 1;
|
||||||
#ifdef WITH_PARTITION_STORAGE_ENGINE
|
|
||||||
if (lex->describe & DESCRIBE_PARTITIONS)
|
if (lex->describe & DESCRIBE_PARTITIONS)
|
||||||
{
|
{
|
||||||
/* Maximum length of string that make_used_partitions_str() can produce */
|
/* Maximum length of string that make_used_partitions_str() can produce */
|
||||||
@ -868,7 +867,6 @@ int THD::send_explain_fields(select_result *result)
|
|||||||
field_list.push_back(item);
|
field_list.push_back(item);
|
||||||
item->maybe_null= 1;
|
item->maybe_null= 1;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
field_list.push_back(item= new Item_empty_string("type", 10, cs));
|
field_list.push_back(item= new Item_empty_string("type", 10, cs));
|
||||||
item->maybe_null= 1;
|
item->maybe_null= 1;
|
||||||
field_list.push_back(item=new Item_empty_string("possible_keys",
|
field_list.push_back(item=new Item_empty_string("possible_keys",
|
||||||
|
@ -2200,7 +2200,7 @@ make_join_statistics(JOIN *join, TABLE_LIST *tables, COND *conds,
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
#ifdef WITH_PARTITION_STORAGE_ENGINE
|
#ifdef WITH_PARTITION_STORAGE_ENGINE
|
||||||
bool no_partitions_used= table->no_partitions_used;
|
const bool no_partitions_used= table->no_partitions_used;
|
||||||
#else
|
#else
|
||||||
const bool no_partitions_used= FALSE;
|
const bool no_partitions_used= FALSE;
|
||||||
#endif
|
#endif
|
||||||
|
@ -3225,6 +3225,7 @@ opt_partitioning:
|
|||||||
partitioning:
|
partitioning:
|
||||||
PARTITION_SYM
|
PARTITION_SYM
|
||||||
{
|
{
|
||||||
|
#ifdef WITH_PARTITION_STORAGE_ENGINE
|
||||||
LEX *lex= Lex;
|
LEX *lex= Lex;
|
||||||
lex->part_info= new partition_info();
|
lex->part_info= new partition_info();
|
||||||
if (!lex->part_info)
|
if (!lex->part_info)
|
||||||
@ -3236,6 +3237,12 @@ partitioning:
|
|||||||
{
|
{
|
||||||
lex->alter_info.flags|= ALTER_PARTITION;
|
lex->alter_info.flags|= ALTER_PARTITION;
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
my_error(ER_FEATURE_DISABLED, MYF(0),
|
||||||
|
"partitioning", "--with-partition");
|
||||||
|
YYABORT;
|
||||||
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
partition
|
partition
|
||||||
;
|
;
|
||||||
|
Reference in New Issue
Block a user