Skip to content

Seg fault in Native API  #122

@smkniazi

Description

@smkniazi

I get seg fault using the following API when aValue is greater in length of the column.

NdbOperation::equal(const char* anAttrName, const char* aValue)
NdbOperation::equal(const char* anAttrName, const char* aValue, Uint32 len)

Table def

CREATE TABLE `chartable` (                                            
  `id` char(5) NOT NULL,                                              
  `value` char(5) DEFAULT NULL,                                       
  PRIMARY KEY (`id`)                                                  
) ENGINE=ndbcluster DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
int main(int argc, char **argv) {
  char connection_string[] = "localhost:1186";
  Init(connection_string);

  Ndb *ndb_object  = nullptr;
  RS_Status status = GetNDBObject(ndb_connection, &ndb_object);

  ndb_object->setCatalogName("test");
  const NdbDictionary::Dictionary *dict = ndb_object->getDictionary();
  const NdbDictionary::Table *table     = dict->getTable("chartable");
  const NdbDictionary::Column *col      = table->getColumn("id");

  NdbTransaction *transaction = ndb_object->startTransaction(table);
  if (transaction == nullptr) {
    std::cout << "Tx Start failed" << std::endl;
  }

  NdbOperation *operation = transaction->getNdbOperation(table);
  if (operation == nullptr) {
    std::cout << "get operation failed" << std::endl;
  }
  operation->readTuple(NdbOperation::LM_CommittedRead);


  // char pk[col->getLength()];
  // for (int i = 0; i < col->getLength(); i++) {
    // pk[i] = 0;
  // }
  std::string pkstr = "000000000000000000000000000000000000000000";
  // std::memcpy(pk, pkstr.c_str(), pkstr.length());
    // std::cout << "mem copy workd" << std::endl;


  int ret = operation->equal("id", pkstr.c_str(), pkstr.length());
  if (ret != 0) {
    std::cout << "Op equal failed" << std::endl;
  }

  NdbRecAttr *val_rec = operation->getValue("value", NULL);

  ret = transaction->execute(NdbTransaction::Commit);
  if (ret != 0) {
    std::cout << "execute failed" << std::endl;
  }

  if (transaction->getNdbError().classification == NdbError::NoDataFound) {
    std::cout << "NOT FOUND" << std::endl;
  } else {
    std::cout << "data: " << val_rec->aRef() << std::endl;
  }
  ndb_object->closeTransaction(transaction);
  CloseNDBObject(&ndb_object);
  Shutdown();
  return 0;
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions