Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
mariadb
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
mariadb
Commits
30ae0cdc
Commit
30ae0cdc
authored
Apr 28, 2003
by
serg@serg.mylan
Browse files
Options
Browse Files
Download
Plain Diff
Merge bk-internal:/home/bk/mysql-3.23/
into serg.mylan:/usr/home/serg/Abk/mysql
parents
4aa1ec21
f88097ee
Changes
24
Hide whitespace changes
Inline
Side-by-side
Showing
24 changed files
with
128 additions
and
54 deletions
+128
-54
BitKeeper/etc/logging_ok
BitKeeper/etc/logging_ok
+3
-0
client/client_priv.h
client/client_priv.h
+2
-1
client/mysqldump.c
client/mysqldump.c
+17
-8
myisam/mi_dynrec.c
myisam/mi_dynrec.c
+2
-2
mysql-test/r/innodb.result
mysql-test/r/innodb.result
+10
-0
mysql-test/r/join.result
mysql-test/r/join.result
+3
-0
mysql-test/t/innodb.test
mysql-test/t/innodb.test
+11
-0
mysql-test/t/join.test
mysql-test/t/join.test
+14
-0
mysql-test/t/myisam.test
mysql-test/t/myisam.test
+2
-2
mysql-test/t/rpl_alter.test
mysql-test/t/rpl_alter.test
+11
-11
mysys/charset.c
mysys/charset.c
+1
-1
mysys/my_vsnprintf.c
mysys/my_vsnprintf.c
+8
-1
sql/ha_innobase.cc
sql/ha_innobase.cc
+1
-1
sql/ha_myisam.cc
sql/ha_myisam.cc
+1
-1
sql/key.cc
sql/key.cc
+8
-0
sql/log.cc
sql/log.cc
+2
-0
sql/log_event.cc
sql/log_event.cc
+4
-4
sql/log_event.h
sql/log_event.h
+4
-4
sql/mini_client.cc
sql/mini_client.cc
+5
-7
sql/mysqld.cc
sql/mysqld.cc
+7
-3
sql/slave.cc
sql/slave.cc
+4
-7
sql/sql_delete.cc
sql/sql_delete.cc
+4
-1
sql/sql_list.h
sql/sql_list.h
+2
-0
strings/strto.c
strings/strto.c
+2
-0
No files found.
BitKeeper/etc/logging_ok
View file @
30ae0cdc
...
@@ -5,6 +5,7 @@ bar@bar.mysql.r18.ru
...
@@ -5,6 +5,7 @@ bar@bar.mysql.r18.ru
bar@bar.udmsearch.izhnet.ru
bar@bar.udmsearch.izhnet.ru
bell@sanja.is.com.ua
bell@sanja.is.com.ua
bk@admin.bk
bk@admin.bk
guilhem@mysql.com
heikki@donna.mysql.fi
heikki@donna.mysql.fi
heikki@hundin.mysql.fi
heikki@hundin.mysql.fi
jani@hynda.mysql.fi
jani@hynda.mysql.fi
...
@@ -31,8 +32,10 @@ salle@geopard.(none)
...
@@ -31,8 +32,10 @@ salle@geopard.(none)
salle@geopard.online.bg
salle@geopard.online.bg
sasha@mysql.sashanet.com
sasha@mysql.sashanet.com
serg@build.mysql2.com
serg@build.mysql2.com
serg@serg.mylan
serg@serg.mysql.com
serg@serg.mysql.com
serg@sergbook.mysql.com
serg@sergbook.mysql.com
sinisa@rhols221.adsl.netsonic.fi
sinisa@rhols221.adsl.netsonic.fi
vva@eagle.mysql.r18.ru
walrus@mysql.com
walrus@mysql.com
zak@balfor.local
zak@balfor.local
client/client_priv.h
View file @
30ae0cdc
...
@@ -30,4 +30,5 @@ enum options { OPT_CHARSETS_DIR=256, OPT_DEFAULT_CHARSET,
...
@@ -30,4 +30,5 @@ enum options { OPT_CHARSETS_DIR=256, OPT_DEFAULT_CHARSET,
OPT_LOW_PRIORITY
,
OPT_AUTO_REPAIR
,
OPT_COMPRESS
,
OPT_LOW_PRIORITY
,
OPT_AUTO_REPAIR
,
OPT_COMPRESS
,
OPT_DROP
,
OPT_LOCKS
,
OPT_KEYWORDS
,
OPT_DELAYED
,
OPT_OPTIMIZE
,
OPT_DROP
,
OPT_LOCKS
,
OPT_KEYWORDS
,
OPT_DELAYED
,
OPT_OPTIMIZE
,
OPT_FTB
,
OPT_LTB
,
OPT_ENC
,
OPT_O_ENC
,
OPT_ESC
,
OPT_TABLES
,
OPT_FTB
,
OPT_LTB
,
OPT_ENC
,
OPT_O_ENC
,
OPT_ESC
,
OPT_TABLES
,
OPT_MASTER_DATA
,
OPT_AUTOCOMMIT
,
OPT_LOCAL_INFILE
};
OPT_MASTER_DATA
,
OPT_AUTOCOMMIT
,
OPT_LOCAL_INFILE
,
OPT_DELETE_MASTER_LOGS
};
client/mysqldump.c
View file @
30ae0cdc
...
@@ -73,7 +73,8 @@ static my_bool verbose=0,tFlag=0,cFlag=0,dFlag=0,quick=0, extended_insert = 0,
...
@@ -73,7 +73,8 @@ static my_bool verbose=0,tFlag=0,cFlag=0,dFlag=0,quick=0, extended_insert = 0,
ignore
=
0
,
opt_drop
=
0
,
opt_keywords
=
0
,
opt_lock
=
0
,
opt_compress
=
0
,
ignore
=
0
,
opt_drop
=
0
,
opt_keywords
=
0
,
opt_lock
=
0
,
opt_compress
=
0
,
opt_delayed
=
0
,
create_options
=
0
,
opt_quoted
=
0
,
opt_databases
=
0
,
opt_delayed
=
0
,
create_options
=
0
,
opt_quoted
=
0
,
opt_databases
=
0
,
opt_alldbs
=
0
,
opt_create_db
=
0
,
opt_first_slave
=
0
,
opt_alldbs
=
0
,
opt_create_db
=
0
,
opt_first_slave
=
0
,
opt_autocommit
=
0
,
opt_master_data
,
opt_disable_keys
=
0
,
opt_xml
=
0
;
opt_autocommit
=
0
,
opt_master_data
,
opt_disable_keys
=
0
,
opt_xml
=
0
,
opt_delete_master_logs
=
0
;
static
MYSQL
mysql_connection
,
*
sock
=
0
;
static
MYSQL
mysql_connection
,
*
sock
=
0
;
static
char
insert_pat
[
12
*
1024
],
*
opt_password
=
0
,
*
current_user
=
0
,
static
char
insert_pat
[
12
*
1024
],
*
opt_password
=
0
,
*
current_user
=
0
,
*
current_host
=
0
,
*
path
=
0
,
*
fields_terminated
=
0
,
*
current_host
=
0
,
*
path
=
0
,
*
fields_terminated
=
0
,
...
@@ -101,6 +102,7 @@ static struct option long_options[] =
...
@@ -101,6 +102,7 @@ static struct option long_options[] =
{
"debug"
,
optional_argument
,
0
,
'#'
},
{
"debug"
,
optional_argument
,
0
,
'#'
},
{
"default-character-set"
,
required_argument
,
0
,
OPT_DEFAULT_CHARSET
},
{
"default-character-set"
,
required_argument
,
0
,
OPT_DEFAULT_CHARSET
},
{
"delayed-insert"
,
no_argument
,
0
,
OPT_DELAYED
},
{
"delayed-insert"
,
no_argument
,
0
,
OPT_DELAYED
},
{
"delete-master-logs"
,
no_argument
,
0
,
OPT_DELETE_MASTER_LOGS
},
{
"disable-keys"
,
no_argument
,
0
,
'K'
},
{
"disable-keys"
,
no_argument
,
0
,
'K'
},
{
"extended-insert"
,
no_argument
,
0
,
'e'
},
{
"extended-insert"
,
no_argument
,
0
,
'e'
},
{
"fields-terminated-by"
,
required_argument
,
0
,
(
int
)
OPT_FTB
},
{
"fields-terminated-by"
,
required_argument
,
0
,
(
int
)
OPT_FTB
},
...
@@ -206,9 +208,12 @@ static void usage(void)
...
@@ -206,9 +208,12 @@ static void usage(void)
--add-locks Add locks around insert statements.
\n
\
--add-locks Add locks around insert statements.
\n
\
--allow-keywords Allow creation of column names that are keywords.
\n
\
--allow-keywords Allow creation of column names that are keywords.
\n
\
--delayed-insert Insert rows with INSERT DELAYED.
\n
\
--delayed-insert Insert rows with INSERT DELAYED.
\n
\
--delete-master-logs Issue RESET MASTER on the master just after taking
\n
\
the dump, and before unlocking tables.
\n
\
This will automatically enable --first-slave.
\n
\
--master-data This will cause the master position and filename to
\n
\
--master-data This will cause the master position and filename to
\n
\
be appended to your output
. This will automagically
\n
\
be appended to your output
, before unlocking tables.
\n
\
enable --first-slave.
\n
\
This will automatically
enable --first-slave.
\n
\
-F, --flush-logs Flush logs file in server before starting dump.
\n
\
-F, --flush-logs Flush logs file in server before starting dump.
\n
\
-f, --force Continue even if we get an sql-error.
\n
\
-f, --force Continue even if we get an sql-error.
\n
\
-h, --host=... Connect to host.
\n
"
);
-h, --host=... Connect to host.
\n
"
);
...
@@ -317,6 +322,10 @@ static int get_options(int *argc,char ***argv)
...
@@ -317,6 +322,10 @@ static int get_options(int *argc,char ***argv)
opt_master_data
=
1
;
opt_master_data
=
1
;
opt_first_slave
=
1
;
opt_first_slave
=
1
;
break
;
break
;
case
OPT_DELETE_MASTER_LOGS
:
opt_delete_master_logs
=
1
;
opt_first_slave
=
1
;
break
;
case
OPT_AUTOCOMMIT
:
case
OPT_AUTOCOMMIT
:
opt_autocommit
=
1
;
opt_autocommit
=
1
;
break
;
break
;
...
@@ -1489,6 +1498,11 @@ int main(int argc, char **argv)
...
@@ -1489,6 +1498,11 @@ int main(int argc, char **argv)
if
(
opt_first_slave
)
if
(
opt_first_slave
)
{
{
if
(
opt_delete_master_logs
&&
mysql_query
(
sock
,
"FLUSH MASTER"
))
{
my_printf_error
(
0
,
"Error: Couldn't execute 'FLUSH MASTER': %s"
,
MYF
(
0
),
mysql_error
(
sock
));
}
if
(
opt_master_data
)
if
(
opt_master_data
)
{
{
if
(
mysql_query
(
sock
,
"SHOW MASTER STATUS"
)
||
if
(
mysql_query
(
sock
,
"SHOW MASTER STATUS"
)
||
...
@@ -1511,11 +1525,6 @@ int main(int argc, char **argv)
...
@@ -1511,11 +1525,6 @@ int main(int argc, char **argv)
mysql_free_result
(
master
);
mysql_free_result
(
master
);
}
}
}
}
if
(
mysql_query
(
sock
,
"FLUSH MASTER"
))
{
my_printf_error
(
0
,
"Error: Couldn't execute 'FLUSH MASTER': %s"
,
MYF
(
0
),
mysql_error
(
sock
));
}
if
(
mysql_query
(
sock
,
"UNLOCK TABLES"
))
if
(
mysql_query
(
sock
,
"UNLOCK TABLES"
))
{
{
my_printf_error
(
0
,
"Error: Couldn't execute 'UNLOCK TABLES': %s"
,
my_printf_error
(
0
,
"Error: Couldn't execute 'UNLOCK TABLES': %s"
,
...
...
myisam/mi_dynrec.c
View file @
30ae0cdc
...
@@ -62,8 +62,8 @@ int _mi_write_blob_record(MI_INFO *info, const byte *record)
...
@@ -62,8 +62,8 @@ int _mi_write_blob_record(MI_INFO *info, const byte *record)
extra
=
ALIGN_SIZE
(
MI_MAX_DYN_BLOCK_HEADER
)
+
MI_SPLIT_LENGTH
+
extra
=
ALIGN_SIZE
(
MI_MAX_DYN_BLOCK_HEADER
)
+
MI_SPLIT_LENGTH
+
MI_DYN_DELETE_BLOCK_HEADER
+
1
;
MI_DYN_DELETE_BLOCK_HEADER
+
1
;
reclength
=
info
->
s
->
base
.
pack_reclength
+
reclength
=
(
info
->
s
->
base
.
pack_reclength
+
info
->
s
->
base
.
pack_bits
+
_my_calc_total_blob_length
(
info
,
record
)
+
extra
;
_my_calc_total_blob_length
(
info
,
record
)
+
extra
)
;
if
(
reclength
>
MI_DYN_MAX_ROW_LENGTH
)
if
(
reclength
>
MI_DYN_MAX_ROW_LENGTH
)
{
{
my_errno
=
HA_ERR_TO_BIG_ROW
;
my_errno
=
HA_ERR_TO_BIG_ROW
;
...
...
mysql-test/r/innodb.result
View file @
30ae0cdc
...
@@ -501,3 +501,13 @@ table type possible_keys key key_len ref rows Extra
...
@@ -501,3 +501,13 @@ table type possible_keys key key_len ref rows Extra
t1 ALL NULL NULL NULL NULL 4
t1 ALL NULL NULL NULL NULL 4
Field Type Null Key Default Extra
Field Type Null Key Default Extra
testint int(11) 1
testint int(11) 1
a b
1 1
102 2
103 3
4 4
5 5
6 6
7 7
8 8
9 9
mysql-test/r/join.result
View file @
30ae0cdc
...
@@ -41,3 +41,6 @@ rate_code base_rate
...
@@ -41,3 +41,6 @@ rate_code base_rate
cust 20
cust 20
rate_code base_rate
rate_code base_rate
cust 20
cust 20
ID Value1 ID Value2
ID Value1 ID Value2
ID Value1 ID Value2
mysql-test/t/innodb.test
View file @
30ae0cdc
...
@@ -537,3 +537,14 @@ drop table t1;
...
@@ -537,3 +537,14 @@ drop table t1;
create
table
t1
(
testint
int
not
null
default
1
)
type
=
innodb
;
create
table
t1
(
testint
int
not
null
default
1
)
type
=
innodb
;
desc
t1
;
desc
t1
;
drop
table
t1
;
drop
table
t1
;
#
# Check update with conflicting key
#
CREATE
TABLE
t1
(
a
int
not
null
primary
key
,
b
int
not
null
,
unique
(
b
))
type
=
innodb
;
INSERT
INTO
t1
values
(
1
,
1
),(
2
,
2
),(
3
,
3
),(
4
,
4
),(
5
,
5
),(
6
,
6
),(
7
,
7
),(
8
,
8
),(
9
,
9
);
# We need the a < 1000 test here to quard against the halloween problems
UPDATE
t1
set
a
=
a
+
100
where
b
between
2
and
3
and
a
<
1000
;
SELECT
*
from
t1
;
drop
table
t1
;
mysql-test/t/join.test
View file @
30ae0cdc
...
@@ -243,3 +243,17 @@ INSERT INTO t2 VALUES ('rivercats','cust',20);
...
@@ -243,3 +243,17 @@ INSERT INTO t2 VALUES ('rivercats','cust',20);
SELECT
emp
.
rate_code
,
lr
.
base_rate
FROM
t1
AS
emp
LEFT
JOIN
t2
AS
lr
USING
(
siteid
,
rate_code
)
WHERE
emp
.
emp_id
=
'psmith'
AND
lr
.
siteid
=
'rivercats'
;
SELECT
emp
.
rate_code
,
lr
.
base_rate
FROM
t1
AS
emp
LEFT
JOIN
t2
AS
lr
USING
(
siteid
,
rate_code
)
WHERE
emp
.
emp_id
=
'psmith'
AND
lr
.
siteid
=
'rivercats'
;
SELECT
emp
.
rate_code
,
lr
.
base_rate
FROM
t1
AS
emp
LEFT
JOIN
t2
AS
lr
USING
(
siteid
,
rate_code
)
WHERE
lr
.
siteid
=
'rivercats'
AND
emp
.
emp_id
=
'psmith'
;
SELECT
emp
.
rate_code
,
lr
.
base_rate
FROM
t1
AS
emp
LEFT
JOIN
t2
AS
lr
USING
(
siteid
,
rate_code
)
WHERE
lr
.
siteid
=
'rivercats'
AND
emp
.
emp_id
=
'psmith'
;
drop
table
t1
,
t2
;
drop
table
t1
,
t2
;
#
# Problem with internal list handling when reducing WHERE
#
CREATE
TABLE
t1
(
ID
INTEGER
NOT
NULL
PRIMARY
KEY
,
Value1
VARCHAR
(
255
));
CREATE
TABLE
t2
(
ID
INTEGER
NOT
NULL
PRIMARY
KEY
,
Value2
VARCHAR
(
255
));
INSERT
INTO
t1
VALUES
(
1
,
'A'
);
INSERT
INTO
t2
VALUES
(
1
,
'B'
);
SELECT
*
FROM
t1
NATURAL
JOIN
t2
WHERE
1
AND
(
Value1
=
'A'
AND
Value2
<>
'B'
);
SELECT
*
FROM
t1
NATURAL
JOIN
t2
WHERE
1
AND
Value1
=
'A'
AND
Value2
<>
'B'
;
SELECT
*
FROM
t1
NATURAL
JOIN
t2
WHERE
(
Value1
=
'A'
AND
Value2
<>
'B'
)
AND
1
;
drop
table
t1
,
t2
;
mysql-test/t/myisam.test
View file @
30ae0cdc
...
@@ -244,7 +244,7 @@ int, i967 int, i968 int, i969 int, i970 int, i971 int, i972 int, i973 int, i974
...
@@ -244,7 +244,7 @@ int, i967 int, i968 int, i969 int, i970 int, i971 int, i972 int, i973 int, i974
int
,
i975
int
,
i976
int
,
i977
int
,
i978
int
,
i979
int
,
i980
int
,
i981
int
,
i982
int
,
i975
int
,
i976
int
,
i977
int
,
i978
int
,
i979
int
,
i980
int
,
i981
int
,
i982
int
,
i983
int
,
i984
int
,
i985
int
,
i986
int
,
i987
int
,
i988
int
,
i989
int
,
i990
int
,
i983
int
,
i984
int
,
i985
int
,
i986
int
,
i987
int
,
i988
int
,
i989
int
,
i990
int
,
i991
int
,
i992
int
,
i993
int
,
i994
int
,
i995
int
,
i996
int
,
i997
int
,
i998
int
,
i991
int
,
i992
int
,
i993
int
,
i994
int
,
i995
int
,
i996
int
,
i997
int
,
i998
int
,
i999
int
,
i1000
int
)
row_format
=
dynamic
;
int
,
i999
int
,
i1000
int
,
b
blob
)
row_format
=
dynamic
;
insert
into
t1
values
(
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
insert
into
t1
values
(
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
...
@@ -283,6 +283,6 @@ insert into t1 values (1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
...
@@ -283,6 +283,6 @@ insert into t1 values (1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
);
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
"Sergei"
);
drop
table
if
exists
t1
;
drop
table
if
exists
t1
;
mysql-test/t/rpl_alter.test
View file @
30ae0cdc
source
include
/
master
-
slave
.
inc
;
source
include
/
master
-
slave
.
inc
;
connection
master
;
connection
master
;
use
test
;
use
test
;
drop
database
if
exists
d
1
;
drop
database
if
exists
test_
$
1
;
create
database
d
1
;
create
database
test_
$
1
;
create
table
d
1
.
t1
(
n
int
);
create
table
test_
$
1.
t1
(
n
int
);
alter
table
d
1
.
t1
add
m
int
;
alter
table
test_
$
1.
t1
add
m
int
;
insert
into
d
1
.
t1
values
(
1
,
2
);
insert
into
test_
$
1.
t1
values
(
1
,
2
);
create
table
d
1
.
t2
(
n
int
);
create
table
test_
$
1.
t2
(
n
int
);
insert
into
d
1
.
t2
values
(
45
);
insert
into
test_
$
1.
t2
values
(
45
);
rename
table
d1
.
t2
to
d1
.
t3
,
d1
.
t1
to
d
1
.
t2
;
rename
table
test_
$
1.
t2
to
test_
$
1.
t3
,
test_
$
1.
t1
to
test_
$
1.
t2
;
save_master_pos
;
save_master_pos
;
connection
slave
;
connection
slave
;
sync_with_master
;
sync_with_master
;
select
*
from
d
1
.
t2
;
select
*
from
test_
$
1.
t2
;
select
*
from
d
1
.
t3
;
select
*
from
test_
$
1.
t3
;
connection
master
;
connection
master
;
drop
database
d
1
;
drop
database
test_
$
1
;
save_master_pos
;
save_master_pos
;
connection
slave
;
connection
slave
;
sync_with_master
;
sync_with_master
;
mysys/charset.c
View file @
30ae0cdc
...
@@ -85,7 +85,7 @@ static my_bool get_word(struct simpleconfig_buf_st *fb, char *buf)
...
@@ -85,7 +85,7 @@ static my_bool get_word(struct simpleconfig_buf_st *fb, char *buf)
endptr
=
fb
->
buf
;
endptr
=
fb
->
buf
;
}
}
while
(
!
isspace
(
*
endptr
))
while
(
*
endptr
&&
!
isspace
(
*
endptr
))
*
buf
++=
*
endptr
++
;
*
buf
++=
*
endptr
++
;
*
buf
=
0
;
*
buf
=
0
;
fb
->
p
=
endptr
;
fb
->
p
=
endptr
;
...
...
mysys/my_vsnprintf.c
View file @
30ae0cdc
...
@@ -21,13 +21,18 @@
...
@@ -21,13 +21,18 @@
#include <stdarg.h>
#include <stdarg.h>
#include <m_ctype.h>
#include <m_ctype.h>
int
my_snprintf
(
char
*
to
,
size_t
n
,
const
char
*
fmt
,
...)
int
my_snprintf
(
char
*
to
,
size_t
n
,
const
char
*
fmt
,
...)
{
{
int
result
;
va_list
args
;
va_list
args
;
va_start
(
args
,
fmt
);
va_start
(
args
,
fmt
);
return
my_vsnprintf
(
to
,
n
,
fmt
,
args
);
result
=
my_vsnprintf
(
to
,
n
,
fmt
,
args
);
va_end
(
args
);
return
result
;
}
}
int
my_vsnprintf
(
char
*
to
,
size_t
n
,
const
char
*
fmt
,
va_list
ap
)
int
my_vsnprintf
(
char
*
to
,
size_t
n
,
const
char
*
fmt
,
va_list
ap
)
{
{
char
*
start
=
to
,
*
end
=
to
+
n
-
1
;
char
*
start
=
to
,
*
end
=
to
+
n
-
1
;
...
@@ -79,6 +84,7 @@ int my_vsnprintf(char *to, size_t n, const char* fmt, va_list ap)
...
@@ -79,6 +84,7 @@ int my_vsnprintf(char *to, size_t n, const char* fmt, va_list ap)
return
(
uint
)
(
to
-
start
);
return
(
uint
)
(
to
-
start
);
}
}
#ifdef MAIN
#ifdef MAIN
static
void
my_printf
(
const
char
*
fmt
,
...)
static
void
my_printf
(
const
char
*
fmt
,
...)
{
{
...
@@ -92,6 +98,7 @@ static void my_printf(const char * fmt, ...)
...
@@ -92,6 +98,7 @@ static void my_printf(const char * fmt, ...)
va_end
(
ar
);
va_end
(
ar
);
}
}
int
main
()
int
main
()
{
{
...
...
sql/ha_innobase.cc
View file @
30ae0cdc
...
@@ -113,7 +113,7 @@ my_bool innobase_fast_shutdown = TRUE;
...
@@ -113,7 +113,7 @@ my_bool innobase_fast_shutdown = TRUE;
2 : write to the log file at each commit, but flush to disk only once per
2 : write to the log file at each commit, but flush to disk only once per
second */
second */
long
innobase_flush_log_at_trx_commit
=
0
;
long
innobase_flush_log_at_trx_commit
=
1
;
/* The following counter is used to convey information to InnoDB
/* The following counter is used to convey information to InnoDB
about server activity: in selects it is not sensible to call
about server activity: in selects it is not sensible to call
...
...
sql/ha_myisam.cc
View file @
30ae0cdc
...
@@ -953,7 +953,7 @@ int ha_myisam::create(const char *name, register TABLE *form,
...
@@ -953,7 +953,7 @@ int ha_myisam::create(const char *name, register TABLE *form,
&
keydef
,
form
->
keys
*
sizeof
(
MI_KEYDEF
),
&
keydef
,
form
->
keys
*
sizeof
(
MI_KEYDEF
),
&
keyseg
,
&
keyseg
,
((
form
->
key_parts
+
form
->
keys
)
*
sizeof
(
MI_KEYSEG
)),
((
form
->
key_parts
+
form
->
keys
)
*
sizeof
(
MI_KEYSEG
)),
0
)))
NullS
)))
DBUG_RETURN
(
1
);
DBUG_RETURN
(
1
);
pos
=
form
->
key_info
;
pos
=
form
->
key_info
;
...
...
sql/key.cc
View file @
30ae0cdc
...
@@ -269,5 +269,13 @@ bool check_if_key_used(TABLE *table, uint idx, List<Item> &fields)
...
@@ -269,5 +269,13 @@ bool check_if_key_used(TABLE *table, uint idx, List<Item> &fields)
return
1
;
return
1
;
}
}
}
}
/*
If table handler has primary key as part of the index, check that primary
key is not updated
*/
if
(
idx
!=
table
->
primary_key
&&
table
->
primary_key
<
MAX_KEY
&&
(
table
->
file
->
option_flag
()
&
HA_PRIMARY_KEY_IN_READ_INDEX
))
return
check_if_key_used
(
table
,
table
->
primary_key
,
fields
);
return
0
;
return
0
;
}
}
sql/log.cc
View file @
30ae0cdc
...
@@ -1067,6 +1067,8 @@ void sql_print_error(const char *format,...)
...
@@ -1067,6 +1067,8 @@ void sql_print_error(const char *format,...)
char
buff
[
1024
];
char
buff
[
1024
];
my_vsnprintf
(
buff
,
sizeof
(
buff
)
-
1
,
format
,
args
);
my_vsnprintf
(
buff
,
sizeof
(
buff
)
-
1
,
format
,
args
);
DBUG_PRINT
(
"error"
,(
"%s"
,
buff
));
DBUG_PRINT
(
"error"
,(
"%s"
,
buff
));
va_end
(
args
);
va_start
(
args
,
format
);
}
}
#endif
#endif
skr
=
time
(
NULL
);
skr
=
time
(
NULL
);
...
...
sql/log_event.cc
View file @
30ae0cdc
...
@@ -304,7 +304,7 @@ void Start_log_event::print(FILE* file, bool short_form, char* last_db)
...
@@ -304,7 +304,7 @@ void Start_log_event::print(FILE* file, bool short_form, char* last_db)
print_header
(
file
);
print_header
(
file
);
fprintf
(
file
,
"
\t
Start: binlog v %d, server v %s created "
,
binlog_version
,
fprintf
(
file
,
"
\t
Start: binlog v %d, server v %s created "
,
binlog_version
,
server_version
);
server_version
);
print_timestamp
(
file
,
(
time_t
*
)
&
created
);
print_timestamp
(
file
,
&
created
);
fputc
(
'\n'
,
file
);
fputc
(
'\n'
,
file
);
fflush
(
file
);
fflush
(
file
);
}
}
...
@@ -671,9 +671,9 @@ void Load_log_event::print(FILE* file, bool short_form, char* last_db)
...
@@ -671,9 +671,9 @@ void Load_log_event::print(FILE* file, bool short_form, char* last_db)
fprintf
(
file
,
"LOAD DATA INFILE '%s' "
,
fname
);
fprintf
(
file
,
"LOAD DATA INFILE '%s' "
,
fname
);
if
(
sql_ex
.
opt_flags
&
&
REPLACE_FLAG
)
if
(
sql_ex
.
opt_flags
&
REPLACE_FLAG
)
fprintf
(
file
,
" REPLACE "
);
fprintf
(
file
,
" REPLACE "
);
else
if
(
sql_ex
.
opt_flags
&
&
IGNORE_FLAG
)
else
if
(
sql_ex
.
opt_flags
&
IGNORE_FLAG
)
fprintf
(
file
,
" IGNORE "
);
fprintf
(
file
,
" IGNORE "
);
fprintf
(
file
,
"INTO TABLE %s "
,
table_name
);
fprintf
(
file
,
"INTO TABLE %s "
,
table_name
);
...
@@ -685,7 +685,7 @@ void Load_log_event::print(FILE* file, bool short_form, char* last_db)
...
@@ -685,7 +685,7 @@ void Load_log_event::print(FILE* file, bool short_form, char* last_db)
if
(
!
(
sql_ex
.
empty_flags
&
ENCLOSED_EMPTY
))
if
(
!
(
sql_ex
.
empty_flags
&
ENCLOSED_EMPTY
))
{
{
if
(
sql_ex
.
opt_flags
&
&
OPT_ENCLOSED_FLAG
)
if
(
sql_ex
.
opt_flags
&
OPT_ENCLOSED_FLAG
)
fprintf
(
file
,
" OPTIONALLY "
);
fprintf
(
file
,
" OPTIONALLY "
);
fprintf
(
file
,
" ENCLOSED BY "
);
fprintf
(
file
,
" ENCLOSED BY "
);
pretty_print_char
(
file
,
sql_ex
.
enclosed
);
pretty_print_char
(
file
,
sql_ex
.
enclosed
);
...
...
sql/log_event.h
View file @
30ae0cdc
...
@@ -327,13 +327,13 @@ extern char server_version[SERVER_VERSION_LENGTH];
...
@@ -327,13 +327,13 @@ extern char server_version[SERVER_VERSION_LENGTH];
class
Start_log_event
:
public
Log_event
class
Start_log_event
:
public
Log_event
{
{
public:
public:
uint32
created
;
time_t
created
;
uint16
binlog_version
;
uint16
binlog_version
;
char
server_version
[
50
];
char
server_version
[
50
];
Start_log_event
()
:
Log_event
(
time
(
NULL
)),
binlog_version
(
BINLOG_VERSION
)
Start_log_event
()
:
Log_event
(
time
(
NULL
)),
binlog_version
(
BINLOG_VERSION
)
{
{
created
=
(
uint32
)
when
;
created
=
(
time_t
)
when
;
memcpy
(
server_version
,
::
server_version
,
sizeof
(
server_version
));
memcpy
(
server_version
,
::
server_version
,
sizeof
(
server_version
));
}
}
Start_log_event
(
IO_CACHE
*
file
,
time_t
when_arg
,
uint32
server_id_arg
)
:
Start_log_event
(
IO_CACHE
*
file
,
time_t
when_arg
,
uint32
server_id_arg
)
:
...
@@ -345,7 +345,7 @@ public:
...
@@ -345,7 +345,7 @@ public:
binlog_version
=
uint2korr
(
buf
+
4
);
binlog_version
=
uint2korr
(
buf
+
4
);
memcpy
(
server_version
,
buf
+
6
,
sizeof
(
server_version
));
memcpy
(
server_version
,
buf
+
6
,
sizeof
(
server_version
));
server_version
[
sizeof
(
server_version
)
-
1
]
=
0
;
server_version
[
sizeof
(
server_version
)
-
1
]
=
0
;
created
=
uint4korr
(
buf
+
6
+
sizeof
(
server_version
));
created
=
(
time_t
)
uint4korr
(
buf
+
6
+
sizeof
(
server_version
));
}
}
Start_log_event
(
const
char
*
buf
);
Start_log_event
(
const
char
*
buf
);
...
@@ -354,7 +354,7 @@ public:
...
@@ -354,7 +354,7 @@ public:
int
write_data
(
IO_CACHE
*
file
);
int
write_data
(
IO_CACHE
*
file
);
int
get_data_size
()
int
get_data_size
()
{
{
// size
of(binlog_version) + sizeof(server_version) sizeof
(created)
// size
(binlog_version) + sizeof(server_version) + size
(created)
return
2
+
sizeof
(
server_version
)
+
4
;
return
2
+
sizeof
(
server_version
)
+
4
;
}
}
void
print
(
FILE
*
file
,
bool
short_form
=
0
,
char
*
last_db
=
0
);
void
print
(
FILE
*
file
,
bool
short_form
=
0
,
char
*
last_db
=
0
);
...
...
sql/mini_client.cc
View file @
30ae0cdc
...
@@ -515,8 +515,6 @@ mc_mysql_connect(MYSQL *mysql,const char *host, const char *user,
...
@@ -515,8 +515,6 @@ mc_mysql_connect(MYSQL *mysql,const char *host, const char *user,
host
?
host
:
"(Null)"
,
host
?
host
:
"(Null)"
,
db
?
db
:
"(Null)"
,
db
?
db
:
"(Null)"
,
user
?
user
:
"(Null)"
));
user
?
user
:
"(Null)"
));
thr_alarm_init
(
&
alarmed
);
thr_alarm
(
&
alarmed
,(
uint
)
net_read_timeout
,
&
alarm_buff
);
bzero
((
char
*
)
&
mysql
->
options
,
sizeof
(
mysql
->
options
));
bzero
((
char
*
)
&
mysql
->
options
,
sizeof
(
mysql
->
options
));
net
->
vio
=
0
;
/* If something goes wrong */
net
->
vio
=
0
;
/* If something goes wrong */
...
@@ -598,7 +596,11 @@ mc_mysql_connect(MYSQL *mysql,const char *host, const char *user,
...
@@ -598,7 +596,11 @@ mc_mysql_connect(MYSQL *mysql,const char *host, const char *user,
host
=
LOCAL_HOST
;
host
=
LOCAL_HOST
;
sprintf
(
host_info
=
buff
,
ER
(
CR_TCP_CONNECTION
),
host
);
sprintf
(
host_info
=
buff
,
ER
(
CR_TCP_CONNECTION
),
host
);
DBUG_PRINT
(
"info"
,(
"Server name: '%s'. TCP sock: %d"
,
host
,
port
));
DBUG_PRINT
(
"info"
,(
"Server name: '%s'. TCP sock: %d"
,
host
,
port
));
if
((
sock
=
socket
(
AF_INET
,
SOCK_STREAM
,
0
))
==
SOCKET_ERROR
)
thr_alarm_init
(
&
alarmed
);
thr_alarm
(
&
alarmed
,
net_read_timeout
,
&
alarm_buff
);
sock
=
(
my_socket
)
socket
(
AF_INET
,
SOCK_STREAM
,
0
);
thr_end_alarm
(
&
alarmed
);
if
(
sock
==
SOCKET_ERROR
)
{
{
net
->
last_errno
=
CR_IPSOCK_ERROR
;
net
->
last_errno
=
CR_IPSOCK_ERROR
;
sprintf
(
net
->
last_error
,
ER
(
net
->
last_errno
),
socket_errno
);
sprintf
(
net
->
last_error
,
ER
(
net
->
last_errno
),
socket_errno
);
...
@@ -641,12 +643,8 @@ mc_mysql_connect(MYSQL *mysql,const char *host, const char *user,
...
@@ -641,12 +643,8 @@ mc_mysql_connect(MYSQL *mysql,const char *host, const char *user,
socket_errno
,
host
));
socket_errno
,
host
));
net
->
last_errno
=
CR_CONN_HOST_ERROR
;
net
->
last_errno
=
CR_CONN_HOST_ERROR
;
sprintf
(
net
->
last_error
,
ER
(
CR_CONN_HOST_ERROR
),
host
,
socket_errno
);
sprintf
(
net
->
last_error
,
ER
(
CR_CONN_HOST_ERROR
),
host
,
socket_errno
);
if
(
thr_alarm_in_use
(
&
alarmed
))
thr_end_alarm
(
&
alarmed
);
goto
error
;
goto
error
;
}
}
if
(
thr_alarm_in_use
(
&
alarmed
))
thr_end_alarm
(
&
alarmed
);
}
}
if
(
!
net
->
vio
||
my_net_init
(
net
,
net
->
vio
))
if
(
!
net
->
vio
||
my_net_init
(
net
,
net
->
vio
))
...
...
sql/mysqld.cc
View file @
30ae0cdc
...
@@ -785,7 +785,7 @@ void clean_up(bool print_message)
...
@@ -785,7 +785,7 @@ void clean_up(bool print_message)
if
(
!
opt_bootstrap
)
if
(
!
opt_bootstrap
)
(
void
)
my_delete
(
pidfile_name
,
MYF
(
0
));
// This may not always exist
(
void
)
my_delete
(
pidfile_name
,
MYF
(
0
));
// This may not always exist
#endif
#endif
if
(
print_message
)
if
(
print_message
&&
errmesg
)
sql_print_error
(
ER
(
ER_SHUTDOWN_COMPLETE
),
my_progname
);
sql_print_error
(
ER
(
ER_SHUTDOWN_COMPLETE
),
my_progname
);
x_free
((
gptr
)
my_errmsg
[
ERRMAPP
]);
/* Free messages */
x_free
((
gptr
)
my_errmsg
[
ERRMAPP
]);
/* Free messages */
my_thread_end
();
my_thread_end
();
...
@@ -1433,8 +1433,12 @@ static void *signal_hand(void *arg __attribute__((unused)))
...
@@ -1433,8 +1433,12 @@ static void *signal_hand(void *arg __attribute__((unused)))
my_thread_init
();
// Init new thread
my_thread_init
();
// Init new thread
DBUG_ENTER
(
"signal_hand"
);
DBUG_ENTER
(
"signal_hand"
);
/* Setup alarm handler */
/*
init_thr_alarm
(
max_connections
+
max_insert_delayed_threads
);
Setup alarm handler
This should actually be '+ max_number_of_slaves' instead of +10,
but the +10 should be quite safe.
*/
init_thr_alarm
(
max_connections
+
max_insert_delayed_threads
+
10
);
#if SIGINT != THR_KILL_SIGNAL
#if SIGINT != THR_KILL_SIGNAL
(
void
)
sigemptyset
(
&
set
);
// Setup up SIGINT for debug
(
void
)
sigemptyset
(
&
set
);
// Setup up SIGINT for debug
(
void
)
sigaddset
(
&
set
,
SIGINT
);
// For debugging
(
void
)
sigaddset
(
&
set
,
SIGINT
);
// For debugging
...
...
sql/slave.cc
View file @
30ae0cdc
...
@@ -784,10 +784,7 @@ static int safe_sleep(THD* thd, int sec)
...
@@ -784,10 +784,7 @@ static int safe_sleep(THD* thd, int sec)
*/
*/
thr_alarm
(
&
alarmed
,
2
*
nap_time
,
&
alarm_buff
);
thr_alarm
(
&
alarmed
,
2
*
nap_time
,
&
alarm_buff
);
sleep
(
nap_time
);
sleep
(
nap_time
);
// if we wake up before the alarm goes off, hit the button
thr_end_alarm
(
&
alarmed
);
// so it will not wake up the wife and kids :-)
if
(
thr_alarm_in_use
(
&
alarmed
))
thr_end_alarm
(
&
alarmed
);
if
(
slave_killed
(
thd
))
if
(
slave_killed
(
thd
))
return
1
;
return
1
;
...
@@ -1100,9 +1097,9 @@ static int exec_event(THD* thd, NET* net, MASTER_INFO* mi, int event_len)
...
@@ -1100,9 +1097,9 @@ static int exec_event(THD* thd, NET* net, MASTER_INFO* mi, int event_len)
else
else
{
{
enum
enum_duplicates
handle_dup
=
DUP_IGNORE
;
enum
enum_duplicates
handle_dup
=
DUP_IGNORE
;
if
(
lev
->
sql_ex
.
opt_flags
&
&
REPLACE_FLAG
)
if
(
lev
->
sql_ex
.
opt_flags
&
REPLACE_FLAG
)
handle_dup
=
DUP_REPLACE
;
handle_dup
=
DUP_REPLACE
;
sql_exchange
ex
((
char
*
)
lev
->
fname
,
lev
->
sql_ex
.
opt_flags
&
&
sql_exchange
ex
((
char
*
)
lev
->
fname
,
lev
->
sql_ex
.
opt_flags
&
DUMPFILE_FLAG
);
DUMPFILE_FLAG
);
String
field_term
(
&
lev
->
sql_ex
.
field_term
,
1
),
String
field_term
(
&
lev
->
sql_ex
.
field_term
,
1
),
enclosed
(
&
lev
->
sql_ex
.
enclosed
,
1
),
enclosed
(
&
lev
->
sql_ex
.
enclosed
,
1
),
...
@@ -1139,7 +1136,7 @@ static int exec_event(THD* thd, NET* net, MASTER_INFO* mi, int event_len)
...
@@ -1139,7 +1136,7 @@ static int exec_event(THD* thd, NET* net, MASTER_INFO* mi, int event_len)
List
<
Item
>
fields
;
List
<
Item
>
fields
;
lev
->
set_fields
(
fields
);
lev
->
set_fields
(
fields
);
thd
->
slave_proxy_id
=
th
d
->
th
read_id
;
thd
->
slave_proxy_id
=
thread_id
;
thd
->
net
.
vio
=
net
->
vio
;
thd
->
net
.
vio
=
net
->
vio
;
// mysql_load will use thd->net to read the file
// mysql_load will use thd->net to read the file
thd
->
net
.
pkt_nr
=
net
->
pkt_nr
;
thd
->
net
.
pkt_nr
=
net
->
pkt_nr
;
...
...
sql/sql_delete.cc
View file @
30ae0cdc
...
@@ -30,6 +30,7 @@ int generate_table(THD *thd, TABLE_LIST *table_list, TABLE *locked_table)
...
@@ -30,6 +30,7 @@ int generate_table(THD *thd, TABLE_LIST *table_list, TABLE *locked_table)
char
path
[
FN_REFLEN
];
char
path
[
FN_REFLEN
];
int
error
;
int
error
;
TABLE
**
table_ptr
;
TABLE
**
table_ptr
;
my_bool
lock_open_locked
=
0
;
DBUG_ENTER
(
"generate_table"
);
DBUG_ENTER
(
"generate_table"
);
thd
->
proc_info
=
"generate_table"
;
thd
->
proc_info
=
"generate_table"
;
...
@@ -102,7 +103,7 @@ int generate_table(THD *thd, TABLE_LIST *table_list, TABLE *locked_table)
...
@@ -102,7 +103,7 @@ int generate_table(THD *thd, TABLE_LIST *table_list, TABLE *locked_table)
error
=
ha_create_table
(
path
,
&
create_info
,
1
)
?
-
1
:
0
;
error
=
ha_create_table
(
path
,
&
create_info
,
1
)
?
-
1
:
0
;
if
(
thd
->
locked_tables
&&
reopen_tables
(
thd
,
1
,
0
))
if
(
thd
->
locked_tables
&&
reopen_tables
(
thd
,
1
,
0
))
error
=
-
1
;
error
=
-
1
;
VOID
(
pthread_mutex_unlock
(
&
LOCK_open
));
lock_open_locked
=
1
;
// Unlock mutex before return
}
}
if
(
!
error
)
if
(
!
error
)
{
{
...
@@ -114,6 +115,8 @@ int generate_table(THD *thd, TABLE_LIST *table_list, TABLE *locked_table)
...
@@ -114,6 +115,8 @@ int generate_table(THD *thd, TABLE_LIST *table_list, TABLE *locked_table)
}
}
send_ok
(
&
thd
->
net
);
// This should return record count
send_ok
(
&
thd
->
net
);
// This should return record count
}
}
if
(
lock_open_locked
)
VOID
(
pthread_mutex_unlock
(
&
LOCK_open
));
DBUG_RETURN
(
error
?
-
1
:
0
);
DBUG_RETURN
(
error
?
-
1
:
0
);
}
}
...
...
sql/sql_list.h
View file @
30ae0cdc
...
@@ -160,6 +160,8 @@ public:
...
@@ -160,6 +160,8 @@ public:
*
new_list
.
last
=
current
->
next
;
*
new_list
.
last
=
current
->
next
;
current
->
info
=
new_list
.
first
->
info
;
current
->
info
=
new_list
.
first
->
info
;
current
->
next
=
new_list
.
first
->
next
;
current
->
next
=
new_list
.
first
->
next
;
if
(
list
->
last
==
&
current
->
next
&&
new_list
.
elements
>
1
)
list
->
last
=
new_list
.
last
;
list
->
elements
+=
new_list
.
elements
-
1
;
list
->
elements
+=
new_list
.
elements
-
1
;
}
}
return
ret_value
;
// return old element
return
ret_value
;
// return old element
...
...
strings/strto.c
View file @
30ae0cdc
...
@@ -36,6 +36,8 @@
...
@@ -36,6 +36,8 @@
it can be compiled with the UNSIGNED and/or LONGLONG flag set
it can be compiled with the UNSIGNED and/or LONGLONG flag set
*/
*/
#define strtoll glob_strtoll
/* Fix for True64 */
#include <global.h>
#include <global.h>
#include "m_string.h"
#include "m_string.h"
#include "m_ctype.h"
#include "m_ctype.h"
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment