Commit 504ab8d4 authored by unknown's avatar unknown

merge


sql/sql_parse.cc:
  Auto merged
parents dddabc7e 5ac4670b
...@@ -138,8 +138,8 @@ int vio_close_shared_memory(Vio * vio); ...@@ -138,8 +138,8 @@ int vio_close_shared_memory(Vio * vio);
#if defined(HAVE_VIO) && !defined(DONT_MAP_VIO) #if defined(HAVE_VIO) && !defined(DONT_MAP_VIO)
#define vio_delete(vio) (vio)->viodelete(vio) #define vio_delete(vio) (vio)->viodelete(vio)
#define vio_errno(vio) (vio)->vioerrno(vio) #define vio_errno(vio) (vio)->vioerrno(vio)
#define vio_read(vio, buf, size) (vio)->read(vio,buf,size) #define vio_read(vio, buf, size) ((vio)->read)(vio,buf,size)
#define vio_write(vio, buf, size) (vio)->write(vio, buf, size) #define vio_write(vio, buf, size) ((vio)->write)(vio, buf, size)
#define vio_blocking(vio, set_blocking_mode, old_mode)\ #define vio_blocking(vio, set_blocking_mode, old_mode)\
(vio)->vioblocking(vio, set_blocking_mode, old_mode) (vio)->vioblocking(vio, set_blocking_mode, old_mode)
#define vio_is_blocking(vio) (vio)->is_blocking(vio) #define vio_is_blocking(vio) (vio)->is_blocking(vio)
......
drop table if exists t1; drop table if exists t1;
SET NAMES cp1251; SET NAMES cp1251;
create table t1 (a varchar(10) not null); create table t1 (a varchar(10) not null) character set cp1251;
insert into t1 values ("a"),("ab"),("abc"); insert into t1 values ("a"),("ab"),("abc");
select * from t1; select * from t1;
a a
...@@ -23,7 +23,7 @@ a ...@@ -23,7 +23,7 @@ a
b b
c c
drop table t1; drop table t1;
create table t1 (a char(15) binary, b binary(15)); create table t1 (a char(15) binary, b binary(15)) character set cp1251;
insert into t1 values ('aaa','bbb'),('AAA','BBB'); insert into t1 values ('aaa','bbb'),('AAA','BBB');
select upper(a),upper(b) from t1; select upper(a),upper(b) from t1;
upper(a) upper(b) upper(a) upper(b)
......
...@@ -677,3 +677,28 @@ select sum(a)*sum(b) as d from t1 where a=1 group by c having d > 0; ...@@ -677,3 +677,28 @@ select sum(a)*sum(b) as d from t1 where a=1 group by c having d > 0;
d d
10 10
drop table t1; drop table t1;
create table t1(a int);
insert into t1 values (0),(1),(2),(3),(4),(5),(6),(8),(9);
create table t2 (
a int,
b varchar(200) NOT NULL,
c varchar(50) NOT NULL,
d varchar(100) NOT NULL,
primary key (a,b(132),c,d),
key a (a,b)
) charset=utf8;
insert into t2 select
x3.a, -- 3
concat('val-', x3.a + 3*x4.a), -- 12
concat('val-', @a:=x3.a + 3*x4.a + 12*C.a), -- 120
concat('val-', @a + 120*D.a)
from t1 x3, t1 x4, t1 C, t1 D where x3.a < 3 and x4.a < 4 and D.a < 4;
delete from t2 where a = 2 and b = 'val-2' limit 30;
explain select c from t2 where a = 2 and b = 'val-2' group by c;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t2 ref PRIMARY,a PRIMARY 400 const,const 6 Using where
select c from t2 where a = 2 and b = 'val-2' group by c;
c
val-74
val-98
drop table t1,t2;
--default-character-set=cp1251 --new
...@@ -10,7 +10,7 @@ SET NAMES cp1251; ...@@ -10,7 +10,7 @@ SET NAMES cp1251;
# Test problem with LEFT() (Bug #514) # Test problem with LEFT() (Bug #514)
# #
create table t1 (a varchar(10) not null); create table t1 (a varchar(10) not null) character set cp1251;
insert into t1 values ("a"),("ab"),("abc"); insert into t1 values ("a"),("ab"),("abc");
select * from t1; select * from t1;
select a, left(a,1) as b from t1; select a, left(a,1) as b from t1;
...@@ -21,7 +21,7 @@ drop table t1; ...@@ -21,7 +21,7 @@ drop table t1;
# #
# Test of binary and upper/lower # Test of binary and upper/lower
# #
create table t1 (a char(15) binary, b binary(15)); create table t1 (a char(15) binary, b binary(15)) character set cp1251;
insert into t1 values ('aaa','bbb'),('AAA','BBB'); insert into t1 values ('aaa','bbb'),('AAA','BBB');
select upper(a),upper(b) from t1; select upper(a),upper(b) from t1;
select lower(a),lower(b) from t1; select lower(a),lower(b) from t1;
......
...@@ -489,3 +489,28 @@ select a,sum(b) from t1 where a=1 group by c having a=1; ...@@ -489,3 +489,28 @@ select a,sum(b) from t1 where a=1 group by c having a=1;
select a as d,sum(b) from t1 where a=1 group by c having d=1; select a as d,sum(b) from t1 where a=1 group by c having d=1;
select sum(a)*sum(b) as d from t1 where a=1 group by c having d > 0; select sum(a)*sum(b) as d from t1 where a=1 group by c having d > 0;
drop table t1; drop table t1;
# Test for BUG#9213 GROUP BY query on utf-8 key returns wrong results
create table t1(a int);
insert into t1 values (0),(1),(2),(3),(4),(5),(6),(8),(9);
create table t2 (
a int,
b varchar(200) NOT NULL,
c varchar(50) NOT NULL,
d varchar(100) NOT NULL,
primary key (a,b(132),c,d),
key a (a,b)
) charset=utf8;
insert into t2 select
x3.a, -- 3
concat('val-', x3.a + 3*x4.a), -- 12
concat('val-', @a:=x3.a + 3*x4.a + 12*C.a), -- 120
concat('val-', @a + 120*D.a)
from t1 x3, t1 x4, t1 C, t1 D where x3.a < 3 and x4.a < 4 and D.a < 4;
delete from t2 where a = 2 and b = 'val-2' limit 30;
explain select c from t2 where a = 2 and b = 'val-2' group by c;
select c from t2 where a = 2 and b = 'val-2' group by c;
drop table t1,t2;
...@@ -3731,6 +3731,7 @@ check_access(THD *thd, ulong want_access, const char *db, ulong *save_priv, ...@@ -3731,6 +3731,7 @@ check_access(THD *thd, ulong want_access, const char *db, ulong *save_priv,
db ? db : "", want_access, thd->master_access)); db ? db : "", want_access, thd->master_access));
#ifndef NO_EMBEDDED_ACCESS_CHECKS #ifndef NO_EMBEDDED_ACCESS_CHECKS
ulong db_access; ulong db_access;
bool db_is_pattern= test(want_access & GRANT_ACL);
#endif #endif
ulong dummy; ulong dummy;
if (save_priv) if (save_priv)
...@@ -3757,9 +3758,8 @@ check_access(THD *thd, ulong want_access, const char *db, ulong *save_priv, ...@@ -3757,9 +3758,8 @@ check_access(THD *thd, ulong want_access, const char *db, ulong *save_priv,
*/ */
db_access= thd->db_access; db_access= thd->db_access;
if (!(thd->master_access & SELECT_ACL) && if (!(thd->master_access & SELECT_ACL) &&
(db && (!thd->db || strcmp(db,thd->db)))) (db && (!thd->db || db_is_pattern || strcmp(db,thd->db))))
db_access=acl_get(thd->host, thd->ip, db_access=acl_get(thd->host, thd->ip, thd->priv_user, db, db_is_pattern);
thd->priv_user, db, test(want_access & GRANT_ACL));
*save_priv=thd->master_access | db_access; *save_priv=thd->master_access | db_access;
DBUG_RETURN(FALSE); DBUG_RETURN(FALSE);
} }
...@@ -3777,9 +3777,8 @@ check_access(THD *thd, ulong want_access, const char *db, ulong *save_priv, ...@@ -3777,9 +3777,8 @@ check_access(THD *thd, ulong want_access, const char *db, ulong *save_priv,
if (db == any_db) if (db == any_db)
DBUG_RETURN(FALSE); // Allow select on anything DBUG_RETURN(FALSE); // Allow select on anything
if (db && (!thd->db || strcmp(db,thd->db))) if (db && (!thd->db || db_is_pattern || strcmp(db,thd->db)))
db_access=acl_get(thd->host, thd->ip, db_access=acl_get(thd->host, thd->ip, thd->priv_user, db, db_is_pattern);
thd->priv_user, db, test(want_access & GRANT_ACL));
else else
db_access=thd->db_access; db_access=thd->db_access;
DBUG_PRINT("info",("db_access: %lu", db_access)); DBUG_PRINT("info",("db_access: %lu", db_access));
......
...@@ -4604,14 +4604,14 @@ const_expression_in_where(COND *cond, Item *comp_item, Item **const_item) ...@@ -4604,14 +4604,14 @@ const_expression_in_where(COND *cond, Item *comp_item, Item **const_item)
create_tmp_field_from_field() create_tmp_field_from_field()
thd Thread handler thd Thread handler
org_field field from which new field will be created org_field field from which new field will be created
name New field name
item Item to create a field for item Item to create a field for
table Temporary table table Temporary table
modify_item 1 if item->result_field should point to new item. item !=NULL if item->result_field should point to new field.
This is relevent for how fill_record() is going to This is relevant for how fill_record() is going to work:
work: If item != NULL then fill_record() will update
If modify_item is 1 then fill_record() will update
the record in the original table. the record in the original table.
If modify_item is 0 then fill_record() will update If item == NULL then fill_record() will update
the temporary table the temporary table
convert_blob_length If >0 create a varstring(convert_blob_length) field convert_blob_length If >0 create a varstring(convert_blob_length) field
instead of blob. instead of blob.
...@@ -4622,8 +4622,8 @@ const_expression_in_where(COND *cond, Item *comp_item, Item **const_item) ...@@ -4622,8 +4622,8 @@ const_expression_in_where(COND *cond, Item *comp_item, Item **const_item)
*/ */
static Field* create_tmp_field_from_field(THD *thd, Field* org_field, static Field* create_tmp_field_from_field(THD *thd, Field* org_field,
Item *item, TABLE *table, const char *name, TABLE *table,
bool modify_item, Item_field *item,
uint convert_blob_length) uint convert_blob_length)
{ {
Field *new_field; Field *new_field;
...@@ -4636,10 +4636,10 @@ static Field* create_tmp_field_from_field(THD *thd, Field* org_field, ...@@ -4636,10 +4636,10 @@ static Field* create_tmp_field_from_field(THD *thd, Field* org_field,
new_field= org_field->new_field(thd->mem_root, table); new_field= org_field->new_field(thd->mem_root, table);
if (new_field) if (new_field)
{ {
if (modify_item) if (item)
((Item_field *)item)->result_field= new_field; item->result_field= new_field;
else else
new_field->field_name= item->name; new_field->field_name= name;
if (org_field->maybe_null()) if (org_field->maybe_null())
new_field->flags&= ~NOT_NULL_FLAG; // Because of outer join new_field->flags&= ~NOT_NULL_FLAG; // Because of outer join
if (org_field->type() == FIELD_TYPE_VAR_STRING) if (org_field->type() == FIELD_TYPE_VAR_STRING)
...@@ -4779,8 +4779,8 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type, ...@@ -4779,8 +4779,8 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type,
if (item_sum->args[0]->type() == Item::FIELD_ITEM) if (item_sum->args[0]->type() == Item::FIELD_ITEM)
{ {
*from_field= ((Item_field*) item_sum->args[0])->field; *from_field= ((Item_field*) item_sum->args[0])->field;
return create_tmp_field_from_field(thd, *from_field, item, table, return create_tmp_field_from_field(thd, *from_field, item->name, table,
modify_item, convert_blob_length); NULL, convert_blob_length);
} }
/* fall through */ /* fall through */
default: default:
...@@ -4818,8 +4818,10 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type, ...@@ -4818,8 +4818,10 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type,
case Item::DEFAULT_VALUE_ITEM: case Item::DEFAULT_VALUE_ITEM:
{ {
Item_field *field= (Item_field*) item; Item_field *field= (Item_field*) item;
return create_tmp_field_from_field(thd, (*from_field= field->field), item, return create_tmp_field_from_field(thd, (*from_field= field->field),
table, modify_item, convert_blob_length); item->name, table,
modify_item ? (Item_field*) item : NULL,
convert_blob_length);
} }
case Item::FUNC_ITEM: case Item::FUNC_ITEM:
case Item::COND_ITEM: case Item::COND_ITEM:
...@@ -7174,7 +7176,19 @@ test_if_skip_sort_order(JOIN_TAB *tab,ORDER *order,ha_rows select_limit, ...@@ -7174,7 +7176,19 @@ test_if_skip_sort_order(JOIN_TAB *tab,ORDER *order,ha_rows select_limit,
/* Found key that can be used to retrieve data in sorted order */ /* Found key that can be used to retrieve data in sorted order */
if (tab->ref.key >= 0) if (tab->ref.key >= 0)
{ {
tab->ref.key= new_ref_key; /*
We'll use ref access method on key new_ref_key. In general case
the index search tuple for new_ref_key will be different (e.g.
when one of the indexes only covers prefix of the field, see
BUG#9213 in group_by.test).
So we build tab->ref from scratch here.
*/
KEYUSE *keyuse= tab->keyuse;
while (keyuse->key != new_ref_key && keyuse->table == tab->table)
keyuse++;
if (create_ref_for_key(tab->join, tab, keyuse,
tab->join->const_table_map))
DBUG_RETURN(0);
} }
else else
{ {
......
...@@ -90,7 +90,9 @@ struct st_table { ...@@ -90,7 +90,9 @@ struct st_table {
uint null_fields; /* number of null fields */ uint null_fields; /* number of null fields */
uint blob_fields; /* number of blob fields */ uint blob_fields; /* number of blob fields */
key_map keys_in_use, keys_for_keyread, read_only_keys; key_map keys_in_use, keys_for_keyread, read_only_keys;
key_map quick_keys, used_keys, keys_in_use_for_query; key_map quick_keys;
key_map used_keys; /* keys that cover all used table fields */
key_map keys_in_use_for_query;
KEY *key_info; /* data of keys in database */ KEY *key_info; /* data of keys in database */
TYPELIB keynames; /* Pointers to keynames */ TYPELIB keynames; /* Pointers to keynames */
ha_rows max_rows; /* create information */ ha_rows max_rows; /* create information */
......
...@@ -394,7 +394,7 @@ my_strtoll10: ...@@ -394,7 +394,7 @@ my_strtoll10:
popl %ebp popl %ebp
ret ret
my_strtoll10_end: .my_strtoll10_end:
.size my_strtoll10,.my_strtoll10_end-my_strtoll10 .size my_strtoll10,.my_strtoll10_end-my_strtoll10
.comm res,240,32 .comm res,240,32
.comm end_ptr,120,32 .comm end_ptr,120,32
......
...@@ -115,7 +115,7 @@ main(int argc, char** argv) ...@@ -115,7 +115,7 @@ main(int argc, char** argv)
{ {
/* child, therefore, client */ /* child, therefore, client */
char xbuf[100]; char xbuf[100];
int r = client_vio->read(client_vio,xbuf, sizeof(xbuf)); int r = vio_read(client_vio,xbuf, sizeof(xbuf));
if (r<=0) { if (r<=0) {
my_free((gptr)ssl_acceptor,MYF(0)); my_free((gptr)ssl_acceptor,MYF(0));
my_free((gptr)ssl_connector,MYF(0)); my_free((gptr)ssl_connector,MYF(0));
...@@ -130,7 +130,7 @@ main(int argc, char** argv) ...@@ -130,7 +130,7 @@ main(int argc, char** argv)
else else
{ {
const char* s = "Huhuhuh"; const char* s = "Huhuhuh";
int r = server_vio->write(server_vio,(gptr)s, strlen(s)); int r = vio_write(server_vio,(gptr)s, strlen(s));
if (r<=0) { if (r<=0) {
my_free((gptr)ssl_acceptor,MYF(0)); my_free((gptr)ssl_acceptor,MYF(0));
my_free((gptr)ssl_connector,MYF(0)); my_free((gptr)ssl_connector,MYF(0));
......
...@@ -77,13 +77,13 @@ main( int argc __attribute__((unused)), ...@@ -77,13 +77,13 @@ main( int argc __attribute__((unused)),
sa.sin_port = htons (1111); /* Server Port number */ sa.sin_port = htons (1111); /* Server Port number */
err = connect(client_vio->sd, (struct sockaddr*) &sa, err = connect(client_vio->sd, (struct sockaddr*) &sa,
sizeof(sa)); sizeof(sa));
/* ----------------------------------------------- */ /* ----------------------------------------------- */
/* Now we have TCP conncetion. Start SSL negotiation. */ /* Now we have TCP conncetion. Start SSL negotiation. */
read(client_vio->sd,xbuf, sizeof(xbuf)); read(client_vio->sd,xbuf, sizeof(xbuf));
sslconnect(ssl_connector,client_vio,60L); sslconnect(ssl_connector,client_vio,60L);
err = client_vio->read(client_vio,xbuf, sizeof(xbuf)); err = vio_read(client_vio,xbuf, sizeof(xbuf));
if (err<=0) { if (err<=0) {
my_free((gptr)ssl_connector,MYF(0)); my_free((gptr)ssl_connector,MYF(0));
fatal_error("client:SSL_read"); fatal_error("client:SSL_read");
......
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