diff --git a/Docs/manual.texi b/Docs/manual.texi index c46546cc93f..f63cbf03242 100644 --- a/Docs/manual.texi +++ b/Docs/manual.texi @@ -30091,6 +30091,15 @@ mysql> select OCTET_LENGTH('text'); Note that for @code{CHAR_LENGTH()}, multi-byte characters are only counted once. +@findex BIT_LENGTH() +@item BIT_LENGTH(str) +Returns the length of the string @code{str} in bits: + +@example +mysql> select BIT_LENGTH('text'); + -> 32 +@end example + @findex LOCATE() @findex POSITION() @item LOCATE(substr,str) @@ -47996,6 +48005,8 @@ Our TODO section contains what we plan to have in 4.0. @xref{TODO MySQL 4.0}. @itemize @bullet @item +ODBC compatibility: added @code{BIT_LENGTH()} function. +@item Added @code{CAST()} and @code{CONVERT()} functions. @item Changed order of how keys are created in tables. diff --git a/mysql-test/r/func_str.result b/mysql-test/r/func_str.result index 5aca1f6b021..a58f3c57169 100644 --- a/mysql-test/r/func_str.result +++ b/mysql-test/r/func_str.result @@ -8,6 +8,9 @@ hellomonty select length('\n\t\r\b\0\_\%\\'); length('\n\t\r\b\0\_\%\\') 10 +select bit_length('\n\t\r\b\0\_\%\\'); +bit_length('\n\t\r\b\0\_\%\\') +80 select concat('monty',' was here ','again'),length('hello'),char(ascii('h')); concat('monty',' was here ','again') length('hello') char(ascii('h')) monty was here again 5 h diff --git a/mysql-test/r/handler.result b/mysql-test/r/handler.result index cd39657c470..d495dde75bf 100644 --- a/mysql-test/r/handler.result +++ b/mysql-test/r/handler.result @@ -129,6 +129,7 @@ a b handler t2 read next; a b 18 eee +alter table t1 type=MyISAM; handler t2 read next; a b 19 fff diff --git a/mysql-test/t/func_str.test b/mysql-test/t/func_str.test index fd6ff0d70e7..26272fba03f 100644 --- a/mysql-test/t/func_str.test +++ b/mysql-test/t/func_str.test @@ -9,6 +9,7 @@ drop table if exists t1; select 'hello',"'hello'",'""hello""','''h''e''l''l''o''',"hel""lo",'hel\'lo'; select 'hello' 'monty'; select length('\n\t\r\b\0\_\%\\'); +select bit_length('\n\t\r\b\0\_\%\\'); select concat('monty',' was here ','again'),length('hello'),char(ascii('h')); select locate('he','hello'),locate('he','hello',2),locate('lo','hello',2) ; select instr('hello','HE'), instr('hello',binary 'HE'), instr(binary 'hello','HE'); diff --git a/mysql-test/t/handler.test b/mysql-test/t/handler.test index 359c5641056..4f1b11c80ff 100644 --- a/mysql-test/t/handler.test +++ b/mysql-test/t/handler.test @@ -58,8 +58,10 @@ handler t2 read a=(19) where b="yyy"; handler t2 read first; handler t2 read next; +alter table t1 type=MyISAM; handler t2 read next; !$1064 handler t2 read last; handler t2 close; drop table if exists t1; + diff --git a/scripts/mysqlhotcopy.sh b/scripts/mysqlhotcopy.sh index caf2615fe7a..063ff8be750 100644 --- a/scripts/mysqlhotcopy.sh +++ b/scripts/mysqlhotcopy.sh @@ -307,7 +307,7 @@ foreach my $rdb ( @db_desc ) { $rdb->{files} = [ @db_files ]; $rdb->{index} = [ @index_files ]; - my @hc_tables = map { "$db.$_" } @dbh_tables; + my @hc_tables = map { "`$db.$_`" } @dbh_tables; $rdb->{tables} = [ @hc_tables ]; $rdb->{raid_dirs} = [ get_raid_dirs( $rdb->{files} ) ]; diff --git a/sql/item_create.cc b/sql/item_create.cc index 4b60ad1bf56..6f64e9517ba 100644 --- a/sql/item_create.cc +++ b/sql/item_create.cc @@ -200,6 +200,11 @@ Item *create_func_length(Item* a) return new Item_func_length(a); } +Item *create_func_bit_length(Item* a) +{ + return new Item_func_bit_length(a); +} + Item *create_func_char_length(Item* a) { return new Item_func_char_length(a); diff --git a/sql/item_create.h b/sql/item_create.h index 9318025cae8..580596505da 100644 --- a/sql/item_create.h +++ b/sql/item_create.h @@ -22,6 +22,7 @@ Item *create_func_ascii(Item* a); Item *create_func_asin(Item* a); Item *create_func_bin(Item* a); Item *create_func_bit_count(Item* a); +Item *create_func_bit_length(Item* a); Item *create_func_ceiling(Item* a); Item *create_func_char_length(Item* a); Item *create_func_connection_id(void); diff --git a/sql/item_func.h b/sql/item_func.h index 91fd6cdcc26..f7794028998 100644 --- a/sql/item_func.h +++ b/sql/item_func.h @@ -522,6 +522,14 @@ public: void fix_length_and_dec() { max_length=10; } }; +class Item_func_bit_length :public Item_func_length +{ +public: + Item_func_bit_length(Item *a) :Item_func_length(a) {} + longlong val_int() { return Item_func_length::val_int()*8; } + const char *func_name() const { return "bit_length"; } +}; + class Item_func_char_length :public Item_int_func { String value; diff --git a/sql/lex.h b/sql/lex.h index c2664e4e8c0..c9382275f0e 100644 --- a/sql/lex.h +++ b/sql/lex.h @@ -396,6 +396,7 @@ static SYMBOL sql_functions[] = { { "BIT_AND", SYM(BIT_AND),0,0}, { "CAST", SYM(CAST_SYM),0,0}, { "CEILING", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_ceiling)}, + { "BIT_LENGTH", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_bit_length)}, { "CHAR_LENGTH", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_char_length)}, { "CHARACTER_LENGTH", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_char_length)}, { "COALESCE", SYM(COALESCE),0,0}, diff --git a/sql/sql_handler.cc b/sql/sql_handler.cc index f7effdc67e6..0c6b5599519 100644 --- a/sql/sql_handler.cc +++ b/sql/sql_handler.cc @@ -130,7 +130,11 @@ int mysql_ha_read(THD *thd, TABLE_LIST *tables, select_limit+=offset_limit; send_fields(thd,list,1); + HANDLER_TABLES_HACK(thd); MYSQL_LOCK *lock=mysql_lock_tables(thd,&tables->table,1); + HANDLER_TABLES_HACK(thd); + if (!lock) + goto err0; // mysql_lock_tables() printed error message already for (uint num_rows=0; num_rows < select_limit; ) { @@ -238,6 +242,7 @@ ok: return 0; err: mysql_unlock_tables(thd,lock); +err0: return -1; }