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
0474a695
Commit
0474a695
authored
Jun 27, 2003
by
unknown
Browse files
Options
Browse Files
Download
Plain Diff
Merge mysql.com:/space/my/mysql-4.1
into mysql.com:/space/my/mysql-4.1-build
parents
4a03f605
de52e5fa
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
95 additions
and
53 deletions
+95
-53
mysql-test/r/ctype_latin1_de.result
mysql-test/r/ctype_latin1_de.result
+5
-5
mysql-test/r/func_str.result
mysql-test/r/func_str.result
+22
-0
mysql-test/t/ctype_latin1_de.test
mysql-test/t/ctype_latin1_de.test
+8
-5
mysql-test/t/func_str.test
mysql-test/t/func_str.test
+15
-0
sql/item.cc
sql/item.cc
+13
-13
sql/item_cmpfunc.cc
sql/item_cmpfunc.cc
+23
-24
sql/item_cmpfunc.h
sql/item_cmpfunc.h
+9
-6
No files found.
mysql-test/r/ctype_latin1_de.result
View file @
0474a695
...
...
@@ -215,21 +215,21 @@ drop table t1;
create table t1 (word varchar(255) not null, word2 varchar(255) not null, index(word));
insert into t1 (word) values ('ss'),(0xDF),(0xE4),('ae');
update t1 set word2=word;
select word, word=0xdf as t from t1 having t > 0;
select word, word=
binary
0xdf as t from t1 having t > 0;
word t
1
select word, word=cast(0xdf AS CHAR) as t from t1 having t > 0;
word t
ss 1
1
select * from t1 where word=0xDF;
select * from t1 where word=
binary
0xDF;
word word2
select * from t1 where word=CAST(0xDF as CHAR);
word word2
ss ss
select * from t1 where word2=0xDF;
select * from t1 where word2=
binary
0xDF;
word word2
select * from t1 where word2=CAST(0xDF as CHAR);
...
...
@@ -244,7 +244,7 @@ select * from t1 where word= 0xe4 or word=CAST(0xe4 as CHAR);
word word2
ae ae
select * from t1 where word between
0xDF and
0xDF;
select * from t1 where word between
binary 0xDF and binary
0xDF;
word word2
select * from t1 where word between CAST(0xDF AS CHAR) and CAST(0xDF AS CHAR);
...
...
@@ -257,7 +257,7 @@ ae ae
select * from t1 where word like 'AE';
word word2
ae ae
select * from t1 where word like 0xDF;
select * from t1 where word like
binary
0xDF;
word word2
select * from t1 where word like CAST(0xDF as CHAR);
...
...
mysql-test/r/func_str.result
View file @
0474a695
...
...
@@ -296,6 +296,28 @@ select _latin1'B' between _latin1'a' and _latin2'b';
ERROR HY000: Illegal mix of collations (latin1_swedish_ci,COERCIBLE), (latin1_swedish_ci,COERCIBLE), (latin2_general_ci,COERCIBLE) for operation 'between'
select _latin1'B' collate latin1_general_ci between _latin1'a' collate latin1_bin and _latin1'b';
ERROR HY000: Illegal mix of collations (latin1_general_ci,EXPLICIT), (latin1_bin,EXPLICIT), (latin1_swedish_ci,COERCIBLE) for operation 'between'
select _latin1'B' in (_latin1'a',_latin1'b');
_latin1'B' in (_latin1'a',_latin1'b')
1
select _latin1'B' collate latin1_bin in (_latin1'a',_latin1'b');
_latin1'B' collate latin1_bin in (_latin1'a',_latin1'b')
0
select _latin1'B' in (_latin1'a' collate latin1_bin,_latin1'b');
_latin1'B' in (_latin1'a' collate latin1_bin,_latin1'b')
0
select _latin1'B' in (_latin1'a',_latin1'b' collate latin1_bin);
_latin1'B' in (_latin1'a',_latin1'b' collate latin1_bin)
0
select _latin2'B' in (_latin1'a',_latin1'b');
ERROR HY000: Illegal mix of collations for operation ' IN '
select _latin1'B' in (_latin2'a',_latin1'b');
ERROR HY000: Illegal mix of collations for operation ' IN '
select _latin1'B' in (_latin1'a',_latin2'b');
ERROR HY000: Illegal mix of collations for operation ' IN '
select _latin1'B' COLLATE latin1_general_ci in (_latin1'a' COLLATE latin1_bin,_latin1'b');
ERROR HY000: Illegal mix of collations for operation ' IN '
select _latin1'B' COLLATE latin1_general_ci in (_latin1'a',_latin1'b' COLLATE latin1_bin);
ERROR HY000: Illegal mix of collations for operation ' IN '
select collation(bin(130)), coercibility(bin(130));
collation(bin(130)) coercibility(bin(130))
latin1_swedish_ci 3
...
...
mysql-test/t/ctype_latin1_de.test
View file @
0474a695
...
...
@@ -52,21 +52,24 @@ drop table t1;
# Test bug report #152 (problem with index on latin1_de)
#
#
# The below checks both binary and character comparisons.
#
create
table
t1
(
word
varchar
(
255
)
not
null
,
word2
varchar
(
255
)
not
null
,
index
(
word
));
insert
into
t1
(
word
)
values
(
'ss'
),(
0xDF
),(
0xE4
),(
'ae'
);
update
t1
set
word2
=
word
;
select
word
,
word
=
0xdf
as
t
from
t1
having
t
>
0
;
select
word
,
word
=
binary
0xdf
as
t
from
t1
having
t
>
0
;
select
word
,
word
=
cast
(
0xdf
AS
CHAR
)
as
t
from
t1
having
t
>
0
;
select
*
from
t1
where
word
=
0xDF
;
select
*
from
t1
where
word
=
binary
0xDF
;
select
*
from
t1
where
word
=
CAST
(
0xDF
as
CHAR
);
select
*
from
t1
where
word2
=
0xDF
;
select
*
from
t1
where
word2
=
binary
0xDF
;
select
*
from
t1
where
word2
=
CAST
(
0xDF
as
CHAR
);
select
*
from
t1
where
word
=
'ae'
;
select
*
from
t1
where
word
=
0xe4
or
word
=
CAST
(
0xe4
as
CHAR
);
select
*
from
t1
where
word
between
0xDF
and
0xDF
;
select
*
from
t1
where
word
between
binary
0xDF
and
binary
0xDF
;
select
*
from
t1
where
word
between
CAST
(
0xDF
AS
CHAR
)
and
CAST
(
0xDF
AS
CHAR
);
select
*
from
t1
where
word
like
'ae'
;
select
*
from
t1
where
word
like
'AE'
;
select
*
from
t1
where
word
like
0xDF
;
select
*
from
t1
where
word
like
binary
0xDF
;
select
*
from
t1
where
word
like
CAST
(
0xDF
as
CHAR
);
drop
table
t1
;
mysql-test/t/func_str.test
View file @
0474a695
...
...
@@ -175,6 +175,21 @@ select _latin1'B' between _latin1'a' and _latin2'b';
--
error
1268
select
_latin1
'B'
collate
latin1_general_ci
between
_latin1
'a'
collate
latin1_bin
and
_latin1
'b'
;
select
_latin1
'B'
in
(
_latin1
'a'
,
_latin1
'b'
);
select
_latin1
'B'
collate
latin1_bin
in
(
_latin1
'a'
,
_latin1
'b'
);
select
_latin1
'B'
in
(
_latin1
'a'
collate
latin1_bin
,
_latin1
'b'
);
select
_latin1
'B'
in
(
_latin1
'a'
,
_latin1
'b'
collate
latin1_bin
);
--
error
1269
select
_latin2
'B'
in
(
_latin1
'a'
,
_latin1
'b'
);
--
error
1269
select
_latin1
'B'
in
(
_latin2
'a'
,
_latin1
'b'
);
--
error
1269
select
_latin1
'B'
in
(
_latin1
'a'
,
_latin2
'b'
);
--
error
1269
select
_latin1
'B'
COLLATE
latin1_general_ci
in
(
_latin1
'a'
COLLATE
latin1_bin
,
_latin1
'b'
);
--
error
1269
select
_latin1
'B'
COLLATE
latin1_general_ci
in
(
_latin1
'a'
,
_latin1
'b'
COLLATE
latin1_bin
);
select
collation
(
bin
(
130
)),
coercibility
(
bin
(
130
));
select
collation
(
oct
(
130
)),
coercibility
(
oct
(
130
));
select
collation
(
conv
(
130
,
16
,
10
)),
coercibility
(
conv
(
130
,
16
,
10
));
...
...
sql/item.cc
View file @
0474a695
...
...
@@ -39,7 +39,7 @@ Item::Item():
{
marker
=
0
;
maybe_null
=
null_value
=
with_sum_func
=
unsigned_flag
=
0
;
set_charset
(
&
my_charset_bin
,
DERIVATION_COERCIBLE
);
set_charset
(
default_charset
()
,
DERIVATION_COERCIBLE
);
name
=
0
;
decimals
=
0
;
max_length
=
0
;
THD
*
thd
=
current_thd
;
...
...
@@ -185,27 +185,27 @@ CHARSET_INFO * Item::default_charset() const
bool
DTCollation
::
aggregate
(
DTCollation
&
dt
)
{
if
(
collation
==
&
my_charset_bin
||
dt
.
collation
==
&
my_charset_bin
)
{
collation
=
&
my_charset_bin
;
derivation
=
derivation
>
dt
.
derivation
?
derivation
:
dt
.
derivation
;
return
0
;
}
if
(
!
my_charset_same
(
collation
,
dt
.
collation
))
{
/*
We do allow to use binary strings (like BLOBS)
together with character strings.
Binaries have more precedance
Binaries have more precedance than a character
string of the same derivation.
*/
if
(
(
derivation
<=
dt
.
derivation
)
&&
(
collation
==
&
my_charset_bin
)
)
if
(
collation
==
&
my_charset_bin
)
{
// Do nothing
if
(
derivation
<=
dt
.
derivation
)
;
// Do nothing
else
set
(
dt
);
}
else
if
(
(
dt
.
derivation
<=
derivation
)
&&
(
dt
.
collation
==&
my_charset_bin
)
)
else
if
(
dt
.
collation
==
&
my_charset_bin
)
{
set
(
dt
);
if
(
dt
.
derivation
<=
derivation
)
set
(
dt
);
else
;
// Do nothing
}
else
{
...
...
sql/item_cmpfunc.cc
View file @
0474a695
...
...
@@ -1196,17 +1196,17 @@ void Item_func_coalesce::fix_length_and_dec()
Classes and function for the IN operator
****************************************************************************/
static
int
cmp_longlong
(
longlong
*
a
,
longlong
*
b
)
static
int
cmp_longlong
(
void
*
cmp_arg
,
longlong
*
a
,
longlong
*
b
)
{
return
*
a
<
*
b
?
-
1
:
*
a
==
*
b
?
0
:
1
;
}
static
int
cmp_double
(
double
*
a
,
double
*
b
)
static
int
cmp_double
(
void
*
cmp_arg
,
double
*
a
,
double
*
b
)
{
return
*
a
<
*
b
?
-
1
:
*
a
==
*
b
?
0
:
1
;
}
static
int
cmp_row
(
cmp_item_row
*
a
,
cmp_item_row
*
b
)
static
int
cmp_row
(
void
*
cmp_arg
,
cmp_item_row
*
a
,
cmp_item_row
*
b
)
{
return
a
->
compare
(
b
);
}
...
...
@@ -1223,18 +1223,18 @@ int in_vector::find(Item *item)
{
uint
mid
=
(
start
+
end
+
1
)
/
2
;
int
res
;
if
((
res
=
(
*
compare
)(
base
+
mid
*
size
,
result
))
==
0
)
if
((
res
=
(
*
compare
)(
collation
,
base
+
mid
*
size
,
result
))
==
0
)
return
1
;
if
(
res
<
0
)
start
=
mid
;
else
end
=
mid
-
1
;
}
return
(
int
)
((
*
compare
)(
base
+
start
*
size
,
result
)
==
0
);
return
(
int
)
((
*
compare
)(
collation
,
base
+
start
*
size
,
result
)
==
0
);
}
in_string
::
in_string
(
uint
elements
,
qsort
_cmp
cmp_func
)
:
in_vector
(
elements
,
sizeof
(
String
),
cmp_func
),
in_string
::
in_string
(
uint
elements
,
qsort
2_cmp
cmp_func
,
CHARSET_INFO
*
cs
)
:
in_vector
(
elements
,
sizeof
(
String
),
cmp_func
,
cs
),
tmp
(
buff
,
sizeof
(
buff
),
&
my_charset_bin
)
{}
...
...
@@ -1273,7 +1273,7 @@ in_row::in_row(uint elements, Item * item)
{
base
=
(
char
*
)
new
cmp_item_row
[
count
=
elements
];
size
=
sizeof
(
cmp_item_row
);
compare
=
(
qsort_cmp
)
cmp_row
;
compare
=
(
qsort
2
_cmp
)
cmp_row
;
tmp
.
store_value
(
item
);
}
...
...
@@ -1298,7 +1298,7 @@ void in_row::set(uint pos, Item *item)
}
in_longlong
::
in_longlong
(
uint
elements
)
:
in_vector
(
elements
,
sizeof
(
longlong
),(
qsort
_cmp
)
cmp_longlong
)
:
in_vector
(
elements
,
sizeof
(
longlong
),(
qsort
2_cmp
)
cmp_longlong
,
0
)
{}
void
in_longlong
::
set
(
uint
pos
,
Item
*
item
)
...
...
@@ -1315,7 +1315,7 @@ byte *in_longlong::get_value(Item *item)
}
in_double
::
in_double
(
uint
elements
)
:
in_vector
(
elements
,
sizeof
(
double
),(
qsort
_cmp
)
cmp_double
)
:
in_vector
(
elements
,
sizeof
(
double
),(
qsort
2_cmp
)
cmp_double
,
0
)
{}
void
in_double
::
set
(
uint
pos
,
Item
*
item
)
...
...
@@ -1462,17 +1462,8 @@ bool Item_func_in::nulls_in_row()
return
0
;
}
static
int
srtcmp_in
(
const
String
*
x
,
const
String
*
y
)
static
int
srtcmp_in
(
CHARSET_INFO
*
cs
,
const
String
*
x
,
const
String
*
y
)
{
CHARSET_INFO
*
cs
=
x
->
charset
();
return
cs
->
coll
->
strnncollsp
(
cs
,
(
unsigned
char
*
)
x
->
ptr
(),
x
->
length
(),
(
unsigned
char
*
)
y
->
ptr
(),
y
->
length
());
}
static
int
bincmp_in
(
const
String
*
x
,
const
String
*
y
)
{
CHARSET_INFO
*
cs
=
&
my_charset_bin
;
return
cs
->
coll
->
strnncollsp
(
cs
,
(
unsigned
char
*
)
x
->
ptr
(),
x
->
length
(),
(
unsigned
char
*
)
y
->
ptr
(),
y
->
length
());
...
...
@@ -1488,10 +1479,18 @@ void Item_func_in::fix_length_and_dec()
{
switch
(
item
->
result_type
())
{
case
STRING_RESULT
:
if
(
item
->
binary
())
array
=
new
in_string
(
arg_count
,(
qsort_cmp
)
srtcmp_in
);
else
array
=
new
in_string
(
arg_count
,(
qsort_cmp
)
bincmp_in
);
uint
i
;
cmp_collation
.
set
(
item
->
collation
);
for
(
i
=
0
;
i
<
arg_count
;
i
++
)
if
(
cmp_collation
.
aggregate
(
args
[
i
]
->
collation
))
break
;
if
(
cmp_collation
.
derivation
==
DERIVATION_NONE
)
{
my_error
(
ER_CANT_AGGREGATE_NCOLLATIONS
,
MYF
(
0
),
func_name
());
return
;
}
array
=
new
in_string
(
arg_count
,(
qsort2_cmp
)
srtcmp_in
,
cmp_collation
.
collation
);
break
;
case
INT_RESULT
:
array
=
new
in_longlong
(
arg_count
);
...
...
sql/item_cmpfunc.h
View file @
0474a695
...
...
@@ -382,21 +382,23 @@ class in_vector :public Sql_alloc
protected:
char
*
base
;
uint
size
;
qsort_cmp
compare
;
qsort2_cmp
compare
;
CHARSET_INFO
*
collation
;
uint
count
;
public:
uint
used_count
;
in_vector
()
{}
in_vector
(
uint
elements
,
uint
element_length
,
qsort_cmp
cmp_func
)
in_vector
(
uint
elements
,
uint
element_length
,
qsort2_cmp
cmp_func
,
CHARSET_INFO
*
cmp_coll
)
:
base
((
char
*
)
sql_calloc
(
elements
*
element_length
)),
size
(
element_length
),
compare
(
cmp_func
),
co
unt
(
elements
),
used_count
(
elements
)
{}
size
(
element_length
),
compare
(
cmp_func
),
co
llation
(
cmp_coll
),
count
(
elements
),
used_count
(
elements
)
{}
virtual
~
in_vector
()
{}
virtual
void
set
(
uint
pos
,
Item
*
item
)
=
0
;
virtual
byte
*
get_value
(
Item
*
item
)
=
0
;
void
sort
()
{
qsort
(
base
,
used_count
,
size
,
compare
);
qsort
2
(
base
,
used_count
,
size
,
compare
,
collation
);
}
int
find
(
Item
*
item
);
};
...
...
@@ -406,7 +408,7 @@ class in_string :public in_vector
char
buff
[
80
];
String
tmp
;
public:
in_string
(
uint
elements
,
qsort
_cmp
cmp_func
);
in_string
(
uint
elements
,
qsort
2_cmp
cmp_func
,
CHARSET_INFO
*
cs
);
~
in_string
();
void
set
(
uint
pos
,
Item
*
item
);
byte
*
get_value
(
Item
*
item
);
...
...
@@ -605,6 +607,7 @@ class Item_func_in :public Item_int_func
in_vector
*
array
;
cmp_item
*
in_item
;
bool
have_null
;
DTCollation
cmp_collation
;
public:
Item_func_in
(
Item
*
a
,
List
<
Item
>
&
list
)
:
Item_int_func
(
list
),
item
(
a
),
array
(
0
),
in_item
(
0
),
have_null
(
0
)
...
...
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