Kristian,

Below you'll find a patch for bug #53334 (against mysql-5.1.46).

I investigated other latest fixes pushed by Sergey Glukhov.

The fix for bugs ##51242/52336 looked suspicious for me.
And it actually provides a work-around rather than fixes the following
bug that causes both failures:

In the function JOIN::exec
there should be
      Item* sort_table_cond= make_cond_for_table(curr_join->tmp_having,
                                                 used_tables,
                                                 (table_map) 0);
instead of
       Item* sort_table_cond= make_cond_for_table(curr_join->tmp_having,
                                                 used_tables,
                                                 used_tables);

Regards,
Igor.

3447 Igor Babaev        2010-05-02
      Fixed bug #53334.
      The fix actually reverts the change introduced by the patch
      for bug 51494
      The fact is that the patch for bug 52177 fixes bug 51194 as well.
      modified:
        mysql-test/r/innodb_mysql.result
        mysql-test/t/innodb_mysql.test
        sql/sql_select.cc

=== modified file 'mysql-test/r/innodb_mysql.result'
--- a/mysql-test/r/innodb_mysql.result  2010-03-17 14:18:46 +0000
+++ b/mysql-test/r/innodb_mysql.result  2010-05-03 04:22:37 +0000
@@ -2350,4 +2350,34 @@ Null     
 Index_type     BTREE
 Comment        
 DROP TABLE t1;
+#
+# Bug #53334: wrong result for outer join with impossible ON condition
+# (see the same test case for MyISAM in join.test)
+#
+create table t1 (id int primary key);
+create table t2 (id int);
+insert into t1 values (75);
+insert into t1 values (79);
+insert into t1 values (78);
+insert into t1 values (77);
+replace into t1 values (76);
+replace into t1 values (76);
+insert into t1 values (104);
+insert into t1 values (103);
+insert into t1 values (102);
+insert into t1 values (101);
+insert into t1 values (105);
+insert into t1 values (106);
+insert into t1 values (107);
+insert into t2 values (107),(75),(1000);
+select t1.id,t2.id from t2 left join t1 on t1.id>=74 and t1.id<=0
+where t2.id=75 and t1.id is null;
+id     id
+NULL   75
+explain select t1.id,t2.id from t2 left join t1 on t1.id>=74 and t1.id<=0
+where t2.id=75 and t1.id is null;
+id     select_type     table   type    possible_keys   key     key_len ref     
rows    Extra
+1      SIMPLE  t1      const   PRIMARY NULL    NULL    NULL    1       
Impossible ON condition
+1      SIMPLE  t2      ALL     NULL    NULL    NULL    NULL    3       Using 
where
+drop table t1,t2;
 End of 5.1 tests

=== modified file 'mysql-test/t/innodb_mysql.test'
--- a/mysql-test/t/innodb_mysql.test    2010-03-17 14:18:46 +0000
+++ b/mysql-test/t/innodb_mysql.test    2010-05-03 04:22:37 +0000
@@ -589,4 +589,35 @@ ALTER TABLE t1 DROP INDEX k, ADD UNIQUE

 DROP TABLE t1;

+--echo #
+--echo # Bug #53334: wrong result for outer join with impossible ON
condition
+--echo # (see the same test case for MyISAM in join.test)
+--echo #
+
+create table t1 (id int primary key);
+create table t2 (id int);
+
+insert into t1 values (75);
+insert into t1 values (79);
+insert into t1 values (78);
+insert into t1 values (77);
+replace into t1 values (76);
+replace into t1 values (76);
+insert into t1 values (104);
+insert into t1 values (103);
+insert into t1 values (102);
+insert into t1 values (101);
+insert into t1 values (105);
+insert into t1 values (106);
+insert into t1 values (107);
+
+insert into t2 values (107),(75),(1000);
+
+select t1.id,t2.id from t2 left join t1 on t1.id>=74 and t1.id<=0
+  where t2.id=75 and t1.id is null;
+explain select t1.id,t2.id from t2 left join t1 on t1.id>=74 and t1.id<=0
+  where t2.id=75 and t1.id is null;
+
+drop table t1,t2;
+
 --echo End of 5.1 tests

=== modified file 'sql/sql_select.cc'
--- a/sql/sql_select.cc 2010-04-12 10:12:20 +0000
+++ b/sql/sql_select.cc 2010-05-03 04:22:37 +0000
@@ -2968,8 +2968,7 @@ make_join_statistics(JOIN *join, TABLE_L
       s->quick=select->quick;
       s->needed_reg=select->needed_reg;
       select->quick=0;
-      if (records == 0 && s->table->reginfo.impossible_range &&
-          (s->table->file->ha_table_flags() & HA_STATS_RECORDS_IS_EXACT))
+      if (records == 0 && s->table->reginfo.impossible_range)
       {
        /*
          Impossible WHERE or ON expression



Kristian Nielsen wrote:
> Hi Igor, Timour, Sergey,
> 
> Can one of you please check this patch from MySQL 5.1.46? It is a commit to
> fix http://bugs.mysql.com/bug.php?id=51494
> 
> This patch introduces a regression:
> 
>     http://bugs.mysql.com/bug.php?id=53334
> 
> If I revert the patch, the regression disappears. And interestingly, the
> included test case does not fail even when the fix is reverted (go figure...)
> 
> So it would be good if one of you could check the patch and check what is
> wrong with it, and if a different fix for Bug#51494 is needed.
> 
> (needed to complete merge of MySQL 5.1.46).
> 
> Thanks,
> 
>  - Kristian.
> 
> ------------------------------------------------------------
> revno: 3407.1.1
> revision-id: sergey.gluk...@sun.com-20100319060102-57ykzjf4pc93avy1
> parent: o...@mysql.com-20100318064207-l3ap0mpxt510b4n3
> committer: Sergey Glukhov <sergey.gluk...@sun.com>
> branch nick: mysql-5.1-bugteam
> timestamp: Fri 2010-03-19 10:01:02 +0400
> message:
>   Bug#51494 crash with join, explain and 'sounds like' operator
>   The crash happens because of discrepancy between values of
>   conts_tables and join->const_table_map(make_join_statisctics).
>   Calculation of conts_tables used condition with
>   HA_STATS_RECORDS_IS_EXACT flag check. Calculation of
>   join->const_table_map does not use this flag check.
>   In case of MERGE table without union with index
>   the table does not become const table and
>   thus join_read_const_table() is not called
>   for the table. join->const_table_map supposes
>   this table is const and later in make_join_select
>   this table is used for making&calculation const
>   condition. As table record buffer is not populated
>   it leads to crash.
>   The fix is adding a check if an engine supports
>   HA_STATS_RECORDS_IS_EXACT flag before updating
>   join->const_table_map.
> diff:
> === modified file 'sql/sql_select.cc'
> --- sql/sql_select.cc 2010-03-14 16:01:45 +0000
> +++ sql/sql_select.cc 2010-03-19 06:01:02 +0000
> @@ -2943,7 +2943,8 @@
>        s->quick=select->quick;
>        s->needed_reg=select->needed_reg;
>        select->quick=0;
> -      if (records == 0 && s->table->reginfo.impossible_range)
> +      if (records == 0 && s->table->reginfo.impossible_range &&
> +          (s->table->file->ha_table_flags() & HA_STATS_RECORDS_IS_EXACT))
>        {
>       /*
>         Impossible WHERE or ON expression
> === modified file 'mysql-test/r/merge.result'
> --- mysql-test/r/merge.result 2010-03-03 10:49:03 +0000
> +++ mysql-test/r/merge.result 2010-03-19 06:01:02 +0000
> @@ -2286,4 +2286,16 @@
>  DROP TABLE m1;
>  DROP TABLE `t...@1`.`t@1`;
>  DROP DATABASE `t...@1`;
> +#
> +# Bug#51494c rash with join, explain and 'sounds like' operator
> +#
> +CREATE TABLE t1 (a INT) ENGINE=MYISAM;
> +INSERT INTO t1 VALUES(1);
> +CREATE TABLE t2 (b INT NOT NULL,c INT,d INT,e BLOB NOT NULL,
> +KEY idx0 (d, c)) ENGINE=MERGE;
> +EXPLAIN SELECT * FROM t1 NATURAL RIGHT JOIN
> +t2 WHERE b SOUNDS LIKE e AND d = 1;
> +id   select_type     table   type    possible_keys   key     key_len ref     
> rows    Extra
> +1    SIMPLE  NULL    NULL    NULL    NULL    NULL    NULL    NULL    
> Impossible WHERE noticed after reading const tables
> +DROP TABLE t2, t1;
>  End of 5.1 tests
> 
> === modified file 'mysql-test/t/merge.test'
> --- mysql-test/t/merge.test   2010-03-03 10:49:03 +0000
> +++ mysql-test/t/merge.test   2010-03-19 06:01:02 +0000
> @@ -1690,4 +1690,19 @@
>  DROP TABLE `t...@1`.`t@1`;
>  DROP DATABASE `t...@1`;
>  
> +--echo #
> +--echo # Bug#51494c rash with join, explain and 'sounds like' operator
> +--echo #
> +
> +CREATE TABLE t1 (a INT) ENGINE=MYISAM;
> +INSERT INTO t1 VALUES(1);
> +
> +CREATE TABLE t2 (b INT NOT NULL,c INT,d INT,e BLOB NOT NULL,
> +KEY idx0 (d, c)) ENGINE=MERGE;
> +
> +EXPLAIN SELECT * FROM t1 NATURAL RIGHT JOIN
> +t2 WHERE b SOUNDS LIKE e AND d = 1;
> +
> +DROP TABLE t2, t1;
> +
>  --echo End of 5.1 tests
> 


_______________________________________________
Mailing list: https://launchpad.net/~maria-developers
Post to     : maria-developers@lists.launchpad.net
Unsubscribe : https://launchpad.net/~maria-developers
More help   : https://help.launchpad.net/ListHelp

Reply via email to