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
f42bda6d
Commit
f42bda6d
authored
Jun 11, 2019
by
Alexander Barkov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
MDEV-19727 Add Type_handler::Key_part_spec_init_ft
parent
16366564
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
162 additions
and
19 deletions
+162
-19
mysql-test/main/column_compression.result
mysql-test/main/column_compression.result
+16
-0
mysql-test/main/column_compression.test
mysql-test/main/column_compression.test
+29
-0
mysql-test/main/type_varchar.result
mysql-test/main/type_varchar.result
+29
-0
mysql-test/main/type_varchar.test
mysql-test/main/type_varchar.test
+23
-0
sql/sql_string.h
sql/sql_string.h
+5
-0
sql/sql_table.cc
sql/sql_table.cc
+48
-19
sql/sql_type.h
sql/sql_type.h
+12
-0
No files found.
mysql-test/main/column_compression.result
View file @
f42bda6d
...
...
@@ -1486,3 +1486,19 @@ WHERE TABLE_SCHEMA='test' AND TABLE_NAME='t1';
COLUMN_TYPE
varchar(1000) /*!100301 COMPRESSED*/
DROP TABLE t1;
#
# End of 10.3 tests
#
#
# Start of 10.5 tests
#
#
# MDEV-19727 Add Type_handler::Key_part_spec_init_ft
#
CREATE TABLE t1 (a VARCHAR(1000) COMPRESSED, FULLTEXT INDEX(a));
ERROR HY000: Compressed column 'a' can't be used in key specification
CREATE TABLE t1 (a TEXT COMPRESSED, FULLTEXT INDEX(a));
ERROR HY000: Compressed column 'a' can't be used in key specification
#
# End of 10.5 tests
#
mysql-test/main/column_compression.test
View file @
f42bda6d
...
...
@@ -181,3 +181,32 @@ SHOW CREATE TABLE t1;
SELECT
COLUMN_TYPE
FROM
INFORMATION_SCHEMA
.
COLUMNS
WHERE
TABLE_SCHEMA
=
'test'
AND
TABLE_NAME
=
't1'
;
DROP
TABLE
t1
;
--
echo
#
--
echo
# End of 10.3 tests
--
echo
#
--
echo
#
--
echo
# Start of 10.5 tests
--
echo
#
--
echo
#
--
echo
# MDEV-19727 Add Type_handler::Key_part_spec_init_ft
--
echo
#
#
# Indexes on COMPRESSED columns are generally prohibited, so we don't have
# to override Type_handler_xxx_compressed::Key_part_spec_init_ft().
# Note, we could support FULLTEXT indexes on compressed columns eventually.
#
--
error
ER_COMPRESSED_COLUMN_USED_AS_KEY
CREATE
TABLE
t1
(
a
VARCHAR
(
1000
)
COMPRESSED
,
FULLTEXT
INDEX
(
a
));
--
error
ER_COMPRESSED_COLUMN_USED_AS_KEY
CREATE
TABLE
t1
(
a
TEXT
COMPRESSED
,
FULLTEXT
INDEX
(
a
));
--
echo
#
--
echo
# End of 10.5 tests
--
echo
#
mysql-test/main/type_varchar.result
View file @
f42bda6d
...
...
@@ -723,3 +723,32 @@ SET sql_mode=DEFAULT;
#
# End of 10.4 tests
#
#
# Start of 10.5 tests
#
#
# MDEV-15592 Column COMPRESSED should select a 'high order' datatype
#
TRUNCATE TABLE vchar;
SHOW CREATE TABLE vchar;
Table Create Table
vchar CREATE TABLE `vchar` (
`v` varchar(30)/*old*/ DEFAULT NULL,
`c` char(3) DEFAULT NULL,
`e` enum('abc','def','ghi') DEFAULT NULL,
`t` text DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
ALTER TABLE vchar ADD FULLTEXT INDEX(v);
SHOW CREATE TABLE vchar;
Table Create Table
vchar CREATE TABLE `vchar` (
`v` varchar(30) DEFAULT NULL,
`c` char(3) DEFAULT NULL,
`e` enum('abc','def','ghi') DEFAULT NULL,
`t` text DEFAULT NULL,
FULLTEXT KEY `v` (`v`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
DROP TABLE vchar;
#
# End of 10.5 tests
#
mysql-test/main/type_varchar.test
View file @
f42bda6d
...
...
@@ -359,3 +359,26 @@ SET sql_mode=DEFAULT;
--
echo
#
--
echo
# End of 10.4 tests
--
echo
#
--
echo
#
--
echo
# Start of 10.5 tests
--
echo
#
--
echo
#
--
echo
# MDEV-15592 Column COMPRESSED should select a 'high order' datatype
--
echo
#
#
# Old VARCHAR is automatically upgraded to new VARCHAR.
# So we don't have to override Type_handler_var_string::Key_part_spec_init_ft()
#
copy_file
$MYSQL_TEST_DIR
/
std_data
/
vchar
.
frm
$MYSQLD_DATADIR
/
test
/
vchar
.
frm
;
TRUNCATE
TABLE
vchar
;
SHOW
CREATE
TABLE
vchar
;
ALTER
TABLE
vchar
ADD
FULLTEXT
INDEX
(
v
);
SHOW
CREATE
TABLE
vchar
;
DROP
TABLE
vchar
;
--
echo
#
--
echo
# End of 10.5 tests
--
echo
#
sql/sql_string.h
View file @
f42bda6d
...
...
@@ -138,6 +138,11 @@ class Charset
CHARSET_INFO
*
charset
()
const
{
return
m_charset
;
}
uint
mbminlen
()
const
{
return
m_charset
->
mbminlen
;
}
uint
mbmaxlen
()
const
{
return
m_charset
->
mbmaxlen
;
}
bool
is_good_for_ft
()
const
{
// Binary and UCS2/UTF16/UTF32 are not supported
return
m_charset
!=
&
my_charset_bin
&&
m_charset
->
mbminlen
==
1
;
}
size_t
numchars
(
const
char
*
str
,
const
char
*
end
)
const
{
...
...
sql/sql_table.cc
View file @
f42bda6d
...
...
@@ -3361,6 +3361,45 @@ mysql_add_invisible_index(THD *thd, List<Key> *key_list,
key_list
->
push_back
(
key
,
thd
->
mem_root
);
return
key
;
}
bool
Type_handler_string
::
Key_part_spec_init_ft
(
Key_part_spec
*
part
,
const
Column_definition
&
def
)
const
{
/*
Set length to 0. It's set to the real column width later for CHAR.
It has to be the correct col width for CHAR, as its data are not
prefixed with length (unlike blobs).
*/
part
->
length
=
0
;
return
!
Charset
(
def
.
charset
).
is_good_for_ft
();
}
bool
Type_handler_varchar
::
Key_part_spec_init_ft
(
Key_part_spec
*
part
,
const
Column_definition
&
def
)
const
{
part
->
length
=
0
;
return
!
Charset
(
def
.
charset
).
is_good_for_ft
();
}
bool
Type_handler_blob_common
::
Key_part_spec_init_ft
(
Key_part_spec
*
part
,
const
Column_definition
&
def
)
const
{
/*
Set keyseg length to 1 for blobs.
It's ignored in ft code: the data length is taken from the length prefix.
*/
part
->
length
=
1
;
return
!
Charset
(
def
.
charset
).
is_good_for_ft
();
}
/*
Preparation for table creation
...
...
@@ -3894,28 +3933,18 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info,
cols2
.
rewind
();
if
(
key
->
type
==
Key
::
FULLTEXT
)
{
if
((
sql_field
->
real_field_type
()
!=
MYSQL_TYPE_STRING
&&
sql_field
->
real_field_type
()
!=
MYSQL_TYPE_VARCHAR
&&
!
f_is_blob
(
sql_field
->
pack_flag
))
||
sql_field
->
charset
==
&
my_charset_bin
||
sql_field
->
charset
->
mbminlen
>
1
||
// ucs2 doesn't work yet
(
ft_key_charset
&&
sql_field
->
charset
!=
ft_key_charset
))
{
my_error
(
ER_BAD_FT_COLUMN
,
MYF
(
0
),
column
->
field_name
.
str
);
DBUG_RETURN
(
-
1
);
}
ft_key_charset
=
sql_field
->
charset
;
/*
for fulltext keys keyseg length is 1 for blobs (it's ignored in ft
code anyway, and 0 (set to column width later) for char's. it has
to be correct col width for char's, as char data are not prefixed
with length (unlike blobs, where ft code takes data length from a
data prefix, ignoring column->length).
*/
column
->
length
=
MY_TEST
(
f_is_blob
(
sql_field
->
pack_flag
));
if
(
sql_field
->
type_handler
()
->
Key_part_spec_init_ft
(
column
,
*
sql_field
)
||
(
ft_key_charset
&&
sql_field
->
charset
!=
ft_key_charset
))
{
my_error
(
ER_BAD_FT_COLUMN
,
MYF
(
0
),
column
->
field_name
.
str
);
DBUG_RETURN
(
-
1
);
}
ft_key_charset
=
sql_field
->
charset
;
}
else
{
column
->
length
*=
sql_field
->
charset
->
mbmaxlen
;
if
(
key
->
type
==
Key
::
SPATIAL
)
...
...
sql/sql_type.h
View file @
f42bda6d
...
...
@@ -34,6 +34,7 @@ C_MODE_END
class
Field
;
class
Column_definition
;
class
Column_definition_attributes
;
class
Key_part_spec
;
class
Item
;
class
Item_const
;
class
Item_literal
;
...
...
@@ -3456,6 +3457,11 @@ class Type_handler
virtual
bool
Column_definition_prepare_stage2
(
Column_definition
*
c
,
handler
*
file
,
ulonglong
table_flags
)
const
=
0
;
virtual
bool
Key_part_spec_init_ft
(
Key_part_spec
*
part
,
const
Column_definition
&
def
)
const
{
return
true
;
// Error
}
virtual
Field
*
make_table_field
(
const
LEX_CSTRING
*
name
,
const
Record_addr
&
addr
,
const
Type_all_attributes
&
attr
,
...
...
@@ -6002,6 +6008,8 @@ class Type_handler_string: public Type_handler_longstr
bool
Column_definition_prepare_stage2
(
Column_definition
*
c
,
handler
*
file
,
ulonglong
table_flags
)
const
;
bool
Key_part_spec_init_ft
(
Key_part_spec
*
part
,
const
Column_definition
&
def
)
const
;
Field
*
make_table_field
(
const
LEX_CSTRING
*
name
,
const
Record_addr
&
addr
,
const
Type_all_attributes
&
attr
,
...
...
@@ -6084,6 +6092,8 @@ class Type_handler_varchar: public Type_handler_longstr
bool
Column_definition_prepare_stage2
(
Column_definition
*
c
,
handler
*
file
,
ulonglong
table_flags
)
const
;
bool
Key_part_spec_init_ft
(
Key_part_spec
*
part
,
const
Column_definition
&
def
)
const
;
Field
*
make_table_field
(
const
LEX_CSTRING
*
name
,
const
Record_addr
&
addr
,
const
Type_all_attributes
&
attr
,
...
...
@@ -6157,6 +6167,8 @@ class Type_handler_blob_common: public Type_handler_longstr
bool
Column_definition_prepare_stage2
(
Column_definition
*
c
,
handler
*
file
,
ulonglong
table_flags
)
const
;
bool
Key_part_spec_init_ft
(
Key_part_spec
*
part
,
const
Column_definition
&
def
)
const
;
bool
Item_hybrid_func_fix_attributes
(
THD
*
thd
,
const
char
*
name
,
Type_handler_hybrid_field_type
*
,
...
...
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