Merge bk-internal.mysql.com:/home/bk/mysql-5.1

into  mysql.com:/home/my/mysql-5.1


mysql-test/extra/rpl_tests/rpl_log.test:
  Auto merged
mysql-test/r/rpl_ndb_log.result:
  Auto merged
mysql-test/r/rpl_row_log.result:
  Auto merged
mysql-test/r/rpl_row_log_innodb.result:
  Auto merged
sql/ha_ndbcluster.cc:
  Auto merged
sql/log_event.cc:
  Auto merged
sql/sql_class.cc:
  Auto merged
sql/sql_class.h:
  Auto merged
sql/sql_lex.cc:
  Auto merged
sql/sql_parse.cc:
  Auto merged
sql/sql_show.cc:
  Auto merged
sql/mysql_priv.h:
  SCCS merged
This commit is contained in:
unknown 2006-06-22 12:21:41 +03:00
commit 0f9ec6d6e8
40 changed files with 546 additions and 321 deletions

View File

@ -547,7 +547,6 @@ extern File my_open(const char *FileName,int Flags,myf MyFlags);
extern File my_register_filename(File fd, const char *FileName, extern File my_register_filename(File fd, const char *FileName,
enum file_type type_of_file, enum file_type type_of_file,
uint error_message_number, myf MyFlags); uint error_message_number, myf MyFlags);
extern void my_print_open_files(void);
extern File my_create(const char *FileName,int CreateFlags, extern File my_create(const char *FileName,int CreateFlags,
int AccessFlags, myf MyFlags); int AccessFlags, myf MyFlags);
extern int my_close(File Filedes,myf MyFlags); extern int my_close(File Filedes,myf MyFlags);
@ -638,7 +637,7 @@ extern void allow_break(void);
#endif #endif
#ifdef EXTRA_DEBUG #ifdef EXTRA_DEBUG
void my_print_open_files(); void my_print_open_files(void);
#else #else
#define my_print_open_files() #define my_print_open_files()
#endif #endif
@ -672,13 +671,15 @@ extern my_string my_path(my_string to,const char *progname,
const char *own_pathname_part); const char *own_pathname_part);
extern my_string my_load_path(my_string to, const char *path, extern my_string my_load_path(my_string to, const char *path,
const char *own_path_prefix); const char *own_path_prefix);
extern int wild_compare(const char *str,const char *wildstr,pbool str_is_pattern); extern int wild_compare(const char *str,const char *wildstr,
pbool str_is_pattern);
extern WF_PACK *wf_comp(my_string str); extern WF_PACK *wf_comp(my_string str);
extern int wf_test(struct wild_file_pack *wf_pack,const char *name); extern int wf_test(struct wild_file_pack *wf_pack,const char *name);
extern void wf_end(struct wild_file_pack *buffer); extern void wf_end(struct wild_file_pack *buffer);
extern size_s strip_sp(my_string str); extern size_s strip_sp(my_string str);
extern void get_date(my_string to,int timeflag,time_t use_time); extern void get_date(my_string to,int timeflag,time_t use_time);
extern void soundex(CHARSET_INFO *, my_string out_pntr, my_string in_pntr,pbool remove_garbage); extern void soundex(CHARSET_INFO *, my_string out_pntr, my_string in_pntr,
pbool remove_garbage);
extern int init_record_cache(RECORD_CACHE *info,uint cachesize,File file, extern int init_record_cache(RECORD_CACHE *info,uint cachesize,File file,
uint reclength,enum cache_type type, uint reclength,enum cache_type type,
pbool use_async_io); pbool use_async_io);

View File

@ -60,7 +60,7 @@ Variable_name Value
Qcache_hits 0 Qcache_hits 0
show status like "Qcache_not_cached"; show status like "Qcache_not_cached";
Variable_name Value Variable_name Value
Qcache_not_cached 5 Qcache_not_cached 0
select "user1"; select "user1";
user1 user1
user1 user1
@ -72,7 +72,7 @@ Variable_name Value
Qcache_hits 0 Qcache_hits 0
show status like "Qcache_not_cached"; show status like "Qcache_not_cached";
Variable_name Value Variable_name Value
Qcache_not_cached 9 Qcache_not_cached 1
select * from t1; select * from t1;
a b c a b c
1 1 1 1 1 1
@ -85,7 +85,7 @@ Variable_name Value
Qcache_hits 1 Qcache_hits 1
show status like "Qcache_not_cached"; show status like "Qcache_not_cached";
Variable_name Value Variable_name Value
Qcache_not_cached 12 Qcache_not_cached 1
select a from t1 ; select a from t1 ;
a a
1 1
@ -98,7 +98,7 @@ Variable_name Value
Qcache_hits 2 Qcache_hits 2
show status like "Qcache_not_cached"; show status like "Qcache_not_cached";
Variable_name Value Variable_name Value
Qcache_not_cached 15 Qcache_not_cached 1
select c from t1; select c from t1;
c c
1 1
@ -111,7 +111,7 @@ Variable_name Value
Qcache_hits 3 Qcache_hits 3
show status like "Qcache_not_cached"; show status like "Qcache_not_cached";
Variable_name Value Variable_name Value
Qcache_not_cached 18 Qcache_not_cached 1
show grants for current_user(); show grants for current_user();
Grants for @localhost Grants for @localhost
GRANT USAGE ON *.* TO ''@'localhost' GRANT USAGE ON *.* TO ''@'localhost'
@ -144,7 +144,7 @@ Variable_name Value
Qcache_hits 7 Qcache_hits 7
show status like "Qcache_not_cached"; show status like "Qcache_not_cached";
Variable_name Value Variable_name Value
Qcache_not_cached 22 Qcache_not_cached 2
select "user3"; select "user3";
user3 user3
user3 user3
@ -168,7 +168,7 @@ Variable_name Value
Qcache_hits 7 Qcache_hits 7
show status like "Qcache_not_cached"; show status like "Qcache_not_cached";
Variable_name Value Variable_name Value
Qcache_not_cached 30 Qcache_not_cached 7
select "user4"; select "user4";
user4 user4
user4 user4
@ -198,7 +198,7 @@ Variable_name Value
Qcache_hits 8 Qcache_hits 8
show status like "Qcache_not_cached"; show status like "Qcache_not_cached";
Variable_name Value Variable_name Value
Qcache_not_cached 34 Qcache_not_cached 8
set names binary; set names binary;
delete from mysql.user where user in ("mysqltest_1","mysqltest_2","mysqltest_3"); delete from mysql.user where user in ("mysqltest_1","mysqltest_2","mysqltest_3");
delete from mysql.db where user in ("mysqltest_1","mysqltest_2","mysqltest_3"); delete from mysql.db where user in ("mysqltest_1","mysqltest_2","mysqltest_3");

View File

@ -199,6 +199,8 @@ select table_name, column_name, privileges from information_schema.columns
where table_schema = 'mysqltest' and table_name = 'v1'; where table_schema = 'mysqltest' and table_name = 'v1';
table_name column_name privileges table_name column_name privileges
v1 c select v1 c select
explain select * from v1;
ERROR HY000: EXPLAIN/SHOW can not be issued; lacking privileges for underlying table
drop view v1, mysqltest.v1; drop view v1, mysqltest.v1;
drop tables mysqltest.t4, mysqltest.t1, t2, t3, t5; drop tables mysqltest.t4, mysqltest.t1, t2, t3, t5;
drop database mysqltest; drop database mysqltest;

View File

@ -1050,6 +1050,7 @@ Qcache_hits 1
drop table t1; drop table t1;
create table t1 (a int); create table t1 (a int);
insert into t1 values (1),(2); insert into t1 values (1),(2);
drop procedure if exists p1;
CREATE PROCEDURE `p1`() CREATE PROCEDURE `p1`()
begin begin
Declare c1 cursor for select a from t1; Declare c1 cursor for select a from t1;

View File

@ -23,6 +23,32 @@ select 1;
show status like 'last_query_cost'; show status like 'last_query_cost';
Variable_name Value Variable_name Value
Last_query_cost 0.000000 Last_query_cost 0.000000
create table t1 (a int);
insert into t1 values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
insert into t1 values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
insert into t1 values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
insert into t1 values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
insert into t1 values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
select * from t1 where a=6;
a
6
6
6
6
6
show status like 'last_query_cost';
Variable_name Value
Last_query_cost 12.084449
show status like 'last_query_cost';
Variable_name Value
Last_query_cost 12.084449
select 1;
1
1
show status like 'last_query_cost';
Variable_name Value
Last_query_cost 0.000000
drop table t1;
FLUSH STATUS; FLUSH STATUS;
SHOW STATUS LIKE 'max_used_connections'; SHOW STATUS LIKE 'max_used_connections';
Variable_name Value Variable_name Value
@ -43,3 +69,27 @@ SHOW STATUS LIKE 'max_used_connections';
Variable_name Value Variable_name Value
Max_used_connections 5 Max_used_connections 5
SET GLOBAL thread_cache_size=@save_thread_cache_size; SET GLOBAL thread_cache_size=@save_thread_cache_size;
show status like 'com_show_status';
Variable_name Value
Com_show_status 3
show status like 'hand%write%';
Variable_name Value
Handler_write 0
show status like '%tmp%';
Variable_name Value
Created_tmp_disk_tables 0
Created_tmp_files 0
Created_tmp_tables 0
show status like 'hand%write%';
Variable_name Value
Handler_write 0
show status like '%tmp%';
Variable_name Value
Created_tmp_disk_tables 0
Created_tmp_files 0
Created_tmp_tables 0
show status like 'com_show_status';
Variable_name Value
Com_show_status 8
rnd_diff tmp_table_diff
20 8

View File

@ -98,7 +98,7 @@ d
show status like "created_tmp%tables"; show status like "created_tmp%tables";
Variable_name Value Variable_name Value
Created_tmp_disk_tables 0 Created_tmp_disk_tables 0
Created_tmp_tables 2 Created_tmp_tables 1
drop table t1; drop table t1;
create temporary table v1 as select 'This is temp. table' A; create temporary table v1 as select 'This is temp. table' A;
create view v1 as select 'This is view' A; create view v1 as select 'This is view' A;

View File

@ -836,27 +836,27 @@ count(*)
26 26
show status like 'Slow_queries'; show status like 'Slow_queries';
Variable_name Value Variable_name Value
Slow_queries 1 Slow_queries 0
select count(*) from t1 where b=13; select count(*) from t1 where b=13;
count(*) count(*)
10 10
show status like 'Slow_queries'; show status like 'Slow_queries';
Variable_name Value Variable_name Value
Slow_queries 3 Slow_queries 1
select count(*) from t1 where b=13 union select count(*) from t1 where a=7; select count(*) from t1 where b=13 union select count(*) from t1 where a=7;
count(*) count(*)
10 10
26 26
show status like 'Slow_queries'; show status like 'Slow_queries';
Variable_name Value Variable_name Value
Slow_queries 5 Slow_queries 2
select count(*) from t1 where a=7 union select count(*) from t1 where b=13; select count(*) from t1 where a=7 union select count(*) from t1 where b=13;
count(*) count(*)
26 26
10 10
show status like 'Slow_queries'; show status like 'Slow_queries';
Variable_name Value Variable_name Value
Slow_queries 7 Slow_queries 3
flush status; flush status;
select a from t1 where b not in (1,2,3) union select a from t1 where b not in (4,5,6); select a from t1 where b not in (1,2,3) union select a from t1 where b not in (4,5,6);
a a

View File

@ -1,4 +1,7 @@
--disable_warnings
create database if not exists events_test; create database if not exists events_test;
--enable_warnings
use events_test; use events_test;
--error ER_NOT_SUPPORTED_YET --error ER_NOT_SUPPORTED_YET

View File

@ -80,6 +80,8 @@ connect (user4,localhost,mysqltest_3,,mysqltest);
connection user4; connection user4;
select table_name, column_name, privileges from information_schema.columns select table_name, column_name, privileges from information_schema.columns
where table_schema = 'mysqltest' and table_name = 'v1'; where table_schema = 'mysqltest' and table_name = 'v1';
--error 1345
explain select * from v1;
connection default; connection default;
drop view v1, mysqltest.v1; drop view v1, mysqltest.v1;

View File

@ -765,6 +765,9 @@ drop table t1;
create table t1 (a int); create table t1 (a int);
insert into t1 values (1),(2); insert into t1 values (1),(2);
--disable_warnings
drop procedure if exists p1;
--enable_warnings
delimiter //; delimiter //;
CREATE PROCEDURE `p1`() CREATE PROCEDURE `p1`()
begin begin

View File

@ -48,6 +48,19 @@ connection default;
select 1; select 1;
show status like 'last_query_cost'; show status like 'last_query_cost';
create table t1 (a int);
insert into t1 values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
insert into t1 values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
insert into t1 values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
insert into t1 values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
insert into t1 values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
select * from t1 where a=6;
show status like 'last_query_cost';
# Ensure value dosn't change by second status call
show status like 'last_query_cost';
select 1;
show status like 'last_query_cost';
drop table t1;
# #
# Test for Bug #15933 max_used_connections is wrong after FLUSH STATUS # Test for Bug #15933 max_used_connections is wrong after FLUSH STATUS
@ -144,3 +157,24 @@ disconnect con2;
disconnect con1; disconnect con1;
# End of 5.0 tests # End of 5.0 tests
#
# Ensure that SHOW STATUS only changes global status variables
#
connect (con1,localhost,root,,);
let $rnd_next = `show global status like 'handler_read_rnd_next'`;
let $tmp_table = `show global status like 'Created_tmp_tables'`;
show status like 'com_show_status';
show status like 'hand%write%';
show status like '%tmp%';
show status like 'hand%write%';
show status like '%tmp%';
show status like 'com_show_status';
let $rnd_next2 = `show global status like 'handler_read_rnd_next'`;
let $tmp_table2 = `show global status like 'Created_tmp_tables'`;
--disable_query_log
eval select substring_index('$rnd_next2',0x9,-1)-substring_index('$rnd_next',0x9,-1) as rnd_diff, substring_index('$tmp_table2',0x9,-1)-substring_index('$tmp_table',0x9,-1) as tmp_table_diff;
--enable_query_log
# End of 5.1 tests

View File

@ -470,8 +470,10 @@ int resize_key_cache(KEY_CACHE *keycache, uint key_cache_block_size,
uint age_threshold) uint age_threshold)
{ {
int blocks; int blocks;
#ifdef THREAD
struct st_my_thread_var *thread; struct st_my_thread_var *thread;
KEYCACHE_WQUEUE *wqueue; KEYCACHE_WQUEUE *wqueue;
#endif
DBUG_ENTER("resize_key_cache"); DBUG_ENTER("resize_key_cache");
if (!keycache->key_cache_inited) if (!keycache->key_cache_inited)
@ -1102,8 +1104,12 @@ static void unreg_request(KEY_CACHE *keycache,
static inline void remove_reader(BLOCK_LINK *block) static inline void remove_reader(BLOCK_LINK *block)
{ {
#ifdef THREAD
if (! --block->hash_link->requests && block->condvar) if (! --block->hash_link->requests && block->condvar)
keycache_pthread_cond_signal(block->condvar); keycache_pthread_cond_signal(block->condvar);
#else
--block->hash_link->requests;
#endif
} }
@ -1112,7 +1118,8 @@ static inline void remove_reader(BLOCK_LINK *block)
signals on its termination signals on its termination
*/ */
static inline void wait_for_readers(KEY_CACHE *keycache, BLOCK_LINK *block) static inline void wait_for_readers(KEY_CACHE *keycache __attribute__((unused)),
BLOCK_LINK *block)
{ {
#ifdef THREAD #ifdef THREAD
struct st_my_thread_var *thread= my_thread_var; struct st_my_thread_var *thread= my_thread_var;
@ -1209,7 +1216,6 @@ static HASH_LINK *get_hash_link(KEY_CACHE *keycache,
int file, my_off_t filepos) int file, my_off_t filepos)
{ {
reg1 HASH_LINK *hash_link, **start; reg1 HASH_LINK *hash_link, **start;
KEYCACHE_PAGE page;
#if defined(KEYCACHE_DEBUG) #if defined(KEYCACHE_DEBUG)
int cnt; int cnt;
#endif #endif
@ -1264,6 +1270,7 @@ restart:
#ifdef THREAD #ifdef THREAD
/* Wait for a free hash link */ /* Wait for a free hash link */
struct st_my_thread_var *thread= my_thread_var; struct st_my_thread_var *thread= my_thread_var;
KEYCACHE_PAGE page;
KEYCACHE_DBUG_PRINT("get_hash_link", ("waiting")); KEYCACHE_DBUG_PRINT("get_hash_link", ("waiting"));
page.file= file; page.file= file;
page.filepos= filepos; page.filepos= filepos;
@ -1588,8 +1595,10 @@ restart:
/* Remove the hash link for this page from the hash table */ /* Remove the hash link for this page from the hash table */
unlink_hash(keycache, block->hash_link); unlink_hash(keycache, block->hash_link);
/* All pending requests for this page must be resubmitted */ /* All pending requests for this page must be resubmitted */
#ifdef THREAD
if (block->wqueue[COND_FOR_SAVED].last_thread) if (block->wqueue[COND_FOR_SAVED].last_thread)
release_queue(&block->wqueue[COND_FOR_SAVED]); release_queue(&block->wqueue[COND_FOR_SAVED]);
#endif
} }
link_to_file_list(keycache, block, file, link_to_file_list(keycache, block, file,
(my_bool)(block->hash_link ? 1 : 0)); (my_bool)(block->hash_link ? 1 : 0));
@ -1669,7 +1678,7 @@ restart:
portion is less than read_length, but not less than min_length. portion is less than read_length, but not less than min_length.
*/ */
static void read_block(KEY_CACHE *keycache, static void read_block(KEY_CACHE *keycache __attribute__((unused)),
BLOCK_LINK *block, uint read_length, BLOCK_LINK *block, uint read_length,
uint min_length, my_bool primary) uint min_length, my_bool primary)
{ {
@ -1707,8 +1716,10 @@ static void read_block(KEY_CACHE *keycache,
KEYCACHE_DBUG_PRINT("read_block", KEYCACHE_DBUG_PRINT("read_block",
("primary request: new page in cache")); ("primary request: new page in cache"));
/* Signal that all pending requests for this page now can be processed */ /* Signal that all pending requests for this page now can be processed */
#ifdef THREAD
if (block->wqueue[COND_FOR_REQUESTED].last_thread) if (block->wqueue[COND_FOR_REQUESTED].last_thread)
release_queue(&block->wqueue[COND_FOR_REQUESTED]); release_queue(&block->wqueue[COND_FOR_REQUESTED]);
#endif
} }
else else
{ {
@ -1973,9 +1984,11 @@ int key_cache_insert(KEY_CACHE *keycache,
block->length= read_length+offset; block->length= read_length+offset;
KEYCACHE_DBUG_PRINT("key_cache_insert", KEYCACHE_DBUG_PRINT("key_cache_insert",
("primary request: new page in cache")); ("primary request: new page in cache"));
#ifdef THREAD
/* Signal that all pending requests for this now can be processed. */ /* Signal that all pending requests for this now can be processed. */
if (block->wqueue[COND_FOR_REQUESTED].last_thread) if (block->wqueue[COND_FOR_REQUESTED].last_thread)
release_queue(&block->wqueue[COND_FOR_REQUESTED]); release_queue(&block->wqueue[COND_FOR_REQUESTED]);
#endif
} }
remove_reader(block); remove_reader(block);
@ -2219,9 +2232,11 @@ static void free_block(KEY_CACHE *keycache, BLOCK_LINK *block)
/* Keep track of the number of currently unused blocks. */ /* Keep track of the number of currently unused blocks. */
keycache->blocks_unused++; keycache->blocks_unused++;
#ifdef THREAD
/* All pending requests for this page must be resubmitted. */ /* All pending requests for this page must be resubmitted. */
if (block->wqueue[COND_FOR_SAVED].last_thread) if (block->wqueue[COND_FOR_SAVED].last_thread)
release_queue(&block->wqueue[COND_FOR_SAVED]); release_queue(&block->wqueue[COND_FOR_SAVED]);
#endif
} }
@ -2275,12 +2290,14 @@ static int flush_cached_blocks(KEY_CACHE *keycache,
if (!last_errno) if (!last_errno)
last_errno= errno ? errno : -1; last_errno= errno ? errno : -1;
} }
#ifdef THREAD
/* /*
Let to proceed for possible waiting requests to write to the block page. Let to proceed for possible waiting requests to write to the block page.
It might happen only during an operation to resize the key cache. It might happen only during an operation to resize the key cache.
*/ */
if (block->wqueue[COND_FOR_SAVED].last_thread) if (block->wqueue[COND_FOR_SAVED].last_thread)
release_queue(&block->wqueue[COND_FOR_SAVED]); release_queue(&block->wqueue[COND_FOR_SAVED]);
#endif
/* type will never be FLUSH_IGNORE_CHANGED here */ /* type will never be FLUSH_IGNORE_CHANGED here */
if (! (type == FLUSH_KEEP || type == FLUSH_FORCE_WRITE)) if (! (type == FLUSH_KEEP || type == FLUSH_FORCE_WRITE))
{ {

View File

@ -53,8 +53,10 @@ static struct my_err_head
int meh_first; /* error number matching array slot 0 */ int meh_first; /* error number matching array slot 0 */
int meh_last; /* error number matching last slot */ int meh_last; /* error number matching last slot */
} my_errmsgs_globerrs = {NULL, globerrs, EE_ERROR_FIRST, EE_ERROR_LAST}; } my_errmsgs_globerrs = {NULL, globerrs, EE_ERROR_FIRST, EE_ERROR_LAST};
static struct my_err_head *my_errmsgs_list= &my_errmsgs_globerrs; static struct my_err_head *my_errmsgs_list= &my_errmsgs_globerrs;
/* /*
Error message to user Error message to user
@ -76,7 +78,6 @@ int my_error(int nr, myf MyFlags, ...)
va_list args; va_list args;
char ebuff[ERRMSGSIZE + 20]; char ebuff[ERRMSGSIZE + 20];
DBUG_ENTER("my_error"); DBUG_ENTER("my_error");
DBUG_PRINT("my", ("nr: %d MyFlags: %d errno: %d", nr, MyFlags, errno)); DBUG_PRINT("my", ("nr: %d MyFlags: %d errno: %d", nr, MyFlags, errno));
/* Search for the error messages array, which could contain the message. */ /* Search for the error messages array, which could contain the message. */
@ -102,6 +103,7 @@ int my_error(int nr, myf MyFlags, ...)
DBUG_RETURN((*error_handler_hook)(nr, ebuff, MyFlags)); DBUG_RETURN((*error_handler_hook)(nr, ebuff, MyFlags));
} }
/* /*
Error as printf Error as printf

View File

@ -1,4 +1,21 @@
#include "my_base.h" /* Copyright (C) 2000 MySQL AB
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
#include <my_global.h>
#include <m_string.h>
/* /*
my_memmem, port of a GNU extension. my_memmem, port of a GNU extension.

View File

@ -205,8 +205,8 @@ LEX_STRING interval_type_to_name[] = {
int sortcmp_lex_string(LEX_STRING s, LEX_STRING t, CHARSET_INFO *cs) int sortcmp_lex_string(LEX_STRING s, LEX_STRING t, CHARSET_INFO *cs)
{ {
return cs->coll->strnncollsp(cs, (unsigned char *) s.str,s.length, return cs->coll->strnncollsp(cs, (uchar *) s.str,s.length,
(unsigned char *) t.str,t.length, 0); (uchar *) t.str,t.length, 0);
} }

View File

@ -5212,7 +5212,7 @@ int Field_year::store(const char *from, uint len,CHARSET_INFO *cs)
else if (nr > 1900) else if (nr > 1900)
nr-= 1900; nr-= 1900;
} }
*ptr= (char) (unsigned char) nr; *ptr= (char) (uchar) nr;
return error; return error;
} }
@ -5244,7 +5244,7 @@ int Field_year::store(longlong nr, bool unsigned_val)
else if (nr > 1900) else if (nr > 1900)
nr-= 1900; nr-= 1900;
} }
*ptr= (char) (unsigned char) nr; *ptr= (char) (uchar) nr;
return 0; return 0;
} }
@ -6202,9 +6202,9 @@ int Field_string::cmp(const char *a_ptr, const char *b_ptr)
void Field_string::sort_string(char *to,uint length) void Field_string::sort_string(char *to,uint length)
{ {
uint tmp=my_strnxfrm(field_charset, uint tmp= my_strnxfrm(field_charset,
(unsigned char *) to, length, (uchar*) to, length,
(unsigned char *) ptr, field_length); (uchar*) ptr, field_length);
DBUG_ASSERT(tmp == length); DBUG_ASSERT(tmp == length);
} }

View File

@ -672,62 +672,62 @@ static void make_sortkey(register SORTPARAM *param,
switch (sort_field->result_type) { switch (sort_field->result_type) {
case STRING_RESULT: case STRING_RESULT:
{ {
CHARSET_INFO *cs=item->collation.collation; CHARSET_INFO *cs=item->collation.collation;
char fill_char= ((cs->state & MY_CS_BINSORT) ? (char) 0 : ' '); char fill_char= ((cs->state & MY_CS_BINSORT) ? (char) 0 : ' ');
int diff; int diff;
uint sort_field_length; uint sort_field_length;
if (maybe_null) if (maybe_null)
*to++=1; *to++=1;
/* All item->str() to use some extra byte for end null.. */ /* All item->str() to use some extra byte for end null.. */
String tmp((char*) to,sort_field->length+4,cs); String tmp((char*) to,sort_field->length+4,cs);
String *res= item->str_result(&tmp); String *res= item->str_result(&tmp);
if (!res) if (!res)
{ {
if (maybe_null) if (maybe_null)
bzero((char*) to-1,sort_field->length+1); bzero((char*) to-1,sort_field->length+1);
else
{
DBUG_PRINT("warning",
("Got null on something that shouldn't be null"));
bzero((char*) to,sort_field->length); // Avoid crash
}
break;
}
length= res->length();
sort_field_length= sort_field->length - sort_field->suffix_length;
diff=(int) (sort_field_length - length);
if (diff < 0)
{
diff=0; /* purecov: inspected */
length= sort_field_length;
}
if (sort_field->suffix_length)
{
/* Store length last in result_string */
store_length(to + sort_field_length, length,
sort_field->suffix_length);
}
if (sort_field->need_strxnfrm)
{
char *from=(char*) res->ptr();
uint tmp_length;
if ((unsigned char *)from == to)
{
set_if_smaller(length,sort_field->length);
memcpy(param->tmp_buffer,from,length);
from=param->tmp_buffer;
}
tmp_length= my_strnxfrm(cs,to,sort_field->length,
(unsigned char *) from, length);
DBUG_ASSERT(tmp_length == sort_field->length);
}
else else
{ {
my_strnxfrm(cs,(uchar*)to,length,(const uchar*)res->ptr(),length); DBUG_PRINT("warning",
cs->cset->fill(cs, (char *)to+length,diff,fill_char); ("Got null on something that shouldn't be null"));
bzero((char*) to,sort_field->length); // Avoid crash
} }
break; break;
}
length= res->length();
sort_field_length= sort_field->length - sort_field->suffix_length;
diff=(int) (sort_field_length - length);
if (diff < 0)
{
diff=0; /* purecov: inspected */
length= sort_field_length;
}
if (sort_field->suffix_length)
{
/* Store length last in result_string */
store_length(to + sort_field_length, length,
sort_field->suffix_length);
}
if (sort_field->need_strxnfrm)
{
char *from=(char*) res->ptr();
uint tmp_length;
if ((uchar*) from == to)
{
set_if_smaller(length,sort_field->length);
memcpy(param->tmp_buffer,from,length);
from=param->tmp_buffer;
}
tmp_length= my_strnxfrm(cs,to,sort_field->length,
(uchar*) from, length);
DBUG_ASSERT(tmp_length == sort_field->length);
}
else
{
my_strnxfrm(cs,(uchar*)to,length,(const uchar*)res->ptr(),length);
cs->cset->fill(cs, (char *)to+length,diff,fill_char);
}
break;
} }
case INT_RESULT: case INT_RESULT:
{ {

View File

@ -119,7 +119,7 @@ int ndbcluster_util_inited= 0;
static Ndb* g_ndb= NULL; static Ndb* g_ndb= NULL;
Ndb_cluster_connection* g_ndb_cluster_connection= NULL; Ndb_cluster_connection* g_ndb_cluster_connection= NULL;
unsigned char g_node_id_map[max_ndb_nodes]; uchar g_node_id_map[max_ndb_nodes];
// Handler synchronization // Handler synchronization
pthread_mutex_t ndbcluster_mutex; pthread_mutex_t ndbcluster_mutex;
@ -1006,7 +1006,7 @@ static int fix_unique_index_attr_order(NDB_INDEX_DATA &data,
if (data.unique_index_attrid_map) if (data.unique_index_attrid_map)
my_free((char*)data.unique_index_attrid_map, MYF(0)); my_free((char*)data.unique_index_attrid_map, MYF(0));
data.unique_index_attrid_map= (unsigned char*)my_malloc(sz,MYF(MY_WME)); data.unique_index_attrid_map= (uchar*)my_malloc(sz,MYF(MY_WME));
KEY_PART_INFO* key_part= key_info->key_part; KEY_PART_INFO* key_part= key_info->key_part;
KEY_PART_INFO* end= key_part+key_info->key_parts; KEY_PART_INFO* end= key_part+key_info->key_parts;

View File

@ -138,7 +138,7 @@ static void print_records(TABLE *table, const char *record)
for (int i= 0; i < n && pos < 20; i++) for (int i= 0; i < n && pos < 20; i++)
{ {
pos+= sprintf(&buf[pos]," %x", (int) (unsigned char) field_ptr[i]); pos+= sprintf(&buf[pos]," %x", (int) (uchar) field_ptr[i]);
} }
buf[pos]= 0; buf[pos]= 0;
DBUG_PRINT("info",("[%u]field_ptr[0->%d]: %s", j, n, buf)); DBUG_PRINT("info",("[%u]field_ptr[0->%d]: %s", j, n, buf));
@ -871,11 +871,11 @@ int ndbcluster_setup_binlog_table_shares(THD *thd)
struct Cluster_schema struct Cluster_schema
{ {
unsigned char db_length; uchar db_length;
char db[64]; char db[64];
unsigned char name_length; uchar name_length;
char name[64]; char name[64];
unsigned char slock_length; uchar slock_length;
uint32 slock[SCHEMA_SLOCK_SIZE/4]; uint32 slock[SCHEMA_SLOCK_SIZE/4];
unsigned short query_length; unsigned short query_length;
char *query; char *query;
@ -974,7 +974,7 @@ static char *ndb_pack_varchar(const NDBCOL *col, char *buf,
memcpy(buf, str, sz); memcpy(buf, str, sz);
break; break;
case NDBCOL::ArrayTypeShortVar: case NDBCOL::ArrayTypeShortVar:
*(unsigned char*)buf= (unsigned char)sz; *(uchar*)buf= (uchar)sz;
memcpy(buf + 1, str, sz); memcpy(buf + 1, str, sz);
break; break;
case NDBCOL::ArrayTypeMediumVar: case NDBCOL::ArrayTypeMediumVar:

View File

@ -127,11 +127,11 @@ String *Item_func_md5::val_str(String *str)
if (sptr) if (sptr)
{ {
my_MD5_CTX context; my_MD5_CTX context;
unsigned char digest[16]; uchar digest[16];
null_value=0; null_value=0;
my_MD5Init (&context); my_MD5Init (&context);
my_MD5Update (&context,(unsigned char *) sptr->ptr(), sptr->length()); my_MD5Update (&context,(uchar *) sptr->ptr(), sptr->length());
my_MD5Final (digest, &context); my_MD5Final (digest, &context);
if (str->alloc(32)) // Ensure that memory is free if (str->alloc(32)) // Ensure that memory is free
{ {
@ -178,7 +178,7 @@ String *Item_func_sha::val_str(String *str)
mysql_sha1_reset(&context); /* We do not have to check for error here */ mysql_sha1_reset(&context); /* We do not have to check for error here */
/* No need to check error as the only case would be too long message */ /* No need to check error as the only case would be too long message */
mysql_sha1_input(&context, mysql_sha1_input(&context,
(const unsigned char *) sptr->ptr(), sptr->length()); (const uchar *) sptr->ptr(), sptr->length());
/* Ensure that memory is free and we got result */ /* Ensure that memory is free and we got result */
if (!( str->alloc(SHA1_HASH_SIZE*2) || if (!( str->alloc(SHA1_HASH_SIZE*2) ||
(mysql_sha1_result(&context,digest)))) (mysql_sha1_result(&context,digest))))

View File

@ -5682,7 +5682,7 @@ Table_map_log_event::Table_map_log_event(THD *thd, TABLE *tbl, ulong tid,
/* If malloc fails, catched in is_valid() */ /* If malloc fails, catched in is_valid() */
if ((m_memory= my_malloc(m_colcnt, MYF(MY_WME)))) if ((m_memory= my_malloc(m_colcnt, MYF(MY_WME))))
{ {
m_coltype= reinterpret_cast<unsigned char*>(m_memory); m_coltype= reinterpret_cast<uchar*>(m_memory);
for (unsigned int i= 0 ; i < m_table->s->fields ; ++i) for (unsigned int i= 0 ; i < m_table->s->fields ; ++i)
m_coltype[i]= m_table->field[i]->type(); m_coltype[i]= m_table->field[i]->type();
} }
@ -5738,11 +5738,11 @@ Table_map_log_event::Table_map_log_event(const char *buf, uint event_len,
/* Extract the length of the various parts from the buffer */ /* Extract the length of the various parts from the buffer */
byte const* const ptr_dblen= (byte const*)vpart + 0; byte const* const ptr_dblen= (byte const*)vpart + 0;
m_dblen= *(unsigned char*) ptr_dblen; m_dblen= *(uchar*) ptr_dblen;
/* Length of database name + counter + terminating null */ /* Length of database name + counter + terminating null */
byte const* const ptr_tbllen= ptr_dblen + m_dblen + 2; byte const* const ptr_tbllen= ptr_dblen + m_dblen + 2;
m_tbllen= *(unsigned char*) ptr_tbllen; m_tbllen= *(uchar*) ptr_tbllen;
/* Length of table name + counter + terminating null */ /* Length of table name + counter + terminating null */
byte const* const ptr_colcnt= ptr_tbllen + m_tbllen + 2; byte const* const ptr_colcnt= ptr_tbllen + m_tbllen + 2;

View File

@ -1588,6 +1588,7 @@ extern TABLE *unused_tables;
extern const char* any_db; extern const char* any_db;
extern struct my_option my_long_options[]; extern struct my_option my_long_options[];
extern const LEX_STRING view_type; extern const LEX_STRING view_type;
extern uint sql_command_flags[];
extern TYPELIB log_output_typelib; extern TYPELIB log_output_typelib;
/* optional things, have_* variables */ /* optional things, have_* variables */

View File

@ -5164,8 +5164,8 @@ get_mm_parts(RANGE_OPT_PARAM *param, COND *cond_func, Field *field,
static SEL_ARG * static SEL_ARG *
get_mm_leaf(RANGE_OPT_PARAM *param, COND *conf_func, Field *field, KEY_PART *key_part, get_mm_leaf(RANGE_OPT_PARAM *param, COND *conf_func, Field *field,
Item_func::Functype type,Item *value) KEY_PART *key_part, Item_func::Functype type,Item *value)
{ {
uint maybe_null=(uint) field->real_maybe_null(); uint maybe_null=(uint) field->real_maybe_null();
bool optimize_range; bool optimize_range;
@ -9126,10 +9126,10 @@ get_constant_key_infix(KEY *index_info, SEL_ARG *index_range_tree,
uint field_length= cur_part->store_length; uint field_length= cur_part->store_length;
if ((cur_range->maybe_null && if ((cur_range->maybe_null &&
cur_range->min_value[0] && cur_range->max_value[0]) cur_range->min_value[0] && cur_range->max_value[0]) ||
|| !memcmp(cur_range->min_value, cur_range->max_value, field_length))
(memcmp(cur_range->min_value, cur_range->max_value, field_length) == 0)) {
{ /* cur_range specifies 'IS NULL' or an equality condition. */ /* cur_range specifies 'IS NULL' or an equality condition. */
memcpy(key_ptr, cur_range->min_value, field_length); memcpy(key_ptr, cur_range->min_value, field_length);
key_ptr+= field_length; key_ptr+= field_length;
*key_infix_len+= field_length; *key_infix_len+= field_length;

View File

@ -516,6 +516,31 @@ void add_to_status(STATUS_VAR *to_var, STATUS_VAR *from_var)
/* it doesn't make sense to add last_query_cost values */ /* it doesn't make sense to add last_query_cost values */
} }
/*
Add the difference between two status variable arrays to another one.
SYNOPSIS
add_diff_to_status
to_var add to this array
from_var from this array
dec_var minus this array
NOTE
This function assumes that all variables are long/ulong.
*/
void add_diff_to_status(STATUS_VAR *to_var, STATUS_VAR *from_var,
STATUS_VAR *dec_var)
{
ulong *end= (ulong*) ((byte*) to_var + offsetof(STATUS_VAR,
last_system_status_var) +
sizeof(ulong));
ulong *to= (ulong*) to_var, *from= (ulong*) from_var, *dec= (ulong*) dec_var;
while (to != end)
*(to++)+= *(from++) - *(dec++);
}
void THD::awake(THD::killed_state state_to_set) void THD::awake(THD::killed_state state_to_set)
{ {

View File

@ -343,7 +343,6 @@ typedef struct system_status_var
#define last_system_status_var com_stmt_close #define last_system_status_var com_stmt_close
#ifdef MYSQL_SERVER #ifdef MYSQL_SERVER
void free_tmp_table(THD *thd, TABLE *entry); void free_tmp_table(THD *thd, TABLE *entry);
@ -833,6 +832,7 @@ public:
struct rand_struct rand; // used for authentication struct rand_struct rand; // used for authentication
struct system_variables variables; // Changeable local variables struct system_variables variables; // Changeable local variables
struct system_status_var status_var; // Per thread statistic vars struct system_status_var status_var; // Per thread statistic vars
struct system_status_var *initial_status_var; /* used by show status */
THR_LOCK_INFO lock_info; // Locking info of this thread THR_LOCK_INFO lock_info; // Locking info of this thread
THR_LOCK_OWNER main_lock_id; // To use for conventional queries THR_LOCK_OWNER main_lock_id; // To use for conventional queries
THR_LOCK_OWNER *lock_id; // If not main_lock_id, points to THR_LOCK_OWNER *lock_id; // If not main_lock_id, points to
@ -1310,6 +1310,10 @@ public:
{ {
return !stmt_arena->is_stmt_prepare() && !lex->only_view_structure(); return !stmt_arena->is_stmt_prepare() && !lex->only_view_structure();
} }
inline bool fill_information_schema_tables()
{
return !stmt_arena->is_stmt_prepare();
}
inline gptr trans_alloc(unsigned int size) inline gptr trans_alloc(unsigned int size)
{ {
return alloc_root(&transaction.mem_root,size); return alloc_root(&transaction.mem_root,size);
@ -1966,8 +1970,16 @@ public:
void cleanup(); void cleanup();
}; };
/* Bits in sql_command_flags */
#define CF_CHANGES_DATA 1
#define CF_HAS_ROW_COUNT 2
#define CF_STATUS_COMMAND 4
#define CF_SHOW_TABLE_COMMAND 8
/* Functions in sql_class.cc */ /* Functions in sql_class.cc */
void add_to_status(STATUS_VAR *to_var, STATUS_VAR *from_var); void add_to_status(STATUS_VAR *to_var, STATUS_VAR *from_var);
void add_diff_to_status(STATUS_VAR *to_var, STATUS_VAR *from_var,
STATUS_VAR *dec_var);
#endif /* MYSQL_SERVER */ #endif /* MYSQL_SERVER */

View File

@ -52,7 +52,7 @@ void SQL_CRYPT::crypt_init(ulong *rand_nr)
decode_buff[+i]=a; decode_buff[+i]=a;
} }
for (i=0 ; i <= 255 ; i++) for (i=0 ; i <= 255 ; i++)
encode_buff[(unsigned char) decode_buff[i]]=i; encode_buff[(uchar) decode_buff[i]]=i;
org_rand=rand; org_rand=rand;
shift=0; shift=0;
} }
@ -75,7 +75,7 @@ void SQL_CRYPT::decode(char *str,uint length)
for (uint i=0; i < length; i++) for (uint i=0; i < length; i++)
{ {
shift^=(uint) (my_rnd(&rand)*255.0); shift^=(uint) (my_rnd(&rand)*255.0);
uint idx= (uint) ((unsigned char) str[0] ^ shift); uint idx= (uint) ((uchar) str[0] ^ shift);
*str = decode_buff[idx]; *str = decode_buff[idx];
shift^= (uint) (uchar) *str++; shift^= (uint) (uchar) *str++;
} }

View File

@ -168,7 +168,7 @@ void lex_start(THD *thd, const uchar *buf, uint length)
lex->select_lex.group_list.empty(); lex->select_lex.group_list.empty();
lex->select_lex.order_list.empty(); lex->select_lex.order_list.empty();
lex->ignore_space=test(thd->variables.sql_mode & MODE_IGNORE_SPACE); lex->ignore_space=test(thd->variables.sql_mode & MODE_IGNORE_SPACE);
lex->sql_command= lex->orig_sql_command= SQLCOM_END; lex->sql_command= SQLCOM_END;
lex->duplicates= DUP_ERROR; lex->duplicates= DUP_ERROR;
lex->ignore= 0; lex->ignore= 0;
lex->sphead= NULL; lex->sphead= NULL;

View File

@ -934,7 +934,7 @@ typedef struct st_lex : public Query_tables_list
the variable can contain 0 or 1 for each nest level. the variable can contain 0 or 1 for each nest level.
*/ */
nesting_map allow_sum_func; nesting_map allow_sum_func;
enum_sql_command sql_command, orig_sql_command; enum_sql_command sql_command;
thr_lock_type lock_option; thr_lock_type lock_option;
enum SSL_type ssl_type; /* defined in violite.h */ enum SSL_type ssl_type; /* defined in violite.h */
enum my_lex_states next_state; enum my_lex_states next_state;

View File

@ -68,6 +68,7 @@ static void decrease_user_connections(USER_CONN *uc);
static bool check_db_used(THD *thd,TABLE_LIST *tables); static bool check_db_used(THD *thd,TABLE_LIST *tables);
static bool check_multi_update_lock(THD *thd); static bool check_multi_update_lock(THD *thd);
static void remove_escape(char *name); static void remove_escape(char *name);
static bool execute_sqlcom_select(THD *thd, TABLE_LIST *all_tables);
const char *any_db="*any*"; // Special symbol for check_access const char *any_db="*any*"; // Special symbol for check_access
@ -626,50 +627,79 @@ void free_max_user_conn(void)
sql_command is actually set to SQLCOM_END sometimes sql_command is actually set to SQLCOM_END sometimes
so we need the +1 to include it in the array. so we need the +1 to include it in the array.
numbers are: See COMMAND_FLAG_xxx for different type of commands
0 - read-only query
!= 0 - query that may change a table
2 - query that returns meaningful ROW_COUNT() - 2 - query that returns meaningful ROW_COUNT() -
a number of modified rows a number of modified rows
*/ */
char uc_update_queries[SQLCOM_END+1]; uint sql_command_flags[SQLCOM_END+1];
void init_update_queries(void) void init_update_queries(void)
{ {
bzero((gptr) &uc_update_queries, sizeof(uc_update_queries)); bzero((gptr) &sql_command_flags, sizeof(sql_command_flags));
uc_update_queries[SQLCOM_CREATE_TABLE]=1; sql_command_flags[SQLCOM_CREATE_TABLE]= CF_CHANGES_DATA;
uc_update_queries[SQLCOM_CREATE_INDEX]=1; sql_command_flags[SQLCOM_CREATE_INDEX]= CF_CHANGES_DATA;
uc_update_queries[SQLCOM_ALTER_TABLE]=1; sql_command_flags[SQLCOM_ALTER_TABLE]= CF_CHANGES_DATA;
uc_update_queries[SQLCOM_UPDATE]=2; sql_command_flags[SQLCOM_TRUNCATE]= CF_CHANGES_DATA;
uc_update_queries[SQLCOM_UPDATE_MULTI]=2; sql_command_flags[SQLCOM_DROP_TABLE]= CF_CHANGES_DATA;
uc_update_queries[SQLCOM_INSERT]=2; sql_command_flags[SQLCOM_LOAD]= CF_CHANGES_DATA;
uc_update_queries[SQLCOM_INSERT_SELECT]=2; sql_command_flags[SQLCOM_CREATE_DB]= CF_CHANGES_DATA;
uc_update_queries[SQLCOM_DELETE]=2; sql_command_flags[SQLCOM_DROP_DB]= CF_CHANGES_DATA;
uc_update_queries[SQLCOM_DELETE_MULTI]=2; sql_command_flags[SQLCOM_RENAME_TABLE]= CF_CHANGES_DATA;
uc_update_queries[SQLCOM_TRUNCATE]=1; sql_command_flags[SQLCOM_BACKUP_TABLE]= CF_CHANGES_DATA;
uc_update_queries[SQLCOM_DROP_TABLE]=1; sql_command_flags[SQLCOM_RESTORE_TABLE]= CF_CHANGES_DATA;
uc_update_queries[SQLCOM_LOAD]=1; sql_command_flags[SQLCOM_DROP_INDEX]= CF_CHANGES_DATA;
uc_update_queries[SQLCOM_CREATE_DB]=1; sql_command_flags[SQLCOM_CREATE_VIEW]= CF_CHANGES_DATA;
uc_update_queries[SQLCOM_DROP_DB]=1; sql_command_flags[SQLCOM_DROP_VIEW]= CF_CHANGES_DATA;
uc_update_queries[SQLCOM_REPLACE]=2; sql_command_flags[SQLCOM_CREATE_EVENT]= CF_CHANGES_DATA;
uc_update_queries[SQLCOM_REPLACE_SELECT]=2; sql_command_flags[SQLCOM_ALTER_EVENT]= CF_CHANGES_DATA;
uc_update_queries[SQLCOM_RENAME_TABLE]=1; sql_command_flags[SQLCOM_DROP_EVENT]= CF_CHANGES_DATA;
uc_update_queries[SQLCOM_BACKUP_TABLE]=1;
uc_update_queries[SQLCOM_RESTORE_TABLE]=1; sql_command_flags[SQLCOM_UPDATE]= CF_CHANGES_DATA | CF_HAS_ROW_COUNT;
uc_update_queries[SQLCOM_DROP_INDEX]=1; sql_command_flags[SQLCOM_UPDATE_MULTI]= CF_CHANGES_DATA | CF_HAS_ROW_COUNT;
uc_update_queries[SQLCOM_CREATE_VIEW]=1; sql_command_flags[SQLCOM_INSERT]= CF_CHANGES_DATA | CF_HAS_ROW_COUNT;
uc_update_queries[SQLCOM_DROP_VIEW]=1; sql_command_flags[SQLCOM_INSERT_SELECT]= CF_CHANGES_DATA | CF_HAS_ROW_COUNT;
uc_update_queries[SQLCOM_CREATE_EVENT]=1; sql_command_flags[SQLCOM_DELETE]= CF_CHANGES_DATA | CF_HAS_ROW_COUNT;
uc_update_queries[SQLCOM_ALTER_EVENT]=1; sql_command_flags[SQLCOM_DELETE_MULTI]= CF_CHANGES_DATA | CF_HAS_ROW_COUNT;
uc_update_queries[SQLCOM_DROP_EVENT]=1; sql_command_flags[SQLCOM_REPLACE]= CF_CHANGES_DATA | CF_HAS_ROW_COUNT;
sql_command_flags[SQLCOM_REPLACE_SELECT]= CF_CHANGES_DATA | CF_HAS_ROW_COUNT;
sql_command_flags[SQLCOM_SHOW_STATUS_PROC]= CF_STATUS_COMMAND;
sql_command_flags[SQLCOM_SHOW_STATUS_FUNC]= CF_STATUS_COMMAND;
sql_command_flags[SQLCOM_SHOW_STATUS]= CF_STATUS_COMMAND;
sql_command_flags[SQLCOM_SHOW_DATABASES]= CF_STATUS_COMMAND;
sql_command_flags[SQLCOM_SHOW_TRIGGERS]= CF_STATUS_COMMAND;
sql_command_flags[SQLCOM_SHOW_EVENTS]= CF_STATUS_COMMAND;
sql_command_flags[SQLCOM_SHOW_OPEN_TABLES]= CF_STATUS_COMMAND;
sql_command_flags[SQLCOM_SHOW_PLUGINS]= CF_STATUS_COMMAND;
sql_command_flags[SQLCOM_SHOW_FIELDS]= CF_STATUS_COMMAND;
sql_command_flags[SQLCOM_SHOW_KEYS]= CF_STATUS_COMMAND;
sql_command_flags[SQLCOM_SHOW_VARIABLES]= CF_STATUS_COMMAND;
sql_command_flags[SQLCOM_SHOW_CHARSETS]= CF_STATUS_COMMAND;
sql_command_flags[SQLCOM_SHOW_COLLATIONS]= CF_STATUS_COMMAND;
sql_command_flags[SQLCOM_SHOW_STATUS_PROC]= CF_STATUS_COMMAND;
sql_command_flags[SQLCOM_SHOW_TABLES]= (CF_STATUS_COMMAND |
CF_SHOW_TABLE_COMMAND);
sql_command_flags[SQLCOM_SHOW_TABLE_STATUS]= (CF_STATUS_COMMAND |
CF_SHOW_TABLE_COMMAND);
/*
The following is used to preserver CF_ROW_COUNT during the
a CALL or EXECUTE statement, so the value generated by the
last called (or executed) statement is preserved.
See mysql_execute_command() for how CF_ROW_COUNT is used.
*/
sql_command_flags[SQLCOM_CALL]= CF_HAS_ROW_COUNT;
sql_command_flags[SQLCOM_EXECUTE]= CF_HAS_ROW_COUNT;
} }
bool is_update_query(enum enum_sql_command command) bool is_update_query(enum enum_sql_command command)
{ {
DBUG_ASSERT(command >= 0 && command <= SQLCOM_END); DBUG_ASSERT(command >= 0 && command <= SQLCOM_END);
return uc_update_queries[command] != 0; return (sql_command_flags[command] & CF_CHANGES_DATA) != 0;
} }
/* /*
@ -733,7 +763,8 @@ static bool check_mqh(THD *thd, uint check_command)
if (check_command < (uint) SQLCOM_END) if (check_command < (uint) SQLCOM_END)
{ {
/* Check that we have not done too many updates / hour */ /* Check that we have not done too many updates / hour */
if (uc->user_resources.updates && uc_update_queries[check_command] && if (uc->user_resources.updates &&
(sql_command_flags[check_command] & CF_CHANGES_DATA) &&
uc->updates++ >= uc->user_resources.updates) uc->updates++ >= uc->user_resources.updates)
{ {
net_printf_error(thd, ER_USER_LIMIT_REACHED, uc->user, "max_updates", net_printf_error(thd, ER_USER_LIMIT_REACHED, uc->user, "max_updates",
@ -2290,8 +2321,6 @@ int prepare_schema_table(THD *thd, LEX *lex, Table_ident *table_ident,
TABLE_LIST *table_list= (TABLE_LIST*) select_lex->table_list.first; TABLE_LIST *table_list= (TABLE_LIST*) select_lex->table_list.first;
table_list->schema_select_lex= sel; table_list->schema_select_lex= sel;
table_list->schema_table_reformed= 1; table_list->schema_table_reformed= 1;
statistic_increment(thd->status_var.com_stat[lex->orig_sql_command],
&LOCK_status);
DBUG_RETURN(0); DBUG_RETURN(0);
} }
@ -2458,7 +2487,7 @@ mysql_execute_command(THD *thd)
*/ */
if (opt_readonly && if (opt_readonly &&
!(thd->security_ctx->master_access & SUPER_ACL) && !(thd->security_ctx->master_access & SUPER_ACL) &&
uc_update_queries[lex->sql_command] && (sql_command_flags[lex->sql_command] & CF_CHANGES_DATA) &&
!((lex->sql_command == SQLCOM_CREATE_TABLE) && !((lex->sql_command == SQLCOM_CREATE_TABLE) &&
(lex->create_info.options & HA_LEX_CREATE_TMP_TABLE)) && (lex->create_info.options & HA_LEX_CREATE_TMP_TABLE)) &&
((lex->sql_command != SQLCOM_UPDATE_MULTI) && ((lex->sql_command != SQLCOM_UPDATE_MULTI) &&
@ -2470,9 +2499,8 @@ mysql_execute_command(THD *thd)
#ifdef HAVE_REPLICATION #ifdef HAVE_REPLICATION
} /* endif unlikely slave */ } /* endif unlikely slave */
#endif #endif
if(lex->orig_sql_command == SQLCOM_END) statistic_increment(thd->status_var.com_stat[lex->sql_command],
statistic_increment(thd->status_var.com_stat[lex->sql_command], &LOCK_status);
&LOCK_status);
#ifdef HAVE_ROW_BASED_REPLICATION #ifdef HAVE_ROW_BASED_REPLICATION
if (lex->binlog_row_based_if_mixed) if (lex->binlog_row_based_if_mixed)
@ -2480,77 +2508,61 @@ mysql_execute_command(THD *thd)
#endif /*HAVE_ROW_BASED_REPLICATION*/ #endif /*HAVE_ROW_BASED_REPLICATION*/
switch (lex->sql_command) { switch (lex->sql_command) {
case SQLCOM_SELECT: case SQLCOM_SHOW_EVENTS:
if ((res= check_access(thd, EVENT_ACL, thd->lex->select_lex.db, 0, 0, 0,
is_schema_db(thd->lex->select_lex.db))))
break;
/* fall through */
case SQLCOM_SHOW_STATUS_PROC:
case SQLCOM_SHOW_STATUS_FUNC:
res= execute_sqlcom_select(thd, all_tables);
break;
case SQLCOM_SHOW_STATUS:
{ {
/* assign global limit variable if limit is not given */ system_status_var old_status_var= thd->status_var;
{ thd->initial_status_var= &old_status_var;
SELECT_LEX *param= lex->unit.global_parameters; res= execute_sqlcom_select(thd, all_tables);
if (!param->explicit_limit) /* Don't log SHOW STATUS commands to slow query log */
param->select_limit= thd->server_status&= ~(SERVER_QUERY_NO_INDEX_USED |
new Item_int((ulonglong)thd->variables.select_limit); SERVER_QUERY_NO_GOOD_INDEX_USED);
} /*
restore status variables, as we don't want 'show status' to cause
select_result *result=lex->result; changes
*/
pthread_mutex_lock(&LOCK_status);
add_diff_to_status(&global_status_var, &thd->status_var,
&old_status_var);
thd->status_var= old_status_var;
pthread_mutex_unlock(&LOCK_status);
break;
}
case SQLCOM_SHOW_DATABASES:
case SQLCOM_SHOW_TABLES:
case SQLCOM_SHOW_TRIGGERS:
case SQLCOM_SHOW_TABLE_STATUS:
case SQLCOM_SHOW_OPEN_TABLES:
case SQLCOM_SHOW_PLUGINS:
case SQLCOM_SHOW_FIELDS:
case SQLCOM_SHOW_KEYS:
case SQLCOM_SHOW_VARIABLES:
case SQLCOM_SHOW_CHARSETS:
case SQLCOM_SHOW_COLLATIONS:
case SQLCOM_SELECT:
thd->status_var.last_query_cost= 0.0;
if (all_tables) if (all_tables)
{ {
if (lex->orig_sql_command != SQLCOM_SHOW_STATUS_PROC && res= check_table_access(thd,
lex->orig_sql_command != SQLCOM_SHOW_STATUS_FUNC && lex->exchange ? SELECT_ACL | FILE_ACL :
lex->orig_sql_command != SQLCOM_SHOW_EVENTS) SELECT_ACL,
res= check_table_access(thd, all_tables, 0);
lex->exchange ? SELECT_ACL | FILE_ACL :
SELECT_ACL,
all_tables, 0);
else if (lex->orig_sql_command == SQLCOM_SHOW_EVENTS)
res= check_access(thd, EVENT_ACL, thd->lex->select_lex.db, 0, 0, 0,
is_schema_db(thd->lex->select_lex.db));
} }
else else
res= check_access(thd, res= check_access(thd,
lex->exchange ? SELECT_ACL | FILE_ACL : SELECT_ACL, lex->exchange ? SELECT_ACL | FILE_ACL : SELECT_ACL,
any_db, 0, 0, 0, 0); any_db, 0, 0, 0, 0);
if (res) if (!res)
goto error; res= execute_sqlcom_select(thd, all_tables);
if (!(res= open_and_lock_tables(thd, all_tables)))
{
if (lex->describe)
{
/*
We always use select_send for EXPLAIN, even if it's an EXPLAIN
for SELECT ... INTO OUTFILE: a user application should be able
to prepend EXPLAIN to any query and receive output for it,
even if the query itself redirects the output.
*/
if (!(result= new select_send()))
goto error;
else
thd->send_explain_fields(result);
res= mysql_explain_union(thd, &thd->lex->unit, result);
if (lex->describe & DESCRIBE_EXTENDED)
{
char buff[1024];
String str(buff,(uint32) sizeof(buff), system_charset_info);
str.length(0);
thd->lex->unit.print(&str);
str.append('\0');
push_warning(thd, MYSQL_ERROR::WARN_LEVEL_NOTE,
ER_YES, str.ptr());
}
result->send_eof();
delete result;
}
else
{
if (!result && !(result= new select_send()))
goto error;
query_cache_store_query(thd, all_tables);
res= handle_select(thd, lex, result, 0);
if (result != lex->result)
delete result;
}
}
break; break;
}
case SQLCOM_PREPARE: case SQLCOM_PREPARE:
{ {
mysql_sql_stmt_prepare(thd); mysql_sql_stmt_prepare(thd);
@ -4826,6 +4838,7 @@ end_with_restore_list:
} }
break; break;
} }
#ifdef NOT_USED
case SQLCOM_SHOW_STATUS_PROC: case SQLCOM_SHOW_STATUS_PROC:
{ {
res= sp_show_status_procedure(thd, (lex->wild ? res= sp_show_status_procedure(thd, (lex->wild ?
@ -4838,6 +4851,7 @@ end_with_restore_list:
lex->wild->ptr() : NullS)); lex->wild->ptr() : NullS));
break; break;
} }
#endif
#ifndef DBUG_OFF #ifndef DBUG_OFF
case SQLCOM_SHOW_PROC_CODE: case SQLCOM_SHOW_PROC_CODE:
case SQLCOM_SHOW_FUNC_CODE: case SQLCOM_SHOW_FUNC_CODE:
@ -5162,13 +5176,10 @@ end:
/* /*
The return value for ROW_COUNT() is "implementation dependent" if the The return value for ROW_COUNT() is "implementation dependent" if the
statement is not DELETE, INSERT or UPDATE, but -1 is what JDBC and ODBC statement is not DELETE, INSERT or UPDATE, but -1 is what JDBC and ODBC
wants. wants. We also keep the last value in case of SQLCOM_CALL or
SQLCOM_EXECUTE.
We do not change the value for a CALL or EXECUTE statement, so the value */
generated by the last called (or executed) statement is preserved. if (!(sql_command_flags[lex->sql_command] & CF_HAS_ROW_COUNT))
*/
if (lex->sql_command != SQLCOM_CALL && lex->sql_command != SQLCOM_EXECUTE &&
uc_update_queries[lex->sql_command]<2)
thd->row_count_func= -1; thd->row_count_func= -1;
DBUG_RETURN(res || thd->net.report_error); DBUG_RETURN(res || thd->net.report_error);
@ -5178,6 +5189,59 @@ error:
} }
static bool execute_sqlcom_select(THD *thd, TABLE_LIST *all_tables)
{
LEX *lex= thd->lex;
select_result *result=lex->result;
bool res;
/* assign global limit variable if limit is not given */
{
SELECT_LEX *param= lex->unit.global_parameters;
if (!param->explicit_limit)
param->select_limit=
new Item_int((ulonglong) thd->variables.select_limit);
}
if (!(res= open_and_lock_tables(thd, all_tables)))
{
if (lex->describe)
{
/*
We always use select_send for EXPLAIN, even if it's an EXPLAIN
for SELECT ... INTO OUTFILE: a user application should be able
to prepend EXPLAIN to any query and receive output for it,
even if the query itself redirects the output.
*/
if (!(result= new select_send()))
return 1;
thd->send_explain_fields(result);
res= mysql_explain_union(thd, &thd->lex->unit, result);
if (lex->describe & DESCRIBE_EXTENDED)
{
char buff[1024];
String str(buff,(uint32) sizeof(buff), system_charset_info);
str.length(0);
thd->lex->unit.print(&str);
str.append('\0');
push_warning(thd, MYSQL_ERROR::WARN_LEVEL_NOTE,
ER_YES, str.ptr());
}
result->send_eof();
delete result;
}
else
{
if (!result && !(result= new select_send()))
return 1;
query_cache_store_query(thd, all_tables);
res= handle_select(thd, lex, result, 0);
if (result != lex->result)
delete result;
}
}
return res;
}
/* /*
Check grants for commands which work only with one table and all other Check grants for commands which work only with one table and all other
tables belonging to subselects or implicitly opened tables. tables belonging to subselects or implicitly opened tables.
@ -6283,7 +6347,7 @@ TABLE_LIST *st_select_lex::add_table_to_list(THD *thd,
ST_SCHEMA_TABLE *schema_table= find_schema_table(thd, ptr->table_name); ST_SCHEMA_TABLE *schema_table= find_schema_table(thd, ptr->table_name);
if (!schema_table || if (!schema_table ||
(schema_table->hidden && (schema_table->hidden &&
lex->orig_sql_command == SQLCOM_END)) // not a 'show' command (sql_command_flags[lex->sql_command] & CF_STATUS_COMMAND) == 0))
{ {
my_error(ER_UNKNOWN_TABLE, MYF(0), my_error(ER_UNKNOWN_TABLE, MYF(0),
ptr->table_name, information_schema_name.str); ptr->table_name, information_schema_name.str);

View File

@ -1727,22 +1727,17 @@ static bool check_prepared_statement(Prepared_statement *stmt,
res= mysql_test_insert_select(stmt, tables); res= mysql_test_insert_select(stmt, tables);
break; break;
case SQLCOM_SHOW_DATABASES: /*
Note that we don't need to have cases in this list if they are
marked with CF_STATUS_COMMAND in sql_command_flags
*/
case SQLCOM_SHOW_PROCESSLIST: case SQLCOM_SHOW_PROCESSLIST:
case SQLCOM_SHOW_STORAGE_ENGINES: case SQLCOM_SHOW_STORAGE_ENGINES:
case SQLCOM_SHOW_PRIVILEGES: case SQLCOM_SHOW_PRIVILEGES:
case SQLCOM_SHOW_COLUMN_TYPES: case SQLCOM_SHOW_COLUMN_TYPES:
case SQLCOM_SHOW_STATUS:
case SQLCOM_SHOW_VARIABLES:
case SQLCOM_SHOW_ENGINE_LOGS: case SQLCOM_SHOW_ENGINE_LOGS:
case SQLCOM_SHOW_ENGINE_STATUS: case SQLCOM_SHOW_ENGINE_STATUS:
case SQLCOM_SHOW_ENGINE_MUTEX: case SQLCOM_SHOW_ENGINE_MUTEX:
case SQLCOM_SHOW_TABLES:
case SQLCOM_SHOW_OPEN_TABLES:
case SQLCOM_SHOW_CHARSETS:
case SQLCOM_SHOW_COLLATIONS:
case SQLCOM_SHOW_FIELDS:
case SQLCOM_SHOW_KEYS:
case SQLCOM_SHOW_CREATE_DB: case SQLCOM_SHOW_CREATE_DB:
case SQLCOM_SHOW_GRANTS: case SQLCOM_SHOW_GRANTS:
case SQLCOM_DROP_TABLE: case SQLCOM_DROP_TABLE:
@ -1762,9 +1757,17 @@ static bool check_prepared_statement(Prepared_statement *stmt,
break; break;
default: default:
/* All other statements are not supported yet. */ /*
my_message(ER_UNSUPPORTED_PS, ER(ER_UNSUPPORTED_PS), MYF(0)); Trivial check of all status commands. This is easier than having
goto error; things in the above case list, as it's less chance for mistakes.
*/
if (!(sql_command_flags[sql_command] & CF_STATUS_COMMAND))
{
/* All other statements are not supported yet. */
my_message(ER_UNSUPPORTED_PS, ER(ER_UNSUPPORTED_PS), MYF(0));
goto error;
}
break;
} }
if (res == 0) if (res == 0)
DBUG_RETURN(text_protocol? FALSE : (send_prep_stmt(stmt, 0) || DBUG_RETURN(text_protocol? FALSE : (send_prep_stmt(stmt, 0) ||

View File

@ -551,9 +551,6 @@ JOIN::optimize()
DBUG_RETURN(0); DBUG_RETURN(0);
optimized= 1; optimized= 1;
if (thd->lex->orig_sql_command != SQLCOM_SHOW_STATUS)
thd->status_var.last_query_cost= 0.0;
row_limit= ((select_distinct || order || group_list) ? HA_POS_ERROR : row_limit= ((select_distinct || order || group_list) ? HA_POS_ERROR :
unit->select_limit_cnt); unit->select_limit_cnt);
/* select_limit is used to decide if we are likely to scan the whole table */ /* select_limit is used to decide if we are likely to scan the whole table */
@ -3875,10 +3872,8 @@ choose_plan(JOIN *join, table_map join_tables)
/* /*
Store the cost of this query into a user variable Store the cost of this query into a user variable
Don't update last_query_cost for 'show status' command
*/ */
if (join->thd->lex->orig_sql_command != SQLCOM_SHOW_STATUS) join->thd->status_var.last_query_cost= join->best_read;
join->thd->status_var.last_query_cost= join->best_read;
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }

View File

@ -2148,7 +2148,7 @@ bool schema_table_store_record(THD *thd, TABLE *table)
void get_index_field_values(LEX *lex, INDEX_FIELD_VALUES *index_field_values) void get_index_field_values(LEX *lex, INDEX_FIELD_VALUES *index_field_values)
{ {
const char *wild= lex->wild ? lex->wild->ptr() : NullS; const char *wild= lex->wild ? lex->wild->ptr() : NullS;
switch (lex->orig_sql_command) { switch (lex->sql_command) {
case SQLCOM_SHOW_DATABASES: case SQLCOM_SHOW_DATABASES:
index_field_values->db_value= wild; index_field_values->db_value= wild;
break; break;
@ -2337,10 +2337,9 @@ int make_db_list(THD *thd, List<char> *files,
/* /*
This part of code is for SHOW TABLES, SHOW TABLE STATUS commands. This part of code is for SHOW TABLES, SHOW TABLE STATUS commands.
idx_field_vals->db_value can't be 0 (see get_index_field_values() idx_field_vals->db_value can't be 0 (see get_index_field_values()
function). lex->orig_sql_command can be not equal to SQLCOM_END function).
only in case of executing of SHOW commands.
*/ */
if (lex->orig_sql_command != SQLCOM_END) if (sql_command_flags[lex->sql_command] & CF_STATUS_COMMAND)
{ {
if (!my_strcasecmp(system_charset_info, information_schema_name.str, if (!my_strcasecmp(system_charset_info, information_schema_name.str,
idx_field_vals->db_value)) idx_field_vals->db_value))
@ -2419,12 +2418,6 @@ int get_all_tables(THD *thd, TABLE_LIST *tables, COND *cond)
LINT_INIT(end); LINT_INIT(end);
LINT_INIT(len); LINT_INIT(len);
/*
Let us set fake sql_command so views won't try to merge
themselves into main statement.
*/
lex->sql_command= SQLCOM_SHOW_FIELDS;
lex->reset_n_backup_query_tables_list(&query_tables_list_backup); lex->reset_n_backup_query_tables_list(&query_tables_list_backup);
/* /*
@ -2447,8 +2440,16 @@ int get_all_tables(THD *thd, TABLE_LIST *tables, COND *cond)
I_S tables will be done. I_S tables will be done.
*/ */
thd->temporary_tables= open_tables_state_backup.temporary_tables; thd->temporary_tables= open_tables_state_backup.temporary_tables;
/*
Let us set fake sql_command so views won't try to merge
themselves into main statement. If we don't do this,
SELECT * from information_schema.xxxx will cause problems.
SQLCOM_SHOW_FIELDS is used because it satisfies 'only_view_structure()'
*/
lex->sql_command= SQLCOM_SHOW_FIELDS;
res= open_normal_and_derived_tables(thd, show_table_list, res= open_normal_and_derived_tables(thd, show_table_list,
MYSQL_LOCK_IGNORE_FLUSH); MYSQL_LOCK_IGNORE_FLUSH);
lex->sql_command= save_sql_command;
/* /*
get_all_tables() returns 1 on failure and 0 on success thus get_all_tables() returns 1 on failure and 0 on success thus
return only these and not the result code of ::process_table() return only these and not the result code of ::process_table()
@ -2479,13 +2480,13 @@ int get_all_tables(THD *thd, TABLE_LIST *tables, COND *cond)
partial_cond= make_cond_for_info_schema(cond, tables); partial_cond= make_cond_for_info_schema(cond, tables);
it.rewind(); /* To get access to new elements in basis list */ it.rewind(); /* To get access to new elements in basis list */
/*
Below we generate error for non existing database.
(to save old behaviour for SHOW TABLES FROM db)
*/
while ((orig_base_name= base_name= it++) || while ((orig_base_name= base_name= it++) ||
/* ((sql_command_flags[save_sql_command] & CF_SHOW_TABLE_COMMAND) &&
generate error for non existing database.
(to save old behaviour for SHOW TABLES FROM db)
*/
((lex->orig_sql_command == SQLCOM_SHOW_TABLES ||
lex->orig_sql_command == SQLCOM_SHOW_TABLE_STATUS) &&
(base_name= select_lex->db) && !bases.elements)) (base_name= select_lex->db) && !bases.elements))
{ {
#ifndef NO_EMBEDDED_ACCESS_CHECKS #ifndef NO_EMBEDDED_ACCESS_CHECKS
@ -2526,7 +2527,8 @@ int get_all_tables(THD *thd, TABLE_LIST *tables, COND *cond)
{ {
if (schema_table_idx == SCH_TABLE_NAMES) if (schema_table_idx == SCH_TABLE_NAMES)
{ {
if (lex->verbose || lex->orig_sql_command == SQLCOM_END) if (lex->verbose ||
(sql_command_flags[save_sql_command] & CF_STATUS_COMMAND) == 0)
{ {
if (with_i_schema) if (with_i_schema)
{ {
@ -2570,8 +2572,10 @@ int get_all_tables(THD *thd, TABLE_LIST *tables, COND *cond)
TABLE_LIST *show_table_list= (TABLE_LIST*) sel.table_list.first; TABLE_LIST *show_table_list= (TABLE_LIST*) sel.table_list.first;
lex->all_selects_list= &sel; lex->all_selects_list= &sel;
lex->derived_tables= 0; lex->derived_tables= 0;
lex->sql_command= SQLCOM_SHOW_FIELDS;
res= open_normal_and_derived_tables(thd, show_table_list, res= open_normal_and_derived_tables(thd, show_table_list,
MYSQL_LOCK_IGNORE_FLUSH); MYSQL_LOCK_IGNORE_FLUSH);
lex->sql_command= save_sql_command;
/* /*
We should use show_table_list->alias instead of We should use show_table_list->alias instead of
show_table_list->table_name because table_name show_table_list->table_name because table_name
@ -2881,7 +2885,7 @@ static int get_schema_column_record(THD *thd, struct st_table_list *tables,
if (res) if (res)
{ {
if (lex->orig_sql_command != SQLCOM_SHOW_FIELDS) if (lex->sql_command != SQLCOM_SHOW_FIELDS)
{ {
/* /*
I.e. we are in SELECT FROM INFORMATION_SCHEMA.COLUMS I.e. we are in SELECT FROM INFORMATION_SCHEMA.COLUMS
@ -2932,7 +2936,7 @@ static int get_schema_column_record(THD *thd, struct st_table_list *tables,
col_access= get_column_grant(thd, &tables->grant, col_access= get_column_grant(thd, &tables->grant,
base_name, file_name, base_name, file_name,
field->field_name) & COL_ACLS; field->field_name) & COL_ACLS;
if (lex->orig_sql_command != SQLCOM_SHOW_FIELDS && if (lex->sql_command != SQLCOM_SHOW_FIELDS &&
!tables->schema_table && !col_access) !tables->schema_table && !col_access)
continue; continue;
end= tmp; end= tmp;
@ -2977,7 +2981,7 @@ static int get_schema_column_record(THD *thd, struct st_table_list *tables,
table->field[5]->set_notnull(); table->field[5]->set_notnull();
} }
else if (field->unireg_check == Field::NEXT_NUMBER || else if (field->unireg_check == Field::NEXT_NUMBER ||
lex->orig_sql_command != SQLCOM_SHOW_FIELDS || lex->sql_command != SQLCOM_SHOW_FIELDS ||
field->maybe_null()) field->maybe_null())
table->field[5]->set_null(); // Null as default table->field[5]->set_null(); // Null as default
else else
@ -3247,16 +3251,18 @@ bool store_schema_proc(THD *thd, TABLE *table, TABLE *proc_table,
get_field(thd->mem_root, proc_table->field[11], &definer); get_field(thd->mem_root, proc_table->field[11], &definer);
if (!full_access) if (!full_access)
full_access= !strcmp(sp_user, definer.ptr()); full_access= !strcmp(sp_user, definer.ptr());
if (!full_access && check_some_routine_access(thd, sp_db.ptr(), sp_name.ptr(), if (!full_access && check_some_routine_access(thd, sp_db.ptr(),
proc_table->field[2]->val_int() == sp_name.ptr(),
proc_table->field[2]->
val_int() ==
TYPE_ENUM_PROCEDURE)) TYPE_ENUM_PROCEDURE))
return 0; return 0;
if (lex->orig_sql_command == SQLCOM_SHOW_STATUS_PROC && if (lex->sql_command == SQLCOM_SHOW_STATUS_PROC &&
proc_table->field[2]->val_int() == TYPE_ENUM_PROCEDURE || proc_table->field[2]->val_int() == TYPE_ENUM_PROCEDURE ||
lex->orig_sql_command == SQLCOM_SHOW_STATUS_FUNC && lex->sql_command == SQLCOM_SHOW_STATUS_FUNC &&
proc_table->field[2]->val_int() == TYPE_ENUM_FUNCTION || proc_table->field[2]->val_int() == TYPE_ENUM_FUNCTION ||
lex->orig_sql_command == SQLCOM_END) (sql_command_flags[lex->sql_command] & CF_STATUS_COMMAND) == 0)
{ {
restore_record(table, s->default_values); restore_record(table, s->default_values);
if (!wild || !wild[0] || !wild_compare(sp_name.ptr(), wild, 0)) if (!wild || !wild[0] || !wild_compare(sp_name.ptr(), wild, 0))
@ -3367,7 +3373,7 @@ static int get_schema_stat_record(THD *thd, struct st_table_list *tables,
DBUG_ENTER("get_schema_stat_record"); DBUG_ENTER("get_schema_stat_record");
if (res) if (res)
{ {
if (thd->lex->orig_sql_command != SQLCOM_SHOW_KEYS) if (thd->lex->sql_command != SQLCOM_SHOW_KEYS)
{ {
/* /*
I.e. we are in SELECT FROM INFORMATION_SCHEMA.STATISTICS I.e. we are in SELECT FROM INFORMATION_SCHEMA.STATISTICS
@ -4158,7 +4164,7 @@ copy_event_to_schema_table(THD *thd, TABLE *sch_table, TABLE *event_table)
optimized. It's guaranteed in case of SHOW EVENTS that the user optimized. It's guaranteed in case of SHOW EVENTS that the user
has access. has access.
*/ */
if (thd->lex->orig_sql_command != SQLCOM_SHOW_EVENTS && if (thd->lex->sql_command != SQLCOM_SHOW_EVENTS &&
check_access(thd, EVENT_ACL, et.dbname.str, 0, 0, 1, check_access(thd, EVENT_ACL, et.dbname.str, 0, 0, 1,
is_schema_db(et.dbname.str))) is_schema_db(et.dbname.str)))
DBUG_RETURN(0); DBUG_RETURN(0);
@ -4388,7 +4394,7 @@ int fill_schema_events(THD *thd, TABLE_LIST *tables, COND * /* cond */)
If it's SHOW EVENTS then thd->lex->select_lex.db is guaranteed not to If it's SHOW EVENTS then thd->lex->select_lex.db is guaranteed not to
be NULL. Let's do an assert anyway. be NULL. Let's do an assert anyway.
*/ */
if (thd->lex->orig_sql_command == SQLCOM_SHOW_EVENTS) if (thd->lex->sql_command == SQLCOM_SHOW_EVENTS)
{ {
DBUG_ASSERT(thd->lex->select_lex.db); DBUG_ASSERT(thd->lex->select_lex.db);
if (check_access(thd, EVENT_ACL, thd->lex->select_lex.db, 0, 0, 0, if (check_access(thd, EVENT_ACL, thd->lex->select_lex.db, 0, 0, 0,
@ -4416,7 +4422,7 @@ int fill_schema_events(THD *thd, TABLE_LIST *tables, COND * /* cond */)
will save use from doing a table scan and comparing will save use from doing a table scan and comparing
every single row's `db` with the schema which we show. every single row's `db` with the schema which we show.
*/ */
if (thd->lex->orig_sql_command == SQLCOM_SHOW_EVENTS) if (thd->lex->sql_command == SQLCOM_SHOW_EVENTS)
ret= events_table_index_read_for_db(thd, schema_table, event_table); ret= events_table_index_read_for_db(thd, schema_table, event_table);
else else
ret= events_table_scan_all(thd, schema_table, event_table); ret= events_table_scan_all(thd, schema_table, event_table);
@ -4482,7 +4488,7 @@ int fill_status(THD *thd, TABLE_LIST *tables, COND *cond)
(SHOW_VAR *)all_status_vars.buffer, (SHOW_VAR *)all_status_vars.buffer,
OPT_GLOBAL, OPT_GLOBAL,
(lex->option_type == OPT_GLOBAL ? (lex->option_type == OPT_GLOBAL ?
&tmp: &thd->status_var), "",tables->table); &tmp: thd->initial_status_var), "",tables->table);
pthread_mutex_unlock(&LOCK_status); pthread_mutex_unlock(&LOCK_status);
DBUG_RETURN(res); DBUG_RETURN(res);
} }
@ -4675,8 +4681,8 @@ TABLE *create_schema_table(THD *thd, TABLE_LIST *table_list)
schema_table pointer to 'schema_tables' element schema_table pointer to 'schema_tables' element
RETURN RETURN
-1 errror 1 error
0 success 0 success
*/ */
int make_old_format(THD *thd, ST_SCHEMA_TABLE *schema_table) int make_old_format(THD *thd, ST_SCHEMA_TABLE *schema_table)
@ -4999,7 +5005,7 @@ bool get_schema_tables_result(JOIN *join)
break; break;
TABLE_LIST *table_list= tab->table->pos_in_table_list; TABLE_LIST *table_list= tab->table->pos_in_table_list;
if (table_list->schema_table && thd->fill_derived_tables()) if (table_list->schema_table && thd->fill_information_schema_tables())
{ {
bool is_subselect= (&lex->unit != lex->current_select->master_unit() && bool is_subselect= (&lex->unit != lex->current_select->master_unit() &&
lex->current_select->master_unit()->item); lex->current_select->master_unit()->item);

View File

@ -710,8 +710,8 @@ void String::qs_append(uint i)
int sortcmp(const String *s,const String *t, CHARSET_INFO *cs) int sortcmp(const String *s,const String *t, CHARSET_INFO *cs)
{ {
return cs->coll->strnncollsp(cs, return cs->coll->strnncollsp(cs,
(unsigned char *) s->ptr(),s->length(), (uchar *) s->ptr(),s->length(),
(unsigned char *) t->ptr(),t->length(), 0); (uchar *) t->ptr(),t->length(), 0);
} }
@ -724,7 +724,7 @@ int sortcmp(const String *s,const String *t, CHARSET_INFO *cs)
t Second string t Second string
NOTE: NOTE:
Strings are compared as a stream of unsigned chars Strings are compared as a stream of uchars
RETURN RETURN
< 0 s < t < 0 s < t

View File

@ -2058,16 +2058,19 @@ sp_cursor_stmt:
{ {
Lex->sphead->reset_lex(YYTHD); Lex->sphead->reset_lex(YYTHD);
/* We use statement here just be able to get a better /*
error message. Using 'select' works too, but will then We use statement here just be able to get a better
result in a generic "syntax error" if a non-select error message. Using 'select' works too, but will then
statement is given. */ result in a generic "syntax error" if a non-select
statement is given.
*/
} }
statement statement
{ {
LEX *lex= Lex; LEX *lex= Lex;
if (lex->sql_command != SQLCOM_SELECT) if (lex->sql_command != SQLCOM_SELECT &&
!(sql_command_flags[lex->sql_command] & CF_STATUS_COMMAND))
{ {
my_message(ER_SP_BAD_CURSOR_QUERY, ER(ER_SP_BAD_CURSOR_QUERY), my_message(ER_SP_BAD_CURSOR_QUERY, ER(ER_SP_BAD_CURSOR_QUERY),
MYF(0)); MYF(0));
@ -8062,16 +8065,14 @@ show_param:
DATABASES wild_and_where DATABASES wild_and_where
{ {
LEX *lex= Lex; LEX *lex= Lex;
lex->sql_command= SQLCOM_SELECT; lex->sql_command= SQLCOM_SHOW_DATABASES;
lex->orig_sql_command= SQLCOM_SHOW_DATABASES;
if (prepare_schema_table(YYTHD, lex, 0, SCH_SCHEMATA)) if (prepare_schema_table(YYTHD, lex, 0, SCH_SCHEMATA))
YYABORT; YYABORT;
} }
| opt_full TABLES opt_db wild_and_where | opt_full TABLES opt_db wild_and_where
{ {
LEX *lex= Lex; LEX *lex= Lex;
lex->sql_command= SQLCOM_SELECT; lex->sql_command= SQLCOM_SHOW_TABLES;
lex->orig_sql_command= SQLCOM_SHOW_TABLES;
lex->select_lex.db= $3; lex->select_lex.db= $3;
if (prepare_schema_table(YYTHD, lex, 0, SCH_TABLE_NAMES)) if (prepare_schema_table(YYTHD, lex, 0, SCH_TABLE_NAMES))
YYABORT; YYABORT;
@ -8079,8 +8080,7 @@ show_param:
| opt_full TRIGGERS_SYM opt_db wild_and_where | opt_full TRIGGERS_SYM opt_db wild_and_where
{ {
LEX *lex= Lex; LEX *lex= Lex;
lex->sql_command= SQLCOM_SELECT; lex->sql_command= SQLCOM_SHOW_TRIGGERS;
lex->orig_sql_command= SQLCOM_SHOW_TRIGGERS;
lex->select_lex.db= $3; lex->select_lex.db= $3;
if (prepare_schema_table(YYTHD, lex, 0, SCH_TRIGGERS)) if (prepare_schema_table(YYTHD, lex, 0, SCH_TRIGGERS))
YYABORT; YYABORT;
@ -8088,8 +8088,7 @@ show_param:
| EVENTS_SYM opt_db wild_and_where | EVENTS_SYM opt_db wild_and_where
{ {
LEX *lex= Lex; LEX *lex= Lex;
lex->sql_command= SQLCOM_SELECT; lex->sql_command= SQLCOM_SHOW_EVENTS;
lex->orig_sql_command= SQLCOM_SHOW_EVENTS;
lex->select_lex.db= $2; lex->select_lex.db= $2;
if (prepare_schema_table(YYTHD, lex, 0, SCH_EVENTS)) if (prepare_schema_table(YYTHD, lex, 0, SCH_EVENTS))
YYABORT; YYABORT;
@ -8106,8 +8105,7 @@ show_param:
| TABLE_SYM STATUS_SYM opt_db wild_and_where | TABLE_SYM STATUS_SYM opt_db wild_and_where
{ {
LEX *lex= Lex; LEX *lex= Lex;
lex->sql_command= SQLCOM_SELECT; lex->sql_command= SQLCOM_SHOW_TABLE_STATUS;
lex->orig_sql_command= SQLCOM_SHOW_TABLE_STATUS;
lex->select_lex.db= $3; lex->select_lex.db= $3;
if (prepare_schema_table(YYTHD, lex, 0, SCH_TABLES)) if (prepare_schema_table(YYTHD, lex, 0, SCH_TABLES))
YYABORT; YYABORT;
@ -8115,8 +8113,7 @@ show_param:
| OPEN_SYM TABLES opt_db wild_and_where | OPEN_SYM TABLES opt_db wild_and_where
{ {
LEX *lex= Lex; LEX *lex= Lex;
lex->sql_command= SQLCOM_SELECT; lex->sql_command= SQLCOM_SHOW_OPEN_TABLES;
lex->orig_sql_command= SQLCOM_SHOW_OPEN_TABLES;
lex->select_lex.db= $3; lex->select_lex.db= $3;
if (prepare_schema_table(YYTHD, lex, 0, SCH_OPEN_TABLES)) if (prepare_schema_table(YYTHD, lex, 0, SCH_OPEN_TABLES))
YYABORT; YYABORT;
@ -8125,16 +8122,14 @@ show_param:
{ {
LEX *lex= Lex; LEX *lex= Lex;
WARN_DEPRECATED(yythd, "5.2", "SHOW PLUGIN", "'SHOW PLUGINS'"); WARN_DEPRECATED(yythd, "5.2", "SHOW PLUGIN", "'SHOW PLUGINS'");
lex->sql_command= SQLCOM_SELECT; lex->sql_command= SQLCOM_SHOW_PLUGINS;
lex->orig_sql_command= SQLCOM_SHOW_PLUGINS;
if (prepare_schema_table(YYTHD, lex, 0, SCH_PLUGINS)) if (prepare_schema_table(YYTHD, lex, 0, SCH_PLUGINS))
YYABORT; YYABORT;
} }
| PLUGINS_SYM | PLUGINS_SYM
{ {
LEX *lex= Lex; LEX *lex= Lex;
lex->sql_command= SQLCOM_SELECT; lex->sql_command= SQLCOM_SHOW_PLUGINS;
lex->orig_sql_command= SQLCOM_SHOW_PLUGINS;
if (prepare_schema_table(YYTHD, lex, 0, SCH_PLUGINS)) if (prepare_schema_table(YYTHD, lex, 0, SCH_PLUGINS))
YYABORT; YYABORT;
} }
@ -8147,8 +8142,7 @@ show_param:
| opt_full COLUMNS from_or_in table_ident opt_db wild_and_where | opt_full COLUMNS from_or_in table_ident opt_db wild_and_where
{ {
LEX *lex= Lex; LEX *lex= Lex;
lex->sql_command= SQLCOM_SELECT; lex->sql_command= SQLCOM_SHOW_FIELDS;
lex->orig_sql_command= SQLCOM_SHOW_FIELDS;
if ($5) if ($5)
$4->change_db($5); $4->change_db($5);
if (prepare_schema_table(YYTHD, lex, $4, SCH_COLUMNS)) if (prepare_schema_table(YYTHD, lex, $4, SCH_COLUMNS))
@ -8180,8 +8174,7 @@ show_param:
| keys_or_index from_or_in table_ident opt_db where_clause | keys_or_index from_or_in table_ident opt_db where_clause
{ {
LEX *lex= Lex; LEX *lex= Lex;
lex->sql_command= SQLCOM_SELECT; lex->sql_command= SQLCOM_SHOW_KEYS;
lex->orig_sql_command= SQLCOM_SHOW_KEYS;
if ($4) if ($4)
$3->change_db($4); $3->change_db($4);
if (prepare_schema_table(YYTHD, lex, $3, SCH_STATISTICS)) if (prepare_schema_table(YYTHD, lex, $3, SCH_STATISTICS))
@ -8202,7 +8195,6 @@ show_param:
{ {
LEX *lex=Lex; LEX *lex=Lex;
lex->sql_command= SQLCOM_SHOW_STORAGE_ENGINES; lex->sql_command= SQLCOM_SHOW_STORAGE_ENGINES;
lex->orig_sql_command= SQLCOM_SHOW_AUTHORS;
if (prepare_schema_table(YYTHD, lex, 0, SCH_ENGINES)) if (prepare_schema_table(YYTHD, lex, 0, SCH_ENGINES))
YYABORT; YYABORT;
} }
@ -8232,8 +8224,7 @@ show_param:
| opt_var_type STATUS_SYM wild_and_where | opt_var_type STATUS_SYM wild_and_where
{ {
LEX *lex= Lex; LEX *lex= Lex;
lex->sql_command= SQLCOM_SELECT; lex->sql_command= SQLCOM_SHOW_STATUS;
lex->orig_sql_command= SQLCOM_SHOW_STATUS;
lex->option_type= $1; lex->option_type= $1;
if (prepare_schema_table(YYTHD, lex, 0, SCH_STATUS)) if (prepare_schema_table(YYTHD, lex, 0, SCH_STATUS))
YYABORT; YYABORT;
@ -8267,8 +8258,7 @@ show_param:
| opt_var_type VARIABLES wild_and_where | opt_var_type VARIABLES wild_and_where
{ {
LEX *lex= Lex; LEX *lex= Lex;
lex->sql_command= SQLCOM_SELECT; lex->sql_command= SQLCOM_SHOW_VARIABLES;
lex->orig_sql_command= SQLCOM_SHOW_VARIABLES;
lex->option_type= $1; lex->option_type= $1;
if (prepare_schema_table(YYTHD, lex, 0, SCH_VARIABLES)) if (prepare_schema_table(YYTHD, lex, 0, SCH_VARIABLES))
YYABORT; YYABORT;
@ -8276,16 +8266,14 @@ show_param:
| charset wild_and_where | charset wild_and_where
{ {
LEX *lex= Lex; LEX *lex= Lex;
lex->sql_command= SQLCOM_SELECT; lex->sql_command= SQLCOM_SHOW_CHARSETS;
lex->orig_sql_command= SQLCOM_SHOW_CHARSETS;
if (prepare_schema_table(YYTHD, lex, 0, SCH_CHARSETS)) if (prepare_schema_table(YYTHD, lex, 0, SCH_CHARSETS))
YYABORT; YYABORT;
} }
| COLLATION_SYM wild_and_where | COLLATION_SYM wild_and_where
{ {
LEX *lex= Lex; LEX *lex= Lex;
lex->sql_command= SQLCOM_SELECT; lex->sql_command= SQLCOM_SHOW_COLLATIONS;
lex->orig_sql_command= SQLCOM_SHOW_COLLATIONS;
if (prepare_schema_table(YYTHD, lex, 0, SCH_COLLATIONS)) if (prepare_schema_table(YYTHD, lex, 0, SCH_COLLATIONS))
YYABORT; YYABORT;
} }
@ -8391,8 +8379,7 @@ show_param:
| PROCEDURE STATUS_SYM wild_and_where | PROCEDURE STATUS_SYM wild_and_where
{ {
LEX *lex= Lex; LEX *lex= Lex;
lex->sql_command= SQLCOM_SELECT; lex->sql_command= SQLCOM_SHOW_STATUS_PROC;
lex->orig_sql_command= SQLCOM_SHOW_STATUS_PROC;
if (!sp_add_to_query_tables(YYTHD, lex, "mysql", "proc", TL_READ)) if (!sp_add_to_query_tables(YYTHD, lex, "mysql", "proc", TL_READ))
YYABORT; YYABORT;
if (prepare_schema_table(YYTHD, lex, 0, SCH_PROCEDURES)) if (prepare_schema_table(YYTHD, lex, 0, SCH_PROCEDURES))
@ -8401,8 +8388,7 @@ show_param:
| FUNCTION_SYM STATUS_SYM wild_and_where | FUNCTION_SYM STATUS_SYM wild_and_where
{ {
LEX *lex= Lex; LEX *lex= Lex;
lex->sql_command= SQLCOM_SELECT; lex->sql_command= SQLCOM_SHOW_STATUS_FUNC;
lex->orig_sql_command= SQLCOM_SHOW_STATUS_FUNC;
if (!sp_add_to_query_tables(YYTHD, lex, "mysql", "proc", TL_READ)) if (!sp_add_to_query_tables(YYTHD, lex, "mysql", "proc", TL_READ))
YYABORT; YYABORT;
if (prepare_schema_table(YYTHD, lex, 0, SCH_PROCEDURES)) if (prepare_schema_table(YYTHD, lex, 0, SCH_PROCEDURES))
@ -8497,8 +8483,7 @@ describe:
lex->lock_option= TL_READ; lex->lock_option= TL_READ;
mysql_init_select(lex); mysql_init_select(lex);
lex->current_select->parsing_place= SELECT_LIST; lex->current_select->parsing_place= SELECT_LIST;
lex->sql_command= SQLCOM_SELECT; lex->sql_command= SQLCOM_SHOW_FIELDS;
lex->orig_sql_command= SQLCOM_SHOW_FIELDS;
lex->select_lex.db= 0; lex->select_lex.db= 0;
lex->verbose= 0; lex->verbose= 0;
if (prepare_schema_table(YYTHD, lex, $2, SCH_COLUMNS)) if (prepare_schema_table(YYTHD, lex, $2, SCH_COLUMNS))

View File

@ -180,7 +180,7 @@ typedef struct user_resources {
uint questions; uint questions;
/* /*
Maximum number of updating statements per hour (which statements are Maximum number of updating statements per hour (which statements are
updating is defined by uc_update_queries array). updating is defined by sql_command_flags array).
*/ */
uint updates; uint updates;
/* Maximum number of connections established per hour. */ /* Maximum number of connections established per hour. */

View File

@ -107,7 +107,7 @@ typedef struct st_time_zone_info
uint revcnt; // Number of transition descr. for TIME->my_time_t conversion uint revcnt; // Number of transition descr. for TIME->my_time_t conversion
/* The following are dynamical arrays are allocated in MEM_ROOT */ /* The following are dynamical arrays are allocated in MEM_ROOT */
my_time_t *ats; // Times of transitions between time types my_time_t *ats; // Times of transitions between time types
unsigned char *types; // Local time types for transitions uchar *types; // Local time types for transitions
TRAN_TYPE_INFO *ttis; // Local time types descriptions TRAN_TYPE_INFO *ttis; // Local time types descriptions
#ifdef ABBR_ARE_USED #ifdef ABBR_ARE_USED
/* Storage for local time types abbreviations. They are stored as ASCIIZ */ /* Storage for local time types abbreviations. They are stored as ASCIIZ */
@ -222,7 +222,7 @@ tz_load(const char *name, TIME_ZONE_INFO *sp, MEM_ROOT *storage)
sp->ats= (my_time_t *)tzinfo_buf; sp->ats= (my_time_t *)tzinfo_buf;
tzinfo_buf+= ALIGN_SIZE(sp->timecnt * sizeof(my_time_t)); tzinfo_buf+= ALIGN_SIZE(sp->timecnt * sizeof(my_time_t));
sp->types= (unsigned char *)tzinfo_buf; sp->types= (uchar *)tzinfo_buf;
tzinfo_buf+= ALIGN_SIZE(sp->timecnt); tzinfo_buf+= ALIGN_SIZE(sp->timecnt);
sp->ttis= (TRAN_TYPE_INFO *)tzinfo_buf; sp->ttis= (TRAN_TYPE_INFO *)tzinfo_buf;
tzinfo_buf+= ALIGN_SIZE(sp->typecnt * sizeof(TRAN_TYPE_INFO)); tzinfo_buf+= ALIGN_SIZE(sp->typecnt * sizeof(TRAN_TYPE_INFO));
@ -237,7 +237,7 @@ tz_load(const char *name, TIME_ZONE_INFO *sp, MEM_ROOT *storage)
for (i= 0; i < sp->timecnt; i++) for (i= 0; i < sp->timecnt; i++)
{ {
sp->types[i]= (unsigned char) *p++; sp->types[i]= (uchar) *p++;
if (sp->types[i] >= sp->typecnt) if (sp->types[i] >= sp->typecnt)
return 1; return 1;
} }
@ -248,10 +248,10 @@ tz_load(const char *name, TIME_ZONE_INFO *sp, MEM_ROOT *storage)
ttisp= &sp->ttis[i]; ttisp= &sp->ttis[i];
ttisp->tt_gmtoff= int4net(p); ttisp->tt_gmtoff= int4net(p);
p+= 4; p+= 4;
ttisp->tt_isdst= (unsigned char) *p++; ttisp->tt_isdst= (uchar) *p++;
if (ttisp->tt_isdst != 0 && ttisp->tt_isdst != 1) if (ttisp->tt_isdst != 0 && ttisp->tt_isdst != 1)
return 1; return 1;
ttisp->tt_abbrind= (unsigned char) *p++; ttisp->tt_abbrind= (uchar) *p++;
if (ttisp->tt_abbrind > sp->charcnt) if (ttisp->tt_abbrind > sp->charcnt)
return 1; return 1;
} }
@ -1801,7 +1801,7 @@ tz_load_from_open_tables(const String *tz_name, TABLE_LIST *tz_tables)
TIME_ZONE_INFO structure TIME_ZONE_INFO structure
*/ */
my_time_t ats[TZ_MAX_TIMES]; my_time_t ats[TZ_MAX_TIMES];
unsigned char types[TZ_MAX_TIMES]; uchar types[TZ_MAX_TIMES];
TRAN_TYPE_INFO ttis[TZ_MAX_TYPES]; TRAN_TYPE_INFO ttis[TZ_MAX_TYPES];
#ifdef ABBR_ARE_USED #ifdef ABBR_ARE_USED
char chars[max(TZ_MAX_CHARS + 1, (2 * (MY_TZNAME_MAX + 1)))]; char chars[max(TZ_MAX_CHARS + 1, (2 * (MY_TZNAME_MAX + 1)))];
@ -2038,7 +2038,7 @@ tz_load_from_open_tables(const String *tz_name, TABLE_LIST *tz_tables)
tz_info->ats= (my_time_t *)alloc_buff; tz_info->ats= (my_time_t *)alloc_buff;
memcpy(tz_info->ats, ats, tz_info->timecnt * sizeof(my_time_t)); memcpy(tz_info->ats, ats, tz_info->timecnt * sizeof(my_time_t));
alloc_buff+= ALIGN_SIZE(sizeof(my_time_t) * tz_info->timecnt); alloc_buff+= ALIGN_SIZE(sizeof(my_time_t) * tz_info->timecnt);
tz_info->types= (unsigned char *)alloc_buff; tz_info->types= (uchar *)alloc_buff;
memcpy(tz_info->types, types, tz_info->timecnt); memcpy(tz_info->types, types, tz_info->timecnt);
alloc_buff+= ALIGN_SIZE(tz_info->timecnt); alloc_buff+= ALIGN_SIZE(tz_info->timecnt);
#ifdef ABBR_ARE_USED #ifdef ABBR_ARE_USED

View File

@ -57,6 +57,7 @@ int heap_reset(HP_INFO *info)
info->current_record= (ulong) ~0L; info->current_record= (ulong) ~0L;
info->current_hash_ptr=0; info->current_hash_ptr=0;
info->update=0; info->update=0;
info->next_block=0;
return 0; return 0;
} }
@ -83,4 +84,3 @@ static void heap_extra_keyflag(register HP_INFO *info,
} }
} }
} }

View File

@ -74,6 +74,7 @@ int main(int argc, char *argv[])
get_options(argc,argv); get_options(argc,argv);
bzero(&hp_create_info, sizeof(hp_create_info)); bzero(&hp_create_info, sizeof(hp_create_info));
hp_create_info.max_table_size= 1024L*1024L;
write_count=update=opt_delete=0; write_count=update=opt_delete=0;
key_check=0; key_check=0;

View File

@ -31,8 +31,9 @@
int mi_rsame_with_pos(MI_INFO *info, byte *record, int inx, my_off_t filepos) int mi_rsame_with_pos(MI_INFO *info, byte *record, int inx, my_off_t filepos)
{ {
DBUG_ENTER("mi_rsame_with_pos"); DBUG_ENTER("mi_rsame_with_pos");
DBUG_PRINT("enter",("index: %d filepos: %ld", inx, (long) filepos));
if (inx < -1 || ! mi_is_key_active(info->s->state.key_map, inx)) if (inx < -1 || inx >= 0 && ! mi_is_key_active(info->s->state.key_map, inx))
{ {
DBUG_RETURN(my_errno=HA_ERR_WRONG_INDEX); DBUG_RETURN(my_errno=HA_ERR_WRONG_INDEX);
} }

View File

@ -1353,7 +1353,7 @@ int bin2decimal(char *from, decimal_t *to, int precision, int scale)
} }
from+=i; from+=i;
*buf=x ^ mask; *buf=x ^ mask;
if (((uint32)*buf) >= powers10[intg0x+1]) if (((ulonglong)*buf) >= (ulonglong) powers10[intg0x+1])
goto err; goto err;
if (buf > to->buf || *buf != 0) if (buf > to->buf || *buf != 0)
buf++; buf++;