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)
|
#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)
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
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
|
|||||||
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;
|
|||||||
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;
|
||||||
|
@ -1,2 +0,0 @@
|
|||||||
--default-character-set=cp1251 --new
|
|
||||||
|
|
@ -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;
|
|||||||
#
|
#
|
||||||
# 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;
|
|||||||
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,
|
|||||||
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,
|
|||||||
*/
|
*/
|
||||||
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,
|
|||||||
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)
|
|||||||
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)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
/* 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 {
|
|||||||
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:
|
|||||||
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)
|
|||||||
{
|
{
|
||||||
/* 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)
|
|||||||
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)),
|
|||||||
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");
|
||||||
|
Reference in New Issue
Block a user