ResultSet executeQuery() { // [START read_context_execute_query] // Rows without an explicit value for MarketingBudget will have a MarketingBudget equal to // null. ReadContext readContext = dbClient.singleUse(); ResultSet resultSet = readContext.executeQuery( Statement.of("SELECT SingerId, AlbumId, MarketingBudget, LastUpdateTime FROM Albums")); // [END read_context_execute_query] return resultSet; }
@Override public Void run(TransactionContext transaction) throws UserException { long rowCount = transaction.executeUpdate(Statement.of(INSERT_DML)); assertThat(rowCount).isEqualTo(DML_COUNT); throw new UserException("failing to commit"); } };
@Override public Long run(TransactionContext transaction) { long rowCount = 0; for (String stmt : stmts) { if (throwAbortOnce) { throwAbortOnce = false; throw SpannerExceptionFactory.newSpannerException( ErrorCode.ABORTED, "Abort in test"); } rowCount += transaction.executeUpdate(Statement.of(stmt)); } return rowCount; } };
ResultSetStats analyzeQuery() { // [START read_context_analyze_query] ReadContext rc = dbClient.singleUse(); ResultSet resultSet = rc.analyzeQuery( Statement.of("SELECT SingerId, AlbumId, MarketingBudget FROM Albums"), ReadContext.QueryAnalyzeMode.PROFILE); while (resultSet.next()) { // Discard the results. We're only processing because getStats() below requires it. resultSet.getCurrentRowAsStruct(); } ResultSetStats stats = resultSet.getStats(); // [END read_context_analyze_query] return stats; } }
@Override public Void run(TransactionContext transaction) { long rowCount = transaction.executeUpdate(Statement.of("UPDATE T SET v = v * 2 WHERE k = 'boo2';")); assertThat(rowCount).isEqualTo(1); assertThat(transaction.readRow("T", Key.of("boo2"), Arrays.asList("v")).getLong(0)) .isEqualTo(2 * 2); return null; } };
private static Struct queryRow(ReadContext ctx) { ResultSet resultSet = Statement.of("SELECT StringValue FROM TestTable").executeQuery(ctx); // TODO(user): Consider a library routine to consume a single row from a query. assertThat(resultSet.next()).isTrue(); Struct row = resultSet.getCurrentRowAsStruct(); assertThat(resultSet.next()).isFalse(); return row; }
@Test public void simple() { Struct row = execute(Statement.of("SELECT 1"), Type.int64()); assertThat(row.getLong(0)).isEqualTo(1); }
@Test public void basic() { String sql = "SELECT 1"; Statement stmt = Statement.of(sql); assertThat(stmt.getSql()).isEqualTo(sql); assertThat(stmt.getParameters()).isEmpty(); assertThat(stmt.toString()).isEqualTo(sql); reserializeAndAssert(stmt); }
@Test public void query() { try (ResultSet resultSet = client .singleUse() .executeQuery( Statement.of( "SELECT Key, Data, Fingerprint, Size FROM " + TABLE_NAME + " ORDER BY Key"))) { validate(resultSet); } }
@Override public Long run(TransactionContext transaction) { long rowCount = 0; for (final String stmt : stmts) { ResultSet resultSet = transaction.executeQuery(Statement.of(stmt)); assertThat(resultSet.next()).isFalse(); assertThat(resultSet.getStats()).isNotNull(); rowCount += resultSet.getStats().getRowCountExact(); } return rowCount; } };
@Test public void queryWithSmallPrefetchChunks() { try (ResultSet resultSet = client .singleUse() .executeQuery( Statement.of( "SELECT Key, Data, Fingerprint, Size FROM " + TABLE_NAME + " ORDER BY Key"), Options.prefetchChunks(1))) { validate(resultSet); } }
@Ignore // Not yet supported by the backend. @Test public void arrayOfStructNullElement() { Type structType = Type.struct(StructField.of("", Type.string()), StructField.of("", Type.int64())); Struct row = execute( Statement.of( "SELECT ARRAY(SELECT AS STRUCT 'a', 1" + " UNION ALL SELECT CAST (NULL AS STRUCT<string,int64>))"), Type.array(structType)); assertThat(row.isNull(0)).isFalse(); List<Struct> value = row.getStructList(0); assertThat(value.size()).isEqualTo(2); assertThat(value.get(0).getType()).isEqualTo(structType); assertThat(value.get(0).getString(0)).isEqualTo("a"); assertThat(value.get(0).getLong(1)).isEqualTo(1); assertThat(value.get(1)).isNull(); }
@Test public void query() { BitSet seenRows = new BitSet(numRows); TimestampBound bound = getRandomBound(); PartitionOptions partitionParams = getRandomPartitionOptions(); batchTxn = client.batchReadOnlyTransaction(bound); List<Partition> partitions = batchTxn.partitionQuery( partitionParams, Statement.of("SELECT Key, Data, Fingerprint, Size FROM " + TABLE_NAME)); BatchTransactionId txnID = batchTxn.getBatchTransactionId(); fetchAndValidateRows(partitions, txnID, seenRows); }
@Test public void arrayOfStructEmpty() { Type structType = Type.struct(StructField.of("", Type.string()), StructField.of("", Type.int64())); Struct row = execute( Statement.of("SELECT ARRAY(SELECT AS STRUCT * FROM (SELECT 'a', 1) WHERE 0 = 1)"), Type.array(structType)); assertThat(row.isNull(0)).isFalse(); List<Struct> value = row.getStructList(0); assertThat(value.size()).isEqualTo(0); }
@Test public void analyzePlan() { Statement statement = Statement.of("SELECT 1 AS column UNION ALL SELECT 2"); ResultSet resultSet = statement.analyzeQuery(client.singleUse(TimestampBound.strong()), QueryAnalyzeMode.PLAN); assertThat(resultSet.next()).isFalse(); assertThat(resultSet.getType()).isEqualTo(Type.struct(StructField.of("column", Type.int64()))); ResultSetStats receivedStats = resultSet.getStats(); assertThat(receivedStats).isNotNull(); assertThat(receivedStats.hasQueryPlan()).isTrue(); assertThat(receivedStats.hasQueryStats()).isFalse(); }
@Test public void badQuery() { expectedException.expect(isSpannerException(ErrorCode.INVALID_ARGUMENT)); expectedException.expectMessage("Unrecognized name: Apples"); execute(Statement.of("SELECT Apples AND Oranges"), Type.int64()); }
@Test public void analyzeProfile() { Statement statement = Statement.of("SELECT 1 AS column UNION ALL SELECT 2 AS column ORDER BY column"); ResultSet resultSet = statement.analyzeQuery(client.singleUse(TimestampBound.strong()), QueryAnalyzeMode.PROFILE); assertThat(resultSet.next()).isTrue(); assertThat(resultSet.getType()).isEqualTo(Type.struct(StructField.of("column", Type.int64()))); assertThat(resultSet.getLong(0)).isEqualTo(1); assertThat(resultSet.next()).isTrue(); assertThat(resultSet.getLong(0)).isEqualTo(2); assertThat(resultSet.next()).isFalse(); ResultSetStats receivedStats = resultSet.getStats(); assertThat(receivedStats).isNotNull(); assertThat(receivedStats.hasQueryPlan()).isTrue(); assertThat(receivedStats.hasQueryStats()).isTrue(); }
@Override public Void run(TransactionContext transaction) { // DML long rowCount = transaction.executeUpdate( Statement.of("INSERT INTO T (k, v) VALUES ('" + key1 + "', 1)")); assertThat(rowCount).isEqualTo(1); // Mutations transaction.buffer( Mutation.newInsertOrUpdateBuilder("T").set("K").to(key2).set("V").to(2).build()); return null; } };
@Ignore // Not yet supported by the backend. @Test public void arrayOfStructNull() { Type structType = Type.struct(StructField.of("", Type.string()), StructField.of("", Type.int64())); Struct row = execute( Statement.of("SELECT CAST (NULL AS ARRAY<STRUCT<string,int64>>)"), Type.array(structType)); assertThat(row.isNull(0)).isTrue(); }
@Test public void unboundParameter() { ResultSet resultSet = Statement.of("SELECT @v").executeQuery(client.singleUse(TimestampBound.strong())); expectedException.expect(isSpannerException(ErrorCode.INVALID_ARGUMENT)); expectedException.expectMessage("No parameter found for binding: v"); resultSet.next(); }