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
5f293dd6
Commit
5f293dd6
authored
Apr 09, 2013
by
Sergei Golubchik
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
MDEV-4022 table attributes with sysvar as a default value
parent
7d328812
Changes
11
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
265 additions
and
46 deletions
+265
-46
mysql-test/r/partition_example.result
mysql-test/r/partition_example.result
+2
-2
mysql-test/r/plugin.result
mysql-test/r/plugin.result
+29
-7
mysql-test/t/plugin.test
mysql-test/t/plugin.test
+11
-0
sql/create_options.cc
sql/create_options.cc
+158
-17
sql/create_options.h
sql/create_options.h
+4
-2
sql/handler.cc
sql/handler.cc
+4
-2
sql/handler.h
sql/handler.h
+22
-6
sql/sql_plugin.cc
sql/sql_plugin.cc
+17
-4
sql/sql_plugin.h
sql/sql_plugin.h
+2
-0
sql/sql_table.cc
sql/sql_table.cc
+6
-6
storage/example/ha_example.cc
storage/example/ha_example.cc
+10
-0
No files found.
mysql-test/r/partition_example.result
View file @
5f293dd6
...
@@ -7,7 +7,7 @@ show create table t1;
...
@@ -7,7 +7,7 @@ show create table t1;
Table Create Table
Table Create Table
t1 CREATE TABLE `t1` (
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL
`a` int(11) NOT NULL
) ENGINE=EXAMPLE DEFAULT CHARSET=latin1
) ENGINE=EXAMPLE DEFAULT CHARSET=latin1
`VAROPT`='5'
/*!50100 PARTITION BY LIST (a)
/*!50100 PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (1) ENGINE = EXAMPLE,
(PARTITION p0 VALUES IN (1) ENGINE = EXAMPLE,
PARTITION p1 VALUES IN (2) ENGINE = EXAMPLE) */
PARTITION p1 VALUES IN (2) ENGINE = EXAMPLE) */
...
@@ -20,7 +20,7 @@ show create table t1;
...
@@ -20,7 +20,7 @@ show create table t1;
Table Create Table
Table Create Table
t1 CREATE TABLE `t1` (
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL
`a` int(11) NOT NULL
) ENGINE=EXAMPLE DEFAULT CHARSET=latin1 `ull`=12340
) ENGINE=EXAMPLE DEFAULT CHARSET=latin1 `ull`=12340
`VAROPT`='5'
/*!50100 PARTITION BY LIST (a)
/*!50100 PARTITION BY LIST (a)
(PARTITION p0 VALUES IN (1) ENGINE = EXAMPLE,
(PARTITION p0 VALUES IN (1) ENGINE = EXAMPLE,
PARTITION p1 VALUES IN (2) ENGINE = EXAMPLE) */
PARTITION p1 VALUES IN (2) ENGINE = EXAMPLE) */
...
...
mysql-test/r/plugin.result
View file @
5f293dd6
...
@@ -49,6 +49,7 @@ show variables like 'example%';
...
@@ -49,6 +49,7 @@ show variables like 'example%';
Variable_name Value
Variable_name Value
example_enum_var e1
example_enum_var e1
example_ulong_var 500
example_ulong_var 500
example_varopt_default 5
UNINSTALL SONAME 'ha_example';
UNINSTALL SONAME 'ha_example';
Warnings:
Warnings:
Warning 1620 Plugin is busy and will be uninstalled on shutdown
Warning 1620 Plugin is busy and will be uninstalled on shutdown
...
@@ -119,7 +120,7 @@ show create table t1;
...
@@ -119,7 +120,7 @@ show create table t1;
Table Create Table
Table Create Table
t1 CREATE TABLE `t1` (
t1 CREATE TABLE `t1` (
`a` int(11) DEFAULT NULL `complex`='c,f,f,f'
`a` int(11) DEFAULT NULL `complex`='c,f,f,f'
) ENGINE=EXAMPLE DEFAULT CHARSET=latin1 `ULL`=10000 `STR`='dskj' `one_or_two`='one' `YESNO`=0
) ENGINE=EXAMPLE DEFAULT CHARSET=latin1 `ULL`=10000 `STR`='dskj' `one_or_two`='one' `YESNO`=0
`VAROPT`='5'
drop table t1;
drop table t1;
SET @OLD_SQL_MODE=@@SQL_MODE;
SET @OLD_SQL_MODE=@@SQL_MODE;
SET SQL_MODE='IGNORE_BAD_TABLE_OPTIONS';
SET SQL_MODE='IGNORE_BAD_TABLE_OPTIONS';
...
@@ -133,20 +134,20 @@ show create table t1;
...
@@ -133,20 +134,20 @@ show create table t1;
Table Create Table
Table Create Table
t1 CREATE TABLE `t1` (
t1 CREATE TABLE `t1` (
`a` int(11) DEFAULT NULL
`a` int(11) DEFAULT NULL
) ENGINE=EXAMPLE DEFAULT CHARSET=latin1 `ULL`=10000000000000000000 `one_or_two`='ttt' `YESNO`=SSS
) ENGINE=EXAMPLE DEFAULT CHARSET=latin1 `ULL`=10000000000000000000 `one_or_two`='ttt' `YESNO`=SSS
`VAROPT`='5'
#alter table
#alter table
alter table t1 ULL=10000000;
alter table t1 ULL=10000000;
show create table t1;
show create table t1;
Table Create Table
Table Create Table
t1 CREATE TABLE `t1` (
t1 CREATE TABLE `t1` (
`a` int(11) DEFAULT NULL
`a` int(11) DEFAULT NULL
) ENGINE=EXAMPLE DEFAULT CHARSET=latin1 `one_or_two`='ttt' `YESNO`=SSS `ULL`=10000000
) ENGINE=EXAMPLE DEFAULT CHARSET=latin1 `one_or_two`='ttt' `YESNO`=SSS `
VAROPT`='5' `
ULL`=10000000
alter table t1 change a a int complex='c,c,c';
alter table t1 change a a int complex='c,c,c';
show create table t1;
show create table t1;
Table Create Table
Table Create Table
t1 CREATE TABLE `t1` (
t1 CREATE TABLE `t1` (
`a` int(11) DEFAULT NULL `complex`='c,c,c'
`a` int(11) DEFAULT NULL `complex`='c,c,c'
) ENGINE=EXAMPLE DEFAULT CHARSET=latin1 `one_or_two`='ttt' `YESNO`=SSS `ULL`=10000000
) ENGINE=EXAMPLE DEFAULT CHARSET=latin1 `one_or_two`='ttt' `YESNO`=SSS `
VAROPT`='5' `
ULL`=10000000
drop table t1;
drop table t1;
#illegal value error
#illegal value error
SET SQL_MODE='';
SET SQL_MODE='';
...
@@ -161,17 +162,38 @@ SHOW CREATE TABLE t1;
...
@@ -161,17 +162,38 @@ SHOW CREATE TABLE t1;
Table Create Table
Table Create Table
t1 CREATE TABLE `t1` (
t1 CREATE TABLE `t1` (
`a` int(11) DEFAULT NULL
`a` int(11) DEFAULT NULL
) ENGINE=EXAMPLE DEFAULT CHARSET=latin1 `ULL`=4660
) ENGINE=EXAMPLE DEFAULT CHARSET=latin1 `ULL`=4660 `VAROPT`='5'
SET example_varopt_default=33;
select create_options from information_schema.tables where table_schema='test' and table_name='t1';
select create_options from information_schema.tables where table_schema='test' and table_name='t1';
create_options
create_options
`ULL`=4660
`ULL`=4660
`VAROPT`='5'
ALTER TABLE t1 ULL=DEFAULT;
ALTER TABLE t1 ULL=DEFAULT;
SHOW CREATE TABLE t1;
SHOW CREATE TABLE t1;
Table Create Table
Table Create Table
t1 CREATE TABLE `t1` (
t1 CREATE TABLE `t1` (
`a` int(11) DEFAULT NULL
`a` int(11) DEFAULT NULL
) ENGINE=EXAMPLE DEFAULT CHARSET=latin1
) ENGINE=EXAMPLE DEFAULT CHARSET=latin1
`VAROPT`='5'
DROP TABLE t1;
DROP TABLE t1;
create table t1 (a int) engine=example;
show create table t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) DEFAULT NULL
) ENGINE=EXAMPLE DEFAULT CHARSET=latin1 `VAROPT`='33'
drop table t1;
create table t1 (a int) engine=example varopt=15;
show create table t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) DEFAULT NULL
) ENGINE=EXAMPLE DEFAULT CHARSET=latin1 `varopt`=15
alter table t1 varopt=default;
show create table t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) DEFAULT NULL
) ENGINE=EXAMPLE DEFAULT CHARSET=latin1 `VAROPT`='33'
drop table t1;
SET @@SQL_MODE=@OLD_SQL_MODE;
SET @@SQL_MODE=@OLD_SQL_MODE;
select 1;
select 1;
1
1
...
...
mysql-test/t/plugin.test
View file @
5f293dd6
...
@@ -144,6 +144,7 @@ CREATE TABLE t1 (a int) ENGINE=example ULL=1e2;
...
@@ -144,6 +144,7 @@ CREATE TABLE t1 (a int) ENGINE=example ULL=1e2;
CREATE
TABLE
t1
(
a
int
)
ENGINE
=
example
ULL
=
0x1234
;
CREATE
TABLE
t1
(
a
int
)
ENGINE
=
example
ULL
=
0x1234
;
SHOW
CREATE
TABLE
t1
;
SHOW
CREATE
TABLE
t1
;
SET
example_varopt_default
=
33
;
# does not affect varopt of t1
select
create_options
from
information_schema
.
tables
where
table_schema
=
'test'
and
table_name
=
't1'
;
select
create_options
from
information_schema
.
tables
where
table_schema
=
'test'
and
table_name
=
't1'
;
...
@@ -152,6 +153,16 @@ SHOW CREATE TABLE t1;
...
@@ -152,6 +153,16 @@ SHOW CREATE TABLE t1;
DROP
TABLE
t1
;
DROP
TABLE
t1
;
create
table
t1
(
a
int
)
engine
=
example
;
# varopt is 10
show
create
table
t1
;
drop
table
t1
;
create
table
t1
(
a
int
)
engine
=
example
varopt
=
15
;
show
create
table
t1
;
alter
table
t1
varopt
=
default
;
show
create
table
t1
;
drop
table
t1
;
SET
@@
SQL_MODE
=@
OLD_SQL_MODE
;
SET
@@
SQL_MODE
=@
OLD_SQL_MODE
;
#
#
...
...
sql/create_options.cc
View file @
5f293dd6
...
@@ -21,6 +21,7 @@
...
@@ -21,6 +21,7 @@
#include "create_options.h"
#include "create_options.h"
#include <my_getopt.h>
#include <my_getopt.h>
#include "set_var.h"
#define FRM_QUOTED_VALUE 0x8000
#define FRM_QUOTED_VALUE 0x8000
...
@@ -115,7 +116,7 @@ static bool report_unknown_option(THD *thd, engine_option_value *val,
...
@@ -115,7 +116,7 @@ static bool report_unknown_option(THD *thd, engine_option_value *val,
}
}
static
bool
set_one_value
(
ha_create_table_option
*
opt
,
static
bool
set_one_value
(
ha_create_table_option
*
opt
,
THD
*
thd
,
LEX_STRING
*
value
,
void
*
base
,
THD
*
thd
,
const
LEX_STRING
*
value
,
void
*
base
,
bool
suppress_warning
,
bool
suppress_warning
,
MEM_ROOT
*
root
)
MEM_ROOT
*
root
)
{
{
...
@@ -126,6 +127,8 @@ static bool set_one_value(ha_create_table_option *opt,
...
@@ -126,6 +127,8 @@ static bool set_one_value(ha_create_table_option *opt,
(
value
->
str
?
value
->
str
:
"<DEFAULT>"
)));
(
value
->
str
?
value
->
str
:
"<DEFAULT>"
)));
switch
(
opt
->
type
)
switch
(
opt
->
type
)
{
{
case
HA_OPTION_TYPE_SYSVAR
:
DBUG_ASSERT
(
0
);
// HA_OPTION_TYPE_SYSVAR's are replaced in resolve_sysvars()
case
HA_OPTION_TYPE_ULL
:
case
HA_OPTION_TYPE_ULL
:
{
{
ulonglong
*
val
=
(
ulonglong
*
)((
char
*
)
base
+
opt
->
offset
);
ulonglong
*
val
=
(
ulonglong
*
)((
char
*
)
base
+
opt
->
offset
);
...
@@ -257,51 +260,92 @@ static const size_t ha_option_type_sizeof[]=
...
@@ -257,51 +260,92 @@ static const size_t ha_option_type_sizeof[]=
@retval FALSE OK
@retval FALSE OK
*/
*/
bool
parse_option_list
(
THD
*
thd
,
void
*
option_struct_arg
,
bool
parse_option_list
(
THD
*
thd
,
handlerton
*
hton
,
void
*
option_struct_arg
,
engine_option_value
*
option_list
,
engine_option_value
*
*
option_list
,
ha_create_table_option
*
rules
,
ha_create_table_option
*
rules
,
bool
suppress_warning
,
MEM_ROOT
*
root
)
bool
suppress_warning
,
MEM_ROOT
*
root
)
{
{
ha_create_table_option
*
opt
;
ha_create_table_option
*
opt
;
size_t
option_struct_size
=
0
;
size_t
option_struct_size
=
0
;
engine_option_value
*
val
=
option_li
st
;
engine_option_value
*
val
,
*
la
st
;
void
**
option_struct
=
(
void
**
)
option_struct_arg
;
void
**
option_struct
=
(
void
**
)
option_struct_arg
;
DBUG_ENTER
(
"parse_option_list"
);
DBUG_ENTER
(
"parse_option_list"
);
DBUG_PRINT
(
"enter"
,
DBUG_PRINT
(
"enter"
,
(
"struct: %p list: %p rules: %p suppress_warning: %u root: %p"
,
(
"struct: %p list: %p rules: %p suppress_warning: %u root: %p"
,
*
option_struct
,
option_list
,
rules
,
*
option_struct
,
*
option_list
,
rules
,
(
uint
)
suppress_warning
,
root
));
(
uint
)
suppress_warning
,
root
));
if
(
rules
)
if
(
rules
)
{
{
LEX_STRING
default_val
=
null_lex_str
;
for
(
opt
=
rules
;
opt
->
name
;
opt
++
)
for
(
opt
=
rules
;
opt
->
name
;
opt
++
)
set_if_bigger
(
option_struct_size
,
opt
->
offset
+
set_if_bigger
(
option_struct_size
,
opt
->
offset
+
ha_option_type_sizeof
[
opt
->
type
]);
ha_option_type_sizeof
[
opt
->
type
]);
*
option_struct
=
alloc_root
(
root
,
option_struct_size
);
*
option_struct
=
alloc_root
(
root
,
option_struct_size
);
/* set all values to default */
for
(
opt
=
rules
;
opt
->
name
;
opt
++
)
set_one_value
(
opt
,
thd
,
&
default_val
,
*
option_struct
,
suppress_warning
,
root
);
}
}
for
(
;
val
;
val
=
val
->
next
)
for
(
opt
=
rules
;
opt
&&
opt
->
name
;
opt
++
)
{
{
for
(
opt
=
rules
;
opt
&&
opt
->
name
;
opt
++
)
bool
seen
=
false
;
for
(
val
=
*
option_list
;
val
;
val
=
val
->
next
)
{
{
last
=
val
;
if
(
my_strnncoll
(
system_charset_info
,
if
(
my_strnncoll
(
system_charset_info
,
(
uchar
*
)
opt
->
name
,
opt
->
name_length
,
(
uchar
*
)
opt
->
name
,
opt
->
name_length
,
(
uchar
*
)
val
->
name
.
str
,
val
->
name
.
length
))
(
uchar
*
)
val
->
name
.
str
,
val
->
name
.
length
))
continue
;
continue
;
seen
=
true
;
if
(
val
->
parsed
&&
!
val
->
value
.
str
)
continue
;
if
(
set_one_value
(
opt
,
thd
,
&
val
->
value
,
if
(
set_one_value
(
opt
,
thd
,
&
val
->
value
,
*
option_struct
,
suppress_warning
||
val
->
parsed
,
root
))
*
option_struct
,
suppress_warning
||
val
->
parsed
,
root
))
DBUG_RETURN
(
TRUE
);
DBUG_RETURN
(
TRUE
);
val
->
parsed
=
true
;
val
->
parsed
=
true
;
break
;
break
;
}
}
if
(
!
seen
)
{
LEX_STRING
default_val
=
null_lex_str
;
/*
If it's CREATE/ALTER TABLE parsing mode (options are created in the
transient thd->mem_root, not in the long living TABLE_SHARE::mem_root),
and variable-backed option was not explicitly set.
If it's not create, but opening of the existing frm (that was,
probably, created with the older version of the storage engine and
does not have this option stored), we take the *default* value of the
sysvar, not the *current* value. Because we don't want to have
different option values for the same table if it's opened many times.
*/
if
(
root
==
thd
->
mem_root
&&
opt
->
var
)
{
// take a value from the variable and add it to the list
sys_var
*
sysvar
=
find_hton_sysvar
(
hton
,
opt
->
var
);
DBUG_ASSERT
(
sysvar
);
char
buf
[
256
];
String
sbuf
(
buf
,
sizeof
(
buf
),
system_charset_info
),
*
str
;
if
((
str
=
sysvar
->
val_str
(
&
sbuf
,
thd
,
OPT_SESSION
,
0
)))
{
LEX_STRING
name
=
{
const_cast
<
char
*>
(
opt
->
name
),
opt
->
name_length
};
default_val
.
str
=
strmake_root
(
root
,
str
->
ptr
(),
str
->
length
());
default_val
.
length
=
str
->
length
();
val
=
new
(
root
)
engine_option_value
(
name
,
default_val
,
true
,
option_list
,
&
last
);
val
->
parsed
=
true
;
}
}
set_one_value
(
opt
,
thd
,
&
default_val
,
*
option_struct
,
suppress_warning
,
root
);
}
}
for
(
val
=
*
option_list
;
val
;
val
=
val
->
next
)
{
if
(
report_unknown_option
(
thd
,
val
,
suppress_warning
))
if
(
report_unknown_option
(
thd
,
val
,
suppress_warning
))
DBUG_RETURN
(
TRUE
);
DBUG_RETURN
(
TRUE
);
val
->
parsed
=
true
;
val
->
parsed
=
true
;
...
@@ -311,6 +355,102 @@ bool parse_option_list(THD* thd, void *option_struct_arg,
...
@@ -311,6 +355,102 @@ bool parse_option_list(THD* thd, void *option_struct_arg,
}
}
/**
Resolves all HA_OPTION_TYPE_SYSVAR elements.
This is done when an engine is loaded.
*/
static
bool
resolve_sysvars
(
handlerton
*
hton
,
ha_create_table_option
*
rules
)
{
for
(
ha_create_table_option
*
opt
=
rules
;
opt
&&
opt
->
name
;
opt
++
)
{
if
(
opt
->
type
==
HA_OPTION_TYPE_SYSVAR
)
{
struct
my_option
optp
;
plugin_opt_set_limits
(
&
optp
,
opt
->
var
);
switch
(
optp
.
var_type
)
{
case
GET_ULL
:
case
GET_ULONG
:
case
GET_UINT
:
opt
->
type
=
HA_OPTION_TYPE_ULL
;
opt
->
def_value
=
(
ulonglong
)
optp
.
def_value
;
opt
->
min_value
=
(
ulonglong
)
optp
.
min_value
;
opt
->
max_value
=
(
ulonglong
)
optp
.
max_value
;
opt
->
block_size
=
(
ulonglong
)
optp
.
block_size
;
break
;
case
GET_STR
:
case
GET_STR_ALLOC
:
opt
->
type
=
HA_OPTION_TYPE_STRING
;
break
;
case
GET_BOOL
:
opt
->
type
=
HA_OPTION_TYPE_BOOL
;
opt
->
def_value
=
optp
.
def_value
;
break
;
case
GET_ENUM
:
{
opt
->
type
=
HA_OPTION_TYPE_ENUM
;
opt
->
def_value
=
optp
.
def_value
;
char
buf
[
256
];
String
str
(
buf
,
sizeof
(
buf
),
system_charset_info
);
for
(
const
char
**
s
=
optp
.
typelib
->
type_names
;
*
s
;
s
++
)
{
if
(
str
.
append
(
*
s
)
||
str
.
append
(
','
))
return
1
;
}
DBUG_ASSERT
(
str
.
length
());
opt
->
values
=
my_strndup
(
str
.
ptr
(),
str
.
length
()
-
1
,
MYF
(
MY_WME
));
if
(
!
opt
->
values
)
return
1
;
break
;
}
default:
DBUG_ASSERT
(
0
);
}
}
}
return
0
;
}
bool
resolve_sysvar_table_options
(
handlerton
*
hton
)
{
return
resolve_sysvars
(
hton
,
hton
->
table_options
)
||
resolve_sysvars
(
hton
,
hton
->
field_options
)
||
resolve_sysvars
(
hton
,
hton
->
index_options
);
}
/*
Restore HA_OPTION_TYPE_SYSVAR options back as they were
before resolve_sysvars().
This is done when the engine is unloaded, so that we could
call resolve_sysvars() if the engine is installed again.
*/
static
void
free_sysvars
(
handlerton
*
hton
,
ha_create_table_option
*
rules
)
{
for
(
ha_create_table_option
*
opt
=
rules
;
opt
&&
opt
->
name
;
opt
++
)
{
if
(
opt
->
var
)
{
my_free
(
const_cast
<
char
*>
(
opt
->
values
));
opt
->
type
=
HA_OPTION_TYPE_SYSVAR
;
opt
->
def_value
=
0
;
opt
->
min_value
=
0
;
opt
->
max_value
=
0
;
opt
->
block_size
=
0
;
opt
->
values
=
0
;
}
}
}
void
free_sysvar_table_options
(
handlerton
*
hton
)
{
free_sysvars
(
hton
,
hton
->
table_options
);
free_sysvars
(
hton
,
hton
->
field_options
);
free_sysvars
(
hton
,
hton
->
index_options
);
}
/**
/**
Parses all table/fields/keys options
Parses all table/fields/keys options
...
@@ -327,21 +467,22 @@ bool parse_engine_table_options(THD *thd, handlerton *ht, TABLE_SHARE *share)
...
@@ -327,21 +467,22 @@ bool parse_engine_table_options(THD *thd, handlerton *ht, TABLE_SHARE *share)
MEM_ROOT
*
root
=
&
share
->
mem_root
;
MEM_ROOT
*
root
=
&
share
->
mem_root
;
DBUG_ENTER
(
"parse_engine_table_options"
);
DBUG_ENTER
(
"parse_engine_table_options"
);
if
(
parse_option_list
(
thd
,
&
share
->
option_struct
,
share
->
option_list
,
if
(
parse_option_list
(
thd
,
ht
,
&
share
->
option_struct
,
&
share
->
option_list
,
ht
->
table_options
,
TRUE
,
root
))
ht
->
table_options
,
TRUE
,
root
))
DBUG_RETURN
(
TRUE
);
DBUG_RETURN
(
TRUE
);
for
(
Field
**
field
=
share
->
field
;
*
field
;
field
++
)
for
(
Field
**
field
=
share
->
field
;
*
field
;
field
++
)
{
{
if
(
parse_option_list
(
thd
,
&
(
*
field
)
->
option_struct
,
(
*
field
)
->
option_list
,
if
(
parse_option_list
(
thd
,
ht
,
&
(
*
field
)
->
option_struct
,
&
(
*
field
)
->
option_list
,
ht
->
field_options
,
TRUE
,
root
))
ht
->
field_options
,
TRUE
,
root
))
DBUG_RETURN
(
TRUE
);
DBUG_RETURN
(
TRUE
);
}
}
for
(
uint
index
=
0
;
index
<
share
->
keys
;
index
++
)
for
(
uint
index
=
0
;
index
<
share
->
keys
;
index
++
)
{
{
if
(
parse_option_list
(
thd
,
&
share
->
key_info
[
index
].
option_struct
,
if
(
parse_option_list
(
thd
,
ht
,
&
share
->
key_info
[
index
].
option_struct
,
share
->
key_info
[
index
].
option_list
,
&
share
->
key_info
[
index
].
option_list
,
ht
->
index_options
,
TRUE
,
root
))
ht
->
index_options
,
TRUE
,
root
))
DBUG_RETURN
(
TRUE
);
DBUG_RETURN
(
TRUE
);
}
}
...
...
sql/create_options.h
View file @
5f293dd6
...
@@ -69,9 +69,11 @@ class engine_option_value: public Sql_alloc
...
@@ -69,9 +69,11 @@ class engine_option_value: public Sql_alloc
typedef
struct
st_key
KEY
;
typedef
struct
st_key
KEY
;
class
Create_field
;
class
Create_field
;
bool
resolve_sysvar_table_options
(
handlerton
*
hton
);
void
free_sysvar_table_options
(
handlerton
*
hton
);
bool
parse_engine_table_options
(
THD
*
thd
,
handlerton
*
ht
,
TABLE_SHARE
*
share
);
bool
parse_engine_table_options
(
THD
*
thd
,
handlerton
*
ht
,
TABLE_SHARE
*
share
);
bool
parse_option_list
(
THD
*
thd
,
void
*
option_struct
,
bool
parse_option_list
(
THD
*
thd
,
handlerton
*
hton
,
void
*
option_struct
,
engine_option_value
*
option_list
,
engine_option_value
*
*
option_list
,
ha_create_table_option
*
rules
,
ha_create_table_option
*
rules
,
bool
suppress_warning
,
MEM_ROOT
*
root
);
bool
suppress_warning
,
MEM_ROOT
*
root
);
bool
engine_table_options_frm_read
(
const
uchar
*
buff
,
uint
length
,
bool
engine_table_options_frm_read
(
const
uchar
*
buff
,
uint
length
,
...
...
sql/handler.cc
View file @
5f293dd6
...
@@ -448,6 +448,9 @@ int ha_finalize_handlerton(st_plugin_int *plugin)
...
@@ -448,6 +448,9 @@ int ha_finalize_handlerton(st_plugin_int *plugin)
}
}
}
}
free_sysvar_table_options
(
hton
);
update_discovery_counters
(
hton
,
-
1
);
/*
/*
In case a plugin is uninstalled and re-installed later, it should
In case a plugin is uninstalled and re-installed later, it should
reuse an array slot. Otherwise the number of uninstall/install
reuse an array slot. Otherwise the number of uninstall/install
...
@@ -461,8 +464,6 @@ int ha_finalize_handlerton(st_plugin_int *plugin)
...
@@ -461,8 +464,6 @@ int ha_finalize_handlerton(st_plugin_int *plugin)
hton2plugin
[
hton
->
slot
]
=
NULL
;
hton2plugin
[
hton
->
slot
]
=
NULL
;
}
}
update_discovery_counters
(
hton
,
-
1
);
my_free
(
hton
);
my_free
(
hton
);
end:
end:
...
@@ -603,6 +604,7 @@ int ha_initialize_handlerton(st_plugin_int *plugin)
...
@@ -603,6 +604,7 @@ int ha_initialize_handlerton(st_plugin_int *plugin)
break
;
break
;
};
};
resolve_sysvar_table_options
(
hton
);
update_discovery_counters
(
hton
,
1
);
update_discovery_counters
(
hton
,
1
);
DBUG_RETURN
(
0
);
DBUG_RETURN
(
0
);
...
...
sql/handler.h
View file @
5f293dd6
...
@@ -714,22 +714,26 @@ struct ha_index_option_struct;
...
@@ -714,22 +714,26 @@ struct ha_index_option_struct;
enum
ha_option_type
{
HA_OPTION_TYPE_ULL
,
/* unsigned long long */
enum
ha_option_type
{
HA_OPTION_TYPE_ULL
,
/* unsigned long long */
HA_OPTION_TYPE_STRING
,
/* char * */
HA_OPTION_TYPE_STRING
,
/* char * */
HA_OPTION_TYPE_ENUM
,
/* uint */
HA_OPTION_TYPE_ENUM
,
/* uint */
HA_OPTION_TYPE_BOOL
};
/* bool */
HA_OPTION_TYPE_BOOL
,
/* bool */
HA_OPTION_TYPE_SYSVAR
};
/* type of the sysval */
#define HA_xOPTION_NUMBER(name, struc, field, def, min, max, blk_siz) \
#define HA_xOPTION_NUMBER(name, struc, field, def, min, max, blk_siz) \
{ HA_OPTION_TYPE_ULL, name, sizeof(name)-1, \
{ HA_OPTION_TYPE_ULL, name, sizeof(name)-1, \
offsetof(struc, field), def, min, max, blk_siz, 0 }
offsetof(struc, field), def, min, max, blk_siz, 0
, 0
}
#define HA_xOPTION_STRING(name, struc, field) \
#define HA_xOPTION_STRING(name, struc, field) \
{ HA_OPTION_TYPE_STRING, name, sizeof(name)-1, \
{ HA_OPTION_TYPE_STRING, name, sizeof(name)-1, \
offsetof(struc, field), 0, 0, 0, 0, 0
}
offsetof(struc, field), 0, 0, 0, 0, 0
, 0
}
#define HA_xOPTION_ENUM(name, struc, field, values, def) \
#define HA_xOPTION_ENUM(name, struc, field, values, def) \
{ HA_OPTION_TYPE_ENUM, name, sizeof(name)-1, \
{ HA_OPTION_TYPE_ENUM, name, sizeof(name)-1, \
offsetof(struc, field), def, 0, \
offsetof(struc, field), def, 0, \
sizeof(values)-1, 0, values }
sizeof(values)-1, 0, values
, 0
}
#define HA_xOPTION_BOOL(name, struc, field, def) \
#define HA_xOPTION_BOOL(name, struc, field, def) \
{ HA_OPTION_TYPE_BOOL, name, sizeof(name)-1, \
{ HA_OPTION_TYPE_BOOL, name, sizeof(name)-1, \
offsetof(struc, field), def, 0, 1, 0, 0 }
offsetof(struc, field), def, 0, 1, 0, 0, 0 }
#define HA_xOPTION_END { HA_OPTION_TYPE_ULL, 0, 0, 0, 0, 0, 0, 0, 0 }
#define HA_xOPTION_SYSVAR(name, struc, field, sysvar) \
{ HA_OPTION_TYPE_SYSVAR, name, sizeof(name)-1, \
offsetof(struc, field), 0, 0, 0, 0, 0, MYSQL_SYSVAR(sysvar) }
#define HA_xOPTION_END { HA_OPTION_TYPE_ULL, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
#define HA_TOPTION_NUMBER(name, field, def, min, max, blk_siz) \
#define HA_TOPTION_NUMBER(name, field, def, min, max, blk_siz) \
HA_xOPTION_NUMBER(name, ha_table_option_struct, field, def, min, max, blk_siz)
HA_xOPTION_NUMBER(name, ha_table_option_struct, field, def, min, max, blk_siz)
...
@@ -739,6 +743,8 @@ enum ha_option_type { HA_OPTION_TYPE_ULL, /* unsigned long long */
...
@@ -739,6 +743,8 @@ enum ha_option_type { HA_OPTION_TYPE_ULL, /* unsigned long long */
HA_xOPTION_ENUM(name, ha_table_option_struct, field, values, def)
HA_xOPTION_ENUM(name, ha_table_option_struct, field, values, def)
#define HA_TOPTION_BOOL(name, field, def) \
#define HA_TOPTION_BOOL(name, field, def) \
HA_xOPTION_BOOL(name, ha_table_option_struct, field, def)
HA_xOPTION_BOOL(name, ha_table_option_struct, field, def)
#define HA_TOPTION_SYSVAR(name, field, sysvar) \
HA_xOPTION_SYSVAR(name, ha_table_option_struct, field, sysvar)
#define HA_TOPTION_END HA_xOPTION_END
#define HA_TOPTION_END HA_xOPTION_END
#define HA_FOPTION_NUMBER(name, field, def, min, max, blk_siz) \
#define HA_FOPTION_NUMBER(name, field, def, min, max, blk_siz) \
...
@@ -749,6 +755,8 @@ enum ha_option_type { HA_OPTION_TYPE_ULL, /* unsigned long long */
...
@@ -749,6 +755,8 @@ enum ha_option_type { HA_OPTION_TYPE_ULL, /* unsigned long long */
HA_xOPTION_ENUM(name, ha_field_option_struct, field, values, def)
HA_xOPTION_ENUM(name, ha_field_option_struct, field, values, def)
#define HA_FOPTION_BOOL(name, field, def) \
#define HA_FOPTION_BOOL(name, field, def) \
HA_xOPTION_BOOL(name, ha_field_option_struct, field, def)
HA_xOPTION_BOOL(name, ha_field_option_struct, field, def)
#define HA_FOPTION_SYSVAR(name, field, sysvar) \
HA_xOPTION_SYSVAR(name, ha_field_option_struct, field, sysvar)
#define HA_FOPTION_END HA_xOPTION_END
#define HA_FOPTION_END HA_xOPTION_END
#define HA_IOPTION_NUMBER(name, field, def, min, max, blk_siz) \
#define HA_IOPTION_NUMBER(name, field, def, min, max, blk_siz) \
...
@@ -759,6 +767,8 @@ enum ha_option_type { HA_OPTION_TYPE_ULL, /* unsigned long long */
...
@@ -759,6 +767,8 @@ enum ha_option_type { HA_OPTION_TYPE_ULL, /* unsigned long long */
HA_xOPTION_ENUM(name, ha_index_option_struct, field, values, def)
HA_xOPTION_ENUM(name, ha_index_option_struct, field, values, def)
#define HA_IOPTION_BOOL(name, field, values, def) \
#define HA_IOPTION_BOOL(name, field, values, def) \
HA_xOPTION_BOOL(name, ha_index_option_struct, field, values, def)
HA_xOPTION_BOOL(name, ha_index_option_struct, field, values, def)
#define HA_IOPTION_SYSVAR(name, field, sysvar) \
HA_xOPTION_SYSVAR(name, ha_index_option_struct, field, sysvar)
#define HA_IOPTION_END HA_xOPTION_END
#define HA_IOPTION_END HA_xOPTION_END
typedef
struct
st_ha_create_table_option
{
typedef
struct
st_ha_create_table_option
{
...
@@ -769,6 +779,7 @@ typedef struct st_ha_create_table_option {
...
@@ -769,6 +779,7 @@ typedef struct st_ha_create_table_option {
ulonglong
def_value
;
ulonglong
def_value
;
ulonglong
min_value
,
max_value
,
block_size
;
ulonglong
min_value
,
max_value
,
block_size
;
const
char
*
values
;
const
char
*
values
;
struct
st_mysql_sys_var
*
var
;
}
ha_create_table_option
;
}
ha_create_table_option
;
enum
handler_iterator_type
enum
handler_iterator_type
...
@@ -1197,6 +1208,11 @@ static inline LEX_STRING *hton_name(const handlerton *hton)
...
@@ -1197,6 +1208,11 @@ static inline LEX_STRING *hton_name(const handlerton *hton)
return
&
(
hton2plugin
[
hton
->
slot
]
->
name
);
return
&
(
hton2plugin
[
hton
->
slot
]
->
name
);
}
}
static
inline
sys_var
*
find_hton_sysvar
(
handlerton
*
hton
,
st_mysql_sys_var
*
var
)
{
return
find_plugin_sysvar
(
hton2plugin
[
hton
->
slot
],
var
);
}
/* Possible flags of a handlerton (there can be 32 of them) */
/* Possible flags of a handlerton (there can be 32 of them) */
#define HTON_NO_FLAGS 0
#define HTON_NO_FLAGS 0
...
...
sql/sql_plugin.cc
View file @
5f293dd6
...
@@ -308,8 +308,6 @@ static void unlock_variables(THD *thd, struct system_variables *vars);
...
@@ -308,8 +308,6 @@ static void unlock_variables(THD *thd, struct system_variables *vars);
static
void
cleanup_variables
(
THD
*
thd
,
struct
system_variables
*
vars
);
static
void
cleanup_variables
(
THD
*
thd
,
struct
system_variables
*
vars
);
static
void
plugin_vars_free_values
(
sys_var
*
vars
);
static
void
plugin_vars_free_values
(
sys_var
*
vars
);
static
void
restore_pluginvar_names
(
sys_var
*
first
);
static
void
restore_pluginvar_names
(
sys_var
*
first
);
static
void
plugin_opt_set_limits
(
struct
my_option
*
,
const
struct
st_mysql_sys_var
*
);
static
plugin_ref
intern_plugin_lock
(
LEX
*
lex
,
plugin_ref
plugin
);
static
plugin_ref
intern_plugin_lock
(
LEX
*
lex
,
plugin_ref
plugin
);
static
void
intern_plugin_unlock
(
LEX
*
lex
,
plugin_ref
plugin
);
static
void
intern_plugin_unlock
(
LEX
*
lex
,
plugin_ref
plugin
);
static
void
reap_plugins
(
void
);
static
void
reap_plugins
(
void
);
...
@@ -3286,8 +3284,8 @@ bool sys_var_pluginvar::global_update(THD *thd, set_var *var)
...
@@ -3286,8 +3284,8 @@ bool sys_var_pluginvar::global_update(THD *thd, set_var *var)
options->block_size= (long) (opt)->blk_sz
options->block_size= (long) (opt)->blk_sz
static
void
plugin_opt_set_limits
(
struct
my_option
*
options
,
void
plugin_opt_set_limits
(
struct
my_option
*
options
,
const
struct
st_mysql_sys_var
*
opt
)
const
struct
st_mysql_sys_var
*
opt
)
{
{
options
->
sub_size
=
0
;
options
->
sub_size
=
0
;
...
@@ -3866,3 +3864,18 @@ void add_plugin_options(DYNAMIC_ARRAY *options, MEM_ROOT *mem_root)
...
@@ -3866,3 +3864,18 @@ void add_plugin_options(DYNAMIC_ARRAY *options, MEM_ROOT *mem_root)
}
}
}
}
/**
Returns a sys_var corresponding to a particular MYSQL_SYSVAR(...)
*/
sys_var
*
find_plugin_sysvar
(
st_plugin_int
*
plugin
,
st_mysql_sys_var
*
plugin_var
)
{
for
(
sys_var
*
var
=
plugin
->
system_vars
;
var
;
var
=
var
->
next
)
{
sys_var_pluginvar
*
pvar
=
var
->
cast_pluginvar
();
if
(
pvar
->
plugin_var
==
plugin_var
)
return
var
;
}
return
0
;
}
sql/sql_plugin.h
View file @
5f293dd6
...
@@ -163,6 +163,8 @@ extern bool mysql_uninstall_plugin(THD *thd, const LEX_STRING *name,
...
@@ -163,6 +163,8 @@ extern bool mysql_uninstall_plugin(THD *thd, const LEX_STRING *name,
extern
bool
plugin_register_builtin
(
struct
st_mysql_plugin
*
plugin
);
extern
bool
plugin_register_builtin
(
struct
st_mysql_plugin
*
plugin
);
extern
void
plugin_thdvar_init
(
THD
*
thd
);
extern
void
plugin_thdvar_init
(
THD
*
thd
);
extern
void
plugin_thdvar_cleanup
(
THD
*
thd
);
extern
void
plugin_thdvar_cleanup
(
THD
*
thd
);
sys_var
*
find_plugin_sysvar
(
st_plugin_int
*
plugin
,
st_mysql_sys_var
*
var
);
void
plugin_opt_set_limits
(
struct
my_option
*
,
const
struct
st_mysql_sys_var
*
);
extern
SHOW_COMP_OPTION
plugin_status
(
const
char
*
name
,
size_t
len
,
int
type
);
extern
SHOW_COMP_OPTION
plugin_status
(
const
char
*
name
,
size_t
len
,
int
type
);
extern
bool
check_valid_path
(
const
char
*
path
,
size_t
length
);
extern
bool
check_valid_path
(
const
char
*
path
,
size_t
length
);
...
...
sql/sql_table.cc
View file @
5f293dd6
...
@@ -3224,8 +3224,8 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info,
...
@@ -3224,8 +3224,8 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info,
sql_field
->
offset
=
record_offset
;
sql_field
->
offset
=
record_offset
;
if
(
MTYP_TYPENR
(
sql_field
->
unireg_check
)
==
Field
::
NEXT_NUMBER
)
if
(
MTYP_TYPENR
(
sql_field
->
unireg_check
)
==
Field
::
NEXT_NUMBER
)
auto_increment
++
;
auto_increment
++
;
if
(
parse_option_list
(
thd
,
&
sql_field
->
option_struct
,
if
(
parse_option_list
(
thd
,
create_info
->
db_type
,
&
sql_field
->
option_struct
,
sql_field
->
option_list
,
&
sql_field
->
option_list
,
create_info
->
db_type
->
field_options
,
FALSE
,
create_info
->
db_type
->
field_options
,
FALSE
,
thd
->
mem_root
))
thd
->
mem_root
))
DBUG_RETURN
(
TRUE
);
DBUG_RETURN
(
TRUE
);
...
@@ -3427,8 +3427,8 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info,
...
@@ -3427,8 +3427,8 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info,
key_info
->
usable_key_parts
=
key_number
;
key_info
->
usable_key_parts
=
key_number
;
key_info
->
algorithm
=
key
->
key_create_info
.
algorithm
;
key_info
->
algorithm
=
key
->
key_create_info
.
algorithm
;
key_info
->
option_list
=
key
->
option_list
;
key_info
->
option_list
=
key
->
option_list
;
if
(
parse_option_list
(
thd
,
&
key_info
->
option_struct
,
if
(
parse_option_list
(
thd
,
create_info
->
db_type
,
&
key_info
->
option_struct
,
key_info
->
option_list
,
&
key_info
->
option_list
,
create_info
->
db_type
->
index_options
,
FALSE
,
create_info
->
db_type
->
index_options
,
FALSE
,
thd
->
mem_root
))
thd
->
mem_root
))
DBUG_RETURN
(
TRUE
);
DBUG_RETURN
(
TRUE
);
...
@@ -3874,8 +3874,8 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info,
...
@@ -3874,8 +3874,8 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info,
file
->
engine_name
()
->
str
,
file
->
engine_name
()
->
str
,
"TRANSACTIONAL=1"
);
"TRANSACTIONAL=1"
);
if
(
parse_option_list
(
thd
,
&
create_info
->
option_struct
,
if
(
parse_option_list
(
thd
,
file
->
partition_ht
(),
&
create_info
->
option_struct
,
create_info
->
option_list
,
&
create_info
->
option_list
,
file
->
partition_ht
()
->
table_options
,
FALSE
,
file
->
partition_ht
()
->
table_options
,
FALSE
,
thd
->
mem_root
))
thd
->
mem_root
))
DBUG_RETURN
(
TRUE
);
DBUG_RETURN
(
TRUE
);
...
...
storage/example/ha_example.cc
View file @
5f293dd6
...
@@ -118,6 +118,8 @@ static HASH example_open_tables;
...
@@ -118,6 +118,8 @@ static HASH example_open_tables;
/* The mutex used to init the hash; variable for example share methods */
/* The mutex used to init the hash; variable for example share methods */
mysql_mutex_t
example_mutex
;
mysql_mutex_t
example_mutex
;
static
MYSQL_THDVAR_ULONG
(
varopt_default
,
PLUGIN_VAR_RQCMDARG
,
"default value of the VAROPT table option"
,
NULL
,
NULL
,
5
,
0
,
100
,
0
);
/**
/**
Structure for CREATE TABLE options (table options).
Structure for CREATE TABLE options (table options).
...
@@ -133,6 +135,7 @@ struct ha_table_option_struct
...
@@ -133,6 +135,7 @@ struct ha_table_option_struct
ulonglong
ullparam
;
ulonglong
ullparam
;
uint
enumparam
;
uint
enumparam
;
bool
boolparam
;
bool
boolparam
;
ulonglong
varparam
;
};
};
...
@@ -179,6 +182,12 @@ ha_create_table_option example_table_option_list[]=
...
@@ -179,6 +182,12 @@ ha_create_table_option example_table_option_list[]=
The default is 1, that is true, yes, on.
The default is 1, that is true, yes, on.
*/
*/
HA_TOPTION_BOOL
(
"YESNO"
,
boolparam
,
1
),
HA_TOPTION_BOOL
(
"YESNO"
,
boolparam
,
1
),
/*
one option defined by the system variable. The type, the range, or
a list of allowed values is the same as for the system variable.
*/
HA_TOPTION_SYSVAR
(
"VAROPT"
,
varparam
,
varopt_default
),
HA_TOPTION_END
HA_TOPTION_END
};
};
...
@@ -1089,6 +1098,7 @@ static MYSQL_SYSVAR_ULONG(
...
@@ -1089,6 +1098,7 @@ static MYSQL_SYSVAR_ULONG(
static
struct
st_mysql_sys_var
*
example_system_variables
[]
=
{
static
struct
st_mysql_sys_var
*
example_system_variables
[]
=
{
MYSQL_SYSVAR
(
enum_var
),
MYSQL_SYSVAR
(
enum_var
),
MYSQL_SYSVAR
(
ulong_var
),
MYSQL_SYSVAR
(
ulong_var
),
MYSQL_SYSVAR
(
varopt_default
),
NULL
NULL
};
};
...
...
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