From feb8bcbcd91326d4f39a3b9f37983c1d06bbaeaf Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 7 Aug 2006 12:02:28 -0400 Subject: [PATCH] Made sure that strange numbers are not allowed syntax-wise. mysql-test/r/partition.result: Added some test cases mysql-test/t/partition.test: Added some test cases sql/share/errmsg.txt: Added new error message --- mysql-test/r/partition.result | 16 ++++++++++++ mysql-test/t/partition.test | 19 ++++++++++++++ sql/share/errmsg.txt | 2 ++ sql/sql_yacc.yy | 49 ++++++++++++++++++++++++++--------- 4 files changed, 74 insertions(+), 12 deletions(-) diff --git a/mysql-test/r/partition.result b/mysql-test/r/partition.result index e95489864f7..545af80eb44 100644 --- a/mysql-test/r/partition.result +++ b/mysql-test/r/partition.result @@ -1,5 +1,21 @@ drop table if exists t1; create table t1 (a int) +partition by key(a) +partitions 0.2+e1; +ERROR 42000: Only normal integers allowed as number here near '0.2+e1' at line 3 +create table t1 (a int) +partition by key(a) +partitions -1; +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '-1' at line 3 +create table t1 (a int) +partition by key(a) +partitions 1.5; +ERROR 42000: Only normal integers allowed as number here near '1.5' at line 3 +create table t1 (a int) +partition by key(a) +partitions 1e+300; +ERROR 42000: Only normal integers allowed as number here near '1e+300' at line 3 +create table t1 (a int) partition by list (a) (partition p0 values in (1)); create procedure pz() diff --git a/mysql-test/t/partition.test b/mysql-test/t/partition.test index d4e930f91ec..986cceefd0e 100644 --- a/mysql-test/t/partition.test +++ b/mysql-test/t/partition.test @@ -9,6 +9,25 @@ drop table if exists t1; --enable_warnings +# +# Bug 15890: Strange number of partitions accepted +# +-- error 1064 +create table t1 (a int) +partition by key(a) +partitions 0.2+e1; +-- error 1064 +create table t1 (a int) +partition by key(a) +partitions -1; +-- error 1064 +create table t1 (a int) +partition by key(a) +partitions 1.5; +-- error 1064 +create table t1 (a int) +partition by key(a) +partitions 1e+300; # # Bug 19309 Partitions: Crash if double procedural alter # diff --git a/sql/share/errmsg.txt b/sql/share/errmsg.txt index a5fefc38c59..154e5aeb795 100644 --- a/sql/share/errmsg.txt +++ b/sql/share/errmsg.txt @@ -5843,3 +5843,5 @@ ER_RBR_NOT_AVAILABLE eng "The server was not built with row-based replication" ER_NO_TRIGGERS_ON_SYSTEM_SCHEMA eng "Triggers can not be created on system tables" +ER_ONLY_INTEGERS_ALLOWED + eng "Only normal integers allowed as number here" diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index b8d68a91afc..92738bc7541 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -753,10 +753,10 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize); ev_alter_on_schedule_completion opt_ev_rename_to opt_ev_sql_stmt %type - ulong_num merge_insert_types + ulong_num real_ulong_num merge_insert_types %type - ulonglong_num size_number + ulonglong_num real_ulonglong_num size_number %type part_bit_expr @@ -3072,7 +3072,7 @@ opt_ts_redo_buffer_size: }; opt_ts_nodegroup: - NODEGROUP_SYM opt_equal ulong_num + NODEGROUP_SYM opt_equal real_ulong_num { LEX *lex= Lex; if (lex->alter_tablespace_info->nodegroup_id != UNDEF_NODEGROUP) @@ -3131,7 +3131,7 @@ ts_wait: }; size_number: - ulong_num { $$= $1;} + real_ulong_num { $$= $1;} | IDENT { ulonglong number, test_number; @@ -3370,7 +3370,7 @@ sub_part_func: opt_no_parts: /* empty */ {} - | PARTITIONS_SYM ulong_num + | PARTITIONS_SYM real_ulong_num { uint no_parts= $2; LEX *lex= Lex; @@ -3434,7 +3434,7 @@ part_func_expr: opt_no_subparts: /* empty */ {} - | SUBPARTITIONS_SYM ulong_num + | SUBPARTITIONS_SYM real_ulong_num { uint no_parts= $2; LEX *lex= Lex; @@ -3774,11 +3774,11 @@ opt_part_option: lex->part_info->curr_part_elem->engine_type= $4; lex->part_info->default_engine_type= $4; } - | NODEGROUP_SYM opt_equal ulong_num + | NODEGROUP_SYM opt_equal real_ulong_num { Lex->part_info->curr_part_elem->nodegroup_id= $3; } - | MAX_ROWS opt_equal ulonglong_num + | MAX_ROWS opt_equal real_ulonglong_num { Lex->part_info->curr_part_elem->part_max_rows= $3; } - | MIN_ROWS opt_equal ulonglong_num + | MIN_ROWS opt_equal real_ulonglong_num { Lex->part_info->curr_part_elem->part_min_rows= $3; } | DATA_SYM DIRECTORY_SYM opt_equal TEXT_STRING_sys { Lex->part_info->curr_part_elem->data_file_name= $4.str; } @@ -4908,7 +4908,7 @@ alter_commands: lex->check_opt.init(); } opt_mi_repair_type - | COALESCE PARTITION_SYM opt_no_write_to_binlog ulong_num + | COALESCE PARTITION_SYM opt_no_write_to_binlog real_ulong_num { LEX *lex= Lex; lex->alter_info.flags|= ALTER_COALESCE_PARTITION; @@ -4956,7 +4956,7 @@ add_part_extra: LEX *lex= Lex; lex->part_info->no_parts= lex->part_info->partitions.elements; } - | PARTITIONS_SYM ulong_num + | PARTITIONS_SYM real_ulong_num { LEX *lex= Lex; lex->part_info->no_parts= $2; @@ -7491,7 +7491,15 @@ ulong_num: | ULONGLONG_NUM { int error; $$= (ulong) my_strtoll10($1.str, (char**) 0, &error); } | DECIMAL_NUM { int error; $$= (ulong) my_strtoll10($1.str, (char**) 0, &error); } | FLOAT_NUM { int error; $$= (ulong) my_strtoll10($1.str, (char**) 0, &error); } - ; + ; + +real_ulong_num: + NUM { int error; $$= (ulong) my_strtoll10($1.str, (char**) 0, &error); } + | HEX_NUM { $$= (ulong) strtol($1.str, (char**) 0, 16); } + | LONG_NUM { int error; $$= (ulong) my_strtoll10($1.str, (char**) 0, &error); } + | ULONGLONG_NUM { int error; $$= (ulong) my_strtoll10($1.str, (char**) 0, &error); } + | dec_num_error { YYABORT; } + ; ulonglong_num: NUM { int error; $$= (ulonglong) my_strtoll10($1.str, (char**) 0, &error); } @@ -7501,6 +7509,23 @@ ulonglong_num: | FLOAT_NUM { int error; $$= (ulonglong) my_strtoll10($1.str, (char**) 0, &error); } ; +real_ulonglong_num: + NUM { int error; $$= (ulonglong) my_strtoll10($1.str, (char**) 0, &error); } + | ULONGLONG_NUM { int error; $$= (ulonglong) my_strtoll10($1.str, (char**) 0, &error); } + | LONG_NUM { int error; $$= (ulonglong) my_strtoll10($1.str, (char**) 0, &error); } + | dec_num_error { YYABORT; } + ; + +dec_num_error: + dec_num + { yyerror(ER(ER_ONLY_INTEGERS_ALLOWED)); } + ; + +dec_num: + DECIMAL_NUM + | FLOAT_NUM + ; + procedure_clause: /* empty */ | PROCEDURE ident /* Procedure name */