Commit 0f342b6a authored by unknown's avatar unknown

Merge maint2.mysql.com:/data/localhome/tsmith/bk/g41

into  maint2.mysql.com:/data/localhome/tsmith/bk/41

parents f468d000 ddb9f866
...@@ -26,6 +26,9 @@ ...@@ -26,6 +26,9 @@
#define USERNAME_LENGTH 16 #define USERNAME_LENGTH 16
#define SERVER_VERSION_LENGTH 60 #define SERVER_VERSION_LENGTH 60
#define SQLSTATE_LENGTH 5 #define SQLSTATE_LENGTH 5
#define SYSTEM_CHARSET_MBMAXLEN 3
#define NAME_BYTE_LEN NAME_LEN*SYSTEM_CHARSET_MBMAXLEN
#define USERNAME_BYTE_LENGTH USERNAME_LENGTH*SYSTEM_CHARSET_MBMAXLEN
#define LOCAL_HOST "localhost" #define LOCAL_HOST "localhost"
#define LOCAL_HOST_NAMEDPIPE "." #define LOCAL_HOST_NAMEDPIPE "."
......
...@@ -1340,3 +1340,15 @@ select a from t1 group by a; ...@@ -1340,3 +1340,15 @@ select a from t1 group by a;
a a
e e
drop table t1; drop table t1;
set names utf8;
grant select on test.* to юзер_юзер@localhost;
user()
юзер_юзер@localhost
revoke all on test.* from юзер_юзер@localhost;
drop user юзер_юзер@localhost;
create database имя_базы_в_кодировке_утф8_длиной_больше_чем_45;
use имя_базы_в_кодировке_утф8_длиной_больше_чем_45;
select database();
database()
имя_базы_в_кодировке_утф8_длиной_больше_чем_45
drop database имя_базы_в_кодировке_утф8_длиной_больше_чем_45;
...@@ -83,3 +83,24 @@ b a ...@@ -83,3 +83,24 @@ b a
3 3 3 3
3 3 3 3
DROP TABLE t1, t2, t3; DROP TABLE t1, t2, t3;
CREATE TABLE `t1` (`id1` INT) ;
INSERT INTO `t1` (`id1`) VALUES (1),(5),(2);
CREATE TABLE `t2` (
`id1` INT,
`id2` INT NOT NULL,
`id3` INT,
`id4` INT NOT NULL,
UNIQUE (`id2`,`id4`),
KEY (`id1`)
) ENGINE=InnoDB;
INSERT INTO `t2`(`id1`,`id2`,`id3`,`id4`) VALUES
(1,1,1,0),
(1,1,2,1),
(5,1,2,2),
(6,1,2,3),
(1,2,2,2),
(1,2,1,1);
SELECT `id1` FROM `t1` WHERE `id1` NOT IN (SELECT `id1` FROM `t2` WHERE `id2` = 1 AND `id3` = 2);
id1
2
DROP TABLE t1, t2;
...@@ -2895,3 +2895,25 @@ select * from t1 where NOT(s1 = ALL (select s1/s1 from t1)); ...@@ -2895,3 +2895,25 @@ select * from t1 where NOT(s1 = ALL (select s1/s1 from t1));
s1 s1
2 2
drop table t1; drop table t1;
create table t1 (
retailerID varchar(8) NOT NULL,
statusID int(10) unsigned NOT NULL,
changed datetime NOT NULL,
UNIQUE KEY retailerID (retailerID, statusID, changed)
);
INSERT INTO t1 VALUES("0026", "1", "2005-12-06 12:18:56");
INSERT INTO t1 VALUES("0026", "2", "2006-01-06 12:25:53");
INSERT INTO t1 VALUES("0037", "1", "2005-12-06 12:18:56");
INSERT INTO t1 VALUES("0037", "2", "2006-01-06 12:25:53");
INSERT INTO t1 VALUES("0048", "1", "2006-01-06 12:37:50");
INSERT INTO t1 VALUES("0059", "1", "2006-01-06 12:37:50");
select * from t1 r1
where (r1.retailerID,(r1.changed)) in
(SELECT r2.retailerId,(max(changed)) from t1 r2
group by r2.retailerId);
retailerID statusID changed
0026 2 2006-01-06 12:25:53
0037 2 2006-01-06 12:25:53
0048 1 2006-01-06 12:37:50
0059 1 2006-01-06 12:37:50
drop table t1;
...@@ -1072,4 +1072,20 @@ explain select a from t1 group by a; ...@@ -1072,4 +1072,20 @@ explain select a from t1 group by a;
select a from t1 group by a; select a from t1 group by a;
drop table t1; drop table t1;
#
# Bug#20393: User name truncation in mysql client
# Bug#21432: Database/Table name limited to 64 bytes, not chars, problems with multi-byte
#
set names utf8;
#create user юзер_юзер@localhost;
grant select on test.* to юзер_юзер@localhost;
--exec $MYSQL --default-character-set=utf8 --user=юзер_юзер -e "select user()"
revoke all on test.* from юзер_юзер@localhost;
drop user юзер_юзер@localhost;
create database имя_базы_в_кодировке_утф8_длиной_больше_чем_45;
use имя_базы_в_кодировке_утф8_длиной_больше_чем_45;
select database();
drop database имя_базы_в_кодировке_утф8_длиной_больше_чем_45;
# End of 4.1 tests # End of 4.1 tests
...@@ -90,3 +90,30 @@ SELECT STRAIGHT_JOIN SQL_NO_CACHE t1.b, t1.a FROM t1, t3, t2 WHERE ...@@ -90,3 +90,30 @@ SELECT STRAIGHT_JOIN SQL_NO_CACHE t1.b, t1.a FROM t1, t3, t2 WHERE
t3.a = t2.a AND t2.b = t1.a AND t3.b = 1 AND t3.c IN (1, 2) t3.a = t2.a AND t2.b = t1.a AND t3.b = 1 AND t3.c IN (1, 2)
ORDER BY t1.b LIMIT 5; ORDER BY t1.b LIMIT 5;
DROP TABLE t1, t2, t3; DROP TABLE t1, t2, t3;
# BUG#21077 (The testcase is not deterministic so correct execution doesn't
# prove anything) For proof one should track if sequence of ha_innodb::* func
# calls is correct.
CREATE TABLE `t1` (`id1` INT) ;
INSERT INTO `t1` (`id1`) VALUES (1),(5),(2);
CREATE TABLE `t2` (
`id1` INT,
`id2` INT NOT NULL,
`id3` INT,
`id4` INT NOT NULL,
UNIQUE (`id2`,`id4`),
KEY (`id1`)
) ENGINE=InnoDB;
INSERT INTO `t2`(`id1`,`id2`,`id3`,`id4`) VALUES
(1,1,1,0),
(1,1,2,1),
(5,1,2,2),
(6,1,2,3),
(1,2,2,2),
(1,2,1,1);
SELECT `id1` FROM `t1` WHERE `id1` NOT IN (SELECT `id1` FROM `t2` WHERE `id2` = 1 AND `id3` = 2);
DROP TABLE t1, t2;
...@@ -1861,4 +1861,28 @@ select * from t1 where NOT(s1+1 = ANY (select s1 from t1)); ...@@ -1861,4 +1861,28 @@ select * from t1 where NOT(s1+1 = ANY (select s1 from t1));
select * from t1 where (s1 = ALL (select s1/s1 from t1)); select * from t1 where (s1 = ALL (select s1/s1 from t1));
select * from t1 where NOT(s1 = ALL (select s1/s1 from t1)); select * from t1 where NOT(s1 = ALL (select s1/s1 from t1));
drop table t1; drop table t1;
#
# Bug #16255: Subquery in where
#
create table t1 (
retailerID varchar(8) NOT NULL,
statusID int(10) unsigned NOT NULL,
changed datetime NOT NULL,
UNIQUE KEY retailerID (retailerID, statusID, changed)
);
INSERT INTO t1 VALUES("0026", "1", "2005-12-06 12:18:56");
INSERT INTO t1 VALUES("0026", "2", "2006-01-06 12:25:53");
INSERT INTO t1 VALUES("0037", "1", "2005-12-06 12:18:56");
INSERT INTO t1 VALUES("0037", "2", "2006-01-06 12:25:53");
INSERT INTO t1 VALUES("0048", "1", "2006-01-06 12:37:50");
INSERT INTO t1 VALUES("0059", "1", "2006-01-06 12:37:50");
select * from t1 r1
where (r1.retailerID,(r1.changed)) in
(SELECT r2.retailerId,(max(changed)) from t1 r2
group by r2.retailerId);
drop table t1;
# End of 4.1 tests # End of 4.1 tests
...@@ -1618,7 +1618,7 @@ CLI_MYSQL_REAL_CONNECT(MYSQL *mysql,const char *host, const char *user, ...@@ -1618,7 +1618,7 @@ CLI_MYSQL_REAL_CONNECT(MYSQL *mysql,const char *host, const char *user,
const char *passwd, const char *db, const char *passwd, const char *db,
uint port, const char *unix_socket,ulong client_flag) uint port, const char *unix_socket,ulong client_flag)
{ {
char buff[NAME_LEN+USERNAME_LENGTH+100]; char buff[NAME_BYTE_LEN+USERNAME_BYTE_LENGTH+100];
char *end,*host_info; char *end,*host_info;
my_socket sock; my_socket sock;
in_addr_t ip_addr; in_addr_t ip_addr;
...@@ -2063,7 +2063,7 @@ CLI_MYSQL_REAL_CONNECT(MYSQL *mysql,const char *host, const char *user, ...@@ -2063,7 +2063,7 @@ CLI_MYSQL_REAL_CONNECT(MYSQL *mysql,const char *host, const char *user,
mysql->server_status, client_flag)); mysql->server_status, client_flag));
/* This needs to be changed as it's not useful with big packets */ /* This needs to be changed as it's not useful with big packets */
if (user && user[0]) if (user && user[0])
strmake(end,user,USERNAME_LENGTH); /* Max user name */ strmake(end,user,USERNAME_BYTE_LENGTH); /* Max user name */
else else
read_user_name((char*) end); read_user_name((char*) end);
...@@ -2093,7 +2093,7 @@ CLI_MYSQL_REAL_CONNECT(MYSQL *mysql,const char *host, const char *user, ...@@ -2093,7 +2093,7 @@ CLI_MYSQL_REAL_CONNECT(MYSQL *mysql,const char *host, const char *user,
/* Add database if needed */ /* Add database if needed */
if (db && (mysql->server_capabilities & CLIENT_CONNECT_WITH_DB)) if (db && (mysql->server_capabilities & CLIENT_CONNECT_WITH_DB))
{ {
end= strmake(end, db, NAME_LEN) + 1; end= strmake(end, db, NAME_BYTE_LEN) + 1;
mysql->db= my_strdup(db,MYF(MY_WME)); mysql->db= my_strdup(db,MYF(MY_WME));
db= 0; db= 0;
} }
......
...@@ -976,18 +976,18 @@ Item_in_subselect::row_value_transformer(JOIN *join) ...@@ -976,18 +976,18 @@ Item_in_subselect::row_value_transformer(JOIN *join)
DBUG_RETURN(RES_ERROR); DBUG_RETURN(RES_ERROR);
Item *item_eq= Item *item_eq=
new Item_func_eq(new new Item_func_eq(new
Item_direct_ref((*optimizer->get_cache())-> Item_ref((*optimizer->get_cache())->
addr(i), addr(i),
(char *)"<no matter>", (char *)"<no matter>",
(char *)in_left_expr_name), (char *)in_left_expr_name),
new new
Item_direct_ref(select_lex->ref_pointer_array + i, Item_ref(select_lex->ref_pointer_array + i,
(char *)"<no matter>", (char *)"<no matter>",
(char *)"<list ref>") (char *)"<list ref>")
); );
Item *item_isnull= Item *item_isnull=
new Item_func_isnull(new new Item_func_isnull(new
Item_direct_ref( select_lex-> Item_ref( select_lex->
ref_pointer_array+i, ref_pointer_array+i,
(char *)"<no matter>", (char *)"<no matter>",
(char *)"<list ref>") (char *)"<list ref>")
...@@ -1000,7 +1000,7 @@ Item_in_subselect::row_value_transformer(JOIN *join) ...@@ -1000,7 +1000,7 @@ Item_in_subselect::row_value_transformer(JOIN *join)
new new
Item_is_not_null_test(this, Item_is_not_null_test(this,
new new
Item_direct_ref(select_lex-> Item_ref(select_lex->
ref_pointer_array + i, ref_pointer_array + i,
(char *)"<no matter>", (char *)"<no matter>",
(char *)"<list ref>") (char *)"<list ref>")
...@@ -1057,7 +1057,7 @@ Item_in_subselect::row_value_transformer(JOIN *join) ...@@ -1057,7 +1057,7 @@ Item_in_subselect::row_value_transformer(JOIN *join)
new new
Item_is_not_null_test(this, Item_is_not_null_test(this,
new new
Item_direct_ref(select_lex-> Item_ref(select_lex->
ref_pointer_array + i, ref_pointer_array + i,
(char *)"<no matter>", (char *)"<no matter>",
(char *)"<list ref>") (char *)"<list ref>")
......
...@@ -86,7 +86,7 @@ public: ...@@ -86,7 +86,7 @@ public:
QUICK_SELECT(THD *thd, TABLE *table,uint index_arg,bool no_alloc=0); QUICK_SELECT(THD *thd, TABLE *table,uint index_arg,bool no_alloc=0);
virtual ~QUICK_SELECT(); virtual ~QUICK_SELECT();
void reset(void) { next=0; it.rewind(); } void reset(void) { next=0; it.rewind(); range= NULL;}
int init() int init()
{ {
key_part_info= head->key_info[index].key_part; key_part_info= head->key_info[index].key_part;
......
...@@ -2640,7 +2640,11 @@ int mysql_grant(THD *thd, const char *db, List <LEX_USER> &list, ...@@ -2640,7 +2640,11 @@ int mysql_grant(THD *thd, const char *db, List <LEX_USER> &list,
while ((Str = str_list++)) while ((Str = str_list++))
{ {
if (Str->host.length > HOSTNAME_LENGTH || if (Str->host.length > HOSTNAME_LENGTH ||
Str->user.length > USERNAME_LENGTH) system_charset_info->cset->charpos(system_charset_info,
Str->user.str,
Str->user.str +
Str->user.length,
USERNAME_LENGTH) < Str->user.length)
{ {
my_error(ER_GRANT_WRONG_HOST_OR_USER,MYF(0)); my_error(ER_GRANT_WRONG_HOST_OR_USER,MYF(0));
result= -1; result= -1;
......
...@@ -902,8 +902,8 @@ static int check_connection(THD *thd) ...@@ -902,8 +902,8 @@ static int check_connection(THD *thd)
char *user= end; char *user= end;
char *passwd= strend(user)+1; char *passwd= strend(user)+1;
char *db= passwd; char *db= passwd;
char db_buff[NAME_LEN+1]; // buffer to store db in utf8 char db_buff[NAME_BYTE_LEN + 1]; // buffer to store db in utf8
char user_buff[USERNAME_LENGTH+1]; // buffer to store user in utf8 char user_buff[USERNAME_BYTE_LENGTH + 1]; // buffer to store user in utf8
uint dummy_errors; uint dummy_errors;
/* /*
......
...@@ -1413,7 +1413,7 @@ char *get_field(MEM_ROOT *mem, Field *field) ...@@ -1413,7 +1413,7 @@ char *get_field(MEM_ROOT *mem, Field *field)
bool check_db_name(char *name) bool check_db_name(char *name)
{ {
char *start=name; uint name_length= 0; // name length in symbols
/* Used to catch empty names and names with end space */ /* Used to catch empty names and names with end space */
bool last_char_is_space= TRUE; bool last_char_is_space= TRUE;
...@@ -1430,6 +1430,7 @@ bool check_db_name(char *name) ...@@ -1430,6 +1430,7 @@ bool check_db_name(char *name)
name+system_charset_info->mbmaxlen); name+system_charset_info->mbmaxlen);
if (len) if (len)
{ {
name_length++;
name += len; name += len;
continue; continue;
} }
...@@ -1437,12 +1438,13 @@ bool check_db_name(char *name) ...@@ -1437,12 +1438,13 @@ bool check_db_name(char *name)
#else #else
last_char_is_space= *name==' '; last_char_is_space= *name==' ';
#endif #endif
name_length++;
if (*name == '/' || *name == '\\' || *name == FN_LIBCHAR || if (*name == '/' || *name == '\\' || *name == FN_LIBCHAR ||
*name == FN_EXTCHAR) *name == FN_EXTCHAR)
return 1; return 1;
name++; name++;
} }
return last_char_is_space || (uint) (name - start) > NAME_LEN; return (last_char_is_space || name_length > NAME_LEN);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment