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
268110b3
Commit
268110b3
authored
Jun 23, 2005
by
igor@rurik.mysql.com
Browse files
Options
Browse Files
Download
Plain Diff
Manual merge
parents
0a5223bf
1c348f48
Changes
9
Show whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
273 additions
and
30 deletions
+273
-30
mysql-test/r/func_str.result
mysql-test/r/func_str.result
+11
-0
mysql-test/r/rpl_multi_update3.result
mysql-test/r/rpl_multi_update3.result
+81
-0
mysql-test/t/func_str.test
mysql-test/t/func_str.test
+14
-0
mysql-test/t/rpl_multi_update3.test
mysql-test/t/rpl_multi_update3.test
+129
-4
sql/field.cc
sql/field.cc
+16
-12
sql/item_subselect.cc
sql/item_subselect.cc
+2
-2
sql/sql_parse.cc
sql/sql_parse.cc
+0
-1
sql/sql_select.cc
sql/sql_select.cc
+4
-2
sql/sql_select.h
sql/sql_select.h
+16
-9
No files found.
mysql-test/r/func_str.result
View file @
268110b3
...
...
@@ -800,3 +800,14 @@ field(0,NULL,1,0) field("",NULL,"bar","") field(0.0,NULL,1.0,0.0)
select field(NULL,1,2,NULL), field(NULL,1,2,0);
field(NULL,1,2,NULL) field(NULL,1,2,0)
0 0
CREATE TABLE t1 (str varchar(20) PRIMARY KEY);
CREATE TABLE t2 (num int primary key);
INSERT INTO t1 VALUES ('notnumber');
INSERT INTO t2 VALUES (0), (1);
SELECT * FROM t1, t2 WHERE num=str;
str num
notnumber 0
SELECT * FROM t1, t2 WHERE num=substring(str from 1 for 6);
str num
notnumber 0
DROP TABLE t1,t2;
mysql-test/r/rpl_multi_update3.result
View file @
268110b3
...
...
@@ -4,6 +4,8 @@ reset master;
reset slave;
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
start slave;
-------- Test for BUG#9361 --------
CREATE TABLE t1 (
a int unsigned not null auto_increment primary key,
b int unsigned
...
...
@@ -41,3 +43,82 @@ a b
1 6
2 6
drop table t1,t2;
-------- Test 1 for BUG#9361 --------
DROP TABLE IF EXISTS t1;
DROP TABLE IF EXISTS t2;
CREATE TABLE t1 (
a1 char(30),
a2 int,
a3 int,
a4 char(30),
a5 char(30)
);
CREATE TABLE t2 (
b1 int,
b2 char(30)
);
INSERT INTO t1 VALUES ('Yes', 1, NULL, 'foo', 'bar');
INSERT INTO t2 VALUES (1, 'baz');
UPDATE t1 a, t2
SET a.a1 = 'No'
WHERE a.a2 =
(SELECT b1
FROM t2
WHERE b2 = 'baz')
AND a.a3 IS NULL
AND a.a4 = 'foo'
AND a.a5 = 'bar';
SELECT * FROM t1;
a1 a2 a3 a4 a5
No 1 NULL foo bar
SELECT * FROM t2;
b1 b2
1 baz
DROP TABLE t1, t2;
-------- Test 2 for BUG#9361 --------
DROP TABLE IF EXISTS t1;
DROP TABLE IF EXISTS t2;
DROP TABLE IF EXISTS t3;
CREATE TABLE t1 (
i INT,
j INT,
x INT,
y INT,
z INT
);
CREATE TABLE t2 (
i INT,
k INT,
x INT,
y INT,
z INT
);
CREATE TABLE t3 (
j INT,
k INT,
x INT,
y INT,
z INT
);
INSERT INTO t1 VALUES ( 1, 2,13,14,15);
INSERT INTO t2 VALUES ( 1, 3,23,24,25);
INSERT INTO t3 VALUES ( 2, 3, 1,34,35), ( 2, 3, 1,34,36);
UPDATE t1 AS a
INNER JOIN t2 AS b
ON a.i = b.i
INNER JOIN t3 AS c
ON a.j = c.j AND b.k = c.k
SET a.x = b.x,
a.y = b.y,
a.z = (
SELECT sum(z)
FROM t3
WHERE y = 34
)
WHERE b.x = 23;
SELECT * FROM t1;
i j x y z
1 2 23 24 71
DROP TABLE t1, t2, t3;
mysql-test/t/func_str.test
View file @
268110b3
...
...
@@ -529,3 +529,17 @@ DROP TABLE t1, t2;
#
select
field
(
0
,
NULL
,
1
,
0
),
field
(
""
,
NULL
,
"bar"
,
""
),
field
(
0.0
,
NULL
,
1.0
,
0.0
);
select
field
(
NULL
,
1
,
2
,
NULL
),
field
(
NULL
,
1
,
2
,
0
);
#
# Bug #10124: access by integer index with a string key that is not a number
#
CREATE
TABLE
t1
(
str
varchar
(
20
)
PRIMARY
KEY
);
CREATE
TABLE
t2
(
num
int
primary
key
);
INSERT
INTO
t1
VALUES
(
'notnumber'
);
INSERT
INTO
t2
VALUES
(
0
),
(
1
);
SELECT
*
FROM
t1
,
t2
WHERE
num
=
str
;
SELECT
*
FROM
t1
,
t2
WHERE
num
=
substring
(
str
from
1
for
6
);
DROP
TABLE
t1
,
t2
;
mysql-test/t/rpl_multi_update3.test
View file @
268110b3
source
include
/
master
-
slave
.
inc
;
##############################################################################
#
# Let's verify that multi-update with a subselect does not cause the slave to crash
# (BUG#10442)
source
include
/
master
-
slave
.
inc
;
#
--
disable_query_log
SELECT
'-------- Test for BUG#9361 --------'
as
""
;
--
enable_query_log
CREATE
TABLE
t1
(
a
int
unsigned
not
null
auto_increment
primary
key
,
...
...
@@ -25,10 +31,129 @@ UPDATE t2, (SELECT a FROM t1) AS t SET t2.b = t.a+5 ;
SELECT
*
FROM
t1
ORDER
BY
a
;
SELECT
*
FROM
t2
ORDER
BY
a
;
s
ave_master_pos
;
s
ync_slave_with_master
;
connection
slave
;
sync_with_master
;
SELECT
*
FROM
t1
ORDER
BY
a
;
SELECT
*
FROM
t2
ORDER
BY
a
;
connection
master
;
drop
table
t1
,
t2
;
##############################################################################
#
# Test for BUG#9361:
# Subselects should work inside multi-updates
#
--
disable_query_log
SELECT
'-------- Test 1 for BUG#9361 --------'
as
""
;
--
enable_query_log
connection
master
;
--
disable_warnings
DROP
TABLE
IF
EXISTS
t1
;
DROP
TABLE
IF
EXISTS
t2
;
--
enable_warnings
CREATE
TABLE
t1
(
a1
char
(
30
),
a2
int
,
a3
int
,
a4
char
(
30
),
a5
char
(
30
)
);
CREATE
TABLE
t2
(
b1
int
,
b2
char
(
30
)
);
# Insert one row per table
INSERT
INTO
t1
VALUES
(
'Yes'
,
1
,
NULL
,
'foo'
,
'bar'
);
INSERT
INTO
t2
VALUES
(
1
,
'baz'
);
# This should update the row in t1
UPDATE
t1
a
,
t2
SET
a
.
a1
=
'No'
WHERE
a
.
a2
=
(
SELECT
b1
FROM
t2
WHERE
b2
=
'baz'
)
AND
a
.
a3
IS
NULL
AND
a
.
a4
=
'foo'
AND
a
.
a5
=
'bar'
;
sync_slave_with_master
;
connection
slave
;
SELECT
*
FROM
t1
;
SELECT
*
FROM
t2
;
connection
master
;
DROP
TABLE
t1
,
t2
;
##############################################################################
#
# Second test for BUG#9361
#
--
disable_query_log
SELECT
'-------- Test 2 for BUG#9361 --------'
as
""
;
--
enable_query_log
connection
master
;
--
disable_warnings
DROP
TABLE
IF
EXISTS
t1
;
DROP
TABLE
IF
EXISTS
t2
;
DROP
TABLE
IF
EXISTS
t3
;
--
enable_warnings
CREATE
TABLE
t1
(
i
INT
,
j
INT
,
x
INT
,
y
INT
,
z
INT
);
CREATE
TABLE
t2
(
i
INT
,
k
INT
,
x
INT
,
y
INT
,
z
INT
);
CREATE
TABLE
t3
(
j
INT
,
k
INT
,
x
INT
,
y
INT
,
z
INT
);
INSERT
INTO
t1
VALUES
(
1
,
2
,
13
,
14
,
15
);
INSERT
INTO
t2
VALUES
(
1
,
3
,
23
,
24
,
25
);
INSERT
INTO
t3
VALUES
(
2
,
3
,
1
,
34
,
35
),
(
2
,
3
,
1
,
34
,
36
);
UPDATE
t1
AS
a
INNER
JOIN
t2
AS
b
ON
a
.
i
=
b
.
i
INNER
JOIN
t3
AS
c
ON
a
.
j
=
c
.
j
AND
b
.
k
=
c
.
k
SET
a
.
x
=
b
.
x
,
a
.
y
=
b
.
y
,
a
.
z
=
(
SELECT
sum
(
z
)
FROM
t3
WHERE
y
=
34
)
WHERE
b
.
x
=
23
;
sync_slave_with_master
;
connection
slave
;
SELECT
*
FROM
t1
;
connection
master
;
DROP
TABLE
t1
,
t2
,
t3
;
sql/field.cc
View file @
268110b3
...
...
@@ -3322,7 +3322,7 @@ int Field_long::store(const char *from,uint len,CHARSET_INFO *cs)
}
else
if
(
from
+
len
!=
end
&&
table
->
in_use
->
count_cuted_fields
&&
check_int
(
from
,
len
,
end
,
cs
))
error
=
1
;
error
=
2
;
store_tmp
=
(
long
)
tmp
;
#ifdef WORDS_BIGENDIAN
...
...
@@ -3584,7 +3584,7 @@ int Field_longlong::store(const char *from,uint len,CHARSET_INFO *cs)
}
else
if
(
from
+
len
!=
end
&&
table
->
in_use
->
count_cuted_fields
&&
check_int
(
from
,
len
,
end
,
cs
))
error
=
1
;
error
=
2
;
#ifdef WORDS_BIGENDIAN
if
(
table
->
s
->
db_low_byte_first
)
{
...
...
@@ -3806,7 +3806,7 @@ int Field_float::store(const char *from,uint len,CHARSET_INFO *cs)
{
set_warning
(
MYSQL_ERROR
::
WARN_LEVEL_WARN
,
(
error
?
ER_WARN_DATA_OUT_OF_RANGE
:
WARN_DATA_TRUNCATED
),
1
);
error
=
1
;
error
=
error
?
1
:
2
;
}
Field_float
::
store
(
nr
);
return
error
;
...
...
@@ -4093,7 +4093,7 @@ int Field_double::store(const char *from,uint len,CHARSET_INFO *cs)
{
set_warning
(
MYSQL_ERROR
::
WARN_LEVEL_WARN
,
(
error
?
ER_WARN_DATA_OUT_OF_RANGE
:
WARN_DATA_TRUNCATED
),
1
);
error
=
1
;
error
=
error
?
1
:
2
;
}
Field_double
::
store
(
nr
);
return
error
;
...
...
@@ -4495,6 +4495,8 @@ int Field_timestamp::store(const char *from,uint len,CHARSET_INFO *cs)
error
=
1
;
}
}
if
(
error
>
1
)
error
=
2
;
#ifdef WORDS_BIGENDIAN
if
(
table
->
s
->
db_low_byte_first
)
...
...
@@ -4791,7 +4793,7 @@ int Field_time::store(const char *from,uint len,CHARSET_INFO *cs)
if
(
str_to_time
(
from
,
len
,
&
ltime
,
&
error
))
{
tmp
=
0L
;
error
=
1
;
error
=
2
;
set_datetime_warning
(
MYSQL_ERROR
::
WARN_LEVEL_WARN
,
WARN_DATA_TRUNCATED
,
from
,
len
,
MYSQL_TIMESTAMP_TIME
,
1
);
}
...
...
@@ -4813,6 +4815,8 @@ int Field_time::store(const char *from,uint len,CHARSET_INFO *cs)
from
,
len
,
MYSQL_TIMESTAMP_TIME
,
!
error
);
error
=
1
;
}
if
(
error
>
1
)
error
=
2
;
}
if
(
ltime
.
neg
)
...
...
@@ -5149,7 +5153,7 @@ int Field_date::store(const char *from, uint len,CHARSET_INFO *cs)
&
error
)
<=
MYSQL_TIMESTAMP_ERROR
)
{
tmp
=
0
;
error
=
1
;
error
=
2
;
}
else
tmp
=
(
uint32
)
l_time
.
year
*
10000L
+
(
uint32
)
(
l_time
.
month
*
100
+
l_time
.
day
);
...
...
@@ -5353,7 +5357,7 @@ int Field_newdate::store(const char *from,uint len,CHARSET_INFO *cs)
&
error
)
<=
MYSQL_TIMESTAMP_ERROR
)
{
tmp
=
0L
;
error
=
1
;
error
=
2
;
}
else
tmp
=
l_time
.
day
+
l_time
.
month
*
32
+
l_time
.
year
*
16
*
32
;
...
...
@@ -5836,7 +5840,7 @@ int Field_string::store(const char *from,uint length,CHARSET_INFO *cs)
from
=
tmpstr
.
ptr
();
length
=
tmpstr
.
length
();
if
(
conv_errors
)
error
=
1
;
error
=
2
;
}
/*
...
...
@@ -5860,7 +5864,7 @@ int Field_string::store(const char *from,uint length,CHARSET_INFO *cs)
from
+=
field_charset
->
cset
->
scan
(
field_charset
,
from
,
end
,
MY_SEQ_SPACES
);
if
(
from
!=
end
)
error
=
1
;
error
=
2
;
}
if
(
error
)
{
...
...
@@ -6242,7 +6246,7 @@ int Field_varstring::store(const char *from,uint length,CHARSET_INFO *cs)
table
->
in_use
->
abort_on_warning
)
error_code
=
ER_DATA_TOO_LONG
;
set_warning
(
level
,
error_code
,
1
);
return
1
;
return
2
;
}
return
0
;
}
...
...
@@ -6822,7 +6826,7 @@ int Field_blob::store(const char *from,uint length,CHARSET_INFO *cs)
from
=
tmpstr
.
ptr
();
length
=
tmpstr
.
length
();
if
(
conv_errors
)
error
=
1
;
error
=
2
;
}
copy_length
=
max_data_length
();
...
...
@@ -6837,7 +6841,7 @@ int Field_blob::store(const char *from,uint length,CHARSET_INFO *cs)
copy_length
,
&
well_formed_error
);
if
(
copy_length
<
length
)
error
=
1
;
error
=
2
;
Field_blob
::
store_length
(
copy_length
);
if
(
was_conversion
||
table
->
copy_blobs
||
copy_length
<=
MAX_FIELD_WIDTH
)
{
// Must make a copy
...
...
sql/item_subselect.cc
View file @
268110b3
...
...
@@ -1487,7 +1487,7 @@ int subselect_uniquesubquery_engine::exec()
TABLE
*
table
=
tab
->
table
;
for
(
store_key
**
copy
=
tab
->
ref
.
key_copy
;
*
copy
;
copy
++
)
{
if
(
tab
->
ref
.
key_err
=
(
*
copy
)
->
copy
()
)
if
(
(
tab
->
ref
.
key_err
=
(
*
copy
)
->
copy
())
&
1
)
{
table
->
status
=
STATUS_NOT_FOUND
;
DBUG_RETURN
(
1
);
...
...
@@ -1540,7 +1540,7 @@ int subselect_indexsubquery_engine::exec()
for
(
store_key
**
copy
=
tab
->
ref
.
key_copy
;
*
copy
;
copy
++
)
{
if
(
tab
->
ref
.
key_err
=
(
*
copy
)
->
copy
()
)
if
(
(
tab
->
ref
.
key_err
=
(
*
copy
)
->
copy
())
&
1
)
{
table
->
status
=
STATUS_NOT_FOUND
;
DBUG_RETURN
(
1
);
...
...
sql/sql_parse.cc
View file @
268110b3
...
...
@@ -3272,7 +3272,6 @@ end_with_restore_list:
if
(
first_table
->
view
&&
!
first_table
->
contain_auto_increment
)
thd
->
last_insert_id
=
0
;
// do not show last insert ID if VIEW have not it
break
;
}
case
SQLCOM_TRUNCATE
:
...
...
sql/sql_select.cc
View file @
268110b3
...
...
@@ -11766,10 +11766,12 @@ cp_buffer_from_ref(THD *thd, TABLE_REF *ref)
thd
->
count_cuted_fields
=
CHECK_FIELD_IGNORE
;
for
(
store_key
**
copy
=
ref
->
key_copy
;
*
copy
;
copy
++
)
{
if
((
*
copy
)
->
copy
())
int
res
;
if
((
res
=
(
*
copy
)
->
copy
()))
{
thd
->
count_cuted_fields
=
save_count_cuted_fields
;
return
1
;
// Something went wrong
if
((
res
=
res
&
1
))
return
res
;
// Something went wrong
}
}
thd
->
count_cuted_fields
=
save_count_cuted_fields
;
...
...
sql/sql_select.h
View file @
268110b3
...
...
@@ -448,6 +448,7 @@ class store_key :public Sql_alloc
char
*
null_ptr
;
char
err
;
public:
enum
store_key_result
{
STORE_KEY_OK
,
STORE_KEY_FATAL
,
STORE_KEY_CONV
};
store_key
(
THD
*
thd
,
Field
*
field_arg
,
char
*
ptr
,
char
*
null
,
uint
length
)
:
null_ptr
(
null
),
err
(
0
)
{
...
...
@@ -463,7 +464,7 @@ class store_key :public Sql_alloc
ptr
,
(
uchar
*
)
null
,
1
);
}
virtual
~
store_key
()
{}
/* Not actually needed */
virtual
bool
copy
()
=
0
;
virtual
enum
store_key_result
copy
()
=
0
;
virtual
const
char
*
name
()
const
=
0
;
};
...
...
@@ -484,10 +485,10 @@ class store_key_field: public store_key
copy_field
.
set
(
to_field
,
from_field
,
0
);
}
}
bool
copy
()
enum
store_key_result
copy
()
{
copy_field
.
do_copy
(
&
copy_field
);
return
err
!=
0
;
return
err
!=
0
?
STORE_KEY_FATAL
:
STORE_KEY_OK
;
}
const
char
*
name
()
const
{
return
field_name
;
}
};
...
...
@@ -504,9 +505,11 @@ public:
null_ptr_arg
?
null_ptr_arg
:
item_arg
->
maybe_null
?
&
err
:
NullS
,
length
),
item
(
item_arg
)
{}
bool
copy
()
enum
store_key_result
copy
()
{
return
item
->
save_in_field_no_warnings
(
to_field
,
1
)
||
err
!=
0
;
int
res
=
item
->
save_in_field
(
to_field
,
1
);
return
(
err
!=
0
||
res
>
2
?
STORE_KEY_FATAL
:
(
store_key_result
)
res
);
}
const
char
*
name
()
const
{
return
"func"
;
}
};
...
...
@@ -524,15 +527,19 @@ public:
&
err
:
NullS
,
length
,
item_arg
),
inited
(
0
)
{
}
bool
copy
()
enum
store_key_result
copy
()
{
int
res
;
if
(
!
inited
)
{
inited
=
1
;
if
(
item
->
save_in_field
(
to_field
,
1
))
err
=
1
;
if
((
res
=
item
->
save_in_field
(
to_field
,
1
)))
{
if
(
!
err
)
err
=
res
;
}
}
return
err
!=
0
;
return
(
err
>
2
?
STORE_KEY_FATAL
:
(
store_key_result
)
err
)
;
}
const
char
*
name
()
const
{
return
"const"
;
}
};
...
...
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