/* This file is part of VoltDB.
* Copyright (C) 2008-2017 VoltDB Inc.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*/
package org.voltdb_testprocs.regressionsuites;
import java.util.Date;
import org.voltdb.ProcInfo;
import org.voltdb.SQLStmt;
import org.voltdb.VoltProcedure;
import org.voltdb.VoltTable;
@ProcInfo (
singlePartition = false
)
public class CurrentTimestampProcedure extends VoltProcedure {
public final SQLStmt insertStmt = new SQLStmt(
"INSERT INTO P_TIME (ID, C1) VALUES (?, ?);");
public final SQLStmt selectStmt = new SQLStmt(
"SELECT ID, C1, T_NOW, T_CURRENT_TIME, NOW, CURRENT_TIMESTAMP FROM P_TIME ORDER BY 1;");
public final SQLStmt updateStmt = new SQLStmt(
"UPDATE P_TIME SET C1 = ?, T1 = NOW, T2 = CURRENT_TIMESTAMP WHERE C1 = ?;");
public final SQLStmt groupbyStmt = new SQLStmt(
"SELECT T1, T2, COUNT(*) FROM P_TIME GROUP BY T1, T2;");
private Date time = null;
private long epsilonMicros = 100 * 1000;
public long run() {
time = new Date();
long starttime = time.getTime()*1000;
// TEST TIMESTAMP function in DEFAULT and Select.
voltQueueSQL(insertStmt, 1, 1);
voltQueueSQL(insertStmt, 2, 1);
voltQueueSQL(insertStmt, 3, 1);
voltQueueSQL(insertStmt, 4, 1);
voltExecuteSQL();
voltQueueSQL(selectStmt);
VoltTable vt = voltExecuteSQL()[0];
time = new Date();
long endtime = time.getTime()*1000;
long timeValue = -1;
long id = 0;
if(vt.getRowCount() != 4) {
throw new VoltAbortException("bad row count");
}
while(vt.advanceRow()) {
++id;
if (vt.getLong(0) != id) {
throw new VoltAbortException("bad row ID " + id);
}
if (vt.getLong(1) != 1) {
throw new VoltAbortException("bad row C1");
}
if (timeValue == -1) {
timeValue = vt.getTimestampAsLong(2);
}
if (vt.getTimestampAsLong(2) != timeValue || vt.getTimestampAsLong(3) != timeValue ||
vt.getTimestampAsLong(4) != timeValue || vt.getTimestampAsLong(5) != timeValue) {
throw new VoltAbortException("bad inconsistent current_timestamp value from different partitions");
}
}
if( Math.abs(timeValue - starttime) > epsilonMicros) {
throw new VoltAbortException(
"bad current_timestamp, off too much from previous system time. Difference(usec): " +
(timeValue - starttime));
}
if( timeValue > endtime + epsilonMicros) {
throw new VoltAbortException(
"bad current_timestamp, off too much from later system time. Difference(usec): " +
(endtime - timeValue));
}
// Test Update
voltQueueSQL(updateStmt, 2, 1);
voltQueueSQL(groupbyStmt);
vt = voltExecuteSQL()[1];
assert(vt.advanceRow());
if(vt.getRowCount() != 1) {
throw new VoltAbortException("bad row count");
}
if (vt.getTimestampAsLong(0) != timeValue || vt.getTimestampAsLong(1) != timeValue) {
throw new VoltAbortException("bad inconsistent current_timestamp value from different partitions");
}
if (vt.getLong(2) != 4) {
throw new VoltAbortException("bad group by row count");
}
if( Math.abs(timeValue - starttime) > epsilonMicros) {
throw new VoltAbortException(
"bad current_timestamp, off too much from previous system time. Difference(usec): " +
(timeValue - starttime));
}
if( timeValue > endtime + epsilonMicros) {
throw new VoltAbortException(
"bad current_timestamp, off too much from later system time. Difference(usec): " +
(endtime - timeValue));
}
return 1;
}
}