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
cc9fe9c3
Commit
cc9fe9c3
authored
Mar 16, 2007
by
holyfoot/hf@hfmain.(none)
Browse files
Options
Browse Files
Download
Plain Diff
Merge mysql.com:/home/hf/work/mrg/mysql-5.0-opt
into mysql.com:/home/hf/work/mrg/mysql-5.1-opt
parents
d6c997e9
830c134e
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
104 additions
and
25 deletions
+104
-25
mysql-test/r/insert_update.result
mysql-test/r/insert_update.result
+11
-0
mysql-test/r/skip_grants.result
mysql-test/r/skip_grants.result
+12
-0
mysql-test/t/insert_update.test
mysql-test/t/insert_update.test
+21
-0
mysql-test/t/skip_grants.test
mysql-test/t/skip_grants.test
+8
-0
sql/mysql_priv.h
sql/mysql_priv.h
+2
-1
sql/sql_acl.cc
sql/sql_acl.cc
+4
-0
sql/sql_insert.cc
sql/sql_insert.cc
+45
-23
sql/sql_prepare.cc
sql/sql_prepare.cc
+1
-1
No files found.
mysql-test/r/insert_update.result
View file @
cc9fe9c3
...
@@ -236,6 +236,17 @@ INSERT INTO t2 VALUES (1), (3);
...
@@ -236,6 +236,17 @@ INSERT INTO t2 VALUES (1), (3);
INSERT INTO t1 SELECT 1, COUNT(*) FROM t2 ON DUPLICATE KEY UPDATE j= a;
INSERT INTO t1 SELECT 1, COUNT(*) FROM t2 ON DUPLICATE KEY UPDATE j= a;
ERROR 42S22: Unknown column 'a' in 'field list'
ERROR 42S22: Unknown column 'a' in 'field list'
DROP TABLE t1,t2;
DROP TABLE t1,t2;
SET SQL_MODE = 'TRADITIONAL';
CREATE TABLE t1 (a INT PRIMARY KEY, b INT NOT NULL);
INSERT INTO t1 (a) VALUES (1);
ERROR HY000: Field 'b' doesn't have a default value
INSERT INTO t1 (a) VALUES (1) ON DUPLICATE KEY UPDATE a = b;
ERROR HY000: Field 'b' doesn't have a default value
INSERT INTO t1 (a) VALUES (1) ON DUPLICATE KEY UPDATE b = b;
ERROR HY000: Field 'b' doesn't have a default value
SELECT * FROM t1;
a b
DROP TABLE t1;
CREATE TABLE t1 (f1 INT AUTO_INCREMENT PRIMARY KEY,
CREATE TABLE t1 (f1 INT AUTO_INCREMENT PRIMARY KEY,
f2 VARCHAR(5) NOT NULL UNIQUE);
f2 VARCHAR(5) NOT NULL UNIQUE);
INSERT t1 (f2) VALUES ('test') ON DUPLICATE KEY UPDATE f1 = LAST_INSERT_ID(f1);
INSERT t1 (f2) VALUES ('test') ON DUPLICATE KEY UPDATE f1 = LAST_INSERT_ID(f1);
...
...
mysql-test/r/skip_grants.result
View file @
cc9fe9c3
...
@@ -58,3 +58,15 @@ DROP PROCEDURE p3;
...
@@ -58,3 +58,15 @@ DROP PROCEDURE p3;
DROP FUNCTION f1;
DROP FUNCTION f1;
DROP FUNCTION f2;
DROP FUNCTION f2;
DROP FUNCTION f3;
DROP FUNCTION f3;
select count(*) from information_schema.COLUMN_PRIVILEGES;
count(*)
0
select count(*) from information_schema.SCHEMA_PRIVILEGES;
count(*)
0
select count(*) from information_schema.TABLE_PRIVILEGES;
count(*)
0
select count(*) from information_schema.USER_PRIVILEGES;
count(*)
0
mysql-test/t/insert_update.test
View file @
cc9fe9c3
...
@@ -163,6 +163,27 @@ INSERT INTO t2 VALUES (1), (3);
...
@@ -163,6 +163,27 @@ INSERT INTO t2 VALUES (1), (3);
INSERT
INTO
t1
SELECT
1
,
COUNT
(
*
)
FROM
t2
ON
DUPLICATE
KEY
UPDATE
j
=
a
;
INSERT
INTO
t1
SELECT
1
,
COUNT
(
*
)
FROM
t2
ON
DUPLICATE
KEY
UPDATE
j
=
a
;
DROP
TABLE
t1
,
t2
;
DROP
TABLE
t1
,
t2
;
#
# Bug #26261: Missing default value isn't noticed in
# insert ... on duplicate key update
#
SET
SQL_MODE
=
'TRADITIONAL'
;
CREATE
TABLE
t1
(
a
INT
PRIMARY
KEY
,
b
INT
NOT
NULL
);
--
error
1364
INSERT
INTO
t1
(
a
)
VALUES
(
1
);
--
error
1364
INSERT
INTO
t1
(
a
)
VALUES
(
1
)
ON
DUPLICATE
KEY
UPDATE
a
=
b
;
--
error
1364
INSERT
INTO
t1
(
a
)
VALUES
(
1
)
ON
DUPLICATE
KEY
UPDATE
b
=
b
;
SELECT
*
FROM
t1
;
DROP
TABLE
t1
;
#
#
# Bug#27033: 0 as LAST_INSERT_ID() after INSERT .. ON DUPLICATE if rows were
# Bug#27033: 0 as LAST_INSERT_ID() after INSERT .. ON DUPLICATE if rows were
# touched but not actually changed.
# touched but not actually changed.
...
...
mysql-test/t/skip_grants.test
View file @
cc9fe9c3
...
@@ -108,3 +108,11 @@ DROP PROCEDURE p3;
...
@@ -108,3 +108,11 @@ DROP PROCEDURE p3;
DROP
FUNCTION
f1
;
DROP
FUNCTION
f1
;
DROP
FUNCTION
f2
;
DROP
FUNCTION
f2
;
DROP
FUNCTION
f3
;
DROP
FUNCTION
f3
;
#
# Bug#26285 Selecting information_schema crahes server
#
select
count
(
*
)
from
information_schema
.
COLUMN_PRIVILEGES
;
select
count
(
*
)
from
information_schema
.
SCHEMA_PRIVILEGES
;
select
count
(
*
)
from
information_schema
.
TABLE_PRIVILEGES
;
select
count
(
*
)
from
information_schema
.
USER_PRIVILEGES
;
sql/mysql_priv.h
View file @
cc9fe9c3
...
@@ -991,7 +991,8 @@ bool mysql_prepare_insert(THD *thd, TABLE_LIST *table_list, TABLE *table,
...
@@ -991,7 +991,8 @@ bool mysql_prepare_insert(THD *thd, TABLE_LIST *table_list, TABLE *table,
List
<
Item
>
&
fields
,
List_item
*
values
,
List
<
Item
>
&
fields
,
List_item
*
values
,
List
<
Item
>
&
update_fields
,
List
<
Item
>
&
update_fields
,
List
<
Item
>
&
update_values
,
enum_duplicates
duplic
,
List
<
Item
>
&
update_values
,
enum_duplicates
duplic
,
COND
**
where
,
bool
select_insert
);
COND
**
where
,
bool
select_insert
,
bool
check_fields
,
bool
abort_on_warning
);
bool
mysql_insert
(
THD
*
thd
,
TABLE_LIST
*
table
,
List
<
Item
>
&
fields
,
bool
mysql_insert
(
THD
*
thd
,
TABLE_LIST
*
table
,
List
<
Item
>
&
fields
,
List
<
List_item
>
&
values
,
List
<
Item
>
&
update_fields
,
List
<
List_item
>
&
values
,
List
<
Item
>
&
update_fields
,
List
<
Item
>
&
update_values
,
enum_duplicates
flag
,
List
<
Item
>
&
update_values
,
enum_duplicates
flag
,
...
...
sql/sql_acl.cc
View file @
cc9fe9c3
...
@@ -6086,6 +6086,8 @@ int fill_schema_user_privileges(THD *thd, TABLE_LIST *tables, COND *cond)
...
@@ -6086,6 +6086,8 @@ int fill_schema_user_privileges(THD *thd, TABLE_LIST *tables, COND *cond)
char
*
curr_host
=
thd
->
security_ctx
->
priv_host_name
();
char
*
curr_host
=
thd
->
security_ctx
->
priv_host_name
();
DBUG_ENTER
(
"fill_schema_user_privileges"
);
DBUG_ENTER
(
"fill_schema_user_privileges"
);
if
(
!
initialized
)
DBUG_RETURN
(
0
);
pthread_mutex_lock
(
&
acl_cache
->
lock
);
pthread_mutex_lock
(
&
acl_cache
->
lock
);
for
(
counter
=
0
;
counter
<
acl_users
.
elements
;
counter
++
)
for
(
counter
=
0
;
counter
<
acl_users
.
elements
;
counter
++
)
...
@@ -6145,6 +6147,8 @@ int fill_schema_schema_privileges(THD *thd, TABLE_LIST *tables, COND *cond)
...
@@ -6145,6 +6147,8 @@ int fill_schema_schema_privileges(THD *thd, TABLE_LIST *tables, COND *cond)
char
*
curr_host
=
thd
->
security_ctx
->
priv_host_name
();
char
*
curr_host
=
thd
->
security_ctx
->
priv_host_name
();
DBUG_ENTER
(
"fill_schema_schema_privileges"
);
DBUG_ENTER
(
"fill_schema_schema_privileges"
);
if
(
!
initialized
)
DBUG_RETURN
(
0
);
pthread_mutex_lock
(
&
acl_cache
->
lock
);
pthread_mutex_lock
(
&
acl_cache
->
lock
);
for
(
counter
=
0
;
counter
<
acl_dbs
.
elements
;
counter
++
)
for
(
counter
=
0
;
counter
<
acl_dbs
.
elements
;
counter
++
)
...
...
sql/sql_insert.cc
View file @
cc9fe9c3
...
@@ -468,10 +468,15 @@ bool mysql_insert(THD *thd,TABLE_LIST *table_list,
...
@@ -468,10 +468,15 @@ bool mysql_insert(THD *thd,TABLE_LIST *table_list,
thd
->
proc_info
=
"init"
;
thd
->
proc_info
=
"init"
;
thd
->
used_tables
=
0
;
thd
->
used_tables
=
0
;
values
=
its
++
;
values
=
its
++
;
value_count
=
values
->
elements
;
if
(
mysql_prepare_insert
(
thd
,
table_list
,
table
,
fields
,
values
,
if
(
mysql_prepare_insert
(
thd
,
table_list
,
table
,
fields
,
values
,
update_fields
,
update_values
,
duplic
,
&
unused_conds
,
update_fields
,
update_values
,
duplic
,
&
unused_conds
,
FALSE
))
FALSE
,
(
fields
.
elements
||
!
value_count
),
!
ignore
&&
(
thd
->
variables
.
sql_mode
&
(
MODE_STRICT_TRANS_TABLES
|
MODE_STRICT_ALL_TABLES
))))
goto
abort
;
goto
abort
;
/* mysql_prepare_insert set table_list->table if it was not set */
/* mysql_prepare_insert set table_list->table if it was not set */
...
@@ -497,7 +502,6 @@ bool mysql_insert(THD *thd,TABLE_LIST *table_list,
...
@@ -497,7 +502,6 @@ bool mysql_insert(THD *thd,TABLE_LIST *table_list,
table_list
->
next_local
=
0
;
table_list
->
next_local
=
0
;
context
->
resolve_in_table_list_only
(
table_list
);
context
->
resolve_in_table_list_only
(
table_list
);
value_count
=
values
->
elements
;
while
((
values
=
its
++
))
while
((
values
=
its
++
))
{
{
counter
++
;
counter
++
;
...
@@ -567,17 +571,9 @@ bool mysql_insert(THD *thd,TABLE_LIST *table_list,
...
@@ -567,17 +571,9 @@ bool mysql_insert(THD *thd,TABLE_LIST *table_list,
table
->
file
->
ha_start_bulk_insert
(
values_list
.
elements
);
table
->
file
->
ha_start_bulk_insert
(
values_list
.
elements
);
thd
->
no_trans_update
=
0
;
thd
->
no_trans_update
=
0
;
thd
->
abort_on_warning
=
(
!
ignore
&&
thd
->
abort_on_warning
=
(
!
ignore
&&
(
thd
->
variables
.
sql_mode
&
(
thd
->
variables
.
sql_mode
&
(
MODE_STRICT_TRANS_TABLES
|
(
MODE_STRICT_TRANS_TABLES
|
MODE_STRICT_ALL_TABLES
)));
MODE_STRICT_ALL_TABLES
)));
if
((
fields
.
elements
||
!
value_count
)
&&
check_that_all_fields_are_given_values
(
thd
,
table
,
table_list
))
{
/* thd->net.report_error is now set, which will abort the next loop */
error
=
1
;
}
table
->
mark_columns_needed_for_insert
();
table
->
mark_columns_needed_for_insert
();
...
@@ -954,6 +950,10 @@ static bool mysql_prepare_insert_check_table(THD *thd, TABLE_LIST *table_list,
...
@@ -954,6 +950,10 @@ static bool mysql_prepare_insert_check_table(THD *thd, TABLE_LIST *table_list,
be taken from table_list->table)
be taken from table_list->table)
where Where clause (for insert ... select)
where Where clause (for insert ... select)
select_insert TRUE if INSERT ... SELECT statement
select_insert TRUE if INSERT ... SELECT statement
check_fields TRUE if need to check that all INSERT fields are
given values.
abort_on_warning whether to report if some INSERT field is not
assigned as an error (TRUE) or as a warning (FALSE).
TODO (in far future)
TODO (in far future)
In cases of:
In cases of:
...
@@ -974,7 +974,8 @@ bool mysql_prepare_insert(THD *thd, TABLE_LIST *table_list,
...
@@ -974,7 +974,8 @@ bool mysql_prepare_insert(THD *thd, TABLE_LIST *table_list,
TABLE
*
table
,
List
<
Item
>
&
fields
,
List_item
*
values
,
TABLE
*
table
,
List
<
Item
>
&
fields
,
List_item
*
values
,
List
<
Item
>
&
update_fields
,
List
<
Item
>
&
update_values
,
List
<
Item
>
&
update_fields
,
List
<
Item
>
&
update_values
,
enum_duplicates
duplic
,
enum_duplicates
duplic
,
COND
**
where
,
bool
select_insert
)
COND
**
where
,
bool
select_insert
,
bool
check_fields
,
bool
abort_on_warning
)
{
{
SELECT_LEX
*
select_lex
=
&
thd
->
lex
->
select_lex
;
SELECT_LEX
*
select_lex
=
&
thd
->
lex
->
select_lex
;
Name_resolution_context
*
context
=
&
select_lex
->
context
;
Name_resolution_context
*
context
=
&
select_lex
->
context
;
...
@@ -1036,10 +1037,22 @@ bool mysql_prepare_insert(THD *thd, TABLE_LIST *table_list,
...
@@ -1036,10 +1037,22 @@ bool mysql_prepare_insert(THD *thd, TABLE_LIST *table_list,
table_list
->
next_local
=
0
;
table_list
->
next_local
=
0
;
context
->
resolve_in_table_list_only
(
table_list
);
context
->
resolve_in_table_list_only
(
table_list
);
if
(
!
(
res
=
check_insert_fields
(
thd
,
context
->
table_list
,
fields
,
*
values
,
res
=
check_insert_fields
(
thd
,
context
->
table_list
,
fields
,
*
values
,
!
insert_into_view
,
&
map
)
||
!
insert_into_view
,
&
map
)
||
setup_fields
(
thd
,
0
,
*
values
,
MARK_COLUMNS_READ
,
0
,
0
))
setup_fields
(
thd
,
0
,
*
values
,
MARK_COLUMNS_READ
,
0
,
0
)
&&
duplic
==
DUP_UPDATE
)
if
(
!
res
&&
check_fields
)
{
bool
saved_abort_on_warning
=
thd
->
abort_on_warning
;
thd
->
abort_on_warning
=
abort_on_warning
;
res
=
check_that_all_fields_are_given_values
(
thd
,
table
?
table
:
context
->
table_list
->
table
,
context
->
table_list
);
thd
->
abort_on_warning
=
saved_abort_on_warning
;
}
if
(
!
res
&&
duplic
==
DUP_UPDATE
)
{
{
select_lex
->
no_wrap_view_item
=
TRUE
;
select_lex
->
no_wrap_view_item
=
TRUE
;
res
=
check_update_fields
(
thd
,
context
->
table_list
,
update_fields
,
&
map
);
res
=
check_update_fields
(
thd
,
context
->
table_list
,
update_fields
,
&
map
);
...
@@ -2443,7 +2456,7 @@ bool mysql_insert_select_prepare(THD *thd)
...
@@ -2443,7 +2456,7 @@ bool mysql_insert_select_prepare(THD *thd)
lex
->
query_tables
->
table
,
lex
->
field_list
,
0
,
lex
->
query_tables
->
table
,
lex
->
field_list
,
0
,
lex
->
update_list
,
lex
->
value_list
,
lex
->
update_list
,
lex
->
value_list
,
lex
->
duplicates
,
lex
->
duplicates
,
&
select_lex
->
where
,
TRUE
))
&
select_lex
->
where
,
TRUE
,
FALSE
,
FALSE
))
DBUG_RETURN
(
TRUE
);
DBUG_RETURN
(
TRUE
);
/*
/*
...
@@ -2506,7 +2519,18 @@ select_insert::prepare(List<Item> &values, SELECT_LEX_UNIT *u)
...
@@ -2506,7 +2519,18 @@ select_insert::prepare(List<Item> &values, SELECT_LEX_UNIT *u)
!
insert_into_view
,
&
map
)
||
!
insert_into_view
,
&
map
)
||
setup_fields
(
thd
,
0
,
values
,
MARK_COLUMNS_READ
,
0
,
0
);
setup_fields
(
thd
,
0
,
values
,
MARK_COLUMNS_READ
,
0
,
0
);
if
(
info
.
handle_duplicates
==
DUP_UPDATE
)
if
(
!
res
&&
fields
->
elements
)
{
bool
saved_abort_on_warning
=
thd
->
abort_on_warning
;
thd
->
abort_on_warning
=
!
info
.
ignore
&&
(
thd
->
variables
.
sql_mode
&
(
MODE_STRICT_TRANS_TABLES
|
MODE_STRICT_ALL_TABLES
));
res
=
check_that_all_fields_are_given_values
(
thd
,
table_list
->
table
,
table_list
);
thd
->
abort_on_warning
=
saved_abort_on_warning
;
}
if
(
info
.
handle_duplicates
==
DUP_UPDATE
&&
!
res
)
{
{
Name_resolution_context
*
context
=
&
lex
->
select_lex
.
context
;
Name_resolution_context
*
context
=
&
lex
->
select_lex
.
context
;
Name_resolution_context_state
ctx_state
;
Name_resolution_context_state
ctx_state
;
...
@@ -2617,9 +2641,7 @@ select_insert::prepare(List<Item> &values, SELECT_LEX_UNIT *u)
...
@@ -2617,9 +2641,7 @@ select_insert::prepare(List<Item> &values, SELECT_LEX_UNIT *u)
(
thd
->
variables
.
sql_mode
&
(
thd
->
variables
.
sql_mode
&
(
MODE_STRICT_TRANS_TABLES
|
(
MODE_STRICT_TRANS_TABLES
|
MODE_STRICT_ALL_TABLES
)));
MODE_STRICT_ALL_TABLES
)));
res
=
((
fields
->
elements
&&
res
=
(
table_list
->
prepare_where
(
thd
,
0
,
TRUE
)
||
check_that_all_fields_are_given_values
(
thd
,
table
,
table_list
))
||
table_list
->
prepare_where
(
thd
,
0
,
TRUE
)
||
table_list
->
prepare_check_option
(
thd
));
table_list
->
prepare_check_option
(
thd
));
if
(
!
res
)
if
(
!
res
)
...
...
sql/sql_prepare.cc
View file @
cc9fe9c3
...
@@ -1071,7 +1071,7 @@ static bool mysql_test_insert(Prepared_statement *stmt,
...
@@ -1071,7 +1071,7 @@ static bool mysql_test_insert(Prepared_statement *stmt,
if
(
mysql_prepare_insert
(
thd
,
table_list
,
table_list
->
table
,
if
(
mysql_prepare_insert
(
thd
,
table_list
,
table_list
->
table
,
fields
,
values
,
update_fields
,
update_values
,
fields
,
values
,
update_fields
,
update_values
,
duplic
,
&
unused_conds
,
FALSE
))
duplic
,
&
unused_conds
,
FALSE
,
FALSE
,
FALSE
))
goto
error
;
goto
error
;
value_count
=
values
->
elements
;
value_count
=
values
->
elements
;
...
...
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