diff options
author | unknown <bell@sanja.is.com.ua> | 2003-07-01 10:03:20 +0300 |
---|---|---|
committer | unknown <bell@sanja.is.com.ua> | 2003-07-01 10:03:20 +0300 |
commit | 8db5021725c39823511d36d800299a2f4b2efda3 (patch) | |
tree | cd54e2149de2b87d2e445802361904126b9c15ef | |
parent | 0a1d7d64c85894fda6ff1f6342b167d22110dbf7 (diff) | |
parent | cd01f7cda08f8cff241e02835a16fc5aca6280e2 (diff) | |
download | mariadb-git-8db5021725c39823511d36d800299a2f4b2efda3.tar.gz |
merged
sql/item_subselect.cc:
Auto merged
sql/mysqld.cc:
Auto merged
sql/sql_lex.cc:
Auto merged
sql/sql_lex.h:
Auto merged
sql/sql_select.cc:
Auto merged
-rw-r--r-- | mysql-test/r/subselect.result | 13 | ||||
-rw-r--r-- | mysql-test/t/subselect.test | 13 | ||||
-rw-r--r-- | sql/mysqld.cc | 22 | ||||
-rw-r--r-- | sql/sql_lex.cc | 3 | ||||
-rw-r--r-- | sql/sql_lex.h | 1 | ||||
-rw-r--r-- | sql/sql_select.cc | 3 |
6 files changed, 47 insertions, 8 deletions
diff --git a/mysql-test/r/subselect.result b/mysql-test/r/subselect.result index ee24ef445fb..3008a9547ce 100644 --- a/mysql-test/r/subselect.result +++ b/mysql-test/r/subselect.result @@ -1153,6 +1153,19 @@ INSERT INTO t1 VALUES (1,0,NULL,NULL),(2,0,NULL,NULL); SELECT DISTINCT REF_ID FROM t1 WHERE ID= (SELECT DISTINCT REF_ID FROM t1 WHERE ID=2); REF_ID DROP TABLE t1; +create table t1 (a int, b int); +create table t2 (a int, b int); +insert into t1 values (1,0), (2,0), (3,0); +insert into t2 values (1,1), (2,1), (3,1), (2,2); +update ignore t1 set b=(select b from t2 where t1.a=t2.a); +Warnings: +Error 1240 Subselect returns more than 1 record +select * from t1; +a b +1 1 +2 NULL +3 1 +drop table t1, t2; create table t1(City VARCHAR(30),Location geometry); insert into t1 values("Paris",GeomFromText('POINT(2.33 48.87)')); select City from t1 where (select intersects(GeomFromText(AsText(Location)),GeomFromText('Polygon((2 50, 2.5 50, 2.5 47, 2 47, 2 50))'))=0); diff --git a/mysql-test/t/subselect.test b/mysql-test/t/subselect.test index 7f957638fff..17738ae0c16 100644 --- a/mysql-test/t/subselect.test +++ b/mysql-test/t/subselect.test @@ -739,6 +739,19 @@ INSERT INTO t1 VALUES (1,0,NULL,NULL),(2,0,NULL,NULL); SELECT DISTINCT REF_ID FROM t1 WHERE ID= (SELECT DISTINCT REF_ID FROM t1 WHERE ID=2); DROP TABLE t1; +# +# uninterruptable update +# +create table t1 (a int, b int); +create table t2 (a int, b int); + +insert into t1 values (1,0), (2,0), (3,0); +insert into t2 values (1,1), (2,1), (3,1), (2,2); + +update ignore t1 set b=(select b from t2 where t1.a=t2.a); +select * from t1; + +drop table t1, t2; # # correct behavoiur for function from reduced subselect diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 72ee3e30c63..27fc8ea70ac 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -1818,15 +1818,23 @@ extern "C" int my_message_sql(uint error, const char *str, { THD *thd; DBUG_ENTER("my_message_sql"); - DBUG_PRINT("error",("Message: '%s'",str)); - if ((thd=current_thd)) + DBUG_PRINT("error", ("Message: '%s'", str)); + if ((thd= current_thd)) { - NET *net= &thd->net; - net->report_error= 1; - if (!net->last_error[0]) // Return only first message + if (thd->lex.current_select->no_error && !thd->is_fatal_error) { - strmake(net->last_error,str,sizeof(net->last_error)-1); - net->last_errno=error ? error : ER_UNKNOWN_ERROR; + DBUG_PRINT("error", ("above error converted to warning")); + push_warning(thd, MYSQL_ERROR::WARN_LEVEL_ERROR, error, str); + } + else + { + NET *net= &thd->net; + net->report_error= 1; + if (!net->last_error[0]) // Return only first message + { + strmake(net->last_error, str, sizeof(net->last_error)-1); + net->last_errno= error ? error : ER_UNKNOWN_ERROR; + } } } else diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index 1658d5d14c1..2eeb57f34a7 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -122,6 +122,7 @@ LEX *lex_start(THD *thd, uchar *buf,uint length) lex->yacc_yyss=lex->yacc_yyvs=0; lex->ignore_space=test(thd->variables.sql_mode & MODE_IGNORE_SPACE); lex->sql_command=SQLCOM_END; + lex->duplicates= DUP_ERROR; return lex; } @@ -965,7 +966,7 @@ void st_select_lex_node::init_query() { options= 0; linkage= UNSPECIFIED_TYPE; - no_table_names_allowed= uncacheable= dependent= 0; + no_error= no_table_names_allowed= uncacheable= dependent= 0; ref_pointer_array= 0; cond_count= 0; } diff --git a/sql/sql_lex.h b/sql/sql_lex.h index 5cebddaf02e..faf7e16e54a 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -213,6 +213,7 @@ public: bool dependent; /* dependent from outer select subselect */ bool uncacheable; /* result of this query can't be cached */ bool no_table_names_allowed; /* used for global order by */ + bool no_error; /* suppress error message (convert it to warnings) */ static void *operator new(size_t size) { diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 31bb8ffc032..f9fc39c2318 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -436,6 +436,9 @@ JOIN::optimize() DBUG_RETURN(0); optimized= 1; + // Ignore errors of execution if option IGNORE present + if (thd->lex.duplicates == DUP_IGNORE) + thd->lex.current_select->no_error= 1; #ifdef HAVE_REF_TO_FIELDS // Not done yet /* Add HAVING to WHERE if possible */ if (having && !group_list && !sum_func_count) |