mirror of
https://github.com/MariaDB/server.git
synced 2025-01-30 02:30:06 +01:00
Merge bk-internal.mysql.com:/home/bk/mysql-5.0
into mysql.com:/home/my/mysql-5.0
This commit is contained in:
commit
571fae94da
10 changed files with 162 additions and 8 deletions
|
@ -1657,6 +1657,44 @@ a
|
||||||
b
|
b
|
||||||
c
|
c
|
||||||
d
|
d
|
||||||
|
select distinct a1,a1 from t1;
|
||||||
|
a1 a1
|
||||||
|
a a
|
||||||
|
b b
|
||||||
|
c c
|
||||||
|
d d
|
||||||
|
select distinct a2,a1,a2,a1 from t1;
|
||||||
|
a2 a1 a2 a1
|
||||||
|
a a a a
|
||||||
|
b a b a
|
||||||
|
a b a b
|
||||||
|
b b b b
|
||||||
|
a c a c
|
||||||
|
b c b c
|
||||||
|
a d a d
|
||||||
|
b d b d
|
||||||
|
select distinct t1.a1,t2.a1 from t1,t2;
|
||||||
|
a1 a1
|
||||||
|
a a
|
||||||
|
b a
|
||||||
|
c a
|
||||||
|
d a
|
||||||
|
a b
|
||||||
|
b b
|
||||||
|
c b
|
||||||
|
d b
|
||||||
|
a c
|
||||||
|
b c
|
||||||
|
c c
|
||||||
|
d c
|
||||||
|
a d
|
||||||
|
b d
|
||||||
|
c d
|
||||||
|
d d
|
||||||
|
a e
|
||||||
|
b e
|
||||||
|
c e
|
||||||
|
d e
|
||||||
explain select distinct a1,a2,b from t1;
|
explain select distinct a1,a2,b from t1;
|
||||||
id select_type table type possible_keys key key_len ref rows Extra
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 SIMPLE t1 range NULL idx_t1_1 147 NULL 17 Using index for group-by
|
1 SIMPLE t1 range NULL idx_t1_1 147 NULL 17 Using index for group-by
|
||||||
|
|
|
@ -466,4 +466,32 @@ ERROR 70100: Query execution was interrupted
|
||||||
call bug6807()|
|
call bug6807()|
|
||||||
ERROR 70100: Query execution was interrupted
|
ERROR 70100: Query execution was interrupted
|
||||||
drop procedure bug6807|
|
drop procedure bug6807|
|
||||||
|
drop procedure if exists bug8776_1|
|
||||||
|
drop procedure if exists bug8776_2|
|
||||||
|
drop procedure if exists bug8776_3|
|
||||||
|
drop procedure if exists bug8776_4|
|
||||||
|
create procedure bug8776_1()
|
||||||
|
begin
|
||||||
|
declare continue handler for sqlstate '42S0200test' begin end;
|
||||||
|
begin end;
|
||||||
|
end|
|
||||||
|
ERROR 42000: Bad SQLSTATE: '42S0200test'
|
||||||
|
create procedure bug8776_2()
|
||||||
|
begin
|
||||||
|
declare continue handler for sqlstate '4200' begin end;
|
||||||
|
begin end;
|
||||||
|
end|
|
||||||
|
ERROR 42000: Bad SQLSTATE: '4200'
|
||||||
|
create procedure bug8776_3()
|
||||||
|
begin
|
||||||
|
declare continue handler for sqlstate '420000' begin end;
|
||||||
|
begin end;
|
||||||
|
end|
|
||||||
|
ERROR 42000: Bad SQLSTATE: '420000'
|
||||||
|
create procedure bug8776_4()
|
||||||
|
begin
|
||||||
|
declare continue handler for sqlstate '42x00' begin end;
|
||||||
|
begin end;
|
||||||
|
end|
|
||||||
|
ERROR 42000: Bad SQLSTATE: '42x00'
|
||||||
drop table t1|
|
drop table t1|
|
||||||
|
|
|
@ -475,11 +475,15 @@ select distinct a1,a2,b,c from t2 where (a2 >= 'b') and (b = 'a') and (c = 'i121
|
||||||
select distinct a1,a2,b from t2 where (a1 > 'a') and (a2 > 'a') and (b = 'c');
|
select distinct a1,a2,b from t2 where (a1 > 'a') and (a2 > 'a') and (b = 'c');
|
||||||
select distinct b from t2 where (a2 >= 'b') and (b = 'a');
|
select distinct b from t2 where (a2 >= 'b') and (b = 'a');
|
||||||
|
|
||||||
-- BUG 6303
|
-- BUG #6303
|
||||||
select distinct t_00.a1
|
select distinct t_00.a1
|
||||||
from t1 t_00
|
from t1 t_00
|
||||||
where exists ( select * from t2 where a1 = t_00.a1 );
|
where exists ( select * from t2 where a1 = t_00.a1 );
|
||||||
|
|
||||||
|
-- BUG #8532 - SELECT DISTINCT a, a causes server to crash
|
||||||
|
select distinct a1,a1 from t1;
|
||||||
|
select distinct a2,a1,a2,a1 from t1;
|
||||||
|
select distinct t1.a1,t2.a1 from t1,t2;
|
||||||
|
|
||||||
--
|
--
|
||||||
-- DISTINCT queries with GROUP-BY
|
-- DISTINCT queries with GROUP-BY
|
||||||
|
|
|
@ -641,6 +641,44 @@ call bug6807()|
|
||||||
|
|
||||||
drop procedure bug6807|
|
drop procedure bug6807|
|
||||||
|
|
||||||
|
#
|
||||||
|
# BUG#876: Stored Procedures: Invalid SQLSTATE is allowed in
|
||||||
|
# a DECLARE ? HANDLER FOR stmt.
|
||||||
|
#
|
||||||
|
--disable_warnings
|
||||||
|
drop procedure if exists bug8776_1|
|
||||||
|
drop procedure if exists bug8776_2|
|
||||||
|
drop procedure if exists bug8776_3|
|
||||||
|
drop procedure if exists bug8776_4|
|
||||||
|
--enable_warnings
|
||||||
|
--error ER_SP_BAD_SQLSTATE
|
||||||
|
create procedure bug8776_1()
|
||||||
|
begin
|
||||||
|
declare continue handler for sqlstate '42S0200test' begin end;
|
||||||
|
begin end;
|
||||||
|
end|
|
||||||
|
|
||||||
|
--error ER_SP_BAD_SQLSTATE
|
||||||
|
create procedure bug8776_2()
|
||||||
|
begin
|
||||||
|
declare continue handler for sqlstate '4200' begin end;
|
||||||
|
begin end;
|
||||||
|
end|
|
||||||
|
|
||||||
|
--error ER_SP_BAD_SQLSTATE
|
||||||
|
create procedure bug8776_3()
|
||||||
|
begin
|
||||||
|
declare continue handler for sqlstate '420000' begin end;
|
||||||
|
begin end;
|
||||||
|
end|
|
||||||
|
|
||||||
|
--error ER_SP_BAD_SQLSTATE
|
||||||
|
create procedure bug8776_4()
|
||||||
|
begin
|
||||||
|
declare continue handler for sqlstate '42x00' begin end;
|
||||||
|
begin end;
|
||||||
|
end|
|
||||||
|
|
||||||
|
|
||||||
drop table t1|
|
drop table t1|
|
||||||
|
|
||||||
|
|
|
@ -6878,6 +6878,7 @@ get_best_group_min_max(PARAM *param, SEL_TREE *tree)
|
||||||
SEL_ARG *cur_index_tree= NULL;
|
SEL_ARG *cur_index_tree= NULL;
|
||||||
ha_rows cur_quick_prefix_records= 0;
|
ha_rows cur_quick_prefix_records= 0;
|
||||||
uint cur_param_idx;
|
uint cur_param_idx;
|
||||||
|
key_map cur_used_key_parts;
|
||||||
|
|
||||||
for (uint cur_index= 0 ; cur_index_info != cur_index_info_end ;
|
for (uint cur_index= 0 ; cur_index_info != cur_index_info_end ;
|
||||||
cur_index_info++, cur_index++)
|
cur_index_info++, cur_index++)
|
||||||
|
@ -6925,17 +6926,25 @@ get_best_group_min_max(PARAM *param, SEL_TREE *tree)
|
||||||
else if (join->select_distinct)
|
else if (join->select_distinct)
|
||||||
{
|
{
|
||||||
select_items_it.rewind();
|
select_items_it.rewind();
|
||||||
|
cur_used_key_parts.clear_all();
|
||||||
while ((item= select_items_it++))
|
while ((item= select_items_it++))
|
||||||
{
|
{
|
||||||
item_field= (Item_field*) item; /* (SA5) already checked above. */
|
item_field= (Item_field*) item; /* (SA5) already checked above. */
|
||||||
/* Find the order of the key part in the index. */
|
/* Find the order of the key part in the index. */
|
||||||
key_part_nr= get_field_keypart(cur_index_info, item_field->field);
|
key_part_nr= get_field_keypart(cur_index_info, item_field->field);
|
||||||
|
/*
|
||||||
|
Check if this attribute was already present in the select list.
|
||||||
|
If it was present, then its corresponding key part was alredy used.
|
||||||
|
*/
|
||||||
|
if (cur_used_key_parts.is_set(key_part_nr))
|
||||||
|
continue;
|
||||||
if (key_part_nr < 1 || key_part_nr > join->fields_list.elements)
|
if (key_part_nr < 1 || key_part_nr > join->fields_list.elements)
|
||||||
goto next_index;
|
goto next_index;
|
||||||
cur_part= cur_index_info->key_part + key_part_nr - 1;
|
cur_part= cur_index_info->key_part + key_part_nr - 1;
|
||||||
cur_group_prefix_len+= cur_part->store_length;
|
cur_group_prefix_len+= cur_part->store_length;
|
||||||
|
cur_used_key_parts.set_bit(key_part_nr);
|
||||||
|
++cur_group_key_parts;
|
||||||
}
|
}
|
||||||
cur_group_key_parts= join->fields_list.elements;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
DBUG_ASSERT(FALSE);
|
DBUG_ASSERT(FALSE);
|
||||||
|
|
|
@ -5326,3 +5326,5 @@ ER_PROC_AUTO_REVOKE_FAIL
|
||||||
eng "Failed to revoke all privileges to dropped routine"
|
eng "Failed to revoke all privileges to dropped routine"
|
||||||
ER_DATA_TOO_LONG 22001
|
ER_DATA_TOO_LONG 22001
|
||||||
eng "Data too long for column '%s' at row %ld"
|
eng "Data too long for column '%s' at row %ld"
|
||||||
|
ER_SP_BAD_SQLSTATE 42000
|
||||||
|
eng "Bad SQLSTATE: '%s'"
|
||||||
|
|
|
@ -26,6 +26,30 @@
|
||||||
#include "sp_pcontext.h"
|
#include "sp_pcontext.h"
|
||||||
#include "sp_head.h"
|
#include "sp_head.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Sanity check for SQLSTATEs. Will not check if it's really an existing
|
||||||
|
* state (there are just too many), but will check length and bad characters.
|
||||||
|
* Returns TRUE if it's ok, FALSE if it's bad.
|
||||||
|
*/
|
||||||
|
bool
|
||||||
|
sp_cond_check(LEX_STRING *sqlstate)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
const char *p;
|
||||||
|
|
||||||
|
if (sqlstate->length != 5)
|
||||||
|
return FALSE;
|
||||||
|
for (p= sqlstate->str, i= 0 ; i < 5 ; i++)
|
||||||
|
{
|
||||||
|
char c = p[i];
|
||||||
|
|
||||||
|
if ((c < '0' || '9' < c) &&
|
||||||
|
(c < 'A' || 'Z' < c))
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
sp_pcontext::sp_pcontext(sp_pcontext *prev)
|
sp_pcontext::sp_pcontext(sp_pcontext *prev)
|
||||||
: Sql_alloc(), m_psubsize(0), m_csubsize(0), m_hsubsize(0),
|
: Sql_alloc(), m_psubsize(0), m_csubsize(0), m_hsubsize(0),
|
||||||
m_handlers(0), m_parent(prev)
|
m_handlers(0), m_parent(prev)
|
||||||
|
|
|
@ -60,6 +60,12 @@ typedef struct sp_cond_type
|
||||||
uint mysqlerr;
|
uint mysqlerr;
|
||||||
} sp_cond_type_t;
|
} sp_cond_type_t;
|
||||||
|
|
||||||
|
/* Sanity check for SQLSTATEs. Will not check if it's really an existing
|
||||||
|
* state (there are just too many), but will check length bad characters.
|
||||||
|
*/
|
||||||
|
extern bool
|
||||||
|
sp_cond_check(LEX_STRING *sqlstate);
|
||||||
|
|
||||||
typedef struct sp_cond
|
typedef struct sp_cond
|
||||||
{
|
{
|
||||||
LEX_STRING name;
|
LEX_STRING name;
|
||||||
|
|
|
@ -1274,6 +1274,7 @@ bool mysql_show_binlog_events(THD* thd)
|
||||||
DBUG_ENTER("show_binlog_events");
|
DBUG_ENTER("show_binlog_events");
|
||||||
List<Item> field_list;
|
List<Item> field_list;
|
||||||
const char *errmsg = 0;
|
const char *errmsg = 0;
|
||||||
|
bool ret = TRUE;
|
||||||
IO_CACHE log;
|
IO_CACHE log;
|
||||||
File file = -1;
|
File file = -1;
|
||||||
Format_description_log_event *description_event= new
|
Format_description_log_event *description_event= new
|
||||||
|
@ -1376,6 +1377,8 @@ bool mysql_show_binlog_events(THD* thd)
|
||||||
pthread_mutex_unlock(log_lock);
|
pthread_mutex_unlock(log_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ret= FALSE;
|
||||||
|
|
||||||
err:
|
err:
|
||||||
delete description_event;
|
delete description_event;
|
||||||
if (file >= 0)
|
if (file >= 0)
|
||||||
|
@ -1395,7 +1398,7 @@ err:
|
||||||
pthread_mutex_lock(&LOCK_thread_count);
|
pthread_mutex_lock(&LOCK_thread_count);
|
||||||
thd->current_linfo = 0;
|
thd->current_linfo = 0;
|
||||||
pthread_mutex_unlock(&LOCK_thread_count);
|
pthread_mutex_unlock(&LOCK_thread_count);
|
||||||
DBUG_RETURN(TRUE);
|
DBUG_RETURN(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1760,13 +1760,15 @@ sp_cond:
|
||||||
}
|
}
|
||||||
| SQLSTATE_SYM opt_value TEXT_STRING_literal
|
| SQLSTATE_SYM opt_value TEXT_STRING_literal
|
||||||
{ /* SQLSTATE */
|
{ /* SQLSTATE */
|
||||||
uint len= ($3.length < sizeof($$->sqlstate)-1 ?
|
if (!sp_cond_check(&$3))
|
||||||
$3.length : sizeof($$->sqlstate)-1);
|
{
|
||||||
|
my_error(ER_SP_BAD_SQLSTATE, MYF(0), $3.str);
|
||||||
|
YYABORT;
|
||||||
|
}
|
||||||
$$= (sp_cond_type_t *)YYTHD->alloc(sizeof(sp_cond_type_t));
|
$$= (sp_cond_type_t *)YYTHD->alloc(sizeof(sp_cond_type_t));
|
||||||
$$->type= sp_cond_type_t::state;
|
$$->type= sp_cond_type_t::state;
|
||||||
memcpy($$->sqlstate, $3.str, len);
|
memcpy($$->sqlstate, $3.str, 5);
|
||||||
$$->sqlstate[len]= '\0';
|
$$->sqlstate[5]= '\0';
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue