Merge mysql.com:/home/hf/work/mrg/mysql-5.0-opt
into mysql.com:/home/hf/work/mrg/mysql-5.1-opt
This commit is contained in:
commit
cc9fe9c3e1
@ -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);
|
||||||
|
@ -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
|
||||||
|
@ -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.
|
||||||
|
@ -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;
|
||||||
|
@ -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,
|
||||||
|
@ -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)
|
|||||||
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++)
|
||||||
|
@ -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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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)
|
|||||||
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)
|
|||||||
!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)
|
|||||||
(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)
|
||||||
|
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user