diff --git a/mysql-test/r/select.result b/mysql-test/r/select.result index 6c9ec9d8297dac6a79d7416287b8b510c3de92fd..2df60944999388bfeabf8b3918b39a6a3c15f1aa 100644 --- a/mysql-test/r/select.result +++ b/mysql-test/r/select.result @@ -2582,3 +2582,19 @@ a 254 255 drop table t2; +CREATE TABLE t1 (a int, b int, c int); +INSERT INTO t1 +SELECT 50, 3, 3 FROM DUAL +WHERE NOT EXISTS +(SELECT * FROM t1 WHERE a = 50 AND b = 3); +SELECT * FROM t1; +a b c +50 3 3 +INSERT INTO t1 +SELECT 50, 3, 3 FROM DUAL +WHERE NOT EXISTS +(SELECT * FROM t1 WHERE a = 50 AND b = 3); +SELECT * FROM t1; +a b c +50 3 3 +DROP TABLE t1; diff --git a/mysql-test/t/select.test b/mysql-test/t/select.test index caa9e332e5798ca0022a1f05e4dd778af5e1ab23..893b9ba9267a809b0d39166bca7c5faad6d3a4ba 100644 --- a/mysql-test/t/select.test +++ b/mysql-test/t/select.test @@ -2138,3 +2138,21 @@ insert into t2 values (0), (254), (255); explain select * from t2 where a > -1; select * from t2 where a > -1; drop table t2; + +# +# Bug #11745: SELECT ... FROM DUAL with WHERE condition +# + +CREATE TABLE t1 (a int, b int, c int); +INSERT INTO t1 + SELECT 50, 3, 3 FROM DUAL + WHERE NOT EXISTS + (SELECT * FROM t1 WHERE a = 50 AND b = 3); +SELECT * FROM t1; +INSERT INTO t1 + SELECT 50, 3, 3 FROM DUAL + WHERE NOT EXISTS + (SELECT * FROM t1 WHERE a = 50 AND b = 3); +SELECT * FROM t1; + +DROP TABLE t1; diff --git a/sql/sql_select.cc b/sql/sql_select.cc index a70fa1c8d5e0c852b8593c88328ce631a230ce4c..5b4eab36dd20d2180c62834931965d20590d4142 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -1072,7 +1072,7 @@ JOIN::exec() else { result->send_fields(fields_list,1); - if (!having || having->val_int()) + if (cond_value != Item::COND_FALSE && (!having || having->val_int())) { if (do_send_rows && (procedure ? (procedure->send_row(fields_list) || procedure->end_of_records()) diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 2587ce7e1a54011ff6564cff05290fd5e981afdd..be8ead8e15755c70c75286630bb455206be71d03 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -2459,7 +2459,7 @@ select_into: select_from: FROM join_table_list where_clause group_clause having_clause opt_order_clause opt_limit_clause procedure_clause - | FROM DUAL_SYM opt_limit_clause + | FROM DUAL_SYM where_clause opt_limit_clause /* oracle compatibility: oracle always requires FROM clause, and DUAL is system table without fields. Is "SELECT 1 FROM DUAL" any better than "SELECT 1" ?