List:Commits« Previous MessageNext Message »
From:Mattias Jonsson Date:August 21 2009 3:38pm
Subject:bzr commit into mysql-5.1 branch (mattias.jonsson:3072) Bug#46639
View as plain text  
#At file:///Users/mattiasj/clones/bzrroot/b46639-51-bugteam/ based on revid:joro@stripped

 3072 Mattias Jonsson	2009-08-21
      Bug#46639: 1030 (HY000): Got error 124 from storage engine on
      INSERT ... SELECT ...
      
      Problem was that when bulk insert is used on an empty
      table/partition, it disables the indexes for better
      performance, but in this specific case it also tries
      to read from that partition using an index, which is
      not possible since it has been disabled.
      
      Solution was to allow index reads on disabled indexes
      if there are no records.
      
      Also reverted the patch for bug#38005, since that was a workaround
      in the partitioning engine instead of a fix in myisam.
     @ mysql-test/r/partition.result
        Bug#46639: 1030 (HY000): Got error 124 from storage engine on
        INSERT ... SELECT ...
        
        updated result file
     @ mysql-test/t/partition.test
        Bug#46639: 1030 (HY000): Got error 124 from storage engine on
        INSERT ... SELECT ...
        
        Added testcase
     @ sql/ha_partition.cc
        Bug#46639: 1030 (HY000): Got error 124 from storage engine on
        INSERT ... SELECT ...
        
        reverted the patch for bug#38005, since that was a workaround
        around this problem, not needed after fixing it in myisam.
     @ storage/myisam/mi_search.c
        Bug#46639: 1030 (HY000): Got error 124 from storage engine on
        INSERT ... SELECT ...
        
        Return HA_ERR_END_OF_FILE instead of HA_ERR_WRONG_INDEX
        when there are no rows.

    modified:
      mysql-test/r/partition.result
      mysql-test/t/partition.test
      sql/ha_partition.cc
      storage/myisam/mi_search.c
=== modified file 'mysql-test/r/partition.result'
--- a/mysql-test/r/partition.result	2009-08-12 10:03:05 +0000
+++ b/mysql-test/r/partition.result	2009-08-21 15:38:29 +0000
@@ -1,5 +1,19 @@
 drop table if exists t1, t2;
 CREATE TABLE t1 (
+a int NOT NULL,
+b int NOT NULL);
+CREATE TABLE t2 (
+a int NOT NULL,
+b int NOT NULL,
+INDEX(b)
+)
+PARTITION BY HASH(a) PARTITIONS 2;
+INSERT INTO t1 VALUES (399, 22);
+INSERT INTO t2 VALUES (1, 22), (1, 42);
+INSERT INTO t2 SELECT 1, 399 FROM t2, t1
+WHERE t1.b = t2.b;
+DROP TABLE t1, t2;
+CREATE TABLE t1 (
 a timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
 b varchar(10),
 PRIMARY KEY (a)

=== modified file 'mysql-test/t/partition.test'
--- a/mysql-test/t/partition.test	2009-08-12 10:03:05 +0000
+++ b/mysql-test/t/partition.test	2009-08-21 15:38:29 +0000
@@ -15,6 +15,28 @@ drop table if exists t1, t2;
 --enable_warnings
 
 #
+# Bug#46639: 1030 (HY000): Got error 124 from storage engine on
+# INSERT ... SELECT ...
+CREATE TABLE t1 (
+  a int NOT NULL,
+  b int NOT NULL);
+
+CREATE TABLE t2 (
+  a int NOT NULL,
+  b int NOT NULL,
+  INDEX(b)
+)
+PARTITION BY HASH(a) PARTITIONS 2;
+
+INSERT INTO t1 VALUES (399, 22);
+INSERT INTO t2 VALUES (1, 22), (1, 42);
+
+INSERT INTO t2 SELECT 1, 399 FROM t2, t1
+WHERE t1.b = t2.b;
+
+DROP TABLE t1, t2;
+
+#
 # Bug#46478: timestamp field incorrectly defaulted when partition is reorganized
 #
 CREATE TABLE t1 (

=== modified file 'sql/ha_partition.cc'
--- a/sql/ha_partition.cc	2009-08-06 11:31:26 +0000
+++ b/sql/ha_partition.cc	2009-08-21 15:38:29 +0000
@@ -4414,17 +4414,6 @@ int ha_partition::handle_unordered_scan_
       break;
     case partition_index_first:
       DBUG_PRINT("info", ("index_first on partition %d", i));
-      /* MyISAM engine can fail if we call index_first() when indexes disabled */
-      /* that happens if the table is empty. */
-      /* Here we use file->stats.records instead of file->records() because */
-      /* file->records() is supposed to return an EXACT count, and it can be   */
-      /* possibly slow. We don't need an exact number, an approximate one- from*/
-      /* the last ::info() call - is sufficient. */
-      if (file->stats.records == 0)
-      {
-        error= HA_ERR_END_OF_FILE;
-        break;
-      }
       error= file->index_first(buf);
       break;
     case partition_index_first_unordered:
@@ -4512,32 +4501,10 @@ int ha_partition::handle_ordered_index_s
                                   m_start_key.flag);
       break;
     case partition_index_first:
-      /* MyISAM engine can fail if we call index_first() when indexes disabled */
-      /* that happens if the table is empty. */
-      /* Here we use file->stats.records instead of file->records() because */
-      /* file->records() is supposed to return an EXACT count, and it can be   */
-      /* possibly slow. We don't need an exact number, an approximate one- from*/
-      /* the last ::info() call - is sufficient. */
-      if (file->stats.records == 0)
-      {
-        error= HA_ERR_END_OF_FILE;
-        break;
-      }
       error= file->index_first(rec_buf_ptr);
       reverse_order= FALSE;
       break;
     case partition_index_last:
-      /* MyISAM engine can fail if we call index_last() when indexes disabled */
-      /* that happens if the table is empty. */
-      /* Here we use file->stats.records instead of file->records() because */
-      /* file->records() is supposed to return an EXACT count, and it can be   */
-      /* possibly slow. We don't need an exact number, an approximate one- from*/
-      /* the last ::info() call - is sufficient. */
-      if (file->stats.records == 0)
-      {
-        error= HA_ERR_END_OF_FILE;
-        break;
-      }
       error= file->index_last(rec_buf_ptr);
       reverse_order= TRUE;
       break;

=== modified file 'storage/myisam/mi_search.c'
--- a/storage/myisam/mi_search.c	2009-02-13 16:41:47 +0000
+++ b/storage/myisam/mi_search.c	2009-08-21 15:38:29 +0000
@@ -28,9 +28,15 @@ int _mi_check_index(MI_INFO *info, int i
 {
   if (inx == -1)                        /* Use last index */
     inx=info->lastinx;
-  if (inx < 0 || ! mi_is_key_active(info->s->state.key_map, inx))
+  if (inx < 0)
   {
-    my_errno=HA_ERR_WRONG_INDEX;
+    my_errno= HA_ERR_WRONG_INDEX;
+    return -1;
+  }
+  if (!mi_is_key_active(info->s->state.key_map, inx))
+  {
+    my_errno= info->s->state.state.records ? HA_ERR_WRONG_INDEX :
+                                             HA_ERR_END_OF_FILE;
     return -1;
   }
   if (info->lastinx != inx)             /* Index changed */


Attachment: [text/bzr-bundle]
Thread
bzr commit into mysql-5.1 branch (mattias.jonsson:3072) Bug#46639Mattias Jonsson21 Aug