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
6c4263ed
Commit
6c4263ed
authored
Oct 26, 2004
by
bar@mysql.com
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Reuse more code: two equal pieces for ENUM and SET where moved
into a function.
parent
74b99641
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
58 additions
and
26 deletions
+58
-26
mysql-test/r/ctype_utf8.result
mysql-test/r/ctype_utf8.result
+13
-0
mysql-test/t/ctype_utf8.test
mysql-test/t/ctype_utf8.test
+12
-0
sql/sql_parse.cc
sql/sql_parse.cc
+33
-26
No files found.
mysql-test/r/ctype_utf8.result
View file @
6c4263ed
...
...
@@ -799,3 +799,16 @@ select * from t1 where b like 'foob%';
a b
2 foobar
drop table t1;
create table t1 (
a enum('петя','вася','анюта') character set utf8 not null default 'анюта',
b set('петя','вася','анюта') character set utf8 not null default 'анюта'
);
create table t2 select concat(a,_utf8'') as a, concat(b,_utf8'')as b from t1;
show create table t2;
Table Create Table
t2 CREATE TABLE `t2` (
`a` char(5) character set utf8 NOT NULL default '',
`b` char(15) character set utf8 NOT NULL default ''
) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop table t2;
drop table t1;
mysql-test/t/ctype_utf8.test
View file @
6c4263ed
...
...
@@ -644,3 +644,15 @@ create table t1 (
insert
into
t1
values
(
1
,
'foo'
),(
2
,
'foobar'
);
select
*
from
t1
where
b
like
'foob%'
;
drop
table
t1
;
#
# Test for calculate_interval_lengths() function
#
create
table
t1
(
a
enum
(
'петя'
,
'вася'
,
'анюта'
)
character
set
utf8
not
null
default
'анюта'
,
b
set
(
'петя'
,
'вася'
,
'анюта'
)
character
set
utf8
not
null
default
'анюта'
);
create
table
t2
select
concat
(
a
,
_utf8
''
)
as
a
,
concat
(
b
,
_utf8
''
)
as
b
from
t1
;
show
create
table
t2
;
drop
table
t2
;
drop
table
t1
;
sql/sql_parse.cc
View file @
6c4263ed
...
...
@@ -4091,6 +4091,31 @@ bool mysql_test_parse_for_slave(THD *thd, char *inBuf, uint length)
#endif
/*
Calculate interval lengths.
Strip trailing spaces from all strings.
After this function call:
- ENUM uses max_length
- SET uses tot_length.
*/
void
calculate_interval_lengths
(
THD
*
thd
,
TYPELIB
*
interval
,
uint
*
max_length
,
uint
*
tot_length
)
{
const
char
**
pos
;
uint
*
len
;
CHARSET_INFO
*
cs
=
thd
->
variables
.
character_set_client
;
*
max_length
=
*
tot_length
=
0
;
for
(
pos
=
interval
->
type_names
,
len
=
interval
->
type_lengths
;
*
pos
;
pos
++
,
len
++
)
{
*
len
=
(
uint
)
strip_sp
((
char
*
)
*
pos
);
uint
length
=
cs
->
cset
->
numchars
(
cs
,
*
pos
,
*
pos
+
*
len
);
*
tot_length
+=
length
;
set_if_bigger
(
*
max_length
,
length
);
}
}
/*****************************************************************************
** Store field definition for create
** Return 0 if ok
...
...
@@ -4405,19 +4430,10 @@ bool add_field_to_list(THD *thd, char *field_name, enum_field_types type,
if
(
new_field
->
pack_length
>
4
)
new_field
->
pack_length
=
8
;
new_field
->
interval
=
interval
;
new_field
->
length
=
0
;
uint
*
lengths
;
const
char
**
pos
;
for
(
pos
=
interval
->
type_names
,
lengths
=
interval
->
type_lengths
;
*
pos
;
pos
++
,
lengths
++
)
{
CHARSET_INFO
*
cs
=
thd
->
variables
.
character_set_client
;
uint
length
=
(
uint
)
strip_sp
((
char
*
)
*
pos
)
+
1
;
set_if_smaller
(
*
lengths
,
length
);
length
=
cs
->
cset
->
numchars
(
cs
,
*
pos
,
*
pos
+
length
);
new_field
->
length
+=
length
;
}
new_field
->
length
--
;
uint
dummy_max_length
;
calculate_interval_lengths
(
thd
,
interval
,
&
dummy_max_length
,
&
new_field
->
length
);
new_field
->
length
+=
(
interval
->
count
-
1
);
set_if_smaller
(
new_field
->
length
,
MAX_FIELD_WIDTH
-
1
);
if
(
default_value
)
{
...
...
@@ -4442,19 +4458,10 @@ bool add_field_to_list(THD *thd, char *field_name, enum_field_types type,
{
new_field
->
interval
=
interval
;
new_field
->
pack_length
=
interval
->
count
<
256
?
1
:
2
;
// Should be safe
new_field
->
length
=
(
uint
)
strip_sp
((
char
*
)
interval
->
type_names
[
0
]);
set_if_smaller
(
interval
->
type_lengths
[
0
],
new_field
->
length
);
uint
*
lengths
;
const
char
**
pos
;
for
(
pos
=
interval
->
type_names
+
1
,
lengths
=
interval
->
type_lengths
+
1
;
*
pos
;
pos
++
,
lengths
++
)
{
CHARSET_INFO
*
cs
=
thd
->
variables
.
character_set_client
;
uint
length
=
(
uint
)
strip_sp
((
char
*
)
*
pos
);
set_if_smaller
(
*
lengths
,
length
);
length
=
cs
->
cset
->
numchars
(
cs
,
*
pos
,
*
pos
+
length
);
set_if_bigger
(
new_field
->
length
,
length
);
}
uint
dummy_tot_length
;
calculate_interval_lengths
(
thd
,
interval
,
&
new_field
->
length
,
&
dummy_tot_length
);
set_if_smaller
(
new_field
->
length
,
MAX_FIELD_WIDTH
-
1
);
if
(
default_value
)
{
...
...
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