From ed53c394f93444e4f8a11114c0a5f3d426c6220b Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 26 Oct 2006 19:11:09 +0200 Subject: [PATCH] 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. sql/lex.h: There should be no ifdefs of features in lex.h sql/sql_class.cc: In line with the comment in sql_yacc.yy that we want the same output from "EXPLAIN PARTITIONS.." regardless of wheter we have compiled in support for partition or not, remove the ifdef so the extra field is added to output if the DESCRIBE_PARTITIONS bit it set. Without this patch we get a crash as the code in select_describe believes the field is there. sql/sql_select.cc: Use "const" for the variable as it's a ssigned once and never changes sql/sql_yacc.yy: Don't allow PARTITION syntax oif there is no suport for partitioning mysql-test/r/not_partition.require: New BitKeeper file ``mysql-test/r/not_partition.require'' mysql-test/r/not_partition.result: New BitKeeper file ``mysql-test/r/not_partition.result'' mysql-test/t/not_partition.test: New BitKeeper file ``mysql-test/t/not_partition.test'' --- mysql-test/r/not_partition.require | 2 + mysql-test/r/not_partition.result | 48 +++++++++++++++++++++++ mysql-test/t/not_partition.test | 62 ++++++++++++++++++++++++++++++ sql/lex.h | 6 ++- sql/sql_class.cc | 2 - sql/sql_select.cc | 2 +- sql/sql_yacc.yy | 7 ++++ 7 files changed, 124 insertions(+), 5 deletions(-) create mode 100644 mysql-test/r/not_partition.require create mode 100644 mysql-test/r/not_partition.result create mode 100644 mysql-test/t/not_partition.test diff --git a/mysql-test/r/not_partition.require b/mysql-test/r/not_partition.require new file mode 100644 index 00000000000..808242277cb --- /dev/null +++ b/mysql-test/r/not_partition.require @@ -0,0 +1,2 @@ +Variable_name Value +have_partitioning NO diff --git a/mysql-test/r/not_partition.result b/mysql-test/r/not_partition.result new file mode 100644 index 00000000000..9e205a09d78 --- /dev/null +++ b/mysql-test/r/not_partition.result @@ -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; diff --git a/mysql-test/t/not_partition.test b/mysql-test/t/not_partition.test new file mode 100644 index 00000000000..992615c06f4 --- /dev/null +++ b/mysql-test/t/not_partition.test @@ -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; diff --git a/sql/lex.h b/sql/lex.h index f19c9413e0e..711becc123f 100644 --- a/sql/lex.h +++ b/sql/lex.h @@ -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 same name as functions. 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[] = { @@ -383,11 +387,9 @@ static SYMBOL symbols[] = { { "PACK_KEYS", SYM(PACK_KEYS_SYM)}, { "PARSER", SYM(PARSER_SYM)}, { "PARTIAL", SYM(PARTIAL)}, -#ifdef WITH_PARTITION_STORAGE_ENGINE { "PARTITION", SYM(PARTITION_SYM)}, { "PARTITIONING", SYM(PARTITIONING_SYM)}, { "PARTITIONS", SYM(PARTITIONS_SYM)}, -#endif { "PASSWORD", SYM(PASSWORD)}, { "PHASE", SYM(PHASE_SYM)}, { "PLUGIN", SYM(PLUGIN_SYM)}, diff --git a/sql/sql_class.cc b/sql/sql_class.cc index dcb3620f329..e1904527866 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -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(item= new Item_empty_string("table", NAME_LEN, cs)); item->maybe_null= 1; -#ifdef WITH_PARTITION_STORAGE_ENGINE if (lex->describe & DESCRIBE_PARTITIONS) { /* 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); item->maybe_null= 1; } -#endif field_list.push_back(item= new Item_empty_string("type", 10, cs)); item->maybe_null= 1; field_list.push_back(item=new Item_empty_string("possible_keys", diff --git a/sql/sql_select.cc b/sql/sql_select.cc index bc156aa1526..f8b57368430 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -2200,7 +2200,7 @@ make_join_statistics(JOIN *join, TABLE_LIST *tables, COND *conds, continue; } #ifdef WITH_PARTITION_STORAGE_ENGINE - bool no_partitions_used= table->no_partitions_used; + const bool no_partitions_used= table->no_partitions_used; #else const bool no_partitions_used= FALSE; #endif diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 26dea00029a..f61cc3982ad 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -3225,6 +3225,7 @@ opt_partitioning: partitioning: PARTITION_SYM { +#ifdef WITH_PARTITION_STORAGE_ENGINE LEX *lex= Lex; lex->part_info= new partition_info(); if (!lex->part_info) @@ -3236,6 +3237,12 @@ partitioning: { lex->alter_info.flags|= ALTER_PARTITION; } +#else + my_error(ER_FEATURE_DISABLED, MYF(0), + "partitioning", "--with-partition"); + YYABORT; +#endif + } partition ;