From dacf7f8fe51ce27e0a63cf486fccb6a748c5dbec Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 6 Feb 2003 16:55:59 +0200 Subject: [PATCH 1/3] Added START TRANSACTION syntax Added ALL as parameter option for all group functions. Make join handling uniform. This allows us to use ',', JOIN and INNER JOIN the same way. Sort NULL last if DESC is used (ANSI SQL 99 requirement) include/my_global.h: Moved LL from mysql_priv (as this is also in config-win.h) mysql-test/r/distinct.result: Updated results mysql-test/r/func_group.result: Updated results mysql-test/r/innodb.result: Updated results mysql-test/r/join.result: Updated results mysql-test/r/order_by.result: Updated results mysql-test/t/func_group.test: Added test for SUM(ALL ...) mysql-test/t/innodb.test: Added test for START TRANSACTION mysql-test/t/join.test: Test different join syntaxes mysql-test/t/order_by.test: Added new test of NULL ordering. sql/filesort.cc: Sort NULL last if DESC is used sql/lex.h: Added OLD_PASSWORD() as synonym for PASSWORD. sql/mysql_priv.h: Removed LL() sql/opt_range.cc: Sort NULL last if DESC is used sql/opt_range.h: Sort NULL last if DESC is used sql/slave.cc: Indentation changes sql/sql_parse.cc: After merge fix sql/sql_select.cc: Added comment sql/sql_yacc.yy: Added START TRANSACTION syntax Added ALL as parameter option for all group functions. Make join handling uniform. --- include/my_global.h | 8 +++++++ mysql-test/r/distinct.result | 2 +- mysql-test/r/func_group.result | 4 ++-- mysql-test/r/innodb.result | 2 +- mysql-test/r/join.result | 30 ++++++++++++++++++++++++++ mysql-test/r/order_by.result | 15 +++++++++++-- mysql-test/t/func_group.test | 2 +- mysql-test/t/innodb.test | 2 +- mysql-test/t/join.test | 25 +++++++++++++++++++++- mysql-test/t/order_by.test | 3 ++- sql/filesort.cc | 5 ++++- sql/lex.h | 1 + sql/mysql_priv.h | 8 ------- sql/opt_range.cc | 5 +++-- sql/opt_range.h | 2 ++ sql/slave.cc | 8 +++---- sql/sql_parse.cc | 2 -- sql/sql_select.cc | 5 +++++ sql/sql_yacc.yy | 39 +++++++++++++++++++++++----------- 19 files changed, 129 insertions(+), 39 deletions(-) diff --git a/include/my_global.h b/include/my_global.h index a360947e42d..f98cc48ba20 100644 --- a/include/my_global.h +++ b/include/my_global.h @@ -764,6 +764,14 @@ typedef char bool; /* Ordinary boolean values 0 1 */ #define INT32(v) (int32) (v) #define MYF(v) (myf) (v) +#ifndef LL +#ifdef HAVE_LONG_LONG +#define LL(A) A ## LL +#else +#define LL(A) A ## L +#endif +#endif + /* Defines to make it possible to prioritize register assignments. No longer that important with modern compilers. diff --git a/mysql-test/r/distinct.result b/mysql-test/r/distinct.result index 020d6c6534f..5f4f7cced1e 100644 --- a/mysql-test/r/distinct.result +++ b/mysql-test/r/distinct.result @@ -77,7 +77,6 @@ NULL NULL 10 VMT select id+0 as a,max(id),concat(facility) as b from t1 group by a order by b desc,a; a max(id) b -NULL NULL NULL 10 10 VMT 9 9 SRV 8 8 RV @@ -90,6 +89,7 @@ NULL NULL NULL 1 1 /L -1 -1 0 0 +NULL NULL NULL select id >= 0 and id <= 5 as grp,count(*) from t1 group by grp; grp count(*) NULL 1 diff --git a/mysql-test/r/func_group.result b/mysql-test/r/func_group.result index 8263df36105..b129beaac81 100644 --- a/mysql-test/r/func_group.result +++ b/mysql-test/r/func_group.result @@ -42,8 +42,8 @@ insert into t1 values (null,null,''); select count(distinct a),count(distinct grp) from t1; count(distinct a) count(distinct grp) 6 3 -select sum(a),count(a),avg(a),std(a),bit_or(a),bit_and(a),min(a),max(a),min(c),max(c) from t1; -sum(a) count(a) avg(a) std(a) bit_or(a) bit_and(a) min(a) max(a) min(c) max(c) +select sum(all a),count(all a),avg(all a),std(all a),bit_or(all a),bit_and(all a),min(all a),max(all a),min(all c),max(all c) from t1; +sum(all a) count(all a) avg(all a) std(all a) bit_or(all a) bit_and(all a) min(all a) max(all a) min(all c) max(all c) 21 6 3.5000 1.7078 7 0 1 6 E select grp, sum(a),count(a),avg(a),std(a),bit_or(a),bit_and(a),min(a),max(a),min(c),max(c) from t1 group by grp; grp sum(a) count(a) avg(a) std(a) bit_or(a) bit_and(a) min(a) max(a) min(c) max(c) diff --git a/mysql-test/r/innodb.result b/mysql-test/r/innodb.result index 9d50a6a86e9..828bd2bab83 100644 --- a/mysql-test/r/innodb.result +++ b/mysql-test/r/innodb.result @@ -290,7 +290,7 @@ select * from t1; id val drop table t1; create table t1 (a integer) type=innodb; -begin; +start transaction; rename table t1 to t2; create table t1 (b integer) type=innodb; insert into t1 values (1); diff --git a/mysql-test/r/join.result b/mysql-test/r/join.result index ff608825b9c..ddea0ac1a57 100644 --- a/mysql-test/r/join.result +++ b/mysql-test/r/join.result @@ -1,4 +1,34 @@ drop table if exists t1,t2,t3; +CREATE TABLE t1 (S1 INT); +CREATE TABLE t2 (S1 INT); +INSERT INTO t1 VALUES (1); +INSERT INTO t2 VALUES (2); +SELECT * FROM t1 JOIN t2; +S1 S1 +1 2 +SELECT * FROM t1 INNER JOIN t2; +S1 S1 +1 2 +SELECT * from t1 JOIN t2 USING (S1); +S1 S1 +SELECT * FROM t1 INNER JOIN t2 USING (S1); +S1 S1 +SELECT * from t1 CROSS JOIN t2; +S1 S1 +1 2 +SELECT * from t1 LEFT JOIN t2 USING(S1); +S1 S1 +1 NULL +SELECT * from t1 LEFT JOIN t2 ON(t2.S1=2); +S1 S1 +1 2 +SELECT * from t1 RIGHT JOIN t2 USING(S1); +S1 S1 +NULL 2 +SELECT * from t1 RIGHT JOIN t2 ON(t1.S1=1); +S1 S1 +1 2 +drop table t1,t2; create table t1 (id int primary key); create table t2 (id int); insert into t1 values (75); diff --git a/mysql-test/r/order_by.result b/mysql-test/r/order_by.result index 48773bfa916..9238d9eafcb 100644 --- a/mysql-test/r/order_by.result +++ b/mysql-test/r/order_by.result @@ -304,7 +304,7 @@ a b c 1 NULL b explain select * from t1 where a >= 1 and a < 3 and b >0 order by a desc,b desc; table type possible_keys key key_len ref rows Extra -t1 range a a 9 NULL 8 Using where; Using index; Using filesort +t1 range a a 9 NULL 8 Using where; Using index explain select * from t1 where a = 2 and b >0 order by a desc,b desc; table type possible_keys key key_len ref rows Extra t1 range a a 9 NULL 5 Using where; Using index @@ -320,7 +320,18 @@ table type possible_keys key key_len ref rows Extra t1 range a a 9 NULL 5 Using where; Using index explain select * from t1 where a = 2 and b < 2 order by a desc,b desc; table type possible_keys key key_len ref rows Extra -t1 range a a 9 NULL 2 Using where; Using index; Using filesort +t1 range a a 9 NULL 2 Using where; Using index +explain select * from t1 where a = 1 order by b desc; +table type possible_keys key key_len ref rows Extra +t1 ref a a 4 const 5 Using where; Using index +select * from t1 where a = 1 order by b desc; +a b c +1 3 b +1 1 b +1 1 b +1 1 NULL +1 NULL b +1 NULL NULL alter table t1 modify b int not null, modify c varchar(10) not null; explain select * from t1 order by a, b, c; table type possible_keys key key_len ref rows Extra diff --git a/mysql-test/t/func_group.test b/mysql-test/t/func_group.test index 04a2ff68a92..1915c2172ad 100644 --- a/mysql-test/t/func_group.test +++ b/mysql-test/t/func_group.test @@ -21,7 +21,7 @@ select count(distinct a),count(distinct grp) from t1; insert into t1 values (null,null,''); select count(distinct a),count(distinct grp) from t1; -select sum(a),count(a),avg(a),std(a),bit_or(a),bit_and(a),min(a),max(a),min(c),max(c) from t1; +select sum(all a),count(all a),avg(all a),std(all a),bit_or(all a),bit_and(all a),min(all a),max(all a),min(all c),max(all c) from t1; select grp, sum(a),count(a),avg(a),std(a),bit_or(a),bit_and(a),min(a),max(a),min(c),max(c) from t1 group by grp; select grp, sum(a)+count(a)+avg(a)+std(a)+bit_or(a)+bit_and(a)+min(a)+max(a)+min(c)+max(c) as sum from t1 group by grp; diff --git a/mysql-test/t/innodb.test b/mysql-test/t/innodb.test index eb5b0c9efd2..250b68a3845 100644 --- a/mysql-test/t/innodb.test +++ b/mysql-test/t/innodb.test @@ -167,7 +167,7 @@ drop table t1; # create table t1 (a integer) type=innodb; -begin; +start transaction; rename table t1 to t2; create table t1 (b integer) type=innodb; insert into t1 values (1); diff --git a/mysql-test/t/join.test b/mysql-test/t/join.test index f58281af003..70980f656ab 100644 --- a/mysql-test/t/join.test +++ b/mysql-test/t/join.test @@ -1,7 +1,30 @@ +# +# Initialization +drop table if exists t1,t2,t3; + +# +# Test different join syntaxes +# + +CREATE TABLE t1 (S1 INT); +CREATE TABLE t2 (S1 INT); +INSERT INTO t1 VALUES (1); +INSERT INTO t2 VALUES (2); +SELECT * FROM t1 JOIN t2; +SELECT * FROM t1 INNER JOIN t2; +SELECT * from t1 JOIN t2 USING (S1); +SELECT * FROM t1 INNER JOIN t2 USING (S1); +SELECT * from t1 CROSS JOIN t2; +SELECT * from t1 LEFT JOIN t2 USING(S1); +SELECT * from t1 LEFT JOIN t2 ON(t2.S1=2); +SELECT * from t1 RIGHT JOIN t2 USING(S1); +SELECT * from t1 RIGHT JOIN t2 ON(t1.S1=1); +drop table t1,t2; + # # This failed for lia Perminov # -drop table if exists t1,t2,t3; + create table t1 (id int primary key); create table t2 (id int); diff --git a/mysql-test/t/order_by.test b/mysql-test/t/order_by.test index 0ee6f901aae..8291a475d5e 100644 --- a/mysql-test/t/order_by.test +++ b/mysql-test/t/order_by.test @@ -227,7 +227,8 @@ explain select * from t1 where a = 2 and (b is null or b > 0) order by a desc,b desc; explain select * from t1 where a = 2 and b > 0 order by a desc,b desc; explain select * from t1 where a = 2 and b < 2 order by a desc,b desc; - +explain select * from t1 where a = 1 order by b desc; +select * from t1 where a = 1 order by b desc; # # Test things when we don't have NULL keys # diff --git a/sql/filesort.cc b/sql/filesort.cc index ad16c16db3e..2ac05ef0496 100644 --- a/sql/filesort.cc +++ b/sql/filesort.cc @@ -461,7 +461,10 @@ static void make_sortkey(register SORTPARAM *param, { if (field->is_null()) { - bzero((char*) to,sort_field->length+1); + if (sort_field->reverse) + bfill(to,sort_field->length+1,(char) 255); + else + bzero((char*) to,sort_field->length+1); to+= sort_field->length+1; continue; } diff --git a/sql/lex.h b/sql/lex.h index 6ebbcb44003..64ba98b5e35 100644 --- a/sql/lex.h +++ b/sql/lex.h @@ -260,6 +260,7 @@ static SYMBOL symbols[] = { { "NULL", SYM(NULL_SYM),0,0}, { "NUMERIC", SYM(NUMERIC_SYM),0,0}, { "OFFSET", SYM(OFFSET_SYM),0,0}, + { "OLD_PASSWORD", SYM(PASSWORD),0,0}, { "ON", SYM(ON),0,0}, { "OPEN", SYM(OPEN_SYM),0,0}, { "OPTIMIZE", SYM(OPTIMIZE),0,0}, diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index 2afc4a5754e..d9a4302ce0c 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -53,14 +53,6 @@ char* query_table_status(THD *thd,const char *db,const char *table_name); #define PREV_BITS(type,A) ((type) (((type) 1 << (A)) -1)) #define all_bits_set(A,B) ((A) & (B) != (B)) -#ifndef LL -#ifdef HAVE_LONG_LONG -#define LL(A) A ## LL -#else -#define LL(A) A ## L -#endif -#endif - /*************************************************************************** Configuration parameters ****************************************************************************/ diff --git a/sql/opt_range.cc b/sql/opt_range.cc index c607e71c01b..768344ab702 100644 --- a/sql/opt_range.cc +++ b/sql/opt_range.cc @@ -2555,8 +2555,7 @@ QUICK_SELECT_DESC::QUICK_SELECT_DESC(QUICK_SELECT *q, uint used_key_parts) for (r = it++; r; r = it++) { rev_ranges.push_front(r); - if (not_read_after_key && range_reads_after_key(r) || - test_if_null_range(r,used_key_parts)) + if (not_read_after_key && range_reads_after_key(r)) { it.rewind(); // Reset range error = HA_ERR_UNSUPPORTED; @@ -2717,6 +2716,7 @@ bool QUICK_SELECT_DESC::range_reads_after_key(QUICK_RANGE *range_arg) /* True if we are reading over a key that may have a NULL value */ +#ifdef NOT_USED bool QUICK_SELECT_DESC::test_if_null_range(QUICK_RANGE *range_arg, uint used_key_parts) { @@ -2762,6 +2762,7 @@ bool QUICK_SELECT_DESC::test_if_null_range(QUICK_RANGE *range_arg, return 1; // Covers null part return 0; } +#endif /***************************************************************************** diff --git a/sql/opt_range.h b/sql/opt_range.h index af977eb3093..6a6b5ae3810 100644 --- a/sql/opt_range.h +++ b/sql/opt_range.h @@ -100,7 +100,9 @@ public: private: int cmp_prev(QUICK_RANGE *range); bool range_reads_after_key(QUICK_RANGE *range); +#ifdef NOT_USED bool test_if_null_range(QUICK_RANGE *range, uint used_key_parts); +#endif void reset(void) { next=0; rev_it.rewind(); } List rev_ranges; List_iterator rev_it; diff --git a/sql/slave.cc b/sql/slave.cc index 164b8ba458f..64d54be113e 100644 --- a/sql/slave.cc +++ b/sql/slave.cc @@ -1671,7 +1671,8 @@ int st_relay_log_info::wait_for_pos(THD* thd, String* log_name, */ ulong log_name_extension; char log_name_tmp[FN_REFLEN]; //make a char[] from String - char *end= strmake(log_name_tmp, log_name->ptr(), min(log_name->length(), FN_REFLEN-1)); + char *end= strmake(log_name_tmp, log_name->ptr(), min(log_name->length(), + FN_REFLEN-1)); char *p= fn_ext(log_name_tmp); char *p_end; if (!*p || log_pos<0) @@ -1756,15 +1757,14 @@ int st_relay_log_info::wait_for_pos(THD* thd, String* log_name, error= -1; break; } - else - error=0; + error=0; event_count++; } err: pthread_mutex_unlock(&data_lock); DBUG_PRINT("exit",("killed: %d abort: %d slave_running: %d \ -improper_arguments: %d timed_out: %d", +improper_arguments: %d timed_out: %d", (int) thd->killed, (int) (init_abort_pos_wait != abort_pos_wait), (int) mi->slave_running, diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 130f3ead5c7..6249c769015 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -2252,8 +2252,6 @@ mysql_execute_command(void) net_printf(&thd->net,ER_WRONG_DB_NAME, lex->name); break; } - if (lower_case_table_names) - casedn_str(lex->name); /* If in a slave thread : CREATE DATABASE DB was certainly not preceded by USE DB. diff --git a/sql/sql_select.cc b/sql/sql_select.cc index be5e5be7cb7..cf7f310bbd5 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -4555,6 +4555,11 @@ sub_select(JOIN *join,JOIN_TAB *join_tab,bool end_of_records) { if ((error=(*join_tab->next_select)(join,join_tab+1,0)) < 0) return error; + /* + Test if this was a SELECT DISTINCT query on a table that + was not in the field list; In this case we can abort if + we found a row, as no new rows can be added to the result. + */ if (not_used_in_distinct && found_records != join->found_records) return 0; } diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index d94118ebfc6..8be025d0423 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -579,7 +579,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); insert_values update delete truncate rename show describe load alter optimize flush reset purge begin commit rollback slave master_def master_defs - repair restore backup analyze check + repair restore backup analyze check start field_list field_list_item field_spec kill select_item_list select_item values_list no_braces limit_clause delete_limit_clause fields opt_values values @@ -657,6 +657,7 @@ verb_clause: | select | set | slave + | start | show | truncate | handler @@ -1328,6 +1329,11 @@ slave: lex->type = 0; }; +start: + START_SYM TRANSACTION_SYM { Lex->sql_command = SQLCOM_BEGIN;} + {} + ; + slave_thread_opts: slave_thread_opt | slave_thread_opts ',' slave_thread_opt; @@ -1999,7 +2005,7 @@ sum_expr: { $$=new Item_sum_and($3); } | BIT_OR '(' in_sum_expr ')' { $$=new Item_sum_or($3); } - | COUNT_SYM '(' '*' ')' + | COUNT_SYM '(' opt_all '*' ')' { $$=new Item_sum_count(new Item_int((int32) 0L,1)); } | COUNT_SYM '(' in_sum_expr ')' { $$=new Item_sum_count($3); } @@ -2017,11 +2023,12 @@ sum_expr: { $$=new Item_sum_sum($3); }; in_sum_expr: + opt_all { Select->in_sum_expr++; } expr { Select->in_sum_expr--; - $$=$2; + $$=$3; }; cast_type: @@ -2092,19 +2099,22 @@ opt_pad: join_table_list: '(' join_table_list ')' { $$=$2; } | join_table { $$=$1; } + | join_table_list ',' join_table_list { $$=$3; } | join_table_list normal_join join_table_list { $$=$3; } | join_table_list STRAIGHT_JOIN join_table_list { $$=$3 ; $$->straight=1; } - | join_table_list INNER_SYM JOIN_SYM join_table_list ON expr - { add_join_on($4,$6); $$=$4; } - | join_table_list INNER_SYM JOIN_SYM join_table_list + | join_table_list normal_join join_table_list ON expr + { add_join_on($3,$5); $$=$3; } + | join_table_list normal_join join_table_list + USING { SELECT_LEX *sel=Select; sel->db1=$1->db; sel->table1=$1->alias; - sel->db2=$4->db; sel->table2=$4->alias; + sel->db2=$3->db; sel->table2=$3->alias; } - USING '(' using_list ')' - { add_join_on($4,$8); $$=$4; } + '(' using_list ')' + { add_join_on($3,$7); $$=$3; } + | join_table_list LEFT opt_outer JOIN_SYM join_table_list ON expr { add_join_on($5,$7); $5->outer_join|=JOIN_TYPE_LEFT; $$=$5; } | join_table_list LEFT opt_outer JOIN_SYM join_table_list @@ -2133,9 +2143,10 @@ join_table_list: { add_join_natural($1,$4); $$=$4; }; normal_join: - ',' {} - | JOIN_SYM {} - | CROSS JOIN_SYM {}; + JOIN_SYM {} + | INNER_SYM JOIN_SYM {} + | CROSS JOIN_SYM {} + ; join_table: { @@ -2232,6 +2243,10 @@ opt_table_alias: | table_alias ident { $$= (LEX_STRING*) sql_memdup(&$2,sizeof(LEX_STRING)); }; +opt_all: + /* empty */ + | ALL + ; where_clause: /* empty */ { Select->where= 0; } From 4c7fa21510de6bb17b3dabd0aaa6e99687e89d7b Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 7 Feb 2003 10:35:08 +0200 Subject: [PATCH 2/3] Allow 4.0 to read new 4.1 .frm files Makefile.am: Remove blank lines configure.in: Keep version gamma --- Makefile.am | 1 - configure.in | 4 ++-- sql/table.cc | 31 ++++++++++++++++++++----------- 3 files changed, 22 insertions(+), 14 deletions(-) diff --git a/Makefile.am b/Makefile.am index dfdcfe0cabf..e69b336a2c0 100644 --- a/Makefile.am +++ b/Makefile.am @@ -83,4 +83,3 @@ tags: test: cd mysql-test ; ./mysql-test-run - diff --git a/configure.in b/configure.in index ed814ca18b1..d2469f1fffd 100644 --- a/configure.in +++ b/configure.in @@ -4,7 +4,7 @@ dnl Process this file with autoconf to produce a configure script. AC_INIT(sql/mysqld.cc) AC_CANONICAL_SYSTEM # The Docs Makefile.am parses this line! -AM_INIT_AUTOMAKE(mysql, 4.0.11) +AM_INIT_AUTOMAKE(mysql, 4.0.11-gamma) AM_CONFIG_HEADER(config.h) PROTOCOL_VERSION=10 @@ -702,7 +702,7 @@ AC_ARG_WITH(mysqld-user, AC_SUBST(MYSQLD_USER) # If we should allow LOAD DATA LOCAL -AC_MSG_CHECKING(if we should should enable LOAD DATA LOCAL by default) +AC_MSG_CHECKING(If we should should enable LOAD DATA LOCAL by default) AC_ARG_ENABLE(local-infile, [ --enable-local-infile Enable LOAD DATA LOCAL INFILE (default: disabled)], [ ENABLED_LOCAL_INFILE=$enableval ], diff --git a/sql/table.cc b/sql/table.cc index 9eaea728007..1635c85eca8 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -95,11 +95,11 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag, if (my_read(file,(byte*) head,64,MYF(MY_NABP))) goto err_not_open; if (head[0] != (uchar) 254 || head[1] != 1 || - (head[2] != FRM_VER && head[2] > FRM_VER+2)) + (head[2] != FRM_VER && head[2] != FRM_VER+1 && head[2] != FRM_VER+3)) goto err_not_open; /* purecov: inspected */ new_field_pack_flag=head[27]; new_frm_ver= (head[2] - FRM_VER); - field_pack_length= new_frm_ver < 2 ? 11 : 15; + field_pack_length= new_frm_ver < 2 ? 11 : 17; error=3; if (!(pos=get_form_pos(file,head,(TYPELIB*) 0))) @@ -154,7 +154,7 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag, for (i=0 ; i < keys ; i++, keyinfo++) { - if (new_frm_ver == 2) + if (new_frm_ver == 3) { keyinfo->flags= (uint) uint2korr(strpos) ^ HA_NOSAME; keyinfo->key_length= (uint) uint2korr(strpos+2); @@ -343,28 +343,37 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag, for (i=0 ; i < outparam->fields; i++, strpos+=field_pack_length, field_ptr++) { - uint pack_flag= uint2korr(strpos+6); - uint interval_nr= (uint) strpos[10]; + uint pack_flag, interval_nr, unireg_type, recpos, field_length; enum_field_types field_type; - if (new_frm_ver == 2) + if (new_frm_ver == 3) { /* new frm file in 4.1 */ - field_type=(enum_field_types) (uint) strpos[11]; + field_length= uint2korr(strpos+3); + recpos= uint3korr(strpos+5); + pack_flag= uint2korr(strpos+8); + unireg_type= (uint) strpos[10]; + interval_nr= (uint) strpos[12]; + field_type= (enum_field_types) (uint) strpos[13]; } else { /* old frm file */ + field_length= (uint) strpos[3]; + recpos= uint2korr(strpos+4), + pack_flag= uint2korr(strpos+6); + unireg_type= (uint) strpos[8]; + interval_nr= (uint) strpos[10]; field_type= (enum_field_types) f_packtype(pack_flag); } *field_ptr=reg_field= - make_field(record+uint2korr(strpos+4), - (uint32) strpos[3], // field_length + make_field(record+recpos, + (uint32) field_length, null_pos,null_bit, pack_flag, field_type, - (Field::utype) MTYP_TYPENR((uint) strpos[8]), + (Field::utype) MTYP_TYPENR(unireg_type), (interval_nr ? outparam->intervals+interval_nr-1 : (TYPELIB*) 0), @@ -1215,7 +1224,7 @@ db_type get_table_type(const char *name) error=my_read(file,(byte*) head,4,MYF(MY_NABP)); my_close(file,MYF(0)); if (error || head[0] != (uchar) 254 || head[1] != 1 || - (head[2] != FRM_VER && head[2] != FRM_VER+1)) + (head[2] != FRM_VER && head[2] != FRM_VER+1 && head[2] != FRM_VER+3)) DBUG_RETURN(DB_TYPE_UNKNOWN); DBUG_RETURN(ha_checktype((enum db_type) (uint) *(head+3))); } From 7f84171381a4459a37ca919e666736dd9d9c4ea8 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 7 Feb 2003 12:54:10 +0200 Subject: [PATCH 3/3] Added test for SHOW CREATE --- mysql-test/r/show_check.result | 56 ++++++++++++++++++++++++++++++++++ mysql-test/t/show_check.test | 35 +++++++++++++++++++++ 2 files changed, 91 insertions(+) diff --git a/mysql-test/r/show_check.result b/mysql-test/r/show_check.result index 2c32d766a38..fa2f381d905 100644 --- a/mysql-test/r/show_check.result +++ b/mysql-test/r/show_check.result @@ -156,6 +156,62 @@ f double(5,0) YES NULL h float(3,2) YES NULL i float(3,0) YES NULL drop table t1; +create table t1 ( +type_bool bool not null, +type_tiny tinyint not null auto_increment primary key, +type_short smallint(3), +type_mediumint mediumint, +type_bigint bigint, +type_decimal decimal(5,2), +type_numeric numeric(5,2), +empty_char char(0), +type_char char(2), +type_varchar varchar(10), +type_timestamp timestamp not null, +type_date date not null, +type_time time not null, +type_datetime datetime not null, +type_year year, +type_enum enum ('red', 'green', 'blue'), +type_set enum ('red', 'green', 'blue'), +type_tinyblob tinyblob, +type_blob blob, +type_medium_blob mediumblob, +type_long_blob longblob, +index(type_short) +) AVG_ROW_LENGTH=10 CHECKSUM=1 COMMENT="test" TYPE=MYISAM MIN_ROWS=10 MAX_ROWS=100 PACK_KEYS=1 DELAY_KEY_WRITE=1 ROW_FORMAT=fixed CHARSET=latin1; +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `type_bool` tinyint(1) NOT NULL default '0', + `type_tiny` tinyint(4) NOT NULL auto_increment, + `type_short` smallint(3) default NULL, + `type_mediumint` mediumint(9) default NULL, + `type_bigint` bigint(20) default NULL, + `type_decimal` decimal(5,2) default NULL, + `type_numeric` decimal(5,2) default NULL, + `empty_char` char(0) default NULL, + `type_char` char(2) default NULL, + `type_varchar` varchar(10) default NULL, + `type_timestamp` timestamp(14) NOT NULL, + `type_date` date NOT NULL default '0000-00-00', + `type_time` time NOT NULL default '00:00:00', + `type_datetime` datetime NOT NULL default '0000-00-00 00:00:00', + `type_year` year(4) default NULL, + `type_enum` enum('red','green','blue') default NULL, + `type_set` enum('red','green','blue') default NULL, + `type_tinyblob` tinyblob, + `type_blob` blob, + `type_medium_blob` mediumblob, + `type_long_blob` longblob, + PRIMARY KEY (`type_tiny`), + KEY `type_short` (`type_short`) +) TYPE=MyISAM MIN_ROWS=10 MAX_ROWS=100 AVG_ROW_LENGTH=10 PACK_KEYS=1 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=FIXED COMMENT='test' +insert into t1 (type_timestamp) values ("2003-02-07 10:00:01"); +select * from t1; +type_bool type_tiny type_short type_mediumint type_bigint type_decimal type_numeric empty_char type_char type_varchar type_timestamp type_date type_time type_datetime type_year type_enum type_set type_tinyblob type_blob type_medium_blob type_long_blob +0 1 NULL NULL NULL NULL NULL NULL NULL NULL 20030207100001 0000-00-00 00:00:00 0000-00-00 00:00:00 NULL NULL NULL NULL NULL NULL NULL +drop table t1; create table t1 (c decimal, d double, f float, r real); show columns from t1; Field Type Null Key Default Extra diff --git a/mysql-test/t/show_check.test b/mysql-test/t/show_check.test index 5e10ebf23a3..ba6fa930e22 100644 --- a/mysql-test/t/show_check.test +++ b/mysql-test/t/show_check.test @@ -80,6 +80,41 @@ create table t1 (a decimal(9,2), b decimal (9,0), e double(9,2), f double(5,0), show columns from t1; drop table t1; +# +# Do a create table that tries to cover all types and options +# +create table t1 ( +type_bool bool not null, +type_tiny tinyint not null auto_increment primary key, +type_short smallint(3), +type_mediumint mediumint, +type_bigint bigint, +type_decimal decimal(5,2), +type_numeric numeric(5,2), +empty_char char(0), +type_char char(2), +type_varchar varchar(10), +type_timestamp timestamp not null, +type_date date not null, +type_time time not null, +type_datetime datetime not null, +type_year year, +type_enum enum ('red', 'green', 'blue'), +type_set enum ('red', 'green', 'blue'), +type_tinyblob tinyblob, +type_blob blob, +type_medium_blob mediumblob, +type_long_blob longblob, +index(type_short) +) AVG_ROW_LENGTH=10 CHECKSUM=1 COMMENT="test" TYPE=MYISAM MIN_ROWS=10 MAX_ROWS=100 PACK_KEYS=1 DELAY_KEY_WRITE=1 ROW_FORMAT=fixed CHARSET=latin1; + +# Not tested above: RAID_# UNION INSERT_METHOD DATA DIRECTORY INDEX DIRECTORY +show create table t1; +insert into t1 (type_timestamp) values ("2003-02-07 10:00:01"); +select * from t1; +drop table t1; + + # Check auto conversions of types create table t1 (c decimal, d double, f float, r real);