diff --git a/storage/ndb/include/kernel/signaldata/DictTabInfo.hpp b/storage/ndb/include/kernel/signaldata/DictTabInfo.hpp index bc41d8373fd477b44af8287a4e978f4eaf6b6073..bb35a31321df5eebf359ce4e3f846fbc4e37faee 100644 --- a/storage/ndb/include/kernel/signaldata/DictTabInfo.hpp +++ b/storage/ndb/include/kernel/signaldata/DictTabInfo.hpp @@ -118,6 +118,7 @@ public: FrmData = 27, TableTemporaryFlag = 28, //Default not Temporary + ForceVarPartFlag = 29, FragmentCount = 128, // No of fragments in table (!fragment replicas) FragmentDataLen = 129, @@ -299,6 +300,7 @@ public: Uint32 PrimaryTableId; Uint32 TableLoggedFlag; Uint32 TableTemporaryFlag; + Uint32 ForceVarPartFlag; Uint32 NoOfKeyAttr; Uint32 NoOfAttributes; Uint32 NoOfNullable; diff --git a/storage/ndb/include/kernel/signaldata/LqhFrag.hpp b/storage/ndb/include/kernel/signaldata/LqhFrag.hpp index 40ed73ad2e79d7057a79da16178228e24c16d15a..d4f4877cc5bb194515d5c1680b9ec8e6bf54cc0e 100644 --- a/storage/ndb/include/kernel/signaldata/LqhFrag.hpp +++ b/storage/ndb/include/kernel/signaldata/LqhFrag.hpp @@ -105,7 +105,7 @@ class LqhFragReq { friend bool printLQH_FRAG_REQ(FILE *, const Uint32 *, Uint32, Uint16); public: - STATIC_CONST( SignalLength = 24 ); + STATIC_CONST( SignalLength = 25 ); enum RequestInfo { CreateInRunning = 0x8000000, @@ -143,6 +143,7 @@ private: Uint32 maxRowsHigh; Uint32 minRowsLow; Uint32 minRowsHigh; + Uint32 forceVarPartFlag; }; class LqhFragConf { diff --git a/storage/ndb/include/kernel/signaldata/TupFrag.hpp b/storage/ndb/include/kernel/signaldata/TupFrag.hpp index cae548aa094acd16d227a2d0f253a933bdd07f1f..106518dd47be893c545ec657bc7a961418ca6b80 100644 --- a/storage/ndb/include/kernel/signaldata/TupFrag.hpp +++ b/storage/ndb/include/kernel/signaldata/TupFrag.hpp @@ -29,7 +29,7 @@ class TupFragReq { friend class Dblqh; friend class Dbtup; public: - STATIC_CONST( SignalLength = 17 ); + STATIC_CONST( SignalLength = 18 ); private: Uint32 userPtr; Uint32 userRef; @@ -48,6 +48,7 @@ private: Uint32 checksumIndicator; Uint32 globalCheckpointIdIndicator; Uint32 tablespaceid; + Uint32 forceVarPartFlag; }; class TupFragConf { diff --git a/storage/ndb/include/ndbapi/NdbDictionary.hpp b/storage/ndb/include/ndbapi/NdbDictionary.hpp index 0687733df034de5a017c95cc892516749828469d..895bae09ab0bb74bc76ad96526cba328109616db 100644 --- a/storage/ndb/include/ndbapi/NdbDictionary.hpp +++ b/storage/ndb/include/ndbapi/NdbDictionary.hpp @@ -921,6 +921,14 @@ public: bool getTemporary(); void setTemporary(bool); + /** + * Only table with varpart do support online add column + * Add property so that table wo/ varsize column(s) still + * allocates varpart-ref, so that later online add column is possible + */ + bool getForceVarPart() const; + void setForceVarPart(bool); + /** * Check if any of column in bitmaps are disk columns * returns bitmap of different columns diff --git a/storage/ndb/src/common/debugger/signaldata/DictTabInfo.cpp b/storage/ndb/src/common/debugger/signaldata/DictTabInfo.cpp index 6d713e5335180c21e8cc34cb8a609d451b6e652d..89f9db835a192c6618638228481f93372e097c87 100644 --- a/storage/ndb/src/common/debugger/signaldata/DictTabInfo.cpp +++ b/storage/ndb/src/common/debugger/signaldata/DictTabInfo.cpp @@ -26,6 +26,7 @@ DictTabInfo::TableMapping[] = { DTIMAP(Table, PrimaryTableId, PrimaryTableId), DTIMAP2(Table, TableLoggedFlag, TableLoggedFlag, 0, 1), DTIMAP2(Table, TableTemporaryFlag, TableTemporaryFlag, 0, 1), + DTIMAP2(Table, ForceVarPartFlag, ForceVarPartFlag, 0, 1), DTIMAP2(Table, TableKValue, TableKValue, 6, 6), DTIMAP2(Table, MinLoadFactor, MinLoadFactor, 0, 90), DTIMAP2(Table, MaxLoadFactor, MaxLoadFactor, 25, 110), @@ -123,6 +124,7 @@ DictTabInfo::Table::init(){ PrimaryTableId = RNIL; TableLoggedFlag = 1; TableTemporaryFlag = 0; + ForceVarPartFlag = 0; NoOfKeyAttr = 0; NoOfAttributes = 0; NoOfNullable = 0; diff --git a/storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp b/storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp index 7a3ecc5c090a9143618496085bb16615442e567f..cf5d7d06c5fb854dc6d132f863b8ea018c670dbe 100644 --- a/storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp +++ b/storage/ndb/src/kernel/blocks/dbdict/Dbdict.cpp @@ -449,6 +449,8 @@ Dbdict::packTableIntoPages(SimpleProperties::Writer & w, !!(tablePtr.p->m_bits & TableRecord::TR_RowChecksum)); w.add(DictTabInfo::TableTemporaryFlag, !!(tablePtr.p->m_bits & TableRecord::TR_Temporary)); + w.add(DictTabInfo::ForceVarPartFlag, + !!(tablePtr.p->m_bits & TableRecord::TR_ForceVarPart)); w.add(DictTabInfo::MinLoadFactor, tablePtr.p->minLoadFactor); w.add(DictTabInfo::MaxLoadFactor, tablePtr.p->maxLoadFactor); @@ -5503,8 +5505,8 @@ Dbdict::execADD_FRAGREQ(Signal* signal) { req->tableType = tabPtr.p->tableType; req->primaryTableId = tabPtr.p->primaryTableId; req->tablespace_id= tabPtr.p->m_tablespace_id; - //req->tablespace_id= tablespace_id; req->logPartId = logPart; + req->forceVarPartFlag = !!(tabPtr.p->m_bits& TableRecord::TR_ForceVarPart); sendSignal(DBLQH_REF, GSN_LQHFRAGREQ, signal, LqhFragReq::SignalLength, JBB); } @@ -6119,6 +6121,8 @@ void Dbdict::handleTabInfoInit(SimpleProperties::Reader & it, (c_tableDesc.RowGCIFlag ? TableRecord::TR_RowGCI : 0); tablePtr.p->m_bits |= (c_tableDesc.TableTemporaryFlag ? TableRecord::TR_Temporary : 0); + tablePtr.p->m_bits |= + (c_tableDesc.ForceVarPartFlag ? TableRecord::TR_ForceVarPart : 0); tablePtr.p->minLoadFactor = c_tableDesc.MinLoadFactor; tablePtr.p->maxLoadFactor = c_tableDesc.MaxLoadFactor; tablePtr.p->fragmentType = (DictTabInfo::FragmentType)c_tableDesc.FragmentType; diff --git a/storage/ndb/src/kernel/blocks/dbdict/Dbdict.hpp b/storage/ndb/src/kernel/blocks/dbdict/Dbdict.hpp index 839d139a6591e1f3e0d1e1800fd8fd2e014371a6..9801599fa08f3f1826429b262514cf0a8e5d355b 100644 --- a/storage/ndb/src/kernel/blocks/dbdict/Dbdict.hpp +++ b/storage/ndb/src/kernel/blocks/dbdict/Dbdict.hpp @@ -236,10 +236,11 @@ public: /* Is the table logged (i.e. data survives system restart) */ enum Bits { - TR_Logged = 0x1, - TR_RowGCI = 0x2, - TR_RowChecksum = 0x4, - TR_Temporary = 0x8 + TR_Logged = 0x1, + TR_RowGCI = 0x2, + TR_RowChecksum = 0x4, + TR_Temporary = 0x8, + TR_ForceVarPart = 0x10 }; Uint16 m_bits; diff --git a/storage/ndb/src/kernel/blocks/dblqh/Dblqh.hpp b/storage/ndb/src/kernel/blocks/dblqh/Dblqh.hpp index e3026fc59f02fa714cd9f047fb9e40c44b999a72..3fc8891c0822d1dae47fc2bcb71b2241d593fe70 100644 --- a/storage/ndb/src/kernel/blocks/dblqh/Dblqh.hpp +++ b/storage/ndb/src/kernel/blocks/dblqh/Dblqh.hpp @@ -459,7 +459,8 @@ public: Uint32 maxRowsHigh; Uint32 minRowsLow; Uint32 minRowsHigh; - };// Size 128 bytes + Uint32 forceVarPartFlag; + }; typedef Ptr<AddFragRecord> AddFragRecordPtr; /* $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ */ diff --git a/storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp b/storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp index 869eb6e26895608eda4aff5ce314f0d9fc94d1fa..a359267f9d92cc192592508a3491a38aac943bd8 100644 --- a/storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp +++ b/storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp @@ -1071,6 +1071,7 @@ void Dblqh::execLQHFRAGREQ(Signal* signal) Uint32 primaryTableId = req->primaryTableId; Uint32 tablespace= req->tablespace_id; Uint32 logPart = req->logPartId; + Uint32 forceVarPartFlag = req->forceVarPartFlag; if (signal->getLength() < 20) { @@ -1190,6 +1191,7 @@ void Dblqh::execLQHFRAGREQ(Signal* signal) addfragptr.p->tableType = tableType; addfragptr.p->primaryTableId = primaryTableId; addfragptr.p->tablespace_id= tablespace; + addfragptr.p->forceVarPartFlag = forceVarPartFlag; // addfragptr.p->tupConnectptr = RNIL; addfragptr.p->tuxConnectptr = RNIL; @@ -1340,6 +1342,7 @@ Dblqh::sendAddFragReq(Signal* signal) tupFragReq->checksumIndicator = addfragptr.p->checksumIndicator; tupFragReq->globalCheckpointIdIndicator = addfragptr.p->GCPIndicator; tupFragReq->tablespaceid = addfragptr.p->tablespace_id; + tupFragReq->forceVarPartFlag = addfragptr.p->forceVarPartFlag; sendSignal(fragptr.p->tupBlockref, GSN_TUPFRAGREQ, signal, TupFragReq::SignalLength, JBB); return; diff --git a/storage/ndb/src/ndbapi/NdbDictionary.cpp b/storage/ndb/src/ndbapi/NdbDictionary.cpp index 47ba0335183ee761423200b877e9539eb72e3dfe..6d548126126a481005a01eeef26e4397df8a056a 100644 --- a/storage/ndb/src/ndbapi/NdbDictionary.cpp +++ b/storage/ndb/src/ndbapi/NdbDictionary.cpp @@ -703,6 +703,16 @@ NdbDictionary::Table::getRowGCIIndicator() const { return m_impl.m_row_gci; } +void +NdbDictionary::Table::setForceVarPart(bool val){ + m_impl.m_force_var_part = val; +} + +bool +NdbDictionary::Table::getForceVarPart() const { + return m_impl.m_force_var_part; +} + int NdbDictionary::Table::aggregate(NdbError& error) { diff --git a/storage/ndb/src/ndbapi/NdbDictionaryImpl.cpp b/storage/ndb/src/ndbapi/NdbDictionaryImpl.cpp index 76f0cf818238ed66c2d779e155da9a4c63598b6c..d19ab74228a9de259fb554731a8dee770f2533e5 100644 --- a/storage/ndb/src/ndbapi/NdbDictionaryImpl.cpp +++ b/storage/ndb/src/ndbapi/NdbDictionaryImpl.cpp @@ -2105,6 +2105,7 @@ NdbDictInterface::parseTableInfo(NdbTableImpl ** ret, impl->m_temporary = tableDesc->TableTemporaryFlag; impl->m_row_gci = tableDesc->RowGCIFlag; impl->m_row_checksum = tableDesc->RowChecksumFlag; + impl->m_force_var_part = tableDesc->ForceVarPartFlag; impl->m_kvalue = tableDesc->TableKValue; impl->m_minLoadFactor = tableDesc->MinLoadFactor; impl->m_maxLoadFactor = tableDesc->MaxLoadFactor; @@ -2569,6 +2570,7 @@ NdbDictInterface::createOrAlterTable(Ndb & ndb, tmpTab->MinRowsLow = (Uint32)(impl.m_min_rows & 0xFFFFFFFF); tmpTab->DefaultNoPartFlag = impl.m_default_no_part_flag; tmpTab->LinearHashFlag = impl.m_linear_flag; + tmpTab->ForceVarPartFlag = impl.m_force_var_part; if (impl.m_ts_name.length()) { diff --git a/storage/ndb/src/ndbapi/NdbDictionaryImpl.hpp b/storage/ndb/src/ndbapi/NdbDictionaryImpl.hpp index 26d7c13f9682815441c0725258a068d57a3bf218..68ca4edb5d057779e334431f57674a4bd8bada23 100644 --- a/storage/ndb/src/ndbapi/NdbDictionaryImpl.hpp +++ b/storage/ndb/src/ndbapi/NdbDictionaryImpl.hpp @@ -199,6 +199,7 @@ public: bool m_temporary; bool m_row_gci; bool m_row_checksum; + bool m_force_var_part; int m_kvalue; int m_minLoadFactor; int m_maxLoadFactor;