From 0160e2d91ee8d52b1c627c51f6bcc62e2a5ccf69 Mon Sep 17 00:00:00 2001
From: Zardosht Kasheff <zardosht@tokutek.com>
Date: Wed, 17 Apr 2013 00:02:06 -0400
Subject: [PATCH] [t:3518], fix bug with getting hpk value

git-svn-id: file:///svn/mysql/tokudb-engine/tokudb-engine@34493 c7de825b-a66e-492c-adef-691d508d4ae1
---
 storage/tokudb/ha_tokudb.cc | 62 ++++++++++++++++++++-----------------
 storage/tokudb/ha_tokudb.h  |  1 -
 2 files changed, 34 insertions(+), 29 deletions(-)

diff --git a/storage/tokudb/ha_tokudb.cc b/storage/tokudb/ha_tokudb.cc
index 52fefc6782..b6ff36c59d 100644
--- a/storage/tokudb/ha_tokudb.cc
+++ b/storage/tokudb/ha_tokudb.cc
@@ -2878,29 +2878,6 @@ DBT *ha_tokudb::pack_key(
     DBUG_RETURN(key);
 }
 
-//
-// Reads the last element of dictionary of index keynr, and places
-// the data into table->record[1].
-//
-int ha_tokudb::read_last(uint keynr) {
-    TOKUDB_DBUG_ENTER("ha_tokudb::read_last");
-    int do_commit = 0;
-    if (transaction == NULL) {
-        int r = db_env->txn_begin(db_env, 0, &transaction, 0);
-        assert(r == 0);
-        do_commit = 1;
-    }
-    int error = index_init(keynr, 0);
-    if (error == 0)
-        error = index_last(table->record[1]);
-    index_end();
-    if (do_commit) {
-        commit_txn(transaction, 0);
-        transaction = NULL;
-    }
-    TOKUDB_DBUG_RETURN(error);
-}
-
 //
 // get max used hidden primary key value
 //
@@ -2908,13 +2885,42 @@ void ha_tokudb::init_hidden_prim_key_info() {
     TOKUDB_DBUG_ENTER("ha_tokudb::init_prim_key_info");
     pthread_mutex_lock(&share->mutex);
     if (!(share->status & STATUS_PRIMARY_KEY_INIT)) {
-        (void) extra(HA_EXTRA_KEYREAD);
-        int error = read_last(primary_key);
-        (void) extra(HA_EXTRA_NO_KEYREAD);
+        int error = 0;
+        THD* thd = ha_thd();
+        DB_TXN* txn = NULL;
+        DBC* c = NULL;
+        tokudb_trx_data *trx = NULL;
+        trx = (tokudb_trx_data *) thd_data_get(ha_thd(), tokudb_hton->slot);
+        bool do_commit = false;
+        if (thd_sql_command(thd) == SQLCOM_CREATE_TABLE && trx && trx->sub_sp_level) {
+            txn = trx->sub_sp_level;
+        }
+        else {
+            do_commit = true;
+            error = db_env->txn_begin(db_env, 0, &txn, 0);
+            assert(error == 0);
+        }
+        
+        error = share->key_file[primary_key]->cursor(
+            share->key_file[primary_key],
+            txn,
+            &c,
+            0
+            );
+        assert(error == 0);
+        DBT key,val;        
+        bzero(&key, sizeof(key));
+        bzero(&val, sizeof(val));
+        error = c->c_get(c, &key, &val, DB_LAST);
         if (error == 0) {
-            share->auto_ident = hpk_char_to_num(current_ident);
+            assert(key.size == TOKUDB_HIDDEN_PRIMARY_KEY_LENGTH);
+            share->auto_ident = hpk_char_to_num((uchar *)key.data);
+        }
+        error = c->c_close(c);
+        assert(error == 0);
+        if (do_commit) {
+            commit_txn(txn, 0);
         }
-
         share->status |= STATUS_PRIMARY_KEY_INIT;
     }
     pthread_mutex_unlock(&share->mutex);
diff --git a/storage/tokudb/ha_tokudb.h b/storage/tokudb/ha_tokudb.h
index d5e73248b5..4f30ef8d16 100644
--- a/storage/tokudb/ha_tokudb.h
+++ b/storage/tokudb/ha_tokudb.h
@@ -636,7 +636,6 @@ public:
 private:
     int read_full_row(uchar * buf);
     int __close(int mutex_is_locked);
-    int read_last(uint keynr);
     int get_next(uchar* buf, int direction);
     int read_data_from_range_query_buff(uchar* buf, bool need_val);
     void invalidate_bulk_fetch();
-- 
2.30.9