Commit 3a6ee28e authored by unknown's avatar unknown
Browse files

correct NAND/NOR scan operations, and add a test case for it.


ndb/src/ndbapi/NdbScanFilter.cpp:
  translate NAND/NOR into AND/OR, since AND/OR operations are all correct
ndb/test/include/NDBT_Test.hpp:
  add a new method executeOneCtx() in class NDBT_TestSuite, declare it
ndb/test/ndbapi/Makefile.am:
  Add a new test case: testScanFIlter.cpp to test/ndbapi/,
  thus modify the Makefile.am related to it
ndb/test/src/NDBT_Test.cpp:
  add a new method in class NDBT_TestSuite in order to adapt to 
  some customized test cases, because the default NDBT's test talbes
  and flow are fixed, if just modify related existing methods, it will
  influence other test cases in test/ndbapi/
ndb/test/ndbapi/testScanFilter.cpp:
  It's a test case for ndbapi scan filter, test for AND/OR/NAND/NOR scan operations.
parent 157ee7e6
Loading
Loading
Loading
Loading
+45 −1
Original line number Diff line number Diff line
@@ -41,7 +41,9 @@ class NdbScanFilterImpl {

  int m_label;
  State m_current;
  Uint32 m_negative;    //used for translating NAND/NOR to AND/OR, equal 0 or 1 
  Vector<State> m_stack;
  Vector<Uint32> m_stack2;    //to store info of m_negative
  NdbOperation * m_operation;
  Uint32 m_latestAttrib;

@@ -65,6 +67,7 @@ NdbScanFilter::NdbScanFilter(class NdbOperation * op)
  m_impl.m_label = 0;
  m_impl.m_latestAttrib = ~0;
  m_impl.m_operation = op;
  m_impl.m_negative = 0;
}

NdbScanFilter::~NdbScanFilter(){
@@ -74,18 +77,39 @@ NdbScanFilter::~NdbScanFilter(){
int
NdbScanFilter::begin(Group group){

  m_impl.m_stack2.push_back(m_impl.m_negative);
  switch(group){
  case NdbScanFilter::AND:
    INT_DEBUG(("Begin(AND)"));
    if(m_impl.m_negative == 1){
      group = NdbScanFilter::OR;
    }
    break;
  case NdbScanFilter::OR:
    INT_DEBUG(("Begin(OR)"));
    if(m_impl.m_negative == 1){
      group = NdbScanFilter::AND;
    }
    break;
  case NdbScanFilter::NAND:
    INT_DEBUG(("Begin(NAND)"));
    if(m_impl.m_negative == 0){
      group = NdbScanFilter::OR;
      m_impl.m_negative = 1; 
    }else{
      group = NdbScanFilter::AND;
      m_impl.m_negative = 0; 
    }
    break;
  case NdbScanFilter::NOR:
    INT_DEBUG(("Begin(NOR)"));
    if(m_impl.m_negative == 0){
      group = NdbScanFilter::AND;
      m_impl.m_negative = 1; 
    }else{
      group = NdbScanFilter::OR;
      m_impl.m_negative = 0; 
    }
    break;
  }

@@ -129,6 +153,13 @@ NdbScanFilter::begin(Group group){
int
NdbScanFilter::end(){

  if(m_impl.m_stack2.size() == 0){
    m_impl.m_operation->setErrorCodeAbort(4259);
    return -1;
  }
  m_impl.m_negative = m_impl.m_stack2.back();
  m_impl.m_stack2.erase(m_impl.m_stack2.size() - 1);

  switch(m_impl.m_current.m_group){
  case NdbScanFilter::AND:
    INT_DEBUG(("End(AND pc=%d)", m_impl.m_current.m_popCount));
@@ -150,6 +181,10 @@ NdbScanFilter::end(){
  }
  
  NdbScanFilterImpl::State tmp = m_impl.m_current;  
  if(m_impl.m_stack.size() == 0){
    m_impl.m_operation->setErrorCodeAbort(4259);
    return -1;
  }
  m_impl.m_current = m_impl.m_stack.back();
  m_impl.m_stack.erase(m_impl.m_stack.size() - 1);
  
@@ -395,7 +430,16 @@ NdbScanFilterImpl::cond_col_const(Interpreter::BinaryCondition op,
    return -1;
  }

  StrBranch2 branch = table3[op].m_branches[m_current.m_group];
  StrBranch2 branch;
  if(m_negative == 1){  //change NdbOperation to its negative
    if(m_current.m_group == NdbScanFilter::AND)
      branch = table3[op].m_branches[(Uint32)(m_current.m_group) + 1];
    if(m_current.m_group == NdbScanFilter::OR)
      branch = table3[op].m_branches[(Uint32)(m_current.m_group) - 1];
  }else{
    branch = table3[op].m_branches[(Uint32)(m_current.m_group)];
  }
  
  const NdbDictionary::Column * col = 
    m_operation->m_currentTable->getColumn(AttrId);
  
+6 −0
Original line number Diff line number Diff line
@@ -325,6 +325,12 @@ public:
  // supply argc and argv as parameters
  int execute(int, const char**);

  // NDBT's test tables are fixed and it always create 
  // and drop fixed table when execute, add this method 
  // in order to run CTX only and adapt to some new 
  // customized testsuite
  int executeOneCtx(Ndb_cluster_connection&,
		 const NdbDictionary::Table* ptab, const char* testname = NULL);

  // These function can be used from main in the test program 
  // to control the behaviour of the testsuite
+2 −0
Original line number Diff line number Diff line
@@ -39,6 +39,7 @@ testOperations \
testRestartGci \
testScan \
testInterpreter \
testScanFilter \
testScanInterpreter \
testScanPerf \
testSystemRestart \
@@ -83,6 +84,7 @@ testOperations_SOURCES = testOperations.cpp
testRestartGci_SOURCES = testRestartGci.cpp
testScan_SOURCES = testScan.cpp ScanFunctions.hpp
testInterpreter_SOURCES = testInterpreter.cpp
testScanFilter_SOURCES = testScanFilter.cpp
testScanInterpreter_SOURCES = testScanInterpreter.cpp ScanFilter.hpp ScanInterpretTest.hpp 
testScanPerf_SOURCES = testScanPerf.cpp
testSystemRestart_SOURCES = testSystemRestart.cpp
+851 −0

File added.

Preview size limit exceeded, changes collapsed.

+57 −0

File changed.

Preview size limit exceeded, changes collapsed.