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
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
nexedi
MariaDB
Commits
a032a28d
Commit
a032a28d
authored
Apr 12, 2006
by
unknown
Browse files
Options
Browse Files
Download
Plain Diff
Merge bk-internal:/home/bk/mysql-5.1-new
into neptunus.(none):/home/msvensson/mysql/mysql-5.1
parents
60f5cf7b
b711579f
Changes
19
Hide whitespace changes
Inline
Side-by-side
Showing
19 changed files
with
238 additions
and
45 deletions
+238
-45
mysql-test/r/partition.result
mysql-test/r/partition.result
+17
-0
mysql-test/r/partition_grant.result
mysql-test/r/partition_grant.result
+23
-0
mysql-test/t/insert.test
mysql-test/t/insert.test
+1
-0
mysql-test/t/partition.test
mysql-test/t/partition.test
+24
-0
mysql-test/t/partition_grant.test
mysql-test/t/partition_grant.test
+51
-0
sql/ha_ndbcluster.cc
sql/ha_ndbcluster.cc
+26
-12
sql/ha_ndbcluster.h
sql/ha_ndbcluster.h
+2
-1
sql/ha_partition.cc
sql/ha_partition.cc
+3
-1
sql/ha_partition.h
sql/ha_partition.h
+2
-1
sql/handler.h
sql/handler.h
+3
-1
sql/partition_info.cc
sql/partition_info.cc
+12
-0
sql/share/errmsg.txt
sql/share/errmsg.txt
+3
-0
sql/sql_parse.cc
sql/sql_parse.cc
+7
-2
sql/sql_partition.cc
sql/sql_partition.cc
+17
-2
sql/sql_show.cc
sql/sql_show.cc
+5
-0
sql/sql_table.cc
sql/sql_table.cc
+16
-16
sql/sql_yacc.yy
sql/sql_yacc.yy
+1
-1
sql/unireg.cc
sql/unireg.cc
+1
-1
storage/ndb/tools/listTables.cpp
storage/ndb/tools/listTables.cpp
+24
-7
No files found.
mysql-test/r/partition.result
View file @
a032a28d
...
@@ -839,6 +839,23 @@ SHOW TABLE STATUS;
...
@@ -839,6 +839,23 @@ SHOW TABLE STATUS;
Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment
Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment
t1 MyISAM 10 Dynamic 0 0 0 0 0 0 NULL NULL NULL NULL latin1_swedish_ci NULL partitioned
t1 MyISAM 10 Dynamic 0 0 0 0 0 0 NULL NULL NULL NULL latin1_swedish_ci NULL partitioned
DROP TABLE t1;
DROP TABLE t1;
create table t1 (a int)
partition by list (a)
(partition `s1 s2` values in (0));
drop table t1;
create table t1 (a int)
partition by list (a)
(partition `7` values in (0));
drop table t1;
create table t1 (a int)
partition by list (a)
(partition `s1 s2 ` values in (0));
ERROR HY000: Incorrect partition name
create table t1 (a int)
partition by list (a)
subpartition by hash (a)
(partition p1 values in (0) (subpartition `p1 p2 `));
ERROR HY000: Incorrect partition name
CREATE TABLE t1 (a int)
CREATE TABLE t1 (a int)
PARTITION BY LIST (a)
PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (NULL));
(PARTITION p0 VALUES IN (NULL));
...
...
mysql-test/r/partition_grant.result
0 → 100644
View file @
a032a28d
drop schema if exists mysqltest_1;
create schema mysqltest_1;
use mysqltest_1;
create table t1 (a int) partition by list (a) (partition p1 values in (1), partition p2 values in (2), partition p3 values in (3));
insert into t1 values (1),(2);
grant select,alter on mysqltest_1.* to mysqltest_1@localhost;
show grants for current_user;
Grants for mysqltest_1@localhost
GRANT USAGE ON *.* TO 'mysqltest_1'@'localhost'
GRANT SELECT, ALTER ON `mysqltest_1`.* TO 'mysqltest_1'@'localhost'
alter table t1 add b int;
alter table t1 drop partition p2;
ERROR 42000: DROP command denied to user 'mysqltest_1'@'localhost' for table 't1'
grant drop on mysqltest_1.* to mysqltest_1@localhost;
alter table t1 drop partition p2;
revoke alter on mysqltest_1.* from mysqltest_1@localhost;
alter table t1 drop partition p3;
ERROR 42000: ALTER command denied to user 'mysqltest_1'@'localhost' for table 't1'
revoke select,alter,drop on mysqltest_1.* from mysqltest_1@localhost;
drop user mysqltest_1@localhost;
drop table t1;
drop schema mysqltest_1;
End of 5.1 tests
mysql-test/t/insert.test
View file @
a032a28d
...
@@ -175,3 +175,4 @@ select count(*) from t2;
...
@@ -175,3 +175,4 @@ select count(*) from t2;
insert
into
t2
select
t1
.*
from
t1
,
t2
t
,
t3
where
t1
.
id1
=
t
.
id2
and
t
.
id2
=
t3
.
id3
;
insert
into
t2
select
t1
.*
from
t1
,
t2
t
,
t3
where
t1
.
id1
=
t
.
id2
and
t
.
id2
=
t3
.
id3
;
select
count
(
*
)
from
t2
;
select
count
(
*
)
from
t2
;
drop
table
t1
,
t2
,
t3
;
drop
table
t1
,
t2
,
t3
;
mysql-test/t/partition.test
View file @
a032a28d
...
@@ -956,6 +956,30 @@ PARTITION p2 VALUES LESS THAN (30) ENGINE = MyISAM);
...
@@ -956,6 +956,30 @@ PARTITION p2 VALUES LESS THAN (30) ENGINE = MyISAM);
SHOW
TABLE
STATUS
;
SHOW
TABLE
STATUS
;
DROP
TABLE
t1
;
DROP
TABLE
t1
;
#
#BUG 18750 Problems with partition names
#
create
table
t1
(
a
int
)
partition
by
list
(
a
)
(
partition
`s1 s2`
values
in
(
0
));
drop
table
t1
;
create
table
t1
(
a
int
)
partition
by
list
(
a
)
(
partition
`7`
values
in
(
0
));
drop
table
t1
;
--
error
ER_WRONG_PARTITION_NAME
create
table
t1
(
a
int
)
partition
by
list
(
a
)
(
partition
`s1 s2 `
values
in
(
0
));
--
error
ER_WRONG_PARTITION_NAME
create
table
t1
(
a
int
)
partition
by
list
(
a
)
subpartition
by
hash
(
a
)
(
partition
p1
values
in
(
0
)
(
subpartition
`p1 p2 `
));
#
#
# BUG 18752 SHOW CREATE TABLE doesn't show NULL value in SHOW CREATE TABLE
# BUG 18752 SHOW CREATE TABLE doesn't show NULL value in SHOW CREATE TABLE
#
#
...
...
mysql-test/t/partition_grant.test
0 → 100644
View file @
a032a28d
--
source
include
/
have_partition
.
inc
# Grant tests not performed with embedded server
--
source
include
/
not_embedded
.
inc
--
disable_warnings
drop
schema
if
exists
mysqltest_1
;
--
enable_warnings
#
# Bug #17139: ALTER TABLE ... DROP PARTITION should require DROP privilege
#
create
schema
mysqltest_1
;
use
mysqltest_1
;
create
table
t1
(
a
int
)
partition
by
list
(
a
)
(
partition
p1
values
in
(
1
),
partition
p2
values
in
(
2
),
partition
p3
values
in
(
3
));
insert
into
t1
values
(
1
),(
2
);
grant
select
,
alter
on
mysqltest_1
.*
to
mysqltest_1
@
localhost
;
connect
(
conn1
,
localhost
,
mysqltest_1
,,
mysqltest_1
);
show
grants
for
current_user
;
alter
table
t1
add
b
int
;
--
error
ER_TABLEACCESS_DENIED_ERROR
alter
table
t1
drop
partition
p2
;
disconnect
conn1
;
connection
default
;
grant
drop
on
mysqltest_1
.*
to
mysqltest_1
@
localhost
;
connect
(
conn2
,
localhost
,
mysqltest_1
,,
mysqltest_1
);
alter
table
t1
drop
partition
p2
;
disconnect
conn2
;
connection
default
;
revoke
alter
on
mysqltest_1
.*
from
mysqltest_1
@
localhost
;
connect
(
conn3
,
localhost
,
mysqltest_1
,,
mysqltest_1
);
--
error
ER_TABLEACCESS_DENIED_ERROR
alter
table
t1
drop
partition
p3
;
disconnect
conn3
;
connection
default
;
revoke
select
,
alter
,
drop
on
mysqltest_1
.*
from
mysqltest_1
@
localhost
;
drop
user
mysqltest_1
@
localhost
;
drop
table
t1
;
drop
schema
mysqltest_1
;
--
echo
End
of
5.1
tests
sql/ha_ndbcluster.cc
View file @
a032a28d
...
@@ -4696,8 +4696,9 @@ int ha_ndbcluster::create(const char *name,
...
@@ -4696,8 +4696,9 @@ int ha_ndbcluster::create(const char *name,
DBUG_RETURN
(
my_errno
);
DBUG_RETURN
(
my_errno
);
}
}
int
ha_ndbcluster
::
create_handler_files
(
const
char
*
file
)
int
ha_ndbcluster
::
create_handler_files
(
const
char
*
file
,
HA_CREATE_INFO
*
info
)
{
{
char
path
[
FN_REFLEN
];
const
char
*
name
;
const
char
*
name
;
Ndb
*
ndb
;
Ndb
*
ndb
;
const
NDBTAB
*
tab
;
const
NDBTAB
*
tab
;
...
@@ -4707,16 +4708,21 @@ int ha_ndbcluster::create_handler_files(const char *file)
...
@@ -4707,16 +4708,21 @@ int ha_ndbcluster::create_handler_files(const char *file)
DBUG_ENTER
(
"create_handler_files"
);
DBUG_ENTER
(
"create_handler_files"
);
DBUG_PRINT
(
"enter"
,
(
"file: %s"
,
file
));
if
(
!
(
ndb
=
get_ndb
()))
if
(
!
(
ndb
=
get_ndb
()))
DBUG_RETURN
(
HA_ERR_NO_CONNECTION
);
DBUG_RETURN
(
HA_ERR_NO_CONNECTION
);
NDBDICT
*
dict
=
ndb
->
getDictionary
();
NDBDICT
*
dict
=
ndb
->
getDictionary
();
if
(
!
(
tab
=
dict
->
getTable
(
m_tabname
))
)
if
(
!
info
->
frm_only
)
DBUG_RETURN
(
0
);
// Must be a create, ignore since frm is saved in create
DBUG_RETURN
(
0
);
// Must be a create, ignore since frm is saved in create
set_dbname
(
file
);
set_tabname
(
file
);
DBUG_PRINT
(
"info"
,
(
"m_dbname: %s, m_tabname: %s"
,
m_dbname
,
m_tabname
));
if
(
!
(
tab
=
dict
->
getTable
(
m_tabname
)))
DBUG_RETURN
(
0
);
// Unkown table, must be temporary table
DBUG_ASSERT
(
get_ndb_share_state
(
m_share
)
==
NSS_ALTERED
);
DBUG_ASSERT
(
get_ndb_share_state
(
m_share
)
==
NSS_ALTERED
);
name
=
table
->
s
->
normalized_path
.
str
;
if
(
readfrm
(
file
,
&
data
,
&
length
)
||
DBUG_PRINT
(
"enter"
,
(
"m_tabname: %s, path: %s"
,
m_tabname
,
name
));
if
(
readfrm
(
name
,
&
data
,
&
length
)
||
packfrm
(
data
,
length
,
&
pack_data
,
&
pack_length
))
packfrm
(
data
,
length
,
&
pack_data
,
&
pack_length
))
{
{
DBUG_PRINT
(
"info"
,
(
"Missing frm for %s"
,
m_tabname
));
DBUG_PRINT
(
"info"
,
(
"Missing frm for %s"
,
m_tabname
));
...
@@ -4732,6 +4738,7 @@ int ha_ndbcluster::create_handler_files(const char *file)
...
@@ -4732,6 +4738,7 @@ int ha_ndbcluster::create_handler_files(const char *file)
my_free
((
char
*
)
data
,
MYF
(
MY_ALLOW_ZERO_PTR
));
my_free
((
char
*
)
data
,
MYF
(
MY_ALLOW_ZERO_PTR
));
my_free
((
char
*
)
pack_data
,
MYF
(
MY_ALLOW_ZERO_PTR
));
my_free
((
char
*
)
pack_data
,
MYF
(
MY_ALLOW_ZERO_PTR
));
}
}
set_ndb_share_state
(
m_share
,
NSS_INITIAL
);
set_ndb_share_state
(
m_share
,
NSS_INITIAL
);
free_share
(
&
m_share
);
// Decrease ref_count
free_share
(
&
m_share
);
// Decrease ref_count
...
@@ -4838,6 +4845,15 @@ int ha_ndbcluster::create_ndb_index(const char *name,
...
@@ -4838,6 +4845,15 @@ int ha_ndbcluster::create_ndb_index(const char *name,
DBUG_RETURN
(
0
);
DBUG_RETURN
(
0
);
}
}
/*
Prepare for an on-line alter table
*/
void
ha_ndbcluster
::
prepare_for_alter
()
{
ndbcluster_get_share
(
m_share
);
// Increase ref_count
set_ndb_share_state
(
m_share
,
NSS_ALTERED
);
}
/*
/*
Add an index on-line to a table
Add an index on-line to a table
*/
*/
...
@@ -4850,7 +4866,7 @@ int ha_ndbcluster::add_index(TABLE *table_arg,
...
@@ -4850,7 +4866,7 @@ int ha_ndbcluster::add_index(TABLE *table_arg,
int
error
=
0
;
int
error
=
0
;
uint
idx
;
uint
idx
;
DBUG_ASSERT
(
m_share
->
state
==
NSS_
INITIAL
);
DBUG_ASSERT
(
m_share
->
state
==
NSS_
ALTERED
);
for
(
idx
=
0
;
idx
<
num_of_keys
;
idx
++
)
for
(
idx
=
0
;
idx
<
num_of_keys
;
idx
++
)
{
{
KEY
*
key
=
key_info
+
idx
;
KEY
*
key
=
key_info
+
idx
;
...
@@ -4866,10 +4882,10 @@ int ha_ndbcluster::add_index(TABLE *table_arg,
...
@@ -4866,10 +4882,10 @@ int ha_ndbcluster::add_index(TABLE *table_arg,
if
((
error
=
create_index
(
key_info
[
idx
].
name
,
key
,
idx_type
,
idx
)))
if
((
error
=
create_index
(
key_info
[
idx
].
name
,
key
,
idx_type
,
idx
)))
break
;
break
;
}
}
if
(
!
error
)
if
(
error
)
{
{
ndbcluster_get_share
(
m_share
);
// Increase ref_count
set_ndb_share_state
(
m_share
,
NSS_INITIAL
);
set_ndb_share_state
(
m_share
,
NSS_ALTERED
);
free_share
(
&
m_share
);
// Decrease ref_count
}
}
DBUG_RETURN
(
error
);
DBUG_RETURN
(
error
);
}
}
...
@@ -4894,7 +4910,7 @@ int ha_ndbcluster::prepare_drop_index(TABLE *table_arg,
...
@@ -4894,7 +4910,7 @@ int ha_ndbcluster::prepare_drop_index(TABLE *table_arg,
uint
*
key_num
,
uint
num_of_keys
)
uint
*
key_num
,
uint
num_of_keys
)
{
{
DBUG_ENTER
(
"ha_ndbcluster::prepare_drop_index"
);
DBUG_ENTER
(
"ha_ndbcluster::prepare_drop_index"
);
DBUG_ASSERT
(
m_share
->
state
==
NSS_
INITIAL
);
DBUG_ASSERT
(
m_share
->
state
==
NSS_
ALTERED
);
// Mark indexes for deletion
// Mark indexes for deletion
uint
idx
;
uint
idx
;
for
(
idx
=
0
;
idx
<
num_of_keys
;
idx
++
)
for
(
idx
=
0
;
idx
<
num_of_keys
;
idx
++
)
...
@@ -4907,8 +4923,6 @@ int ha_ndbcluster::prepare_drop_index(TABLE *table_arg,
...
@@ -4907,8 +4923,6 @@ int ha_ndbcluster::prepare_drop_index(TABLE *table_arg,
Thd_ndb
*
thd_ndb
=
get_thd_ndb
(
thd
);
Thd_ndb
*
thd_ndb
=
get_thd_ndb
(
thd
);
Ndb
*
ndb
=
thd_ndb
->
ndb
;
Ndb
*
ndb
=
thd_ndb
->
ndb
;
renumber_indexes
(
ndb
,
table_arg
);
renumber_indexes
(
ndb
,
table_arg
);
ndbcluster_get_share
(
m_share
);
// Increase ref_count
set_ndb_share_state
(
m_share
,
NSS_ALTERED
);
DBUG_RETURN
(
0
);
DBUG_RETURN
(
0
);
}
}
...
...
sql/ha_ndbcluster.h
View file @
a032a28d
...
@@ -595,6 +595,7 @@ class ha_ndbcluster: public handler
...
@@ -595,6 +595,7 @@ class ha_ndbcluster: public handler
const
char
*
table_type
()
const
;
const
char
*
table_type
()
const
;
const
char
**
bas_ext
()
const
;
const
char
**
bas_ext
()
const
;
ulong
table_flags
(
void
)
const
;
ulong
table_flags
(
void
)
const
;
void
prepare_for_alter
();
int
add_index
(
TABLE
*
table_arg
,
KEY
*
key_info
,
uint
num_of_keys
);
int
add_index
(
TABLE
*
table_arg
,
KEY
*
key_info
,
uint
num_of_keys
);
int
prepare_drop_index
(
TABLE
*
table_arg
,
uint
*
key_num
,
uint
num_of_keys
);
int
prepare_drop_index
(
TABLE
*
table_arg
,
uint
*
key_num
,
uint
num_of_keys
);
int
final_drop_index
(
TABLE
*
table_arg
);
int
final_drop_index
(
TABLE
*
table_arg
);
...
@@ -609,7 +610,7 @@ class ha_ndbcluster: public handler
...
@@ -609,7 +610,7 @@ class ha_ndbcluster: public handler
int
rename_table
(
const
char
*
from
,
const
char
*
to
);
int
rename_table
(
const
char
*
from
,
const
char
*
to
);
int
delete_table
(
const
char
*
name
);
int
delete_table
(
const
char
*
name
);
int
create
(
const
char
*
name
,
TABLE
*
form
,
HA_CREATE_INFO
*
info
);
int
create
(
const
char
*
name
,
TABLE
*
form
,
HA_CREATE_INFO
*
info
);
int
create_handler_files
(
const
char
*
file
);
int
create_handler_files
(
const
char
*
file
,
HA_CREATE_INFO
*
info
);
int
get_default_no_partitions
(
ulonglong
max_rows
);
int
get_default_no_partitions
(
ulonglong
max_rows
);
bool
get_no_parts
(
const
char
*
name
,
uint
*
no_parts
);
bool
get_no_parts
(
const
char
*
name
,
uint
*
no_parts
);
void
set_auto_partitions
(
partition_info
*
part_info
);
void
set_auto_partitions
(
partition_info
*
part_info
);
...
...
sql/ha_partition.cc
View file @
a032a28d
...
@@ -562,6 +562,7 @@ int ha_partition::rename_table(const char *from, const char *to)
...
@@ -562,6 +562,7 @@ int ha_partition::rename_table(const char *from, const char *to)
SYNOPSIS
SYNOPSIS
create_handler_files()
create_handler_files()
name Full path of table name
name Full path of table name
create_info Create info generated for CREATE TABLE
RETURN VALUE
RETURN VALUE
>0 Error
>0 Error
...
@@ -575,7 +576,8 @@ int ha_partition::rename_table(const char *from, const char *to)
...
@@ -575,7 +576,8 @@ int ha_partition::rename_table(const char *from, const char *to)
and types of engines in the partitions.
and types of engines in the partitions.
*/
*/
int
ha_partition
::
create_handler_files
(
const
char
*
name
)
int
ha_partition
::
create_handler_files
(
const
char
*
name
,
HA_CREATE_INFO
*
create_info
)
{
{
DBUG_ENTER
(
"ha_partition::create_handler_files()"
);
DBUG_ENTER
(
"ha_partition::create_handler_files()"
);
...
...
sql/ha_partition.h
View file @
a032a28d
...
@@ -179,7 +179,8 @@ class ha_partition :public handler
...
@@ -179,7 +179,8 @@ class ha_partition :public handler
virtual
int
rename_table
(
const
char
*
from
,
const
char
*
to
);
virtual
int
rename_table
(
const
char
*
from
,
const
char
*
to
);
virtual
int
create
(
const
char
*
name
,
TABLE
*
form
,
virtual
int
create
(
const
char
*
name
,
TABLE
*
form
,
HA_CREATE_INFO
*
create_info
);
HA_CREATE_INFO
*
create_info
);
virtual
int
create_handler_files
(
const
char
*
name
);
virtual
int
create_handler_files
(
const
char
*
name
,
HA_CREATE_INFO
*
create_info
);
virtual
void
update_create_info
(
HA_CREATE_INFO
*
create_info
);
virtual
void
update_create_info
(
HA_CREATE_INFO
*
create_info
);
virtual
char
*
update_table_comment
(
const
char
*
comment
);
virtual
char
*
update_table_comment
(
const
char
*
comment
);
virtual
int
change_partitions
(
HA_CREATE_INFO
*
create_info
,
virtual
int
change_partitions
(
HA_CREATE_INFO
*
create_info
,
...
...
sql/handler.h
View file @
a032a28d
...
@@ -1338,6 +1338,7 @@ class handler :public Sql_alloc
...
@@ -1338,6 +1338,7 @@ class handler :public Sql_alloc
virtual
ulong
index_flags
(
uint
idx
,
uint
part
,
bool
all_parts
)
const
=
0
;
virtual
ulong
index_flags
(
uint
idx
,
uint
part
,
bool
all_parts
)
const
=
0
;
virtual
void
prepare_for_alter
()
{
return
;
}
virtual
int
add_index
(
TABLE
*
table_arg
,
KEY
*
key_info
,
uint
num_of_keys
)
virtual
int
add_index
(
TABLE
*
table_arg
,
KEY
*
key_info
,
uint
num_of_keys
)
{
return
(
HA_ERR_WRONG_COMMAND
);
}
{
return
(
HA_ERR_WRONG_COMMAND
);
}
virtual
int
prepare_drop_index
(
TABLE
*
table_arg
,
uint
*
key_num
,
virtual
int
prepare_drop_index
(
TABLE
*
table_arg
,
uint
*
key_num
,
...
@@ -1378,7 +1379,8 @@ class handler :public Sql_alloc
...
@@ -1378,7 +1379,8 @@ class handler :public Sql_alloc
virtual
void
drop_table
(
const
char
*
name
);
virtual
void
drop_table
(
const
char
*
name
);
virtual
int
create
(
const
char
*
name
,
TABLE
*
form
,
HA_CREATE_INFO
*
info
)
=
0
;
virtual
int
create
(
const
char
*
name
,
TABLE
*
form
,
HA_CREATE_INFO
*
info
)
=
0
;
virtual
int
create_handler_files
(
const
char
*
name
)
{
return
FALSE
;}
virtual
int
create_handler_files
(
const
char
*
name
,
HA_CREATE_INFO
*
info
)
{
return
FALSE
;}
virtual
int
change_partitions
(
HA_CREATE_INFO
*
create_info
,
virtual
int
change_partitions
(
HA_CREATE_INFO
*
create_info
,
const
char
*
path
,
const
char
*
path
,
...
...
sql/partition_info.cc
View file @
a032a28d
...
@@ -696,6 +696,12 @@ bool partition_info::check_partition_info(handlerton **eng_type,
...
@@ -696,6 +696,12 @@ bool partition_info::check_partition_info(handlerton **eng_type,
partition_element
*
part_elem
=
part_it
++
;
partition_element
*
part_elem
=
part_it
++
;
if
(
!
is_sub_partitioned
())
if
(
!
is_sub_partitioned
())
{
{
if
(
check_table_name
(
part_elem
->
partition_name
,
strlen
(
part_elem
->
partition_name
)))
{
my_error
(
ER_WRONG_PARTITION_NAME
,
MYF
(
0
));
goto
end
;
}
if
(
part_elem
->
engine_type
==
NULL
)
if
(
part_elem
->
engine_type
==
NULL
)
part_elem
->
engine_type
=
default_engine_type
;
part_elem
->
engine_type
=
default_engine_type
;
DBUG_PRINT
(
"info"
,
(
"engine = %d"
,
DBUG_PRINT
(
"info"
,
(
"engine = %d"
,
...
@@ -709,6 +715,12 @@ bool partition_info::check_partition_info(handlerton **eng_type,
...
@@ -709,6 +715,12 @@ bool partition_info::check_partition_info(handlerton **eng_type,
do
do
{
{
part_elem
=
sub_it
++
;
part_elem
=
sub_it
++
;
if
(
check_table_name
(
part_elem
->
partition_name
,
strlen
(
part_elem
->
partition_name
)))
{
my_error
(
ER_WRONG_PARTITION_NAME
,
MYF
(
0
));
goto
end
;
}
if
(
part_elem
->
engine_type
==
NULL
)
if
(
part_elem
->
engine_type
==
NULL
)
part_elem
->
engine_type
=
default_engine_type
;
part_elem
->
engine_type
=
default_engine_type
;
DBUG_PRINT
(
"info"
,
(
"engine = %u"
,
DBUG_PRINT
(
"info"
,
(
"engine = %u"
,
...
...
sql/share/errmsg.txt
View file @
a032a28d
...
@@ -5826,3 +5826,6 @@ ER_NDB_CANT_SWITCH_BINLOG_FORMAT
...
@@ -5826,3 +5826,6 @@ ER_NDB_CANT_SWITCH_BINLOG_FORMAT
eng "The NDB cluster engine does not support changing the binlog format on the fly yet"
eng "The NDB cluster engine does not support changing the binlog format on the fly yet"
ER_PARTITION_NO_TEMPORARY
ER_PARTITION_NO_TEMPORARY
eng "Cannot create temporary table with partitions"
eng "Cannot create temporary table with partitions"
ER_WRONG_PARTITION_NAME
eng "Incorrect partition name"
swe "Felaktigt partitionsnamn"
sql/sql_parse.cc
View file @
a032a28d
...
@@ -2991,6 +2991,11 @@ mysql_execute_command(THD *thd)
...
@@ -2991,6 +2991,11 @@ mysql_execute_command(THD *thd)
#else
#else
{
{
ulong
priv
=
0
;
ulong
priv
=
0
;
ulong
priv_needed
=
ALTER_ACL
;
/* We also require DROP priv for ALTER TABLE ... DROP PARTITION */
if
(
lex
->
alter_info
.
flags
&
ALTER_DROP_PARTITION
)
priv_needed
|=
DROP_ACL
;
if
(
lex
->
name
&&
(
!
lex
->
name
[
0
]
||
strlen
(
lex
->
name
)
>
NAME_LEN
))
if
(
lex
->
name
&&
(
!
lex
->
name
[
0
]
||
strlen
(
lex
->
name
)
>
NAME_LEN
))
{
{
my_error
(
ER_WRONG_TABLE_NAME
,
MYF
(
0
),
lex
->
name
);
my_error
(
ER_WRONG_TABLE_NAME
,
MYF
(
0
),
lex
->
name
);
...
@@ -3015,7 +3020,7 @@ mysql_execute_command(THD *thd)
...
@@ -3015,7 +3020,7 @@ mysql_execute_command(THD *thd)
else
else
select_lex
->
db
=
first_table
->
db
;
select_lex
->
db
=
first_table
->
db
;
}
}
if
(
check_access
(
thd
,
ALTER_ACL
,
first_table
->
db
,
if
(
check_access
(
thd
,
priv_needed
,
first_table
->
db
,
&
first_table
->
grant
.
privilege
,
0
,
0
,
&
first_table
->
grant
.
privilege
,
0
,
0
,
test
(
first_table
->
schema_table
))
||
test
(
first_table
->
schema_table
))
||
check_access
(
thd
,
INSERT_ACL
|
CREATE_ACL
,
select_lex
->
db
,
&
priv
,
0
,
0
,
check_access
(
thd
,
INSERT_ACL
|
CREATE_ACL
,
select_lex
->
db
,
&
priv
,
0
,
0
,
...
@@ -3026,7 +3031,7 @@ mysql_execute_command(THD *thd)
...
@@ -3026,7 +3031,7 @@ mysql_execute_command(THD *thd)
goto
error
;
/* purecov: inspected */
goto
error
;
/* purecov: inspected */
if
(
grant_option
)
if
(
grant_option
)
{
{
if
(
check_grant
(
thd
,
ALTER_ACL
,
all_tables
,
0
,
UINT_MAX
,
0
))
if
(
check_grant
(
thd
,
priv_needed
,
all_tables
,
0
,
UINT_MAX
,
0
))
goto
error
;
goto
error
;
if
(
lex
->
name
&&
!
test_all_bits
(
priv
,
INSERT_ACL
|
CREATE_ACL
))
if
(
lex
->
name
&&
!
test_all_bits
(
priv
,
INSERT_ACL
|
CREATE_ACL
))
{
// Rename of table
{
// Rename of table
...
...
sql/sql_partition.cc
View file @
a032a28d
...
@@ -1614,6 +1614,21 @@ static int add_key_partition(File fptr, List<char> field_list)
...
@@ -1614,6 +1614,21 @@ static int add_key_partition(File fptr, List<char> field_list)
return
err
;
return
err
;
}
}
static
int
add_name_string
(
File
fptr
,
const
char
*
name
)
{
int
err
;
String
name_string
(
""
,
0
,
system_charset_info
);
THD
*
thd
=
current_thd
;
ulonglong
save_options
=
thd
->
options
;
thd
->
options
=
0
;
append_identifier
(
thd
,
&
name_string
,
name
,
strlen
(
name
));
thd
->
options
=
save_options
;
err
=
add_string_object
(
fptr
,
&
name_string
);
return
err
;
}
static
int
add_int
(
File
fptr
,
longlong
number
)
static
int
add_int
(
File
fptr
,
longlong
number
)
{
{
llstr
(
number
,
buff
);
llstr
(
number
,
buff
);
...
@@ -1912,7 +1927,7 @@ char *generate_partition_syntax(partition_info *part_info,
...
@@ -1912,7 +1927,7 @@ char *generate_partition_syntax(partition_info *part_info,
part_info
->
part_state_len
=
part_state_id
+
1
;
part_info
->
part_state_len
=
part_state_id
+
1
;
}
}
err
+=
add_partition
(
fptr
);
err
+=
add_partition
(
fptr
);
err
+=
add_string
(
fptr
,
part_elem
->
partition_name
);
err
+=
add_
name_
string
(
fptr
,
part_elem
->
partition_name
);
err
+=
add_space
(
fptr
);
err
+=
add_space
(
fptr
);
err
+=
add_partition_values
(
fptr
,
part_info
,
part_elem
);
err
+=
add_partition_values
(
fptr
,
part_info
,
part_elem
);
if
(
!
part_info
->
is_sub_partitioned
())
if
(
!
part_info
->
is_sub_partitioned
())
...
@@ -1928,7 +1943,7 @@ char *generate_partition_syntax(partition_info *part_info,
...
@@ -1928,7 +1943,7 @@ char *generate_partition_syntax(partition_info *part_info,
{
{
part_elem
=
sub_it
++
;
part_elem
=
sub_it
++
;
err
+=
add_subpartition
(
fptr
);
err
+=
add_subpartition
(
fptr
);
err
+=
add_string
(
fptr
,
part_elem
->
partition_name
);
err
+=
add_
name_
string
(
fptr
,
part_elem
->
partition_name
);
err
+=
add_space
(
fptr
);
err
+=
add_space
(
fptr
);
err
+=
add_partition_options
(
fptr
,
part_elem
);
err
+=
add_partition_options
(
fptr
,
part_elem
);
if
(
j
!=
(
no_subparts
-
1
))
if
(
j
!=
(
no_subparts
-
1
))
...
...
sql/sql_show.cc
View file @
a032a28d
...
@@ -753,6 +753,7 @@ mysqld_dump_create_info(THD *thd, TABLE_LIST *table_list, int fd)
...
@@ -753,6 +753,7 @@ mysqld_dump_create_info(THD *thd, TABLE_LIST *table_list, int fd)
static
const
char
*
require_quotes
(
const
char
*
name
,
uint
name_length
)
static
const
char
*
require_quotes
(
const
char
*
name
,
uint
name_length
)
{
{
uint
length
;
uint
length
;
bool
pure_digit
=
TRUE
;
const
char
*
end
=
name
+
name_length
;
const
char
*
end
=
name
+
name_length
;
for
(;
name
<
end
;
name
++
)
for
(;
name
<
end
;
name
++
)
...
@@ -761,7 +762,11 @@ static const char *require_quotes(const char *name, uint name_length)
...
@@ -761,7 +762,11 @@ static const char *require_quotes(const char *name, uint name_length)
length
=
my_mbcharlen
(
system_charset_info
,
chr
);
length
=
my_mbcharlen
(
system_charset_info
,
chr
);
if
(
length
==
1
&&
!
system_charset_info
->
ident_map
[
chr
])
if
(
length
==
1
&&
!
system_charset_info
->
ident_map
[
chr
])
return
name
;
return
name
;
if
(
length
==
1
&&
(
chr
<
'0'
||
chr
>
'9'
))
pure_digit
=
FALSE
;
}
}
if
(
pure_digit
)
return
name
;
return
0
;
return
0
;
}
}
...
...
sql/sql_table.cc
View file @
a032a28d
...
@@ -347,7 +347,7 @@ bool mysql_write_frm(ALTER_PARTITION_PARAM_TYPE *lpt, uint flags)
...
@@ -347,7 +347,7 @@ bool mysql_write_frm(ALTER_PARTITION_PARAM_TYPE *lpt, uint flags)
lpt
->
create_info
,
lpt
->
new_create_list
,
lpt
->
key_count
,
lpt
->
create_info
,
lpt
->
new_create_list
,
lpt
->
key_count
,
lpt
->
key_info_buffer
,
lpt
->
table
->
file
))
||
lpt
->
key_info_buffer
,
lpt
->
table
->
file
))
||
((
flags
&
WFRM_CREATE_HANDLER_FILES
)
&&
((
flags
&
WFRM_CREATE_HANDLER_FILES
)
&&
lpt
->
table
->
file
->
create_handler_files
(
path
)))
lpt
->
table
->
file
->
create_handler_files
(
path
,
lpt
->
create_info
)))
{
{
error
=
1
;
error
=
1
;
goto
end
;
goto
end
;
...
@@ -3964,6 +3964,7 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name,
...
@@ -3964,6 +3964,7 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name,
char
tmp_name
[
80
],
old_name
[
32
],
new_name_buff
[
FN_REFLEN
];
char
tmp_name
[
80
],
old_name
[
32
],
new_name_buff
[
FN_REFLEN
];
char
new_alias_buff
[
FN_REFLEN
],
*
table_name
,
*
db
,
*
new_alias
,
*
alias
;
char
new_alias_buff
[
FN_REFLEN
],
*
table_name
,
*
db
,
*
new_alias
,
*
alias
;
char
index_file
[
FN_REFLEN
],
data_file
[
FN_REFLEN
];
char
index_file
[
FN_REFLEN
],
data_file
[
FN_REFLEN
];
char
path
[
FN_REFLEN
];
char
reg_path
[
FN_REFLEN
+
1
];
char
reg_path
[
FN_REFLEN
+
1
];
ha_rows
copied
,
deleted
;
ha_rows
copied
,
deleted
;
ulonglong
next_insert_id
;
ulonglong
next_insert_id
;
...
@@ -4000,6 +4001,7 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name,
...
@@ -4000,6 +4001,7 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name,
if
(
!
new_db
||
!
my_strcasecmp
(
table_alias_charset
,
new_db
,
db
))
if
(
!
new_db
||
!
my_strcasecmp
(
table_alias_charset
,
new_db
,
db
))
new_db
=
db
;
new_db
=
db
;
build_table_filename
(
reg_path
,
sizeof
(
reg_path
),
db
,
table_name
,
reg_ext
);
build_table_filename
(
reg_path
,
sizeof
(
reg_path
),
db
,
table_name
,
reg_ext
);
build_table_filename
(
path
,
sizeof
(
path
),
db
,
table_name
,
""
);
used_fields
=
create_info
->
used_fields
;
used_fields
=
create_info
->
used_fields
;
...
@@ -4773,6 +4775,7 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name,
...
@@ -4773,6 +4775,7 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name,
KEY_PART_INFO
*
part_end
;
KEY_PART_INFO
*
part_end
;
DBUG_PRINT
(
"info"
,
(
"No new_table, checking add/drop index"
));
DBUG_PRINT
(
"info"
,
(
"No new_table, checking add/drop index"
));
table
->
file
->
prepare_for_alter
();
if
(
index_add_count
)
if
(
index_add_count
)
{
{
#ifdef XXX_TO_BE_DONE_LATER_BY_WL3020_AND_WL1892
#ifdef XXX_TO_BE_DONE_LATER_BY_WL3020_AND_WL1892
...
@@ -4788,7 +4791,7 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name,
...
@@ -4788,7 +4791,7 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name,
error
=
(
mysql_create_frm
(
thd
,
reg_path
,
db
,
table_name
,
error
=
(
mysql_create_frm
(
thd
,
reg_path
,
db
,
table_name
,
create_info
,
prepared_create_list
,
key_count
,
create_info
,
prepared_create_list
,
key_count
,
key_info_buffer
,
table
->
file
)
||
key_info_buffer
,
table
->
file
)
||
table
->
file
->
create_handler_files
(
reg_path
));
table
->
file
->
create_handler_files
(
path
,
create_info
));
VOID
(
pthread_mutex_unlock
(
&
LOCK_open
));
VOID
(
pthread_mutex_unlock
(
&
LOCK_open
));
if
(
error
)
if
(
error
)
goto
err
;
goto
err
;
...
@@ -4834,7 +4837,7 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name,
...
@@ -4834,7 +4837,7 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name,
error
=
(
mysql_create_frm
(
thd
,
reg_path
,
db
,
table_name
,
error
=
(
mysql_create_frm
(
thd
,
reg_path
,
db
,
table_name
,
create_info
,
prepared_create_list
,
key_count
,
create_info
,
prepared_create_list
,
key_count
,
key_info_buffer
,
table
->
file
)
||
key_info_buffer
,
table
->
file
)
||
table
->
file
->
create_handler_files
(
reg_path
));
table
->
file
->
create_handler_files
(
path
,
create_info
));
VOID
(
pthread_mutex_unlock
(
&
LOCK_open
));
VOID
(
pthread_mutex_unlock
(
&
LOCK_open
));
if
(
error
)
if
(
error
)
goto
err
;
goto
err
;
...
@@ -4904,19 +4907,16 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name,
...
@@ -4904,19 +4907,16 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name,
}
}
/*end of if (index_drop_count)*/
/*end of if (index_drop_count)*/
if
(
index_add_count
||
index_drop_count
)
/*
{
The final .frm file is already created as a temporary file
/*
and will be renamed to the original table name later.
The final .frm file is already created as a temporary file
*/
and will be renamed to the original table name later.
*/
/* Need to commit before a table is unlocked (NDB requirement). */
/* Need to commit before a table is unlocked (NDB requirement). */
DBUG_PRINT
(
"info"
,
(
"Committing after add/drop index"
));
DBUG_PRINT
(
"info"
,
(
"Committing before unlocking table"
));
if
(
ha_commit_stmt
(
thd
)
||
ha_commit
(
thd
))
if
(
ha_commit_stmt
(
thd
)
||
ha_commit
(
thd
))
goto
err
;
goto
err
;
committed
=
1
;
committed
=
1
;
}
}
}
/*end of if (! new_table) for add/drop index*/
/*end of if (! new_table) for add/drop index*/
...
@@ -5061,7 +5061,7 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name,
...
@@ -5061,7 +5061,7 @@ bool mysql_alter_table(THD *thd,char *new_db, char *new_name,
VOID
(
pthread_mutex_lock
(
&
LOCK_open
));
VOID
(
pthread_mutex_lock
(
&
LOCK_open
));
}
}
/* Tell the handler that a new frm file is in place. */
/* Tell the handler that a new frm file is in place. */
if
(
table
->
file
->
create_handler_files
(
reg_path
))
if
(
table
->
file
->
create_handler_files
(
path
,
create_info
))
{
{
VOID
(
pthread_mutex_unlock
(
&
LOCK_open
));
VOID
(
pthread_mutex_unlock
(
&
LOCK_open
));
goto
err
;
goto
err
;
...
...
sql/sql_yacc.yy
View file @
a032a28d
...
@@ -3639,7 +3639,7 @@ part_definition:
...
@@ -3639,7 +3639,7 @@ part_definition:
;
;
part_name:
part_name:
ident
_or_text
ident
{
{
LEX *lex= Lex;
LEX *lex= Lex;
partition_info *part_info= lex->part_info;
partition_info *part_info= lex->part_info;
...
...
sql/unireg.cc
View file @
a032a28d
...
@@ -330,7 +330,7 @@ int rea_create_table(THD *thd, const char *path,
...
@@ -330,7 +330,7 @@ int rea_create_table(THD *thd, const char *path,
// Make sure mysql_create_frm din't remove extension
// Make sure mysql_create_frm din't remove extension
DBUG_ASSERT
(
*
fn_rext
(
frm_name
));
DBUG_ASSERT
(
*
fn_rext
(
frm_name
));
if
(
file
->
create_handler_files
(
path
))
if
(
file
->
create_handler_files
(
path
,
create_info
))
goto
err_handler
;
goto
err_handler
;
if
(
!
create_info
->
frm_only
&&
ha_create_table
(
thd
,
path
,
db
,
table_name
,
if
(
!
create_info
->
frm_only
&&
ha_create_table
(
thd
,
path
,
db
,
table_name
,
create_info
,
0
))
create_info
,
0
))
...
...
storage/ndb/tools/listTables.cpp
View file @
a032a28d
...
@@ -31,6 +31,7 @@ static Ndb_cluster_connection *ndb_cluster_connection= 0;
...
@@ -31,6 +31,7 @@ static Ndb_cluster_connection *ndb_cluster_connection= 0;
static
Ndb
*
ndb
=
0
;
static
Ndb
*
ndb
=
0
;
static
const
NdbDictionary
::
Dictionary
*
dic
=
0
;
static
const
NdbDictionary
::
Dictionary
*
dic
=
0
;
static
int
_unqualified
=
0
;
static
int
_unqualified
=
0
;
static
int
_parsable
=
0
;
static
void
static
void
fatal
(
char
const
*
fmt
,
...)
fatal
(
char
const
*
fmt
,
...)
...
@@ -76,10 +77,13 @@ list(const char * tabname,
...
@@ -76,10 +77,13 @@ list(const char * tabname,
if
(
dic
->
listIndexes
(
list
,
tabname
)
==
-
1
)
if
(
dic
->
listIndexes
(
list
,
tabname
)
==
-
1
)
fatal_dict
(
"listIndexes"
);
fatal_dict
(
"listIndexes"
);
}
}
if
(
ndb
->
usingFullyQualifiedNames
())
if
(
!
_parsable
)
ndbout_c
(
"%-5s %-20s %-8s %-7s %-12s %-8s %s"
,
"id"
,
"type"
,
"state"
,
"logging"
,
"database"
,
"schema"
,
"name"
);
{
else
if
(
ndb
->
usingFullyQualifiedNames
())
ndbout_c
(
"%-5s %-20s %-8s %-7s %s"
,
"id"
,
"type"
,
"state"
,
"logging"
,
"name"
);
ndbout_c
(
"%-5s %-20s %-8s %-7s %-12s %-8s %s"
,
"id"
,
"type"
,
"state"
,
"logging"
,
"database"
,
"schema"
,
"name"
);
else
ndbout_c
(
"%-5s %-20s %-8s %-7s %s"
,
"id"
,
"type"
,
"state"
,
"logging"
,
"name"
);
}
for
(
unsigned
i
=
0
;
i
<
list
.
count
;
i
++
)
{
for
(
unsigned
i
=
0
;
i
<
list
.
count
;
i
++
)
{
NdbDictionary
::
Dictionary
::
List
::
Element
&
elt
=
list
.
elements
[
i
];
NdbDictionary
::
Dictionary
::
List
::
Element
&
elt
=
list
.
elements
[
i
];
char
type
[
100
];
char
type
[
100
];
...
@@ -170,9 +174,19 @@ list(const char * tabname,
...
@@ -170,9 +174,19 @@ list(const char * tabname,
}
}
}
}
if
(
ndb
->
usingFullyQualifiedNames
())
if
(
ndb
->
usingFullyQualifiedNames
())
ndbout_c
(
"%-5d %-20s %-8s %-7s %-12s %-8s %s"
,
elt
.
id
,
type
,
state
,
store
,
(
elt
.
database
)
?
elt
.
database
:
""
,
(
elt
.
schema
)
?
elt
.
schema
:
""
,
elt
.
name
);
{
else
if
(
_parsable
)
ndbout_c
(
"%-5d %-20s %-8s %-7s %s"
,
elt
.
id
,
type
,
state
,
store
,
elt
.
name
);
ndbout_c
(
"%d
\t
'%s'
\t
'%s'
\t
'%s'
\t
'%s'
\t
'%s'
\t
'%s'"
,
elt
.
id
,
type
,
state
,
store
,
(
elt
.
database
)
?
elt
.
database
:
""
,
(
elt
.
schema
)
?
elt
.
schema
:
""
,
elt
.
name
);
else
ndbout_c
(
"%-5d %-20s %-8s %-7s %-12s %-8s %s"
,
elt
.
id
,
type
,
state
,
store
,
(
elt
.
database
)
?
elt
.
database
:
""
,
(
elt
.
schema
)
?
elt
.
schema
:
""
,
elt
.
name
);
}
else
{
if
(
_parsable
)
ndbout_c
(
"%d
\t
'%s'
\t
'%s'
\t
'%s'
\t
'%s'"
,
elt
.
id
,
type
,
state
,
store
,
elt
.
name
);
else
ndbout_c
(
"%-5d %-20s %-8s %-7s %s"
,
elt
.
id
,
type
,
state
,
store
,
elt
.
name
);
}
}
}
}
}
...
@@ -196,6 +210,9 @@ static struct my_option my_long_options[] =
...
@@ -196,6 +210,9 @@ static struct my_option my_long_options[] =
{
"unqualified"
,
'u'
,
"Use unqualified table names"
,
{
"unqualified"
,
'u'
,
"Use unqualified table names"
,
(
gptr
*
)
&
_unqualified
,
(
gptr
*
)
&
_unqualified
,
0
,
(
gptr
*
)
&
_unqualified
,
(
gptr
*
)
&
_unqualified
,
0
,
GET_BOOL
,
NO_ARG
,
0
,
0
,
0
,
0
,
0
,
0
},
GET_BOOL
,
NO_ARG
,
0
,
0
,
0
,
0
,
0
,
0
},
{
"parsable"
,
'p'
,
"Return output suitable for mysql LOAD DATA INFILE"
,
(
gptr
*
)
&
_parsable
,
(
gptr
*
)
&
_parsable
,
0
,
GET_BOOL
,
NO_ARG
,
0
,
0
,
0
,
0
,
0
,
0
},
{
0
,
0
,
0
,
0
,
0
,
0
,
GET_NO_ARG
,
NO_ARG
,
0
,
0
,
0
,
0
,
0
,
0
}
{
0
,
0
,
0
,
0
,
0
,
0
,
GET_NO_ARG
,
NO_ARG
,
0
,
0
,
0
,
0
,
0
,
0
}
};
};
static
void
usage
()
static
void
usage
()
...
...
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