diff options
-rw-r--r-- | libmysqld/lib_sql.cc | 3 | ||||
-rw-r--r-- | mysql-test/mysql-test-run.sh | 2 | ||||
-rw-r--r-- | mysql-test/r/subselect.result | 233 | ||||
-rw-r--r-- | mysql-test/t/subselect.test | 147 | ||||
-rw-r--r-- | sql/item.cc | 2 | ||||
-rw-r--r-- | sql/item.h | 9 | ||||
-rw-r--r-- | sql/item_func.cc | 4 | ||||
-rw-r--r-- | sql/item_row.cc | 2 | ||||
-rw-r--r-- | sql/item_strfunc.h | 2 | ||||
-rw-r--r-- | sql/item_subselect.cc | 4 | ||||
-rw-r--r-- | sql/log_event.cc | 2 | ||||
-rw-r--r-- | sql/sql_base.cc | 2 | ||||
-rw-r--r-- | sql/sql_class.cc | 2 | ||||
-rw-r--r-- | sql/sql_class.h | 1 | ||||
-rw-r--r-- | sql/sql_lex.cc | 4 | ||||
-rw-r--r-- | sql/sql_lex.h | 3 | ||||
-rw-r--r-- | sql/sql_parse.cc | 1 | ||||
-rw-r--r-- | sql/sql_select.cc | 20 | ||||
-rw-r--r-- | sql/sql_table.cc | 4 |
19 files changed, 240 insertions, 207 deletions
diff --git a/libmysqld/lib_sql.cc b/libmysqld/lib_sql.cc index 714d9cc02f7..a1fbaaae631 100644 --- a/libmysqld/lib_sql.cc +++ b/libmysqld/lib_sql.cc @@ -63,8 +63,7 @@ my_bool simple_command(MYSQL *mysql,enum enum_server_command command, } /* Clear result variables */ - thd->net.last_error[0]=0; - thd->net.last_errno=0; + thd->clear_error(); mysql->affected_rows= ~(my_ulonglong) 0; thd->store_globals(); // Fix if more than one connect diff --git a/mysql-test/mysql-test-run.sh b/mysql-test/mysql-test-run.sh index 854a4b10b2f..c451fa72d0d 100644 --- a/mysql-test/mysql-test-run.sh +++ b/mysql-test/mysql-test-run.sh @@ -623,7 +623,7 @@ report_stats () { # Find errors for i in "^Warning:" "^Error:" "^==.* at 0x" do - if `$GREP "$i" $MY_LOG_DIR/warnings.tmp >> $MY_LOG_DIR/warnings` + if $GREP "$i" $MY_LOG_DIR/warnings.tmp >> $MY_LOG_DIR/warnings then found_error=1 fi diff --git a/mysql-test/r/subselect.result b/mysql-test/r/subselect.result index 0cbf341e55c..0d8c96fea85 100644 --- a/mysql-test/r/subselect.result +++ b/mysql-test/r/subselect.result @@ -641,168 +641,183 @@ x y drop table t1, t2, t3; SELECT * FROM (SELECT 1) b WHERE 1 IN (SELECT *); No tables used -CREATE TABLE t (id int(11) default NULL, KEY id (id)) TYPE=MyISAM CHARSET=latin1; -INSERT INTO t VALUES (1),(2); -SELECT * FROM t WHERE id IN (SELECT 1); +CREATE TABLE t2 (id int(11) default NULL, KEY id (id)) TYPE=MyISAM CHARSET=latin1; +INSERT INTO t2 VALUES (1),(2); +SELECT * FROM t2 WHERE id IN (SELECT 1); id 1 -EXPLAIN SELECT * FROM t WHERE id IN (SELECT 1); +EXPLAIN SELECT * FROM t2 WHERE id IN (SELECT 1); id select_type table type possible_keys key key_len ref rows Extra -1 PRIMARY t ref id id 5 const 1 Using where; Using index +1 PRIMARY t2 ref id id 5 const 1 Using where; Using index Warnings: Note 1247 Select 2 was reduced during optimisation -SELECT * FROM t WHERE id IN (SELECT 1 UNION SELECT 3); +SELECT * FROM t2 WHERE id IN (SELECT 1 UNION SELECT 3); id 1 -SELECT * FROM t WHERE id IN (SELECT 1+(select 1)); +SELECT * FROM t2 WHERE id IN (SELECT 1+(select 1)); id 2 -EXPLAIN SELECT * FROM t WHERE id IN (SELECT 1+(select 1)); +EXPLAIN SELECT * FROM t2 WHERE id IN (SELECT 1+(select 1)); id select_type table type possible_keys key key_len ref rows Extra -1 PRIMARY t ref id id 5 const 1 Using where; Using index +1 PRIMARY t2 ref id id 5 const 1 Using where; Using index 3 SUBSELECT NULL NULL NULL NULL NULL NULL NULL No tables used Warnings: Note 1247 Select 3 was reduced during optimisation Note 1247 Select 2 was reduced during optimisation -EXPLAIN SELECT * FROM t WHERE id IN (SELECT 1 UNION SELECT 3); +EXPLAIN SELECT * FROM t2 WHERE id IN (SELECT 1 UNION SELECT 3); id select_type table type possible_keys key key_len ref rows Extra -1 PRIMARY t index NULL id 5 NULL 2 Using where; Using index +1 PRIMARY t2 index NULL id 5 NULL 2 Using where; Using index 2 DEPENDENT SUBSELECT NULL NULL NULL NULL NULL NULL NULL No tables used 3 DEPENDENT UNION NULL NULL NULL NULL NULL NULL NULL No tables used -SELECT * FROM t WHERE id IN (SELECT 5 UNION SELECT 3); +SELECT * FROM t2 WHERE id IN (SELECT 5 UNION SELECT 3); id -SELECT * FROM t WHERE id IN (SELECT 5 UNION SELECT 2); +SELECT * FROM t2 WHERE id IN (SELECT 5 UNION SELECT 2); id 2 -INSERT INTO t VALUES ((SELECT * FROM t)); -You can't specify target table 't' for update in FROM clause -SELECT * FROM t; +INSERT INTO t2 VALUES ((SELECT * FROM t2)); +You can't specify target table 't2' for update in FROM clause +SELECT * FROM t2; id 1 2 CREATE TABLE t1 (id int(11) default NULL, KEY id (id)) TYPE=MyISAM CHARSET=latin1; INSERT INTO t1 values (1),(1); -UPDATE t SET id=(SELECT * FROM t1); +UPDATE t2 SET id=(SELECT * FROM t1); Subselect returns more than 1 record -drop table t, t1; -create table t (a int); -insert into t values (1),(2),(3); -select 1 IN (SELECT * from t); -1 IN (SELECT * from t) -1 -select 10 IN (SELECT * from t); -10 IN (SELECT * from t) +drop table t2, t1; +create table t1 (a int); +insert into t1 values (1),(2),(3); +select 1 IN (SELECT * from t1); +1 IN (SELECT * from t1) +1 +select 10 IN (SELECT * from t1); +10 IN (SELECT * from t1) 0 -select NULL IN (SELECT * from t); -NULL IN (SELECT * from t) +select NULL IN (SELECT * from t1); +NULL IN (SELECT * from t1) NULL -update t set a=NULL where a=2; -select 1 IN (SELECT * from t); -1 IN (SELECT * from t) +update t1 set a=NULL where a=2; +select 1 IN (SELECT * from t1); +1 IN (SELECT * from t1) 1 -select 3 IN (SELECT * from t); -3 IN (SELECT * from t) +select 3 IN (SELECT * from t1); +3 IN (SELECT * from t1) 1 -select 10 IN (SELECT * from t); -10 IN (SELECT * from t) +select 10 IN (SELECT * from t1); +10 IN (SELECT * from t1) NULL -select 1 > ALL (SELECT * from t); -1 > ALL (SELECT * from t) +select 1 > ALL (SELECT * from t1); +1 > ALL (SELECT * from t1) 0 -select 10 > ALL (SELECT * from t); -10 > ALL (SELECT * from t) +select 10 > ALL (SELECT * from t1); +10 > ALL (SELECT * from t1) NULL -select 1 > ANY (SELECT * from t); -1 > ANY (SELECT * from t) +select 1 > ANY (SELECT * from t1); +1 > ANY (SELECT * from t1) NULL -select 10 > ANY (SELECT * from t); -10 > ANY (SELECT * from t) +select 10 > ANY (SELECT * from t1); +10 > ANY (SELECT * from t1) 1 -drop table t; -create table t (a varchar(20)); -insert into t values ('A'),('BC'),('DEF'); -select 'A' IN (SELECT * from t); -'A' IN (SELECT * from t) +drop table t1; +create table t1 (a varchar(20)); +insert into t1 values ('A'),('BC'),('DEF'); +select 'A' IN (SELECT * from t1); +'A' IN (SELECT * from t1) 1 -select 'XYZS' IN (SELECT * from t); -'XYZS' IN (SELECT * from t) +select 'XYZS' IN (SELECT * from t1); +'XYZS' IN (SELECT * from t1) 0 -select NULL IN (SELECT * from t); -NULL IN (SELECT * from t) +select NULL IN (SELECT * from t1); +NULL IN (SELECT * from t1) NULL -update t set a=NULL where a='BC'; -select 'A' IN (SELECT * from t); -'A' IN (SELECT * from t) +update t1 set a=NULL where a='BC'; +select 'A' IN (SELECT * from t1); +'A' IN (SELECT * from t1) 1 -select 'DEF' IN (SELECT * from t); -'DEF' IN (SELECT * from t) +select 'DEF' IN (SELECT * from t1); +'DEF' IN (SELECT * from t1) 1 -select 'XYZS' IN (SELECT * from t); -'XYZS' IN (SELECT * from t) +select 'XYZS' IN (SELECT * from t1); +'XYZS' IN (SELECT * from t1) NULL -select 'A' > ALL (SELECT * from t); -'A' > ALL (SELECT * from t) +select 'A' > ALL (SELECT * from t1); +'A' > ALL (SELECT * from t1) 0 -select 'XYZS' > ALL (SELECT * from t); -'XYZS' > ALL (SELECT * from t) +select 'XYZS' > ALL (SELECT * from t1); +'XYZS' > ALL (SELECT * from t1) NULL -select 'A' > ANY (SELECT * from t); -'A' > ANY (SELECT * from t) +select 'A' > ANY (SELECT * from t1); +'A' > ANY (SELECT * from t1) NULL -select 'XYZS' > ANY (SELECT * from t); -'XYZS' > ANY (SELECT * from t) +select 'XYZS' > ANY (SELECT * from t1); +'XYZS' > ANY (SELECT * from t1) 1 -drop table t; -create table t (a float); -insert into t values (1.5),(2.5),(3.5); -select 1.5 IN (SELECT * from t); -1.5 IN (SELECT * from t) +drop table t1; +create table t1 (a float); +insert into t1 values (1.5),(2.5),(3.5); +select 1.5 IN (SELECT * from t1); +1.5 IN (SELECT * from t1) 1 -select 10.5 IN (SELECT * from t); -10.5 IN (SELECT * from t) +select 10.5 IN (SELECT * from t1); +10.5 IN (SELECT * from t1) 0 -select NULL IN (SELECT * from t); -NULL IN (SELECT * from t) +select NULL IN (SELECT * from t1); +NULL IN (SELECT * from t1) NULL -update t set a=NULL where a=2.5; -select 1.5 IN (SELECT * from t); -1.5 IN (SELECT * from t) +update t1 set a=NULL where a=2.5; +select 1.5 IN (SELECT * from t1); +1.5 IN (SELECT * from t1) 1 -select 3.5 IN (SELECT * from t); -3.5 IN (SELECT * from t) +select 3.5 IN (SELECT * from t1); +3.5 IN (SELECT * from t1) 1 -select 10.5 IN (SELECT * from t); -10.5 IN (SELECT * from t) +select 10.5 IN (SELECT * from t1); +10.5 IN (SELECT * from t1) NULL -select 1.5 > ALL (SELECT * from t); -1.5 > ALL (SELECT * from t) +select 1.5 > ALL (SELECT * from t1); +1.5 > ALL (SELECT * from t1) 0 -select 10.5 > ALL (SELECT * from t); -10.5 > ALL (SELECT * from t) +select 10.5 > ALL (SELECT * from t1); +10.5 > ALL (SELECT * from t1) NULL -select 1.5 > ANY (SELECT * from t); -1.5 > ANY (SELECT * from t) +select 1.5 > ANY (SELECT * from t1); +1.5 > ANY (SELECT * from t1) NULL -select 10.5 > ANY (SELECT * from t); -10.5 > ANY (SELECT * from t) +select 10.5 > ANY (SELECT * from t1); +10.5 > ANY (SELECT * from t1) 1 -explain select (select a+1) from t; +explain select (select a+1) from t1; id select_type table type possible_keys key key_len ref rows Extra -1 PRIMARY t ALL NULL NULL NULL NULL 3 +1 PRIMARY t1 ALL NULL NULL NULL NULL 3 Warnings: Note 1247 Select 2 was reduced during optimisation -select (select a+1) from t; +select (select a+1) from t1; (select a+1) 2.5 NULL 4.5 -drop table t; -create table t (a float); -select 10.5 IN (SELECT * from t LIMIT 1); +drop table t1; +CREATE TABLE t1 (a int(11) NOT NULL default '0', PRIMARY KEY (a)); +CREATE TABLE t2 (a int(11) default '0', INDEX (a)); +INSERT INTO t1 VALUES (1),(2),(3),(4); +INSERT INTO t2 VALUES (1),(2),(3); +SELECT t1.a, t1.a in (select t2.a from t2) FROM t1; +a t1.a in (select t2.a from t2) +1 1 +2 1 +3 1 +4 0 +explain SELECT t1.a, t1.a in (select t2.a from t2) FROM t1; +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY t1 index NULL PRIMARY 4 NULL 4 Using index +2 DEPENDENT SUBSELECT t2 index NULL a 5 NULL 3 Using where; Using index +drop table t1,t2; +create table t1 (a float); +select 10.5 IN (SELECT * from t1 LIMIT 1); This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery' -select 10.5 IN (SELECT * from t LIMIT 1 UNION SELECT 1.5); +select 10.5 IN (SELECT * from t1 LIMIT 1 UNION SELECT 1.5); This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery' -drop table t; +drop table t1; create table t1 (a int, b int, c varchar(10)); create table t2 (a int); insert into t1 values (1,2,'a'),(2,3,'b'),(3,4,'c'); @@ -899,20 +914,20 @@ INSERT INTO t1 VALUES (1); UPDATE t1 SET i=i+1 WHERE i=(SELECT MAX(i)); Invalid use of group function drop table t1; -CREATE TABLE t (a int(1)); -EXPLAIN SELECT (SELECT RAND() FROM t) FROM t; +CREATE TABLE t1 (a int(1)); +EXPLAIN SELECT (SELECT RAND() FROM t1) FROM t1; id select_type table type possible_keys key key_len ref rows Extra -1 PRIMARY t system NULL NULL NULL NULL 0 const row not found -2 UNCACHEABLE SUBSELECT t system NULL NULL NULL NULL 0 const row not found -EXPLAIN SELECT (SELECT ENCRYPT('test') FROM t) FROM t; +1 PRIMARY t1 system NULL NULL NULL NULL 0 const row not found +2 UNCACHEABLE SUBSELECT t1 system NULL NULL NULL NULL 0 const row not found +EXPLAIN SELECT (SELECT ENCRYPT('test') FROM t1) FROM t1; id select_type table type possible_keys key key_len ref rows Extra -1 PRIMARY t system NULL NULL NULL NULL 0 const row not found -2 UNCACHEABLE SUBSELECT t system NULL NULL NULL NULL 0 const row not found -EXPLAIN SELECT (SELECT BENCHMARK(1,1) FROM t) FROM t; +1 PRIMARY t1 system NULL NULL NULL NULL 0 const row not found +2 UNCACHEABLE SUBSELECT t1 system NULL NULL NULL NULL 0 const row not found +EXPLAIN SELECT (SELECT BENCHMARK(1,1) FROM t1) FROM t1; id select_type table type possible_keys key key_len ref rows Extra -1 PRIMARY t system NULL NULL NULL NULL 0 const row not found -2 UNCACHEABLE SUBSELECT t system NULL NULL NULL NULL 0 const row not found -drop table t; +1 PRIMARY t1 system NULL NULL NULL NULL 0 const row not found +2 UNCACHEABLE SUBSELECT t1 system NULL NULL NULL NULL 0 const row not found +drop table t1; CREATE TABLE `t1` ( `mot` varchar(30) character set latin1 NOT NULL default '', `topic` mediumint(8) unsigned NOT NULL default '0', diff --git a/mysql-test/t/subselect.test b/mysql-test/t/subselect.test index bb872df3e5c..1841e9f109a 100644 --- a/mysql-test/t/subselect.test +++ b/mysql-test/t/subselect.test @@ -378,79 +378,90 @@ drop table t1, t2, t3; -- error 1096 SELECT * FROM (SELECT 1) b WHERE 1 IN (SELECT *); -CREATE TABLE t (id int(11) default NULL, KEY id (id)) TYPE=MyISAM CHARSET=latin1; -INSERT INTO t VALUES (1),(2); -SELECT * FROM t WHERE id IN (SELECT 1); -EXPLAIN SELECT * FROM t WHERE id IN (SELECT 1); -SELECT * FROM t WHERE id IN (SELECT 1 UNION SELECT 3); -SELECT * FROM t WHERE id IN (SELECT 1+(select 1)); -EXPLAIN SELECT * FROM t WHERE id IN (SELECT 1+(select 1)); -EXPLAIN SELECT * FROM t WHERE id IN (SELECT 1 UNION SELECT 3); -SELECT * FROM t WHERE id IN (SELECT 5 UNION SELECT 3); -SELECT * FROM t WHERE id IN (SELECT 5 UNION SELECT 2); +CREATE TABLE t2 (id int(11) default NULL, KEY id (id)) TYPE=MyISAM CHARSET=latin1; +INSERT INTO t2 VALUES (1),(2); +SELECT * FROM t2 WHERE id IN (SELECT 1); +EXPLAIN SELECT * FROM t2 WHERE id IN (SELECT 1); +SELECT * FROM t2 WHERE id IN (SELECT 1 UNION SELECT 3); +SELECT * FROM t2 WHERE id IN (SELECT 1+(select 1)); +EXPLAIN SELECT * FROM t2 WHERE id IN (SELECT 1+(select 1)); +EXPLAIN SELECT * FROM t2 WHERE id IN (SELECT 1 UNION SELECT 3); +SELECT * FROM t2 WHERE id IN (SELECT 5 UNION SELECT 3); +SELECT * FROM t2 WHERE id IN (SELECT 5 UNION SELECT 2); -- error 1093 -INSERT INTO t VALUES ((SELECT * FROM t)); -SELECT * FROM t; +INSERT INTO t2 VALUES ((SELECT * FROM t2)); +SELECT * FROM t2; CREATE TABLE t1 (id int(11) default NULL, KEY id (id)) TYPE=MyISAM CHARSET=latin1; INSERT INTO t1 values (1),(1); -- error 1240 -UPDATE t SET id=(SELECT * FROM t1); -drop table t, t1; - +UPDATE t2 SET id=(SELECT * FROM t1); +drop table t2, t1; #NULL test -create table t (a int); -insert into t values (1),(2),(3); -select 1 IN (SELECT * from t); -select 10 IN (SELECT * from t); -select NULL IN (SELECT * from t); -update t set a=NULL where a=2; -select 1 IN (SELECT * from t); -select 3 IN (SELECT * from t); -select 10 IN (SELECT * from t); -select 1 > ALL (SELECT * from t); -select 10 > ALL (SELECT * from t); -select 1 > ANY (SELECT * from t); -select 10 > ANY (SELECT * from t); -drop table t; -create table t (a varchar(20)); -insert into t values ('A'),('BC'),('DEF'); -select 'A' IN (SELECT * from t); -select 'XYZS' IN (SELECT * from t); -select NULL IN (SELECT * from t); -update t set a=NULL where a='BC'; -select 'A' IN (SELECT * from t); -select 'DEF' IN (SELECT * from t); -select 'XYZS' IN (SELECT * from t); -select 'A' > ALL (SELECT * from t); -select 'XYZS' > ALL (SELECT * from t); -select 'A' > ANY (SELECT * from t); -select 'XYZS' > ANY (SELECT * from t); -drop table t; -create table t (a float); -insert into t values (1.5),(2.5),(3.5); -select 1.5 IN (SELECT * from t); -select 10.5 IN (SELECT * from t); -select NULL IN (SELECT * from t); -update t set a=NULL where a=2.5; -select 1.5 IN (SELECT * from t); -select 3.5 IN (SELECT * from t); -select 10.5 IN (SELECT * from t); -select 1.5 > ALL (SELECT * from t); -select 10.5 > ALL (SELECT * from t); -select 1.5 > ANY (SELECT * from t); -select 10.5 > ANY (SELECT * from t); -explain select (select a+1) from t; -select (select a+1) from t; -drop table t; +create table t1 (a int); +insert into t1 values (1),(2),(3); +select 1 IN (SELECT * from t1); +select 10 IN (SELECT * from t1); +select NULL IN (SELECT * from t1); +update t1 set a=NULL where a=2; +select 1 IN (SELECT * from t1); +select 3 IN (SELECT * from t1); +select 10 IN (SELECT * from t1); +select 1 > ALL (SELECT * from t1); +select 10 > ALL (SELECT * from t1); +select 1 > ANY (SELECT * from t1); +select 10 > ANY (SELECT * from t1); +drop table t1; +create table t1 (a varchar(20)); +insert into t1 values ('A'),('BC'),('DEF'); +select 'A' IN (SELECT * from t1); +select 'XYZS' IN (SELECT * from t1); +select NULL IN (SELECT * from t1); +update t1 set a=NULL where a='BC'; +select 'A' IN (SELECT * from t1); +select 'DEF' IN (SELECT * from t1); +select 'XYZS' IN (SELECT * from t1); +select 'A' > ALL (SELECT * from t1); +select 'XYZS' > ALL (SELECT * from t1); +select 'A' > ANY (SELECT * from t1); +select 'XYZS' > ANY (SELECT * from t1); +drop table t1; +create table t1 (a float); +insert into t1 values (1.5),(2.5),(3.5); +select 1.5 IN (SELECT * from t1); +select 10.5 IN (SELECT * from t1); +select NULL IN (SELECT * from t1); +update t1 set a=NULL where a=2.5; +select 1.5 IN (SELECT * from t1); +select 3.5 IN (SELECT * from t1); +select 10.5 IN (SELECT * from t1); +select 1.5 > ALL (SELECT * from t1); +select 10.5 > ALL (SELECT * from t1); +select 1.5 > ANY (SELECT * from t1); +select 10.5 > ANY (SELECT * from t1); +explain select (select a+1) from t1; +select (select a+1) from t1; +drop table t1; + +# +# Null with keys +# + +CREATE TABLE t1 (a int(11) NOT NULL default '0', PRIMARY KEY (a)); +CREATE TABLE t2 (a int(11) default '0', INDEX (a)); +INSERT INTO t1 VALUES (1),(2),(3),(4); +INSERT INTO t2 VALUES (1),(2),(3); +SELECT t1.a, t1.a in (select t2.a from t2) FROM t1; +explain SELECT t1.a, t1.a in (select t2.a from t2) FROM t1; +drop table t1,t2; #LIMIT is not supported now -create table t (a float); +create table t1 (a float); -- error 1235 -select 10.5 IN (SELECT * from t LIMIT 1); +select 10.5 IN (SELECT * from t1 LIMIT 1); -- error 1235 -select 10.5 IN (SELECT * from t LIMIT 1 UNION SELECT 1.5); -drop table t; +select 10.5 IN (SELECT * from t1 LIMIT 1 UNION SELECT 1.5); +drop table t1; create table t1 (a int, b int, c varchar(10)); create table t2 (a int); @@ -517,11 +528,11 @@ UPDATE t1 SET i=i+1 WHERE i=(SELECT MAX(i)); drop table t1; #test of uncacheable subqueries -CREATE TABLE t (a int(1)); -EXPLAIN SELECT (SELECT RAND() FROM t) FROM t; -EXPLAIN SELECT (SELECT ENCRYPT('test') FROM t) FROM t; -EXPLAIN SELECT (SELECT BENCHMARK(1,1) FROM t) FROM t; -drop table t; +CREATE TABLE t1 (a int(1)); +EXPLAIN SELECT (SELECT RAND() FROM t1) FROM t1; +EXPLAIN SELECT (SELECT ENCRYPT('test') FROM t1) FROM t1; +EXPLAIN SELECT (SELECT BENCHMARK(1,1) FROM t1) FROM t1; +drop table t1; CREATE TABLE `t1` ( diff --git a/sql/item.cc b/sql/item.cc index d6f0d59e058..ee7af1ae0fd 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -286,7 +286,7 @@ table_map Item_field::used_tables() const { if (field->table->const_table) return 0; // const item - return (depended_from? RAND_TABLE_BIT : field->table->map); + return (depended_from ? RAND_TABLE_BIT : field->table->map); } Item *Item_field::get_tmp_table_item(THD *thd) diff --git a/sql/item.h b/sql/item.h index 8c7914cefeb..531817c4844 100644 --- a/sql/item.h +++ b/sql/item.h @@ -102,6 +102,7 @@ public: virtual void save_in_result_field(bool no_conversions) {} virtual void no_rows_in_result() {} virtual Item *copy_or_same(THD *thd) { return this; } + virtual Item *real_item() { return this; } virtual Item *get_tmp_table_item(THD *thd) { return copy_or_same(thd); } virtual bool binary() const @@ -468,9 +469,10 @@ class Item_ref :public Item_ident public: Field *result_field; /* Save result here */ Item **ref; - Item_ref(char *db_par,char *table_name_par,char *field_name_par) + Item_ref(const char *db_par, const char *table_name_par, + const char *field_name_par) :Item_ident(db_par,table_name_par,field_name_par),ref(0) {} - Item_ref(Item **item, char *table_name_par,char *field_name_par) + Item_ref(Item **item, const char *table_name_par, const char *field_name_par) :Item_ident(NullS,table_name_par,field_name_par),ref(item) {} // Constructor need to process subselect with temporary tables (see Item) Item_ref(THD *thd, Item_ref &item) @@ -521,6 +523,7 @@ public: { (*ref)->save_in_field(result_field, no_conversions); } + Item *real_item() { return *ref; } }; class Item_in_subselect; @@ -530,7 +533,7 @@ protected: Item_in_subselect* owner; public: Item_ref_null_helper(Item_in_subselect* master, Item **item, - char *table_name_par, char *field_name_par): + const char *table_name_par, const char *field_name_par): Item_ref(item, table_name_par, field_name_par), owner(master) {} double val(); longlong val_int(); diff --git a/sql/item_func.cc b/sql/item_func.cc index 6494573458c..788961a954d 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -120,10 +120,10 @@ Item_func::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref) used_tables_cache|=(*arg)->used_tables(); const_item_cache&= (*arg)->const_item(); } - if (result_type() == STRING_RESULT) - set_charset((*args)->charset()); } fix_length_and_dec(); + if (result_type() == STRING_RESULT) + set_charset((*args)->charset()); fixed= 1; return 0; } diff --git a/sql/item_row.cc b/sql/item_row.cc index 23cafe7ec31..cf745e21e45 100644 --- a/sql/item_row.cc +++ b/sql/item_row.cc @@ -26,7 +26,7 @@ */ Item_row::Item_row(List<Item> &arg): - Item(), used_tables_cache(0), array_holder(1), const_item_cache(1) + Item(), used_tables_cache(0), array_holder(1), const_item_cache(1), with_null(0) { //TODO: think placing 2-3 component items in item (as it done for function) diff --git a/sql/item_strfunc.h b/sql/item_strfunc.h index 3a7810fa306..b2e54474494 100644 --- a/sql/item_strfunc.h +++ b/sql/item_strfunc.h @@ -262,7 +262,7 @@ public: class Item_func_old_password :public Item_str_func { - char tmp_value[16]; /* old password length */ + char tmp_value[17]; /* old password length +1 */ public: Item_func_old_password(Item *a) :Item_str_func(a) {} String *val_str(String *); diff --git a/sql/item_subselect.cc b/sql/item_subselect.cc index 21acb31a7d5..fb51b5561e9 100644 --- a/sql/item_subselect.cc +++ b/sql/item_subselect.cc @@ -489,8 +489,8 @@ void Item_in_subselect::single_value_transformer(THD *thd, sl->order_list.elements + sl->group_list.elements); item= (*func)(expr, new Item_ref_null_helper(this, sl->ref_pointer_array, - (char *)"<no matter>", - (char*)"<result>")); + (char *)"<ref>", + this->full_name())); sl->having= and_items(sl->having, item); } else diff --git a/sql/log_event.cc b/sql/log_event.cc index 34e3deebf69..0631e21fbd1 100644 --- a/sql/log_event.cc +++ b/sql/log_event.cc @@ -766,7 +766,7 @@ int Query_log_event::write_data(IO_CACHE* file) #ifndef MYSQL_CLIENT Query_log_event::Query_log_event(THD* thd_arg, const char* query_arg, ulong query_length, bool using_trans) - :Log_event(thd_arg, !thd_arg->lex.tmp_table_used ? + :Log_event(thd_arg, !thd_arg->tmp_table_used ? 0 : LOG_EVENT_THREAD_SPECIFIC_F, using_trans), data_buf(0), query(query_arg), db(thd_arg->db), q_len((uint32) query_length), diff --git a/sql/sql_base.cc b/sql/sql_base.cc index f4a32b482b3..97c92ff2b8f 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -792,7 +792,7 @@ TABLE *open_table(THD *thd,const char *db,const char *table_name, DBUG_RETURN(0); } table->query_id=thd->query_id; - thd->lex.tmp_table_used= 1; + thd->tmp_table_used= 1; goto reset; } } diff --git a/sql/sql_class.cc b/sql/sql_class.cc index 4d78a03289b..23a8a6fa8f1 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -87,7 +87,7 @@ THD::THD():user_time(0), is_fatal_error(0), locked=killed=count_cuted_fields=some_tables_deleted=no_errors=password= query_start_used=prepare_command=0; db_length=query_length=col_access=0; - query_error=0; + query_error= tmp_table_used= 0; next_insert_id=last_insert_id=0; open_tables= temporary_tables= handler_tables= derived_tables= 0; current_tablenr=0; diff --git a/sql/sql_class.h b/sql/sql_class.h index 51067d94990..2d492b19a2b 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -550,6 +550,7 @@ public: bool query_error, bootstrap, cleanup_done; bool volatile killed; bool prepare_command; + bool tmp_table_used; /* If we do a purge of binary logs, log index info of the threads diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index 6bb81de5fcf..29d56905788 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -167,7 +167,6 @@ LEX *lex_start(THD *thd, uchar *buf,uint length) lex->slave_thd_opt=0; lex->sql_command=SQLCOM_END; lex->safe_to_cache_query= 1; - lex->tmp_table_used= 0; bzero(&lex->mi,sizeof(lex->mi)); return lex; } @@ -1051,8 +1050,7 @@ void st_select_lex::init_select() use_index.empty(); ftfunc_list_alloc.empty(); ftfunc_list= &ftfunc_list_alloc; - if (linkage != UNION_TYPE) - linkage= UNSPECIFIED_TYPE; + linkage= UNSPECIFIED_TYPE; } /* diff --git a/sql/sql_lex.h b/sql/sql_lex.h index 3ce865e7b39..4ef8ffa840e 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -221,9 +221,11 @@ public: static void *operator new(size_t size) { + // TODO: Change to alloc() and explicitely clear elements in constructors return (void*) sql_calloc((uint) size); } static void operator delete(void *ptr,size_t size) {} + st_select_lex_node() {} virtual ~st_select_lex_node() {} inline st_select_lex_node* get_master() { return master; } virtual void init_query(); @@ -475,7 +477,6 @@ typedef struct st_lex uint slave_thd_opt; CHARSET_INFO *charset; char *help_arg; - bool tmp_table_used; inline void uncacheable() { diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index d9bfc901475..08e37a5576b 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -3181,6 +3181,7 @@ mysql_init_query(THD *thd) thd->sent_row_count= thd->examined_row_count= 0; thd->is_fatal_error= thd->rand_used= 0; thd->server_status &= ~SERVER_MORE_RESULTS_EXISTS; + thd->tmp_table_used= 0; if (opt_bin_log) reset_dynamic(&thd->user_var_events); diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 00f7ed9bfc9..4543c6bc5d0 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -1902,9 +1902,10 @@ add_key_fields(JOIN_TAB *stat,KEY_FIELD **key_fields,uint *and_level, case Item_func::OPTIMIZE_NONE: break; case Item_func::OPTIMIZE_KEY: - if (cond_func->key_item()->type() == Item::FIELD_ITEM) + if (cond_func->key_item()->real_item()->type() == Item::FIELD_ITEM) add_key_field(key_fields,*and_level, - ((Item_field*) (cond_func->key_item()))->field, + ((Item_field*) (cond_func->key_item()->real_item())) + ->field, 0,(Item*) 0,usable_tables); break; case Item_func::OPTIMIZE_OP: @@ -1912,18 +1913,20 @@ add_key_fields(JOIN_TAB *stat,KEY_FIELD **key_fields,uint *and_level, bool equal_func=(cond_func->functype() == Item_func::EQ_FUNC || cond_func->functype() == Item_func::EQUAL_FUNC); - if (cond_func->arguments()[0]->type() == Item::FIELD_ITEM) + if (cond_func->arguments()[0]->real_item()->type() == Item::FIELD_ITEM) { add_key_field(key_fields,*and_level, - ((Item_field*) (cond_func->arguments()[0]))->field, + ((Item_field*) (cond_func->arguments()[0])->real_item()) + ->field, equal_func, (cond_func->arguments()[1]),usable_tables); } - if (cond_func->arguments()[1]->type() == Item::FIELD_ITEM && + if (cond_func->arguments()[1]->real_item()->type() == Item::FIELD_ITEM && cond_func->functype() != Item_func::LIKE_FUNC) { add_key_field(key_fields,*and_level, - ((Item_field*) (cond_func->arguments()[1]))->field, + ((Item_field*) (cond_func->arguments()[1])->real_item()) + ->field, equal_func, (cond_func->arguments()[0]),usable_tables); } @@ -1931,10 +1934,11 @@ add_key_fields(JOIN_TAB *stat,KEY_FIELD **key_fields,uint *and_level, } case Item_func::OPTIMIZE_NULL: /* column_name IS [NOT] NULL */ - if (cond_func->arguments()[0]->type() == Item::FIELD_ITEM) + if (cond_func->arguments()[0]->real_item()->type() == Item::FIELD_ITEM) { add_key_field(key_fields,*and_level, - ((Item_field*) (cond_func->arguments()[0]))->field, + ((Item_field*) (cond_func->arguments()[0])->real_item()) + ->field, cond_func->functype() == Item_func::ISNULL_FUNC, new Item_null, usable_tables); } diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 9738e1dd86d..66168459c7a 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -250,7 +250,7 @@ int mysql_rm_table_part2(THD *thd, TABLE_LIST *tables, bool if_exists, wrong_tables.append(String(table->real_name,default_charset_info)); } } - thd->lex.tmp_table_used= tmp_table_deleted; + thd->tmp_table_used= tmp_table_deleted; if (some_tables_deleted || tmp_table_deleted) { query_cache_invalidate3(thd, tables, 0); @@ -885,7 +885,7 @@ int mysql_create_table(THD *thd,const char *db, const char *table_name, (void) rm_temporary_table(create_info->db_type, path); goto end; } - thd->lex.tmp_table_used= 1; + thd->tmp_table_used= 1; } if (!tmp_table && !no_log) { |