public VoltTable[] doWork(SQLStmt select, SQLStmt insert, long cid) {
   if (select != null) { // use select / insert
     // Get row for cid and copy to new table.
     voltQueueSQL(select, cid);
     VoltTable[] results = voltExecuteSQL();
     VoltTable data = results[0];
     if (data.getRowCount() != 1) {
       throw new VoltAbortException("Failed to find cid that should exist: cid=" + cid);
     }
     data.advanceRow();
     long rcid = data.getLong(0);
     if (rcid != cid) {
       throw new VoltAbortException(
           "Failed to find cid does not match. (" + rcid + ":" + cid + ")");
     }
     long txnid = data.getLong(1);
     long rowid = data.getLong(2);
     voltQueueSQL(insert, rcid, txnid, rowid);
     return voltExecuteSQL();
   } else { // use insert into
     voltQueueSQL(insert, cid);
     VoltTable[] results = voltExecuteSQL();
     VoltTable data = results[0];
     int cnt = (int) data.fetchRow(0).getLong(0);
     if (cnt != 1) {
       throw new VoltAbortException(
           "incorrect number of inserted rows=" + cnt + " for cid=" + cid);
     }
     return results;
   }
 }
  public VoltTable[] run(
      short w_id,
      byte d_id,
      double h_amount,
      short c_w_id,
      byte c_d_id,
      byte[] c_last,
      TimestampType timestamp)
      throws VoltAbortException {
    voltQueueSQL(getCustomersByLastName, c_last, c_d_id, c_w_id);
    final VoltTable customers = voltExecuteSQL()[0];
    final int namecnt = customers.getRowCount();
    if (namecnt == 0) {
      String c_lastString = null;
      try {
        c_lastString = new String(c_last, "UTF-8");
      } catch (UnsupportedEncodingException e) {
        throw new RuntimeException(e);
      }
      throw new VoltAbortException(
          "paymentByCustomerNameC: no customers with last name: "
              + c_lastString
              + " in warehouse: "
              + c_w_id
              + " and in district "
              + c_d_id);
    }

    final int index = (namecnt - 1) / 2;
    final VoltTableRow customer = customers.fetchRow(index);
    final int c_id = (int) customer.getLong(C_ID_IDX);
    return processPayment(w_id, d_id, c_w_id, c_d_id, c_id, h_amount, customer, timestamp);
  }
  public VoltTable[] getOrderStatus(short w_id, byte d_id, int c_id, VoltTable customer) {
    voltQueueSQL(getLastOrder, w_id, d_id, c_id);
    final VoltTable order = voltExecuteSQL()[0];

    final long o_id = order.fetchRow(0).getLong(O_ID_IDX);
    voltQueueSQL(getOrderLines, w_id, o_id, d_id);
    final VoltTable orderLines = voltExecuteSQL()[0];

    return new VoltTable[] {customer, order, orderLines};
  }
Beispiel #4
0
 /** sums the contents of a latency bucket table. */
 private long[] latencySummaryHelper(VoltTable vt) {
   long sums[] = new long[20];
   for (int i = 0; i < vt.getRowCount(); i++) {
     VoltTableRow row = vt.fetchRow(i);
     // 20  buckets
     for (int c = 0; c < 20; c++) {
       // 7 ignored header columns
       sums[c] += row.getLong(c + 7);
     }
   }
   return sums;
 }
    @Override
    public void clientCallback(ClientResponse response) throws Exception {
      // Track the result of the operation (Success, Failure, Payload traffic...)
      if (response.getStatus() == ClientResponse.SUCCESS) {
        final VoltTable pairData = response.getResults()[0];
        // Cache miss (Key does not exist)
        if (pairData.getRowCount() == 0) {
          missedGets.incrementAndGet();
        } else {
          final PayloadProcessor.Pair pair =
              processor.retrieveFromStore(
                  pairData.fetchRow(0).getString(0), pairData.fetchRow(0).getVarbinary(1));
          successfulGets.incrementAndGet();
          if (rand < config.multisingleratio) successfulGetsMPT.incrementAndGet();
          else successfulGetsMPF.incrementAndGet();

          networkGetData.addAndGet(pair.getStoreValueLength());
          rawGetData.addAndGet(pair.getRawValueLength());
        }
      } else {
        failedGets.incrementAndGet();
      }
    }
    @Override
    public void clientCallback(ClientResponse response) throws Exception {
      // Track the result of the operation (Success, Failure, Payload traffic...)
      if (response.getStatus() == ClientResponse.SUCCESS) {
        successfulPuts.incrementAndGet();
        if (rand < config.multisingleratio) successfulPutsMPT.incrementAndGet();
        else successfulPutsMPF.incrementAndGet();

        final VoltTable pairData = response.getResults()[0];
        final VoltTableRow tablerow = pairData.fetchRow(0);
        final long counter = tablerow.getLong(0);
        hashMap.put(thisPair.Key, counter);
      } else {
        failedPuts.incrementAndGet();
      }
      networkPutData.addAndGet(storeValueLength);
      rawPutData.addAndGet(rawValueLength);
    }
Beispiel #7
0
  /**
   * Queries all the tables present in default database and load them into 'tables' map.
   *
   * @param theTables the tables
   */
  @Override
  protected void openInternal(final Map<Base36, VoltDBTable> theTables) {

    theTables.clear();
    final VoltTable[] results;
    try {
      results = backend.client().callProcedure("@SystemCatalog", "TABLES").getResults();
      for (final VoltTable node : results) {
        int count = 0;
        while (node.advanceRow()) {
          final VoltTableRow row = node.fetchRow(count++);
          final String tName = row.getString("TABLE_NAME");
          theTables.put(Base36.get(tName.toLowerCase()), new VoltDBTable(this, tName));
        }
      }
    } catch (final Exception e) {
      throw new DBException("Error Opening Database: " + theTables, e);
    }
  }
Beispiel #8
0
  public long run(String key, long by, byte increment) {
    final int now = Shared.init(this, key);

    voltQueueSQL(check, key, now);
    VoltTable checkResult = voltExecuteSQL()[1];
    if (checkResult.getRowCount() == 0) return VoltType.NULL_BIGINT;

    try {
      final byte[] oldRawData = checkResult.fetchRow(0).getVarbinary(1);
      final long old_value = Long.parseLong(new String(oldRawData, "UTF-8"));
      long value = old_value + (increment == 1 ? by : -by);
      if (value < 0l) // Underflow protection: per protocol, this should be an unsigned long...
      value = 0l;
      final byte[] newRawData = Long.toString(value).getBytes("UTF-8");
      voltQueueSQL(update, newRawData, key);
      voltExecuteSQL(true);
      return old_value;
    } catch (Exception x) {
      throw new VoltAbortException(x);
    }
  }
 @Override
 public void clientCallback(ClientResponse response) throws Exception {
   if (response.getStatus() == ClientResponse.SUCCESS) {
     final VoltTable pairData = response.getResults()[0];
     if (pairData.getRowCount() != 0) {
       successfulPutCount.incrementAndGet();
       final long hashMapCount = hashMap.get(key);
       final long dbCount = ByteBuffer.wrap(pairData.fetchRow(0).getVarbinary(1)).getLong(0);
       if (dbCount < hashMapCount) {
         missingPutCount.incrementAndGet();
         incorrectPutCount.addAndGet(hashMapCount - dbCount);
         System.out.printf(
             "ERROR: Key %s: count in db '%d' is less than client expected '%d'\n",
             key.replaceAll("\\s", ""), dbCount, hashMapCount);
       }
     }
   } else {
     System.out.print("ERROR: Bad Client response from Volt");
     System.exit(1);
   }
 }
  public VoltTable[] run(short w_id, byte d_id, byte[] c_last) {
    voltQueueSQL(getCustomersByLastName, w_id, d_id, c_last);
    VoltTable customers = voltExecuteSQL()[0];

    // Get the midpoint customer's id
    final int namecnt = customers.getRowCount();
    final int index = (namecnt - 1) / 2;
    final VoltTableRow customer = customers.fetchRow(index);
    final long c_id = customer.getLong(C_ID_IDX);

    // Build an VoltTable with a single customer row
    final VoltTable customerResultTable = result_template.clone(1024);
    customerResultTable.addRow(
        c_id,
        customer.getStringAsBytes(1),
        customer.getStringAsBytes(2),
        customer.getStringAsBytes(3),
        customer.getDouble(4));

    // Do the rest of the work
    return getOrderStatus(w_id, d_id, c_id, customerResultTable);
  }
Beispiel #11
0
  public long run(String key, byte[] value) {
    final int now = baseInit(key);

    voltQueueSQL(check, key, now);
    VoltTable checkResult = voltExecuteSQL()[1];
    if (checkResult.getRowCount() == 0) return Result.NOT_STORED;

    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    try {
      byte[] old = checkResult.fetchRow(0).getVarbinary(1);
      stream.write(value, 0, value.length);
      stream.write(old, 0, old.length);
      voltQueueSQL(update, stream.toByteArray(), key);
      voltExecuteSQL(true);
      return Result.STORED;
    } catch (Exception x) {
      throw new VoltAbortException(x);
    } finally {
      try {
        stream.close();
      } catch (Exception cx) {
      }
    }
  }
  public VoltTable[] run(long rowid, long ignore) {
    @SuppressWarnings("deprecation")
    long txid = getVoltPrivateRealTransactionIdDontUseMe();

    // Critical for proper determinism: get a cluster-wide consistent Random instance
    Random rand = new Random(txid);

    // Check if the record exists first
    voltQueueSQL(check, rowid);

    // Grab resultset for possibly existing record
    VoltTable item = voltExecuteSQL()[0];

    // If the record exist perform an update or delete
    if (item.getRowCount() > 0) {
      // Randomly decide whether to delete (or update) the record
      if (rand.nextBoolean()) {
        voltQueueSQL(delete, rowid);
        // Export deletion
        VoltTableRow row = item.fetchRow(0);
        voltQueueSQL(
            export,
            txid,
            rowid,
            row.get(1, VoltType.TINYINT),
            row.get(2, VoltType.TINYINT),
            row.get(3, VoltType.TINYINT),
            row.get(4, VoltType.SMALLINT),
            row.get(5, VoltType.SMALLINT),
            row.get(6, VoltType.INTEGER),
            row.get(7, VoltType.INTEGER),
            row.get(8, VoltType.BIGINT),
            row.get(9, VoltType.BIGINT),
            row.get(10, VoltType.TIMESTAMP),
            row.get(11, VoltType.TIMESTAMP),
            row.get(12, VoltType.FLOAT),
            row.get(13, VoltType.FLOAT),
            row.get(14, VoltType.DECIMAL),
            row.get(15, VoltType.DECIMAL),
            row.get(16, VoltType.STRING),
            row.get(17, VoltType.STRING),
            row.get(18, VoltType.STRING),
            row.get(19, VoltType.STRING),
            row.get(20, VoltType.STRING),
            row.get(21, VoltType.STRING));
      } else {
        SampleRecord record = new SampleRecord(rowid, rand);
        voltQueueSQL(
            update,
            record.type_null_tinyint,
            record.type_not_null_tinyint,
            record.type_null_smallint,
            record.type_not_null_smallint,
            record.type_null_integer,
            record.type_not_null_integer,
            record.type_null_bigint,
            record.type_not_null_bigint,
            record.type_null_timestamp,
            record.type_not_null_timestamp,
            record.type_null_float,
            record.type_not_null_float,
            record.type_null_decimal,
            record.type_not_null_decimal,
            record.type_null_varchar25,
            record.type_not_null_varchar25,
            record.type_null_varchar128,
            record.type_not_null_varchar128,
            record.type_null_varchar1024,
            record.type_not_null_varchar1024,
            rowid);
      }
    } else {
      // Insert a new record
      SampleRecord record = new SampleRecord(rowid, rand);
      voltQueueSQL(
          insert,
          rowid,
          record.rowid_group,
          record.type_null_tinyint,
          record.type_not_null_tinyint,
          record.type_null_smallint,
          record.type_not_null_smallint,
          record.type_null_integer,
          record.type_not_null_integer,
          record.type_null_bigint,
          record.type_not_null_bigint,
          record.type_null_timestamp,
          record.type_not_null_timestamp,
          record.type_null_float,
          record.type_not_null_float,
          record.type_null_decimal,
          record.type_not_null_decimal,
          record.type_null_varchar25,
          record.type_not_null_varchar25,
          record.type_null_varchar128,
          record.type_not_null_varchar128,
          record.type_null_varchar1024,
          record.type_not_null_varchar1024);
    }

    // Execute last SQL batch
    voltExecuteSQL(true);

    // Retun to caller
    return null;
  }
Beispiel #13
0
  @Override
  public void run() {
    // ratio of upsert for @Load*Table
    final float upsertratio = 0.50F;
    // ratio of upsert to an existing table for @Load*Table
    final float upserthitratio = 0.20F;

    CopyAndDeleteDataTask cdtask = new CopyAndDeleteDataTask();
    cdtask.start();
    try {
      while (m_shouldContinue.get()) {
        // 1 in 3 gets copied and then deleted after leaving some data
        byte shouldCopy = (byte) (m_random.nextInt(3) == 0 ? 1 : 0);
        byte upsertMode = (byte) (m_random.nextFloat() < upsertratio ? 1 : 0);
        byte upsertHitMode =
            (byte) ((upsertMode != 0) && (m_random.nextFloat() < upserthitratio) ? 1 : 0);

        CountDownLatch latch = new CountDownLatch(batchSize);
        final ArrayList<Long> lcpDelQueue = new ArrayList<Long>();

        // try to insert batchSize random rows
        for (int i = 0; i < batchSize; i++) {
          m_table.clearRowData();
          m_permits.acquire();
          long p = Math.abs(r.nextLong());
          m_table.addRow(p, p, Calendar.getInstance().getTimeInMillis());
          boolean success = false;
          if (!m_isMP) {
            Object rpartitionParam =
                TheHashinator.valueToBytes(
                    m_table.fetchRow(0).get(m_partitionedColumnIndex, VoltType.BIGINT));
            if (upsertHitMode
                != 0) { // for test upsert an existing row, insert it and then upsert same row
              // again.
              success =
                  client.callProcedure(
                      new InsertCallback(latch, p, shouldCopy),
                      m_procName,
                      rpartitionParam,
                      m_tableName,
                      (byte) 1,
                      m_table);
            }
            success =
                client.callProcedure(
                    new InsertCallback(latch, p, shouldCopy),
                    m_procName,
                    rpartitionParam,
                    m_tableName,
                    (byte) 1,
                    m_table);
          } else {
            if (upsertHitMode != 0) {
              success =
                  client.callProcedure(
                      new InsertCallback(latch, p, shouldCopy),
                      m_procName,
                      m_tableName,
                      (byte) 1,
                      m_table);
            }
            success =
                client.callProcedure(
                    new InsertCallback(latch, p, shouldCopy),
                    m_procName,
                    m_tableName,
                    (byte) 1,
                    m_table);
          }
          // Ad if successfully queued but remove if proc fails.
          if (success) {
            if (shouldCopy != 0) {
              lcpDelQueue.add(p);
            } else {
              onlyDelQueue.add(p);
            }
          }
        }
        // Wait for all @Load{SP|MP}Done
        latch.await();
        cpDelQueue.addAll(lcpDelQueue);
        long nextRowCount = 0;
        try {
          nextRowCount = TxnId2Utils.getRowCount(client, m_tableName);
        } catch (Exception e) {
          hardStop("getrowcount exception", e);
        }
        // if no progress, throttle a bit
        if (nextRowCount == currentRowCount.get()) {
          Thread.sleep(1000);
        }
        if (onlyDelQueue.size() > 0 && m_shouldContinue.get()) {
          List<Long> workList = new ArrayList<Long>();
          onlyDelQueue.drainTo(workList);
          CountDownLatch odlatch = new CountDownLatch(workList.size());
          for (Long lcid : workList) {
            client.callProcedure(new DeleteCallback(odlatch, 1), m_onlydelprocName, lcid);
          }
          odlatch.await();
        }
      }
      // Any accumulated in p/mp tables are left behind.
    } catch (Exception e) {
      // on exception, log and end the thread, but don't kill the process
      log.error(
          "LoadTableLoader failed a procedure call for table "
              + m_tableName
              + " and the thread will now stop.",
          e);
    } finally {
      cdtask.shutdown();
      try {
        cdtask.join();
      } catch (InterruptedException ex) {
        log.error("CopyDelete Task was stopped.", ex);
      }
    }
  }
Beispiel #14
0
  public VoltTable[] run(long zip) throws VoltAbortException {
    Date timestamp = new Date();

    // create a District, Warehouse, and 4 Customers (multiple, since we
    // want to test for correct behavior of paymentByCustomerName.

    final double initialYTD = 15241.45;
    voltQueueSQL(
        insertDistrict,
        7L,
        3L,
        "A District",
        "Street Addy",
        "meh",
        "westerfield",
        "BA",
        "99999",
        .0825,
        initialYTD,
        21L);
    // check that a district was inserted
    long resultsl = voltExecuteSQL()[0].asScalarLong();
    assert (resultsl == 1);

    voltQueueSQL(
        insertWarehouse,
        3L,
        "EZ Street WHouse",
        "Headquarters",
        "77 Mass. Ave.",
        "Cambridge",
        "AZ",
        "12938",
        .1234,
        initialYTD);
    // check that a warehouse was inserted
    resultsl = voltExecuteSQL()[0].asScalarLong();
    assert (resultsl == 1);

    final double initialBalance = 15.75;
    voltQueueSQL(
        insertCustomer,
        C_ID,
        D_ID,
        W_ID,
        "I",
        "Be",
        "lastname",
        "Place",
        "Place2",
        "BiggerPlace",
        "AL",
        "91083",
        "(193) 099 - 9082",
        new Date(),
        "BC",
        19298943.12,
        .13,
        initialBalance,
        initialYTD,
        0L,
        15L,
        "Some History");
    // check that a customer was inserted
    resultsl = voltExecuteSQL()[0].asScalarLong();
    assert (resultsl == 1);
    voltQueueSQL(
        insertCustomer,
        C_ID + 1,
        D_ID,
        W_ID,
        "We",
        "Represent",
        "Customer",
        "Random Department",
        "Place2",
        "BiggerPlace",
        "AL",
        "13908",
        "(913) 909 - 0928",
        new Date(),
        "GC",
        19298943.12,
        .13,
        initialBalance,
        initialYTD,
        1L,
        15L,
        "Some History");
    // check that a customer was inserted
    resultsl = voltExecuteSQL()[0].asScalarLong();
    assert (resultsl == 1);
    voltQueueSQL(
        insertCustomer,
        C_ID + 2,
        D_ID,
        W_ID,
        "Who",
        "Is",
        "Customer",
        "Receiving",
        "450 Mass F.X.",
        "BiggerPlace",
        "CI",
        "91083",
        "(541) 931 - 0928",
        new Date(),
        "GC",
        19899324.21,
        .13,
        initialBalance,
        initialYTD,
        2L,
        15L,
        "Some History");
    // check that a customer was inserted
    resultsl = voltExecuteSQL()[0].asScalarLong();
    assert (resultsl == 1);
    voltQueueSQL(
        insertCustomer,
        C_ID + 3,
        D_ID,
        W_ID,
        "ICanBe",
        "",
        "Customer",
        "street",
        "place",
        "BiggerPlace",
        "MA",
        "91083",
        "(913) 909 - 0928",
        new Date(),
        "GC",
        19298943.12,
        .13,
        initialBalance,
        initialYTD,
        3L,
        15L,
        "Some History");
    // check that a customer was inserted
    resultsl = voltExecuteSQL()[0].asScalarLong();
    assert (resultsl == 1);

    // long d_id, long w_id, double h_amount, String c_last, long c_w_id,
    // long c_d_id
    final double paymentAmount = 500.25;

    // VoltTable[] results = client.callProcedure("paymentByCustomerName", W_ID,
    //      D_ID, paymentAmount, W_ID, D_ID, "Customer", new Date());
    // assertEquals(3, results.length);

    // being proc
    voltQueueSQL(getCustomersByLastName, "Customer", D_ID, W_ID);
    final VoltTable customers = voltExecuteSQL()[0];
    final int namecnt = customers.getRowCount();
    if (namecnt == 0) {
      throw new VoltAbortException(
          "no customers with last name: "
              + "Customer"
              + " in warehouse: "
              + W_ID
              + " and in district "
              + D_ID);
    }

    try {
      System.out.println("PAYMENT FOUND CUSTOMERS: " + customers.toString());
    } catch (Exception e) {
      e.printStackTrace();
    }

    final int index = (namecnt - 1) / 2;
    final VoltTableRow customer = customers.fetchRow(index);
    final long c_id = customer.getLong(C_ID_IDX);

    voltQueueSQL(getWarehouse, W_ID);
    voltQueueSQL(getDistrict, W_ID, D_ID);
    final VoltTable[] results = voltExecuteSQL();
    final VoltTable warehouse = results[0];
    final VoltTable district = results[1];

    try {
      System.out.println("WAREHOUSE PRE: " + warehouse.toString());
    } catch (Exception e) {
      e.printStackTrace();
    }

    voltQueueSQL(getWarehouses);
    VoltTable warehouses = voltExecuteSQL()[0];
    try {
      System.out.println("WAREHOUSE PRE: " + warehouses.toString());
    } catch (Exception e) {
      e.printStackTrace();
    }

    voltQueueSQL(updateWarehouseBalance, paymentAmount, W_ID);
    voltQueueSQL(updateDistrictBalance, paymentAmount, W_ID, D_ID);
    voltExecuteSQL();

    voltQueueSQL(getWarehouses);
    warehouses = voltExecuteSQL()[0];
    try {
      System.out.println("WAREHOUSE PRE: " + warehouses.toString());
    } catch (Exception e) {
      e.printStackTrace();
    }

    // do stuff to extract district and warehouse info.

    // customer info
    final byte[] c_first = customer.getStringAsBytes(C_FIRST_IDX);
    final byte[] c_middle = customer.getStringAsBytes(C_MIDDLE_IDX);
    final byte[] c_last = customer.getStringAsBytes(C_LAST_IDX);
    final byte[] c_street_1 = customer.getStringAsBytes(C_STREET_1_IDX);
    final byte[] c_street_2 = customer.getStringAsBytes(C_STREET_2_IDX);
    final byte[] c_city = customer.getStringAsBytes(C_CITY_IDX);
    final byte[] c_state = customer.getStringAsBytes(C_STATE_IDX);
    final byte[] c_zip = customer.getStringAsBytes(C_ZIP_IDX);
    final byte[] c_phone = customer.getStringAsBytes(C_PHONE_IDX);
    final TimestampType c_since = customer.getTimestampAsTimestamp(C_SINCE_IDX);
    final byte[] c_credit = customer.getStringAsBytes(C_CREDIT_IDX);
    final double c_credit_lim = customer.getDouble(C_CREDIT_LIM_IDX);
    final double c_discount = customer.getDouble(C_DISCOUNT_IDX);
    final double c_balance = customer.getDouble(C_BALANCE_IDX) - paymentAmount;
    final double c_ytd_payment = customer.getDouble(C_YTD_PAYMENT_IDX) + paymentAmount;
    final long c_payment_cnt = customer.getLong(C_PAYMENT_CNT_IDX) + 1;
    byte[] c_data;
    if (Arrays.equals(c_credit, Constants.BAD_CREDIT_BYTES)) {
      c_data = customer.getStringAsBytes(C_DATA_IDX);
      byte[] newData =
          (c_id + " " + D_ID + " " + W_ID + " " + D_ID + " " + W_ID + " " + paymentAmount + "|")
              .getBytes();

      int newLength = newData.length + c_data.length;
      if (newLength > Constants.MAX_C_DATA) {
        newLength = Constants.MAX_C_DATA;
      }
      ByteBuilder builder = new ByteBuilder(newLength);

      int minLength = newLength;
      if (newData.length < minLength) minLength = newData.length;
      builder.append(newData, 0, minLength);

      int remaining = newLength - minLength;
      builder.append(c_data, 0, remaining);
      c_data = builder.array();
      voltQueueSQL(
          updateBCCustomer, c_balance, c_ytd_payment, c_payment_cnt, c_data, W_ID, D_ID, c_id);
    } else {
      c_data = new byte[0];
      voltQueueSQL(updateGCCustomer, c_balance, c_ytd_payment, c_payment_cnt, W_ID, D_ID, c_id);
    }

    // Concatenate w_name, four spaces, d_name
    byte[] w_name = warehouse.fetchRow(0).getStringAsBytes(W_NAME_IDX);
    final byte[] FOUR_SPACES = {' ', ' ', ' ', ' '};
    byte[] d_name = district.fetchRow(0).getStringAsBytes(D_NAME_IDX);
    ByteBuilder builder = new ByteBuilder(w_name.length + FOUR_SPACES.length + d_name.length);
    builder.append(w_name);
    builder.append(FOUR_SPACES);
    builder.append(d_name);
    byte[] h_data = builder.array();

    // Create the history record
    voltQueueSQL(insertHistory, c_id, D_ID, W_ID, D_ID, W_ID, timestamp, paymentAmount, h_data);
    voltExecuteSQL();

    // TPC-C 2.5.3.3: Must display the following fields:
    // W_ID, D_ID, C_ID, C_D_ID, C_W_ID, W_STREET_1, W_STREET_2, W_CITY, W_STATE, W_ZIP,
    // D_STREET_1, D_STREET_2, D_CITY, D_STATE, D_ZIP, C_FIRST, C_MIDDLE, C_LAST, C_STREET_1,
    // C_STREET_2, C_CITY, C_STATE, C_ZIP, C_PHONE, C_SINCE, C_CREDIT, C_CREDIT_LIM,
    // C_DISCOUNT, C_BALANCE, the first 200 characters of C_DATA (only if C_CREDIT = "BC"),
    // H_AMOUNT, and H_DATE.

    // Return the entire warehouse and district tuples. The client provided:
    // w_id, d_id, c_d_id, c_w_id, h_amount, h_data.
    // Build a table for the rest
    final VoltTable misc = misc_template.clone(8192);
    misc.addRow(
        c_id,
        c_first,
        c_middle,
        c_last,
        c_street_1,
        c_street_2,
        c_city,
        c_state,
        c_zip,
        c_phone,
        c_since,
        c_credit,
        c_credit_lim,
        c_discount,
        c_balance,
        c_data);

    // Hand back all the warehouse, district, and customer data
    VoltTable[] resultsX = new VoltTable[] {warehouse, district, misc};

    // resume test code

    // check that the middle "Customer" was returned
    assert ((C_ID + 1) == (resultsX[2].fetchRow(0).getLong("c_id")));
    assert ("".equals(resultsX[2].fetchRow(0).getString("c_data")));

    // Verify that both warehouse, district and customer were updated
    // correctly
    // VoltTable[] allTables = client.callProcedure("SelectAll");
    voltQueueSQL(getWarehouses);
    warehouses = voltExecuteSQL()[0];
    try {
      System.out.println("WAREHOUSE POST: " + warehouses.toString());
    } catch (Exception e) {
      e.printStackTrace();
    }

    assert (1 == warehouses.getRowCount());
    double amt1 = initialYTD + paymentAmount;
    double amt2 = warehouses.fetchRow(0).getDouble("W_YTD");

    assert (amt1 == amt2);

    voltQueueSQL(getDistricts);
    VoltTable districts = voltExecuteSQL()[0];
    assert (1 == districts.getRowCount());
    assert ((initialYTD + paymentAmount) == districts.fetchRow(0).getDouble("D_YTD"));

    voltQueueSQL(getCustomers);
    VoltTable customersX = voltExecuteSQL()[0];
    assert (4 == customersX.getRowCount());
    assert ((C_ID + 1) == customersX.fetchRow(1).getLong("C_ID"));
    assert ((initialBalance - paymentAmount) == customersX.fetchRow(1).getDouble("C_BALANCE"));
    assert ((initialYTD + paymentAmount) == customersX.fetchRow(1).getDouble("C_YTD_PAYMENT"));
    assert (2 == customersX.fetchRow(1).getLong("C_PAYMENT_CNT"));

    return null;
  }