Merge abarkov@bk-internal:/home/bk/mysql-5.0
into mysql.com:/usr/home/bar/mysql-5.0.b12371
This commit is contained in:
commit
c2b83bebd2
@ -1010,10 +1010,12 @@ static int read_and_execute(bool interactive)
|
|||||||
#elif defined(__WIN__)
|
#elif defined(__WIN__)
|
||||||
if (!tmpbuf.is_alloced())
|
if (!tmpbuf.is_alloced())
|
||||||
tmpbuf.alloc(65535);
|
tmpbuf.alloc(65535);
|
||||||
|
tmpbuf.length(0);
|
||||||
buffer.length(0);
|
buffer.length(0);
|
||||||
unsigned long clen;
|
unsigned long clen;
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
|
line= my_cgets((char*)tmpbuf.ptr(), tmpbuf.alloced_length()-1, &clen);
|
||||||
buffer.append(line, clen);
|
buffer.append(line, clen);
|
||||||
/*
|
/*
|
||||||
if we got buffer fully filled than there is a chance that
|
if we got buffer fully filled than there is a chance that
|
||||||
|
@ -7,7 +7,7 @@ AC_INIT(sql/mysqld.cc)
|
|||||||
AC_CANONICAL_SYSTEM
|
AC_CANONICAL_SYSTEM
|
||||||
# The Docs Makefile.am parses this line!
|
# The Docs Makefile.am parses this line!
|
||||||
# remember to also change ndb version below and update version.c in ndb
|
# remember to also change ndb version below and update version.c in ndb
|
||||||
AM_INIT_AUTOMAKE(mysql, 5.0.15)
|
AM_INIT_AUTOMAKE(mysql, 5.0.16)
|
||||||
AM_CONFIG_HEADER(config.h)
|
AM_CONFIG_HEADER(config.h)
|
||||||
|
|
||||||
PROTOCOL_VERSION=10
|
PROTOCOL_VERSION=10
|
||||||
@ -18,7 +18,7 @@ SHARED_LIB_VERSION=15:0:0
|
|||||||
# ndb version
|
# ndb version
|
||||||
NDB_VERSION_MAJOR=5
|
NDB_VERSION_MAJOR=5
|
||||||
NDB_VERSION_MINOR=0
|
NDB_VERSION_MINOR=0
|
||||||
NDB_VERSION_BUILD=15
|
NDB_VERSION_BUILD=16
|
||||||
NDB_VERSION_STATUS=""
|
NDB_VERSION_STATUS=""
|
||||||
|
|
||||||
# Set all version vars based on $VERSION. How do we do this more elegant ?
|
# Set all version vars based on $VERSION. How do we do this more elegant ?
|
||||||
|
@ -243,7 +243,7 @@ our $opt_sleep_time_after_restart= 1;
|
|||||||
our $opt_sleep_time_for_delete= 10;
|
our $opt_sleep_time_for_delete= 10;
|
||||||
our $opt_testcase_timeout;
|
our $opt_testcase_timeout;
|
||||||
our $opt_suite_timeout;
|
our $opt_suite_timeout;
|
||||||
my $default_testcase_timeout= 10; # 10 min max
|
my $default_testcase_timeout= 15; # 15 min max
|
||||||
my $default_suite_timeout= 120; # 2 hours max
|
my $default_suite_timeout= 120; # 2 hours max
|
||||||
|
|
||||||
our $opt_socket;
|
our $opt_socket;
|
||||||
|
@ -21,7 +21,7 @@ instance_name status version
|
|||||||
mysqld2 online VERSION
|
mysqld2 online VERSION
|
||||||
SHOW VARIABLES LIKE 'port';
|
SHOW VARIABLES LIKE 'port';
|
||||||
Variable_name Value
|
Variable_name Value
|
||||||
port 9312
|
port IM_MYSQLD1_PORT
|
||||||
STOP INSTANCE mysqld2;
|
STOP INSTANCE mysqld2;
|
||||||
SHOW INSTANCES;
|
SHOW INSTANCES;
|
||||||
instance_name status
|
instance_name status
|
||||||
|
@ -2965,6 +2965,63 @@ NULL
|
|||||||
SELECT IFNULL(NULL, NULL);
|
SELECT IFNULL(NULL, NULL);
|
||||||
IFNULL(NULL, NULL)
|
IFNULL(NULL, NULL)
|
||||||
NULL
|
NULL
|
||||||
|
SET @OLD_SQL_MODE12595=@@SQL_MODE, @@SQL_MODE='';
|
||||||
|
SHOW LOCAL VARIABLES LIKE 'SQL_MODE';
|
||||||
|
Variable_name Value
|
||||||
|
sql_mode
|
||||||
|
CREATE TABLE BUG_12595(a varchar(100));
|
||||||
|
INSERT INTO BUG_12595 VALUES ('hakan%'), ('hakank'), ("ha%an");
|
||||||
|
SELECT * FROM BUG_12595 WHERE a LIKE 'hakan\%';
|
||||||
|
a
|
||||||
|
hakan%
|
||||||
|
SELECT * FROM BUG_12595 WHERE a LIKE 'hakan*%' ESCAPE '*';
|
||||||
|
a
|
||||||
|
hakan%
|
||||||
|
SELECT * FROM BUG_12595 WHERE a LIKE 'hakan**%' ESCAPE '**';
|
||||||
|
ERROR HY000: Incorrect arguments to ESCAPE
|
||||||
|
SELECT * FROM BUG_12595 WHERE a LIKE 'hakan%' ESCAPE '';
|
||||||
|
a
|
||||||
|
hakan%
|
||||||
|
hakank
|
||||||
|
SELECT * FROM BUG_12595 WHERE a LIKE 'hakan\%' ESCAPE '';
|
||||||
|
a
|
||||||
|
SELECT * FROM BUG_12595 WHERE a LIKE 'ha\%an' ESCAPE 0x5c;
|
||||||
|
a
|
||||||
|
ha%an
|
||||||
|
SELECT * FROM BUG_12595 WHERE a LIKE 'ha%%an' ESCAPE '%';
|
||||||
|
a
|
||||||
|
ha%an
|
||||||
|
SELECT * FROM BUG_12595 WHERE a LIKE 'ha\%an' ESCAPE '\\';
|
||||||
|
a
|
||||||
|
ha%an
|
||||||
|
SELECT * FROM BUG_12595 WHERE a LIKE 'ha|%an' ESCAPE '|';
|
||||||
|
a
|
||||||
|
ha%an
|
||||||
|
SET @@SQL_MODE='NO_BACKSLASH_ESCAPES';
|
||||||
|
SHOW LOCAL VARIABLES LIKE 'SQL_MODE';
|
||||||
|
Variable_name Value
|
||||||
|
sql_mode NO_BACKSLASH_ESCAPES
|
||||||
|
SELECT * FROM BUG_12595 WHERE a LIKE 'hakan\%';
|
||||||
|
a
|
||||||
|
SELECT * FROM BUG_12595 WHERE a LIKE 'hakan*%' ESCAPE '*';
|
||||||
|
a
|
||||||
|
hakan%
|
||||||
|
SELECT * FROM BUG_12595 WHERE a LIKE 'hakan**%' ESCAPE '**';
|
||||||
|
ERROR HY000: Incorrect arguments to ESCAPE
|
||||||
|
SELECT * FROM BUG_12595 WHERE a LIKE 'hakan\%' ESCAPE '\\';
|
||||||
|
ERROR HY000: Incorrect arguments to ESCAPE
|
||||||
|
SELECT * FROM BUG_12595 WHERE a LIKE 'hakan%' ESCAPE '';
|
||||||
|
ERROR HY000: Incorrect arguments to ESCAPE
|
||||||
|
SELECT * FROM BUG_12595 WHERE a LIKE 'ha\%an' ESCAPE 0x5c;
|
||||||
|
a
|
||||||
|
ha%an
|
||||||
|
SELECT * FROM BUG_12595 WHERE a LIKE 'ha|%an' ESCAPE '|';
|
||||||
|
a
|
||||||
|
ha%an
|
||||||
|
SELECT * FROM BUG_12595 WHERE a LIKE 'hakan\n%' ESCAPE '\n';
|
||||||
|
ERROR HY000: Incorrect arguments to ESCAPE
|
||||||
|
SET @@SQL_MODE=@OLD_SQL_MODE12595;
|
||||||
|
DROP TABLE BUG_12595;
|
||||||
create table t1 (a char(1));
|
create table t1 (a char(1));
|
||||||
create table t2 (a char(1));
|
create table t2 (a char(1));
|
||||||
insert into t1 values ('a'),('b'),('c');
|
insert into t1 values ('a'),('b'),('c');
|
||||||
|
@ -46,6 +46,7 @@ SHOW INSTANCE STATUS mysqld2;
|
|||||||
--connect (mysql_con,localhost,root,,mysql,$IM_MYSQLD1_PORT,$IM_MYSQLD1_SOCK)
|
--connect (mysql_con,localhost,root,,mysql,$IM_MYSQLD1_PORT,$IM_MYSQLD1_SOCK)
|
||||||
--connection mysql_con
|
--connection mysql_con
|
||||||
|
|
||||||
|
--replace_result $IM_MYSQLD1_PORT IM_MYSQLD1_PORT
|
||||||
SHOW VARIABLES LIKE 'port';
|
SHOW VARIABLES LIKE 'port';
|
||||||
|
|
||||||
--connection default
|
--connection default
|
||||||
|
@ -2517,6 +2517,45 @@ SELECT CAST(IFNULL(NULL, NULL) AS DECIMAL);
|
|||||||
SELECT ABS(IFNULL(NULL, NULL));
|
SELECT ABS(IFNULL(NULL, NULL));
|
||||||
SELECT IFNULL(NULL, NULL);
|
SELECT IFNULL(NULL, NULL);
|
||||||
|
|
||||||
|
#
|
||||||
|
# BUG #12595 (ESCAPE must be exactly one)
|
||||||
|
#
|
||||||
|
SET @OLD_SQL_MODE12595=@@SQL_MODE, @@SQL_MODE='';
|
||||||
|
SHOW LOCAL VARIABLES LIKE 'SQL_MODE';
|
||||||
|
|
||||||
|
CREATE TABLE BUG_12595(a varchar(100));
|
||||||
|
INSERT INTO BUG_12595 VALUES ('hakan%'), ('hakank'), ("ha%an");
|
||||||
|
SELECT * FROM BUG_12595 WHERE a LIKE 'hakan\%';
|
||||||
|
SELECT * FROM BUG_12595 WHERE a LIKE 'hakan*%' ESCAPE '*';
|
||||||
|
-- error 1210
|
||||||
|
SELECT * FROM BUG_12595 WHERE a LIKE 'hakan**%' ESCAPE '**';
|
||||||
|
# this should work when sql_mode is not NO_BACKSLASH_ESCAPES
|
||||||
|
SELECT * FROM BUG_12595 WHERE a LIKE 'hakan%' ESCAPE '';
|
||||||
|
SELECT * FROM BUG_12595 WHERE a LIKE 'hakan\%' ESCAPE '';
|
||||||
|
SELECT * FROM BUG_12595 WHERE a LIKE 'ha\%an' ESCAPE 0x5c;
|
||||||
|
SELECT * FROM BUG_12595 WHERE a LIKE 'ha%%an' ESCAPE '%';
|
||||||
|
SELECT * FROM BUG_12595 WHERE a LIKE 'ha\%an' ESCAPE '\\';
|
||||||
|
SELECT * FROM BUG_12595 WHERE a LIKE 'ha|%an' ESCAPE '|';
|
||||||
|
|
||||||
|
SET @@SQL_MODE='NO_BACKSLASH_ESCAPES';
|
||||||
|
SHOW LOCAL VARIABLES LIKE 'SQL_MODE';
|
||||||
|
SELECT * FROM BUG_12595 WHERE a LIKE 'hakan\%';
|
||||||
|
SELECT * FROM BUG_12595 WHERE a LIKE 'hakan*%' ESCAPE '*';
|
||||||
|
-- error 1210
|
||||||
|
SELECT * FROM BUG_12595 WHERE a LIKE 'hakan**%' ESCAPE '**';
|
||||||
|
-- error 1210
|
||||||
|
SELECT * FROM BUG_12595 WHERE a LIKE 'hakan\%' ESCAPE '\\';
|
||||||
|
#this gives an error when NO_BACKSLASH_ESCAPES is set
|
||||||
|
-- error 1210
|
||||||
|
SELECT * FROM BUG_12595 WHERE a LIKE 'hakan%' ESCAPE '';
|
||||||
|
SELECT * FROM BUG_12595 WHERE a LIKE 'ha\%an' ESCAPE 0x5c;
|
||||||
|
SELECT * FROM BUG_12595 WHERE a LIKE 'ha|%an' ESCAPE '|';
|
||||||
|
-- error 1210
|
||||||
|
SELECT * FROM BUG_12595 WHERE a LIKE 'hakan\n%' ESCAPE '\n';
|
||||||
|
|
||||||
|
SET @@SQL_MODE=@OLD_SQL_MODE12595;
|
||||||
|
DROP TABLE BUG_12595;
|
||||||
|
|
||||||
#
|
#
|
||||||
# Bug #6495 Illogical requirement for column qualification in NATURAL join
|
# Bug #6495 Illogical requirement for column qualification in NATURAL join
|
||||||
#
|
#
|
||||||
|
@ -138,15 +138,25 @@ static int wait_process(My_process_info *pi)
|
|||||||
static int start_process(Instance_options *instance_options,
|
static int start_process(Instance_options *instance_options,
|
||||||
My_process_info *pi)
|
My_process_info *pi)
|
||||||
{
|
{
|
||||||
|
#ifndef __QNX__
|
||||||
*pi= fork();
|
*pi= fork();
|
||||||
|
#else
|
||||||
|
/*
|
||||||
|
On QNX one cannot use fork() in multithreaded environment and we
|
||||||
|
should use spawn() or one of it's siblings instead.
|
||||||
|
Here we use spawnv(), which is a combination of fork() and execv()
|
||||||
|
in one call. It returns the pid of newly created process (>0) or -1
|
||||||
|
*/
|
||||||
|
*pi= spawnv(P_NOWAIT, instance_options->mysqld_path, instance_options->argv);
|
||||||
|
#endif
|
||||||
|
|
||||||
switch (*pi) {
|
switch (*pi) {
|
||||||
case 0:
|
case 0: /* never happens on QNX */
|
||||||
execv(instance_options->mysqld_path, instance_options->argv);
|
execv(instance_options->mysqld_path, instance_options->argv);
|
||||||
/* exec never returns */
|
/* exec never returns */
|
||||||
exit(1);
|
exit(1);
|
||||||
case 1:
|
case -1:
|
||||||
log_info("cannot fork() to start instance %s",
|
log_info("cannot create a new process to start instance %s",
|
||||||
instance_options->instance_name);
|
instance_options->instance_name);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -2958,6 +2958,15 @@ bool Item_func_like::fix_fields(THD *thd, Item **ref)
|
|||||||
String *escape_str= escape_item->val_str(&tmp_value1);
|
String *escape_str= escape_item->val_str(&tmp_value1);
|
||||||
if (escape_str)
|
if (escape_str)
|
||||||
{
|
{
|
||||||
|
if (escape_used_in_parsing && (
|
||||||
|
(((thd->variables.sql_mode & MODE_NO_BACKSLASH_ESCAPES) &&
|
||||||
|
escape_str->numchars() != 1) ||
|
||||||
|
escape_str->numchars() > 1)))
|
||||||
|
{
|
||||||
|
my_error(ER_WRONG_ARGUMENTS,MYF(0),"ESCAPE");
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
if (use_mb(cmp.cmp_collation.collation))
|
if (use_mb(cmp.cmp_collation.collation))
|
||||||
{
|
{
|
||||||
CHARSET_INFO *cs= escape_str->charset();
|
CHARSET_INFO *cs= escape_str->charset();
|
||||||
|
@ -985,13 +985,16 @@ class Item_func_like :public Item_bool_func2
|
|||||||
enum { alphabet_size = 256 };
|
enum { alphabet_size = 256 };
|
||||||
|
|
||||||
Item *escape_item;
|
Item *escape_item;
|
||||||
|
|
||||||
|
bool escape_used_in_parsing;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
int escape;
|
int escape;
|
||||||
|
|
||||||
Item_func_like(Item *a,Item *b, Item *escape_arg)
|
Item_func_like(Item *a,Item *b, Item *escape_arg, bool escape_used)
|
||||||
:Item_bool_func2(a,b), canDoTurboBM(FALSE), pattern(0), pattern_len(0),
|
:Item_bool_func2(a,b), canDoTurboBM(FALSE), pattern(0), pattern_len(0),
|
||||||
bmGs(0), bmBc(0), escape_item(escape_arg) {}
|
bmGs(0), bmBc(0), escape_item(escape_arg),
|
||||||
|
escape_used_in_parsing(escape_used) {}
|
||||||
longlong val_int();
|
longlong val_int();
|
||||||
enum Functype functype() const { return LIKE_FUNC; }
|
enum Functype functype() const { return LIKE_FUNC; }
|
||||||
optimize_type select_optimize() const;
|
optimize_type select_optimize() const;
|
||||||
|
@ -599,7 +599,8 @@ SQL_SELECT *prepare_select_for_name(THD *thd, const char *mask, uint mlen,
|
|||||||
{
|
{
|
||||||
Item *cond= new Item_func_like(new Item_field(pfname),
|
Item *cond= new Item_func_like(new Item_field(pfname),
|
||||||
new Item_string(mask,mlen,pfname->charset()),
|
new Item_string(mask,mlen,pfname->charset()),
|
||||||
new Item_string("\\",1,&my_charset_latin1));
|
new Item_string("\\",1,&my_charset_latin1),
|
||||||
|
FALSE);
|
||||||
if (thd->is_fatal_error)
|
if (thd->is_fatal_error)
|
||||||
return 0; // OOM
|
return 0; // OOM
|
||||||
return prepare_simple_select(thd, cond, table, error);
|
return prepare_simple_select(thd, cond, table, error);
|
||||||
|
@ -175,6 +175,7 @@ void lex_start(THD *thd, uchar *buf,uint length)
|
|||||||
lex->spcont= NULL;
|
lex->spcont= NULL;
|
||||||
lex->proc_list.first= 0;
|
lex->proc_list.first= 0;
|
||||||
lex->query_tables_own_last= 0;
|
lex->query_tables_own_last= 0;
|
||||||
|
lex->escape_used= FALSE;
|
||||||
|
|
||||||
if (lex->sroutines.records)
|
if (lex->sroutines.records)
|
||||||
my_hash_reset(&lex->sroutines);
|
my_hash_reset(&lex->sroutines);
|
||||||
|
@ -894,6 +894,8 @@ typedef struct st_lex
|
|||||||
during replication ("LOCAL 'filename' REPLACE INTO" part).
|
during replication ("LOCAL 'filename' REPLACE INTO" part).
|
||||||
*/
|
*/
|
||||||
uchar *fname_start, *fname_end;
|
uchar *fname_start, *fname_end;
|
||||||
|
|
||||||
|
bool escape_used;
|
||||||
|
|
||||||
st_lex();
|
st_lex();
|
||||||
|
|
||||||
|
@ -4314,9 +4314,9 @@ predicate:
|
|||||||
{ $$= new Item_func_eq(new Item_func_soundex($1),
|
{ $$= new Item_func_eq(new Item_func_soundex($1),
|
||||||
new Item_func_soundex($4)); }
|
new Item_func_soundex($4)); }
|
||||||
| bit_expr LIKE simple_expr opt_escape
|
| bit_expr LIKE simple_expr opt_escape
|
||||||
{ $$= new Item_func_like($1,$3,$4); }
|
{ $$= new Item_func_like($1,$3,$4,Lex->escape_used); }
|
||||||
| bit_expr not LIKE simple_expr opt_escape
|
| bit_expr not LIKE simple_expr opt_escape
|
||||||
{ $$= new Item_func_not(new Item_func_like($1,$4,$5)); }
|
{ $$= new Item_func_not(new Item_func_like($1,$4,$5, Lex->escape_used)); }
|
||||||
| bit_expr REGEXP bit_expr { $$= new Item_func_regex($1,$3); }
|
| bit_expr REGEXP bit_expr { $$= new Item_func_regex($1,$3); }
|
||||||
| bit_expr not REGEXP bit_expr
|
| bit_expr not REGEXP bit_expr
|
||||||
{ $$= negate_expression(YYTHD, new Item_func_regex($1,$4)); }
|
{ $$= negate_expression(YYTHD, new Item_func_regex($1,$4)); }
|
||||||
@ -5678,10 +5678,14 @@ having_clause:
|
|||||||
;
|
;
|
||||||
|
|
||||||
opt_escape:
|
opt_escape:
|
||||||
ESCAPE_SYM simple_expr { $$= $2; }
|
ESCAPE_SYM simple_expr
|
||||||
|
{
|
||||||
|
Lex->escape_used= TRUE;
|
||||||
|
$$= $2;
|
||||||
|
}
|
||||||
| /* empty */
|
| /* empty */
|
||||||
{
|
{
|
||||||
|
Lex->escape_used= FALSE;
|
||||||
$$= ((YYTHD->variables.sql_mode & MODE_NO_BACKSLASH_ESCAPES) ?
|
$$= ((YYTHD->variables.sql_mode & MODE_NO_BACKSLASH_ESCAPES) ?
|
||||||
new Item_string("", 0, &my_charset_latin1) :
|
new Item_string("", 0, &my_charset_latin1) :
|
||||||
new Item_string("\\", 1, &my_charset_latin1));
|
new Item_string("\\", 1, &my_charset_latin1));
|
||||||
|
@ -1,8 +1,15 @@
|
|||||||
%define mysql_version @VERSION@
|
%define mysql_version @VERSION@
|
||||||
|
|
||||||
# use "rpmbuild --with static" or "rpm --define '_with_static 1'" (for RPM 3.x)
|
# use "rpmbuild --with static" or "rpm --define '_with_static 1'" (for RPM 3.x)
|
||||||
# to enable static linking (off by default)
|
# to enable static linking (off by default)
|
||||||
%{?_with_static:%define STATIC_BUILD 1}
|
%{?_with_static:%define STATIC_BUILD 1}
|
||||||
%{!?_with_static:%define STATIC_BUILD 0}
|
%{!?_with_static:%define STATIC_BUILD 0}
|
||||||
|
|
||||||
|
# use "rpmbuild --with yassl" or "rpm --define '_with_yassl 1'" (for RPM 3.x)
|
||||||
|
# to build with yaSSL support (off by default)
|
||||||
|
%{?_with_yassl:%define YASSL_BUILD 1}
|
||||||
|
%{!?_with_yassl:%define YASSL_BUILD 0}
|
||||||
|
|
||||||
%if %{STATIC_BUILD}
|
%if %{STATIC_BUILD}
|
||||||
%define release 0
|
%define release 0
|
||||||
%else
|
%else
|
||||||
@ -239,6 +246,9 @@ sh -c "PATH=\"${MYSQL_BUILD_PATH:-$PATH}\" \
|
|||||||
--with-unix-socket-path=/var/lib/mysql/mysql.sock \
|
--with-unix-socket-path=/var/lib/mysql/mysql.sock \
|
||||||
--prefix=/ \
|
--prefix=/ \
|
||||||
--with-extra-charsets=complex \
|
--with-extra-charsets=complex \
|
||||||
|
%if %{YASSL_BUILD}
|
||||||
|
--with-yassl \
|
||||||
|
%endif
|
||||||
--exec-prefix=%{_exec_prefix} \
|
--exec-prefix=%{_exec_prefix} \
|
||||||
--libexecdir=%{_sbindir} \
|
--libexecdir=%{_sbindir} \
|
||||||
--libdir=%{_libdir} \
|
--libdir=%{_libdir} \
|
||||||
@ -684,6 +694,13 @@ fi
|
|||||||
# itself - note that they must be ordered by date (important when
|
# itself - note that they must be ordered by date (important when
|
||||||
# merging BK trees)
|
# merging BK trees)
|
||||||
%changelog
|
%changelog
|
||||||
|
* Wed Oct 19 2005 Kent Boortz <kent@mysql.com>
|
||||||
|
|
||||||
|
- Made yaSSL support an option (off by default)
|
||||||
|
|
||||||
|
* Wed Oct 19 2005 Kent Boortz <kent@mysql.com>
|
||||||
|
|
||||||
|
- Enabled yaSSL support
|
||||||
|
|
||||||
* Sat Oct 15 2005 Kent Boortz <kent@mysql.com>
|
* Sat Oct 15 2005 Kent Boortz <kent@mysql.com>
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user