summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <bell@sanja.is.com.ua>2003-07-01 10:03:20 +0300
committerunknown <bell@sanja.is.com.ua>2003-07-01 10:03:20 +0300
commit8db5021725c39823511d36d800299a2f4b2efda3 (patch)
treecd54e2149de2b87d2e445802361904126b9c15ef
parent0a1d7d64c85894fda6ff1f6342b167d22110dbf7 (diff)
parentcd01f7cda08f8cff241e02835a16fc5aca6280e2 (diff)
downloadmariadb-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.result13
-rw-r--r--mysql-test/t/subselect.test13
-rw-r--r--sql/mysqld.cc22
-rw-r--r--sql/sql_lex.cc3
-rw-r--r--sql/sql_lex.h1
-rw-r--r--sql/sql_select.cc3
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)