From dac579336f206daf5adb698e8b5b878f8cd917ff Mon Sep 17 00:00:00 2001
From: unknown <ram@mysql.r18.ru>
Date: Thu, 3 Oct 2002 14:55:02 +0500
Subject: [PATCH] Additional key segment (HA_KEYTYPE_END) creation has been
 moved from handler to hp_create.c

BitKeeper/etc/logging_ok:
  Logging to logging@openlogging.org accepted
---
 BitKeeper/etc/logging_ok |  1 +
 heap/hp_create.c         | 18 +++++++++++-------
 sql/ha_heap.cc           | 13 -------------
 3 files changed, 12 insertions(+), 20 deletions(-)

diff --git a/BitKeeper/etc/logging_ok b/BitKeeper/etc/logging_ok
index 31c8d0a3253..866b5cfd3c3 100644
--- a/BitKeeper/etc/logging_ok
+++ b/BitKeeper/etc/logging_ok
@@ -74,3 +74,4 @@ WAX@sergbook.mysql.com
 bar@bar.udmsearch.izhnet.ru
 nick@mysql.com
 bar@bar.mysql.r18.ru
+ram@mysql.r18.ru
diff --git a/heap/hp_create.c b/heap/hp_create.c
index 4163f5b0217..7eee6eaa64d 100644
--- a/heap/hp_create.c
+++ b/heap/hp_create.c
@@ -85,15 +85,24 @@ int heap_create(const char *name, uint keys, HP_KEYDEF *keydef,
     memcpy(share->keydef, keydef, (size_t) (sizeof(keydef[0]) * keys));
     for (i= 0, keyinfo= share->keydef; i < keys; i++, keyinfo++)
     {
-      uint nsegs= keydef[i].keysegs;
+      keyinfo->seg= keyseg;
+      memcpy(keyseg, keydef[i].seg,
+	     (size_t) (sizeof(keyseg[0]) * keydef[i].keysegs));
+      keyseg+= keydef[i].keysegs;
 
       if (keydef[i].algorithm == HA_KEY_ALG_BTREE)
       {
+	/* additional HA_KEYTYPE_END keyseg */
+	keyseg->type=     HA_KEYTYPE_END;
+	keyseg->length=   sizeof(byte*);
+	keyseg->flag=     0;
+	keyseg->null_bit= 0;
+	keyseg++;
+	
 	init_tree(&keyinfo->rb_tree, 0, 0, sizeof(byte*), 
 		  (qsort_cmp2)keys_compare, 1, NULL, NULL);
 	keyinfo->delete_key= hp_rb_delete_key;
 	keyinfo->write_key= hp_rb_write_key;
-	nsegs++;
       }
       else
       {
@@ -102,12 +111,7 @@ int heap_create(const char *name, uint keys, HP_KEYDEF *keydef,
 	keyinfo->delete_key= hp_delete_key;
 	keyinfo->write_key= hp_write_key;
       }
-      keyinfo->seg= keyseg;
-      memcpy(keyseg, keydef[i].seg,
-	     (size_t) (sizeof(keyseg[0]) * nsegs));
-      keyseg+= nsegs;
     }
-
     share->min_records= min_records;
     share->max_records= max_records;
     share->data_length= share->index_length= 0;
diff --git a/sql/ha_heap.cc b/sql/ha_heap.cc
index f56bfe74265..b41ab648f0b 100644
--- a/sql/ha_heap.cc
+++ b/sql/ha_heap.cc
@@ -243,11 +243,7 @@ int ha_heap::create(const char *name, TABLE *table, HA_CREATE_INFO *create_info)
   int error;
 
   for (key= parts= 0; key < table->keys; key++)
-  {
     parts+= table->key_info[key].key_parts;
-    if (table->key_info[key].algorithm == HA_KEY_ALG_BTREE)
-      parts++; /* additional HA_KEYTYPE_END keyseg */
-  }
 
   if (!(keydef= (HP_KEYDEF*) my_malloc(table->keys * sizeof(HP_KEYDEF) +
 				       parts * sizeof(HA_KEYSEG), MYF(MY_WME))))
@@ -299,15 +295,6 @@ int ha_heap::create(const char *name, TABLE *table, HA_CREATE_INFO *create_info)
 	seg->null_pos= 0;
       }
     }
-    if (pos->algorithm == HA_KEY_ALG_BTREE)
-    {
-      /* additional HA_KEYTYPE_END keyseg */
-      seg->type=     HA_KEYTYPE_END;
-      seg->length=   sizeof(byte*);
-      seg->flag=     0;
-      seg->null_bit= 0;
-      seg++;
-    }
   }
   mem_per_row+= MY_ALIGN(table->reclength + 1, sizeof(char*));
   max_rows= (ulong) (max_heap_table_size / mem_per_row);
-- 
2.30.9