mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
merge
This commit is contained in:
@ -138,8 +138,8 @@ int vio_close_shared_memory(Vio * vio);
|
||||
#if defined(HAVE_VIO) && !defined(DONT_MAP_VIO)
|
||||
#define vio_delete(vio) (vio)->viodelete(vio)
|
||||
#define vio_errno(vio) (vio)->vioerrno(vio)
|
||||
#define vio_read(vio, buf, size) (vio)->read(vio,buf,size)
|
||||
#define vio_write(vio, buf, size) (vio)->write(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_blocking(vio, set_blocking_mode, old_mode)\
|
||||
(vio)->vioblocking(vio, set_blocking_mode, old_mode)
|
||||
#define vio_is_blocking(vio) (vio)->is_blocking(vio)
|
||||
|
@ -1,6 +1,6 @@
|
||||
drop table if exists t1;
|
||||
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");
|
||||
select * from t1;
|
||||
a
|
||||
@ -23,7 +23,7 @@ a
|
||||
b
|
||||
c
|
||||
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');
|
||||
select upper(a),upper(b) from t1;
|
||||
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;
|
||||
d
|
||||
10
|
||||
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;
|
||||
|
@ -1,2 +0,0 @@
|
||||
--default-character-set=cp1251 --new
|
||||
|
@ -10,7 +10,7 @@ SET NAMES cp1251;
|
||||
# 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");
|
||||
select * from t1;
|
||||
select a, left(a,1) as b from t1;
|
||||
@ -21,7 +21,7 @@ drop table t1;
|
||||
#
|
||||
# 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');
|
||||
select upper(a),upper(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;
|
||||
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;
|
||||
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,
|
||||
db ? db : "", want_access, thd->master_access));
|
||||
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
||||
ulong db_access;
|
||||
bool db_is_pattern= test(want_access & GRANT_ACL);
|
||||
#endif
|
||||
ulong dummy;
|
||||
if (save_priv)
|
||||
@ -3757,9 +3758,8 @@ check_access(THD *thd, ulong want_access, const char *db, ulong *save_priv,
|
||||
*/
|
||||
db_access= thd->db_access;
|
||||
if (!(thd->master_access & SELECT_ACL) &&
|
||||
(db && (!thd->db || strcmp(db,thd->db))))
|
||||
db_access=acl_get(thd->host, thd->ip,
|
||||
thd->priv_user, db, test(want_access & GRANT_ACL));
|
||||
(db && (!thd->db || db_is_pattern || strcmp(db,thd->db))))
|
||||
db_access=acl_get(thd->host, thd->ip, thd->priv_user, db, db_is_pattern);
|
||||
*save_priv=thd->master_access | db_access;
|
||||
DBUG_RETURN(FALSE);
|
||||
}
|
||||
@ -3777,9 +3777,8 @@ check_access(THD *thd, ulong want_access, const char *db, ulong *save_priv,
|
||||
if (db == any_db)
|
||||
DBUG_RETURN(FALSE); // Allow select on anything
|
||||
|
||||
if (db && (!thd->db || strcmp(db,thd->db)))
|
||||
db_access=acl_get(thd->host, thd->ip,
|
||||
thd->priv_user, db, test(want_access & GRANT_ACL));
|
||||
if (db && (!thd->db || db_is_pattern || strcmp(db,thd->db)))
|
||||
db_access=acl_get(thd->host, thd->ip, thd->priv_user, db, db_is_pattern);
|
||||
else
|
||||
db_access=thd->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)
|
||||
create_tmp_field_from_field()
|
||||
thd Thread handler
|
||||
org_field field from which new field will be created
|
||||
name New field name
|
||||
item Item to create a field for
|
||||
table Temporary table
|
||||
modify_item 1 if item->result_field should point to new item.
|
||||
This is relevent for how fill_record() is going to
|
||||
work:
|
||||
If modify_item is 1 then fill_record() will update
|
||||
item !=NULL if item->result_field should point to new field.
|
||||
This is relevant for how fill_record() is going to work:
|
||||
If item != NULL then fill_record() will update
|
||||
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
|
||||
convert_blob_length If >0 create a varstring(convert_blob_length) field
|
||||
instead of blob.
|
||||
@ -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,
|
||||
Item *item, TABLE *table,
|
||||
bool modify_item,
|
||||
const char *name, TABLE *table,
|
||||
Item_field *item,
|
||||
uint convert_blob_length)
|
||||
{
|
||||
Field *new_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);
|
||||
if (new_field)
|
||||
{
|
||||
if (modify_item)
|
||||
((Item_field *)item)->result_field= new_field;
|
||||
if (item)
|
||||
item->result_field= new_field;
|
||||
else
|
||||
new_field->field_name= item->name;
|
||||
new_field->field_name= name;
|
||||
if (org_field->maybe_null())
|
||||
new_field->flags&= ~NOT_NULL_FLAG; // Because of outer join
|
||||
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,
|
||||
if (item_sum->args[0]->type() == Item::FIELD_ITEM)
|
||||
{
|
||||
*from_field= ((Item_field*) item_sum->args[0])->field;
|
||||
return create_tmp_field_from_field(thd, *from_field, item, table,
|
||||
modify_item, convert_blob_length);
|
||||
return create_tmp_field_from_field(thd, *from_field, item->name, table,
|
||||
NULL, convert_blob_length);
|
||||
}
|
||||
/* fall through */
|
||||
default:
|
||||
@ -4818,8 +4818,10 @@ Field *create_tmp_field(THD *thd, TABLE *table,Item *item, Item::Type type,
|
||||
case Item::DEFAULT_VALUE_ITEM:
|
||||
{
|
||||
Item_field *field= (Item_field*) item;
|
||||
return create_tmp_field_from_field(thd, (*from_field= field->field), item,
|
||||
table, modify_item, convert_blob_length);
|
||||
return create_tmp_field_from_field(thd, (*from_field= field->field),
|
||||
item->name, table,
|
||||
modify_item ? (Item_field*) item : NULL,
|
||||
convert_blob_length);
|
||||
}
|
||||
case Item::FUNC_ITEM:
|
||||
case Item::COND_ITEM:
|
||||
@ -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 */
|
||||
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
|
||||
{
|
||||
|
@ -90,7 +90,9 @@ struct st_table {
|
||||
uint null_fields; /* number of null fields */
|
||||
uint blob_fields; /* number of blob fields */
|
||||
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 */
|
||||
TYPELIB keynames; /* Pointers to keynames */
|
||||
ha_rows max_rows; /* create information */
|
||||
|
@ -394,7 +394,7 @@ my_strtoll10:
|
||||
popl %ebp
|
||||
ret
|
||||
|
||||
my_strtoll10_end:
|
||||
.my_strtoll10_end:
|
||||
.size my_strtoll10,.my_strtoll10_end-my_strtoll10
|
||||
.comm res,240,32
|
||||
.comm end_ptr,120,32
|
||||
|
@ -115,7 +115,7 @@ main(int argc, char** argv)
|
||||
{
|
||||
/* child, therefore, client */
|
||||
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) {
|
||||
my_free((gptr)ssl_acceptor,MYF(0));
|
||||
my_free((gptr)ssl_connector,MYF(0));
|
||||
@ -130,7 +130,7 @@ main(int argc, char** argv)
|
||||
else
|
||||
{
|
||||
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) {
|
||||
my_free((gptr)ssl_acceptor,MYF(0));
|
||||
my_free((gptr)ssl_connector,MYF(0));
|
||||
|
@ -83,7 +83,7 @@ main( int argc __attribute__((unused)),
|
||||
/* Now we have TCP conncetion. Start SSL negotiation. */
|
||||
read(client_vio->sd,xbuf, sizeof(xbuf));
|
||||
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) {
|
||||
my_free((gptr)ssl_connector,MYF(0));
|
||||
fatal_error("client:SSL_read");
|
||||
|
Reference in New Issue
Block a user