Commit 89b44696 authored by unknown's avatar unknown

testTransaction -n FRead*

testTransaction -n *Scan*
testTimeout -n *


ndb/include/kernel/signaldata/DumpStateOrd.hpp:
  Added DUMP for tc appl timeout
ndb/src/kernel/blocks/dbtc/DbtcMain.cpp:
  Send tckey conf if m_exec_flags is set
  Added dump for appl timeout
ndb/test/include/HugoOperations.hpp:
  Add scanRead
ndb/test/ndbapi/testTimeout.cpp:
  Reenable
ndb/test/ndbapi/testTransactions.cpp:
  Fix scan test cases
ndb/test/run-test/daily-basic-tests.txt:
  reenable timeout-tests
  added testTransaction -n Scan* testcases
ndb/test/src/HugoOperations.cpp:
  Fix scan
ndb/test/src/NDBT_Test.cpp:
  Drop table before test...(if createTable==true)
parent fbceeb05
...@@ -94,6 +94,7 @@ public: ...@@ -94,6 +94,7 @@ public:
TcDumpOneApiConnectRec = 2505, TcDumpOneApiConnectRec = 2505,
TcDumpAllApiConnectRec = 2506, TcDumpAllApiConnectRec = 2506,
TcSetTransactionTimeout = 2507, TcSetTransactionTimeout = 2507,
TcSetApplTransactionTimeout = 2508,
CmvmiDumpConnections = 2600, CmvmiDumpConnections = 2600,
CmvmiDumpLongSignalMemory = 2601, CmvmiDumpLongSignalMemory = 2601,
CmvmiSetRestartOnErrorInsert = 2602, CmvmiSetRestartOnErrorInsert = 2602,
......
...@@ -5043,11 +5043,11 @@ void Dbtc::execLQHKEYREF(Signal* signal) ...@@ -5043,11 +5043,11 @@ void Dbtc::execLQHKEYREF(Signal* signal)
jam(); jam();
diverify010Lab(signal); diverify010Lab(signal);
return; return;
} else if (regApiPtr->tckeyrec > 0) { } else if (regApiPtr->tckeyrec > 0 || regApiPtr->m_exec_flag) {
jam(); jam();
sendtckeyconf(signal, 2); sendtckeyconf(signal, 2);
return; return;
}//if }
}//if }//if
return; return;
...@@ -10533,6 +10533,13 @@ Dbtc::execDUMP_STATE_ORD(Signal* signal) ...@@ -10533,6 +10533,13 @@ Dbtc::execDUMP_STATE_ORD(Signal* signal)
set_timeout_value(signal->theData[1]); set_timeout_value(signal->theData[1]);
} }
} }
if (dumpState->args[0] == DumpStateOrd::TcSetApplTransactionTimeout){
jam();
if(signal->getLength() > 1){
set_appl_timeout_value(signal->theData[1]);
}
}
}//Dbtc::execDUMP_STATE_ORD() }//Dbtc::execDUMP_STATE_ORD()
void Dbtc::execSET_VAR_REQ(Signal* signal) void Dbtc::execSET_VAR_REQ(Signal* signal)
......
...@@ -58,9 +58,6 @@ public: ...@@ -58,9 +58,6 @@ public:
int recordNo, int recordNo,
int numRecords = 1); int numRecords = 1);
NdbResultSet* scanReadRecords(Ndb* pNdb, ScanLock lock = SL_Read);
int readTuples(NdbResultSet*);
int execute_Commit(Ndb*, int execute_Commit(Ndb*,
AbortOption ao = AbortOnError); AbortOption ao = AbortOnError);
int execute_NoCommit(Ndb*, int execute_NoCommit(Ndb*,
...@@ -92,7 +89,11 @@ public: ...@@ -92,7 +89,11 @@ public:
int recordNo, int recordNo,
int numRecords = 1, int numRecords = 1,
int updatesValue = 0); int updatesValue = 0);
int scanReadRecords(Ndb*, NdbScanOperation::LockMode =
NdbScanOperation::LM_CommittedRead,
int numRecords = 1);
protected: protected:
void allocRows(int rows); void allocRows(int rows);
void deallocRows(); void deallocRows();
...@@ -101,6 +102,10 @@ protected: ...@@ -101,6 +102,10 @@ protected:
HugoCalculator calc; HugoCalculator calc;
Vector<BaseString> savedRecords; Vector<BaseString> savedRecords;
struct RsPair { NdbResultSet* m_result_set; int records; };
Vector<RsPair> m_result_sets;
Vector<RsPair> m_executed_result_sets;
private: private:
NdbConnection* pTrans; NdbConnection* pTrans;
}; };
......
This diff is collapsed.
...@@ -102,7 +102,7 @@ OperationTestCase matrix[] = { ...@@ -102,7 +102,7 @@ OperationTestCase matrix[] = {
{ "ScanExInsert", true, "SCAN-EX",1, "INSERT", 266, X, 0, 1 }, { "ScanExInsert", true, "SCAN-EX",1, "INSERT", 266, X, 0, 1 },
{ "ScanExUpdate", true, "SCAN-EX",1, "UPDATE", 266, 2, 0, 1 }, { "ScanExUpdate", true, "SCAN-EX",1, "UPDATE", 266, 2, 0, 1 },
{ "ScanExDelete", true, "SCAN-EX",1, "DELETE", 266, X, 0, 1 }, { "ScanExDelete", true, "SCAN-EX",1, "DELETE", 266, X, 0, 1 },
{ "ScanExScan", true, "SCAN-EX",1, "SCAN", 274, X, 0, 1 }, { "ScanExScan", true, "SCAN-EX",1, "SCAN", 0, 1, 0, 1 },
{ "ScanExScanHl", true, "SCAN-EX",1, "SCAN-HL", 274, X, 0, 1 }, { "ScanExScanHl", true, "SCAN-EX",1, "SCAN-HL", 274, X, 0, 1 },
{ "ScanExScanEx", true, "SCAN-EX",1, "SCAN-EX", 274, X, 0, 1 }, { "ScanExScanEx", true, "SCAN-EX",1, "SCAN-EX", 274, X, 0, 1 },
#if 0 #if 0
...@@ -117,8 +117,8 @@ OperationTestCase matrix[] = { ...@@ -117,8 +117,8 @@ OperationTestCase matrix[] = {
{ "ReadExInsert", true, "READ-EX",1, "INSERT", 266, X, 0, 1 }, { "ReadExInsert", true, "READ-EX",1, "INSERT", 266, X, 0, 1 },
{ "ReadExUpdate", true, "READ-EX",1, "UPDATE", 266, X, 0, 1 }, { "ReadExUpdate", true, "READ-EX",1, "UPDATE", 266, X, 0, 1 },
{ "ReadExDelete", true, "READ-EX",1, "DELETE", 266, X, 0, 1 }, { "ReadExDelete", true, "READ-EX",1, "DELETE", 266, X, 0, 1 },
{ "ReadExScan", true, "READ-EX",1, "SCAN", 274, 1, 0, 1 }, { "ReadExScan", true, "READ-EX",1, "SCAN", 0, 1, 0, 1 },
{ "ReadExScanHl", true, "READ-EX",1, "SCAN-HL", 274, 1, 0, 1 }, { "ReadExScanHl", true, "READ-EX",1, "SCAN-HL", 274, X, 0, 1 },
{ "ReadExScanEx", true, "READ-EX",1, "SCAN-EX", 274, X, 0, 1 }, { "ReadExScanEx", true, "READ-EX",1, "SCAN-EX", 274, X, 0, 1 },
#if 0 #if 0
{ "ReadExScanUp", true, "READ-EX",1, "SCAN-UP", 266, X, 0, 1 }, { "ReadExScanUp", true, "READ-EX",1, "SCAN-UP", 266, X, 0, 1 },
...@@ -132,7 +132,7 @@ OperationTestCase matrix[] = { ...@@ -132,7 +132,7 @@ OperationTestCase matrix[] = {
{ "InsertInsert", false, "INSERT", 1, "INSERT", 266, X, 0, 1 }, { "InsertInsert", false, "INSERT", 1, "INSERT", 266, X, 0, 1 },
{ "InsertUpdate", false, "INSERT", 1, "UPDATE", 266, X, 0, 1 }, { "InsertUpdate", false, "INSERT", 1, "UPDATE", 266, X, 0, 1 },
{ "InsertDelete", false, "INSERT", 1, "DELETE", 266, X, 0, 1 }, { "InsertDelete", false, "INSERT", 1, "DELETE", 266, X, 0, 1 },
{ "InsertScan", false, "INSERT", 1, "SCAN", 274, X, 0, 1 }, { "InsertScan", false, "INSERT", 1, "SCAN", 626, X, 0, 1 },
{ "InsertScanHl", false, "INSERT", 1, "SCAN-HL", 274, X, 0, 1 }, { "InsertScanHl", false, "INSERT", 1, "SCAN-HL", 274, X, 0, 1 },
{ "InsertScanEx", false, "INSERT", 1, "SCAN-EX", 274, X, 0, 1 }, { "InsertScanEx", false, "INSERT", 1, "SCAN-EX", 274, X, 0, 1 },
#if 0 #if 0
...@@ -147,7 +147,7 @@ OperationTestCase matrix[] = { ...@@ -147,7 +147,7 @@ OperationTestCase matrix[] = {
{ "UpdateInsert", true, "UPDATE", 2, "INSERT", 266, X, 0, 2 }, { "UpdateInsert", true, "UPDATE", 2, "INSERT", 266, X, 0, 2 },
{ "UpdateUpdate", true, "UPDATE", 2, "UPDATE", 266, X, 0, 2 }, { "UpdateUpdate", true, "UPDATE", 2, "UPDATE", 266, X, 0, 2 },
{ "UpdateDelete", true, "UPDATE", 2, "DELETE", 266, X, 0, 2 }, { "UpdateDelete", true, "UPDATE", 2, "DELETE", 266, X, 0, 2 },
{ "UpdateScan", true, "UPDATE", 2, "SCAN", 274, X, 0, 2 }, { "UpdateScan", true, "UPDATE", 2, "SCAN", 0, 1, 0, 2 },
{ "UpdateScanHl", true, "UPDATE", 2, "SCAN-HL", 274, X, 0, 2 }, { "UpdateScanHl", true, "UPDATE", 2, "SCAN-HL", 274, X, 0, 2 },
{ "UpdateScanEx", true, "UPDATE", 2, "SCAN-EX", 274, X, 0, 2 }, { "UpdateScanEx", true, "UPDATE", 2, "SCAN-EX", 274, X, 0, 2 },
#if 0 #if 0
...@@ -162,7 +162,7 @@ OperationTestCase matrix[] = { ...@@ -162,7 +162,7 @@ OperationTestCase matrix[] = {
{ "DeleteInsert", true, "DELETE", X, "INSERT", 266, X, 626, X }, { "DeleteInsert", true, "DELETE", X, "INSERT", 266, X, 626, X },
{ "DeleteUpdate", true, "DELETE", X, "UPDATE", 266, X, 626, X }, { "DeleteUpdate", true, "DELETE", X, "UPDATE", 266, X, 626, X },
{ "DeleteDelete", true, "DELETE", X, "DELETE", 266, X, 626, X }, { "DeleteDelete", true, "DELETE", X, "DELETE", 266, X, 626, X },
{ "DeleteScan", true, "DELETE", X, "SCAN", 274, X, 626, X }, { "DeleteScan", true, "DELETE", X, "SCAN", 0, 1, 626, X },
{ "DeleteScanHl", true, "DELETE", X, "SCAN-HL", 274, X, 626, X }, { "DeleteScanHl", true, "DELETE", X, "SCAN-HL", 274, X, 626, X },
{ "DeleteScanEx", true, "DELETE", X, "SCAN-EX", 274, X, 626, X }, { "DeleteScanEx", true, "DELETE", X, "SCAN-EX", 274, X, 626, X },
#if 0 #if 0
...@@ -204,14 +204,11 @@ runOp(HugoOperations & hugoOps, ...@@ -204,14 +204,11 @@ runOp(HugoOperations & hugoOps,
} else if(strcmp(op, "DELETE") == 0){ } else if(strcmp(op, "DELETE") == 0){
C2(hugoOps.pkDeleteRecord(pNdb, 1, 1) == 0); C2(hugoOps.pkDeleteRecord(pNdb, 1, 1) == 0);
} else if(strcmp(op, "SCAN") == 0){ } else if(strcmp(op, "SCAN") == 0){
abort(); C2(hugoOps.scanReadRecords(pNdb) == 0);
//C2(hugoOps.scanReadRecords(pNdb) == 0);
} else if(strcmp(op, "SCAN-HL") == 0){ } else if(strcmp(op, "SCAN-HL") == 0){
abort(); C2(hugoOps.scanReadRecords(pNdb, NdbScanOperation::LM_Read)== 0);
//C2(hugoOps.scanReadRecords(pNdb, 240, HugoOperations::SL_ReadHold)== 0);
} else if(strcmp(op, "SCAN-EX") == 0){ } else if(strcmp(op, "SCAN-EX") == 0){
abort(); C2(hugoOps.scanReadRecords(pNdb, NdbScanOperation::LM_Exclusive)== 0);
//C2(hugoOps.scanReadRecords(pNdb, 240, HugoOperations::SL_Exclusive)== 0);
} else { } else {
g_err << __FILE__ << " - " << __LINE__ g_err << __FILE__ << " - " << __LINE__
<< ": Unknown operation" << op << endl; << ": Unknown operation" << op << endl;
......
...@@ -139,10 +139,6 @@ max-time: 500 ...@@ -139,10 +139,6 @@ max-time: 500
cmd: testBasicAsynch cmd: testBasicAsynch
args: -n PkDeleteAsynch args: -n PkDeleteAsynch
max-time:
cmd: ndb_drop_table
args: T1 T2 T3 T4 T5 T6 T7 T8 T9 T10 T11 T12 T13 T14
max-time: 500 max-time: 500
cmd: testBasic cmd: testBasic
args: -n MassiveRollback T1 T6 T13 args: -n MassiveRollback T1 T6 T13
...@@ -152,34 +148,34 @@ cmd: testBasic ...@@ -152,34 +148,34 @@ cmd: testBasic
args: -n MassiveRollback2 T1 T6 T13 args: -n MassiveRollback2 T1 T6 T13
#-m 500 1: testBasic -n ReadConsistency T6 #-m 500 1: testBasic -n ReadConsistency T6
#max-time: 500 max-time: 500
#cmd: testTimeout cmd: testTimeout
#args: -n DontTimeoutTransaction T1 args: -n DontTimeoutTransaction T1
#
#max-time: 500 max-time: 500
#cmd: testTimeout cmd: testTimeout
#args: -n DontTimeoutTransaction5 T1 args: -n DontTimeoutTransaction5 T1
#
#max-time: 500 max-time: 500
#cmd: testTimeout cmd: testTimeout
#args: -n TimeoutTransaction T1 args: -n TimeoutTransaction T1
#
#max-time: 500 max-time: 500
#cmd: testTimeout cmd: testTimeout
#args: -n TimeoutTransaction5 T1 args: -n TimeoutTransaction5 T1
#
#max-time: 500 max-time: 500
#cmd: testTimeout cmd: testTimeout
#args: -n BuddyTransNoTimeout T1 args: -n BuddyTransNoTimeout T1
#
#max-time: 500 max-time: 500
#cmd: testTimeout cmd: testTimeout
#args: -n BuddyTransNoTimeout5 T1 args: -n BuddyTransNoTimeout5 T1
#
#max-time: 500 max-time: 500
#cmd: testTimeout cmd: testTimeout
#args: -n TimeoutRandTransaction T1 args: -n TimeoutRandTransaction T1
#
# SCAN TESTS # SCAN TESTS
# #
max-time: 500 max-time: 500
...@@ -786,6 +782,186 @@ max-time: 1500 ...@@ -786,6 +782,186 @@ max-time: 1500
cmd: testTransactions cmd: testTransactions
args: -n DeleteDirtyRead args: -n DeleteDirtyRead
max-time: 1500
cmd: testTransactions
args: -n ReadScan
max-time: 1500
cmd: testTransactions
args: -n ReadScanHl
max-time: 1500
cmd: testTransactions
args: -n ReadScanEx
max-time: 1500
cmd: testTransactions
args: -n ScanRead
max-time: 1500
cmd: testTransactions
args: -n ScanReadEx
max-time: 1500
cmd: testTransactions
args: -n ScanSimpleRead
max-time: 1500
cmd: testTransactions
args: -n ScanDirtyRead
max-time: 1500
cmd: testTransactions
args: -n ScanInsert
max-time: 1500
cmd: testTransactions
args: -n ScanUpdate
max-time: 1500
cmd: testTransactions
args: -n ScanDelete
max-time: 1500
cmd: testTransactions
args: -n ScanScan
max-time: 1500
cmd: testTransactions
args: -n ScanScanHl
max-time: 1500
cmd: testTransactions
args: -n ScanScanEx
max-time: 1500
cmd: testTransactions
args: -n ScanHlRead
max-time: 1500
cmd: testTransactions
args: -n ScanHlReadEx
max-time: 1500
cmd: testTransactions
args: -n ScanHlSimpleRead
max-time: 1500
cmd: testTransactions
args: -n ScanHlDirtyRead
max-time: 1500
cmd: testTransactions
args: -n ScanHlInsert
max-time: 1500
cmd: testTransactions
args: -n ScanHlUpdate
max-time: 1500
cmd: testTransactions
args: -n ScanHlDelete
max-time: 1500
cmd: testTransactions
args: -n ScanHlScan
max-time: 1500
cmd: testTransactions
args: -n ScanHlScanHl
max-time: 1500
cmd: testTransactions
args: -n ScanHlScanEx
max-time: 1500
cmd: testTransactions
args: -n ScanExRead
max-time: 1500
cmd: testTransactions
args: -n ScanExReadEx
max-time: 1500
cmd: testTransactions
args: -n ScanExSimpleRead
max-time: 1500
cmd: testTransactions
args: -n ScanExDirtyRead
max-time: 1500
cmd: testTransactions
args: -n ScanExInsert
max-time: 1500
cmd: testTransactions
args: -n ScanExUpdate
max-time: 1500
cmd: testTransactions
args: -n ScanExDelete
max-time: 1500
cmd: testTransactions
args: -n ScanExScan
max-time: 1500
cmd: testTransactions
args: -n ScanExScanHl
max-time: 1500
cmd: testTransactions
args: -n ScanExScanEx
max-time: 1500
cmd: testTransactions
args: -n ReadExScan
max-time: 1500
cmd: testTransactions
args: -n ReadExScanHl
max-time: 1500
cmd: testTransactions
args: -n ReadExScanEx
max-time: 1500
cmd: testTransactions
args: -n InsertScan
max-time: 1500
cmd: testTransactions
args: -n InsertScanHl
max-time: 1500
cmd: testTransactions
args: -n InsertScanEx
max-time: 1500
cmd: testTransactions
args: -n UpdateScan
max-time: 1500
cmd: testTransactions
args: -n UpdateScanHl
max-time: 1500
cmd: testTransactions
args: -n UpdateScanEx
max-time: 1500
cmd: testTransactions
args: -n DeleteScan
max-time: 1500
cmd: testTransactions
args: -n DeleteScanHl
max-time: 1500
cmd: testTransactions
args: -n DeleteScanEx
max-time: 1500 max-time: 1500
cmd: testRestartGci cmd: testRestartGci
args: T6 args: T6
......
...@@ -40,6 +40,9 @@ int HugoOperations::closeTransaction(Ndb* pNdb){ ...@@ -40,6 +40,9 @@ int HugoOperations::closeTransaction(Ndb* pNdb){
} }
pTrans = NULL; pTrans = NULL;
m_result_sets.clear();
m_executed_result_sets.clear();
return NDBT_OK; return NDBT_OK;
} }
...@@ -291,7 +294,7 @@ int HugoOperations::pkDeleteRecord(Ndb* pNdb, ...@@ -291,7 +294,7 @@ int HugoOperations::pkDeleteRecord(Ndb* pNdb,
} }
return NDBT_OK; return NDBT_OK;
} }
#if 0
NdbResultSet* NdbResultSet*
HugoOperations::scanReadRecords(Ndb* pNdb, ScanLock lock){ HugoOperations::scanReadRecords(Ndb* pNdb, ScanLock lock){
...@@ -349,6 +352,7 @@ HugoOperations::readTuples(NdbResultSet* rs){ ...@@ -349,6 +352,7 @@ HugoOperations::readTuples(NdbResultSet* rs){
return NDBT_FAILED; return NDBT_FAILED;
return NDBT_OK; return NDBT_OK;
} }
#endif
int HugoOperations::execute_Commit(Ndb* pNdb, int HugoOperations::execute_Commit(Ndb* pNdb,
AbortOption eao){ AbortOption eao){
...@@ -368,6 +372,35 @@ int HugoOperations::execute_Commit(Ndb* pNdb, ...@@ -368,6 +372,35 @@ int HugoOperations::execute_Commit(Ndb* pNdb,
return NDBT_FAILED; return NDBT_FAILED;
return err.code; return err.code;
} }
for(int i = 0; i<m_result_sets.size(); i++){
m_executed_result_sets.push_back(m_result_sets[i]);
int rows = m_result_sets[i].records;
NdbResultSet* rs = m_result_sets[i].m_result_set;
int res = rs->nextResult();
switch(res){
case 1:
return 626;
case -1:
const NdbError err = pTrans->getNdbError();
ERR(err);
return (err.code > 0 ? err.code : NDBT_FAILED);
}
// A row found
switch(rows){
case 0:
return 4000;
default:
m_result_sets[i].records--;
break;
}
}
m_result_sets.clear();
return NDBT_OK; return NDBT_OK;
} }
...@@ -388,6 +421,35 @@ int HugoOperations::execute_NoCommit(Ndb* pNdb, AbortOption eao){ ...@@ -388,6 +421,35 @@ int HugoOperations::execute_NoCommit(Ndb* pNdb, AbortOption eao){
return NDBT_FAILED; return NDBT_FAILED;
return err.code; return err.code;
} }
for(int i = 0; i<m_result_sets.size(); i++){
m_executed_result_sets.push_back(m_result_sets[i]);
int rows = m_result_sets[i].records;
NdbResultSet* rs = m_result_sets[i].m_result_set;
int res = rs->nextResult();
switch(res){
case 1:
return 626;
case -1:
const NdbError err = pTrans->getNdbError();
ERR(err);
return (err.code > 0 ? err.code : NDBT_FAILED);
}
// A row found
switch(rows){
case 0:
return 4000;
default:
case 1:
break;
}
}
m_result_sets.clear();
return NDBT_OK; return NDBT_OK;
} }
...@@ -704,3 +766,33 @@ HugoOperations::indexUpdateRecord(Ndb*, ...@@ -704,3 +766,33 @@ HugoOperations::indexUpdateRecord(Ndb*,
} }
return NDBT_OK; return NDBT_OK;
} }
int
HugoOperations::scanReadRecords(Ndb* pNdb, NdbScanOperation::LockMode lm,
int records){
allocRows(records);
NdbScanOperation * pOp = pTrans->getNdbScanOperation(tab.getName());
if(!pOp)
return -1;
NdbResultSet * rs = pOp->readTuples(lm, 1, 1);
if(!rs){
return -1;
}
for(int a = 0; a<tab.getNoOfColumns(); a++){
if((rows[0]->attributeStore(a) =
pOp->getValue(tab.getColumn(a)->getName())) == 0) {
ERR(pTrans->getNdbError());
return NDBT_FAILED;
}
}
RsPair p = {rs, records};
m_result_sets.push_back(p);
return 0;
}
...@@ -820,15 +820,15 @@ void NDBT_TestSuite::execute(Ndb* ndb, const NdbDictionary::Table* pTab, ...@@ -820,15 +820,15 @@ void NDBT_TestSuite::execute(Ndb* ndb, const NdbDictionary::Table* pTab,
const NdbDictionary::Table* pTab2 = pDict->getTable(pTab->getName()); const NdbDictionary::Table* pTab2 = pDict->getTable(pTab->getName());
if (createTable == true){ if (createTable == true){
if (pTab2 != 0 && !pTab->equal(* pTab2)){ if(pTab2 != 0 && pDict->dropTable(pTab->getName()) != 0){
numTestsFail++; numTestsFail++;
numTestsExecuted++; numTestsExecuted++;
g_err << "ERROR0: Failed to create table " << pTab->getName() << endl; g_err << "ERROR0: Failed to drop table " << pTab->getName() << endl;
tests[t]->saveTestResult(pTab, FAILED_TO_CREATE); tests[t]->saveTestResult(pTab, FAILED_TO_CREATE);
continue; continue;
} }
if(pTab2 == 0 && pDict->createTable(* pTab) != 0){ if(pDict->createTable(* pTab) != 0){
numTestsFail++; numTestsFail++;
numTestsExecuted++; numTestsExecuted++;
g_err << "ERROR1: Failed to create table " << pTab->getName() g_err << "ERROR1: Failed to create table " << pTab->getName()
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment