@Test
public void testUpsertSelectWithSequenceAndLargeDataSet() throws Exception {
long ts = nextTimestamp();
Properties props = new Properties();
props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts));
Connection conn = DriverManager.getConnection(getUrl(), props);
String ddl = "CREATE TABLE IF NOT EXISTS DUMMY_CURSOR_STORAGE ("
+ "ORGANIZATION_ID CHAR(15) NOT NULL, QUERY_ID CHAR(15) NOT NULL, CURSOR_ORDER BIGINT NOT NULL "
+ "CONSTRAINT MAIN_PK PRIMARY KEY (ORGANIZATION_ID, QUERY_ID, CURSOR_ORDER) "
+ ") SALT_BUCKETS = 64";
conn.createStatement().execute(ddl);
conn.createStatement().execute("CREATE TABLE DUMMY_SEQ_TEST_DATA (ORGANIZATION_ID CHAR(15) NOT NULL, k1 integer not null, v1 integer not null CONSTRAINT PK PRIMARY KEY (ORGANIZATION_ID, k1, v1) ) VERSIONS=1, SALT_BUCKETS=64");
conn.createStatement().execute("create sequence s cache " + Long.MAX_VALUE);
conn.close();
props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 10));
conn = DriverManager.getConnection(getUrl(), props);
for (int i = 0; i < 500000; i++) {
conn.createStatement().execute("upsert into DUMMY_SEQ_TEST_DATA values ('00Dxx0000001gEH'," + i + "," + i + ")");
}
conn.commit();
props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 15));
conn = DriverManager.getConnection(getUrl(), props);
conn.setAutoCommit(true);
conn.createStatement().execute("upsert into DUMMY_CURSOR_STORAGE select ORGANIZATION_ID, 'MyQueryId', next value for s FROM DUMMY_SEQ_TEST_DATA");
props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 20));
conn = DriverManager.getConnection(getUrl(), props);
ResultSet rs = conn.createStatement().executeQuery("select count(*) from DUMMY_CURSOR_STORAGE");
assertTrue(rs.next());
assertEquals(500000, rs.getLong(1));
conn.close();
props.setProperty(PhoenixRuntime.CURRENT_SCN_ATTRIB, Long.toString(ts + 25));
ResultSet rs2 = conn.createStatement().executeQuery("select cursor_order from DUMMY_CURSOR_STORAGE");
long seq = 1;
while (rs2.next()) {
assertEquals(seq, rs2.getLong(1));
seq++;
}
conn.close();
}