merging with changes in bugteam branch.
This commit is contained in:
commit
df51d1cea0
@ -3728,7 +3728,8 @@ com_edit(String *buffer,char *line __attribute__((unused)))
|
||||
!(editor = (char *)getenv("VISUAL")))
|
||||
editor = "vi";
|
||||
strxmov(buff,editor," ",filename,NullS);
|
||||
(void) system(buff);
|
||||
if(system(buff) == -1)
|
||||
goto err;
|
||||
|
||||
MY_STAT stat_arg;
|
||||
if (!my_stat(filename,&stat_arg,MYF(MY_WME)))
|
||||
|
@ -526,6 +526,7 @@ static int upgrade_already_done(void)
|
||||
FILE *in;
|
||||
char upgrade_info_file[FN_REFLEN]= {0};
|
||||
char buf[sizeof(MYSQL_SERVER_VERSION)+1];
|
||||
char *res;
|
||||
|
||||
if (get_upgrade_info_file_name(upgrade_info_file))
|
||||
return 0; /* Could not get filename => not sure */
|
||||
@ -538,7 +539,7 @@ static int upgrade_already_done(void)
|
||||
will be detected by the strncmp
|
||||
*/
|
||||
bzero(buf, sizeof(buf));
|
||||
fgets(buf, sizeof(buf), in);
|
||||
res= fgets(buf, sizeof(buf), in);
|
||||
|
||||
my_fclose(in, MYF(0));
|
||||
|
||||
|
@ -1050,14 +1050,16 @@ static void usage(void)
|
||||
static int drop_db(MYSQL *mysql, const char *db)
|
||||
{
|
||||
char name_buff[FN_REFLEN+20], buf[10];
|
||||
char *input;
|
||||
|
||||
if (!option_force)
|
||||
{
|
||||
puts("Dropping the database is potentially a very bad thing to do.");
|
||||
puts("Any data stored in the database will be destroyed.\n");
|
||||
printf("Do you really want to drop the '%s' database [y/N] ",db);
|
||||
fflush(stdout);
|
||||
VOID(fgets(buf,sizeof(buf)-1,stdin));
|
||||
if ((*buf != 'y') && (*buf != 'Y'))
|
||||
input= fgets(buf, sizeof(buf)-1, stdin);
|
||||
if (!input || ((*input != 'y') && (*input != 'Y')))
|
||||
{
|
||||
puts("\nOK, aborting database drop!");
|
||||
return -1;
|
||||
|
@ -104,29 +104,34 @@ void get_pass(char* pw, int len)
|
||||
{
|
||||
FILE* fp;
|
||||
char* pw_end=pw+len;
|
||||
size_t elements_read= 0;
|
||||
/*
|
||||
/dev/random is more secure than rand() because the seed is easy to
|
||||
predict, so we resort to rand() only if /dev/random is not available
|
||||
*/
|
||||
if ((fp=fopen("/dev/random","r")))
|
||||
{
|
||||
fread(pw,len,1,fp);
|
||||
fclose(fp);
|
||||
if ((elements_read= fread(pw,len,1,fp)))
|
||||
{
|
||||
while (pw<pw_end)
|
||||
{
|
||||
char tmp= 'a'+((uint)*pw % 26);
|
||||
*pw++= tmp;
|
||||
}
|
||||
}
|
||||
else
|
||||
fclose(fp);
|
||||
}
|
||||
|
||||
if (elements_read != 1)
|
||||
{
|
||||
srand(time(NULL));
|
||||
while (pw<pw_end)
|
||||
{
|
||||
char tmp= 'a'+((uint)*pw % 26);
|
||||
char tmp= 'a'+((uint)rand() % 26);
|
||||
*pw++= tmp;
|
||||
}
|
||||
}
|
||||
|
||||
*pw_end=0;
|
||||
}
|
||||
|
||||
|
@ -426,10 +426,12 @@ DYNAMIC_STRING ds_res, ds_progress, ds_warning_messages;
|
||||
|
||||
char builtin_echo[FN_REFLEN];
|
||||
|
||||
static void cleanup_and_exit(int exit_code) __attribute__((noreturn));
|
||||
|
||||
void die(const char *fmt, ...)
|
||||
ATTRIBUTE_FORMAT(printf, 1, 2);
|
||||
ATTRIBUTE_FORMAT(printf, 1, 2) __attribute__((noreturn));
|
||||
void abort_not_supported_test(const char *fmt, ...)
|
||||
ATTRIBUTE_FORMAT(printf, 1, 2);
|
||||
ATTRIBUTE_FORMAT(printf, 1, 2) __attribute__((noreturn));
|
||||
void verbose_msg(const char *fmt, ...)
|
||||
ATTRIBUTE_FORMAT(printf, 1, 2);
|
||||
void warning_msg(const char *fmt, ...)
|
||||
@ -3385,10 +3387,9 @@ void do_wait_for_slave_to_stop(struct st_command *c __attribute__((unused)))
|
||||
MYSQL* mysql = &cur_con->mysql;
|
||||
for (;;)
|
||||
{
|
||||
MYSQL_RES *res;
|
||||
MYSQL_RES *UNINIT_VAR(res);
|
||||
MYSQL_ROW row;
|
||||
int done;
|
||||
LINT_INIT(res);
|
||||
|
||||
if (mysql_query(mysql,"show status like 'Slave_running'") ||
|
||||
!(res=mysql_store_result(mysql)))
|
||||
@ -4710,13 +4711,12 @@ my_bool end_of_query(int c)
|
||||
|
||||
int read_line(char *buf, int size)
|
||||
{
|
||||
char c, last_quote;
|
||||
char c, UNINIT_VAR(last_quote);
|
||||
char *p= buf, *buf_end= buf + size - 1;
|
||||
int skip_char= 0;
|
||||
enum {R_NORMAL, R_Q, R_SLASH_IN_Q,
|
||||
R_COMMENT, R_LINE_START} state= R_LINE_START;
|
||||
DBUG_ENTER("read_line");
|
||||
LINT_INIT(last_quote);
|
||||
|
||||
start_lineno= cur_file->lineno;
|
||||
DBUG_PRINT("info", ("Starting to read at lineno: %d", start_lineno));
|
||||
@ -5978,8 +5978,7 @@ void run_query_normal(struct st_connection *cn, struct st_command *command,
|
||||
|
||||
if (!disable_result_log)
|
||||
{
|
||||
ulonglong affected_rows; /* Ok to be undef if 'disable_info' is set */
|
||||
LINT_INIT(affected_rows);
|
||||
ulonglong UNINIT_VAR(affected_rows); /* Ok to be undef if 'disable_info' is set */
|
||||
|
||||
if (res)
|
||||
{
|
||||
|
@ -339,9 +339,7 @@ rl_generic_bind (type, keyseq, data, map)
|
||||
char *keys;
|
||||
int keys_len;
|
||||
register int i;
|
||||
KEYMAP_ENTRY k;
|
||||
|
||||
k.function = 0;
|
||||
KEYMAP_ENTRY k= { 0, NULL };
|
||||
|
||||
/* If no keys to bind to, exit right away. */
|
||||
if (keyseq == 0 || *keyseq == 0)
|
||||
|
@ -311,6 +311,7 @@ history_truncate_file (fname, lines)
|
||||
int file, chars_read, rv;
|
||||
struct stat finfo;
|
||||
size_t file_size;
|
||||
size_t bytes_written;
|
||||
|
||||
buffer = (char *)NULL;
|
||||
filename = history_filename (fname);
|
||||
@ -400,7 +401,7 @@ if ((sizeof(off_t) > sizeof(size_t) && finfo.st_size > (off_t)(size_t)~0) ||
|
||||
truncate to. */
|
||||
if (bp > buffer && ((file = open (filename, O_WRONLY|O_TRUNC|O_BINARY, 0600)) != -1))
|
||||
{
|
||||
write (file, bp, chars_read - (bp - buffer));
|
||||
bytes_written= write (file, bp, chars_read - (bp - buffer));
|
||||
|
||||
#if defined (__BEOS__)
|
||||
/* BeOS ignores O_TRUNC. */
|
||||
|
@ -137,7 +137,8 @@ UNDO_LIST *
|
||||
_rl_copy_undo_list (head)
|
||||
UNDO_LIST *head;
|
||||
{
|
||||
UNDO_LIST *list, *new, *roving, *c;
|
||||
UNDO_LIST *list, *new, *c;
|
||||
UNDO_LIST *roving= NULL;
|
||||
|
||||
list = head;
|
||||
new = 0;
|
||||
|
@ -61,11 +61,10 @@ int main(int argc, char *argv[])
|
||||
HP_INFO *file,*file2;
|
||||
HP_KEYDEF keyinfo[MAX_KEYS];
|
||||
HA_KEYSEG keyseg[MAX_KEYS*5];
|
||||
HEAP_PTR position;
|
||||
HEAP_PTR UNINIT_VAR(position);
|
||||
HP_CREATE_INFO hp_create_info;
|
||||
CHARSET_INFO *cs= &my_charset_latin1;
|
||||
MY_INIT(argv[0]); /* init my_sys library & pthreads */
|
||||
LINT_INIT(position);
|
||||
|
||||
filename= "test2";
|
||||
filename2= "test2_2";
|
||||
|
@ -464,6 +464,19 @@ int __void__;
|
||||
#define PURIFY_OR_LINT_INIT(var)
|
||||
#endif
|
||||
|
||||
/*
|
||||
Suppress uninitialized variable warning without generating code.
|
||||
|
||||
The _cplusplus is a temporary workaround for C++ code pending a fix
|
||||
for a g++ bug (http://gcc.gnu.org/bugzilla/show_bug.cgi?id=34772).
|
||||
*/
|
||||
#if defined(_lint) || defined(FORCE_INIT_OF_VARS) || defined(__cplusplus) || \
|
||||
!defined(__GNUC__)
|
||||
#define UNINIT_VAR(x) x= 0
|
||||
#else
|
||||
#define UNINIT_VAR(x) x= x
|
||||
#endif
|
||||
|
||||
/* Define some useful general macros */
|
||||
#if !defined(max)
|
||||
#define max(a, b) ((a) > (b) ? (a) : (b))
|
||||
|
@ -1619,8 +1619,7 @@ myodbc_remove_escape(MYSQL *mysql,char *name)
|
||||
char *to;
|
||||
#ifdef USE_MB
|
||||
my_bool use_mb_flag=use_mb(mysql->charset);
|
||||
char *end;
|
||||
LINT_INIT(end);
|
||||
char *UNINIT_VAR(end);
|
||||
if (use_mb_flag)
|
||||
for (end=name; *end ; end++) ;
|
||||
#endif
|
||||
|
@ -218,11 +218,9 @@ static int _ft2_search(FTB *ftb, FTB_WORD *ftbw, my_bool init_search)
|
||||
int subkeys=1;
|
||||
my_bool can_go_down;
|
||||
MI_INFO *info=ftb->info;
|
||||
uint off, extra=HA_FT_WLEN+info->s->base.rec_reflength;
|
||||
uint UNINIT_VAR(off), extra=HA_FT_WLEN+info->s->base.rec_reflength;
|
||||
byte *lastkey_buf=ftbw->word+ftbw->off;
|
||||
LINT_INIT(off);
|
||||
|
||||
LINT_INIT(off);
|
||||
if (ftbw->flags & FTB_FLAG_TRUNC)
|
||||
lastkey_buf+=ftbw->len;
|
||||
|
||||
|
@ -140,11 +140,10 @@ int chk_del(MI_CHECK *param, register MI_INFO *info, uint test_flag)
|
||||
{
|
||||
reg2 ha_rows i;
|
||||
uint delete_link_length;
|
||||
my_off_t empty,next_link,old_link;
|
||||
my_off_t empty,next_link,UNINIT_VAR(old_link);
|
||||
char buff[22],buff2[22];
|
||||
DBUG_ENTER("chk_del");
|
||||
|
||||
LINT_INIT(old_link);
|
||||
param->record_checksum=0;
|
||||
delete_link_length=((info->s->options & HA_OPTION_PACK_RECORD) ? 20 :
|
||||
info->s->rec_reflength+1);
|
||||
@ -936,11 +935,11 @@ static uint isam_key_length(MI_INFO *info, register MI_KEYDEF *keyinfo)
|
||||
int chk_data_link(MI_CHECK *param, MI_INFO *info,int extend)
|
||||
{
|
||||
int error,got_error,flag;
|
||||
uint key,left_length,b_type,field;
|
||||
uint key,UNINIT_VAR(left_length),b_type,field;
|
||||
ha_rows records,del_blocks;
|
||||
my_off_t used,empty,pos,splits,start_recpos,
|
||||
my_off_t used,empty,pos,splits,UNINIT_VAR(start_recpos),
|
||||
del_length,link_used,start_block;
|
||||
byte *record= 0, *to;
|
||||
byte *record= 0, *UNINIT_VAR(to);
|
||||
char llbuff[22],llbuff2[22],llbuff3[22];
|
||||
ha_checksum intern_record_checksum;
|
||||
ha_checksum key_checksum[MI_MAX_POSSIBLE_KEY];
|
||||
@ -965,7 +964,6 @@ int chk_data_link(MI_CHECK *param, MI_INFO *info,int extend)
|
||||
records=del_blocks=0;
|
||||
used=link_used=splits=del_length=0;
|
||||
intern_record_checksum=param->glob_crc=0;
|
||||
LINT_INIT(left_length); LINT_INIT(start_recpos); LINT_INIT(to);
|
||||
got_error=error=0;
|
||||
empty=info->s->pack.header_length;
|
||||
|
||||
@ -2222,9 +2220,8 @@ int mi_repair_by_sort(MI_CHECK *param, register MI_INFO *info,
|
||||
ulong *rec_per_key_part;
|
||||
char llbuff[22];
|
||||
SORT_INFO sort_info;
|
||||
ulonglong key_map;
|
||||
ulonglong UNINIT_VAR(key_map);
|
||||
DBUG_ENTER("mi_repair_by_sort");
|
||||
LINT_INIT(key_map);
|
||||
|
||||
start_records=info->state->records;
|
||||
got_error=1;
|
||||
@ -2620,11 +2617,10 @@ int mi_repair_parallel(MI_CHECK *param, register MI_INFO *info,
|
||||
IO_CACHE new_data_cache; /* For non-quick repair. */
|
||||
IO_CACHE_SHARE io_share;
|
||||
SORT_INFO sort_info;
|
||||
ulonglong key_map;
|
||||
ulonglong UNINIT_VAR(key_map);
|
||||
pthread_attr_t thr_attr;
|
||||
ulong max_pack_reclength;
|
||||
DBUG_ENTER("mi_repair_parallel");
|
||||
LINT_INIT(key_map);
|
||||
|
||||
start_records=info->state->records;
|
||||
got_error=1;
|
||||
@ -3206,7 +3202,7 @@ static int sort_get_next_record(MI_SORT_PARAM *sort_param)
|
||||
int parallel_flag;
|
||||
uint found_record,b_type,left_length;
|
||||
my_off_t pos;
|
||||
byte *to;
|
||||
byte *UNINIT_VAR(to);
|
||||
MI_BLOCK_INFO block_info;
|
||||
SORT_INFO *sort_info=sort_param->sort_info;
|
||||
MI_CHECK *param=sort_info->param;
|
||||
|
@ -37,7 +37,7 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs,
|
||||
MI_CREATE_INFO *ci,uint flags)
|
||||
{
|
||||
register uint i,j;
|
||||
File dfile,file;
|
||||
File UNINIT_VAR(dfile),file;
|
||||
int errpos,save_errno, create_mode= O_RDWR | O_TRUNC;
|
||||
myf create_flag;
|
||||
uint fields,length,max_key_length,packed,pointer,real_length_diff,
|
||||
|
@ -220,7 +220,7 @@ static int d_search(register MI_INFO *info, register MI_KEYDEF *keyinfo,
|
||||
uint length,nod_flag,search_key_length;
|
||||
my_bool last_key;
|
||||
uchar *leaf_buff,*keypos;
|
||||
my_off_t leaf_page,next_block;
|
||||
my_off_t UNINIT_VAR(leaf_page),next_block;
|
||||
uchar lastkey[MI_MAX_KEY_BUFF];
|
||||
DBUG_ENTER("d_search");
|
||||
DBUG_DUMP("page",(uchar*) anc_buff,mi_getint(anc_buff));
|
||||
|
@ -1234,16 +1234,14 @@ void _my_store_blob_length(byte *pos,uint pack_length,uint length)
|
||||
int _mi_read_dynamic_record(MI_INFO *info, my_off_t filepos, byte *buf)
|
||||
{
|
||||
int block_of_record;
|
||||
uint b_type,left_length;
|
||||
byte *to;
|
||||
uint b_type,UNINIT_VAR(left_length);
|
||||
byte *UNINIT_VAR(to);
|
||||
MI_BLOCK_INFO block_info;
|
||||
File file;
|
||||
DBUG_ENTER("mi_read_dynamic_record");
|
||||
|
||||
if (filepos != HA_OFFSET_ERROR)
|
||||
{
|
||||
LINT_INIT(to);
|
||||
LINT_INIT(left_length);
|
||||
file=info->dfile;
|
||||
block_of_record= 0; /* First block of record is numbered as zero. */
|
||||
block_info.second_read= 0;
|
||||
@ -1506,13 +1504,12 @@ int _mi_read_rnd_dynamic_record(MI_INFO *info, byte *buf,
|
||||
{
|
||||
int block_of_record, info_read, save_errno;
|
||||
uint left_len,b_type;
|
||||
byte *to;
|
||||
byte *UNINIT_VAR(to);
|
||||
MI_BLOCK_INFO block_info;
|
||||
MYISAM_SHARE *share=info->s;
|
||||
DBUG_ENTER("_mi_read_rnd_dynamic_record");
|
||||
|
||||
info_read=0;
|
||||
LINT_INIT(to);
|
||||
|
||||
if (info->lock_type == F_UNLCK)
|
||||
{
|
||||
|
@ -678,7 +678,7 @@ err:
|
||||
byte *mi_alloc_rec_buff(MI_INFO *info, ulong length, byte **buf)
|
||||
{
|
||||
uint extra;
|
||||
uint32 old_length;
|
||||
uint32 UNINIT_VAR(old_length);
|
||||
LINT_INIT(old_length);
|
||||
|
||||
if (! *buf || length > (old_length=mi_get_rec_buff_len(info, *buf)))
|
||||
|
@ -1362,7 +1362,7 @@ uint _mi_pack_get_block_info(MI_INFO *myisam, MI_BIT_BUFF *bit_buff,
|
||||
File file, my_off_t filepos)
|
||||
{
|
||||
uchar *header=info->header;
|
||||
uint head_length,ref_length;
|
||||
uint head_length, UNINIT_VAR(ref_length);
|
||||
LINT_INIT(ref_length);
|
||||
|
||||
if (file >= 0)
|
||||
|
@ -240,12 +240,11 @@ int _mi_seq_search(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page,
|
||||
uchar *key, uint key_len, uint comp_flag, uchar **ret_pos,
|
||||
uchar *buff, my_bool *last_key)
|
||||
{
|
||||
int flag;
|
||||
uint nod_flag,length,not_used[2];
|
||||
int UNINIT_VAR(flag);
|
||||
uint nod_flag,UNINIT_VAR(length),not_used[2];
|
||||
uchar t_buff[MI_MAX_KEY_BUFF],*end;
|
||||
DBUG_ENTER("_mi_seq_search");
|
||||
|
||||
LINT_INIT(flag); LINT_INIT(length);
|
||||
end= page+mi_getint(page);
|
||||
nod_flag=mi_test_if_nod(page);
|
||||
page+=2+nod_flag;
|
||||
|
@ -27,11 +27,8 @@ int mi_update(register MI_INFO *info, const byte *oldrec, byte *newrec)
|
||||
bool auto_key_changed=0;
|
||||
ulonglong changed;
|
||||
MYISAM_SHARE *share=info->s;
|
||||
ha_checksum old_checksum;
|
||||
ha_checksum UNINIT_VAR(old_checksum);
|
||||
DBUG_ENTER("mi_update");
|
||||
LINT_INIT(new_key);
|
||||
LINT_INIT(changed);
|
||||
LINT_INIT(old_checksum);
|
||||
|
||||
DBUG_EXECUTE_IF("myisam_pretend_crashed_table_on_usage",
|
||||
mi_print_error(info->s, HA_ERR_CRASHED);
|
||||
|
@ -489,7 +489,7 @@ int thr_write_keys(MI_SORT_PARAM *sort_param)
|
||||
{
|
||||
SORT_INFO *sort_info=sort_param->sort_info;
|
||||
MI_CHECK *param=sort_info->param;
|
||||
ulong length, keys;
|
||||
ulong UNINIT_VAR(length), keys;
|
||||
ulong *rec_per_key_part=param->rec_per_key_part;
|
||||
int got_error=sort_info->got_error;
|
||||
uint i;
|
||||
@ -896,7 +896,7 @@ merge_buffers(MI_SORT_PARAM *info, uint keys, IO_CACHE *from_file,
|
||||
int error;
|
||||
uint sort_length,maxcount;
|
||||
ha_rows count;
|
||||
my_off_t to_start_filepos;
|
||||
my_off_t UNINIT_VAR(to_start_filepos);
|
||||
uchar *strpos;
|
||||
BUFFPEK *buffpek,**refpek;
|
||||
QUEUE queue;
|
||||
|
@ -32,7 +32,7 @@
|
||||
MYRG_INFO *myrg_open(const char *name, int mode, int handle_locking)
|
||||
{
|
||||
int save_errno,errpos=0;
|
||||
uint files= 0, i, dir_length, length, key_parts, min_keys= 0;
|
||||
uint files= 0, i, dir_length, length, UNINIT_VAR(key_parts), min_keys= 0;
|
||||
ulonglong file_offset=0;
|
||||
char name_buff[FN_REFLEN*2],buff[FN_REFLEN],*end;
|
||||
MYRG_INFO *m_info=0;
|
||||
@ -43,8 +43,6 @@ MYRG_INFO *myrg_open(const char *name, int mode, int handle_locking)
|
||||
my_bool bad_children= FALSE;
|
||||
DBUG_ENTER("myrg_open");
|
||||
|
||||
LINT_INIT(key_parts);
|
||||
|
||||
bzero((char*) &file,sizeof(file));
|
||||
if ((fd=my_open(fn_format(name_buff,name,"",MYRG_NAME_EXT,4),
|
||||
O_RDONLY | O_SHARE,MYF(0))) < 0)
|
||||
|
@ -38,16 +38,13 @@
|
||||
int myrg_rkey(MYRG_INFO *info,byte *buf,int inx, const byte *key,
|
||||
uint key_len, enum ha_rkey_function search_flag)
|
||||
{
|
||||
byte *key_buff;
|
||||
uint pack_key_length;
|
||||
uint16 last_used_keyseg;
|
||||
byte *UNINIT_VAR(key_buff);
|
||||
uint UNINIT_VAR(pack_key_length);
|
||||
uint16 UNINIT_VAR(last_used_keyseg);
|
||||
MYRG_TABLE *table;
|
||||
MI_INFO *mi;
|
||||
int err;
|
||||
DBUG_ENTER("myrg_rkey");
|
||||
LINT_INIT(key_buff);
|
||||
LINT_INIT(pack_key_length);
|
||||
LINT_INIT(last_used_keyseg);
|
||||
|
||||
if (_myrg_init_queue(info,inx,search_flag))
|
||||
DBUG_RETURN(my_errno);
|
||||
|
@ -28,9 +28,7 @@ test.t1.bool N Y 1 1 0 0 1.0000 NULL ENUM('N','Y') NOT NULL
|
||||
test.t1.d 2002-03-03 2002-03-05 10 10 0 0 10.0000 NULL ENUM('2002-03-03','2002-03-04','2002-03-05') NOT NULL
|
||||
drop table t1,t2;
|
||||
EXPLAIN SELECT 1 FROM (SELECT 1) a PROCEDURE ANALYSE();
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY <derived2> system NULL NULL NULL NULL 1
|
||||
2 DERIVED NULL NULL NULL NULL NULL NULL NULL No tables used
|
||||
ERROR HY000: Incorrect usage of PROCEDURE and subquery
|
||||
create table t1 (a int not null);
|
||||
create table t2 select * from t1 where 0=1 procedure analyse();
|
||||
show create table t2;
|
||||
@ -153,4 +151,9 @@ select f3 from t1 procedure analyse(1, 1);
|
||||
Field_name Min_value Max_value Min_length Max_length Empties_or_zeros Nulls Avg_value_or_avg_length Std Optimal_fieldtype
|
||||
test.t1.f3 5.99999 9.55555 7 7 0 0 7.77777 1.77778 FLOAT(6,5) NOT NULL
|
||||
drop table t1;
|
||||
CREATE TABLE t1(a INT,b INT,c INT,d INT,e INT,f INT,g INT,h INT,i INT,j INT,k INT);
|
||||
INSERT INTO t1 VALUES ();
|
||||
SELECT * FROM (SELECT * FROM t1) d PROCEDURE ANALYSE();
|
||||
ERROR HY000: Incorrect usage of PROCEDURE and subquery
|
||||
DROP TABLE t1;
|
||||
End of 4.1 tests
|
||||
|
@ -440,3 +440,17 @@ a val
|
||||
2 1
|
||||
3 1
|
||||
drop table t1;
|
||||
#
|
||||
# Bug#46616: Assertion `!table->auto_increment_field_not_null' on view
|
||||
# manipulations
|
||||
#
|
||||
CREATE TABLE t1 ( a INT );
|
||||
INSERT INTO t1 VALUES (1), (1);
|
||||
CREATE TABLE t2 ( a INT AUTO_INCREMENT KEY );
|
||||
CREATE TABLE IF NOT EXISTS t2 AS SELECT a FROM t1;
|
||||
ERROR 23000: Duplicate entry '1' for key 1
|
||||
UPDATE t2 SET a = 2;
|
||||
SELECT a FROM t2;
|
||||
a
|
||||
2
|
||||
DROP TABLE t1, t2;
|
||||
|
@ -18,5 +18,5 @@ master-bin.000001 # Query 1 # create database `drop-temp+table-test`
|
||||
master-bin.000001 # Query 1 # use `drop-temp+table-test`; create temporary table shortn1 (a int)
|
||||
master-bin.000001 # Query 1 # use `drop-temp+table-test`; create temporary table `table:name` (a int)
|
||||
master-bin.000001 # Query 1 # use `drop-temp+table-test`; create temporary table shortn2 (a int)
|
||||
master-bin.000001 # Query 1 # use `drop-temp+table-test`; DROP /*!40005 TEMPORARY */ TABLE IF EXISTS `drop-temp+table-test`.`shortn2`,`drop-temp+table-test`.`table:name`,`drop-temp+table-test`.`shortn1`
|
||||
master-bin.000001 # Query 1 # use `drop-temp+table-test`; DROP /*!40005 TEMPORARY */ TABLE IF EXISTS `shortn2`,`table:name`,`shortn1`
|
||||
drop database `drop-temp+table-test`;
|
||||
|
@ -260,7 +260,7 @@ master-bin.000001 # Query # # use `test`; create table t0 (n int)
|
||||
master-bin.000001 # Query # # use `test`; insert t0 select * from t1
|
||||
master-bin.000001 # Query # # use `test`; insert into t0 select GET_LOCK("lock1",null)
|
||||
master-bin.000001 # Query # # use `test`; create table t2 (n int) engine=innodb
|
||||
master-bin.000001 # Query # # use `test`; DROP /*!40005 TEMPORARY */ TABLE IF EXISTS `test`.`t1`,`test`.`ti`
|
||||
master-bin.000001 # Query # # use `test`; DROP /*!40005 TEMPORARY */ TABLE IF EXISTS `t1`,`ti`
|
||||
do release_lock("lock1");
|
||||
drop table t0,t2;
|
||||
reset master;
|
||||
|
@ -5,8 +5,15 @@ reset slave;
|
||||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||
start slave;
|
||||
create database if not exists mysqltest;
|
||||
use mysqltest;
|
||||
create temporary table mysqltest.t1 (n int);
|
||||
create temporary table mysqltest.t2 (n int);
|
||||
select get_lock("con_temp",10);
|
||||
get_lock("con_temp",10)
|
||||
1
|
||||
select get_lock("con_temp",10);
|
||||
get_lock("con_temp",10)
|
||||
1
|
||||
show status like 'Slave_open_temp_tables';
|
||||
Variable_name Value
|
||||
Slave_open_temp_tables 0
|
||||
|
@ -90,5 +90,132 @@ a b
|
||||
2 row 2
|
||||
3 row 3
|
||||
0
|
||||
set sql_log_bin= 0;
|
||||
drop database rewrite;
|
||||
set sql_log_bin= 1;
|
||||
set sql_log_bin= 0;
|
||||
drop table t1;
|
||||
set sql_log_bin= 1;
|
||||
|
||||
****
|
||||
**** Bug #46861 Auto-closing of temporary tables broken by replicate-rewrite-db
|
||||
****
|
||||
|
||||
****
|
||||
**** Preparing the environment
|
||||
****
|
||||
SET sql_log_bin= 0;
|
||||
CREATE DATABASE database_master_temp_01;
|
||||
CREATE DATABASE database_master_temp_02;
|
||||
CREATE DATABASE database_master_temp_03;
|
||||
SET sql_log_bin= 1;
|
||||
SET sql_log_bin= 0;
|
||||
CREATE DATABASE database_slave_temp_01;
|
||||
CREATE DATABASE database_slave_temp_02;
|
||||
CREATE DATABASE database_slave_temp_03;
|
||||
SET sql_log_bin= 1;
|
||||
|
||||
****
|
||||
**** Creating temporary tables on different databases with different connections
|
||||
****
|
||||
**** con_temp_01 --> creates
|
||||
**** t_01_01_temp on database_master_temp_01
|
||||
****
|
||||
**** con_temp_02 --> creates
|
||||
**** t_01_01_temp on database_master_temp_01
|
||||
**** t_02_01_temp, t_02_02_temp on database_master_temp_02
|
||||
****
|
||||
**** con_temp_02 --> creates
|
||||
**** t_01_01_temp on database_master_temp_01
|
||||
**** t_02_01_temp, t_02_02_temp on database_master_temp_02
|
||||
**** t_03_01_temp, t_03_02_temp, t_03_03_temp on database_master_temp_03
|
||||
****
|
||||
|
||||
con_temp_01
|
||||
|
||||
USE database_master_temp_01;
|
||||
CREATE TEMPORARY TABLE t_01_01_temp(a int);
|
||||
INSERT INTO t_01_01_temp VALUES(1);
|
||||
|
||||
con_temp_02
|
||||
|
||||
USE database_master_temp_01;
|
||||
CREATE TEMPORARY TABLE t_01_01_temp(a int);
|
||||
INSERT INTO t_01_01_temp VALUES(1);
|
||||
USE database_master_temp_02;
|
||||
CREATE TEMPORARY TABLE t_02_01_temp(a int);
|
||||
INSERT INTO t_02_01_temp VALUES(1);
|
||||
CREATE TEMPORARY TABLE t_02_02_temp(a int);
|
||||
INSERT INTO t_02_02_temp VALUES(1);
|
||||
|
||||
con_temp_03
|
||||
|
||||
USE database_master_temp_01;
|
||||
CREATE TEMPORARY TABLE t_01_01_temp(a int);
|
||||
INSERT INTO t_01_01_temp VALUES(1);
|
||||
USE database_master_temp_02;
|
||||
CREATE TEMPORARY TABLE t_02_01_temp(a int);
|
||||
INSERT INTO t_02_01_temp VALUES(1);
|
||||
CREATE TEMPORARY TABLE t_02_02_temp(a int);
|
||||
INSERT INTO t_02_02_temp VALUES(1);
|
||||
USE database_master_temp_03;
|
||||
CREATE TEMPORARY TABLE t_03_01_temp(a int);
|
||||
INSERT INTO t_03_01_temp VALUES(1);
|
||||
CREATE TEMPORARY TABLE t_03_02_temp(a int);
|
||||
INSERT INTO t_03_02_temp VALUES(1);
|
||||
CREATE TEMPORARY TABLE t_03_03_temp(a int);
|
||||
INSERT INTO t_03_03_temp VALUES(1);
|
||||
|
||||
**** Dropping the connections
|
||||
**** We want to SHOW BINLOG EVENTS, to know what was logged. But there is no
|
||||
**** guarantee that logging of the terminated con1 has been done yet.a To be
|
||||
**** sure that logging has been done, we use a user lock.
|
||||
|
||||
show status like 'Slave_open_temp_tables';
|
||||
Variable_name Value
|
||||
Slave_open_temp_tables 10
|
||||
select get_lock("con_01",10);
|
||||
get_lock("con_01",10)
|
||||
1
|
||||
select get_lock("con_01",10);
|
||||
get_lock("con_01",10)
|
||||
1
|
||||
select get_lock("con_02",10);
|
||||
get_lock("con_02",10)
|
||||
1
|
||||
select get_lock("con_02",10);
|
||||
get_lock("con_02",10)
|
||||
1
|
||||
select get_lock("con_03",10);
|
||||
get_lock("con_03",10)
|
||||
1
|
||||
select get_lock("con_03",10);
|
||||
get_lock("con_03",10)
|
||||
1
|
||||
|
||||
**** Checking the binary log and temporary tables
|
||||
|
||||
show status like 'Slave_open_temp_tables';
|
||||
Variable_name Value
|
||||
Slave_open_temp_tables 0
|
||||
show binlog events from <binlog_start>;
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
master-bin.000001 # Query # # use `database_master_temp_01`; DROP /*!40005 TEMPORARY */ TABLE IF EXISTS `t_01_01_temp`
|
||||
master-bin.000001 # Query # # use `database_master_temp_02`; DROP /*!40005 TEMPORARY */ TABLE IF EXISTS `t_02_02_temp`,`t_02_01_temp`
|
||||
master-bin.000001 # Query # # use `database_master_temp_01`; DROP /*!40005 TEMPORARY */ TABLE IF EXISTS `t_01_01_temp`
|
||||
master-bin.000001 # Query # # use `database_master_temp_03`; DROP /*!40005 TEMPORARY */ TABLE IF EXISTS `t_03_03_temp`,`t_03_02_temp`,`t_03_01_temp`
|
||||
master-bin.000001 # Query # # use `database_master_temp_02`; DROP /*!40005 TEMPORARY */ TABLE IF EXISTS `t_02_02_temp`,`t_02_01_temp`
|
||||
master-bin.000001 # Query # # use `database_master_temp_01`; DROP /*!40005 TEMPORARY */ TABLE IF EXISTS `t_01_01_temp`
|
||||
****
|
||||
**** Cleaning up the test case
|
||||
****
|
||||
SET sql_log_bin= 0;
|
||||
DROP DATABASE database_master_temp_01;
|
||||
DROP DATABASE database_master_temp_02;
|
||||
DROP DATABASE database_master_temp_03;
|
||||
SET sql_log_bin= 1;
|
||||
SET sql_log_bin= 0;
|
||||
DROP DATABASE database_slave_temp_01;
|
||||
DROP DATABASE database_slave_temp_02;
|
||||
DROP DATABASE database_slave_temp_03;
|
||||
SET sql_log_bin= 1;
|
||||
|
@ -75,7 +75,7 @@ SELECT 1 FROM (SELECT 1 as a) b WHERE 1 IN (SELECT (SELECT a));
|
||||
select (SELECT 1 FROM (SELECT 1) a PROCEDURE ANALYSE(1));
|
||||
ERROR HY000: Incorrect usage of PROCEDURE and subquery
|
||||
SELECT 1 FROM (SELECT 1) a PROCEDURE ANALYSE((SELECT 1));
|
||||
ERROR HY000: Incorrect parameters to procedure 'ANALYSE'
|
||||
ERROR HY000: Incorrect usage of PROCEDURE and subquery
|
||||
SELECT (SELECT 1) as a FROM (SELECT 1) b WHERE (SELECT a) IS NULL;
|
||||
ERROR 42S22: Unknown column 'a' in 'field list'
|
||||
SELECT (SELECT 1) as a FROM (SELECT 1) b WHERE (SELECT a) IS NOT NULL;
|
||||
|
@ -945,28 +945,4 @@ DROP USER foo;
|
||||
DROP VIEW db1.v1;
|
||||
DROP TABLE db1.t1;
|
||||
DROP DATABASE db1;
|
||||
#
|
||||
# Bug #46019: ERROR 1356 When selecting from within another
|
||||
# view that has Group By
|
||||
#
|
||||
CREATE DATABASE db1;
|
||||
USE db1;
|
||||
CREATE TABLE t1 (a INT);
|
||||
CREATE SQL SECURITY INVOKER VIEW v1 AS
|
||||
SELECT a FROM t1 GROUP BY a;
|
||||
CREATE SQL SECURITY INVOKER VIEW v2 AS
|
||||
SELECT a FROM v1;
|
||||
CREATE USER u1;
|
||||
GRANT SELECT ON TABLE t1 TO u1;
|
||||
GRANT SELECT, SHOW VIEW ON TABLE v1 TO u1;
|
||||
GRANT SELECT, SHOW VIEW ON TABLE v2 TO u1;
|
||||
SELECT a FROM v1;
|
||||
a
|
||||
SELECT a FROM v2;
|
||||
a
|
||||
DROP USER u1;
|
||||
DROP VIEW v1,v2;
|
||||
DROP TABLE t1;
|
||||
USE test;
|
||||
DROP DATABASE db1;
|
||||
End of 5.0 tests.
|
||||
|
@ -14,6 +14,7 @@ create table t2 select * from t1 procedure analyse();
|
||||
select * from t2;
|
||||
drop table t1,t2;
|
||||
|
||||
--error ER_WRONG_USAGE
|
||||
EXPLAIN SELECT 1 FROM (SELECT 1) a PROCEDURE ANALYSE();
|
||||
|
||||
#
|
||||
@ -102,4 +103,13 @@ select f2 from t1 procedure analyse(1, 1);
|
||||
select f3 from t1 procedure analyse(1, 1);
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
# Bug#46184 Crash, SELECT ... FROM derived table procedure analyze
|
||||
#
|
||||
CREATE TABLE t1(a INT,b INT,c INT,d INT,e INT,f INT,g INT,h INT,i INT,j INT,k INT);
|
||||
INSERT INTO t1 VALUES ();
|
||||
--error ER_WRONG_USAGE
|
||||
SELECT * FROM (SELECT * FROM t1) d PROCEDURE ANALYSE();
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo End of 4.1 tests
|
||||
|
@ -292,3 +292,19 @@ update t1 set a=2 where a=1;
|
||||
insert into t1 (val) values (1);
|
||||
select * from t1;
|
||||
drop table t1;
|
||||
--echo #
|
||||
--echo # Bug#46616: Assertion `!table->auto_increment_field_not_null' on view
|
||||
--echo # manipulations
|
||||
--echo #
|
||||
CREATE TABLE t1 ( a INT );
|
||||
INSERT INTO t1 VALUES (1), (1);
|
||||
|
||||
CREATE TABLE t2 ( a INT AUTO_INCREMENT KEY );
|
||||
--error ER_DUP_ENTRY
|
||||
CREATE TABLE IF NOT EXISTS t2 AS SELECT a FROM t1;
|
||||
|
||||
UPDATE t2 SET a = 2;
|
||||
|
||||
SELECT a FROM t2;
|
||||
|
||||
DROP TABLE t1, t2;
|
||||
|
@ -3,15 +3,22 @@ source include/master-slave.inc;
|
||||
create database if not exists mysqltest;
|
||||
--enable_warnings
|
||||
|
||||
connect (con_temp,127.0.0.1,root,,test,$MASTER_MYPORT,);
|
||||
|
||||
connection con_temp;
|
||||
use mysqltest;
|
||||
create temporary table mysqltest.t1 (n int);
|
||||
create temporary table mysqltest.t2 (n int);
|
||||
sync_slave_with_master;
|
||||
select get_lock("con_temp",10);
|
||||
|
||||
connection master;
|
||||
disconnect master;
|
||||
disconnect con_temp;
|
||||
select get_lock("con_temp",10);
|
||||
sync_slave_with_master;
|
||||
|
||||
connection slave;
|
||||
--real_sleep 3 # time for DROP to be written
|
||||
show status like 'Slave_open_temp_tables';
|
||||
connection default;
|
||||
connection master;
|
||||
drop database mysqltest;
|
||||
|
||||
# End of 4.1 tests
|
||||
|
@ -1 +1 @@
|
||||
"--replicate-rewrite-db=test->rewrite" "--replicate-rewrite-db=mysqltest1->test"
|
||||
"--replicate-rewrite-db=test->rewrite" "--replicate-rewrite-db=mysqltest1->test" "--replicate-rewrite-db=database_master_temp_01->database_slave_temp_01" "--replicate-rewrite-db=database_master_temp_02->database_slave_temp_02" "--replicate-rewrite-db=database_master_temp_03->database_slave_temp_03"
|
||||
|
@ -73,9 +73,164 @@ connection slave;
|
||||
# The empty line last comes from the end line field in the file
|
||||
select * from rewrite.t1;
|
||||
|
||||
set sql_log_bin= 0;
|
||||
drop database rewrite;
|
||||
set sql_log_bin= 1;
|
||||
|
||||
connection master;
|
||||
set sql_log_bin= 0;
|
||||
drop table t1;
|
||||
set sql_log_bin= 1;
|
||||
|
||||
# End of 4.1 tests
|
||||
|
||||
--echo
|
||||
--echo ****
|
||||
--echo **** Bug #46861 Auto-closing of temporary tables broken by replicate-rewrite-db
|
||||
--echo ****
|
||||
--echo
|
||||
|
||||
--echo ****
|
||||
--echo **** Preparing the environment
|
||||
--echo ****
|
||||
connection master;
|
||||
|
||||
connect (con_temp_03,127.0.0.1,root,,test,$MASTER_MYPORT,);
|
||||
connect (con_temp_02,127.0.0.1,root,,test,$MASTER_MYPORT,);
|
||||
connect (con_temp_01,127.0.0.1,root,,test,$MASTER_MYPORT,);
|
||||
|
||||
connection master;
|
||||
SET sql_log_bin= 0;
|
||||
CREATE DATABASE database_master_temp_01;
|
||||
CREATE DATABASE database_master_temp_02;
|
||||
CREATE DATABASE database_master_temp_03;
|
||||
SET sql_log_bin= 1;
|
||||
|
||||
connection slave;
|
||||
SET sql_log_bin= 0;
|
||||
CREATE DATABASE database_slave_temp_01;
|
||||
CREATE DATABASE database_slave_temp_02;
|
||||
CREATE DATABASE database_slave_temp_03;
|
||||
SET sql_log_bin= 1;
|
||||
|
||||
--echo
|
||||
--echo ****
|
||||
--echo **** Creating temporary tables on different databases with different connections
|
||||
--echo ****
|
||||
--echo **** con_temp_01 --> creates
|
||||
--echo **** t_01_01_temp on database_master_temp_01
|
||||
--echo ****
|
||||
--echo **** con_temp_02 --> creates
|
||||
--echo **** t_01_01_temp on database_master_temp_01
|
||||
--echo **** t_02_01_temp, t_02_02_temp on database_master_temp_02
|
||||
--echo ****
|
||||
--echo **** con_temp_02 --> creates
|
||||
--echo **** t_01_01_temp on database_master_temp_01
|
||||
--echo **** t_02_01_temp, t_02_02_temp on database_master_temp_02
|
||||
--echo **** t_03_01_temp, t_03_02_temp, t_03_03_temp on database_master_temp_03
|
||||
--echo ****
|
||||
|
||||
--echo
|
||||
--echo con_temp_01
|
||||
--echo
|
||||
connection con_temp_01;
|
||||
USE database_master_temp_01;
|
||||
CREATE TEMPORARY TABLE t_01_01_temp(a int);
|
||||
INSERT INTO t_01_01_temp VALUES(1);
|
||||
|
||||
--echo
|
||||
--echo con_temp_02
|
||||
--echo
|
||||
connection con_temp_02;
|
||||
USE database_master_temp_01;
|
||||
CREATE TEMPORARY TABLE t_01_01_temp(a int);
|
||||
INSERT INTO t_01_01_temp VALUES(1);
|
||||
USE database_master_temp_02;
|
||||
CREATE TEMPORARY TABLE t_02_01_temp(a int);
|
||||
INSERT INTO t_02_01_temp VALUES(1);
|
||||
CREATE TEMPORARY TABLE t_02_02_temp(a int);
|
||||
INSERT INTO t_02_02_temp VALUES(1);
|
||||
|
||||
--echo
|
||||
--echo con_temp_03
|
||||
--echo
|
||||
connection con_temp_03;
|
||||
USE database_master_temp_01;
|
||||
CREATE TEMPORARY TABLE t_01_01_temp(a int);
|
||||
INSERT INTO t_01_01_temp VALUES(1);
|
||||
USE database_master_temp_02;
|
||||
CREATE TEMPORARY TABLE t_02_01_temp(a int);
|
||||
INSERT INTO t_02_01_temp VALUES(1);
|
||||
CREATE TEMPORARY TABLE t_02_02_temp(a int);
|
||||
INSERT INTO t_02_02_temp VALUES(1);
|
||||
USE database_master_temp_03;
|
||||
CREATE TEMPORARY TABLE t_03_01_temp(a int);
|
||||
INSERT INTO t_03_01_temp VALUES(1);
|
||||
CREATE TEMPORARY TABLE t_03_02_temp(a int);
|
||||
INSERT INTO t_03_02_temp VALUES(1);
|
||||
CREATE TEMPORARY TABLE t_03_03_temp(a int);
|
||||
INSERT INTO t_03_03_temp VALUES(1);
|
||||
|
||||
--echo
|
||||
--echo **** Dropping the connections
|
||||
--echo **** We want to SHOW BINLOG EVENTS, to know what was logged. But there is no
|
||||
--echo **** guarantee that logging of the terminated con1 has been done yet.a To be
|
||||
--echo **** sure that logging has been done, we use a user lock.
|
||||
--echo
|
||||
connection master;
|
||||
sync_slave_with_master;
|
||||
connection slave;
|
||||
show status like 'Slave_open_temp_tables';
|
||||
|
||||
connection master;
|
||||
let $binlog_start= query_get_value(SHOW MASTER STATUS, Position, 1);
|
||||
connection con_temp_01;
|
||||
select get_lock("con_01",10);
|
||||
connection master;
|
||||
disconnect con_temp_01;
|
||||
select get_lock("con_01",10);
|
||||
|
||||
connection con_temp_02;
|
||||
select get_lock("con_02",10);
|
||||
connection master;
|
||||
disconnect con_temp_02;
|
||||
select get_lock("con_02",10);
|
||||
|
||||
connection con_temp_03;
|
||||
select get_lock("con_03",10);
|
||||
connection master;
|
||||
disconnect con_temp_03;
|
||||
select get_lock("con_03",10);
|
||||
|
||||
--echo
|
||||
--echo **** Checking the binary log and temporary tables
|
||||
--echo
|
||||
connection master;
|
||||
sync_slave_with_master;
|
||||
connection slave;
|
||||
show status like 'Slave_open_temp_tables';
|
||||
|
||||
connection master;
|
||||
--source include/show_binlog_events.inc
|
||||
|
||||
--echo ****
|
||||
--echo **** Cleaning up the test case
|
||||
--echo ****
|
||||
connection master;
|
||||
SET sql_log_bin= 0;
|
||||
DROP DATABASE database_master_temp_01;
|
||||
DROP DATABASE database_master_temp_02;
|
||||
DROP DATABASE database_master_temp_03;
|
||||
SET sql_log_bin= 1;
|
||||
|
||||
connection slave;
|
||||
SET sql_log_bin= 0;
|
||||
DROP DATABASE database_slave_temp_01;
|
||||
DROP DATABASE database_slave_temp_02;
|
||||
DROP DATABASE database_slave_temp_03;
|
||||
SET sql_log_bin= 1;
|
||||
|
||||
connection master;
|
||||
sync_slave_with_master;
|
||||
|
||||
# end of 5.0 tests
|
||||
|
@ -30,7 +30,7 @@ SELECT 1 IN (SELECT 1);
|
||||
SELECT 1 FROM (SELECT 1 as a) b WHERE 1 IN (SELECT (SELECT a));
|
||||
-- error ER_WRONG_USAGE
|
||||
select (SELECT 1 FROM (SELECT 1) a PROCEDURE ANALYSE(1));
|
||||
-- error ER_WRONG_PARAMETERS_TO_PROCEDURE
|
||||
-- error ER_WRONG_USAGE
|
||||
SELECT 1 FROM (SELECT 1) a PROCEDURE ANALYSE((SELECT 1));
|
||||
-- error ER_BAD_FIELD_ERROR
|
||||
SELECT (SELECT 1) as a FROM (SELECT 1) b WHERE (SELECT a) IS NULL;
|
||||
|
@ -1232,42 +1232,6 @@ DROP TABLE db1.t1;
|
||||
DROP DATABASE db1;
|
||||
|
||||
connection default;
|
||||
|
||||
--echo #
|
||||
--echo # Bug #46019: ERROR 1356 When selecting from within another
|
||||
--echo # view that has Group By
|
||||
--echo #
|
||||
|
||||
CREATE DATABASE db1;
|
||||
USE db1;
|
||||
|
||||
CREATE TABLE t1 (a INT);
|
||||
|
||||
CREATE SQL SECURITY INVOKER VIEW v1 AS
|
||||
SELECT a FROM t1 GROUP BY a;
|
||||
|
||||
CREATE SQL SECURITY INVOKER VIEW v2 AS
|
||||
SELECT a FROM v1;
|
||||
|
||||
CREATE USER u1;
|
||||
|
||||
GRANT SELECT ON TABLE t1 TO u1;
|
||||
GRANT SELECT, SHOW VIEW ON TABLE v1 TO u1;
|
||||
GRANT SELECT, SHOW VIEW ON TABLE v2 TO u1;
|
||||
|
||||
CONNECT (u1, localhost, u1,,db1);
|
||||
CONNECTION u1;
|
||||
|
||||
SELECT a FROM v1;
|
||||
SELECT a FROM v2;
|
||||
|
||||
CONNECTION default;
|
||||
DISCONNECT u1;
|
||||
DROP USER u1;
|
||||
DROP VIEW v1,v2;
|
||||
DROP TABLE t1;
|
||||
USE test;
|
||||
DROP DATABASE db1;
|
||||
--echo End of 5.0 tests.
|
||||
|
||||
# Wait till we reached the initial number of concurrent sessions
|
||||
|
@ -33,12 +33,11 @@ static my_string NEAR_F expand_tilde(my_string *path);
|
||||
void pack_dirname(my_string to, const char *from)
|
||||
{
|
||||
int cwd_err;
|
||||
uint d_length,length,buff_length;
|
||||
uint d_length,length,UNINIT_VAR(buff_length);
|
||||
my_string start;
|
||||
char buff[FN_REFLEN];
|
||||
DBUG_ENTER("pack_dirname");
|
||||
|
||||
LINT_INIT(buff_length);
|
||||
(void) intern_filename(to,from); /* Change to intern name */
|
||||
|
||||
#ifdef FN_DEVCHAR
|
||||
|
@ -57,6 +57,7 @@ int my_copy(const char *from, const char *to, myf MyFlags)
|
||||
File from_file,to_file;
|
||||
char buff[IO_SIZE];
|
||||
MY_STAT stat_buff,new_stat_buff;
|
||||
int res;
|
||||
DBUG_ENTER("my_copy");
|
||||
DBUG_PRINT("my",("from %s to %s MyFlags %d", from, to, MyFlags));
|
||||
|
||||
@ -93,9 +94,9 @@ int my_copy(const char *from, const char *to, myf MyFlags)
|
||||
|
||||
if (MyFlags & MY_HOLD_ORIGINAL_MODES && !new_file_stat)
|
||||
DBUG_RETURN(0); /* File copyed but not stat */
|
||||
VOID(chmod(to, stat_buff.st_mode & 07777)); /* Copy modes */
|
||||
res= chmod(to, stat_buff.st_mode & 07777); /* Copy modes */
|
||||
#if !defined(MSDOS) && !defined(__WIN__) && !defined(__EMX__) && !defined(OS2) && !defined(__NETWARE__)
|
||||
VOID(chown(to, stat_buff.st_uid,stat_buff.st_gid)); /* Copy ownership */
|
||||
res= chown(to, stat_buff.st_uid,stat_buff.st_gid); /* Copy ownership */
|
||||
#endif
|
||||
#if !defined(VMS) && !defined(__ZTC__)
|
||||
if (MyFlags & MY_COPYTIME)
|
||||
|
@ -100,7 +100,7 @@ int handle_options(int *argc, char ***argv,
|
||||
uint opt_found, argvpos= 0, length, i;
|
||||
my_bool end_of_options= 0, must_be_var, set_maximum_value,
|
||||
option_is_loose;
|
||||
char **pos, **pos_end, *optend, *prev_found,
|
||||
char **pos, **pos_end, *optend, *UNINIT_VAR(prev_found),
|
||||
*opt_str, key_name[FN_REFLEN];
|
||||
const struct my_option *optp;
|
||||
gptr *value;
|
||||
|
@ -77,6 +77,7 @@ end:
|
||||
int my_copystat(const char *from, const char *to, int MyFlags)
|
||||
{
|
||||
struct stat statbuf;
|
||||
int res;
|
||||
|
||||
if (stat((char*) from, &statbuf))
|
||||
{
|
||||
@ -95,7 +96,7 @@ int my_copystat(const char *from, const char *to, int MyFlags)
|
||||
if (MyFlags & MY_LINK_WARNING)
|
||||
my_error(EE_LINK_WARNING,MYF(ME_BELL+ME_WAITTANG),from,statbuf.st_nlink);
|
||||
}
|
||||
VOID(chown(to, statbuf.st_uid, statbuf.st_gid)); /* Copy ownership */
|
||||
res= chown(to, statbuf.st_uid, statbuf.st_gid); /* Copy ownership */
|
||||
#endif /* MSDOS */
|
||||
|
||||
#ifndef VMS
|
||||
|
@ -44,7 +44,8 @@
|
||||
|
||||
int find_type(my_string x, TYPELIB *typelib, uint full_name)
|
||||
{
|
||||
int find,pos,findpos;
|
||||
int find,pos;
|
||||
int UNINIT_VAR(findpos); /* guarded by find */
|
||||
reg1 my_string i;
|
||||
reg2 const char *j;
|
||||
DBUG_ENTER("find_type");
|
||||
@ -55,7 +56,6 @@ int find_type(my_string x, TYPELIB *typelib, uint full_name)
|
||||
DBUG_PRINT("exit",("no count"));
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
LINT_INIT(findpos);
|
||||
find=0;
|
||||
for (pos=0 ; (j=typelib->type_names[pos]) ; pos++)
|
||||
{
|
||||
|
@ -213,11 +213,11 @@ register struct parse *p;
|
||||
int stop; /* character this ERE should end at */
|
||||
{
|
||||
register char c;
|
||||
register sopno prevback;
|
||||
register sopno prevfwd;
|
||||
register sopno UNINIT_VAR(prevback);
|
||||
register sopno UNINIT_VAR(prevfwd);
|
||||
register sopno conc;
|
||||
register int first = 1; /* is this the first alternative? */
|
||||
LINT_INIT(prevback); LINT_INIT(prevfwd);
|
||||
|
||||
for (;;) {
|
||||
/* do a bunch of concatenated expressions */
|
||||
conc = HERE();
|
||||
|
@ -1633,7 +1633,7 @@ mysql_ssl_free(MYSQL *mysql __attribute__((unused)))
|
||||
*/
|
||||
|
||||
const char * STDCALL
|
||||
mysql_get_ssl_cipher(MYSQL *mysql)
|
||||
mysql_get_ssl_cipher(MYSQL *mysql __attribute__((unused)))
|
||||
{
|
||||
DBUG_ENTER("mysql_get_ssl_cipher");
|
||||
#ifdef HAVE_OPENSSL
|
||||
@ -1829,7 +1829,7 @@ CLI_MYSQL_REAL_CONNECT(MYSQL *mysql,const char *host, const char *user,
|
||||
uint port, const char *unix_socket,ulong client_flag)
|
||||
{
|
||||
char buff[NAME_LEN+USERNAME_LENGTH+100];
|
||||
char *end,*host_info;
|
||||
char *end,*host_info= NULL;
|
||||
my_socket sock;
|
||||
in_addr_t ip_addr;
|
||||
struct sockaddr_in sock_addr;
|
||||
@ -1847,7 +1847,6 @@ CLI_MYSQL_REAL_CONNECT(MYSQL *mysql,const char *host, const char *user,
|
||||
#endif
|
||||
init_sigpipe_variables
|
||||
DBUG_ENTER("mysql_real_connect");
|
||||
LINT_INIT(host_info);
|
||||
|
||||
DBUG_PRINT("enter",("host: %s db: %s user: %s",
|
||||
host ? host : "(Null)",
|
||||
|
@ -160,7 +160,7 @@ enum enum_mysql_timestamp_type
|
||||
str_to_datetime(const char *str, uint length, MYSQL_TIME *l_time,
|
||||
uint flags, int *was_cut)
|
||||
{
|
||||
uint field_length, year_length, digits, i, number_of_fields;
|
||||
uint field_length, UNINIT_VAR(year_length), digits, i, number_of_fields;
|
||||
uint date[MAX_DATE_PARTS], date_len[MAX_DATE_PARTS];
|
||||
uint add_hours= 0, start_loop;
|
||||
ulong not_zero_date, allow_space;
|
||||
@ -174,7 +174,6 @@ str_to_datetime(const char *str, uint length, MYSQL_TIME *l_time,
|
||||
DBUG_PRINT("ENTER",("str: %.*s",length,str));
|
||||
|
||||
LINT_INIT(field_length);
|
||||
LINT_INIT(year_length);
|
||||
LINT_INIT(last_field_pos);
|
||||
|
||||
*was_cut= 0;
|
||||
|
19
sql/field.cc
19
sql/field.cc
@ -1736,16 +1736,16 @@ int Field_decimal::store(const char *from, uint len, CHARSET_INFO *cs)
|
||||
Pointers used when digits move from the left of the '.' to the
|
||||
right of the '.' (explained below)
|
||||
*/
|
||||
const char *int_digits_tail_from;
|
||||
const char *UNINIT_VAR(int_digits_tail_from);
|
||||
/* Number of 0 that need to be added at the left of the '.' (1E3: 3 zeros) */
|
||||
uint int_digits_added_zeros;
|
||||
uint UNINIT_VAR(int_digits_added_zeros);
|
||||
/*
|
||||
Pointer used when digits move from the right of the '.' to the left
|
||||
of the '.'
|
||||
*/
|
||||
const char *frac_digits_head_end;
|
||||
const char *UNINIT_VAR(frac_digits_head_end);
|
||||
/* Number of 0 that need to be added at the right of the '.' (for 1E-3) */
|
||||
uint frac_digits_added_zeros;
|
||||
uint UNINIT_VAR(frac_digits_added_zeros);
|
||||
char *pos,*tmp_left_pos,*tmp_right_pos;
|
||||
/* Pointers that are used as limits (begin and end of the field buffer) */
|
||||
char *left_wall,*right_wall;
|
||||
@ -1756,11 +1756,6 @@ int Field_decimal::store(const char *from, uint len, CHARSET_INFO *cs)
|
||||
*/
|
||||
bool is_cuted_fields_incr=0;
|
||||
|
||||
LINT_INIT(int_digits_tail_from);
|
||||
LINT_INIT(int_digits_added_zeros);
|
||||
LINT_INIT(frac_digits_head_end);
|
||||
LINT_INIT(frac_digits_added_zeros);
|
||||
|
||||
/*
|
||||
There are three steps in this function :
|
||||
- parse the input string
|
||||
@ -8854,10 +8849,8 @@ Field *make_field(char *ptr, uint32 field_length,
|
||||
const char *field_name,
|
||||
struct st_table *table)
|
||||
{
|
||||
uchar *bit_ptr;
|
||||
uchar bit_offset;
|
||||
LINT_INIT(bit_ptr);
|
||||
LINT_INIT(bit_offset);
|
||||
uchar *UNINIT_VAR(bit_ptr);
|
||||
uchar UNINIT_VAR(bit_offset);
|
||||
if (field_type == FIELD_TYPE_BIT && !f_bit_as_char(pack_flag))
|
||||
{
|
||||
bit_ptr= null_pos;
|
||||
|
@ -78,7 +78,7 @@ static void split_file_name(const char *file_name,
|
||||
|
||||
extern "C" void myrg_print_wrong_table(const char *table_name)
|
||||
{
|
||||
LEX_STRING db, name;
|
||||
LEX_STRING db= {NULL, 0}, name;
|
||||
char buf[FN_REFLEN];
|
||||
split_file_name(table_name, &db, &name);
|
||||
memcpy(buf, db.str, db.length);
|
||||
|
@ -1635,7 +1635,7 @@ bool agg_item_collations_for_comparison(DTCollation &c, const char *fname,
|
||||
bool agg_item_set_converter(DTCollation &coll, const char *fname,
|
||||
Item **args, uint nargs, uint flags, int item_sep)
|
||||
{
|
||||
Item **arg, *safe_args[2];
|
||||
Item **arg, *safe_args[2]= {NULL, NULL};
|
||||
|
||||
/*
|
||||
For better error reporting: save the first and the second argument.
|
||||
@ -1644,8 +1644,6 @@ bool agg_item_set_converter(DTCollation &coll, const char *fname,
|
||||
doesn't display each argument's characteristics.
|
||||
- if nargs is 1, then this error cannot happen.
|
||||
*/
|
||||
LINT_INIT(safe_args[0]);
|
||||
LINT_INIT(safe_args[1]);
|
||||
if (nargs >=2 && nargs <= 3)
|
||||
{
|
||||
safe_args[0]= args[0];
|
||||
@ -5122,9 +5120,8 @@ bool Item_null::send(Protocol *protocol, String *packet)
|
||||
|
||||
bool Item::send(Protocol *protocol, String *buffer)
|
||||
{
|
||||
bool result;
|
||||
bool UNINIT_VAR(result); // Will be set if null_value == 0
|
||||
enum_field_types f_type;
|
||||
LINT_INIT(result); // Will be set if null_value == 0
|
||||
|
||||
switch ((f_type=field_type())) {
|
||||
default:
|
||||
|
@ -352,8 +352,7 @@ static bool convert_constant_item(THD *thd, Item_field *field_item,
|
||||
/* For comparison purposes allow invalid dates like 2000-01-32 */
|
||||
ulong orig_sql_mode= thd->variables.sql_mode;
|
||||
enum_check_fields orig_count_cuted_fields= thd->count_cuted_fields;
|
||||
ulonglong orig_field_val; /* original field value if valid */
|
||||
LINT_INIT(orig_field_val);
|
||||
ulonglong UNINIT_VAR(orig_field_val); /* original field value if valid */
|
||||
thd->variables.sql_mode= (orig_sql_mode & ~MODE_NO_ZERO_DATE) |
|
||||
MODE_INVALID_DATES;
|
||||
thd->count_cuted_fields= CHECK_FIELD_IGNORE;
|
||||
@ -2453,19 +2452,13 @@ Item_func_nullif::is_null()
|
||||
|
||||
Item *Item_func_case::find_item(String *str)
|
||||
{
|
||||
String *first_expr_str, *tmp;
|
||||
my_decimal *first_expr_dec, first_expr_dec_val;
|
||||
longlong first_expr_int;
|
||||
double first_expr_real;
|
||||
String *UNINIT_VAR(first_expr_str), *tmp;
|
||||
my_decimal *UNINIT_VAR(first_expr_dec), first_expr_dec_val;
|
||||
longlong UNINIT_VAR(first_expr_int);
|
||||
double UNINIT_VAR(first_expr_real);
|
||||
char buff[MAX_FIELD_WIDTH];
|
||||
String buff_str(buff,sizeof(buff),default_charset());
|
||||
|
||||
/* These will be initialized later */
|
||||
LINT_INIT(first_expr_str);
|
||||
LINT_INIT(first_expr_int);
|
||||
LINT_INIT(first_expr_real);
|
||||
LINT_INIT(first_expr_dec);
|
||||
|
||||
if (first_expr_num != -1)
|
||||
{
|
||||
switch (cmp_type)
|
||||
|
@ -451,10 +451,9 @@ Item *create_func_cast(Item *a, Cast_target cast_type,
|
||||
const char *c_len, const char *c_dec,
|
||||
CHARSET_INFO *cs)
|
||||
{
|
||||
Item *res;
|
||||
Item *UNINIT_VAR(res);
|
||||
ulong len;
|
||||
uint dec;
|
||||
LINT_INIT(res);
|
||||
|
||||
switch (cast_type) {
|
||||
case ITEM_CAST_BINARY: res= new Item_func_binary(a); break;
|
||||
@ -542,6 +541,9 @@ Item *create_func_cast(Item *a, Cast_target cast_type,
|
||||
res= new Item_char_typecast(a, len, cs ? cs :
|
||||
current_thd->variables.collation_connection);
|
||||
break;
|
||||
|
||||
default:
|
||||
DBUG_ASSERT(0);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
@ -2275,9 +2275,8 @@ void Item_func_min_max::fix_length_and_dec()
|
||||
|
||||
uint Item_func_min_max::cmp_datetimes(ulonglong *value)
|
||||
{
|
||||
longlong min_max;
|
||||
longlong UNINIT_VAR(min_max);
|
||||
uint min_max_idx= 0;
|
||||
LINT_INIT(min_max);
|
||||
|
||||
for (uint i=0; i < arg_count ; i++)
|
||||
{
|
||||
@ -2345,8 +2344,7 @@ String *Item_func_min_max::val_str(String *str)
|
||||
}
|
||||
case STRING_RESULT:
|
||||
{
|
||||
String *res;
|
||||
LINT_INIT(res);
|
||||
String *UNINIT_VAR(res);
|
||||
for (uint i=0; i < arg_count ; i++)
|
||||
{
|
||||
if (i == 0)
|
||||
@ -2435,8 +2433,7 @@ longlong Item_func_min_max::val_int()
|
||||
my_decimal *Item_func_min_max::val_decimal(my_decimal *dec)
|
||||
{
|
||||
DBUG_ASSERT(fixed == 1);
|
||||
my_decimal tmp_buf, *tmp, *res;
|
||||
LINT_INIT(res);
|
||||
my_decimal tmp_buf, *tmp, *UNINIT_VAR(res);
|
||||
|
||||
if (compare_as_dates)
|
||||
{
|
||||
@ -4974,8 +4971,7 @@ void Item_func_match::init_search(bool no_order)
|
||||
bool Item_func_match::fix_fields(THD *thd, Item **ref)
|
||||
{
|
||||
DBUG_ASSERT(fixed == 0);
|
||||
Item *item;
|
||||
LINT_INIT(item); // Safe as arg_count is > 1
|
||||
Item *UNINIT_VAR(item); // Safe as arg_count is > 1
|
||||
|
||||
maybe_null=1;
|
||||
join_key=0;
|
||||
|
@ -1216,11 +1216,10 @@ void unlock_global_read_lock(THD *thd)
|
||||
bool wait_if_global_read_lock(THD *thd, bool abort_on_refresh,
|
||||
bool is_not_commit)
|
||||
{
|
||||
const char *old_message;
|
||||
const char *UNINIT_VAR(old_message);
|
||||
bool result= 0, need_exit_cond;
|
||||
DBUG_ENTER("wait_if_global_read_lock");
|
||||
|
||||
LINT_INIT(old_message);
|
||||
/*
|
||||
Assert that we do not own LOCK_open. If we would own it, other
|
||||
threads could not close their tables. This would make a pretty
|
||||
|
@ -2635,9 +2635,10 @@ bool flush_error_log()
|
||||
else
|
||||
result= 1;
|
||||
#else
|
||||
FILE *reopen;
|
||||
my_rename(log_error_file,err_renamed,MYF(0));
|
||||
if (freopen(log_error_file,"a+",stdout))
|
||||
freopen(log_error_file,"a+",stderr);
|
||||
reopen= freopen(log_error_file,"a+",stderr);
|
||||
else
|
||||
result= 1;
|
||||
#endif
|
||||
|
@ -2063,7 +2063,7 @@ int SQL_SELECT::test_quick_select(THD *thd, key_map keys_to_use,
|
||||
KEY *key_info;
|
||||
PARAM param;
|
||||
|
||||
if (check_stack_overrun(thd, 2*STACK_MIN_SIZE, buff))
|
||||
if (check_stack_overrun(thd, 2*STACK_MIN_SIZE + sizeof(PARAM), buff))
|
||||
DBUG_RETURN(0); // Fatal error flag is set
|
||||
|
||||
/* set up parameter that is passed to all functions */
|
||||
@ -3514,11 +3514,10 @@ static TRP_RANGE *get_key_scans_params(PARAM *param, SEL_TREE *tree,
|
||||
{
|
||||
int idx;
|
||||
SEL_ARG **key,**end, **key_to_read= NULL;
|
||||
ha_rows best_records;
|
||||
ha_rows UNINIT_VAR(best_records); /* protected by key_to_read */
|
||||
TRP_RANGE* read_plan= NULL;
|
||||
bool pk_is_clustered= param->table->file->primary_key_is_clustered();
|
||||
DBUG_ENTER("get_key_scans_params");
|
||||
LINT_INIT(best_records); /* protected by key_to_read */
|
||||
/*
|
||||
Note that there may be trees that have type SEL_TREE::KEY but contain no
|
||||
key reads at all, e.g. tree for expression "key1 is not null" where key1
|
||||
@ -5370,8 +5369,7 @@ static bool eq_tree(SEL_ARG* a,SEL_ARG *b)
|
||||
SEL_ARG *
|
||||
SEL_ARG::insert(SEL_ARG *key)
|
||||
{
|
||||
SEL_ARG *element,**par,*last_element;
|
||||
LINT_INIT(par); LINT_INIT(last_element);
|
||||
SEL_ARG *element,**UNINIT_VAR(par),*UNINIT_VAR(last_element);
|
||||
|
||||
for (element= this; element != &null_element ; )
|
||||
{
|
||||
@ -7918,7 +7916,9 @@ get_best_group_min_max(PARAM *param, SEL_TREE *tree)
|
||||
goto next_index;
|
||||
}
|
||||
else
|
||||
{
|
||||
DBUG_ASSERT(FALSE);
|
||||
}
|
||||
|
||||
/* Check (SA2). */
|
||||
if (min_max_arg_item)
|
||||
@ -8308,11 +8308,21 @@ get_constant_key_infix(KEY *index_info, SEL_ARG *index_range_tree,
|
||||
return FALSE;
|
||||
|
||||
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])
|
||||
||
|
||||
(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'. In this case the argument points to a "null value" (is_null_string)
|
||||
that may not always be long enough for a direct memcpy to a field.
|
||||
*/
|
||||
DBUG_ASSERT (field_length > 0);
|
||||
*key_ptr= 1;
|
||||
bzero(key_ptr+1,field_length-1);
|
||||
key_ptr+= field_length;
|
||||
*key_infix_len+= field_length;
|
||||
}
|
||||
else if (memcmp(cur_range->min_value, cur_range->max_value, field_length) == 0)
|
||||
{ /* cur_range specifies an equality condition. */
|
||||
memcpy(key_ptr, cur_range->min_value, field_length);
|
||||
key_ptr+= field_length;
|
||||
*key_infix_len+= field_length;
|
||||
|
@ -935,13 +935,10 @@ int Gis_polygon::interior_ring_n(uint32 num, String *result) const
|
||||
int Gis_polygon::centroid_xy(double *x, double *y) const
|
||||
{
|
||||
uint32 n_linear_rings;
|
||||
double res_area;
|
||||
double res_cx, res_cy;
|
||||
double UNINIT_VAR(res_area);
|
||||
double UNINIT_VAR(res_cx), UNINIT_VAR(res_cy);
|
||||
const char *data= m_data;
|
||||
bool first_loop= 1;
|
||||
LINT_INIT(res_area);
|
||||
LINT_INIT(res_cx);
|
||||
LINT_INIT(res_cy);
|
||||
|
||||
if (no_data(data, 4))
|
||||
return 1;
|
||||
@ -1634,14 +1631,10 @@ int Gis_multi_polygon::centroid(String *result) const
|
||||
uint32 n_polygons;
|
||||
bool first_loop= 1;
|
||||
Gis_polygon p;
|
||||
double res_area, res_cx, res_cy;
|
||||
double UNINIT_VAR(res_area), UNINIT_VAR(res_cx), UNINIT_VAR(res_cy);
|
||||
double cur_area, cur_cx, cur_cy;
|
||||
const char *data= m_data;
|
||||
|
||||
LINT_INIT(res_area);
|
||||
LINT_INIT(res_cx);
|
||||
LINT_INIT(res_cy);
|
||||
|
||||
if (no_data(data, 4))
|
||||
return 1;
|
||||
n_polygons= uint4korr(data);
|
||||
|
@ -3650,14 +3650,11 @@ bool check_grant(THD *thd, ulong want_access, TABLE_LIST *tables,
|
||||
continue; // ok
|
||||
|
||||
if (!(~table->grant.privilege & want_access) ||
|
||||
table->is_non_materialized_derived_table() || table->schema_table)
|
||||
table->derived || table->schema_table)
|
||||
{
|
||||
/*
|
||||
It is subquery in the FROM clause. VIEW set table->derived after
|
||||
table opening, but this function is mostly called before table opening.
|
||||
When it's called after table opening e.g. for nested views with
|
||||
materialization we shoud check the materialized table for access as
|
||||
any other table.
|
||||
table opening, but this function always called before table opening.
|
||||
*/
|
||||
if (!table->referencing_view)
|
||||
{
|
||||
@ -3670,10 +3667,9 @@ bool check_grant(THD *thd, ulong want_access, TABLE_LIST *tables,
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!(grant_table= table_hash_search(sctx->host, sctx->ip,
|
||||
table->get_db_name(), sctx->priv_user,
|
||||
table->get_table_name(), 0)))
|
||||
table->db, sctx->priv_user,
|
||||
table->table_name,0)))
|
||||
{
|
||||
want_access &= ~table->grant.privilege;
|
||||
goto err; // No grants
|
||||
@ -5071,17 +5067,13 @@ static int handle_grant_struct(uint struct_no, bool drop,
|
||||
uint elements;
|
||||
const char *user;
|
||||
const char *host;
|
||||
ACL_USER *acl_user;
|
||||
ACL_DB *acl_db;
|
||||
GRANT_NAME *grant_name;
|
||||
ACL_USER *UNINIT_VAR(acl_user);
|
||||
ACL_DB *UNINIT_VAR(acl_db);
|
||||
GRANT_NAME *UNINIT_VAR(grant_name);
|
||||
DBUG_ENTER("handle_grant_struct");
|
||||
DBUG_PRINT("info",("scan struct: %u search: '%s'@'%s'",
|
||||
struct_no, user_from->user.str, user_from->host.str));
|
||||
|
||||
LINT_INIT(acl_user);
|
||||
LINT_INIT(acl_db);
|
||||
LINT_INIT(grant_name);
|
||||
|
||||
safe_mutex_assert_owner(&acl_cache->lock);
|
||||
|
||||
/* Get the number of elements in the in-memory structure. */
|
||||
|
@ -706,7 +706,7 @@ void close_temporary_tables(THD *thd)
|
||||
return;
|
||||
}
|
||||
|
||||
TABLE *next,
|
||||
TABLE *UNINIT_VAR(next),
|
||||
*prev_table /* prev link is not maintained in TABLE's double-linked list */;
|
||||
bool was_quote_show= true; /* to assume thd->options has OPTION_QUOTE_SHOW_CREATE */
|
||||
// Better add "if exists", in case a RESET MASTER has been done
|
||||
@ -716,7 +716,6 @@ void close_temporary_tables(THD *thd)
|
||||
memcpy(buf, stub, stub_len);
|
||||
String s_query= String(buf, sizeof(buf), system_charset_info);
|
||||
bool found_user_tables= false;
|
||||
LINT_INIT(next);
|
||||
|
||||
/*
|
||||
insertion sort of temp tables by pseudo_thread_id to build ordered list
|
||||
@ -769,19 +768,23 @@ void close_temporary_tables(THD *thd)
|
||||
{
|
||||
/* Set pseudo_thread_id to be that of the processed table */
|
||||
thd->variables.pseudo_thread_id= tmpkeyval(thd, table);
|
||||
/* Loop forward through all tables within the sublist of
|
||||
common pseudo_thread_id to create single DROP query */
|
||||
String db;
|
||||
db.append(table->s->db);
|
||||
/* Loop forward through all tables that belong to a common database
|
||||
within the sublist of common pseudo_thread_id to create single
|
||||
DROP query
|
||||
*/
|
||||
for (s_query.length(stub_len);
|
||||
table && is_user_table(table) &&
|
||||
tmpkeyval(thd, table) == thd->variables.pseudo_thread_id;
|
||||
tmpkeyval(thd, table) == thd->variables.pseudo_thread_id &&
|
||||
strlen(table->s->db) == db.length() &&
|
||||
strcmp(table->s->db, db.ptr()) == 0;
|
||||
table= next)
|
||||
{
|
||||
/*
|
||||
We are going to add 4 ` around the db/table names and possible more
|
||||
due to special characters in the names
|
||||
We are going to add ` around the table names and possible more
|
||||
due to special characters
|
||||
*/
|
||||
append_identifier(thd, &s_query, table->s->db, (uint) strlen(table->s->db));
|
||||
s_query.q_append('.');
|
||||
append_identifier(thd, &s_query, table->s->table_name,
|
||||
(uint) strlen(table->s->table_name));
|
||||
s_query.q_append(',');
|
||||
@ -794,6 +797,7 @@ void close_temporary_tables(THD *thd)
|
||||
Query_log_event qinfo(thd, s_query.ptr(),
|
||||
s_query.length() - 1 /* to remove trailing ',' */,
|
||||
0, FALSE, THD::NOT_KILLED);
|
||||
qinfo.db= db.ptr();
|
||||
thd->variables.character_set_client= cs_save;
|
||||
DBUG_ASSERT(qinfo.error_code == 0);
|
||||
mysql_bin_log.write(&qinfo);
|
||||
@ -4137,8 +4141,7 @@ find_item_in_list(Item *find, List<Item> &items, uint *counter,
|
||||
(and not an item that happens to have a name).
|
||||
*/
|
||||
bool is_ref_by_name= 0;
|
||||
uint unaliased_counter;
|
||||
LINT_INIT(unaliased_counter); // Dependent on found_unaliased
|
||||
uint UNINIT_VAR(unaliased_counter); // Dependent on found_unaliased
|
||||
|
||||
*resolution= NOT_RESOLVED;
|
||||
|
||||
|
@ -1325,7 +1325,7 @@ pthread_handler_t handle_bootstrap(void *arg)
|
||||
thd->init_for_queries();
|
||||
while (fgets(buff, thd->net.max_packet, file))
|
||||
{
|
||||
char *query;
|
||||
char *query, *res;
|
||||
ulong length= (ulong) strlen(buff);
|
||||
while (buff[length-1] != '\n' && !feof(file))
|
||||
{
|
||||
@ -1340,7 +1340,7 @@ pthread_handler_t handle_bootstrap(void *arg)
|
||||
break;
|
||||
}
|
||||
buff= (char*) thd->net.buff;
|
||||
fgets(buff + length, thd->net.max_packet - length, file);
|
||||
res= fgets(buff + length, thd->net.max_packet - length, file);
|
||||
length+= (ulong) strlen(buff + length);
|
||||
}
|
||||
if (thd->is_fatal_error)
|
||||
|
@ -2072,10 +2072,9 @@ void mysql_sql_stmt_prepare(THD *thd)
|
||||
LEX_STRING *name= &lex->prepared_stmt_name;
|
||||
Prepared_statement *stmt;
|
||||
const char *query;
|
||||
uint query_len;
|
||||
uint UNINIT_VAR(query_len);
|
||||
DBUG_ENTER("mysql_sql_stmt_prepare");
|
||||
DBUG_ASSERT(thd->protocol == &thd->protocol_simple);
|
||||
LINT_INIT(query_len);
|
||||
|
||||
if ((stmt= (Prepared_statement*) thd->stmt_map.find_by_name(name)))
|
||||
{
|
||||
|
@ -2172,8 +2172,8 @@ int get_all_tables(THD *thd, TABLE_LIST *tables, COND *cond)
|
||||
ST_SCHEMA_TABLE *schema_table= tables->schema_table;
|
||||
SELECT_LEX sel;
|
||||
INDEX_FIELD_VALUES idx_field_vals;
|
||||
char path[FN_REFLEN], *end, *base_name, *orig_base_name, *file_name;
|
||||
uint len;
|
||||
char path[FN_REFLEN], *UNINIT_VAR(end), *base_name, *orig_base_name, *file_name;
|
||||
uint UNINIT_VAR(len);
|
||||
bool with_i_schema;
|
||||
enum enum_schema_tables schema_table_idx;
|
||||
List<char> bases;
|
||||
@ -2190,9 +2190,6 @@ int get_all_tables(THD *thd, TABLE_LIST *tables, COND *cond)
|
||||
#endif
|
||||
DBUG_ENTER("get_all_tables");
|
||||
|
||||
LINT_INIT(end);
|
||||
LINT_INIT(len);
|
||||
|
||||
lex->view_prepare_mode= TRUE;
|
||||
lex->reset_n_backup_query_tables_list(&query_tables_list_backup);
|
||||
|
||||
|
@ -125,7 +125,7 @@ int mysql_update(THD *thd,
|
||||
uint want_privilege;
|
||||
#endif
|
||||
uint table_count= 0;
|
||||
query_id_t query_id=thd->query_id, timestamp_query_id;
|
||||
query_id_t query_id=thd->query_id, UNINIT_VAR(timestamp_query_id);
|
||||
ha_rows updated, found;
|
||||
key_map old_used_keys;
|
||||
TABLE *table;
|
||||
@ -137,8 +137,6 @@ int mysql_update(THD *thd,
|
||||
THD::killed_state killed_status= THD::NOT_KILLED;
|
||||
DBUG_ENTER("mysql_update");
|
||||
|
||||
LINT_INIT(timestamp_query_id);
|
||||
|
||||
for ( ; ; )
|
||||
{
|
||||
if (open_tables(thd, &table_list, &table_count, 0))
|
||||
@ -527,6 +525,7 @@ int mysql_update(THD *thd,
|
||||
table->file->unlock_row();
|
||||
thd->row_count++;
|
||||
}
|
||||
table->auto_increment_field_not_null= FALSE;
|
||||
/*
|
||||
Caching the killed status to pass as the arg to query event constuctor;
|
||||
The cached value can not change whereas the killed status can
|
||||
|
@ -955,7 +955,7 @@ bool mysql_make_view(THD *thd, File_parser *parser, TABLE_LIST *table,
|
||||
TABLE_LIST *top_view= table->top_table();
|
||||
int res;
|
||||
bool result, view_is_mergeable;
|
||||
TABLE_LIST *view_main_select_tables;
|
||||
TABLE_LIST *UNINIT_VAR(view_main_select_tables);
|
||||
DBUG_ENTER("mysql_make_view");
|
||||
DBUG_PRINT("info", ("table: 0x%lx (%s)", (ulong) table, table->table_name));
|
||||
|
||||
@ -1218,7 +1218,6 @@ bool mysql_make_view(THD *thd, File_parser *parser, TABLE_LIST *table,
|
||||
|
||||
view_is_mergeable= (table->algorithm != VIEW_ALGORITHM_TMPTABLE &&
|
||||
lex->can_be_merged());
|
||||
LINT_INIT(view_main_select_tables);
|
||||
|
||||
if (view_is_mergeable)
|
||||
{
|
||||
|
@ -7334,7 +7334,8 @@ procedure_clause:
|
||||
MYSQL_YYABORT;
|
||||
}
|
||||
|
||||
if (&lex->select_lex != lex->current_select)
|
||||
if (&lex->select_lex != lex->current_select ||
|
||||
lex->select_lex.get_table_list()->derived)
|
||||
{
|
||||
my_error(ER_WRONG_USAGE, MYF(0), "PROCEDURE", "subquery");
|
||||
MYSQL_YYABORT;
|
||||
|
23
sql/table.h
23
sql/table.h
@ -771,29 +771,6 @@ struct TABLE_LIST
|
||||
void reinit_before_use(THD *thd);
|
||||
Item_subselect *containing_subselect();
|
||||
|
||||
/**
|
||||
@brief True if this TABLE_LIST represents an not yet materialized
|
||||
derived table, i.e. the result of a subquery or view execution.
|
||||
*/
|
||||
bool is_non_materialized_derived_table() const
|
||||
{
|
||||
return derived && !derived_result;
|
||||
}
|
||||
|
||||
/**
|
||||
@brief Returns the name of the database that the referenced table belongs
|
||||
to.
|
||||
*/
|
||||
char *get_db_name() { return view != NULL ? view_db.str : db; }
|
||||
|
||||
/**
|
||||
@brief Returns the name of the table that this TABLE_LIST represents.
|
||||
|
||||
@details The unqualified table name or view name for a table or view,
|
||||
respectively.
|
||||
*/
|
||||
char *get_table_name() { return view != NULL ? view_name.str : table_name; }
|
||||
|
||||
private:
|
||||
bool prep_check_option(THD *thd, uint8 check_opt_type);
|
||||
bool prep_where(THD *thd, Item **conds, bool no_where_clause);
|
||||
|
@ -202,11 +202,10 @@ static int my_strnncoll_ucs2(CHARSET_INFO *cs,
|
||||
my_bool t_is_prefix)
|
||||
{
|
||||
int s_res,t_res;
|
||||
my_wc_t s_wc,t_wc;
|
||||
my_wc_t UNINIT_VAR(s_wc),t_wc;
|
||||
const uchar *se=s+slen;
|
||||
const uchar *te=t+tlen;
|
||||
MY_UNICASE_INFO **uni_plane= cs->caseinfo;
|
||||
LINT_INIT(s_wc);
|
||||
|
||||
while ( s < se && t < te )
|
||||
{
|
||||
@ -317,11 +316,10 @@ static int my_strncasecmp_ucs2(CHARSET_INFO *cs,
|
||||
const char *s, const char *t, uint len)
|
||||
{
|
||||
int s_res,t_res;
|
||||
my_wc_t s_wc,t_wc;
|
||||
my_wc_t UNINIT_VAR(s_wc),t_wc;
|
||||
const char *se=s+len;
|
||||
const char *te=t+len;
|
||||
MY_UNICASE_INFO **uni_plane= cs->caseinfo;
|
||||
LINT_INIT(s_wc);
|
||||
|
||||
while ( s < se && t < te )
|
||||
{
|
||||
@ -1385,10 +1383,9 @@ int my_strnncoll_ucs2_bin(CHARSET_INFO *cs,
|
||||
my_bool t_is_prefix)
|
||||
{
|
||||
int s_res,t_res;
|
||||
my_wc_t s_wc,t_wc;
|
||||
my_wc_t UNINIT_VAR(s_wc),t_wc;
|
||||
const uchar *se=s+slen;
|
||||
const uchar *te=t+tlen;
|
||||
LINT_INIT(s_wc);
|
||||
|
||||
while ( s < se && t < te )
|
||||
{
|
||||
|
@ -2306,11 +2306,10 @@ static int my_strnncoll_utf8(CHARSET_INFO *cs,
|
||||
my_bool t_is_prefix)
|
||||
{
|
||||
int s_res,t_res;
|
||||
my_wc_t s_wc,t_wc;
|
||||
my_wc_t UNINIT_VAR(s_wc), t_wc;
|
||||
const uchar *se=s+slen;
|
||||
const uchar *te=t+tlen;
|
||||
MY_UNICASE_INFO **uni_plane= cs->caseinfo;
|
||||
LINT_INIT(s_wc);
|
||||
|
||||
while ( s < se && t < te )
|
||||
{
|
||||
@ -2377,10 +2376,9 @@ static int my_strnncollsp_utf8(CHARSET_INFO *cs,
|
||||
my_bool diff_if_only_endspace_difference)
|
||||
{
|
||||
int s_res, t_res, res;
|
||||
my_wc_t s_wc,t_wc;
|
||||
my_wc_t UNINIT_VAR(s_wc),t_wc;
|
||||
const uchar *se= s+slen, *te= t+tlen;
|
||||
MY_UNICASE_INFO **uni_plane= cs->caseinfo;
|
||||
LINT_INIT(s_wc);
|
||||
|
||||
#ifndef VARCHAR_WITH_DIFF_ENDSPACE_ARE_DIFFERENT_FOR_UNIQUE
|
||||
diff_if_only_endspace_difference= 0;
|
||||
|
@ -1359,8 +1359,7 @@ int bin2decimal(char *from, decimal_t *to, int precision, int scale)
|
||||
if (intg0x)
|
||||
{
|
||||
int i=dig2bytes[intg0x];
|
||||
dec1 x;
|
||||
LINT_INIT(x);
|
||||
dec1 UNINIT_VAR(x);
|
||||
switch (i)
|
||||
{
|
||||
case 1: x=mi_sint1korr(from); break;
|
||||
@ -1401,8 +1400,7 @@ int bin2decimal(char *from, decimal_t *to, int precision, int scale)
|
||||
if (frac0x)
|
||||
{
|
||||
int i=dig2bytes[frac0x];
|
||||
dec1 x;
|
||||
LINT_INIT(x);
|
||||
dec1 UNINIT_VAR(x);
|
||||
switch (i)
|
||||
{
|
||||
case 1: x=mi_sint1korr(from); break;
|
||||
@ -1480,7 +1478,7 @@ decimal_round(decimal_t *from, decimal_t *to, int scale,
|
||||
decimal_round_mode mode)
|
||||
{
|
||||
int frac0=scale>0 ? ROUND_UP(scale) : scale/DIG_PER_DEC1,
|
||||
frac1=ROUND_UP(from->frac), round_digit,
|
||||
frac1=ROUND_UP(from->frac), UNINIT_VAR(round_digit),
|
||||
intg0=ROUND_UP(from->intg), error=E_DEC_OK, len=to->len,
|
||||
intg1=ROUND_UP(from->intg +
|
||||
(((intg0 + frac0)>0) && (from->buf[0] == DIG_MAX)));
|
||||
@ -1489,7 +1487,6 @@ decimal_round(decimal_t *from, decimal_t *to, int scale,
|
||||
|
||||
sanity(to);
|
||||
|
||||
LINT_INIT(round_digit);
|
||||
switch (mode) {
|
||||
case HALF_UP:
|
||||
case HALF_EVEN: round_digit=5; break;
|
||||
@ -2117,13 +2114,11 @@ static int do_div_mod(decimal_t *from1, decimal_t *from2,
|
||||
{
|
||||
int frac1=ROUND_UP(from1->frac)*DIG_PER_DEC1, prec1=from1->intg+frac1,
|
||||
frac2=ROUND_UP(from2->frac)*DIG_PER_DEC1, prec2=from2->intg+frac2,
|
||||
error, i, intg0, frac0, len1, len2, dintg, div_mod=(!mod);
|
||||
UNINIT_VAR(error), i, intg0, frac0, len1, len2, dintg, div_mod=(!mod);
|
||||
dec1 *buf0, *buf1=from1->buf, *buf2=from2->buf, *tmp1,
|
||||
*start2, *stop2, *stop1, *stop0, norm2, carry, *start1, dcarry;
|
||||
dec2 norm_factor, x, guess, y;
|
||||
|
||||
LINT_INIT(error);
|
||||
|
||||
if (mod)
|
||||
to=mod;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user