From df843c4ce26e2c5d152098302b209252c712382e Mon Sep 17 00:00:00 2001
From: unknown <monty@mysql.com/narttu.mysql.fi>
Date: Thu, 21 Feb 2008 02:45:02 +0200
Subject: [PATCH] Fixed problems with ma_test2 and mi_test2 on high-byte-first
 system Fixed bug in ma_test2 when last row in table is deleted Fixed that
 ma_test_recovery.pl works on Solaris (by using digest instead of md5sum)
 Fixed some compiler warnings generated by the Forte compiler

dbug/dbug.c:
  Added cast to get rid of compiler warning
mysys/lf_alloc-pin.c:
  Added cast to get rid of compiler warning
mysys/my_bitmap.c:
  Removed impossible DBUG_ASSERT()'s to get rid of compiler warnings
mysys/my_compress.c:
  Removed wrong cast to get rid of compiler warning
storage/maria/lockman.c:
  Added cast to get rid of compiler warning
storage/maria/ma_open.c:
  Added fix from MyISAM to allocate space in key buffer for nod pointer
storage/maria/ma_recovery.c:
  Fixed initialization that caused compiler warning
storage/maria/ma_rsame.c:
  More DBUG_PRINT
storage/maria/ma_scan.c:
  Better comment
storage/maria/ma_statrec.c:
  More DBUG_PRINT and comments
  Fixed indentation
BitKeeper/etc/ignore:
  added storage/maria/unittest/tmp/*
storage/maria/ma_test2.c:
  Fixed bug that caused maria_rsame() to fail if test removed last row
  Fixed wrong usage of longget();  Should be uint4korr()
storage/maria/unittest/ma_test_recovery.pl:
  Use md5sum or digest to calculate md5.
  This allows this script to be run on Linux and Solaris
storage/myisam/mi_test2.c:
  Fixed wrong usage of longget();  Should be uint4korr()
strings/ctype.c:
  Added casts to get rid of compiler warnings
sql-bench/myisam.cnf:
  New BitKeeper file ``sql-bench/myisam.cnf''
---
 .bzrignore                                 |  1 +
 dbug/dbug.c                                |  2 +-
 mysys/lf_alloc-pin.c                       |  8 +++--
 mysys/my_bitmap.c                          |  4 ---
 mysys/my_compress.c                        |  2 +-
 sql-bench/myisam.cnf                       |  3 ++
 storage/maria/lockman.c                    |  2 +-
 storage/maria/ma_open.c                    |  2 ++
 storage/maria/ma_recovery.c                |  2 +-
 storage/maria/ma_rsame.c                   |  3 ++
 storage/maria/ma_scan.c                    |  7 ++--
 storage/maria/ma_statrec.c                 | 22 ++++++++++---
 storage/maria/ma_test2.c                   | 17 ++++++++--
 storage/maria/unittest/ma_test_recovery.pl | 37 ++++++++++++++++++++--
 storage/myisam/mi_test2.c                  |  2 +-
 strings/ctype.c                            |  4 ++-
 16 files changed, 92 insertions(+), 26 deletions(-)
 create mode 100644 sql-bench/myisam.cnf

diff --git a/.bzrignore b/.bzrignore
index 01d027f288..eb0e6681b3 100644
--- a/.bzrignore
+++ b/.bzrignore
@@ -3077,3 +3077,4 @@ maria_log.00000*
 ma_test_recovery.output
 test?.MA?
 dbug/tests
+storage/maria/unittest/tmp/*
diff --git a/dbug/dbug.c b/dbug/dbug.c
index d6f436f578..b2ba6cd094 100644
--- a/dbug/dbug.c
+++ b/dbug/dbug.c
@@ -124,7 +124,7 @@
 #define SANITY_CHECK_ON (1 << 10)  /* Check safemalloc on DBUG_ENTER */
 #define FLUSH_ON_WRITE  (1 << 11)  /* Flush on every write */
 #define OPEN_APPEND     (1 << 12)  /* Open for append      */
-#define TRACE_ON        (1 << 31)  /* Trace enabled. MUST be the highest bit!*/
+#define TRACE_ON        ((uint)1 << 31)  /* Trace enabled. MUST be the highest bit!*/
 
 #define TRACING (cs->stack->flags & TRACE_ON)
 #define DEBUGGING (cs->stack->flags & DEBUG_ON)
diff --git a/mysys/lf_alloc-pin.c b/mysys/lf_alloc-pin.c
index ff9c5a42f8..3e91b70d0f 100644
--- a/mysys/lf_alloc-pin.c
+++ b/mysys/lf_alloc-pin.c
@@ -169,7 +169,7 @@ LF_PINS *_lf_pinbox_get_pins(LF_PINBOX *pinbox, void *stack_end)
     if (!(pins= top_ver % LF_PINBOX_MAX_PINS))
     {
       /* the stack of free elements is empty */
-      pins= my_atomic_add32(&pinbox->pins_in_array, 1)+1;
+      pins= my_atomic_add32((int32 volatile*) &pinbox->pins_in_array, 1)+1;
       if (unlikely(pins >= LF_PINBOX_MAX_PINS))
         return 0;
       /*
@@ -183,7 +183,8 @@ LF_PINS *_lf_pinbox_get_pins(LF_PINBOX *pinbox, void *stack_end)
     }
     el= (LF_PINS *)_lf_dynarray_value(&pinbox->pinarray, pins);
     next= el->link;
-  } while (!my_atomic_cas32(&pinbox->pinstack_top_ver, &top_ver,
+  } while (!my_atomic_cas32((int32 volatile*) &pinbox->pinstack_top_ver,
+                            (int32*) &top_ver,
                             top_ver-pins+next+LF_PINBOX_MAX_PINS));
   /*
     set el->link to the index of el in the dynarray (el->link has two usages:
@@ -237,7 +238,8 @@ void _lf_pinbox_put_pins(LF_PINS *pins)
   do
   {
     pins->link= top_ver % LF_PINBOX_MAX_PINS;
-  } while (!my_atomic_cas32(&pinbox->pinstack_top_ver, &top_ver,
+  } while (!my_atomic_cas32((int32 volatile*) &pinbox->pinstack_top_ver,
+                            (int32*) &top_ver,
                             top_ver-pins->link+nr+LF_PINBOX_MAX_PINS));
   return;
 }
diff --git a/mysys/my_bitmap.c b/mysys/my_bitmap.c
index e127b2584a..137127a2fd 100644
--- a/mysys/my_bitmap.c
+++ b/mysys/my_bitmap.c
@@ -508,10 +508,8 @@ uint bitmap_get_first_set(const MY_BITMAP *map)
             if (*byte_ptr & (1 << k))
               return (i*32) + (j*8) + k;
           }
-          DBUG_ASSERT(0);
         }
       }
-      DBUG_ASSERT(0);
     }
   }
   return MY_BIT_NONE;
@@ -542,10 +540,8 @@ uint bitmap_get_first(const MY_BITMAP *map)
             if (!(*byte_ptr & (1 << k)))
               return (i*32) + (j*8) + k;
           }
-          DBUG_ASSERT(0);
         }
       }
-      DBUG_ASSERT(0);
     }
   }
   return MY_BIT_NONE;
diff --git a/mysys/my_compress.c b/mysys/my_compress.c
index 70d2960f48..45c4ab983c 100644
--- a/mysys/my_compress.c
+++ b/mysys/my_compress.c
@@ -183,7 +183,7 @@ int packfrm(uchar *data, size_t len,
 
   DBUG_PRINT("info", ("org_len: %lu  comp_len: %lu", (ulong) org_len,
                       (ulong) comp_len));
-  DBUG_DUMP("compressed", (char*)data, org_len);
+  DBUG_DUMP("compressed", data, org_len);
 
   error= 2;
   blob_len= BLOB_HEADER + org_len;
diff --git a/sql-bench/myisam.cnf b/sql-bench/myisam.cnf
new file mode 100644
index 0000000000..4229f56cef
--- /dev/null
+++ b/sql-bench/myisam.cnf
@@ -0,0 +1,3 @@
+[mysqld]
+data=/data
+key_buffer_size=256M
diff --git a/storage/maria/lockman.c b/storage/maria/lockman.c
index 4c5f69ce7f..27f76aabf3 100644
--- a/storage/maria/lockman.c
+++ b/storage/maria/lockman.c
@@ -631,7 +631,7 @@ enum lockman_getlock_result lockman_getlock(LOCKMAN *lm, LOCK_OWNER *lo,
   /* a new value was added to the hash */
   csize= lm->size;
   if ((my_atomic_add32(&lm->count, 1)+1.0) / csize > MAX_LOAD)
-    my_atomic_cas32(&lm->size, &csize, csize*2);
+    my_atomic_cas32(&lm->size, (int*) &csize, csize*2);
   node->lonext= lo->all_locks;
   lo->all_locks= node;
   for ( ; res & NEED_TO_WAIT; res= lockpeek(el, node, pins, &blocker))
diff --git a/storage/maria/ma_open.c b/storage/maria/ma_open.c
index 7f1676c5d8..fac531aec4 100644
--- a/storage/maria/ma_open.c
+++ b/storage/maria/ma_open.c
@@ -460,6 +460,8 @@ MARIA_HA *maria_open(const char *name, int mode, uint open_flags)
 
     if (share->options & HA_OPTION_COMPRESS_RECORD)
       share->base.max_key_length+=2;	/* For safety */
+    /* Add space for node pointer */
+    share->base.max_key_length+= share->base.key_reflength;
 
     if (!my_multi_malloc(MY_WME,
 			 &share,sizeof(*share),
diff --git a/storage/maria/ma_recovery.c b/storage/maria/ma_recovery.c
index 6423cd342a..ac6262167b 100644
--- a/storage/maria/ma_recovery.c
+++ b/storage/maria/ma_recovery.c
@@ -3265,7 +3265,7 @@ static void print_redo_phase_progress(TRANSLOG_ADDRESS addr)
 {
   static uint end_logno= FILENO_IMPOSSIBLE, percentage_printed= 0;
   static ulong end_offset;
-  static ulonglong initial_remainder= -1;
+  static ulonglong initial_remainder= ~(ulonglong) 0;
 
   uint cur_logno;
   ulong cur_offset;
diff --git a/storage/maria/ma_rsame.c b/storage/maria/ma_rsame.c
index 9c9acac013..2e4d5a60ed 100644
--- a/storage/maria/ma_rsame.c
+++ b/storage/maria/ma_rsame.c
@@ -34,11 +34,13 @@ int maria_rsame(MARIA_HA *info, uchar *record, int inx)
 
   if (inx != -1 && ! maria_is_key_active(info->s->state.key_map, inx))
   {
+    DBUG_PRINT("error", ("wrong index usage"));
     DBUG_RETURN(my_errno=HA_ERR_WRONG_INDEX);
   }
   if (info->cur_row.lastpos == HA_OFFSET_ERROR ||
       info->update & HA_STATE_DELETED)
   {
+    DBUG_PRINT("error", ("no current record"));
     DBUG_RETURN(my_errno=HA_ERR_KEY_NOT_FOUND);	/* No current record */
   }
   info->update&= (HA_STATE_CHANGED | HA_STATE_ROW_CHANGED);
@@ -65,5 +67,6 @@ int maria_rsame(MARIA_HA *info, uchar *record, int inx)
     DBUG_RETURN(0);
   if (my_errno == HA_ERR_RECORD_DELETED)
     my_errno=HA_ERR_KEY_NOT_FOUND;
+  DBUG_PRINT("error", ("my_errno: %d", my_errno));
   DBUG_RETURN(my_errno);
 } /* maria_rsame */
diff --git a/storage/maria/ma_scan.c b/storage/maria/ma_scan.c
index 48e9e3400c..cbac463a2c 100644
--- a/storage/maria/ma_scan.c
+++ b/storage/maria/ma_scan.c
@@ -40,9 +40,10 @@ int maria_scan_init(register MARIA_HA *info)
     record		Read data here
 
   RETURN
-    0  			ok
-    HA_ERR_END_OF_FILE  End of file
-    #			Error code
+    0  			   ok
+    HA_ERR_END_OF_FILE     End of file
+    HA_ERR_RECORD_DELETED  Record was deleted (can only happen for static rec)
+    #			   Error code
 */
 
 int maria_scan(MARIA_HA *info, uchar *record)
diff --git a/storage/maria/ma_statrec.c b/storage/maria/ma_statrec.c
index c8ba1d5d23..3e744e1204 100644
--- a/storage/maria/ma_statrec.c
+++ b/storage/maria/ma_statrec.c
@@ -173,13 +173,14 @@ int _ma_read_static_record(register MARIA_HA *info, register uchar *record,
                            MARIA_RECORD_POS pos)
 {
   int error;
+  DBUG_ENTER("_ma_read_static_record");
 
   if (pos != HA_OFFSET_ERROR)
   {
     if (info->opt_flag & WRITE_CACHE_USED &&
 	info->rec_cache.pos_in_file <= pos &&
 	flush_io_cache(&info->rec_cache))
-      return(my_errno);
+      DBUG_RETURN(my_errno);
     info->rec_cache.seek_not_done=1;		/* We have done a seek */
 
     error= (int) info->s->file_read(info, record,info->s->base.reclength,
@@ -190,17 +191,27 @@ int _ma_read_static_record(register MARIA_HA *info, register uchar *record,
       if (!*record)
       {
         /* Record is deleted */
-	return ((my_errno=HA_ERR_RECORD_DELETED));
+        DBUG_PRINT("warning", ("Record is deleted"));
+	DBUG_RETURN((my_errno=HA_ERR_RECORD_DELETED));
       }
       info->update|= HA_STATE_AKTIV;		/* Record is read */
-      return(0);
+      DBUG_RETURN(0);
     }
   }
   fast_ma_writeinfo(info);			/* No such record */
-  return(my_errno);
+  DBUG_RETURN(my_errno);
 }
 
 
+/**
+   @brief  Read record from given position or next record
+
+   @note
+     When scanning, this function will return HA_ERR_RECORD_DELETED
+     for deleted rows even if skip_deleted_blocks is set.
+     The reason for this is to allow the caller to calculate the record
+     position without having to do call maria_position() for each record.
+*/
 
 int _ma_read_rnd_static_record(MARIA_HA *info, uchar *buf,
                                MARIA_RECORD_POS filepos,
@@ -219,7 +230,8 @@ int _ma_read_rnd_static_record(MARIA_HA *info, uchar *buf,
 	(skip_deleted_blocks || !filepos))
     {
       cache_read=1;				/* Read record using cache */
-      cache_length=(uint) (info->rec_cache.read_end - info->rec_cache.read_pos);
+      cache_length= (uint) (info->rec_cache.read_end -
+                            info->rec_cache.read_pos);
     }
     else
       info->rec_cache.seek_not_done=1;		/* Filepos is changed */
diff --git a/storage/maria/ma_test2.c b/storage/maria/ma_test2.c
index aed7f2b8a0..dfb85df0a2 100644
--- a/storage/maria/ma_test2.c
+++ b/storage/maria/ma_test2.c
@@ -660,6 +660,12 @@ int main(int argc, char *argv[])
       printf("Got error %d when scanning table\n", tmp);
       break;
     }
+    if (!tmp)
+    {
+      /* Remember position to last found row */
+      info.recpos= maria_position(file);
+      bmove(read_record2,read_record,reclength);
+    }
   }
   maria_scan_end(file);
   if (i != write_count && i != write_count - opt_delete)
@@ -668,7 +674,14 @@ int main(int argc, char *argv[])
     goto err;
   }
 
-  bmove(read_record2,read_record,reclength);
+  if (maria_rsame_with_pos(file,read_record,0,info.recpos))
+    goto err;
+  if (bcmp(read_record,read_record2,reclength) != 0)
+  {
+    printf("maria_rsame_with_pos didn't find same record\n");
+    goto err;
+  }
+
   for (i=min(2,keys) ; i-- > 0 ;)
   {
     if (maria_rsame(file,read_record2,(int) i)) goto err;
@@ -860,7 +873,7 @@ int main(int argc, char *argv[])
 	ulong blob_length,pos;
 	uchar *ptr;
 	memcpy_fixed(&ptr, read_record+blob_pos+4, sizeof(ptr));
-	longget(blob_length,read_record+blob_pos);
+        blob_length= uint4korr(read_record+blob_pos);
 	for (pos=0 ; pos < blob_length ; pos++)
 	{
 	  if (ptr[pos] != (uchar) (blob_length+pos))
diff --git a/storage/maria/unittest/ma_test_recovery.pl b/storage/maria/unittest/ma_test_recovery.pl
index 214e8d1d85..5aabbdc185 100755
--- a/storage/maria/unittest/ma_test_recovery.pl
+++ b/storage/maria/unittest/ma_test_recovery.pl
@@ -8,6 +8,7 @@ my $silent= "-s";
 my $tmp= "./tmp";
 my $maria_path;       # path to "storage/maria"
 my $maria_exe_path;   # path to executables (ma_test1, maria_chk etc)
+my $md5sum;
 
 $maria_path= dirname($0) . "/..";
 
@@ -29,8 +30,22 @@ if ( ! -f "$maria_exe_path/ma_test1$suffix" )
       }
     }
   }
-}    
+}
+
+# Test if we should use md5sum or digest -a md5
 
+if (defined(my_which("md5sum")))
+{
+  $md5sum="md5sum";
+}
+elsif (defined(my_which("digest")))
+{
+  $md5sum="digest -a md5";
+}
+else
+{
+  die "Can't find either md5sum or digest. Please install one of them"
+}
 
 # test data is always put in the current directory or a tmp subdirectory of it
 
@@ -307,11 +322,11 @@ sub apply_log
     print MY_LOG "bad argument '$shouldchangelog'\n";
     return 1;
   }
-  $log_md5= `md5sum maria_log.*`;
+  $log_md5= `$md5sum maria_log.*`;
 
   print MY_LOG "applying log\n";
   `$maria_exe_path/maria_read_log$suffix -a > $tmp/maria_read_log_$table.txt`;
-  $log_md5_2= `md5sum maria_log.*`;
+  $log_md5_2= `$md5sum maria_log.*`;
   if ("$log_md5" ne "$log_md5_2" )
   {
     if ("$shouldchangelog" eq "shouldnotchangelog")
@@ -326,3 +341,19 @@ sub apply_log
     return 1;
   }
 }
+
+
+sub my_which
+{
+  my ($command) = @_;
+  my (@paths, $path);
+
+  return $command if (-f $command && -x $command);
+  @paths = split(':', $ENV{'PATH'});
+  foreach $path (@paths)
+  {
+    $path .= "/$command";
+    return $path if (-f $path && -x $path);
+  }
+  return undef();
+}
diff --git a/storage/myisam/mi_test2.c b/storage/myisam/mi_test2.c
index 4a727a9dad..9844126e7d 100644
--- a/storage/myisam/mi_test2.c
+++ b/storage/myisam/mi_test2.c
@@ -775,7 +775,7 @@ int main(int argc, char *argv[])
 	ulong blob_length,pos;
 	uchar *ptr;
 	memcpy_fixed(&ptr, read_record+blob_pos+4, sizeof(ptr));
-	longget(blob_length,read_record+blob_pos);
+        blob_length= uint4korr(read_record+blob_pos);
 	for (pos=0 ; pos < blob_length ; pos++)
 	{
 	  if (ptr[pos] != (uchar) (blob_length+pos))
diff --git a/strings/ctype.c b/strings/ctype.c
index c313708f3f..59ebb50b12 100644
--- a/strings/ctype.c
+++ b/strings/ctype.c
@@ -328,7 +328,9 @@ my_string_repertoire(CHARSET_INFO *cs, const char *str, ulong length)
   {
     my_wc_t wc;
     int chlen;
-    for (; (chlen= cs->cset->mb_wc(cs, &wc, str, strend)) > 0; str+= chlen)
+    for (;
+         (chlen= cs->cset->mb_wc(cs, &wc, (uchar*) str, (uchar*) strend)) > 0;
+         str+= chlen)
     {
       if (wc > 0x7F)
         return MY_REPERTOIRE_UNICODE30;
-- 
2.30.9