List:Internals« Previous MessageNext Message »
From:jonas.oreland Date:July 20 2005 11:45am
Subject:bk commit into 5.1 tree (joreland:1.1855)
View as plain text  
Below is the list of changes that have just been committed into a local
5.1 repository of jonas. When jonas does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html

ChangeSet
  1.1855 05/07/20 13:44:55 joreland@stripped +27 -0
  Merge mysql.com:/home/jonas/src/mysql-5.0
  into  mysql.com:/home/jonas/src/mysql-5.1

  storage/ndb/tools/listTables.cpp
    1.22 05/07/20 13:44:49 joreland@stripped +0 -0
    Auto merged

  storage/ndb/tools/drop_index.cpp
    1.15 05/07/20 13:44:49 joreland@stripped +0 -0
    Auto merged

  storage/ndb/test/src/HugoOperations.cpp
    1.21 05/07/20 13:44:49 joreland@stripped +0 -0
    Auto merged

  storage/ndb/test/run-test/ndb-autotest.sh
    1.8 05/07/20 13:44:49 joreland@stripped +0 -0
    Auto merged

  storage/ndb/test/run-test/daily-basic-tests.txt
    1.33 05/07/20 13:44:49 joreland@stripped +0 -0
    Auto merged

  storage/ndb/test/ndbapi/testNdbApi.cpp
    1.18 05/07/20 13:44:49 joreland@stripped +0 -0
    Auto merged

  storage/ndb/test/ndbapi/testBlobs.cpp
    1.27 05/07/20 13:44:49 joreland@stripped +0 -0
    Auto merged

  storage/ndb/test/ndbapi/testBackup.cpp
    1.13 05/07/20 13:44:49 joreland@stripped +0 -0
    Auto merged

  storage/ndb/test/include/HugoOperations.hpp
    1.13 05/07/20 13:44:49 joreland@stripped +0 -0
    Auto merged

  storage/ndb/src/ndbapi/ndberror.c
    1.37 05/07/20 13:44:49 joreland@stripped +0 -0
    Auto merged

  storage/ndb/src/ndbapi/NdbDictionaryImpl.cpp
    1.87 05/07/20 13:44:49 joreland@stripped +0 -0
    Auto merged

  storage/ndb/src/kernel/blocks/ndbfs/Ndbfs.cpp
    1.18 05/07/20 13:44:49 joreland@stripped +0 -0
    Auto merged

  storage/ndb/src/kernel/blocks/ndbfs/MemoryChannel.hpp
    1.6 05/07/20 13:44:49 joreland@stripped +0 -0
    Auto merged

  storage/ndb/src/kernel/blocks/ndbfs/CircularIndex.hpp
    1.3 05/07/20 13:44:48 joreland@stripped +0 -0
    Auto merged

  storage/ndb/src/kernel/blocks/ndbfs/AsyncFile.hpp
    1.5 05/07/20 13:44:48 joreland@stripped +0 -0
    Auto merged

  storage/ndb/src/kernel/blocks/ndbfs/AsyncFile.cpp
    1.19 05/07/20 13:44:48 joreland@stripped +0 -0
    Auto merged

  storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp
    1.72 05/07/20 13:44:48 joreland@stripped +0 -0
    Auto merged

  storage/ndb/src/kernel/blocks/dbdih/DbdihMain.cpp
    1.31 05/07/20 13:44:48 joreland@stripped +0 -0
    Auto merged

  storage/ndb/src/kernel/blocks/dbdict/Dbdict.hpp
    1.14 05/07/20 13:44:48 joreland@stripped +0 -0
    Auto merged

  storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp
    1.47 05/07/20 13:44:48 joreland@stripped +0 -0
    Auto merged

  storage/ndb/src/kernel/blocks/dbacc/DbaccMain.cpp
    1.55 05/07/20 13:44:48 joreland@stripped +0 -0
    Auto merged

  storage/ndb/src/kernel/blocks/backup/Backup.cpp
    1.20 05/07/20 13:44:47 joreland@stripped +0 -0
    Auto merged

  storage/ndb/include/ndbapi/NdbDictionary.hpp
    1.52 05/07/20 13:44:47 joreland@stripped +0 -0
    Auto merged

  storage/ndb/include/kernel/signaldata/DropTable.hpp
    1.3 05/07/20 13:44:47 joreland@stripped +0 -0
    Auto merged

  storage/ndb/tools/listTables.cpp
    1.20.1.2 05/07/20 13:44:47 joreland@stripped +0 -0
    Merge rename: ndb/tools/listTables.cpp -> storage/ndb/tools/listTables.cpp

  storage/ndb/tools/drop_index.cpp
    1.13.1.2 05/07/20 13:44:47 joreland@stripped +0 -0
    Merge rename: ndb/tools/drop_index.cpp -> storage/ndb/tools/drop_index.cpp

  storage/ndb/test/src/HugoOperations.cpp
    1.18.1.2 05/07/20 13:44:47 joreland@stripped +0 -0
    Merge rename: ndb/test/src/HugoOperations.cpp -> storage/ndb/test/src/HugoOperations.cpp

  storage/ndb/test/run-test/ndb-autotest.sh
    1.2.5.2 05/07/20 13:44:47 joreland@stripped +0 -0
    Merge rename: ndb/test/run-test/ndb-autotest.sh -> storage/ndb/test/run-test/ndb-autotest.sh

  storage/ndb/test/run-test/daily-basic-tests.txt
    1.27.5.2 05/07/20 13:44:47 joreland@stripped +0 -0
    Merge rename: ndb/test/run-test/daily-basic-tests.txt -> storage/ndb/test/run-test/daily-basic-tests.txt

  storage/ndb/test/ndbapi/testNdbApi.cpp
    1.13.4.2 05/07/20 13:44:47 joreland@stripped +0 -0
    Merge rename: ndb/test/ndbapi/testNdbApi.cpp -> storage/ndb/test/ndbapi/testNdbApi.cpp

  storage/ndb/test/ndbapi/testBlobs.cpp
    1.20.7.3 05/07/20 13:44:47 joreland@stripped +0 -0
    Merge rename: ndb/test/ndbapi/testBlobs.cpp -> storage/ndb/test/ndbapi/testBlobs.cpp

  storage/ndb/src/kernel/blocks/dbdih/DbdihMain.cpp
    1.24.5.5 05/07/20 13:44:47 joreland@stripped +0 -0
    Merge rename: ndb/src/kernel/blocks/dbdih/DbdihMain.cpp -> storage/ndb/src/kernel/blocks/dbdih/DbdihMain.cpp

  storage/ndb/src/kernel/blocks/dbdict/Dbdict.hpp
    1.9.3.2 05/07/20 13:44:47 joreland@stripped +0 -0
    Merge rename: ndb/src/kernel/blocks/dbdict/Dbdict.hpp -> storage/ndb/src/kernel/blocks/dbdict/Dbdict.hpp

  storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp
    1.40.6.2 05/07/20 13:44:47 joreland@stripped +0 -0
    Merge rename: ndb/src/kernel/blocks/dbdict/Dbdict.cpp -> storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp

  storage/ndb/src/kernel/blocks/dbacc/DbaccMain.cpp
    1.49.3.2 05/07/20 13:44:47 joreland@stripped +0 -0
    Merge rename: ndb/src/kernel/blocks/dbacc/DbaccMain.cpp -> storage/ndb/src/kernel/blocks/dbacc/DbaccMain.cpp

  storage/ndb/src/kernel/blocks/backup/Backup.cpp
    1.15.4.2 05/07/20 13:44:47 joreland@stripped +0 -0
    Merge rename: ndb/src/kernel/blocks/backup/Backup.cpp -> storage/ndb/src/kernel/blocks/backup/Backup.cpp

  storage/ndb/include/ndbapi/NdbDictionary.hpp
    1.48.2.2 05/07/20 13:44:47 joreland@stripped +0 -0
    Merge rename: ndb/include/ndbapi/NdbDictionary.hpp -> storage/ndb/include/ndbapi/NdbDictionary.hpp

  storage/ndb/include/kernel/signaldata/DropTable.hpp
    1.1.1.3 05/07/20 13:44:47 joreland@stripped +0 -0
    Merge rename: ndb/include/kernel/signaldata/DropTable.hpp -> storage/ndb/include/kernel/signaldata/DropTable.hpp

  storage/ndb/include/kernel/signaldata/DictTabInfo.hpp
    1.20 05/07/20 13:44:47 joreland@stripped +0 -0
    Auto merged

  storage/ndb/include/kernel/signaldata/AlterTable.hpp
    1.3 05/07/20 13:44:47 joreland@stripped +0 -0
    Auto merged

  sql/ha_ndbcluster.cc
    1.197 05/07/20 13:44:47 joreland@stripped +0 -0
    Auto merged

  storage/ndb/test/ndbapi/testBackup.cpp
    1.10.2.2 05/07/20 13:44:46 joreland@stripped +0 -0
    Merge rename: ndb/test/ndbapi/testBackup.cpp -> storage/ndb/test/ndbapi/testBackup.cpp

  storage/ndb/test/include/HugoOperations.hpp
    1.11.1.2 05/07/20 13:44:46 joreland@stripped +0 -0
    Merge rename: ndb/test/include/HugoOperations.hpp -> storage/ndb/test/include/HugoOperations.hpp

  storage/ndb/src/ndbapi/ndberror.c
    1.30.9.2 05/07/20 13:44:46 joreland@stripped +0 -0
    Merge rename: ndb/src/ndbapi/ndberror.c -> storage/ndb/src/ndbapi/ndberror.c

  storage/ndb/src/ndbapi/NdbDictionaryImpl.cpp
    1.74.11.2 05/07/20 13:44:46 joreland@stripped +0 -0
    Merge rename: ndb/src/ndbapi/NdbDictionaryImpl.cpp -> storage/ndb/src/ndbapi/NdbDictionaryImpl.cpp

  storage/ndb/src/kernel/blocks/ndbfs/Ndbfs.cpp
    1.14.3.2 05/07/20 13:44:46 joreland@stripped +0 -0
    Merge rename: ndb/src/kernel/blocks/ndbfs/Ndbfs.cpp -> storage/ndb/src/kernel/blocks/ndbfs/Ndbfs.cpp

  storage/ndb/src/kernel/blocks/ndbfs/MemoryChannel.hpp
    1.4.1.3 05/07/20 13:44:46 joreland@stripped +0 -0
    Merge rename: ndb/src/kernel/blocks/ndbfs/MemoryChannel.hpp -> storage/ndb/src/kernel/blocks/ndbfs/MemoryChannel.hpp

  storage/ndb/src/kernel/blocks/ndbfs/CircularIndex.hpp
    1.1.1.2 05/07/20 13:44:46 joreland@stripped +0 -0
    Merge rename: ndb/src/kernel/blocks/ndbfs/CircularIndex.hpp -> storage/ndb/src/kernel/blocks/ndbfs/CircularIndex.hpp

  storage/ndb/src/kernel/blocks/ndbfs/AsyncFile.hpp
    1.3.1.2 05/07/20 13:44:46 joreland@stripped +0 -0
    Merge rename: ndb/src/kernel/blocks/ndbfs/AsyncFile.hpp -> storage/ndb/src/kernel/blocks/ndbfs/AsyncFile.hpp

  storage/ndb/src/kernel/blocks/ndbfs/AsyncFile.cpp
    1.14.5.3 05/07/20 13:44:46 joreland@stripped +0 -0
    Merge rename: ndb/src/kernel/blocks/ndbfs/AsyncFile.cpp -> storage/ndb/src/kernel/blocks/ndbfs/AsyncFile.cpp

  storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp
    1.66.3.3 05/07/20 13:44:46 joreland@stripped +0 -0
    Merge rename: ndb/src/kernel/blocks/dblqh/DblqhMain.cpp -> storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp

  storage/ndb/include/kernel/signaldata/DictTabInfo.hpp
    1.17.1.2 05/07/20 13:44:46 joreland@stripped +0 -0
    Merge rename: ndb/include/kernel/signaldata/DictTabInfo.hpp -> storage/ndb/include/kernel/signaldata/DictTabInfo.hpp

  storage/ndb/include/kernel/signaldata/AlterTable.hpp
    1.1.1.3 05/07/20 13:44:46 joreland@stripped +0 -0
    Merge rename: ndb/include/kernel/signaldata/AlterTable.hpp -> storage/ndb/include/kernel/signaldata/AlterTable.hpp

# This is a BitKeeper patch.  What follows are the unified diffs for the
# set of deltas contained in the patch.  The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User:	joreland
# Host:	eel.(none)
# Root:	/home/jonas/src/mysql-5.1/RESYNC

--- 1.17.1.1/ndb/include/kernel/signaldata/DictTabInfo.hpp	2005-07-20 13:22:36 +02:00
+++ 1.20/storage/ndb/include/kernel/signaldata/DictTabInfo.hpp	2005-07-20 13:44:47 +02:00
@@ -151,7 +151,12 @@
     AllNodesSmallTable = 0,
     AllNodesMediumTable = 1,
     AllNodesLargeTable = 2,
-    SingleFragment = 3
+    SingleFragment = 3,
+    DistrKeyHash = 4,
+    DistrKeyLin = 5,
+    UserDefined = 6,
+    DistrKeyUniqueHashIndex = 7,
+    DistrKeyOrderedIndex = 8
   };
   
   // TableType constants + objects

--- 1.48.2.1/ndb/include/ndbapi/NdbDictionary.hpp	2005-07-20 13:22:36 +02:00
+++ 1.52/storage/ndb/include/ndbapi/NdbDictionary.hpp	2005-07-20 13:44:47 +02:00
@@ -146,7 +146,10 @@
       FragSingle = 1,         ///< Only one fragment
       FragAllSmall = 2,       ///< One fragment per node, default
       FragAllMedium = 3,      ///< two fragments per node
-      FragAllLarge = 4        ///< Four fragments per node.
+      FragAllLarge = 4,       ///< Four fragments per node.
+      DistrKeyHash = 5,
+      DistrKeyLin = 6,
+      UserDefined = 7
     };
   };
 
@@ -615,6 +618,12 @@
     const void* getFrmData() const;
     Uint32 getFrmLength() const;
 
+    /**
+     * Get Node Group and Tablespace id's for fragments in table
+     */
+    const void *getNodeGroupIds() const;
+    Uint32 getNodeGroupIdsLength() const;
+
     /** @} *******************************************************************/
 
     /** 
@@ -712,6 +721,11 @@
      * Set frm file to store with this table
      */ 
     void setFrm(const void* data, Uint32 len);
+
+    /**
+     * Set node group for fragments
+     */
+    void setNodeGroupIds(const void *data, Uint32 len);
 
     /**
      * Set table object type

--- 1.49.3.1/ndb/src/kernel/blocks/dbacc/DbaccMain.cpp	2005-07-20 13:22:37 +02:00
+++ 1.55/storage/ndb/src/kernel/blocks/dbacc/DbaccMain.cpp	2005-07-20 13:44:48 +02:00
@@ -11805,7 +11805,7 @@
 }//execSET_VAR_REQ()
 
 void
-Dbacc::execREAD_PSUEDO_REQ(Signal* signal){
+Dbacc::execREAD_PSEUDO_REQ(Signal* signal){
   jamEntry();
   fragrecptr.i = signal->theData[0];
   Uint32 attrId = signal->theData[1];

--- 1.40.6.1/ndb/src/kernel/blocks/dbdict/Dbdict.cpp	2005-07-20 13:22:37 +02:00
+++ 1.47/storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp	2005-07-20 13:44:48 +02:00
@@ -271,7 +271,6 @@
     req->senderData = RNIL;
     req->fragmentationType = tablePtr.p->fragmentType;
     req->noOfFragments = 0;
-    req->fragmentNode = 0;
     req->primaryTableId = tablePtr.i;
     EXECUTE_DIRECT(DBDIH, GSN_CREATE_FRAGMENTATION_REQ, signal,
 		   CreateFragmentationReq::SignalLength);
@@ -1493,8 +1492,11 @@
   tablePtr.p->gciTableCreated = 0;
   tablePtr.p->noOfAttributes = ZNIL;
   tablePtr.p->noOfNullAttr = 0;
+  tablePtr.p->ngLen = 0;
+  memset(tablePtr.p->ngData, 0, sizeof(tablePtr.p->ngData));
   tablePtr.p->frmLen = 0;
   memset(tablePtr.p->frmData, 0, sizeof(tablePtr.p->frmData));
+  tablePtr.p->fragmentCount = 0;
   /*
     tablePtr.p->lh3PageIndexBits = 0;
     tablePtr.p->lh3DistrBits = 0;
@@ -2920,25 +2922,52 @@
     createTabPtr.p->m_fragmentsPtrI = RNIL;
     createTabPtr.p->m_dihAddFragPtr = RNIL;
 
-    Uint32 * theData = signal->getDataPtrSend();
+    Uint32 *theData = signal->getDataPtrSend(), i;
+    Uint16 *node_group= (Uint16*)&signal->theData[25];
     CreateFragmentationReq * const req = (CreateFragmentationReq*)theData;
     req->senderRef = reference();
     req->senderData = createTabPtr.p->key;
+    req->primaryTableId = parseRecord.tablePtr.p->primaryTableId;
+    req->noOfFragments = parseRecord.tablePtr.p->ngLen >> 1;
     req->fragmentationType = parseRecord.tablePtr.p->fragmentType;
-    req->noOfFragments = 0;
-    req->fragmentNode = 0;
-    req->primaryTableId = RNIL;
+    for (i = 0; i < req->noOfFragments; i++)
+      node_group[i] = parseRecord.tablePtr.p->ngData[i];
     if (parseRecord.tablePtr.p->isOrderedIndex()) {
+      jam();
       // ordered index has same fragmentation as the table
-      const Uint32 primaryTableId = parseRecord.tablePtr.p->primaryTableId;
-      TableRecordPtr primaryTablePtr;
-      c_tableRecordPool.getPtr(primaryTablePtr, primaryTableId);
-      // fragmentationType must be consistent
-      req->fragmentationType = primaryTablePtr.p->fragmentType;
-      req->primaryTableId = primaryTableId;
+      req->primaryTableId = parseRecord.tablePtr.p->primaryTableId;
+      req->fragmentationType = DictTabInfo::DistrKeyOrderedIndex;
+    }
+    else if (parseRecord.tablePtr.p->isHashIndex())
+    {
+      jam();
+      /*
+        Unique hash indexes has same amount of fragments as primary table
+        and distributed in the same manner but has always a normal hash
+        fragmentation.
+      */
+      req->primaryTableId = parseRecord.tablePtr.p->primaryTableId;
+      req->fragmentationType = DictTabInfo::DistrKeyUniqueHashIndex;
+    }
+    else
+    {
+      jam();
+      /*
+        Blob tables come here with primaryTableId != RNIL but we only need
+        it for creating the fragments so we set it to RNIL now that we got
+        what we wanted from it to avoid other side effects.
+      */
+      parseRecord.tablePtr.p->primaryTableId = RNIL;
+    }
+    EXECUTE_DIRECT(DBDIH, GSN_CREATE_FRAGMENTATION_REQ, signal,
+		   CreateFragmentationReq::SignalLength);
+    jamEntry();
+    if (signal->theData[0] != 0)
+    {
+      jam();
+      parseRecord.errorCode= signal->theData[0];
+      break;
     }
-    sendSignal(DBDIH_REF, GSN_CREATE_FRAGMENTATION_REQ, signal,
-	       CreateFragmentationReq::SignalLength, JBB);
     
     c_blockState = BS_CREATE_TAB;
     return;
@@ -4952,6 +4981,10 @@
   tablePtr.p->frmLen = tableDesc.FrmLen;
   memcpy(tablePtr.p->frmData, tableDesc.FrmData, tableDesc.FrmLen);  
 
+  tablePtr.p->ngLen = tableDesc.FragmentDataLen;
+  memcpy(tablePtr.p->ngData, tableDesc.FragmentData,
+         tableDesc.FragmentDataLen);
+
   if(tableDesc.PrimaryTableId != RNIL) {
     
     tablePtr.p->primaryTableId = tableDesc.PrimaryTableId;
@@ -6625,7 +6658,7 @@
   initialiseTableRecord(indexPtr);
   if (req->getIndexType() == DictTabInfo::UniqueHashIndex) {
     indexPtr.p->storedTable = opPtr.p->m_storedIndex;
-    indexPtr.p->fragmentType = tablePtr.p->fragmentType;
+    indexPtr.p->fragmentType = DictTabInfo::DistrKeyUniqueHashIndex;
   } else if (req->getIndexType() == DictTabInfo::OrderedIndex) {
     // first version will not supported logging
     if (opPtr.p->m_storedIndex) {
@@ -6635,8 +6668,7 @@
       return;
     }
     indexPtr.p->storedTable = false;
-    // follows table fragmentation
-    indexPtr.p->fragmentType = tablePtr.p->fragmentType;
+    indexPtr.p->fragmentType = DictTabInfo::DistrKeyOrderedIndex;
   } else {
     jam();
     opPtr.p->m_errorCode = CreateIndxRef::InvalidIndexType;
@@ -6760,7 +6792,7 @@
     w.add(DictTabInfo::AttributeKeyFlag, (Uint32)false);
     w.add(DictTabInfo::AttributeNullableFlag, (Uint32)false);
     w.add(DictTabInfo::AttributeExtType, (Uint32)DictTabInfo::ExtUnsigned);
-    w.add(DictTabInfo::AttributeExtLength, tablePtr.p->tupKeyLength);
+    w.add(DictTabInfo::AttributeExtLength, tablePtr.p->tupKeyLength+1);
     w.add(DictTabInfo::AttributeEnd, (Uint32)true);
   }
   if (indexPtr.p->isOrderedIndex()) {
@@ -11955,11 +11987,19 @@
  * MODULE: Support routines for index and trigger.
  */
 
+/*
+  This routine is used to set-up the primary key attributes of the unique
+  hash index. Since we store fragment id as part of the primary key here
+  we insert the pseudo column for getting fragment id first in the array.
+  This routine is used as part of the building of the index.
+*/
+
 void
 Dbdict::getTableKeyList(TableRecordPtr tablePtr, AttributeList& list)
 {
   jam();
   list.sz = 0;
+  list.id[list.sz++] = AttributeHeader::FRAGMENT;
   for (Uint32 tAttr = tablePtr.p->firstAttribute; tAttr != RNIL; ) {
     AttributeRecord* aRec = c_attributeRecordPool.getPtr(tAttr);
     if (aRec->tupleKey)

--- 1.9.3.1/ndb/src/kernel/blocks/dbdict/Dbdict.hpp	2005-07-20 13:22:37 +02:00
+++ 1.14/storage/ndb/src/kernel/blocks/dbdict/Dbdict.hpp	2005-07-20 13:44:48 +02:00
@@ -231,6 +231,10 @@
     /** TODO Could preferrably be made dynamic size */
     Uint32 frmLen;
     char frmData[MAX_FRM_DATA_SIZE];
+    /**  Node Group and Tablespace id for this table */
+    /** TODO Could preferrably be made dynamic size */
+    Uint32 ngLen;
+    Uint16 ngData[MAX_NDB_PARTITIONS];
 
     Uint32 fragmentCount;
   };

--- 1.24.5.4/ndb/src/kernel/blocks/dbdih/DbdihMain.cpp	2005-07-12 16:34:05 +02:00
+++ 1.31/storage/ndb/src/kernel/blocks/dbdih/DbdihMain.cpp	2005-07-20 13:44:48 +02:00
@@ -5491,11 +5491,9 @@
 #endif
   }
 
-  bool ok = false;
   MasterLCPConf::State lcpState;
   switch (c_lcpState.lcpStatus) {
   case LCP_STATUS_IDLE:
-    ok = true;
     jam();
     /*------------------------------------------------*/
     /*       LOCAL CHECKPOINT IS CURRENTLY NOT ACTIVE */
@@ -5506,7 +5504,6 @@
     lcpState = MasterLCPConf::LCP_STATUS_IDLE;
     break;
   case LCP_STATUS_ACTIVE:
-    ok = true;
     jam();
     /*--------------------------------------------------*/
     /*       COPY OF RESTART INFORMATION HAS BEEN       */
@@ -5515,7 +5512,6 @@
     lcpState = MasterLCPConf::LCP_STATUS_ACTIVE;
     break;
   case LCP_TAB_COMPLETED:
-    ok = true;
     jam();
     /*--------------------------------------------------------*/
     /*       ALL LCP_REPORT'S HAVE BEEN COMPLETED FOR         */
@@ -5525,7 +5521,6 @@
     lcpState = MasterLCPConf::LCP_TAB_COMPLETED;
     break;
   case LCP_TAB_SAVED:
-    ok = true;
     jam();
     /*--------------------------------------------------------*/
     /*       ALL LCP_REPORT'S HAVE BEEN COMPLETED FOR         */
@@ -5549,15 +5544,15 @@
     break;
   case LCP_COPY_GCI:
   case LCP_INIT_TABLES:
-    ok = true;
     /**
      * These two states are handled by if statements above
      */
     ndbrequire(false);
     lcpState= MasterLCPConf::LCP_STATUS_IDLE; // remove warning
     break;
+  default:
+    ndbrequire(false);
   }//switch
-  ndbrequire(ok);
 
   Uint32 failedNodeId = c_lcpState.m_MASTER_LCPREQ_FailedNodeId;
   MasterLCPConf * const conf = (MasterLCPConf *)&signal->theData[0];
@@ -6158,96 +6153,136 @@
   3.7.1   A D D   T A B L E   M A I N L Y
   ***************************************
   */
-void Dbdih::execCREATE_FRAGMENTATION_REQ(Signal * signal){
+
+#define UNDEF_NODEGROUP 65535
+static inline void inc_node_or_group(Uint32 &node, Uint32 max_node)
+{
+  Uint32 next = node + 1;
+  node = (next == max_node ? 0 : next);
+}
+
+/*
+  Spread fragments in backwards compatible mode
+*/
+static void set_default_node_groups(Signal *signal, Uint32 noFrags)
+{
+  Uint16 *node_group_array = (Uint16*)&signal->theData[25];
+  Uint32 i;
+  node_group_array[0] = 0;
+  for (i = 1; i < noFrags; i++)
+    node_group_array[i] = UNDEF_NODEGROUP;
+}
+void Dbdih::execCREATE_FRAGMENTATION_REQ(Signal * signal)
+{
+  Uint16 node_group_id[MAX_NDB_PARTITIONS];
   jamEntry();
   CreateFragmentationReq * const req = 
     (CreateFragmentationReq*)signal->getDataPtr();
   
   const Uint32 senderRef = req->senderRef;
   const Uint32 senderData = req->senderData;
-  const Uint32 fragmentNode = req->fragmentNode;
-  const Uint32 fragmentType = req->fragmentationType;
-  //const Uint32 fragmentCount = req->noOfFragments;
+  Uint32 noOfFragments = req->noOfFragments;
+  const Uint32 fragType = req->fragmentationType;
   const Uint32 primaryTableId = req->primaryTableId;
 
   Uint32 err = 0;
   
   do {
-    Uint32 noOfFragments = 0;
-    Uint32 noOfReplicas = cnoReplicas;
-    switch(fragmentType){
-    case DictTabInfo::AllNodesSmallTable:
-      jam();
-      noOfFragments = csystemnodes;
-      break;
-    case DictTabInfo::AllNodesMediumTable:
-      jam();
-      noOfFragments = 2 * csystemnodes;
-      break;
-    case DictTabInfo::AllNodesLargeTable:
-      jam();
-      noOfFragments = 4 * csystemnodes;
-      break;
-    case DictTabInfo::SingleFragment:
-      jam();
-      noOfFragments = 1;
-      break;
-#if 0
-    case DictTabInfo::SpecifiedFragmentCount:
-      noOfFragments = (fragmentCount == 0 ? 1 : (fragmentCount + 1)/ 2);
-      break;
-#endif
-    default:
-      jam();
-      err = CreateFragmentationRef::InvalidFragmentationType;
-      break;
-    }
-    if(err)
-      break;
-   
     NodeGroupRecordPtr NGPtr;
     TabRecordPtr primTabPtr;
+    Uint32 count = 2;
+    Uint16 noOfReplicas = cnoReplicas;
+    Uint16 *fragments = (Uint16*)(signal->theData+25);
     if (primaryTableId == RNIL) {
-      if(fragmentNode == 0){
-        jam();
-        NGPtr.i = 0; 
-	if(noOfFragments < csystemnodes)
-	{
-	  NGPtr.i = c_nextNodeGroup; 
-	  c_nextNodeGroup = (NGPtr.i + 1 == cnoOfNodeGroups ? 0 : NGPtr.i + 1);
-	}
-      } else if(! (fragmentNode < MAX_NDB_NODES)) {
-        jam();
-        err = CreateFragmentationRef::InvalidNodeId;
-      } else {
-        jam();
-        const Uint32 stat = Sysfile::getNodeStatus(fragmentNode,
-                                                   SYSFILE->nodeStatus);
-        switch (stat) {
-        case Sysfile::NS_Active:
-        case Sysfile::NS_ActiveMissed_1:
-        case Sysfile::NS_ActiveMissed_2:
-        case Sysfile::NS_TakeOver:
+      jam();
+      switch ((DictTabInfo::FragmentType)fragType)
+      {
+        /*
+          Backward compatability and for all places in code not changed.
+        */
+        case DictTabInfo::AllNodesSmallTable:
           jam();
+          noOfFragments = csystemnodes;
+          set_default_node_groups(signal, noOfFragments);
           break;
-        case Sysfile::NS_NotActive_NotTakenOver:
+        case DictTabInfo::AllNodesMediumTable:
           jam();
+          noOfFragments = 2 * csystemnodes;
+          set_default_node_groups(signal, noOfFragments);
           break;
-        case Sysfile::NS_HotSpare:
+        case DictTabInfo::AllNodesLargeTable:
           jam();
-        case Sysfile::NS_NotDefined:
+          noOfFragments = 4 * csystemnodes;
+          set_default_node_groups(signal, noOfFragments);
+          break;
+        case DictTabInfo::SingleFragment:
           jam();
+          noOfFragments = 1;
+          set_default_node_groups(signal, noOfFragments);
+          break;
         default:
           jam();
-          err = CreateFragmentationRef::InvalidNodeType;
+          if (noOfFragments == 0)
+          {
+            jam();
+            err = CreateFragmentationRef::InvalidFragmentationType;
+          }
           break;
+      }
+      if (err)
+        break;
+      /*
+        When we come here the the exact partition is specified
+        and there is an array of node groups sent along as well.
+      */
+      memcpy(&node_group_id[0], &signal->theData[25], 2 * noOfFragments);
+      Uint16 next_replica_node[MAX_NDB_NODES];
+      memset(next_replica_node,0,sizeof(next_replica_node));
+      Uint32 default_node_group= c_nextNodeGroup;
+      for(Uint32 fragNo = 0; fragNo < noOfFragments; fragNo++)
+      {
+        jam();
+        NGPtr.i = node_group_id[fragNo];
+        if (NGPtr.i == UNDEF_NODEGROUP)
+        {
+          jam();
+	  NGPtr.i = default_node_group; 
         }
-        if(err)
+        if (NGPtr.i > cnoOfNodeGroups)
+        {
+          jam();
+          err = CreateFragmentationRef::InvalidNodeGroup;
           break;
-        NGPtr.i = Sysfile::getNodeGroup(fragmentNode,
-                                        SYSFILE->nodeGroups);
+        }
+        ptrCheckGuard(NGPtr, MAX_NDB_NODES, nodeGroupRecord);
+        const Uint32 max = NGPtr.p->nodeCount;
+	
+	Uint32 tmp= next_replica_node[NGPtr.i];
+        for(Uint32 replicaNo = 0; replicaNo < noOfReplicas; replicaNo++)
+        {
+          jam();
+          const Uint16 nodeId = NGPtr.p->nodesInGroup[tmp];
+          fragments[count++]= nodeId;
+          inc_node_or_group(tmp, max);
+        }
+        inc_node_or_group(tmp, max);
+	next_replica_node[NGPtr.i]= tmp;
+	
+        /**
+         * Next node group for next fragment
+         */
+        inc_node_or_group(default_node_group, cnoOfNodeGroups);
+      }
+      if (err)
+      {
+        jam();
         break;
       }
+      else
+      {
+        jam();
+        c_nextNodeGroup = default_node_group;
+      }
     } else {
       if (primaryTableId >= ctabFileSize) {
         jam();
@@ -6261,49 +6296,14 @@
         err = CreateFragmentationRef::InvalidPrimaryTable;
         break;
       }
-      if (noOfFragments != primTabPtr.p->totalfragments) {
-        jam();
-        err = CreateFragmentationRef::InvalidFragmentationType;
-        break;
-      }
-    }
-    
-    Uint32 count = 2;
-    Uint16 *fragments = (Uint16*)(signal->theData+25);
-    if (primaryTableId == RNIL) {
-      jam();
-      Uint8 next_replica_node[MAX_NDB_NODES];
-      memset(next_replica_node,0,sizeof(next_replica_node));
-      for(Uint32 fragNo = 0; fragNo<noOfFragments; fragNo++){
-        jam();
-        ptrCheckGuard(NGPtr, MAX_NDB_NODES, nodeGroupRecord);      
-        const Uint32 max = NGPtr.p->nodeCount;
-	
-	Uint32 tmp= next_replica_node[NGPtr.i];
-        for(Uint32 replicaNo = 0; replicaNo<noOfReplicas; replicaNo++)
-        {
-          jam();
-          const Uint32 nodeId = NGPtr.p->nodesInGroup[tmp++];
-          fragments[count++] = nodeId;
-          tmp = (tmp >= max ? 0 : tmp);
-        }
-	tmp++;
-	next_replica_node[NGPtr.i]= (tmp >= max ? 0 : tmp);
-	
-        /**
-         * Next node group for next fragment
-         */
-        NGPtr.i++;
-        NGPtr.i = (NGPtr.i == cnoOfNodeGroups ? 0 : NGPtr.i);
-      }
-    } else {
+      noOfFragments= primTabPtr.p->totalfragments;
       for (Uint32 fragNo = 0;
-           fragNo < primTabPtr.p->totalfragments; fragNo++) {
+           fragNo < noOfFragments; fragNo++) {
         jam();
         FragmentstorePtr fragPtr;
         ReplicaRecordPtr replicaPtr;
         getFragstore(primTabPtr.p, fragNo, fragPtr);
-        fragments[count++] = fragPtr.p->preferredPrimary;
+        fragments[count++]= fragPtr.p->preferredPrimary;
         for (replicaPtr.i = fragPtr.p->storedReplicas;
              replicaPtr.i != RNIL;
              replicaPtr.i = replicaPtr.p->nextReplica) {
@@ -6311,9 +6311,9 @@
           ptrCheckGuard(replicaPtr, creplicaFileSize, replicaRecord);
           if (replicaPtr.p->procNode != fragPtr.p->preferredPrimary) {
             jam();
-            fragments[count++] = replicaPtr.p->procNode;
-          }//if
-        }//for
+            fragments[count++]= replicaPtr.p->procNode;
+          }
+        }
         for (replicaPtr.i = fragPtr.p->oldStoredReplicas;
              replicaPtr.i != RNIL;
              replicaPtr.i = replicaPtr.p->nextReplica) {
@@ -6321,25 +6321,26 @@
           ptrCheckGuard(replicaPtr, creplicaFileSize, replicaRecord);
           if (replicaPtr.p->procNode != fragPtr.p->preferredPrimary) {
             jam();
-            fragments[count++] = replicaPtr.p->procNode;
-          }//if
-        }//for
+            fragments[count++]= replicaPtr.p->procNode;
+          }
+        }
       }
     }
-    ndbrequire(count == (2 + noOfReplicas * noOfFragments)); 
+    ndbrequire(count == (2U + noOfReplicas * noOfFragments)); 
     
     CreateFragmentationConf * const conf = 
       (CreateFragmentationConf*)signal->getDataPtrSend();
     conf->senderRef = reference();
     conf->senderData = senderData;
-    conf->noOfReplicas = noOfReplicas;
-    conf->noOfFragments = noOfFragments;
+    conf->noOfReplicas = (Uint32)noOfReplicas;
+    conf->noOfFragments = (Uint32)noOfFragments;
 
-    fragments[0] = noOfReplicas;
-    fragments[1] = noOfFragments;
+    fragments[0]= noOfReplicas;
+    fragments[1]= noOfFragments;
     
     if(senderRef != 0)
     {
+      jam();
       LinearSectionPtr ptr[3];
       ptr[0].p = (Uint32*)&fragments[0];
       ptr[0].sz = (count + 1) / 2;
@@ -6351,33 +6352,17 @@
 		 ptr,
 		 1);
     }
-    else
-    {
-      // Execute direct
-      signal->theData[0] = 0;
-    }
+    // Always ACK/NACK (here ACK)
+    signal->theData[0] = 0;
     return;
   } while(false);
-
-  if(senderRef != 0)
-  {
-    CreateFragmentationRef * const ref = 
-      (CreateFragmentationRef*)signal->getDataPtrSend();
-    ref->senderRef = reference();
-    ref->senderData = senderData;
-    ref->errorCode = err;
-    sendSignal(senderRef, GSN_CREATE_FRAGMENTATION_REF, signal, 
-	       CreateFragmentationRef::SignalLength, JBB);
-  }
-  else
-  {
-    // Execute direct
-    signal->theData[0] = err;
-  }
+  // Always ACK/NACK (here NACK)
+  signal->theData[0] = err;
 }
 
 void Dbdih::execDIADDTABREQ(Signal* signal) 
 {
+  Uint32 fragType;
   jamEntry();
 
   DiAddTabReq * const req = (DiAddTabReq*)signal->getDataPtr();
@@ -6402,6 +6387,7 @@
   ptrCheckGuard(tabPtr, ctabFileSize, tabRecord);
   tabPtr.p->connectrec = connectPtr.i;
   tabPtr.p->tableType = req->tableType;
+  fragType= req->fragType;
   tabPtr.p->schemaVersion = req->schemaVersion;
   tabPtr.p->primaryTableId = req->primaryTableId;
 
@@ -6438,9 +6424,33 @@
   /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
   tabPtr.p->tabStatus = TabRecord::TS_CREATING;
   tabPtr.p->storedTable = req->storedTable;
-  tabPtr.p->method = TabRecord::HASH;
   tabPtr.p->kvalue = req->kValue;
 
+  switch ((DictTabInfo::FragmentType)fragType)
+  {
+    case DictTabInfo::AllNodesSmallTable:
+    case DictTabInfo::AllNodesMediumTable:
+    case DictTabInfo::AllNodesLargeTable:
+    case DictTabInfo::SingleFragment:
+      jam();
+    case DictTabInfo::DistrKeyLin:
+      jam();
+      tabPtr.p->method= TabRecord::LINEAR_HASH;
+      break;
+    case DictTabInfo::DistrKeyHash:
+    case DictTabInfo::DistrKeyUniqueHashIndex:
+    case DictTabInfo::DistrKeyOrderedIndex:
+      jam();
+      tabPtr.p->method= TabRecord::NORMAL_HASH;
+      break;
+    case DictTabInfo::UserDefined:
+      jam();
+      tabPtr.p->method= TabRecord::USER_DEFINED;
+      break;
+    default:
+      ndbrequire(false);
+  }
+
   union {
     Uint16 fragments[2 + MAX_FRAG_PER_NODE*MAX_REPLICAS*MAX_NDB_NODES];
     Uint32 align;
@@ -6875,17 +6885,40 @@
   tabPtr.i = req->tableId;
   Uint32 hashValue = req->hashValue;
   Uint32 ttabFileSize = ctabFileSize;
+  Uint32 fragId;
+  DiGetNodesConf * const conf = (DiGetNodesConf *)&signal->theData[0];
   TabRecord* regTabDesc = tabRecord;
   jamEntry();
   ptrCheckGuard(tabPtr, ttabFileSize, regTabDesc);
-  Uint32 fragId = hashValue & tabPtr.p->mask;
-  ndbrequire(tabPtr.p->tabStatus == TabRecord::TS_ACTIVE);
-  if (fragId < tabPtr.p->hashpointer) {
+  if (tabPtr.p->method == TabRecord::LINEAR_HASH)
+  {
     jam();
-    fragId = hashValue & ((tabPtr.p->mask << 1) + 1);
-  }//if
+    fragId = hashValue & tabPtr.p->mask;
+    ndbrequire(tabPtr.p->tabStatus == TabRecord::TS_ACTIVE);
+    if (fragId < tabPtr.p->hashpointer) {
+      jam();
+      fragId = hashValue & ((tabPtr.p->mask << 1) + 1);
+    }//if
+  }
+  else if (tabPtr.p->method == TabRecord::NORMAL_HASH)
+  {
+    jam();
+    fragId= hashValue % tabPtr.p->totalfragments;
+  }
+  else
+  {
+    jam();
+    ndbassert(tabPtr.p->method == TabRecord::USER_DEFINED);
+    fragId= hashValue;
+    if (fragId >= tabPtr.p->totalfragments)
+    {
+      jam();
+      conf->zero= 1; //Indicate error;
+      signal->theData[1]= ZUNDEFINED_FRAGMENT_ERROR;
+      return;
+    }
+  }
   getFragstore(tabPtr.p, fragId, fragPtr);
-  DiGetNodesConf * const conf = (DiGetNodesConf *)&signal->theData[0];
   Uint32 nodeCount = extractNodeInfo(fragPtr.p, conf->nodes);
   Uint32 sig2 = (nodeCount - 1) + 
     (fragPtr.p->distributionKey << 16);
@@ -8410,8 +8443,7 @@
   rf.rwfTabPtr.p->hashpointer = readPageWord(&rf);
   rf.rwfTabPtr.p->kvalue = readPageWord(&rf);
   rf.rwfTabPtr.p->mask = readPageWord(&rf);
-  ndbrequire(readPageWord(&rf) == TabRecord::HASH);
-  rf.rwfTabPtr.p->method = TabRecord::HASH;
+  rf.rwfTabPtr.p->method = (TabRecord::Method)readPageWord(&rf);
   /* ---------------------------------- */
   /* Type of table, 2 = temporary table */
   /* ---------------------------------- */
@@ -8505,7 +8537,7 @@
   writePageWord(&wf, tabPtr.p->hashpointer);
   writePageWord(&wf, tabPtr.p->kvalue);
   writePageWord(&wf, tabPtr.p->mask);
-  writePageWord(&wf, TabRecord::HASH);
+  writePageWord(&wf, tabPtr.p->method);
   writePageWord(&wf, tabPtr.p->storedTable);
 
   signal->theData[0] = DihContinueB::ZPACK_FRAG_INTO_PAGES;
@@ -11027,6 +11059,7 @@
   cnoHotSpare = 0;
   cnoOfActiveTables = 0;
   cnoOfNodeGroups = 0;
+  c_nextNodeGroup = 0;
   cnoReplicas = 0;
   coldgcp = 0;
   coldGcpId = 0;

--- 1.66.3.2/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp	2005-07-12 16:31:11 +02:00
+++ 1.72/storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp	2005-07-20 13:44:48 +02:00
@@ -2615,7 +2615,7 @@
 }//Dblqh::updatePackedList()
 
 void
-Dblqh::execREAD_PSUEDO_REQ(Signal* signal){
+Dblqh::execREAD_PSEUDO_REQ(Signal* signal){
   jamEntry();
   TcConnectionrecPtr regTcPtr;
   regTcPtr.i = signal->theData[0];
@@ -2629,7 +2629,7 @@
     ptrCheckGuard(regFragptr, cfragrecFileSize, fragrecord);
     
     signal->theData[0] = regFragptr.p->accFragptr[regTcPtr.p->localFragptr];
-    EXECUTE_DIRECT(DBACC, GSN_READ_PSUEDO_REQ, signal, 2);
+    EXECUTE_DIRECT(DBACC, GSN_READ_PSEUDO_REQ, signal, 2);
   }
   else
   {

--- 1.74.11.1/ndb/src/ndbapi/NdbDictionaryImpl.cpp	2005-07-20 13:22:37 +02:00
+++ 1.87/storage/ndb/src/ndbapi/NdbDictionaryImpl.cpp	2005-07-20 13:44:49 +02:00
@@ -233,7 +233,7 @@
 }
 
 NdbDictionary::Column *
-NdbColumnImpl::create_psuedo(const char * name){
+NdbColumnImpl::create_pseudo(const char * name){
   NdbDictionary::Column * col = new NdbDictionary::Column();
   col->setName(name);
   if(!strcmp(name, "NDB$FRAGMENT")){
@@ -302,8 +302,9 @@
 NdbTableImpl::init(){
   m_changeMask= 0;
   m_tableId= RNIL;
+  m_primaryTableId= RNIL;
   m_frm.clear();
-  m_fragmentType= NdbDictionary::Object::FragAllSmall;
+  m_fragmentType= NdbDictionary::Object::DistrKeyHash;
   m_hashValueMask= 0;
   m_hashpointerValue= 0;
   m_logging= true;
@@ -390,6 +391,7 @@
   m_externalName.assign(org.m_externalName);
   m_newExternalName.assign(org.m_newExternalName);
   m_frm.assign(org.m_frm.get_data(), org.m_frm.length());
+  m_ng.assign(org.m_ng.get_data(), org.m_ng.length());
   m_fragmentType = org.m_fragmentType;
   m_fragmentCount = org.m_fragmentCount;
 
@@ -788,17 +790,17 @@
     m_globalHash->lock();
     if(f_dictionary_count++ == 0){
       NdbDictionary::Column::FRAGMENT= 
-	NdbColumnImpl::create_psuedo("NDB$FRAGMENT");
+	NdbColumnImpl::create_pseudo("NDB$FRAGMENT");
       NdbDictionary::Column::FRAGMENT_MEMORY= 
-	NdbColumnImpl::create_psuedo("NDB$FRAGMENT_MEMORY");
+	NdbColumnImpl::create_pseudo("NDB$FRAGMENT_MEMORY");
       NdbDictionary::Column::ROW_COUNT= 
-	NdbColumnImpl::create_psuedo("NDB$ROW_COUNT");
+	NdbColumnImpl::create_pseudo("NDB$ROW_COUNT");
       NdbDictionary::Column::COMMIT_COUNT= 
-	NdbColumnImpl::create_psuedo("NDB$COMMIT_COUNT");
+	NdbColumnImpl::create_pseudo("NDB$COMMIT_COUNT");
       NdbDictionary::Column::ROW_SIZE=
-	NdbColumnImpl::create_psuedo("NDB$ROW_SIZE");
+	NdbColumnImpl::create_pseudo("NDB$ROW_SIZE");
       NdbDictionary::Column::RANGE_NO= 
-	NdbColumnImpl::create_psuedo("NDB$RANGE_NO");
+	NdbColumnImpl::create_pseudo("NDB$RANGE_NO");
     }
     m_globalHash->unlock();
     return true;
@@ -1220,6 +1222,9 @@
   { DictTabInfo::AllNodesMediumTable, NdbDictionary::Object::FragAllMedium },
   { DictTabInfo::AllNodesLargeTable,  NdbDictionary::Object::FragAllLarge },
   { DictTabInfo::SingleFragment,      NdbDictionary::Object::FragSingle },
+  { DictTabInfo::DistrKeyHash,      NdbDictionary::Object::DistrKeyHash },
+  { DictTabInfo::DistrKeyLin,      NdbDictionary::Object::DistrKeyLin },
+  { DictTabInfo::UserDefined,      NdbDictionary::Object::UserDefined },
   { -1, -1 }
 };
 
@@ -1294,6 +1299,7 @@
   impl->m_externalName.assign(externalName);
 
   impl->m_frm.assign(tableDesc.FrmData, tableDesc.FrmLen);
+  impl->m_ng.assign(tableDesc.FragmentData, tableDesc.FragmentDataLen);
   
   impl->m_fragmentType = (NdbDictionary::Object::FragmentType)
     getApiConstant(tableDesc.FragmentType, 
@@ -1407,12 +1413,12 @@
 
   if(tableDesc.FragmentDataLen > 0)
   {
-    Uint32 replicaCount = tableDesc.FragmentData[0];
-    Uint32 fragCount = tableDesc.FragmentData[1];
+    Uint16 replicaCount = tableDesc.FragmentData[0];
+    Uint16 fragCount = tableDesc.FragmentData[1];
 
     impl->m_replicaCount = replicaCount;
     impl->m_fragmentCount = fragCount;
-
+    DBUG_PRINT("info", ("replicaCount=%x , fragCount=%x",replicaCount,fragCount));
     for(i = 0; i<(fragCount*replicaCount); i++)
     {
       impl->m_fragments.push_back(tableDesc.FragmentData[i+2]);
@@ -1453,29 +1459,35 @@
 int
 NdbDictionaryImpl::createTable(NdbTableImpl &t)
 { 
+  DBUG_ENTER("NdbDictionaryImpl::createTable");
   if (m_receiver.createTable(m_ndb, t) != 0)
-    return -1;
+  {
+    DBUG_RETURN(-1);
+  }
   if (t.m_noOfBlobs == 0)
-    return 0;
+  {
+    DBUG_RETURN(0);
+  }
   // update table def from DICT
   Ndb_local_table_info *info=
     get_local_table_info(t.m_internalName,false);
   if (info == NULL) {
     m_error.code= 709;
-    return -1;
+    DBUG_RETURN(-1);
   }
   if (createBlobTables(*(info->m_table_impl)) != 0) {
     int save_code = m_error.code;
     (void)dropTable(t);
     m_error.code= save_code;
-    return -1;
+    DBUG_RETURN(-1);
   }
-  return 0;
+  DBUG_RETURN(0);
 }
 
 int
 NdbDictionaryImpl::createBlobTables(NdbTableImpl &t)
 {
+  DBUG_ENTER("NdbDictionaryImpl::createBlobTables");
   for (unsigned i = 0; i < t.m_columns.size(); i++) {
     NdbColumnImpl & c = *t.m_columns[i];
     if (! c.getBlobType() || c.getPartSize() == 0)
@@ -1483,23 +1495,26 @@
     NdbTableImpl bt;
     NdbBlob::getBlobTable(bt, &t, &c);
     if (createTable(bt) != 0)
-      return -1;
+    {
+      DBUG_RETURN(-1);
+    }
     // Save BLOB table handle
     Ndb_local_table_info *info=
       get_local_table_info(bt.m_internalName, false);
-    if (info == 0) {
-      return -1;
+    if (info == 0)
+    {
+      DBUG_RETURN(-1);
     }
     c.m_blobTable = info->m_table_impl;
   }
-  
-  return 0;
+  DBUG_RETURN(0); 
 }
 
 int
 NdbDictionaryImpl::addBlobTables(NdbTableImpl &t)
 {
   unsigned n= t.m_noOfBlobs;
+  DBUG_ENTER("NdbDictioanryImpl::addBlobTables");
   // optimized for blob column being the last one
   // and not looking for more than one if not neccessary
   for (unsigned i = t.m_columns.size(); i > 0 && n > 0;) {
@@ -1513,19 +1528,19 @@
     // Save BLOB table handle
     NdbTableImpl * cachedBlobTable = getTable(btname);
     if (cachedBlobTable == 0) {
-      return -1;
+      DBUG_RETURN(-1);
     }
     c.m_blobTable = cachedBlobTable;
   }
-  
-  return 0;
+  DBUG_RETURN(0); 
 }
 
 int 
 NdbDictInterface::createTable(Ndb & ndb,
 			      NdbTableImpl & impl)
 {
-  return createOrAlterTable(ndb, impl, false);
+  DBUG_ENTER("NdbDictInterface::createTable");
+  DBUG_RETURN(createOrAlterTable(ndb, impl, false));
 }
 
 int NdbDictionaryImpl::alterTable(NdbTableImpl &impl)
@@ -1561,7 +1576,8 @@
 NdbDictInterface::alterTable(Ndb & ndb,
 			      NdbTableImpl & impl)
 {
-  return createOrAlterTable(ndb, impl, true);
+  DBUG_ENTER("NdbDictInterface::alterTable");
+  DBUG_RETURN(createOrAlterTable(ndb, impl, true));
 }
 
 int 
@@ -1593,7 +1609,8 @@
     ndb.internalize_table_name(impl.m_externalName.c_str()));
   impl.m_internalName.assign(internalName);
   UtilBufferWriter w(m_buffer);
-  DictTabInfo::Table tmpTab; tmpTab.init();
+  DictTabInfo::Table tmpTab;
+  tmpTab.init();
   BaseString::snprintf(tmpTab.TableName,
 	   sizeof(tmpTab.TableName),
 	   internalName.c_str());
@@ -1616,6 +1633,10 @@
     if (col->m_distributionKey)
       distKeys++;
   }
+  if (distKeys == impl.m_noOfKeys)
+    distKeys= 0;
+  impl.m_noOfDistributionKeys= distKeys;
+
 
   // Check max length of frm data
   if (impl.m_frm.length() > MAX_FRM_DATA_SIZE){
@@ -1624,12 +1645,15 @@
   }
   tmpTab.FrmLen = impl.m_frm.length();
   memcpy(tmpTab.FrmData, impl.m_frm.get_data(), impl.m_frm.length());
+  tmpTab.FragmentDataLen = impl.m_ng.length();
+  memcpy(tmpTab.FragmentData, impl.m_ng.get_data(), impl.m_ng.length());
 
   tmpTab.TableLoggedFlag = impl.m_logging;
   tmpTab.TableKValue = impl.m_kvalue;
   tmpTab.MinLoadFactor = impl.m_minLoadFactor;
   tmpTab.MaxLoadFactor = impl.m_maxLoadFactor;
   tmpTab.TableType = DictTabInfo::UserTable;
+  tmpTab.PrimaryTableId = impl.m_primaryTableId;
   tmpTab.NoOfAttributes = sz;
   
   tmpTab.FragmentType = getKernelConstant(impl.m_fragmentType,
@@ -1647,6 +1671,8 @@
     abort();
   }
   
+  DBUG_PRINT("info",("impl.m_noOfDistributionKeys: %d impl.m_noOfKeys: %d distKeys: %d",
+		     impl.m_noOfDistributionKeys, impl.m_noOfKeys, distKeys));
   if (distKeys == impl.m_noOfKeys)
     distKeys= 0;
   impl.m_noOfDistributionKeys= distKeys;
@@ -1656,6 +1682,8 @@
     if(col == 0)
       continue;
     
+    DBUG_PRINT("info",("column: %s(%d) col->m_distributionKey: %d",
+		       col->m_name.c_str(), i, col->m_distributionKey));
     DictTabInfo::Attribute tmpAttr; tmpAttr.init();
     BaseString::snprintf(tmpAttr.AttributeName, sizeof(tmpAttr.AttributeName), 
 	     col->m_name.c_str());
@@ -1686,8 +1714,14 @@
     }
     // distribution key not supported for Char attribute
     if (distKeys && col->m_distributionKey && col->m_cs != NULL) {
-      m_error.code= 745;
-      DBUG_RETURN(-1);
+      // we can allow this for non-var char where strxfrm does nothing
+      if (col->m_type == NdbDictionary::Column::Char &&
+          (col->m_cs->state & MY_CS_BINSORT))
+        ;
+      else {
+        m_error.code= 745;
+        DBUG_RETURN(-1);
+      }
     }
     // charset in upper half of precision
     if (col->getCharType()) {
Thread
bk commit into 5.1 tree (joreland:1.1855)jonas.oreland20 Jul