YugabyteDB (2.13.0.0-b42, bfc6a6643e7399ac8a0e81d06a3ee6d6571b33ab)

Coverage Report

Created: 2022-03-09 17:30

/Users/deen/code/yugabyte-db/src/yb/integration-tests/cassandra_cpp_driver-test.cc
Line
Count
Source (jump to first uncovered line)
1
// Copyright (c) YugaByte, Inc.
2
//
3
// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
4
// in compliance with the License.  You may obtain a copy of the License at
5
//
6
// http://www.apache.org/licenses/LICENSE-2.0
7
//
8
// Unless required by applicable law or agreed to in writing, software distributed under the License
9
// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
10
// or implied.  See the License for the specific language governing permissions and limitations
11
// under the License.
12
//
13
14
#include <tuple>
15
16
#include "yb/client/client.h"
17
#include "yb/client/table_info.h"
18
19
#include "yb/gutil/strings/join.h"
20
#include "yb/gutil/strings/strip.h"
21
#include "yb/gutil/strings/substitute.h"
22
23
#include "yb/integration-tests/backfill-test-util.h"
24
#include "yb/integration-tests/cql_test_util.h"
25
#include "yb/integration-tests/external_mini_cluster-itest-base.h"
26
27
#include "yb/tools/yb-admin_client.h"
28
29
#include "yb/util/backoff_waiter.h"
30
#include "yb/util/jsonreader.h"
31
#include "yb/util/metrics.h"
32
#include "yb/util/random_util.h"
33
#include "yb/util/size_literals.h"
34
#include "yb/util/status_log.h"
35
#include "yb/util/test_thread_holder.h"
36
#include "yb/util/tsan_util.h"
37
38
using namespace std::literals;
39
40
using std::string;
41
using std::vector;
42
using std::ostringstream;
43
using std::unique_ptr;
44
using std::tuple;
45
using std::get;
46
47
using rapidjson::Value;
48
using strings::Substitute;
49
50
using yb::CoarseBackoffWaiter;
51
using yb::YQLDatabase;
52
using yb::client::TableHandle;
53
using yb::client::TransactionManager;
54
using yb::client::YBTableName;
55
using yb::client::YBTableInfo;
56
using yb::client::YBqlWriteOpPtr;
57
using yb::client::YBSessionPtr;
58
59
METRIC_DECLARE_entity(server);
60
METRIC_DECLARE_histogram(handler_latency_yb_client_write_remote);
61
METRIC_DECLARE_histogram(handler_latency_yb_client_read_remote);
62
METRIC_DECLARE_histogram(handler_latency_yb_client_write_local);
63
METRIC_DECLARE_histogram(handler_latency_yb_client_read_local);
64
65
METRIC_DECLARE_histogram(handler_latency_yb_cqlserver_SQLProcessor_InsertStmt);
66
METRIC_DECLARE_histogram(handler_latency_yb_cqlserver_SQLProcessor_UseStmt);
67
68
DECLARE_int64(external_mini_cluster_max_log_bytes);
69
DECLARE_int32(TEST_slowdown_backfill_job_deletion_ms);
70
71
namespace yb {
72
73
namespace util {
74
75
template<class T>
76
string type_name() { return "unknown"; } // COMPILATION ERROR: Specialize it for your type!
77
// Supported types - get type name:
78
112
template<> string type_name<string>() { return "text"; }
79
25
template<> string type_name<cass_bool_t>() { return "boolean"; }
80
9
template<> string type_name<cass_float_t>() { return "float"; }
81
40
template<> string type_name<cass_double_t>() { return "double"; }
82
74
template<> string type_name<cass_int32_t>() { return "int"; }
83
13
template<> string type_name<cass_int64_t>() { return "bigint"; }
84
14
template<> string type_name<CassandraJson>() { return "jsonb"; }
85
86
} // namespace util
87
88
//------------------------------------------------------------------------------
89
90
class CppCassandraDriverTest : public ExternalMiniClusterITestBase {
91
 public:
92
53
  void SetUp() override {
93
53
    ASSERT_NO_FATALS(ExternalMiniClusterITestBase::SetUp());
94
95
53
    LOG(INFO) << "Starting YB ExternalMiniCluster...";
96
    // Start up with 3 (default) tablet servers.
97
53
    ASSERT_NO_FATALS(StartCluster(ExtraTServerFlags(), ExtraMasterFlags(), 3, NumMasters()));
98
99
53
    std::vector<std::string> hosts;
100
212
    for (size_t i = 0; i < cluster_->num_tablet_servers(); ++i) {
101
159
      hosts.push_back(cluster_->tablet_server(i)->bind_host());
102
159
    }
103
53
    driver_.reset(new CppCassandraDriver(
104
53
        hosts, cluster_->tablet_server(0)->cql_rpc_port(), UsePartitionAwareRouting::kTrue));
105
106
    // Create and use default keyspace.
107
53
    auto deadline = CoarseMonoClock::now() + 15s;
108
53
    while (CoarseMonoClock::now() < deadline) {
109
53
      auto session = EstablishSession();
110
53
      if (session.ok()) {
111
53
        session_ = std::move(*session);
112
53
        break;
113
53
      }
114
53
    }
115
53
  }
116
117
53
  void SetUpCluster(ExternalMiniClusterOptions* opts) override {
118
53
    ASSERT_NO_FATALS(ExternalMiniClusterITestBase::SetUpCluster(opts));
119
120
53
    opts->bind_to_unique_loopback_addresses = true;
121
53
    opts->use_same_ts_ports = true;
122
53
  }
123
124
52
  void TearDown() override {
125
52
    ExternalMiniClusterITestBase::cluster_->AssertNoCrashes();
126
127
    // Close the session before we delete the driver.
128
52
    session_.Reset();
129
52
    driver_.reset();
130
52
    LOG(INFO) << "Stopping YB ExternalMiniCluster...";
131
52
    ExternalMiniClusterITestBase::TearDown();
132
52
  }
133
134
20
  virtual std::vector<std::string> ExtraTServerFlags() {
135
20
    return {};
136
20
  }
137
138
25
  virtual std::vector<std::string> ExtraMasterFlags() {
139
25
    return {};
140
25
  }
141
142
52
  virtual int NumMasters() {
143
52
    return 1;
144
52
  }
145
146
 protected:
147
100
  Result<CassandraSession> EstablishSession() {
148
74
    auto session = VERIFY_RESULT(driver_->CreateSession());
149
74
    RETURN_NOT_OK(SetupSession(&session));
150
73
    return session;
151
74
  }
152
153
74
  CHECKED_STATUS CreateDefaultKeyspace(CassandraSession* session) {
154
74
    if (!keyspace_created_.load(std::memory_order_acquire)) {
155
53
      RETURN_NOT_OK(session->ExecuteQuery("CREATE KEYSPACE IF NOT EXISTS test"));
156
53
      keyspace_created_.store(true, std::memory_order_release);
157
53
    }
158
74
    return Status::OK();
159
74
  }
160
161
72
  virtual CHECKED_STATUS SetupSession(CassandraSession* session) {
162
72
    RETURN_NOT_OK(CreateDefaultKeyspace(session));
163
72
    return session->ExecuteQuery("USE test");
164
72
  }
165
166
  unique_ptr<CppCassandraDriver> driver_;
167
  CassandraSession session_;
168
  std::atomic<bool> keyspace_created_{false};
169
};
170
171
YB_STRONGLY_TYPED_BOOL(PKOnlyIndex);
172
YB_STRONGLY_TYPED_BOOL(IsUnique);
173
YB_STRONGLY_TYPED_BOOL(IncludeAllColumns);
174
YB_STRONGLY_TYPED_BOOL(UserEnforced);
175
176
class CppCassandraDriverTestIndex : public CppCassandraDriverTest {
177
 public:
178
28
  std::vector<std::string> ExtraTServerFlags() override {
179
28
    return {
180
28
        "--allow_index_table_read_write=true",
181
28
        Format("--client_read_write_timeout_ms=$0", 10000 * kTimeMultiplier),
182
28
        "--index_backfill_upperbound_for_user_enforced_txn_duration_ms=12000",
183
28
        "--yb_client_admin_operation_timeout_sec=90",
184
28
    };
185
28
  }
186
187
27
  std::vector<std::string> ExtraMasterFlags() override {
188
27
    return {
189
27
        "--TEST_slowdown_backfill_alter_table_rpcs_ms=200",
190
27
        "--TEST_slowdown_backfill_job_deletion_ms=1000",
191
27
        "--disable_index_backfill=false",
192
27
        "--enable_load_balancing=false",
193
27
        "--index_backfill_rpc_max_delay_ms=1000",
194
27
        "--index_backfill_rpc_max_retries=10",
195
27
        "--index_backfill_rpc_timeout_ms=6000",
196
27
        "--retrying_ts_rpc_max_delay_ms=1000",
197
27
        "--unresponsive_ts_rpc_retry_limit=10",
198
27
    };
199
27
  }
200
201
 protected:
202
  friend Result<IndexPermissions> TestBackfillCreateIndexTableSimple(
203
      CppCassandraDriverTestIndex* test, bool deferred, IndexPermissions target_permission);
204
205
  friend void TestBackfillIndexTable(CppCassandraDriverTestIndex* test,
206
                                     PKOnlyIndex is_pk_only, IsUnique is_unique,
207
                                     IncludeAllColumns include_primary_key,
208
                                     UserEnforced user_enforced);
209
210
  friend void DoTestCreateUniqueIndexWithOnlineWrites(
211
      CppCassandraDriverTestIndex* test, bool delete_before_insert);
212
213
  void TestUniqueIndexCommitOrder(bool commit_txn1, bool use_txn2);
214
};
215
216
class CppCassandraDriverTestIndexSlow : public CppCassandraDriverTestIndex {
217
 public:
218
20
  std::vector<std::string> ExtraTServerFlags() override {
219
20
    auto flags = CppCassandraDriverTestIndex::ExtraTServerFlags();
220
20
    flags.push_back("--TEST_slowdown_backfill_by_ms=150");
221
20
    flags.push_back("--num_concurrent_backfills_allowed=1");
222
20
    return flags;
223
20
  }
224
225
19
  std::vector<std::string> ExtraMasterFlags() override {
226
19
    auto flags = CppCassandraDriverTestIndex::ExtraMasterFlags();
227
19
    flags.push_back("--TEST_slowdown_backfill_alter_table_rpcs_ms=200");
228
19
    return flags;
229
19
  }
230
};
231
232
class CppCassandraDriverTestIndexSlower : public CppCassandraDriverTestIndex {
233
 public:
234
1
  std::vector<std::string> ExtraTServerFlags() override {
235
1
    auto flags = CppCassandraDriverTestIndex::ExtraTServerFlags();
236
1
    flags.push_back("--TEST_slowdown_backfill_by_ms=3000");
237
1
    flags.push_back("--ycql_num_tablets=1");
238
1
    flags.push_back("--ysql_num_tablets=1");
239
1
    flags.push_back("--raft_heartbeat_interval_ms=200");
240
1
    return flags;
241
1
  }
242
243
1
  std::vector<std::string> ExtraMasterFlags() override {
244
1
    auto flags = CppCassandraDriverTestIndex::ExtraMasterFlags();
245
1
    flags.push_back("--TEST_slowdown_backfill_alter_table_rpcs_ms=3000");
246
1
    flags.push_back("--vmodule=backfill_index=3");
247
1
    return flags;
248
1
  }
249
};
250
251
class CppCassandraDriverTestIndexMultipleChunks : public CppCassandraDriverTestIndexSlow {
252
 public:
253
2
  std::vector<std::string> ExtraTServerFlags() override {
254
2
    auto flags = CppCassandraDriverTestIndexSlow::ExtraTServerFlags();
255
2
    flags.push_back("--TEST_backfill_paging_size=2");
256
2
    return flags;
257
2
  }
258
};
259
260
class CppCassandraDriverTestIndexMultipleChunksWithLeaderMoves
261
    : public CppCassandraDriverTestIndexMultipleChunks {
262
 public:
263
1
  std::vector<std::string> ExtraMasterFlags() override {
264
1
    auto flags = CppCassandraDriverTestIndex::ExtraMasterFlags();
265
1
    flags.push_back("--enable_load_balancing=true");
266
1
    flags.push_back("--index_backfill_rpc_max_retries=0");
267
    // We do not want backfill to fail because of any throttling.
268
1
    flags.push_back("--index_backfill_rpc_timeout_ms=180000");
269
1
    return flags;
270
1
  }
271
272
1
  std::vector<std::string> ExtraTServerFlags() override {
273
1
    auto flags = CppCassandraDriverTestIndex::ExtraTServerFlags();
274
1
    flags.push_back("--backfill_index_rate_rows_per_sec=10");
275
1
    flags.push_back("--backfill_index_write_batch_size=2");
276
1
    return flags;
277
1
  }
278
279
1
  void SetUp() override {
280
1
    CppCassandraDriverTestIndex::SetUp();
281
1
    thread_holder_.AddThreadFunctor([this] {
282
1
      const auto kNumTServers = cluster_->num_tablet_servers();
283
1
      constexpr auto kSleepTimeMs = 5000;
284
3
      for (int i = 0; !thread_holder_.stop_flag(); i++) {
285
2
        const auto tserver_id = i % kNumTServers;
286
2
        ASSERT_OK(cluster_->AddTServerToLeaderBlacklist(
287
2
            cluster_->master(), cluster_->tablet_server(tserver_id)));
288
2
        SleepFor(MonoDelta::FromMilliseconds(kSleepTimeMs));
289
2
        ASSERT_OK(cluster_->ClearBlacklist(cluster_->master()));
290
2
      }
291
1
    });
292
1
  }
293
294
1
  void TearDown() override {
295
1
    thread_holder_.Stop();
296
1
    CppCassandraDriverTestIndex::TearDown();
297
1
  }
298
299
 private:
300
  TestThreadHolder thread_holder_;
301
};
302
303
class CppCassandraDriverTestIndexSlowBackfill : public CppCassandraDriverTestIndex {
304
 public:
305
1
  std::vector<std::string> ExtraMasterFlags() override {
306
1
    auto flags = CppCassandraDriverTestIndex::ExtraMasterFlags();
307
    // We expect backfill to be slow, so give it more time.
308
1
    flags.push_back("--index_backfill_rpc_max_retries=100");
309
1
    return flags;
310
1
  }
311
312
1
  std::vector<std::string> ExtraTServerFlags() override {
313
1
    auto flags = CppCassandraDriverTestIndex::ExtraTServerFlags();
314
1
    flags.push_back(Format("--backfill_index_rate_rows_per_sec=$0", kMaxBackfillRatePerSec));
315
1
    flags.push_back("--backfill_index_write_batch_size=1");
316
1
    flags.push_back("--num_concurrent_backfills_allowed=1");
317
1
    return flags;
318
1
  }
319
320
 protected:
321
  const size_t kMaxBackfillRatePerSec = 10;
322
};
323
324
class CppCassandraDriverTestUserEnforcedIndex : public CppCassandraDriverTestIndexSlow {
325
 public:
326
2
  std::vector<std::string> ExtraMasterFlags() override {
327
2
    auto flags = CppCassandraDriverTestIndexSlow::ExtraMasterFlags();
328
2
    flags.push_back("--disable_index_backfill_for_non_txn_tables=false");
329
2
    return flags;
330
2
  }
331
332
2
  std::vector<std::string> ExtraTServerFlags() override {
333
2
    auto flags = CppCassandraDriverTestIndexSlow::ExtraTServerFlags();
334
2
    flags.push_back(Format("--client_read_write_timeout_ms=$0", 10000 * kTimeMultiplier));
335
2
    flags.push_back(
336
2
        "--index_backfill_upperbound_for_user_enforced_txn_duration_ms=12000");
337
2
    return flags;
338
2
  }
339
};
340
341
class CppCassandraDriverTestIndexNonResponsiveTServers : public CppCassandraDriverTestIndexSlow {
342
 public:
343
1
  std::vector<std::string> ExtraMasterFlags() override {
344
1
    return {
345
1
        "--disable_index_backfill=false",
346
1
        "--enable_load_balancing=false",
347
1
        "--ycql_num_tablets=18",
348
1
        "--ysql_num_tablets=18",
349
        // Really aggressive timeouts.
350
1
        "--index_backfill_rpc_max_retries=1",
351
1
        "--index_backfill_rpc_timeout_ms=1",
352
1
        "--index_backfill_rpc_max_delay_ms=1"};
353
1
  }
354
};
355
356
//------------------------------------------------------------------------------
357
358
class Metrics {
359
 public:
360
19
  Metrics(const Metrics&) = default;
361
362
  explicit Metrics(const ExternalMiniCluster& cluster, bool cql_metrics)
363
10
      : cluster_(cluster), cql_metrics_(cql_metrics) {}
364
365
10
  void reset() {
366
24
    for (auto& elem : values_) {
367
24
      elem.second = 0;
368
24
    }
369
10
  }
370
371
10
  void load() {
372
10
    reset();
373
40
    for (size_t i = 0; i < cluster_.num_tablet_servers(); ++i) {
374
72
      for (auto& proto : prototypes_) {
375
72
        int64_t metric = 0;
376
72
        load_value(cluster_, cql_metrics_, i, proto.second, &metric);
377
72
        values_[proto.first] += metric;
378
72
      }
379
30
    }
380
10
  }
381
382
9
  int64_t get(const string& name) const {
383
9
    auto it = values_.find(name);
384
9
    DCHECK(it != values_.end());
385
9
    return it->second;
386
9
  }
387
388
5
  Metrics& operator +=(const Metrics& m) {
389
12
    for (auto& elem : values_) {
390
12
      auto it = m.values_.find(elem.first);
391
12
      DCHECK(it != m.values_.end());
392
12
      elem.second += it->second;
393
12
    }
394
5
    return *this;
395
5
  }
396
397
5
  Metrics operator -() const {
398
5
    Metrics m(*this);
399
12
    for (auto& elem : m.values_) {
400
12
      elem.second = -elem.second;
401
12
    }
402
5
    return m;
403
5
  }
404
405
0
  Metrics& operator -=(const Metrics& m) {
406
0
    return *this += -m;
407
0
  }
408
409
0
  Metrics operator +(const Metrics& m) const {
410
0
    return Metrics(*this) += m;
411
0
  }
412
413
5
  Metrics operator -(const Metrics& m) const {
414
5
    return Metrics(*this) += -m;
415
5
  }
416
417
5
  string ToString() const {
418
5
    string s;
419
12
    for (auto& elem : values_) {
420
7
      s += (s.empty() ? "" : ", ") + Format("$0=$1", elem.first, elem.second);
421
12
    }
422
5
    return s;
423
5
  }
424
425
  static void load_value(
426
      const ExternalMiniCluster& cluster, bool cql_metric, size_t ts_index,
427
72
      const MetricPrototype* metric_proto, int64_t* value) {
428
72
    const ExternalTabletServer& ts = *CHECK_NOTNULL(cluster.tablet_server(ts_index));
429
72
    const HostPort host_port = cql_metric ?
430
48
        HostPort(ts.bind_host(), ts.cql_http_port()) : ts.bound_http_hostport();
431
48
    const char* entity_id = cql_metric ? "yb.cqlserver" : "yb.tabletserver";
432
72
    const auto result = ts.GetInt64MetricFromHost(
433
72
        host_port, &METRIC_ENTITY_server, entity_id, CHECK_NOTNULL(metric_proto), "total_count");
434
435
72
    if (!result.ok()) {
436
0
      LOG(ERROR) << "Failed to get metric " << metric_proto->name() << " from TS"
437
0
          << ts_index << ": " << host_port << " with error " << result.status();
438
0
    }
439
72
    ASSERT_OK(result);
440
72
    *CHECK_NOTNULL(value) = *result;
441
72
  }
442
443
 protected:
444
24
  void add_proto(const string& name, const MetricPrototype* proto) {
445
24
    prototypes_[name] = proto;
446
24
    values_[name] = 0;
447
24
  }
448
449
 private:
450
  const ExternalMiniCluster& cluster_;
451
  const bool cql_metrics_;
452
453
  map<string, const MetricPrototype*> prototypes_;
454
  map<string, int64_t> values_;
455
};
456
457
5
std::ostream& operator <<(std::ostream& s, const Metrics& m) {
458
5
  return s << m.ToString();
459
5
}
460
461
struct IOMetrics : public Metrics {
462
0
  explicit IOMetrics(const Metrics& m) : Metrics(m) {}
463
464
2
  explicit IOMetrics(const ExternalMiniCluster& cluster) : Metrics(cluster, false) {
465
2
    add_proto("remote_write", &METRIC_handler_latency_yb_client_write_remote);
466
2
    add_proto("remote_read", &METRIC_handler_latency_yb_client_read_remote);
467
2
    add_proto("local_write", &METRIC_handler_latency_yb_client_write_local);
468
2
    add_proto("local_read", &METRIC_handler_latency_yb_client_read_local);
469
2
    load();
470
2
  }
471
};
472
473
struct CQLMetrics : public Metrics {
474
4
  explicit CQLMetrics(const Metrics& m) : Metrics(m) {}
475
476
8
  explicit CQLMetrics(const ExternalMiniCluster& cluster) : Metrics(cluster, true) {
477
8
    add_proto("insert_count", &METRIC_handler_latency_yb_cqlserver_SQLProcessor_InsertStmt);
478
8
    add_proto("use_count", &METRIC_handler_latency_yb_cqlserver_SQLProcessor_UseStmt);
479
8
    load();
480
8
  }
481
};
482
483
//------------------------------------------------------------------------------
484
485
template <typename... ColumnsTypes>
486
class TestTable {
487
 public:
488
  typedef vector<string> StringVec;
489
  typedef tuple<ColumnsTypes...> ColumnsTuple;
490
491
  CHECKED_STATUS CreateTable(
492
      CassandraSession* session, const string& table, const StringVec& columns,
493
      const StringVec& keys, bool transactional = false,
494
52
      const MonoDelta& timeout = 60s) {
495
52
    table_name_ = table;
496
52
    column_names_ = columns;
497
52
    key_names_ = keys;
498
499
57
    for (string& k : key_names_) {
500
57
      TrimString(&k, "()"); // Cut parentheses if available.
501
57
    }
502
503
52
    auto deadline = CoarseMonoClock::now() + timeout;
504
52
    CoarseBackoffWaiter waiter(deadline, 2500ms * kTimeMultiplier);
505
52
    for (;;) {
506
52
      const std::string query = create_table_str(table, columns, keys, transactional);
507
52
      auto result = session->ExecuteQuery(query);
508
52
      if (result.ok() || CoarseMonoClock::now() >= deadline) {
509
52
        return result;
510
52
      }
511
0
      WARN_NOT_OK(result, "Create table failed");
512
0
      waiter.Wait();
513
0
    }
514
52
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE11cass_bool_tfdixS7_EE11CreateTableEPNS_16CassandraSessionERKS7_RKNS1_6vectorIS7_NS5_IS7_EEEESI_bRKNS_9MonoDeltaE
Line
Count
Source
494
1
      const MonoDelta& timeout = 60s) {
495
1
    table_name_ = table;
496
1
    column_names_ = columns;
497
1
    key_names_ = keys;
498
499
1
    for (string& k : key_names_) {
500
1
      TrimString(&k, "()"); // Cut parentheses if available.
501
1
    }
502
503
1
    auto deadline = CoarseMonoClock::now() + timeout;
504
1
    CoarseBackoffWaiter waiter(deadline, 2500ms * kTimeMultiplier);
505
1
    for (;;) {
506
1
      const std::string query = create_table_str(table, columns, keys, transactional);
507
1
      auto result = session->ExecuteQuery(query);
508
1
      if (result.ok() || CoarseMonoClock::now() >= deadline) {
509
1
        return result;
510
1
      }
511
0
      WARN_NOT_OK(result, "Create table failed");
512
0
      waiter.Wait();
513
0
    }
514
1
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_13CassandraJsonEEE11CreateTableEPNS_16CassandraSessionERKS7_RKNS1_6vectorIS7_NS5_IS7_EEEESI_bRKNS_9MonoDeltaE
Line
Count
Source
494
2
      const MonoDelta& timeout = 60s) {
495
2
    table_name_ = table;
496
2
    column_names_ = columns;
497
2
    key_names_ = keys;
498
499
2
    for (string& k : key_names_) {
500
2
      TrimString(&k, "()"); // Cut parentheses if available.
501
2
    }
502
503
2
    auto deadline = CoarseMonoClock::now() + timeout;
504
2
    CoarseBackoffWaiter waiter(deadline, 2500ms * kTimeMultiplier);
505
2
    for (;;) {
506
2
      const std::string query = create_table_str(table, columns, keys, transactional);
507
2
      auto result = session->ExecuteQuery(query);
508
2
      if (result.ok() || CoarseMonoClock::now() >= deadline) {
509
2
        return result;
510
2
      }
511
0
      WARN_NOT_OK(result, "Create table failed");
512
0
      waiter.Wait();
513
0
    }
514
2
  }
_ZN2yb9TestTableIJiNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEEE11CreateTableEPNS_16CassandraSessionERKS7_RKNS1_6vectorIS7_NS5_IS7_EEEESH_bRKNS_9MonoDeltaE
Line
Count
Source
494
14
      const MonoDelta& timeout = 60s) {
495
14
    table_name_ = table;
496
14
    column_names_ = columns;
497
14
    key_names_ = keys;
498
499
14
    for (string& k : key_names_) {
500
14
      TrimString(&k, "()"); // Cut parentheses if available.
501
14
    }
502
503
14
    auto deadline = CoarseMonoClock::now() + timeout;
504
14
    CoarseBackoffWaiter waiter(deadline, 2500ms * kTimeMultiplier);
505
14
    for (;;) {
506
14
      const std::string query = create_table_str(table, columns, keys, transactional);
507
14
      auto result = session->ExecuteQuery(query);
508
14
      if (result.ok() || CoarseMonoClock::now() >= deadline) {
509
14
        return result;
510
14
      }
511
0
      WARN_NOT_OK(result, "Create table failed");
512
0
      waiter.Wait();
513
0
    }
514
14
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES7_S7_EE11CreateTableEPNS_16CassandraSessionERKS7_RKNS1_6vectorIS7_NS5_IS7_EEEESH_bRKNS_9MonoDeltaE
Line
Count
Source
494
10
      const MonoDelta& timeout = 60s) {
495
10
    table_name_ = table;
496
10
    column_names_ = columns;
497
10
    key_names_ = keys;
498
499
10
    for (string& k : key_names_) {
500
10
      TrimString(&k, "()"); // Cut parentheses if available.
501
10
    }
502
503
10
    auto deadline = CoarseMonoClock::now() + timeout;
504
10
    CoarseBackoffWaiter waiter(deadline, 2500ms * kTimeMultiplier);
505
10
    for (;;) {
506
10
      const std::string query = create_table_str(table, columns, keys, transactional);
507
10
      auto result = session->ExecuteQuery(query);
508
10
      if (result.ok() || CoarseMonoClock::now() >= deadline) {
509
10
        return result;
510
10
      }
511
0
      WARN_NOT_OK(result, "Create table failed");
512
0
      waiter.Wait();
513
0
    }
514
10
  }
_ZN2yb9TestTableIJiNS_13CassandraJsonEEE11CreateTableEPNS_16CassandraSessionERKNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEERKNS5_6vectorISB_NS9_ISB_EEEESI_bRKNS_9MonoDeltaE
Line
Count
Source
494
1
      const MonoDelta& timeout = 60s) {
495
1
    table_name_ = table;
496
1
    column_names_ = columns;
497
1
    key_names_ = keys;
498
499
1
    for (string& k : key_names_) {
500
1
      TrimString(&k, "()"); // Cut parentheses if available.
501
1
    }
502
503
1
    auto deadline = CoarseMonoClock::now() + timeout;
504
1
    CoarseBackoffWaiter waiter(deadline, 2500ms * kTimeMultiplier);
505
1
    for (;;) {
506
1
      const std::string query = create_table_str(table, columns, keys, transactional);
507
1
      auto result = session->ExecuteQuery(query);
508
1
      if (result.ok() || CoarseMonoClock::now() >= deadline) {
509
1
        return result;
510
1
      }
511
0
      WARN_NOT_OK(result, "Create table failed");
512
0
      waiter.Wait();
513
0
    }
514
1
  }
_ZN2yb9TestTableIJiiEE11CreateTableEPNS_16CassandraSessionERKNSt3__112basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEERKNS4_6vectorISA_NS8_ISA_EEEESH_bRKNS_9MonoDeltaE
Line
Count
Source
494
7
      const MonoDelta& timeout = 60s) {
495
7
    table_name_ = table;
496
7
    column_names_ = columns;
497
7
    key_names_ = keys;
498
499
7
    for (string& k : key_names_) {
500
7
      TrimString(&k, "()"); // Cut parentheses if available.
501
7
    }
502
503
7
    auto deadline = CoarseMonoClock::now() + timeout;
504
7
    CoarseBackoffWaiter waiter(deadline, 2500ms * kTimeMultiplier);
505
7
    for (;;) {
506
7
      const std::string query = create_table_str(table, columns, keys, transactional);
507
7
      auto result = session->ExecuteQuery(query);
508
7
      if (result.ok() || CoarseMonoClock::now() >= deadline) {
509
7
        return result;
510
7
      }
511
0
      WARN_NOT_OK(result, "Create table failed");
512
0
      waiter.Wait();
513
0
    }
514
7
  }
_ZN2yb9TestTableIJ11cass_bool_tiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEiS8_EE11CreateTableEPNS_16CassandraSessionERKS8_RKNS2_6vectorIS8_NS6_IS8_EEEESI_bRKNS_9MonoDeltaE
Line
Count
Source
494
4
      const MonoDelta& timeout = 60s) {
495
4
    table_name_ = table;
496
4
    column_names_ = columns;
497
4
    key_names_ = keys;
498
499
8
    for (string& k : key_names_) {
500
8
      TrimString(&k, "()"); // Cut parentheses if available.
501
8
    }
502
503
4
    auto deadline = CoarseMonoClock::now() + timeout;
504
4
    CoarseBackoffWaiter waiter(deadline, 2500ms * kTimeMultiplier);
505
4
    for (;;) {
506
4
      const std::string query = create_table_str(table, columns, keys, transactional);
507
4
      auto result = session->ExecuteQuery(query);
508
4
      if (result.ok() || CoarseMonoClock::now() >= deadline) {
509
4
        return result;
510
4
      }
511
0
      WARN_NOT_OK(result, "Create table failed");
512
0
      waiter.Wait();
513
0
    }
514
4
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEdEE11CreateTableEPNS_16CassandraSessionERKS7_RKNS1_6vectorIS7_NS5_IS7_EEEESH_bRKNS_9MonoDeltaE
Line
Count
Source
494
1
      const MonoDelta& timeout = 60s) {
495
1
    table_name_ = table;
496
1
    column_names_ = columns;
497
1
    key_names_ = keys;
498
499
1
    for (string& k : key_names_) {
500
1
      TrimString(&k, "()"); // Cut parentheses if available.
501
1
    }
502
503
1
    auto deadline = CoarseMonoClock::now() + timeout;
504
1
    CoarseBackoffWaiter waiter(deadline, 2500ms * kTimeMultiplier);
505
1
    for (;;) {
506
1
      const std::string query = create_table_str(table, columns, keys, transactional);
507
1
      auto result = session->ExecuteQuery(query);
508
1
      if (result.ok() || CoarseMonoClock::now() >= deadline) {
509
1
        return result;
510
1
      }
511
0
      WARN_NOT_OK(result, "Create table failed");
512
0
      waiter.Wait();
513
0
    }
514
1
  }
_ZN2yb9TestTableIJidEE11CreateTableEPNS_16CassandraSessionERKNSt3__112basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEERKNS4_6vectorISA_NS8_ISA_EEEESH_bRKNS_9MonoDeltaE
Line
Count
Source
494
1
      const MonoDelta& timeout = 60s) {
495
1
    table_name_ = table;
496
1
    column_names_ = columns;
497
1
    key_names_ = keys;
498
499
1
    for (string& k : key_names_) {
500
1
      TrimString(&k, "()"); // Cut parentheses if available.
501
1
    }
502
503
1
    auto deadline = CoarseMonoClock::now() + timeout;
504
1
    CoarseBackoffWaiter waiter(deadline, 2500ms * kTimeMultiplier);
505
1
    for (;;) {
506
1
      const std::string query = create_table_str(table, columns, keys, transactional);
507
1
      auto result = session->ExecuteQuery(query);
508
1
      if (result.ok() || CoarseMonoClock::now() >= deadline) {
509
1
        return result;
510
1
      }
511
0
      WARN_NOT_OK(result, "Create table failed");
512
0
      waiter.Wait();
513
0
    }
514
1
  }
_ZN2yb9TestTableIJxdEE11CreateTableEPNS_16CassandraSessionERKNSt3__112basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEERKNS4_6vectorISA_NS8_ISA_EEEESH_bRKNS_9MonoDeltaE
Line
Count
Source
494
1
      const MonoDelta& timeout = 60s) {
495
1
    table_name_ = table;
496
1
    column_names_ = columns;
497
1
    key_names_ = keys;
498
499
1
    for (string& k : key_names_) {
500
1
      TrimString(&k, "()"); // Cut parentheses if available.
501
1
    }
502
503
1
    auto deadline = CoarseMonoClock::now() + timeout;
504
1
    CoarseBackoffWaiter waiter(deadline, 2500ms * kTimeMultiplier);
505
1
    for (;;) {
506
1
      const std::string query = create_table_str(table, columns, keys, transactional);
507
1
      auto result = session->ExecuteQuery(query);
508
1
      if (result.ok() || CoarseMonoClock::now() >= deadline) {
509
1
        return result;
510
1
      }
511
0
      WARN_NOT_OK(result, "Create table failed");
512
0
      waiter.Wait();
513
0
    }
514
1
  }
_ZN2yb9TestTableIJ11cass_bool_tdEE11CreateTableEPNS_16CassandraSessionERKNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEERKNS5_6vectorISB_NS9_ISB_EEEESI_bRKNS_9MonoDeltaE
Line
Count
Source
494
1
      const MonoDelta& timeout = 60s) {
495
1
    table_name_ = table;
496
1
    column_names_ = columns;
497
1
    key_names_ = keys;
498
499
1
    for (string& k : key_names_) {
500
1
      TrimString(&k, "()"); // Cut parentheses if available.
501
1
    }
502
503
1
    auto deadline = CoarseMonoClock::now() + timeout;
504
1
    CoarseBackoffWaiter waiter(deadline, 2500ms * kTimeMultiplier);
505
1
    for (;;) {
506
1
      const std::string query = create_table_str(table, columns, keys, transactional);
507
1
      auto result = session->ExecuteQuery(query);
508
1
      if (result.ok() || CoarseMonoClock::now() >= deadline) {
509
1
        return result;
510
1
      }
511
0
      WARN_NOT_OK(result, "Create table failed");
512
0
      waiter.Wait();
513
0
    }
514
1
  }
_ZN2yb9TestTableIJfdEE11CreateTableEPNS_16CassandraSessionERKNSt3__112basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEERKNS4_6vectorISA_NS8_ISA_EEEESH_bRKNS_9MonoDeltaE
Line
Count
Source
494
1
      const MonoDelta& timeout = 60s) {
495
1
    table_name_ = table;
496
1
    column_names_ = columns;
497
1
    key_names_ = keys;
498
499
1
    for (string& k : key_names_) {
500
1
      TrimString(&k, "()"); // Cut parentheses if available.
501
1
    }
502
503
1
    auto deadline = CoarseMonoClock::now() + timeout;
504
1
    CoarseBackoffWaiter waiter(deadline, 2500ms * kTimeMultiplier);
505
1
    for (;;) {
506
1
      const std::string query = create_table_str(table, columns, keys, transactional);
507
1
      auto result = session->ExecuteQuery(query);
508
1
      if (result.ok() || CoarseMonoClock::now() >= deadline) {
509
1
        return result;
510
1
      }
511
0
      WARN_NOT_OK(result, "Create table failed");
512
0
      waiter.Wait();
513
0
    }
514
1
  }
_ZN2yb9TestTableIJddEE11CreateTableEPNS_16CassandraSessionERKNSt3__112basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEERKNS4_6vectorISA_NS8_ISA_EEEESH_bRKNS_9MonoDeltaE
Line
Count
Source
494
1
      const MonoDelta& timeout = 60s) {
495
1
    table_name_ = table;
496
1
    column_names_ = columns;
497
1
    key_names_ = keys;
498
499
1
    for (string& k : key_names_) {
500
1
      TrimString(&k, "()"); // Cut parentheses if available.
501
1
    }
502
503
1
    auto deadline = CoarseMonoClock::now() + timeout;
504
1
    CoarseBackoffWaiter waiter(deadline, 2500ms * kTimeMultiplier);
505
1
    for (;;) {
506
1
      const std::string query = create_table_str(table, columns, keys, transactional);
507
1
      auto result = session->ExecuteQuery(query);
508
1
      if (result.ok() || CoarseMonoClock::now() >= deadline) {
509
1
        return result;
510
1
      }
511
0
      WARN_NOT_OK(result, "Create table failed");
512
0
      waiter.Wait();
513
0
    }
514
1
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEidEE11CreateTableEPNS_16CassandraSessionERKS7_RKNS1_6vectorIS7_NS5_IS7_EEEESH_bRKNS_9MonoDeltaE
Line
Count
Source
494
1
      const MonoDelta& timeout = 60s) {
495
1
    table_name_ = table;
496
1
    column_names_ = columns;
497
1
    key_names_ = keys;
498
499
2
    for (string& k : key_names_) {
500
2
      TrimString(&k, "()"); // Cut parentheses if available.
501
2
    }
502
503
1
    auto deadline = CoarseMonoClock::now() + timeout;
504
1
    CoarseBackoffWaiter waiter(deadline, 2500ms * kTimeMultiplier);
505
1
    for (;;) {
506
1
      const std::string query = create_table_str(table, columns, keys, transactional);
507
1
      auto result = session->ExecuteQuery(query);
508
1
      if (result.ok() || CoarseMonoClock::now() >= deadline) {
509
1
        return result;
510
1
      }
511
0
      WARN_NOT_OK(result, "Create table failed");
512
0
      waiter.Wait();
513
0
    }
514
1
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES7_EE11CreateTableEPNS_16CassandraSessionERKS7_RKNS1_6vectorIS7_NS5_IS7_EEEESH_bRKNS_9MonoDeltaE
Line
Count
Source
494
1
      const MonoDelta& timeout = 60s) {
495
1
    table_name_ = table;
496
1
    column_names_ = columns;
497
1
    key_names_ = keys;
498
499
1
    for (string& k : key_names_) {
500
1
      TrimString(&k, "()"); // Cut parentheses if available.
501
1
    }
502
503
1
    auto deadline = CoarseMonoClock::now() + timeout;
504
1
    CoarseBackoffWaiter waiter(deadline, 2500ms * kTimeMultiplier);
505
1
    for (;;) {
506
1
      const std::string query = create_table_str(table, columns, keys, transactional);
507
1
      auto result = session->ExecuteQuery(query);
508
1
      if (result.ok() || CoarseMonoClock::now() >= deadline) {
509
1
        return result;
510
1
      }
511
0
      WARN_NOT_OK(result, "Create table failed");
512
0
      waiter.Wait();
513
0
    }
514
1
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEExS7_EE11CreateTableEPNS_16CassandraSessionERKS7_RKNS1_6vectorIS7_NS5_IS7_EEEESH_bRKNS_9MonoDeltaE
Line
Count
Source
494
1
      const MonoDelta& timeout = 60s) {
495
1
    table_name_ = table;
496
1
    column_names_ = columns;
497
1
    key_names_ = keys;
498
499
1
    for (string& k : key_names_) {
500
1
      TrimString(&k, "()"); // Cut parentheses if available.
501
1
    }
502
503
1
    auto deadline = CoarseMonoClock::now() + timeout;
504
1
    CoarseBackoffWaiter waiter(deadline, 2500ms * kTimeMultiplier);
505
1
    for (;;) {
506
1
      const std::string query = create_table_str(table, columns, keys, transactional);
507
1
      auto result = session->ExecuteQuery(query);
508
1
      if (result.ok() || CoarseMonoClock::now() >= deadline) {
509
1
        return result;
510
1
      }
511
0
      WARN_NOT_OK(result, "Create table failed");
512
0
      waiter.Wait();
513
0
    }
514
1
  }
_ZN2yb9TestTableIJxxEE11CreateTableEPNS_16CassandraSessionERKNSt3__112basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEERKNS4_6vectorISA_NS8_ISA_EEEESH_bRKNS_9MonoDeltaE
Line
Count
Source
494
2
      const MonoDelta& timeout = 60s) {
495
2
    table_name_ = table;
496
2
    column_names_ = columns;
497
2
    key_names_ = keys;
498
499
2
    for (string& k : key_names_) {
500
2
      TrimString(&k, "()"); // Cut parentheses if available.
501
2
    }
502
503
2
    auto deadline = CoarseMonoClock::now() + timeout;
504
2
    CoarseBackoffWaiter waiter(deadline, 2500ms * kTimeMultiplier);
505
2
    for (;;) {
506
2
      const std::string query = create_table_str(table, columns, keys, transactional);
507
2
      auto result = session->ExecuteQuery(query);
508
2
      if (result.ok() || CoarseMonoClock::now() >= deadline) {
509
2
        return result;
510
2
      }
511
0
      WARN_NOT_OK(result, "Create table failed");
512
0
      waiter.Wait();
513
0
    }
514
2
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEEE11CreateTableEPNS_16CassandraSessionERKS7_RKNS1_6vectorIS7_NS5_IS7_EEEESH_bRKNS_9MonoDeltaE
Line
Count
Source
494
2
      const MonoDelta& timeout = 60s) {
495
2
    table_name_ = table;
496
2
    column_names_ = columns;
497
2
    key_names_ = keys;
498
499
2
    for (string& k : key_names_) {
500
2
      TrimString(&k, "()"); // Cut parentheses if available.
501
2
    }
502
503
2
    auto deadline = CoarseMonoClock::now() + timeout;
504
2
    CoarseBackoffWaiter waiter(deadline, 2500ms * kTimeMultiplier);
505
2
    for (;;) {
506
2
      const std::string query = create_table_str(table, columns, keys, transactional);
507
2
      auto result = session->ExecuteQuery(query);
508
2
      if (result.ok() || CoarseMonoClock::now() >= deadline) {
509
2
        return result;
510
2
      }
511
0
      WARN_NOT_OK(result, "Create table failed");
512
0
      waiter.Wait();
513
0
    }
514
2
  }
515
516
51
  void Print(const string& prefix, const ColumnsTuple& data) const {
517
51
    LOG(INFO) << prefix << ":";
518
519
51
    StringVec types;
520
51
    do_get_type_names(&types, data);
521
51
    CHECK_EQ(types.size(), column_names_.size());
522
523
51
    StringVec values;
524
51
    do_get_values(&values, data);
525
51
    CHECK_EQ(values.size(), column_names_.size());
526
527
207
    for (size_t i = 0; i < column_names_.size(); ++i) {
528
156
      LOG(INFO) << ">     " << column_names_[i] << ' ' << types[i] << ": " << values[i];
529
156
    }
530
51
  }
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE11cass_bool_tfdixS7_EE5PrintERKS7_RKNS1_5tupleIJS7_S8_fdixS7_EEE
Line
Count
Source
516
3
  void Print(const string& prefix, const ColumnsTuple& data) const {
517
3
    LOG(INFO) << prefix << ":";
518
519
3
    StringVec types;
520
3
    do_get_type_names(&types, data);
521
3
    CHECK_EQ(types.size(), column_names_.size());
522
523
3
    StringVec values;
524
3
    do_get_values(&values, data);
525
3
    CHECK_EQ(values.size(), column_names_.size());
526
527
24
    for (size_t i = 0; i < column_names_.size(); ++i) {
528
21
      LOG(INFO) << ">     " << column_names_[i] << ' ' << types[i] << ": " << values[i];
529
21
    }
530
3
  }
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_13CassandraJsonEEE5PrintERKS7_RKNS1_5tupleIJS7_S8_EEE
Line
Count
Source
516
11
  void Print(const string& prefix, const ColumnsTuple& data) const {
517
11
    LOG(INFO) << prefix << ":";
518
519
11
    StringVec types;
520
11
    do_get_type_names(&types, data);
521
11
    CHECK_EQ(types.size(), column_names_.size());
522
523
11
    StringVec values;
524
11
    do_get_values(&values, data);
525
11
    CHECK_EQ(values.size(), column_names_.size());
526
527
33
    for (size_t i = 0; i < column_names_.size(); ++i) {
528
22
      LOG(INFO) << ">     " << column_names_[i] << ' ' << types[i] << ": " << values[i];
529
22
    }
530
11
  }
_ZNK2yb9TestTableIJ11cass_bool_tiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEiS8_EE5PrintERKS8_RKNS2_5tupleIJS1_iS8_iS8_EEE
Line
Count
Source
516
12
  void Print(const string& prefix, const ColumnsTuple& data) const {
517
12
    LOG(INFO) << prefix << ":";
518
519
12
    StringVec types;
520
12
    do_get_type_names(&types, data);
521
12
    CHECK_EQ(types.size(), column_names_.size());
522
523
12
    StringVec values;
524
12
    do_get_values(&values, data);
525
12
    CHECK_EQ(values.size(), column_names_.size());
526
527
72
    for (size_t i = 0; i < column_names_.size(); ++i) {
528
60
      LOG(INFO) << ">     " << column_names_[i] << ' ' << types[i] << ": " << values[i];
529
60
    }
530
12
  }
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEdEE5PrintERKS7_RKNS1_5tupleIJS7_dEEE
Line
Count
Source
516
4
  void Print(const string& prefix, const ColumnsTuple& data) const {
517
4
    LOG(INFO) << prefix << ":";
518
519
4
    StringVec types;
520
4
    do_get_type_names(&types, data);
521
4
    CHECK_EQ(types.size(), column_names_.size());
522
523
4
    StringVec values;
524
4
    do_get_values(&values, data);
525
4
    CHECK_EQ(values.size(), column_names_.size());
526
527
12
    for (size_t i = 0; i < column_names_.size(); ++i) {
528
8
      LOG(INFO) << ">     " << column_names_[i] << ' ' << types[i] << ": " << values[i];
529
8
    }
530
4
  }
_ZNK2yb9TestTableIJidEE5PrintERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKNS2_5tupleIJidEEE
Line
Count
Source
516
4
  void Print(const string& prefix, const ColumnsTuple& data) const {
517
4
    LOG(INFO) << prefix << ":";
518
519
4
    StringVec types;
520
4
    do_get_type_names(&types, data);
521
4
    CHECK_EQ(types.size(), column_names_.size());
522
523
4
    StringVec values;
524
4
    do_get_values(&values, data);
525
4
    CHECK_EQ(values.size(), column_names_.size());
526
527
12
    for (size_t i = 0; i < column_names_.size(); ++i) {
528
8
      LOG(INFO) << ">     " << column_names_[i] << ' ' << types[i] << ": " << values[i];
529
8
    }
530
4
  }
_ZNK2yb9TestTableIJxdEE5PrintERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKNS2_5tupleIJxdEEE
Line
Count
Source
516
3
  void Print(const string& prefix, const ColumnsTuple& data) const {
517
3
    LOG(INFO) << prefix << ":";
518
519
3
    StringVec types;
520
3
    do_get_type_names(&types, data);
521
3
    CHECK_EQ(types.size(), column_names_.size());
522
523
3
    StringVec values;
524
3
    do_get_values(&values, data);
525
3
    CHECK_EQ(values.size(), column_names_.size());
526
527
9
    for (size_t i = 0; i < column_names_.size(); ++i) {
528
6
      LOG(INFO) << ">     " << column_names_[i] << ' ' << types[i] << ": " << values[i];
529
6
    }
530
3
  }
_ZNK2yb9TestTableIJ11cass_bool_tdEE5PrintERKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEERKNS3_5tupleIJS1_dEEE
Line
Count
Source
516
4
  void Print(const string& prefix, const ColumnsTuple& data) const {
517
4
    LOG(INFO) << prefix << ":";
518
519
4
    StringVec types;
520
4
    do_get_type_names(&types, data);
521
4
    CHECK_EQ(types.size(), column_names_.size());
522
523
4
    StringVec values;
524
4
    do_get_values(&values, data);
525
4
    CHECK_EQ(values.size(), column_names_.size());
526
527
12
    for (size_t i = 0; i < column_names_.size(); ++i) {
528
8
      LOG(INFO) << ">     " << column_names_[i] << ' ' << types[i] << ": " << values[i];
529
8
    }
530
4
  }
_ZNK2yb9TestTableIJfdEE5PrintERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKNS2_5tupleIJfdEEE
Line
Count
Source
516
4
  void Print(const string& prefix, const ColumnsTuple& data) const {
517
4
    LOG(INFO) << prefix << ":";
518
519
4
    StringVec types;
520
4
    do_get_type_names(&types, data);
521
4
    CHECK_EQ(types.size(), column_names_.size());
522
523
4
    StringVec values;
524
4
    do_get_values(&values, data);
525
4
    CHECK_EQ(values.size(), column_names_.size());
526
527
12
    for (size_t i = 0; i < column_names_.size(); ++i) {
528
8
      LOG(INFO) << ">     " << column_names_[i] << ' ' << types[i] << ": " << values[i];
529
8
    }
530
4
  }
_ZNK2yb9TestTableIJddEE5PrintERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKNS2_5tupleIJddEEE
Line
Count
Source
516
3
  void Print(const string& prefix, const ColumnsTuple& data) const {
517
3
    LOG(INFO) << prefix << ":";
518
519
3
    StringVec types;
520
3
    do_get_type_names(&types, data);
521
3
    CHECK_EQ(types.size(), column_names_.size());
522
523
3
    StringVec values;
524
3
    do_get_values(&values, data);
525
3
    CHECK_EQ(values.size(), column_names_.size());
526
527
9
    for (size_t i = 0; i < column_names_.size(); ++i) {
528
6
      LOG(INFO) << ">     " << column_names_[i] << ' ' << types[i] << ": " << values[i];
529
6
    }
530
3
  }
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEidEE5PrintERKS7_RKNS1_5tupleIJS7_idEEE
Line
Count
Source
516
3
  void Print(const string& prefix, const ColumnsTuple& data) const {
517
3
    LOG(INFO) << prefix << ":";
518
519
3
    StringVec types;
520
3
    do_get_type_names(&types, data);
521
3
    CHECK_EQ(types.size(), column_names_.size());
522
523
3
    StringVec values;
524
3
    do_get_values(&values, data);
525
3
    CHECK_EQ(values.size(), column_names_.size());
526
527
12
    for (size_t i = 0; i < column_names_.size(); ++i) {
528
9
      LOG(INFO) << ">     " << column_names_[i] << ' ' << types[i] << ": " << values[i];
529
9
    }
530
3
  }
531
532
19.1k
  void BindInsert(CassandraStatement* statement, const ColumnsTuple& data) const {
533
19.1k
    DoBindValues(statement, /* keys_only = */ false, /* values_first = */ false, data);
534
19.1k
  }
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE11cass_bool_tfdixS7_EE10BindInsertEPNS_18CassandraStatementERKNS1_5tupleIJS7_S8_fdixS7_EEE
Line
Count
Source
532
1
  void BindInsert(CassandraStatement* statement, const ColumnsTuple& data) const {
533
1
    DoBindValues(statement, /* keys_only = */ false, /* values_first = */ false, data);
534
1
  }
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_13CassandraJsonEEE10BindInsertEPNS_18CassandraStatementERKNS1_5tupleIJS7_S8_EEE
Line
Count
Source
532
2
  void BindInsert(CassandraStatement* statement, const ColumnsTuple& data) const {
533
2
    DoBindValues(statement, /* keys_only = */ false, /* values_first = */ false, data);
534
2
  }
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES7_S7_EE10BindInsertEPNS_18CassandraStatementERKNS1_5tupleIJS7_S7_S7_EEE
Line
Count
Source
532
3.00k
  void BindInsert(CassandraStatement* statement, const ColumnsTuple& data) const {
533
3.00k
    DoBindValues(statement, /* keys_only = */ false, /* values_first = */ false, data);
534
3.00k
  }
_ZNK2yb9TestTableIJiiEE10BindInsertEPNS_18CassandraStatementERKNSt3__15tupleIJiiEEE
Line
Count
Source
532
7.06k
  void BindInsert(CassandraStatement* statement, const ColumnsTuple& data) const {
533
7.06k
    DoBindValues(statement, /* keys_only = */ false, /* values_first = */ false, data);
534
7.06k
  }
_ZNK2yb9TestTableIJ11cass_bool_tiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEiS8_EE10BindInsertEPNS_18CassandraStatementERKNS2_5tupleIJS1_iS8_iS8_EEE
Line
Count
Source
532
4
  void BindInsert(CassandraStatement* statement, const ColumnsTuple& data) const {
533
4
    DoBindValues(statement, /* keys_only = */ false, /* values_first = */ false, data);
534
4
  }
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEdEE10BindInsertEPNS_18CassandraStatementERKNS1_5tupleIJS7_dEEE
Line
Count
Source
532
1
  void BindInsert(CassandraStatement* statement, const ColumnsTuple& data) const {
533
1
    DoBindValues(statement, /* keys_only = */ false, /* values_first = */ false, data);
534
1
  }
_ZNK2yb9TestTableIJidEE10BindInsertEPNS_18CassandraStatementERKNSt3__15tupleIJidEEE
Line
Count
Source
532
1
  void BindInsert(CassandraStatement* statement, const ColumnsTuple& data) const {
533
1
    DoBindValues(statement, /* keys_only = */ false, /* values_first = */ false, data);
534
1
  }
_ZNK2yb9TestTableIJxdEE10BindInsertEPNS_18CassandraStatementERKNSt3__15tupleIJxdEEE
Line
Count
Source
532
1
  void BindInsert(CassandraStatement* statement, const ColumnsTuple& data) const {
533
1
    DoBindValues(statement, /* keys_only = */ false, /* values_first = */ false, data);
534
1
  }
_ZNK2yb9TestTableIJ11cass_bool_tdEE10BindInsertEPNS_18CassandraStatementERKNSt3__15tupleIJS1_dEEE
Line
Count
Source
532
1
  void BindInsert(CassandraStatement* statement, const ColumnsTuple& data) const {
533
1
    DoBindValues(statement, /* keys_only = */ false, /* values_first = */ false, data);
534
1
  }
_ZNK2yb9TestTableIJfdEE10BindInsertEPNS_18CassandraStatementERKNSt3__15tupleIJfdEEE
Line
Count
Source
532
1
  void BindInsert(CassandraStatement* statement, const ColumnsTuple& data) const {
533
1
    DoBindValues(statement, /* keys_only = */ false, /* values_first = */ false, data);
534
1
  }
_ZNK2yb9TestTableIJddEE10BindInsertEPNS_18CassandraStatementERKNSt3__15tupleIJddEEE
Line
Count
Source
532
1
  void BindInsert(CassandraStatement* statement, const ColumnsTuple& data) const {
533
1
    DoBindValues(statement, /* keys_only = */ false, /* values_first = */ false, data);
534
1
  }
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEidEE10BindInsertEPNS_18CassandraStatementERKNS1_5tupleIJS7_idEEE
Line
Count
Source
532
1
  void BindInsert(CassandraStatement* statement, const ColumnsTuple& data) const {
533
1
    DoBindValues(statement, /* keys_only = */ false, /* values_first = */ false, data);
534
1
  }
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES7_EE10BindInsertEPNS_18CassandraStatementERKNS1_5tupleIJS7_S7_EEE
Line
Count
Source
532
100
  void BindInsert(CassandraStatement* statement, const ColumnsTuple& data) const {
533
100
    DoBindValues(statement, /* keys_only = */ false, /* values_first = */ false, data);
534
100
  }
Unexecuted instantiation: _ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEExS7_EE10BindInsertEPNS_18CassandraStatementERKNS1_5tupleIJS7_xS7_EEE
_ZNK2yb9TestTableIJxxEE10BindInsertEPNS_18CassandraStatementERKNSt3__15tupleIJxxEEE
Line
Count
Source
532
9.00k
  void BindInsert(CassandraStatement* statement, const ColumnsTuple& data) const {
533
9.00k
    DoBindValues(statement, /* keys_only = */ false, /* values_first = */ false, data);
534
9.00k
  }
535
536
3
  void Insert(CassandraSession* session, const ColumnsTuple& data) const {
537
3
    const string query = insert_with_bindings_str(table_name_, column_names_);
538
3
    Print("Execute: '" + query + "' with data", data);
539
540
3
    CassandraStatement statement(cass_statement_new(query.c_str(), column_names_.size()));
541
3
    BindInsert(&statement, data);
542
3
    ASSERT_OK(session->Execute(statement));
543
3
  }
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE11cass_bool_tfdixS7_EE6InsertEPNS_16CassandraSessionERKNS1_5tupleIJS7_S8_fdixS7_EEE
Line
Count
Source
536
1
  void Insert(CassandraSession* session, const ColumnsTuple& data) const {
537
1
    const string query = insert_with_bindings_str(table_name_, column_names_);
538
1
    Print("Execute: '" + query + "' with data", data);
539
540
1
    CassandraStatement statement(cass_statement_new(query.c_str(), column_names_.size()));
541
1
    BindInsert(&statement, data);
542
1
    ASSERT_OK(session->Execute(statement));
543
1
  }
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_13CassandraJsonEEE6InsertEPNS_16CassandraSessionERKNS1_5tupleIJS7_S8_EEE
Line
Count
Source
536
2
  void Insert(CassandraSession* session, const ColumnsTuple& data) const {
537
2
    const string query = insert_with_bindings_str(table_name_, column_names_);
538
2
    Print("Execute: '" + query + "' with data", data);
539
540
2
    CassandraStatement statement(cass_statement_new(query.c_str(), column_names_.size()));
541
2
    BindInsert(&statement, data);
542
2
    ASSERT_OK(session->Execute(statement));
543
2
  }
544
545
  Result<CassandraPrepared> PrepareInsert(CassandraSession* session,
546
                                          MonoDelta timeout = MonoDelta::kZero,
547
614
                                          const string& local_keyspace = string()) const {
548
614
    return session->Prepare(
549
614
        insert_with_bindings_str(table_name_, column_names_), timeout, local_keyspace);
550
614
  }
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES7_S7_EE13PrepareInsertEPNS_16CassandraSessionENS_9MonoDeltaERKS7_
Line
Count
Source
547
300
                                          const string& local_keyspace = string()) const {
548
300
    return session->Prepare(
549
300
        insert_with_bindings_str(table_name_, column_names_), timeout, local_keyspace);
550
300
  }
_ZNK2yb9TestTableIJiiEE13PrepareInsertEPNS_16CassandraSessionENS_9MonoDeltaERKNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEE
Line
Count
Source
547
2
                                          const string& local_keyspace = string()) const {
548
2
    return session->Prepare(
549
2
        insert_with_bindings_str(table_name_, column_names_), timeout, local_keyspace);
550
2
  }
_ZNK2yb9TestTableIJ11cass_bool_tiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEiS8_EE13PrepareInsertEPNS_16CassandraSessionENS_9MonoDeltaERKS8_
Line
Count
Source
547
4
                                          const string& local_keyspace = string()) const {
548
4
    return session->Prepare(
549
4
        insert_with_bindings_str(table_name_, column_names_), timeout, local_keyspace);
550
4
  }
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEdEE13PrepareInsertEPNS_16CassandraSessionENS_9MonoDeltaERKS7_
Line
Count
Source
547
1
                                          const string& local_keyspace = string()) const {
548
1
    return session->Prepare(
549
1
        insert_with_bindings_str(table_name_, column_names_), timeout, local_keyspace);
550
1
  }
_ZNK2yb9TestTableIJidEE13PrepareInsertEPNS_16CassandraSessionENS_9MonoDeltaERKNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEE
Line
Count
Source
547
1
                                          const string& local_keyspace = string()) const {
548
1
    return session->Prepare(
549
1
        insert_with_bindings_str(table_name_, column_names_), timeout, local_keyspace);
550
1
  }
_ZNK2yb9TestTableIJxdEE13PrepareInsertEPNS_16CassandraSessionENS_9MonoDeltaERKNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEE
Line
Count
Source
547
1
                                          const string& local_keyspace = string()) const {
548
1
    return session->Prepare(
549
1
        insert_with_bindings_str(table_name_, column_names_), timeout, local_keyspace);
550
1
  }
_ZNK2yb9TestTableIJ11cass_bool_tdEE13PrepareInsertEPNS_16CassandraSessionENS_9MonoDeltaERKNSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEE
Line
Count
Source
547
1
                                          const string& local_keyspace = string()) const {
548
1
    return session->Prepare(
549
1
        insert_with_bindings_str(table_name_, column_names_), timeout, local_keyspace);
550
1
  }
_ZNK2yb9TestTableIJfdEE13PrepareInsertEPNS_16CassandraSessionENS_9MonoDeltaERKNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEE
Line
Count
Source
547
1
                                          const string& local_keyspace = string()) const {
548
1
    return session->Prepare(
549
1
        insert_with_bindings_str(table_name_, column_names_), timeout, local_keyspace);
550
1
  }
_ZNK2yb9TestTableIJddEE13PrepareInsertEPNS_16CassandraSessionENS_9MonoDeltaERKNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEE
Line
Count
Source
547
1
                                          const string& local_keyspace = string()) const {
548
1
    return session->Prepare(
549
1
        insert_with_bindings_str(table_name_, column_names_), timeout, local_keyspace);
550
1
  }
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEidEE13PrepareInsertEPNS_16CassandraSessionENS_9MonoDeltaERKS7_
Line
Count
Source
547
1
                                          const string& local_keyspace = string()) const {
548
1
    return session->Prepare(
549
1
        insert_with_bindings_str(table_name_, column_names_), timeout, local_keyspace);
550
1
  }
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES7_EE13PrepareInsertEPNS_16CassandraSessionENS_9MonoDeltaERKS7_
Line
Count
Source
547
1
                                          const string& local_keyspace = string()) const {
548
1
    return session->Prepare(
549
1
        insert_with_bindings_str(table_name_, column_names_), timeout, local_keyspace);
550
1
  }
Unexecuted instantiation: _ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEExS7_EE13PrepareInsertEPNS_16CassandraSessionENS_9MonoDeltaERKS7_
_ZNK2yb9TestTableIJxxEE13PrepareInsertEPNS_16CassandraSessionENS_9MonoDeltaERKNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEE
Line
Count
Source
547
300
                                          const string& local_keyspace = string()) const {
548
300
    return session->Prepare(
549
300
        insert_with_bindings_str(table_name_, column_names_), timeout, local_keyspace);
550
300
  }
551
552
1
  void Update(CassandraSession* session, const ColumnsTuple& data) const {
553
1
    const string query = update_with_bindings_str(table_name_, column_names_, key_names_);
554
1
    Print("Execute: '" + query + "' with data", data);
555
556
1
    CassandraStatement statement(cass_statement_new(query.c_str(), column_names_.size()));
557
1
    DoBindValues(&statement, /* keys_only = */ false, /* values_first = */ true, data);
558
559
1
    ASSERT_OK(session->Execute(statement));
560
1
  }
561
562
16
  void SelectOneRow(CassandraSession* session, ColumnsTuple* data) {
563
16
    const string query = select_with_bindings_str(table_name_, key_names_);
564
16
    Print("Execute: '" + query + "' with data", *data);
565
566
16
    CassandraStatement statement(cass_statement_new(query.c_str(), key_names_.size()));
567
16
    DoBindValues(&statement, /* keys_only = */ true, /* values_first = */ false, *data);
568
16
    *data = ASSERT_RESULT(ExecuteAndReadOneRow(session, statement));
569
16
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE11cass_bool_tfdixS7_EE12SelectOneRowEPNS_16CassandraSessionEPNS1_5tupleIJS7_S8_fdixS7_EEE
Line
Count
Source
562
1
  void SelectOneRow(CassandraSession* session, ColumnsTuple* data) {
563
1
    const string query = select_with_bindings_str(table_name_, key_names_);
564
1
    Print("Execute: '" + query + "' with data", *data);
565
566
1
    CassandraStatement statement(cass_statement_new(query.c_str(), key_names_.size()));
567
1
    DoBindValues(&statement, /* keys_only = */ true, /* values_first = */ false, *data);
568
1
    *data = ASSERT_RESULT(ExecuteAndReadOneRow(session, statement));
569
1
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_13CassandraJsonEEE12SelectOneRowEPNS_16CassandraSessionEPNS1_5tupleIJS7_S8_EEE
Line
Count
Source
562
4
  void SelectOneRow(CassandraSession* session, ColumnsTuple* data) {
563
4
    const string query = select_with_bindings_str(table_name_, key_names_);
564
4
    Print("Execute: '" + query + "' with data", *data);
565
566
4
    CassandraStatement statement(cass_statement_new(query.c_str(), key_names_.size()));
567
4
    DoBindValues(&statement, /* keys_only = */ true, /* values_first = */ false, *data);
568
4
    *data = ASSERT_RESULT(ExecuteAndReadOneRow(session, statement));
569
4
  }
_ZN2yb9TestTableIJ11cass_bool_tiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEiS8_EE12SelectOneRowEPNS_16CassandraSessionEPNS2_5tupleIJS1_iS8_iS8_EEE
Line
Count
Source
562
4
  void SelectOneRow(CassandraSession* session, ColumnsTuple* data) {
563
4
    const string query = select_with_bindings_str(table_name_, key_names_);
564
4
    Print("Execute: '" + query + "' with data", *data);
565
566
4
    CassandraStatement statement(cass_statement_new(query.c_str(), key_names_.size()));
567
4
    DoBindValues(&statement, /* keys_only = */ true, /* values_first = */ false, *data);
568
4
    *data = ASSERT_RESULT(ExecuteAndReadOneRow(session, statement));
569
4
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEdEE12SelectOneRowEPNS_16CassandraSessionEPNS1_5tupleIJS7_dEEE
Line
Count
Source
562
1
  void SelectOneRow(CassandraSession* session, ColumnsTuple* data) {
563
1
    const string query = select_with_bindings_str(table_name_, key_names_);
564
1
    Print("Execute: '" + query + "' with data", *data);
565
566
1
    CassandraStatement statement(cass_statement_new(query.c_str(), key_names_.size()));
567
1
    DoBindValues(&statement, /* keys_only = */ true, /* values_first = */ false, *data);
568
1
    *data = ASSERT_RESULT(ExecuteAndReadOneRow(session, statement));
569
1
  }
_ZN2yb9TestTableIJidEE12SelectOneRowEPNS_16CassandraSessionEPNSt3__15tupleIJidEEE
Line
Count
Source
562
1
  void SelectOneRow(CassandraSession* session, ColumnsTuple* data) {
563
1
    const string query = select_with_bindings_str(table_name_, key_names_);
564
1
    Print("Execute: '" + query + "' with data", *data);
565
566
1
    CassandraStatement statement(cass_statement_new(query.c_str(), key_names_.size()));
567
1
    DoBindValues(&statement, /* keys_only = */ true, /* values_first = */ false, *data);
568
1
    *data = ASSERT_RESULT(ExecuteAndReadOneRow(session, statement));
569
1
  }
_ZN2yb9TestTableIJxdEE12SelectOneRowEPNS_16CassandraSessionEPNSt3__15tupleIJxdEEE
Line
Count
Source
562
1
  void SelectOneRow(CassandraSession* session, ColumnsTuple* data) {
563
1
    const string query = select_with_bindings_str(table_name_, key_names_);
564
1
    Print("Execute: '" + query + "' with data", *data);
565
566
1
    CassandraStatement statement(cass_statement_new(query.c_str(), key_names_.size()));
567
1
    DoBindValues(&statement, /* keys_only = */ true, /* values_first = */ false, *data);
568
1
    *data = ASSERT_RESULT(ExecuteAndReadOneRow(session, statement));
569
1
  }
_ZN2yb9TestTableIJ11cass_bool_tdEE12SelectOneRowEPNS_16CassandraSessionEPNSt3__15tupleIJS1_dEEE
Line
Count
Source
562
1
  void SelectOneRow(CassandraSession* session, ColumnsTuple* data) {
563
1
    const string query = select_with_bindings_str(table_name_, key_names_);
564
1
    Print("Execute: '" + query + "' with data", *data);
565
566
1
    CassandraStatement statement(cass_statement_new(query.c_str(), key_names_.size()));
567
1
    DoBindValues(&statement, /* keys_only = */ true, /* values_first = */ false, *data);
568
1
    *data = ASSERT_RESULT(ExecuteAndReadOneRow(session, statement));
569
1
  }
_ZN2yb9TestTableIJfdEE12SelectOneRowEPNS_16CassandraSessionEPNSt3__15tupleIJfdEEE
Line
Count
Source
562
1
  void SelectOneRow(CassandraSession* session, ColumnsTuple* data) {
563
1
    const string query = select_with_bindings_str(table_name_, key_names_);
564
1
    Print("Execute: '" + query + "' with data", *data);
565
566
1
    CassandraStatement statement(cass_statement_new(query.c_str(), key_names_.size()));
567
1
    DoBindValues(&statement, /* keys_only = */ true, /* values_first = */ false, *data);
568
1
    *data = ASSERT_RESULT(ExecuteAndReadOneRow(session, statement));
569
1
  }
_ZN2yb9TestTableIJddEE12SelectOneRowEPNS_16CassandraSessionEPNSt3__15tupleIJddEEE
Line
Count
Source
562
1
  void SelectOneRow(CassandraSession* session, ColumnsTuple* data) {
563
1
    const string query = select_with_bindings_str(table_name_, key_names_);
564
1
    Print("Execute: '" + query + "' with data", *data);
565
566
1
    CassandraStatement statement(cass_statement_new(query.c_str(), key_names_.size()));
567
1
    DoBindValues(&statement, /* keys_only = */ true, /* values_first = */ false, *data);
568
1
    *data = ASSERT_RESULT(ExecuteAndReadOneRow(session, statement));
569
1
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEidEE12SelectOneRowEPNS_16CassandraSessionEPNS1_5tupleIJS7_idEEE
Line
Count
Source
562
1
  void SelectOneRow(CassandraSession* session, ColumnsTuple* data) {
563
1
    const string query = select_with_bindings_str(table_name_, key_names_);
564
1
    Print("Execute: '" + query + "' with data", *data);
565
566
1
    CassandraStatement statement(cass_statement_new(query.c_str(), key_names_.size()));
567
1
    DoBindValues(&statement, /* keys_only = */ true, /* values_first = */ false, *data);
568
1
    *data = ASSERT_RESULT(ExecuteAndReadOneRow(session, statement));
569
1
  }
570
571
7
  Result<ColumnsTuple> SelectByToken(CassandraSession* session, int64_t token) {
572
7
    const string query = select_by_token_str(table_name_, key_names_);
573
7
    LOG(INFO) << "Execute: '" << query << "' with token: " << token;
574
575
7
    CassandraStatement statement(query, 1);
576
7
    statement.Bind(0, token);
577
7
    return ExecuteAndReadOneRow(session, statement);
578
7
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEdEE13SelectByTokenEPNS_16CassandraSessionEx
Line
Count
Source
571
1
  Result<ColumnsTuple> SelectByToken(CassandraSession* session, int64_t token) {
572
1
    const string query = select_by_token_str(table_name_, key_names_);
573
1
    LOG(INFO) << "Execute: '" << query << "' with token: " << token;
574
575
1
    CassandraStatement statement(query, 1);
576
1
    statement.Bind(0, token);
577
1
    return ExecuteAndReadOneRow(session, statement);
578
1
  }
_ZN2yb9TestTableIJidEE13SelectByTokenEPNS_16CassandraSessionEx
Line
Count
Source
571
1
  Result<ColumnsTuple> SelectByToken(CassandraSession* session, int64_t token) {
572
1
    const string query = select_by_token_str(table_name_, key_names_);
573
1
    LOG(INFO) << "Execute: '" << query << "' with token: " << token;
574
575
1
    CassandraStatement statement(query, 1);
576
1
    statement.Bind(0, token);
577
1
    return ExecuteAndReadOneRow(session, statement);
578
1
  }
_ZN2yb9TestTableIJxdEE13SelectByTokenEPNS_16CassandraSessionEx
Line
Count
Source
571
1
  Result<ColumnsTuple> SelectByToken(CassandraSession* session, int64_t token) {
572
1
    const string query = select_by_token_str(table_name_, key_names_);
573
1
    LOG(INFO) << "Execute: '" << query << "' with token: " << token;
574
575
1
    CassandraStatement statement(query, 1);
576
1
    statement.Bind(0, token);
577
1
    return ExecuteAndReadOneRow(session, statement);
578
1
  }
_ZN2yb9TestTableIJ11cass_bool_tdEE13SelectByTokenEPNS_16CassandraSessionEx
Line
Count
Source
571
1
  Result<ColumnsTuple> SelectByToken(CassandraSession* session, int64_t token) {
572
1
    const string query = select_by_token_str(table_name_, key_names_);
573
1
    LOG(INFO) << "Execute: '" << query << "' with token: " << token;
574
575
1
    CassandraStatement statement(query, 1);
576
1
    statement.Bind(0, token);
577
1
    return ExecuteAndReadOneRow(session, statement);
578
1
  }
_ZN2yb9TestTableIJfdEE13SelectByTokenEPNS_16CassandraSessionEx
Line
Count
Source
571
1
  Result<ColumnsTuple> SelectByToken(CassandraSession* session, int64_t token) {
572
1
    const string query = select_by_token_str(table_name_, key_names_);
573
1
    LOG(INFO) << "Execute: '" << query << "' with token: " << token;
574
575
1
    CassandraStatement statement(query, 1);
576
1
    statement.Bind(0, token);
577
1
    return ExecuteAndReadOneRow(session, statement);
578
1
  }
_ZN2yb9TestTableIJddEE13SelectByTokenEPNS_16CassandraSessionEx
Line
Count
Source
571
1
  Result<ColumnsTuple> SelectByToken(CassandraSession* session, int64_t token) {
572
1
    const string query = select_by_token_str(table_name_, key_names_);
573
1
    LOG(INFO) << "Execute: '" << query << "' with token: " << token;
574
575
1
    CassandraStatement statement(query, 1);
576
1
    statement.Bind(0, token);
577
1
    return ExecuteAndReadOneRow(session, statement);
578
1
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEidEE13SelectByTokenEPNS_16CassandraSessionEx
Line
Count
Source
571
1
  Result<ColumnsTuple> SelectByToken(CassandraSession* session, int64_t token) {
572
1
    const string query = select_by_token_str(table_name_, key_names_);
573
1
    LOG(INFO) << "Execute: '" << query << "' with token: " << token;
574
575
1
    CassandraStatement statement(query, 1);
576
1
    statement.Bind(0, token);
577
1
    return ExecuteAndReadOneRow(session, statement);
578
1
  }
579
580
  Result<ColumnsTuple> ExecuteAndReadOneRow(
581
23
      CassandraSession* session, const CassandraStatement& statement) {
582
23
    ColumnsTuple data;
583
23
    RETURN_NOT_OK(session->ExecuteAndProcessOneRow(
584
23
        statement, [this, &data](const CassandraRow& row) {
585
23
          DoReadValues(row, &data);
586
23
        }));
587
20
    return data;
588
23
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE11cass_bool_tfdixS7_EE20ExecuteAndReadOneRowEPNS_16CassandraSessionERKNS_18CassandraStatementE
Line
Count
Source
581
1
      CassandraSession* session, const CassandraStatement& statement) {
582
1
    ColumnsTuple data;
583
1
    RETURN_NOT_OK(session->ExecuteAndProcessOneRow(
584
1
        statement, [this, &data](const CassandraRow& row) {
585
1
          DoReadValues(row, &data);
586
1
        }));
587
1
    return data;
588
1
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_13CassandraJsonEEE20ExecuteAndReadOneRowEPNS_16CassandraSessionERKNS_18CassandraStatementE
Line
Count
Source
581
4
      CassandraSession* session, const CassandraStatement& statement) {
582
4
    ColumnsTuple data;
583
4
    RETURN_NOT_OK(session->ExecuteAndProcessOneRow(
584
4
        statement, [this, &data](const CassandraRow& row) {
585
4
          DoReadValues(row, &data);
586
4
        }));
587
4
    return data;
588
4
  }
_ZN2yb9TestTableIJ11cass_bool_tiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEiS8_EE20ExecuteAndReadOneRowEPNS_16CassandraSessionERKNS_18CassandraStatementE
Line
Count
Source
581
4
      CassandraSession* session, const CassandraStatement& statement) {
582
4
    ColumnsTuple data;
583
4
    RETURN_NOT_OK(session->ExecuteAndProcessOneRow(
584
4
        statement, [this, &data](const CassandraRow& row) {
585
4
          DoReadValues(row, &data);
586
4
        }));
587
4
    return data;
588
4
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEdEE20ExecuteAndReadOneRowEPNS_16CassandraSessionERKNS_18CassandraStatementE
Line
Count
Source
581
2
      CassandraSession* session, const CassandraStatement& statement) {
582
2
    ColumnsTuple data;
583
2
    RETURN_NOT_OK(session->ExecuteAndProcessOneRow(
584
2
        statement, [this, &data](const CassandraRow& row) {
585
2
          DoReadValues(row, &data);
586
2
        }));
587
2
    return data;
588
2
  }
_ZN2yb9TestTableIJidEE20ExecuteAndReadOneRowEPNS_16CassandraSessionERKNS_18CassandraStatementE
Line
Count
Source
581
2
      CassandraSession* session, const CassandraStatement& statement) {
582
2
    ColumnsTuple data;
583
2
    RETURN_NOT_OK(session->ExecuteAndProcessOneRow(
584
2
        statement, [this, &data](const CassandraRow& row) {
585
2
          DoReadValues(row, &data);
586
2
        }));
587
2
    return data;
588
2
  }
_ZN2yb9TestTableIJxdEE20ExecuteAndReadOneRowEPNS_16CassandraSessionERKNS_18CassandraStatementE
Line
Count
Source
581
2
      CassandraSession* session, const CassandraStatement& statement) {
582
2
    ColumnsTuple data;
583
2
    RETURN_NOT_OK(session->ExecuteAndProcessOneRow(
584
2
        statement, [this, &data](const CassandraRow& row) {
585
2
          DoReadValues(row, &data);
586
2
        }));
587
1
    return data;
588
2
  }
_ZN2yb9TestTableIJ11cass_bool_tdEE20ExecuteAndReadOneRowEPNS_16CassandraSessionERKNS_18CassandraStatementE
Line
Count
Source
581
2
      CassandraSession* session, const CassandraStatement& statement) {
582
2
    ColumnsTuple data;
583
2
    RETURN_NOT_OK(session->ExecuteAndProcessOneRow(
584
2
        statement, [this, &data](const CassandraRow& row) {
585
2
          DoReadValues(row, &data);
586
2
        }));
587
2
    return data;
588
2
  }
_ZN2yb9TestTableIJfdEE20ExecuteAndReadOneRowEPNS_16CassandraSessionERKNS_18CassandraStatementE
Line
Count
Source
581
2
      CassandraSession* session, const CassandraStatement& statement) {
582
2
    ColumnsTuple data;
583
2
    RETURN_NOT_OK(session->ExecuteAndProcessOneRow(
584
2
        statement, [this, &data](const CassandraRow& row) {
585
2
          DoReadValues(row, &data);
586
2
        }));
587
2
    return data;
588
2
  }
_ZN2yb9TestTableIJddEE20ExecuteAndReadOneRowEPNS_16CassandraSessionERKNS_18CassandraStatementE
Line
Count
Source
581
2
      CassandraSession* session, const CassandraStatement& statement) {
582
2
    ColumnsTuple data;
583
2
    RETURN_NOT_OK(session->ExecuteAndProcessOneRow(
584
2
        statement, [this, &data](const CassandraRow& row) {
585
2
          DoReadValues(row, &data);
586
2
        }));
587
1
    return data;
588
2
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEidEE20ExecuteAndReadOneRowEPNS_16CassandraSessionERKNS_18CassandraStatementE
Line
Count
Source
581
2
      CassandraSession* session, const CassandraStatement& statement) {
582
2
    ColumnsTuple data;
583
2
    RETURN_NOT_OK(session->ExecuteAndProcessOneRow(
584
2
        statement, [this, &data](const CassandraRow& row) {
585
2
          DoReadValues(row, &data);
586
2
        }));
587
1
    return data;
588
2
  }
589
590
 protected:
591
  // Tuple unrolling methods.
592
103
  static void get_type_names(StringVec*, const tuple<>&) {}
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE11cass_bool_tfdixS7_EE14get_type_namesEPNS1_6vectorIS7_NS5_IS7_EEEERKNS1_5tupleIJEEE
Line
Count
Source
592
4
  static void get_type_names(StringVec*, const tuple<>&) {}
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_13CassandraJsonEEE14get_type_namesEPNS1_6vectorIS7_NS5_IS7_EEEERKNS1_5tupleIJEEE
Line
Count
Source
592
13
  static void get_type_names(StringVec*, const tuple<>&) {}
_ZN2yb9TestTableIJiNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEEE14get_type_namesEPNS1_6vectorIS7_NS5_IS7_EEEERKNS1_5tupleIJEEE
Line
Count
Source
592
14
  static void get_type_names(StringVec*, const tuple<>&) {}
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES7_S7_EE14get_type_namesEPNS1_6vectorIS7_NS5_IS7_EEEERKNS1_5tupleIJEEE
Line
Count
Source
592
10
  static void get_type_names(StringVec*, const tuple<>&) {}
_ZN2yb9TestTableIJiNS_13CassandraJsonEEE14get_type_namesEPNSt3__16vectorINS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEENS8_ISA_EEEERKNS3_5tupleIJEEE
Line
Count
Source
592
1
  static void get_type_names(StringVec*, const tuple<>&) {}
_ZN2yb9TestTableIJiiEE14get_type_namesEPNSt3__16vectorINS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS7_IS9_EEEERKNS2_5tupleIJEEE
Line
Count
Source
592
7
  static void get_type_names(StringVec*, const tuple<>&) {}
_ZN2yb9TestTableIJ11cass_bool_tiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEiS8_EE14get_type_namesEPNS2_6vectorIS8_NS6_IS8_EEEERKNS2_5tupleIJEEE
Line
Count
Source
592
16
  static void get_type_names(StringVec*, const tuple<>&) {}
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEdEE14get_type_namesEPNS1_6vectorIS7_NS5_IS7_EEEERKNS1_5tupleIJEEE
Line
Count
Source
592
5
  static void get_type_names(StringVec*, const tuple<>&) {}
_ZN2yb9TestTableIJidEE14get_type_namesEPNSt3__16vectorINS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS7_IS9_EEEERKNS2_5tupleIJEEE
Line
Count
Source
592
5
  static void get_type_names(StringVec*, const tuple<>&) {}
_ZN2yb9TestTableIJxdEE14get_type_namesEPNSt3__16vectorINS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS7_IS9_EEEERKNS2_5tupleIJEEE
Line
Count
Source
592
4
  static void get_type_names(StringVec*, const tuple<>&) {}
_ZN2yb9TestTableIJ11cass_bool_tdEE14get_type_namesEPNSt3__16vectorINS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEENS8_ISA_EEEERKNS3_5tupleIJEEE
Line
Count
Source
592
5
  static void get_type_names(StringVec*, const tuple<>&) {}
_ZN2yb9TestTableIJfdEE14get_type_namesEPNSt3__16vectorINS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS7_IS9_EEEERKNS2_5tupleIJEEE
Line
Count
Source
592
5
  static void get_type_names(StringVec*, const tuple<>&) {}
_ZN2yb9TestTableIJddEE14get_type_namesEPNSt3__16vectorINS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS7_IS9_EEEERKNS2_5tupleIJEEE
Line
Count
Source
592
4
  static void get_type_names(StringVec*, const tuple<>&) {}
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEidEE14get_type_namesEPNS1_6vectorIS7_NS5_IS7_EEEERKNS1_5tupleIJEEE
Line
Count
Source
592
4
  static void get_type_names(StringVec*, const tuple<>&) {}
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES7_EE14get_type_namesEPNS1_6vectorIS7_NS5_IS7_EEEERKNS1_5tupleIJEEE
Line
Count
Source
592
1
  static void get_type_names(StringVec*, const tuple<>&) {}
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEExS7_EE14get_type_namesEPNS1_6vectorIS7_NS5_IS7_EEEERKNS1_5tupleIJEEE
Line
Count
Source
592
1
  static void get_type_names(StringVec*, const tuple<>&) {}
_ZN2yb9TestTableIJxxEE14get_type_namesEPNSt3__16vectorINS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS7_IS9_EEEERKNS2_5tupleIJEEE
Line
Count
Source
592
2
  static void get_type_names(StringVec*, const tuple<>&) {}
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEEE14get_type_namesEPNS1_6vectorIS7_NS5_IS7_EEEERKNS1_5tupleIJEEE
Line
Count
Source
592
2
  static void get_type_names(StringVec*, const tuple<>&) {}
593
594
  template<typename T, typename... A>
595
287
  static void get_type_names(StringVec* types, const tuple<T, A...>& t) {
596
287
    types->push_back(util::type_name<T>());
597
287
    get_type_names(types, tuple<A...>());
598
287
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE11cass_bool_tfdixS7_EE14get_type_namesIS7_JS8_fdixS7_EEEvPNS1_6vectorIS7_NS5_IS7_EEEERKNS1_5tupleIJT_DpT0_EEE
Line
Count
Source
595
4
  static void get_type_names(StringVec* types, const tuple<T, A...>& t) {
596
4
    types->push_back(util::type_name<T>());
597
4
    get_type_names(types, tuple<A...>());
598
4
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE11cass_bool_tfdixS7_EE14get_type_namesIS8_JfdixS7_EEEvPNS1_6vectorIS7_NS5_IS7_EEEERKNS1_5tupleIJT_DpT0_EEE
Line
Count
Source
595
4
  static void get_type_names(StringVec* types, const tuple<T, A...>& t) {
596
4
    types->push_back(util::type_name<T>());
597
4
    get_type_names(types, tuple<A...>());
598
4
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE11cass_bool_tfdixS7_EE14get_type_namesIfJdixS7_EEEvPNS1_6vectorIS7_NS5_IS7_EEEERKNS1_5tupleIJT_DpT0_EEE
Line
Count
Source
595
4
  static void get_type_names(StringVec* types, const tuple<T, A...>& t) {
596
4
    types->push_back(util::type_name<T>());
597
4
    get_type_names(types, tuple<A...>());
598
4
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE11cass_bool_tfdixS7_EE14get_type_namesIdJixS7_EEEvPNS1_6vectorIS7_NS5_IS7_EEEERKNS1_5tupleIJT_DpT0_EEE
Line
Count
Source
595
4
  static void get_type_names(StringVec* types, const tuple<T, A...>& t) {
596
4
    types->push_back(util::type_name<T>());
597
4
    get_type_names(types, tuple<A...>());
598
4
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE11cass_bool_tfdixS7_EE14get_type_namesIiJxS7_EEEvPNS1_6vectorIS7_NS5_IS7_EEEERKNS1_5tupleIJT_DpT0_EEE
Line
Count
Source
595
4
  static void get_type_names(StringVec* types, const tuple<T, A...>& t) {
596
4
    types->push_back(util::type_name<T>());
597
4
    get_type_names(types, tuple<A...>());
598
4
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE11cass_bool_tfdixS7_EE14get_type_namesIxJS7_EEEvPNS1_6vectorIS7_NS5_IS7_EEEERKNS1_5tupleIJT_DpT0_EEE
Line
Count
Source
595
4
  static void get_type_names(StringVec* types, const tuple<T, A...>& t) {
596
4
    types->push_back(util::type_name<T>());
597
4
    get_type_names(types, tuple<A...>());
598
4
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE11cass_bool_tfdixS7_EE14get_type_namesIS7_JEEEvPNS1_6vectorIS7_NS5_IS7_EEEERKNS1_5tupleIJT_DpT0_EEE
Line
Count
Source
595
4
  static void get_type_names(StringVec* types, const tuple<T, A...>& t) {
596
4
    types->push_back(util::type_name<T>());
597
4
    get_type_names(types, tuple<A...>());
598
4
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_13CassandraJsonEEE14get_type_namesIS7_JS8_EEEvPNS1_6vectorIS7_NS5_IS7_EEEERKNS1_5tupleIJT_DpT0_EEE
Line
Count
Source
595
13
  static void get_type_names(StringVec* types, const tuple<T, A...>& t) {
596
13
    types->push_back(util::type_name<T>());
597
13
    get_type_names(types, tuple<A...>());
598
13
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_13CassandraJsonEEE14get_type_namesIS8_JEEEvPNS1_6vectorIS7_NS5_IS7_EEEERKNS1_5tupleIJT_DpT0_EEE
Line
Count
Source
595
13
  static void get_type_names(StringVec* types, const tuple<T, A...>& t) {
596
13
    types->push_back(util::type_name<T>());
597
13
    get_type_names(types, tuple<A...>());
598
13
  }
_ZN2yb9TestTableIJiNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEEE14get_type_namesIiJS7_EEEvPNS1_6vectorIS7_NS5_IS7_EEEERKNS1_5tupleIJT_DpT0_EEE
Line
Count
Source
595
14
  static void get_type_names(StringVec* types, const tuple<T, A...>& t) {
596
14
    types->push_back(util::type_name<T>());
597
14
    get_type_names(types, tuple<A...>());
598
14
  }
_ZN2yb9TestTableIJiNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEEE14get_type_namesIS7_JEEEvPNS1_6vectorIS7_NS5_IS7_EEEERKNS1_5tupleIJT_DpT0_EEE
Line
Count
Source
595
14
  static void get_type_names(StringVec* types, const tuple<T, A...>& t) {
596
14
    types->push_back(util::type_name<T>());
597
14
    get_type_names(types, tuple<A...>());
598
14
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES7_S7_EE14get_type_namesIS7_JS7_S7_EEEvPNS1_6vectorIS7_NS5_IS7_EEEERKNS1_5tupleIJT_DpT0_EEE
Line
Count
Source
595
10
  static void get_type_names(StringVec* types, const tuple<T, A...>& t) {
596
10
    types->push_back(util::type_name<T>());
597
10
    get_type_names(types, tuple<A...>());
598
10
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES7_S7_EE14get_type_namesIS7_JS7_EEEvPNS1_6vectorIS7_NS5_IS7_EEEERKNS1_5tupleIJT_DpT0_EEE
Line
Count
Source
595
10
  static void get_type_names(StringVec* types, const tuple<T, A...>& t) {
596
10
    types->push_back(util::type_name<T>());
597
10
    get_type_names(types, tuple<A...>());
598
10
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES7_S7_EE14get_type_namesIS7_JEEEvPNS1_6vectorIS7_NS5_IS7_EEEERKNS1_5tupleIJT_DpT0_EEE
Line
Count
Source
595
10
  static void get_type_names(StringVec* types, const tuple<T, A...>& t) {
596
10
    types->push_back(util::type_name<T>());
597
10
    get_type_names(types, tuple<A...>());
598
10
  }
_ZN2yb9TestTableIJiNS_13CassandraJsonEEE14get_type_namesIiJS1_EEEvPNSt3__16vectorINS4_12basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEENS9_ISB_EEEERKNS4_5tupleIJT_DpT0_EEE
Line
Count
Source
595
1
  static void get_type_names(StringVec* types, const tuple<T, A...>& t) {
596
1
    types->push_back(util::type_name<T>());
597
1
    get_type_names(types, tuple<A...>());
598
1
  }
_ZN2yb9TestTableIJiNS_13CassandraJsonEEE14get_type_namesIS1_JEEEvPNSt3__16vectorINS4_12basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEENS9_ISB_EEEERKNS4_5tupleIJT_DpT0_EEE
Line
Count
Source
595
1
  static void get_type_names(StringVec* types, const tuple<T, A...>& t) {
596
1
    types->push_back(util::type_name<T>());
597
1
    get_type_names(types, tuple<A...>());
598
1
  }
_ZN2yb9TestTableIJiiEE14get_type_namesIiJiEEEvPNSt3__16vectorINS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEENS8_ISA_EEEERKNS3_5tupleIJT_DpT0_EEE
Line
Count
Source
595
7
  static void get_type_names(StringVec* types, const tuple<T, A...>& t) {
596
7
    types->push_back(util::type_name<T>());
597
7
    get_type_names(types, tuple<A...>());
598
7
  }
_ZN2yb9TestTableIJiiEE14get_type_namesIiJEEEvPNSt3__16vectorINS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEENS8_ISA_EEEERKNS3_5tupleIJT_DpT0_EEE
Line
Count
Source
595
7
  static void get_type_names(StringVec* types, const tuple<T, A...>& t) {
596
7
    types->push_back(util::type_name<T>());
597
7
    get_type_names(types, tuple<A...>());
598
7
  }
_ZN2yb9TestTableIJ11cass_bool_tiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEiS8_EE14get_type_namesIS1_JiS8_iS8_EEEvPNS2_6vectorIS8_NS6_IS8_EEEERKNS2_5tupleIJT_DpT0_EEE
Line
Count
Source
595
16
  static void get_type_names(StringVec* types, const tuple<T, A...>& t) {
596
16
    types->push_back(util::type_name<T>());
597
16
    get_type_names(types, tuple<A...>());
598
16
  }
_ZN2yb9TestTableIJ11cass_bool_tiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEiS8_EE14get_type_namesIiJS8_iS8_EEEvPNS2_6vectorIS8_NS6_IS8_EEEERKNS2_5tupleIJT_DpT0_EEE
Line
Count
Source
595
16
  static void get_type_names(StringVec* types, const tuple<T, A...>& t) {
596
16
    types->push_back(util::type_name<T>());
597
16
    get_type_names(types, tuple<A...>());
598
16
  }
_ZN2yb9TestTableIJ11cass_bool_tiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEiS8_EE14get_type_namesIS8_JiS8_EEEvPNS2_6vectorIS8_NS6_IS8_EEEERKNS2_5tupleIJT_DpT0_EEE
Line
Count
Source
595
16
  static void get_type_names(StringVec* types, const tuple<T, A...>& t) {
596
16
    types->push_back(util::type_name<T>());
597
16
    get_type_names(types, tuple<A...>());
598
16
  }
_ZN2yb9TestTableIJ11cass_bool_tiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEiS8_EE14get_type_namesIiJS8_EEEvPNS2_6vectorIS8_NS6_IS8_EEEERKNS2_5tupleIJT_DpT0_EEE
Line
Count
Source
595
16
  static void get_type_names(StringVec* types, const tuple<T, A...>& t) {
596
16
    types->push_back(util::type_name<T>());
597
16
    get_type_names(types, tuple<A...>());
598
16
  }
_ZN2yb9TestTableIJ11cass_bool_tiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEiS8_EE14get_type_namesIS8_JEEEvPNS2_6vectorIS8_NS6_IS8_EEEERKNS2_5tupleIJT_DpT0_EEE
Line
Count
Source
595
16
  static void get_type_names(StringVec* types, const tuple<T, A...>& t) {
596
16
    types->push_back(util::type_name<T>());
597
16
    get_type_names(types, tuple<A...>());
598
16
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEdEE14get_type_namesIS7_JdEEEvPNS1_6vectorIS7_NS5_IS7_EEEERKNS1_5tupleIJT_DpT0_EEE
Line
Count
Source
595
5
  static void get_type_names(StringVec* types, const tuple<T, A...>& t) {
596
5
    types->push_back(util::type_name<T>());
597
5
    get_type_names(types, tuple<A...>());
598
5
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEdEE14get_type_namesIdJEEEvPNS1_6vectorIS7_NS5_IS7_EEEERKNS1_5tupleIJT_DpT0_EEE
Line
Count
Source
595
5
  static void get_type_names(StringVec* types, const tuple<T, A...>& t) {
596
5
    types->push_back(util::type_name<T>());
597
5
    get_type_names(types, tuple<A...>());
598
5
  }
_ZN2yb9TestTableIJidEE14get_type_namesIiJdEEEvPNSt3__16vectorINS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEENS8_ISA_EEEERKNS3_5tupleIJT_DpT0_EEE
Line
Count
Source
595
5
  static void get_type_names(StringVec* types, const tuple<T, A...>& t) {
596
5
    types->push_back(util::type_name<T>());
597
5
    get_type_names(types, tuple<A...>());
598
5
  }
_ZN2yb9TestTableIJidEE14get_type_namesIdJEEEvPNSt3__16vectorINS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEENS8_ISA_EEEERKNS3_5tupleIJT_DpT0_EEE
Line
Count
Source
595
5
  static void get_type_names(StringVec* types, const tuple<T, A...>& t) {
596
5
    types->push_back(util::type_name<T>());
597
5
    get_type_names(types, tuple<A...>());
598
5
  }
_ZN2yb9TestTableIJxdEE14get_type_namesIxJdEEEvPNSt3__16vectorINS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEENS8_ISA_EEEERKNS3_5tupleIJT_DpT0_EEE
Line
Count
Source
595
4
  static void get_type_names(StringVec* types, const tuple<T, A...>& t) {
596
4
    types->push_back(util::type_name<T>());
597
4
    get_type_names(types, tuple<A...>());
598
4
  }
_ZN2yb9TestTableIJxdEE14get_type_namesIdJEEEvPNSt3__16vectorINS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEENS8_ISA_EEEERKNS3_5tupleIJT_DpT0_EEE
Line
Count
Source
595
4
  static void get_type_names(StringVec* types, const tuple<T, A...>& t) {
596
4
    types->push_back(util::type_name<T>());
597
4
    get_type_names(types, tuple<A...>());
598
4
  }
_ZN2yb9TestTableIJ11cass_bool_tdEE14get_type_namesIS1_JdEEEvPNSt3__16vectorINS4_12basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEENS9_ISB_EEEERKNS4_5tupleIJT_DpT0_EEE
Line
Count
Source
595
5
  static void get_type_names(StringVec* types, const tuple<T, A...>& t) {
596
5
    types->push_back(util::type_name<T>());
597
5
    get_type_names(types, tuple<A...>());
598
5
  }
_ZN2yb9TestTableIJ11cass_bool_tdEE14get_type_namesIdJEEEvPNSt3__16vectorINS4_12basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEENS9_ISB_EEEERKNS4_5tupleIJT_DpT0_EEE
Line
Count
Source
595
5
  static void get_type_names(StringVec* types, const tuple<T, A...>& t) {
596
5
    types->push_back(util::type_name<T>());
597
5
    get_type_names(types, tuple<A...>());
598
5
  }
_ZN2yb9TestTableIJfdEE14get_type_namesIfJdEEEvPNSt3__16vectorINS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEENS8_ISA_EEEERKNS3_5tupleIJT_DpT0_EEE
Line
Count
Source
595
5
  static void get_type_names(StringVec* types, const tuple<T, A...>& t) {
596
5
    types->push_back(util::type_name<T>());
597
5
    get_type_names(types, tuple<A...>());
598
5
  }
_ZN2yb9TestTableIJfdEE14get_type_namesIdJEEEvPNSt3__16vectorINS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEENS8_ISA_EEEERKNS3_5tupleIJT_DpT0_EEE
Line
Count
Source
595
5
  static void get_type_names(StringVec* types, const tuple<T, A...>& t) {
596
5
    types->push_back(util::type_name<T>());
597
5
    get_type_names(types, tuple<A...>());
598
5
  }
_ZN2yb9TestTableIJddEE14get_type_namesIdJdEEEvPNSt3__16vectorINS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEENS8_ISA_EEEERKNS3_5tupleIJT_DpT0_EEE
Line
Count
Source
595
4
  static void get_type_names(StringVec* types, const tuple<T, A...>& t) {
596
4
    types->push_back(util::type_name<T>());
597
4
    get_type_names(types, tuple<A...>());
598
4
  }
_ZN2yb9TestTableIJddEE14get_type_namesIdJEEEvPNSt3__16vectorINS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEENS8_ISA_EEEERKNS3_5tupleIJT_DpT0_EEE
Line
Count
Source
595
4
  static void get_type_names(StringVec* types, const tuple<T, A...>& t) {
596
4
    types->push_back(util::type_name<T>());
597
4
    get_type_names(types, tuple<A...>());
598
4
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEidEE14get_type_namesIS7_JidEEEvPNS1_6vectorIS7_NS5_IS7_EEEERKNS1_5tupleIJT_DpT0_EEE
Line
Count
Source
595
4
  static void get_type_names(StringVec* types, const tuple<T, A...>& t) {
596
4
    types->push_back(util::type_name<T>());
597
4
    get_type_names(types, tuple<A...>());
598
4
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEidEE14get_type_namesIiJdEEEvPNS1_6vectorIS7_NS5_IS7_EEEERKNS1_5tupleIJT_DpT0_EEE
Line
Count
Source
595
4
  static void get_type_names(StringVec* types, const tuple<T, A...>& t) {
596
4
    types->push_back(util::type_name<T>());
597
4
    get_type_names(types, tuple<A...>());
598
4
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEidEE14get_type_namesIdJEEEvPNS1_6vectorIS7_NS5_IS7_EEEERKNS1_5tupleIJT_DpT0_EEE
Line
Count
Source
595
4
  static void get_type_names(StringVec* types, const tuple<T, A...>& t) {
596
4
    types->push_back(util::type_name<T>());
597
4
    get_type_names(types, tuple<A...>());
598
4
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES7_EE14get_type_namesIS7_JS7_EEEvPNS1_6vectorIS7_NS5_IS7_EEEERKNS1_5tupleIJT_DpT0_EEE
Line
Count
Source
595
1
  static void get_type_names(StringVec* types, const tuple<T, A...>& t) {
596
1
    types->push_back(util::type_name<T>());
597
1
    get_type_names(types, tuple<A...>());
598
1
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES7_EE14get_type_namesIS7_JEEEvPNS1_6vectorIS7_NS5_IS7_EEEERKNS1_5tupleIJT_DpT0_EEE
Line
Count
Source
595
1
  static void get_type_names(StringVec* types, const tuple<T, A...>& t) {
596
1
    types->push_back(util::type_name<T>());
597
1
    get_type_names(types, tuple<A...>());
598
1
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEExS7_EE14get_type_namesIS7_JxS7_EEEvPNS1_6vectorIS7_NS5_IS7_EEEERKNS1_5tupleIJT_DpT0_EEE
Line
Count
Source
595
1
  static void get_type_names(StringVec* types, const tuple<T, A...>& t) {
596
1
    types->push_back(util::type_name<T>());
597
1
    get_type_names(types, tuple<A...>());
598
1
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEExS7_EE14get_type_namesIxJS7_EEEvPNS1_6vectorIS7_NS5_IS7_EEEERKNS1_5tupleIJT_DpT0_EEE
Line
Count
Source
595
1
  static void get_type_names(StringVec* types, const tuple<T, A...>& t) {
596
1
    types->push_back(util::type_name<T>());
597
1
    get_type_names(types, tuple<A...>());
598
1
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEExS7_EE14get_type_namesIS7_JEEEvPNS1_6vectorIS7_NS5_IS7_EEEERKNS1_5tupleIJT_DpT0_EEE
Line
Count
Source
595
1
  static void get_type_names(StringVec* types, const tuple<T, A...>& t) {
596
1
    types->push_back(util::type_name<T>());
597
1
    get_type_names(types, tuple<A...>());
598
1
  }
_ZN2yb9TestTableIJxxEE14get_type_namesIxJxEEEvPNSt3__16vectorINS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEENS8_ISA_EEEERKNS3_5tupleIJT_DpT0_EEE
Line
Count
Source
595
2
  static void get_type_names(StringVec* types, const tuple<T, A...>& t) {
596
2
    types->push_back(util::type_name<T>());
597
2
    get_type_names(types, tuple<A...>());
598
2
  }
_ZN2yb9TestTableIJxxEE14get_type_namesIxJEEEvPNSt3__16vectorINS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEENS8_ISA_EEEERKNS3_5tupleIJT_DpT0_EEE
Line
Count
Source
595
2
  static void get_type_names(StringVec* types, const tuple<T, A...>& t) {
596
2
    types->push_back(util::type_name<T>());
597
2
    get_type_names(types, tuple<A...>());
598
2
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEEE14get_type_namesIS7_JEEEvPNS1_6vectorIS7_NS5_IS7_EEEERKNS1_5tupleIJT_DpT0_EEE
Line
Count
Source
595
2
  static void get_type_names(StringVec* types, const tuple<T, A...>& t) {
596
2
    types->push_back(util::type_name<T>());
597
2
    get_type_names(types, tuple<A...>());
598
2
  }
599
600
103
  static void do_get_type_names(StringVec* types, const ColumnsTuple& t) {
601
103
    get_type_names<ColumnsTypes...>(types, t);
602
103
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE11cass_bool_tfdixS7_EE17do_get_type_namesEPNS1_6vectorIS7_NS5_IS7_EEEERKNS1_5tupleIJS7_S8_fdixS7_EEE
Line
Count
Source
600
4
  static void do_get_type_names(StringVec* types, const ColumnsTuple& t) {
601
4
    get_type_names<ColumnsTypes...>(types, t);
602
4
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_13CassandraJsonEEE17do_get_type_namesEPNS1_6vectorIS7_NS5_IS7_EEEERKNS1_5tupleIJS7_S8_EEE
Line
Count
Source
600
13
  static void do_get_type_names(StringVec* types, const ColumnsTuple& t) {
601
13
    get_type_names<ColumnsTypes...>(types, t);
602
13
  }
_ZN2yb9TestTableIJiNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEEE17do_get_type_namesEPNS1_6vectorIS7_NS5_IS7_EEEERKNS1_5tupleIJiS7_EEE
Line
Count
Source
600
14
  static void do_get_type_names(StringVec* types, const ColumnsTuple& t) {
601
14
    get_type_names<ColumnsTypes...>(types, t);
602
14
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES7_S7_EE17do_get_type_namesEPNS1_6vectorIS7_NS5_IS7_EEEERKNS1_5tupleIJS7_S7_S7_EEE
Line
Count
Source
600
10
  static void do_get_type_names(StringVec* types, const ColumnsTuple& t) {
601
10
    get_type_names<ColumnsTypes...>(types, t);
602
10
  }
_ZN2yb9TestTableIJiNS_13CassandraJsonEEE17do_get_type_namesEPNSt3__16vectorINS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEENS8_ISA_EEEERKNS3_5tupleIJiS1_EEE
Line
Count
Source
600
1
  static void do_get_type_names(StringVec* types, const ColumnsTuple& t) {
601
1
    get_type_names<ColumnsTypes...>(types, t);
602
1
  }
_ZN2yb9TestTableIJiiEE17do_get_type_namesEPNSt3__16vectorINS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS7_IS9_EEEERKNS2_5tupleIJiiEEE
Line
Count
Source
600
7
  static void do_get_type_names(StringVec* types, const ColumnsTuple& t) {
601
7
    get_type_names<ColumnsTypes...>(types, t);
602
7
  }
_ZN2yb9TestTableIJ11cass_bool_tiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEiS8_EE17do_get_type_namesEPNS2_6vectorIS8_NS6_IS8_EEEERKNS2_5tupleIJS1_iS8_iS8_EEE
Line
Count
Source
600
16
  static void do_get_type_names(StringVec* types, const ColumnsTuple& t) {
601
16
    get_type_names<ColumnsTypes...>(types, t);
602
16
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEdEE17do_get_type_namesEPNS1_6vectorIS7_NS5_IS7_EEEERKNS1_5tupleIJS7_dEEE
Line
Count
Source
600
5
  static void do_get_type_names(StringVec* types, const ColumnsTuple& t) {
601
5
    get_type_names<ColumnsTypes...>(types, t);
602
5
  }
_ZN2yb9TestTableIJidEE17do_get_type_namesEPNSt3__16vectorINS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS7_IS9_EEEERKNS2_5tupleIJidEEE
Line
Count
Source
600
5
  static void do_get_type_names(StringVec* types, const ColumnsTuple& t) {
601
5
    get_type_names<ColumnsTypes...>(types, t);
602
5
  }
_ZN2yb9TestTableIJxdEE17do_get_type_namesEPNSt3__16vectorINS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS7_IS9_EEEERKNS2_5tupleIJxdEEE
Line
Count
Source
600
4
  static void do_get_type_names(StringVec* types, const ColumnsTuple& t) {
601
4
    get_type_names<ColumnsTypes...>(types, t);
602
4
  }
_ZN2yb9TestTableIJ11cass_bool_tdEE17do_get_type_namesEPNSt3__16vectorINS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEENS8_ISA_EEEERKNS3_5tupleIJS1_dEEE
Line
Count
Source
600
5
  static void do_get_type_names(StringVec* types, const ColumnsTuple& t) {
601
5
    get_type_names<ColumnsTypes...>(types, t);
602
5
  }
_ZN2yb9TestTableIJfdEE17do_get_type_namesEPNSt3__16vectorINS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS7_IS9_EEEERKNS2_5tupleIJfdEEE
Line
Count
Source
600
5
  static void do_get_type_names(StringVec* types, const ColumnsTuple& t) {
601
5
    get_type_names<ColumnsTypes...>(types, t);
602
5
  }
_ZN2yb9TestTableIJddEE17do_get_type_namesEPNSt3__16vectorINS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS7_IS9_EEEERKNS2_5tupleIJddEEE
Line
Count
Source
600
4
  static void do_get_type_names(StringVec* types, const ColumnsTuple& t) {
601
4
    get_type_names<ColumnsTypes...>(types, t);
602
4
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEidEE17do_get_type_namesEPNS1_6vectorIS7_NS5_IS7_EEEERKNS1_5tupleIJS7_idEEE
Line
Count
Source
600
4
  static void do_get_type_names(StringVec* types, const ColumnsTuple& t) {
601
4
    get_type_names<ColumnsTypes...>(types, t);
602
4
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES7_EE17do_get_type_namesEPNS1_6vectorIS7_NS5_IS7_EEEERKNS1_5tupleIJS7_S7_EEE
Line
Count
Source
600
1
  static void do_get_type_names(StringVec* types, const ColumnsTuple& t) {
601
1
    get_type_names<ColumnsTypes...>(types, t);
602
1
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEExS7_EE17do_get_type_namesEPNS1_6vectorIS7_NS5_IS7_EEEERKNS1_5tupleIJS7_xS7_EEE
Line
Count
Source
600
1
  static void do_get_type_names(StringVec* types, const ColumnsTuple& t) {
601
1
    get_type_names<ColumnsTypes...>(types, t);
602
1
  }
_ZN2yb9TestTableIJxxEE17do_get_type_namesEPNSt3__16vectorINS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS7_IS9_EEEERKNS2_5tupleIJxxEEE
Line
Count
Source
600
2
  static void do_get_type_names(StringVec* types, const ColumnsTuple& t) {
601
2
    get_type_names<ColumnsTypes...>(types, t);
602
2
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEEE17do_get_type_namesEPNS1_6vectorIS7_NS5_IS7_EEEERKNS1_5tupleIJS7_EEE
Line
Count
Source
600
2
  static void do_get_type_names(StringVec* types, const ColumnsTuple& t) {
601
2
    get_type_names<ColumnsTypes...>(types, t);
602
2
  }
603
604
  template<size_t I>
605
51
  static void get_values(StringVec*, const ColumnsTuple&) {}
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE11cass_bool_tfdixS7_EE10get_valuesILm7EEEvPNS1_6vectorIS7_NS5_IS7_EEEERKNS1_5tupleIJS7_S8_fdixS7_EEE
Line
Count
Source
605
3
  static void get_values(StringVec*, const ColumnsTuple&) {}
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_13CassandraJsonEEE10get_valuesILm2EEEvPNS1_6vectorIS7_NS5_IS7_EEEERKNS1_5tupleIJS7_S8_EEE
Line
Count
Source
605
11
  static void get_values(StringVec*, const ColumnsTuple&) {}
_ZN2yb9TestTableIJ11cass_bool_tiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEiS8_EE10get_valuesILm5EEEvPNS2_6vectorIS8_NS6_IS8_EEEERKNS2_5tupleIJS1_iS8_iS8_EEE
Line
Count
Source
605
12
  static void get_values(StringVec*, const ColumnsTuple&) {}
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEdEE10get_valuesILm2EEEvPNS1_6vectorIS7_NS5_IS7_EEEERKNS1_5tupleIJS7_dEEE
Line
Count
Source
605
4
  static void get_values(StringVec*, const ColumnsTuple&) {}
_ZN2yb9TestTableIJidEE10get_valuesILm2EEEvPNSt3__16vectorINS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEENS8_ISA_EEEERKNS3_5tupleIJidEEE
Line
Count
Source
605
4
  static void get_values(StringVec*, const ColumnsTuple&) {}
_ZN2yb9TestTableIJxdEE10get_valuesILm2EEEvPNSt3__16vectorINS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEENS8_ISA_EEEERKNS3_5tupleIJxdEEE
Line
Count
Source
605
3
  static void get_values(StringVec*, const ColumnsTuple&) {}
_ZN2yb9TestTableIJ11cass_bool_tdEE10get_valuesILm2EEEvPNSt3__16vectorINS4_12basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEENS9_ISB_EEEERKNS4_5tupleIJS1_dEEE
Line
Count
Source
605
4
  static void get_values(StringVec*, const ColumnsTuple&) {}
_ZN2yb9TestTableIJfdEE10get_valuesILm2EEEvPNSt3__16vectorINS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEENS8_ISA_EEEERKNS3_5tupleIJfdEEE
Line
Count
Source
605
4
  static void get_values(StringVec*, const ColumnsTuple&) {}
_ZN2yb9TestTableIJddEE10get_valuesILm2EEEvPNSt3__16vectorINS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEENS8_ISA_EEEERKNS3_5tupleIJddEEE
Line
Count
Source
605
3
  static void get_values(StringVec*, const ColumnsTuple&) {}
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEidEE10get_valuesILm3EEEvPNS1_6vectorIS7_NS5_IS7_EEEERKNS1_5tupleIJS7_idEEE
Line
Count
Source
605
3
  static void get_values(StringVec*, const ColumnsTuple&) {}
606
607
  template<size_t I, typename T, typename... A>
608
156
  static void get_values(StringVec* values, const ColumnsTuple& data) {
609
156
    ostringstream ss;
610
156
    ss << get<I>(data);
611
156
    values->push_back(ss.str());
612
156
    get_values<I + 1, A...>(values, data);
613
156
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE11cass_bool_tfdixS7_EE10get_valuesILm0ES7_JS8_fdixS7_EEEvPNS1_6vectorIS7_NS5_IS7_EEEERKNS1_5tupleIJS7_S8_fdixS7_EEE
Line
Count
Source
608
3
  static void get_values(StringVec* values, const ColumnsTuple& data) {
609
3
    ostringstream ss;
610
3
    ss << get<I>(data);
611
3
    values->push_back(ss.str());
612
3
    get_values<I + 1, A...>(values, data);
613
3
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE11cass_bool_tfdixS7_EE10get_valuesILm1ES8_JfdixS7_EEEvPNS1_6vectorIS7_NS5_IS7_EEEERKNS1_5tupleIJS7_S8_fdixS7_EEE
Line
Count
Source
608
3
  static void get_values(StringVec* values, const ColumnsTuple& data) {
609
3
    ostringstream ss;
610
3
    ss << get<I>(data);
611
3
    values->push_back(ss.str());
612
3
    get_values<I + 1, A...>(values, data);
613
3
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE11cass_bool_tfdixS7_EE10get_valuesILm2EfJdixS7_EEEvPNS1_6vectorIS7_NS5_IS7_EEEERKNS1_5tupleIJS7_S8_fdixS7_EEE
Line
Count
Source
608
3
  static void get_values(StringVec* values, const ColumnsTuple& data) {
609
3
    ostringstream ss;
610
3
    ss << get<I>(data);
611
3
    values->push_back(ss.str());
612
3
    get_values<I + 1, A...>(values, data);
613
3
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE11cass_bool_tfdixS7_EE10get_valuesILm3EdJixS7_EEEvPNS1_6vectorIS7_NS5_IS7_EEEERKNS1_5tupleIJS7_S8_fdixS7_EEE
Line
Count
Source
608
3
  static void get_values(StringVec* values, const ColumnsTuple& data) {
609
3
    ostringstream ss;
610
3
    ss << get<I>(data);
611
3
    values->push_back(ss.str());
612
3
    get_values<I + 1, A...>(values, data);
613
3
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE11cass_bool_tfdixS7_EE10get_valuesILm4EiJxS7_EEEvPNS1_6vectorIS7_NS5_IS7_EEEERKNS1_5tupleIJS7_S8_fdixS7_EEE
Line
Count
Source
608
3
  static void get_values(StringVec* values, const ColumnsTuple& data) {
609
3
    ostringstream ss;
610
3
    ss << get<I>(data);
611
3
    values->push_back(ss.str());
612
3
    get_values<I + 1, A...>(values, data);
613
3
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE11cass_bool_tfdixS7_EE10get_valuesILm5ExJS7_EEEvPNS1_6vectorIS7_NS5_IS7_EEEERKNS1_5tupleIJS7_S8_fdixS7_EEE
Line
Count
Source
608
3
  static void get_values(StringVec* values, const ColumnsTuple& data) {
609
3
    ostringstream ss;
610
3
    ss << get<I>(data);
611
3
    values->push_back(ss.str());
612
3
    get_values<I + 1, A...>(values, data);
613
3
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE11cass_bool_tfdixS7_EE10get_valuesILm6ES7_JEEEvPNS1_6vectorIS7_NS5_IS7_EEEERKNS1_5tupleIJS7_S8_fdixS7_EEE
Line
Count
Source
608
3
  static void get_values(StringVec* values, const ColumnsTuple& data) {
609
3
    ostringstream ss;
610
3
    ss << get<I>(data);
611
3
    values->push_back(ss.str());
612
3
    get_values<I + 1, A...>(values, data);
613
3
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_13CassandraJsonEEE10get_valuesILm0ES7_JS8_EEEvPNS1_6vectorIS7_NS5_IS7_EEEERKNS1_5tupleIJS7_S8_EEE
Line
Count
Source
608
11
  static void get_values(StringVec* values, const ColumnsTuple& data) {
609
11
    ostringstream ss;
610
11
    ss << get<I>(data);
611
11
    values->push_back(ss.str());
612
11
    get_values<I + 1, A...>(values, data);
613
11
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_13CassandraJsonEEE10get_valuesILm1ES8_JEEEvPNS1_6vectorIS7_NS5_IS7_EEEERKNS1_5tupleIJS7_S8_EEE
Line
Count
Source
608
11
  static void get_values(StringVec* values, const ColumnsTuple& data) {
609
11
    ostringstream ss;
610
11
    ss << get<I>(data);
611
11
    values->push_back(ss.str());
612
11
    get_values<I + 1, A...>(values, data);
613
11
  }
_ZN2yb9TestTableIJ11cass_bool_tiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEiS8_EE10get_valuesILm0ES1_JiS8_iS8_EEEvPNS2_6vectorIS8_NS6_IS8_EEEERKNS2_5tupleIJS1_iS8_iS8_EEE
Line
Count
Source
608
12
  static void get_values(StringVec* values, const ColumnsTuple& data) {
609
12
    ostringstream ss;
610
12
    ss << get<I>(data);
611
12
    values->push_back(ss.str());
612
12
    get_values<I + 1, A...>(values, data);
613
12
  }
_ZN2yb9TestTableIJ11cass_bool_tiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEiS8_EE10get_valuesILm1EiJS8_iS8_EEEvPNS2_6vectorIS8_NS6_IS8_EEEERKNS2_5tupleIJS1_iS8_iS8_EEE
Line
Count
Source
608
12
  static void get_values(StringVec* values, const ColumnsTuple& data) {
609
12
    ostringstream ss;
610
12
    ss << get<I>(data);
611
12
    values->push_back(ss.str());
612
12
    get_values<I + 1, A...>(values, data);
613
12
  }
_ZN2yb9TestTableIJ11cass_bool_tiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEiS8_EE10get_valuesILm2ES8_JiS8_EEEvPNS2_6vectorIS8_NS6_IS8_EEEERKNS2_5tupleIJS1_iS8_iS8_EEE
Line
Count
Source
608
12
  static void get_values(StringVec* values, const ColumnsTuple& data) {
609
12
    ostringstream ss;
610
12
    ss << get<I>(data);
611
12
    values->push_back(ss.str());
612
12
    get_values<I + 1, A...>(values, data);
613
12
  }
_ZN2yb9TestTableIJ11cass_bool_tiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEiS8_EE10get_valuesILm3EiJS8_EEEvPNS2_6vectorIS8_NS6_IS8_EEEERKNS2_5tupleIJS1_iS8_iS8_EEE
Line
Count
Source
608
12
  static void get_values(StringVec* values, const ColumnsTuple& data) {
609
12
    ostringstream ss;
610
12
    ss << get<I>(data);
611
12
    values->push_back(ss.str());
612
12
    get_values<I + 1, A...>(values, data);
613
12
  }
_ZN2yb9TestTableIJ11cass_bool_tiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEiS8_EE10get_valuesILm4ES8_JEEEvPNS2_6vectorIS8_NS6_IS8_EEEERKNS2_5tupleIJS1_iS8_iS8_EEE
Line
Count
Source
608
12
  static void get_values(StringVec* values, const ColumnsTuple& data) {
609
12
    ostringstream ss;
610
12
    ss << get<I>(data);
611
12
    values->push_back(ss.str());
612
12
    get_values<I + 1, A...>(values, data);
613
12
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEdEE10get_valuesILm0ES7_JdEEEvPNS1_6vectorIS7_NS5_IS7_EEEERKNS1_5tupleIJS7_dEEE
Line
Count
Source
608
4
  static void get_values(StringVec* values, const ColumnsTuple& data) {
609
4
    ostringstream ss;
610
4
    ss << get<I>(data);
611
4
    values->push_back(ss.str());
612
4
    get_values<I + 1, A...>(values, data);
613
4
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEdEE10get_valuesILm1EdJEEEvPNS1_6vectorIS7_NS5_IS7_EEEERKNS1_5tupleIJS7_dEEE
Line
Count
Source
608
4
  static void get_values(StringVec* values, const ColumnsTuple& data) {
609
4
    ostringstream ss;
610
4
    ss << get<I>(data);
611
4
    values->push_back(ss.str());
612
4
    get_values<I + 1, A...>(values, data);
613
4
  }
_ZN2yb9TestTableIJidEE10get_valuesILm0EiJdEEEvPNSt3__16vectorINS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEENS8_ISA_EEEERKNS3_5tupleIJidEEE
Line
Count
Source
608
4
  static void get_values(StringVec* values, const ColumnsTuple& data) {
609
4
    ostringstream ss;
610
4
    ss << get<I>(data);
611
4
    values->push_back(ss.str());
612
4
    get_values<I + 1, A...>(values, data);
613
4
  }
_ZN2yb9TestTableIJidEE10get_valuesILm1EdJEEEvPNSt3__16vectorINS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEENS8_ISA_EEEERKNS3_5tupleIJidEEE
Line
Count
Source
608
4
  static void get_values(StringVec* values, const ColumnsTuple& data) {
609
4
    ostringstream ss;
610
4
    ss << get<I>(data);
611
4
    values->push_back(ss.str());
612
4
    get_values<I + 1, A...>(values, data);
613
4
  }
_ZN2yb9TestTableIJxdEE10get_valuesILm0ExJdEEEvPNSt3__16vectorINS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEENS8_ISA_EEEERKNS3_5tupleIJxdEEE
Line
Count
Source
608
3
  static void get_values(StringVec* values, const ColumnsTuple& data) {
609
3
    ostringstream ss;
610
3
    ss << get<I>(data);
611
3
    values->push_back(ss.str());
612
3
    get_values<I + 1, A...>(values, data);
613
3
  }
_ZN2yb9TestTableIJxdEE10get_valuesILm1EdJEEEvPNSt3__16vectorINS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEENS8_ISA_EEEERKNS3_5tupleIJxdEEE
Line
Count
Source
608
3
  static void get_values(StringVec* values, const ColumnsTuple& data) {
609
3
    ostringstream ss;
610
3
    ss << get<I>(data);
611
3
    values->push_back(ss.str());
612
3
    get_values<I + 1, A...>(values, data);
613
3
  }
_ZN2yb9TestTableIJ11cass_bool_tdEE10get_valuesILm0ES1_JdEEEvPNSt3__16vectorINS4_12basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEENS9_ISB_EEEERKNS4_5tupleIJS1_dEEE
Line
Count
Source
608
4
  static void get_values(StringVec* values, const ColumnsTuple& data) {
609
4
    ostringstream ss;
610
4
    ss << get<I>(data);
611
4
    values->push_back(ss.str());
612
4
    get_values<I + 1, A...>(values, data);
613
4
  }
_ZN2yb9TestTableIJ11cass_bool_tdEE10get_valuesILm1EdJEEEvPNSt3__16vectorINS4_12basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEENS9_ISB_EEEERKNS4_5tupleIJS1_dEEE
Line
Count
Source
608
4
  static void get_values(StringVec* values, const ColumnsTuple& data) {
609
4
    ostringstream ss;
610
4
    ss << get<I>(data);
611
4
    values->push_back(ss.str());
612
4
    get_values<I + 1, A...>(values, data);
613
4
  }
_ZN2yb9TestTableIJfdEE10get_valuesILm0EfJdEEEvPNSt3__16vectorINS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEENS8_ISA_EEEERKNS3_5tupleIJfdEEE
Line
Count
Source
608
4
  static void get_values(StringVec* values, const ColumnsTuple& data) {
609
4
    ostringstream ss;
610
4
    ss << get<I>(data);
611
4
    values->push_back(ss.str());
612
4
    get_values<I + 1, A...>(values, data);
613
4
  }
_ZN2yb9TestTableIJfdEE10get_valuesILm1EdJEEEvPNSt3__16vectorINS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEENS8_ISA_EEEERKNS3_5tupleIJfdEEE
Line
Count
Source
608
4
  static void get_values(StringVec* values, const ColumnsTuple& data) {
609
4
    ostringstream ss;
610
4
    ss << get<I>(data);
611
4
    values->push_back(ss.str());
612
4
    get_values<I + 1, A...>(values, data);
613
4
  }
_ZN2yb9TestTableIJddEE10get_valuesILm0EdJdEEEvPNSt3__16vectorINS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEENS8_ISA_EEEERKNS3_5tupleIJddEEE
Line
Count
Source
608
3
  static void get_values(StringVec* values, const ColumnsTuple& data) {
609
3
    ostringstream ss;
610
3
    ss << get<I>(data);
611
3
    values->push_back(ss.str());
612
3
    get_values<I + 1, A...>(values, data);
613
3
  }
_ZN2yb9TestTableIJddEE10get_valuesILm1EdJEEEvPNSt3__16vectorINS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEENS8_ISA_EEEERKNS3_5tupleIJddEEE
Line
Count
Source
608
3
  static void get_values(StringVec* values, const ColumnsTuple& data) {
609
3
    ostringstream ss;
610
3
    ss << get<I>(data);
611
3
    values->push_back(ss.str());
612
3
    get_values<I + 1, A...>(values, data);
613
3
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEidEE10get_valuesILm0ES7_JidEEEvPNS1_6vectorIS7_NS5_IS7_EEEERKNS1_5tupleIJS7_idEEE
Line
Count
Source
608
3
  static void get_values(StringVec* values, const ColumnsTuple& data) {
609
3
    ostringstream ss;
610
3
    ss << get<I>(data);
611
3
    values->push_back(ss.str());
612
3
    get_values<I + 1, A...>(values, data);
613
3
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEidEE10get_valuesILm1EiJdEEEvPNS1_6vectorIS7_NS5_IS7_EEEERKNS1_5tupleIJS7_idEEE
Line
Count
Source
608
3
  static void get_values(StringVec* values, const ColumnsTuple& data) {
609
3
    ostringstream ss;
610
3
    ss << get<I>(data);
611
3
    values->push_back(ss.str());
612
3
    get_values<I + 1, A...>(values, data);
613
3
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEidEE10get_valuesILm2EdJEEEvPNS1_6vectorIS7_NS5_IS7_EEEERKNS1_5tupleIJS7_idEEE
Line
Count
Source
608
3
  static void get_values(StringVec* values, const ColumnsTuple& data) {
609
3
    ostringstream ss;
610
3
    ss << get<I>(data);
611
3
    values->push_back(ss.str());
612
3
    get_values<I + 1, A...>(values, data);
613
3
  }
614
615
51
  static void do_get_values(StringVec* values, const ColumnsTuple& data) {
616
51
    get_values<0, ColumnsTypes...>(values, data);
617
51
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE11cass_bool_tfdixS7_EE13do_get_valuesEPNS1_6vectorIS7_NS5_IS7_EEEERKNS1_5tupleIJS7_S8_fdixS7_EEE
Line
Count
Source
615
3
  static void do_get_values(StringVec* values, const ColumnsTuple& data) {
616
3
    get_values<0, ColumnsTypes...>(values, data);
617
3
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_13CassandraJsonEEE13do_get_valuesEPNS1_6vectorIS7_NS5_IS7_EEEERKNS1_5tupleIJS7_S8_EEE
Line
Count
Source
615
11
  static void do_get_values(StringVec* values, const ColumnsTuple& data) {
616
11
    get_values<0, ColumnsTypes...>(values, data);
617
11
  }
_ZN2yb9TestTableIJ11cass_bool_tiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEiS8_EE13do_get_valuesEPNS2_6vectorIS8_NS6_IS8_EEEERKNS2_5tupleIJS1_iS8_iS8_EEE
Line
Count
Source
615
12
  static void do_get_values(StringVec* values, const ColumnsTuple& data) {
616
12
    get_values<0, ColumnsTypes...>(values, data);
617
12
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEdEE13do_get_valuesEPNS1_6vectorIS7_NS5_IS7_EEEERKNS1_5tupleIJS7_dEEE
Line
Count
Source
615
4
  static void do_get_values(StringVec* values, const ColumnsTuple& data) {
616
4
    get_values<0, ColumnsTypes...>(values, data);
617
4
  }
_ZN2yb9TestTableIJidEE13do_get_valuesEPNSt3__16vectorINS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS7_IS9_EEEERKNS2_5tupleIJidEEE
Line
Count
Source
615
4
  static void do_get_values(StringVec* values, const ColumnsTuple& data) {
616
4
    get_values<0, ColumnsTypes...>(values, data);
617
4
  }
_ZN2yb9TestTableIJxdEE13do_get_valuesEPNSt3__16vectorINS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS7_IS9_EEEERKNS2_5tupleIJxdEEE
Line
Count
Source
615
3
  static void do_get_values(StringVec* values, const ColumnsTuple& data) {
616
3
    get_values<0, ColumnsTypes...>(values, data);
617
3
  }
_ZN2yb9TestTableIJ11cass_bool_tdEE13do_get_valuesEPNSt3__16vectorINS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEENS8_ISA_EEEERKNS3_5tupleIJS1_dEEE
Line
Count
Source
615
4
  static void do_get_values(StringVec* values, const ColumnsTuple& data) {
616
4
    get_values<0, ColumnsTypes...>(values, data);
617
4
  }
_ZN2yb9TestTableIJfdEE13do_get_valuesEPNSt3__16vectorINS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS7_IS9_EEEERKNS2_5tupleIJfdEEE
Line
Count
Source
615
4
  static void do_get_values(StringVec* values, const ColumnsTuple& data) {
616
4
    get_values<0, ColumnsTypes...>(values, data);
617
4
  }
_ZN2yb9TestTableIJddEE13do_get_valuesEPNSt3__16vectorINS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS7_IS9_EEEERKNS2_5tupleIJddEEE
Line
Count
Source
615
3
  static void do_get_values(StringVec* values, const ColumnsTuple& data) {
616
3
    get_values<0, ColumnsTypes...>(values, data);
617
3
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEidEE13do_get_valuesEPNS1_6vectorIS7_NS5_IS7_EEEERKNS1_5tupleIJS7_idEEE
Line
Count
Source
615
3
  static void do_get_values(StringVec* values, const ColumnsTuple& data) {
616
3
    get_values<0, ColumnsTypes...>(values, data);
617
3
  }
618
619
  template<size_t I>
620
  typename std::enable_if<I >= std::tuple_size<ColumnsTuple>::value, void>::type
621
19.1k
  BindValues(CassandraStatement*, size_t*, bool, bool, const ColumnsTuple&) const {}
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE11cass_bool_tfdixS7_EE10BindValuesILm7EEENS1_9enable_ifIXgeT_L_ZNS1_17integral_constantImLm7EE5valueEEEvE4typeEPNS_18CassandraStatementEPmbbRKNS1_5tupleIJS7_S8_fdixS7_EEE
Line
Count
Source
621
2
  BindValues(CassandraStatement*, size_t*, bool, bool, const ColumnsTuple&) const {}
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_13CassandraJsonEEE10BindValuesILm2EEENS1_9enable_ifIXgeT_L_ZNS1_17integral_constantImLm2EE5valueEEEvE4typeEPNS_18CassandraStatementEPmbbRKNS1_5tupleIJS7_S8_EEE
Line
Count
Source
621
8
  BindValues(CassandraStatement*, size_t*, bool, bool, const ColumnsTuple&) const {}
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES7_S7_EE10BindValuesILm3EEENS1_9enable_ifIXgeT_L_ZNS1_17integral_constantImLm3EE5valueEEEvE4typeEPNS_18CassandraStatementEPmbbRKNS1_5tupleIJS7_S7_S7_EEE
Line
Count
Source
621
3.00k
  BindValues(CassandraStatement*, size_t*, bool, bool, const ColumnsTuple&) const {}
_ZNK2yb9TestTableIJiiEE10BindValuesILm2EEENSt3__19enable_ifIXgeT_L_ZNS3_17integral_constantImLm2EE5valueEEEvE4typeEPNS_18CassandraStatementEPmbbRKNS3_5tupleIJiiEEE
Line
Count
Source
621
7.06k
  BindValues(CassandraStatement*, size_t*, bool, bool, const ColumnsTuple&) const {}
_ZNK2yb9TestTableIJ11cass_bool_tiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEiS8_EE10BindValuesILm5EEENS2_9enable_ifIXgeT_L_ZNS2_17integral_constantImLm5EE5valueEEEvE4typeEPNS_18CassandraStatementEPmbbRKNS2_5tupleIJS1_iS8_iS8_EEE
Line
Count
Source
621
8
  BindValues(CassandraStatement*, size_t*, bool, bool, const ColumnsTuple&) const {}
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEdEE10BindValuesILm2EEENS1_9enable_ifIXgeT_L_ZNS1_17integral_constantImLm2EE5valueEEEvE4typeEPNS_18CassandraStatementEPmbbRKNS1_5tupleIJS7_dEEE
Line
Count
Source
621
2
  BindValues(CassandraStatement*, size_t*, bool, bool, const ColumnsTuple&) const {}
_ZNK2yb9TestTableIJidEE10BindValuesILm2EEENSt3__19enable_ifIXgeT_L_ZNS3_17integral_constantImLm2EE5valueEEEvE4typeEPNS_18CassandraStatementEPmbbRKNS3_5tupleIJidEEE
Line
Count
Source
621
2
  BindValues(CassandraStatement*, size_t*, bool, bool, const ColumnsTuple&) const {}
_ZNK2yb9TestTableIJxdEE10BindValuesILm2EEENSt3__19enable_ifIXgeT_L_ZNS3_17integral_constantImLm2EE5valueEEEvE4typeEPNS_18CassandraStatementEPmbbRKNS3_5tupleIJxdEEE
Line
Count
Source
621
2
  BindValues(CassandraStatement*, size_t*, bool, bool, const ColumnsTuple&) const {}
_ZNK2yb9TestTableIJ11cass_bool_tdEE10BindValuesILm2EEENSt3__19enable_ifIXgeT_L_ZNS4_17integral_constantImLm2EE5valueEEEvE4typeEPNS_18CassandraStatementEPmbbRKNS4_5tupleIJS1_dEEE
Line
Count
Source
621
2
  BindValues(CassandraStatement*, size_t*, bool, bool, const ColumnsTuple&) const {}
_ZNK2yb9TestTableIJfdEE10BindValuesILm2EEENSt3__19enable_ifIXgeT_L_ZNS3_17integral_constantImLm2EE5valueEEEvE4typeEPNS_18CassandraStatementEPmbbRKNS3_5tupleIJfdEEE
Line
Count
Source
621
2
  BindValues(CassandraStatement*, size_t*, bool, bool, const ColumnsTuple&) const {}
_ZNK2yb9TestTableIJddEE10BindValuesILm2EEENSt3__19enable_ifIXgeT_L_ZNS3_17integral_constantImLm2EE5valueEEEvE4typeEPNS_18CassandraStatementEPmbbRKNS3_5tupleIJddEEE
Line
Count
Source
621
2
  BindValues(CassandraStatement*, size_t*, bool, bool, const ColumnsTuple&) const {}
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEidEE10BindValuesILm3EEENS1_9enable_ifIXgeT_L_ZNS1_17integral_constantImLm3EE5valueEEEvE4typeEPNS_18CassandraStatementEPmbbRKNS1_5tupleIJS7_idEEE
Line
Count
Source
621
2
  BindValues(CassandraStatement*, size_t*, bool, bool, const ColumnsTuple&) const {}
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES7_EE10BindValuesILm2EEENS1_9enable_ifIXgeT_L_ZNS1_17integral_constantImLm2EE5valueEEEvE4typeEPNS_18CassandraStatementEPmbbRKNS1_5tupleIJS7_S7_EEE
Line
Count
Source
621
100
  BindValues(CassandraStatement*, size_t*, bool, bool, const ColumnsTuple&) const {}
Unexecuted instantiation: _ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEExS7_EE10BindValuesILm3EEENS1_9enable_ifIXgeT_L_ZNS1_17integral_constantImLm3EE5valueEEEvE4typeEPNS_18CassandraStatementEPmbbRKNS1_5tupleIJS7_xS7_EEE
_ZNK2yb9TestTableIJxxEE10BindValuesILm2EEENSt3__19enable_ifIXgeT_L_ZNS3_17integral_constantImLm2EE5valueEEEvE4typeEPNS_18CassandraStatementEPmbbRKNS3_5tupleIJxxEEE
Line
Count
Source
621
9.00k
  BindValues(CassandraStatement*, size_t*, bool, bool, const ColumnsTuple&) const {}
622
623
  template<size_t I>
624
  typename std::enable_if<I < std::tuple_size<ColumnsTuple>::value, void>::type
625
  BindValues(
626
      CassandraStatement* statement, size_t* index, bool use_values, bool use_keys,
627
41.4k
      const ColumnsTuple& data) const {
628
41.4k
    const bool this_is_key = is_key(column_names_[I], key_names_);
629
630
41.4k
    if (this_is_key ? use_keys : use_values) {
631
41.3k
      statement->Bind((*index)++, get<I>(data));
632
41.3k
    }
633
634
41.4k
    BindValues<I + 1>(statement, index, use_values, use_keys, data);
635
41.4k
  }
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE11cass_bool_tfdixS7_EE10BindValuesILm0EEENS1_9enable_ifIXltT_L_ZNS1_17integral_constantImLm7EE5valueEEEvE4typeEPNS_18CassandraStatementEPmbbRKNS1_5tupleIJS7_S8_fdixS7_EEE
Line
Count
Source
627
2
      const ColumnsTuple& data) const {
628
2
    const bool this_is_key = is_key(column_names_[I], key_names_);
629
630
2
    if (this_is_key ? use_keys : use_values) {
631
2
      statement->Bind((*index)++, get<I>(data));
632
2
    }
633
634
2
    BindValues<I + 1>(statement, index, use_values, use_keys, data);
635
2
  }
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE11cass_bool_tfdixS7_EE10BindValuesILm1EEENS1_9enable_ifIXltT_L_ZNS1_17integral_constantImLm7EE5valueEEEvE4typeEPNS_18CassandraStatementEPmbbRKNS1_5tupleIJS7_S8_fdixS7_EEE
Line
Count
Source
627
2
      const ColumnsTuple& data) const {
628
2
    const bool this_is_key = is_key(column_names_[I], key_names_);
629
630
2
    if (this_is_key ? use_keys : use_values) {
631
1
      statement->Bind((*index)++, get<I>(data));
632
1
    }
633
634
2
    BindValues<I + 1>(statement, index, use_values, use_keys, data);
635
2
  }
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE11cass_bool_tfdixS7_EE10BindValuesILm2EEENS1_9enable_ifIXltT_L_ZNS1_17integral_constantImLm7EE5valueEEEvE4typeEPNS_18CassandraStatementEPmbbRKNS1_5tupleIJS7_S8_fdixS7_EEE
Line
Count
Source
627
2
      const ColumnsTuple& data) const {
628
2
    const bool this_is_key = is_key(column_names_[I], key_names_);
629
630
2
    if (this_is_key ? use_keys : use_values) {
631
1
      statement->Bind((*index)++, get<I>(data));
632
1
    }
633
634
2
    BindValues<I + 1>(statement, index, use_values, use_keys, data);
635
2
  }
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE11cass_bool_tfdixS7_EE10BindValuesILm3EEENS1_9enable_ifIXltT_L_ZNS1_17integral_constantImLm7EE5valueEEEvE4typeEPNS_18CassandraStatementEPmbbRKNS1_5tupleIJS7_S8_fdixS7_EEE
Line
Count
Source
627
2
      const ColumnsTuple& data) const {
628
2
    const bool this_is_key = is_key(column_names_[I], key_names_);
629
630
2
    if (this_is_key ? use_keys : use_values) {
631
1
      statement->Bind((*index)++, get<I>(data));
632
1
    }
633
634
2
    BindValues<I + 1>(statement, index, use_values, use_keys, data);
635
2
  }
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE11cass_bool_tfdixS7_EE10BindValuesILm4EEENS1_9enable_ifIXltT_L_ZNS1_17integral_constantImLm7EE5valueEEEvE4typeEPNS_18CassandraStatementEPmbbRKNS1_5tupleIJS7_S8_fdixS7_EEE
Line
Count
Source
627
2
      const ColumnsTuple& data) const {
628
2
    const bool this_is_key = is_key(column_names_[I], key_names_);
629
630
2
    if (this_is_key ? use_keys : use_values) {
631
1
      statement->Bind((*index)++, get<I>(data));
632
1
    }
633
634
2
    BindValues<I + 1>(statement, index, use_values, use_keys, data);
635
2
  }
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE11cass_bool_tfdixS7_EE10BindValuesILm5EEENS1_9enable_ifIXltT_L_ZNS1_17integral_constantImLm7EE5valueEEEvE4typeEPNS_18CassandraStatementEPmbbRKNS1_5tupleIJS7_S8_fdixS7_EEE
Line
Count
Source
627
2
      const ColumnsTuple& data) const {
628
2
    const bool this_is_key = is_key(column_names_[I], key_names_);
629
630
2
    if (this_is_key ? use_keys : use_values) {
631
1
      statement->Bind((*index)++, get<I>(data));
632
1
    }
633
634
2
    BindValues<I + 1>(statement, index, use_values, use_keys, data);
635
2
  }
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE11cass_bool_tfdixS7_EE10BindValuesILm6EEENS1_9enable_ifIXltT_L_ZNS1_17integral_constantImLm7EE5valueEEEvE4typeEPNS_18CassandraStatementEPmbbRKNS1_5tupleIJS7_S8_fdixS7_EEE
Line
Count
Source
627
2
      const ColumnsTuple& data) const {
628
2
    const bool this_is_key = is_key(column_names_[I], key_names_);
629
630
2
    if (this_is_key ? use_keys : use_values) {
631
1
      statement->Bind((*index)++, get<I>(data));
632
1
    }
633
634
2
    BindValues<I + 1>(statement, index, use_values, use_keys, data);
635
2
  }
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_13CassandraJsonEEE10BindValuesILm0EEENS1_9enable_ifIXltT_L_ZNS1_17integral_constantImLm2EE5valueEEEvE4typeEPNS_18CassandraStatementEPmbbRKNS1_5tupleIJS7_S8_EEE
Line
Count
Source
627
8
      const ColumnsTuple& data) const {
628
8
    const bool this_is_key = is_key(column_names_[I], key_names_);
629
630
8
    if (this_is_key ? use_keys : use_values) {
631
7
      statement->Bind((*index)++, get<I>(data));
632
7
    }
633
634
8
    BindValues<I + 1>(statement, index, use_values, use_keys, data);
635
8
  }
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_13CassandraJsonEEE10BindValuesILm1EEENS1_9enable_ifIXltT_L_ZNS1_17integral_constantImLm2EE5valueEEEvE4typeEPNS_18CassandraStatementEPmbbRKNS1_5tupleIJS7_S8_EEE
Line
Count
Source
627
8
      const ColumnsTuple& data) const {
628
8
    const bool this_is_key = is_key(column_names_[I], key_names_);
629
630
8
    if (this_is_key ? use_keys : use_values) {
631
3
      statement->Bind((*index)++, get<I>(data));
632
3
    }
633
634
8
    BindValues<I + 1>(statement, index, use_values, use_keys, data);
635
8
  }
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES7_S7_EE10BindValuesILm0EEENS1_9enable_ifIXltT_L_ZNS1_17integral_constantImLm3EE5valueEEEvE4typeEPNS_18CassandraStatementEPmbbRKNS1_5tupleIJS7_S7_S7_EEE
Line
Count
Source
627
3.00k
      const ColumnsTuple& data) const {
628
3.00k
    const bool this_is_key = is_key(column_names_[I], key_names_);
629
630
3.00k
    if (this_is_key ? use_keys : use_values) {
631
3.00k
      statement->Bind((*index)++, get<I>(data));
632
3.00k
    }
633
634
3.00k
    BindValues<I + 1>(statement, index, use_values, use_keys, data);
635
3.00k
  }
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES7_S7_EE10BindValuesILm1EEENS1_9enable_ifIXltT_L_ZNS1_17integral_constantImLm3EE5valueEEEvE4typeEPNS_18CassandraStatementEPmbbRKNS1_5tupleIJS7_S7_S7_EEE
Line
Count
Source
627
3.00k
      const ColumnsTuple& data) const {
628
3.00k
    const bool this_is_key = is_key(column_names_[I], key_names_);
629
630
3.00k
    if (this_is_key ? use_keys : use_values) {
631
3.00k
      statement->Bind((*index)++, get<I>(data));
632
3.00k
    }
633
634
3.00k
    BindValues<I + 1>(statement, index, use_values, use_keys, data);
635
3.00k
  }
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES7_S7_EE10BindValuesILm2EEENS1_9enable_ifIXltT_L_ZNS1_17integral_constantImLm3EE5valueEEEvE4typeEPNS_18CassandraStatementEPmbbRKNS1_5tupleIJS7_S7_S7_EEE
Line
Count
Source
627
3.00k
      const ColumnsTuple& data) const {
628
3.00k
    const bool this_is_key = is_key(column_names_[I], key_names_);
629
630
3.00k
    if (this_is_key ? use_keys : use_values) {
631
3.00k
      statement->Bind((*index)++, get<I>(data));
632
3.00k
    }
633
634
3.00k
    BindValues<I + 1>(statement, index, use_values, use_keys, data);
635
3.00k
  }
_ZNK2yb9TestTableIJiiEE10BindValuesILm0EEENSt3__19enable_ifIXltT_L_ZNS3_17integral_constantImLm2EE5valueEEEvE4typeEPNS_18CassandraStatementEPmbbRKNS3_5tupleIJiiEEE
Line
Count
Source
627
7.06k
      const ColumnsTuple& data) const {
628
7.06k
    const bool this_is_key = is_key(column_names_[I], key_names_);
629
630
7.06k
    if (this_is_key ? use_keys : use_values) {
631
7.06k
      statement->Bind((*index)++, get<I>(data));
632
7.06k
    }
633
634
7.06k
    BindValues<I + 1>(statement, index, use_values, use_keys, data);
635
7.06k
  }
_ZNK2yb9TestTableIJiiEE10BindValuesILm1EEENSt3__19enable_ifIXltT_L_ZNS3_17integral_constantImLm2EE5valueEEEvE4typeEPNS_18CassandraStatementEPmbbRKNS3_5tupleIJiiEEE
Line
Count
Source
627
7.06k
      const ColumnsTuple& data) const {
628
7.06k
    const bool this_is_key = is_key(column_names_[I], key_names_);
629
630
7.06k
    if (this_is_key ? use_keys : use_values) {
631
7.06k
      statement->Bind((*index)++, get<I>(data));
632
7.06k
    }
633
634
7.06k
    BindValues<I + 1>(statement, index, use_values, use_keys, data);
635
7.06k
  }
_ZNK2yb9TestTableIJ11cass_bool_tiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEiS8_EE10BindValuesILm0EEENS2_9enable_ifIXltT_L_ZNS2_17integral_constantImLm5EE5valueEEEvE4typeEPNS_18CassandraStatementEPmbbRKNS2_5tupleIJS1_iS8_iS8_EEE
Line
Count
Source
627
8
      const ColumnsTuple& data) const {
628
8
    const bool this_is_key = is_key(column_names_[I], key_names_);
629
630
8
    if (this_is_key ? use_keys : use_values) {
631
4
      statement->Bind((*index)++, get<I>(data));
632
4
    }
633
634
8
    BindValues<I + 1>(statement, index, use_values, use_keys, data);
635
8
  }
_ZNK2yb9TestTableIJ11cass_bool_tiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEiS8_EE10BindValuesILm1EEENS2_9enable_ifIXltT_L_ZNS2_17integral_constantImLm5EE5valueEEEvE4typeEPNS_18CassandraStatementEPmbbRKNS2_5tupleIJS1_iS8_iS8_EEE
Line
Count
Source
627
8
      const ColumnsTuple& data) const {
628
8
    const bool this_is_key = is_key(column_names_[I], key_names_);
629
630
8
    if (this_is_key ? use_keys : use_values) {
631
4
      statement->Bind((*index)++, get<I>(data));
632
4
    }
633
634
8
    BindValues<I + 1>(statement, index, use_values, use_keys, data);
635
8
  }
_ZNK2yb9TestTableIJ11cass_bool_tiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEiS8_EE10BindValuesILm2EEENS2_9enable_ifIXltT_L_ZNS2_17integral_constantImLm5EE5valueEEEvE4typeEPNS_18CassandraStatementEPmbbRKNS2_5tupleIJS1_iS8_iS8_EEE
Line
Count
Source
627
8
      const ColumnsTuple& data) const {
628
8
    const bool this_is_key = is_key(column_names_[I], key_names_);
629
630
8
    if (this_is_key ? use_keys : use_values) {
631
8
      statement->Bind((*index)++, get<I>(data));
632
8
    }
633
634
8
    BindValues<I + 1>(statement, index, use_values, use_keys, data);
635
8
  }
_ZNK2yb9TestTableIJ11cass_bool_tiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEiS8_EE10BindValuesILm3EEENS2_9enable_ifIXltT_L_ZNS2_17integral_constantImLm5EE5valueEEEvE4typeEPNS_18CassandraStatementEPmbbRKNS2_5tupleIJS1_iS8_iS8_EEE
Line
Count
Source
627
8
      const ColumnsTuple& data) const {
628
8
    const bool this_is_key = is_key(column_names_[I], key_names_);
629
630
8
    if (this_is_key ? use_keys : use_values) {
631
8
      statement->Bind((*index)++, get<I>(data));
632
8
    }
633
634
8
    BindValues<I + 1>(statement, index, use_values, use_keys, data);
635
8
  }
_ZNK2yb9TestTableIJ11cass_bool_tiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEiS8_EE10BindValuesILm4EEENS2_9enable_ifIXltT_L_ZNS2_17integral_constantImLm5EE5valueEEEvE4typeEPNS_18CassandraStatementEPmbbRKNS2_5tupleIJS1_iS8_iS8_EEE
Line
Count
Source
627
8
      const ColumnsTuple& data) const {
628
8
    const bool this_is_key = is_key(column_names_[I], key_names_);
629
630
8
    if (this_is_key ? use_keys : use_values) {
631
4
      statement->Bind((*index)++, get<I>(data));
632
4
    }
633
634
8
    BindValues<I + 1>(statement, index, use_values, use_keys, data);
635
8
  }
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEdEE10BindValuesILm0EEENS1_9enable_ifIXltT_L_ZNS1_17integral_constantImLm2EE5valueEEEvE4typeEPNS_18CassandraStatementEPmbbRKNS1_5tupleIJS7_dEEE
Line
Count
Source
627
2
      const ColumnsTuple& data) const {
628
2
    const bool this_is_key = is_key(column_names_[I], key_names_);
629
630
2
    if (this_is_key ? use_keys : use_values) {
631
2
      statement->Bind((*index)++, get<I>(data));
632
2
    }
633
634
2
    BindValues<I + 1>(statement, index, use_values, use_keys, data);
635
2
  }
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEdEE10BindValuesILm1EEENS1_9enable_ifIXltT_L_ZNS1_17integral_constantImLm2EE5valueEEEvE4typeEPNS_18CassandraStatementEPmbbRKNS1_5tupleIJS7_dEEE
Line
Count
Source
627
2
      const ColumnsTuple& data) const {
628
2
    const bool this_is_key = is_key(column_names_[I], key_names_);
629
630
2
    if (this_is_key ? use_keys : use_values) {
631
1
      statement->Bind((*index)++, get<I>(data));
632
1
    }
633
634
2
    BindValues<I + 1>(statement, index, use_values, use_keys, data);
635
2
  }
_ZNK2yb9TestTableIJidEE10BindValuesILm0EEENSt3__19enable_ifIXltT_L_ZNS3_17integral_constantImLm2EE5valueEEEvE4typeEPNS_18CassandraStatementEPmbbRKNS3_5tupleIJidEEE
Line
Count
Source
627
2
      const ColumnsTuple& data) const {
628
2
    const bool this_is_key = is_key(column_names_[I], key_names_);
629
630
2
    if (this_is_key ? use_keys : use_values) {
631
2
      statement->Bind((*index)++, get<I>(data));
632
2
    }
633
634
2
    BindValues<I + 1>(statement, index, use_values, use_keys, data);
635
2
  }
_ZNK2yb9TestTableIJidEE10BindValuesILm1EEENSt3__19enable_ifIXltT_L_ZNS3_17integral_constantImLm2EE5valueEEEvE4typeEPNS_18CassandraStatementEPmbbRKNS3_5tupleIJidEEE
Line
Count
Source
627
2
      const ColumnsTuple& data) const {
628
2
    const bool this_is_key = is_key(column_names_[I], key_names_);
629
630
2
    if (this_is_key ? use_keys : use_values) {
631
1
      statement->Bind((*index)++, get<I>(data));
632
1
    }
633
634
2
    BindValues<I + 1>(statement, index, use_values, use_keys, data);
635
2
  }
_ZNK2yb9TestTableIJxdEE10BindValuesILm0EEENSt3__19enable_ifIXltT_L_ZNS3_17integral_constantImLm2EE5valueEEEvE4typeEPNS_18CassandraStatementEPmbbRKNS3_5tupleIJxdEEE
Line
Count
Source
627
2
      const ColumnsTuple& data) const {
628
2
    const bool this_is_key = is_key(column_names_[I], key_names_);
629
630
2
    if (this_is_key ? use_keys : use_values) {
631
2
      statement->Bind((*index)++, get<I>(data));
632
2
    }
633
634
2
    BindValues<I + 1>(statement, index, use_values, use_keys, data);
635
2
  }
_ZNK2yb9TestTableIJxdEE10BindValuesILm1EEENSt3__19enable_ifIXltT_L_ZNS3_17integral_constantImLm2EE5valueEEEvE4typeEPNS_18CassandraStatementEPmbbRKNS3_5tupleIJxdEEE
Line
Count
Source
627
2
      const ColumnsTuple& data) const {
628
2
    const bool this_is_key = is_key(column_names_[I], key_names_);
629
630
2
    if (this_is_key ? use_keys : use_values) {
631
1
      statement->Bind((*index)++, get<I>(data));
632
1
    }
633
634
2
    BindValues<I + 1>(statement, index, use_values, use_keys, data);
635
2
  }
_ZNK2yb9TestTableIJ11cass_bool_tdEE10BindValuesILm0EEENSt3__19enable_ifIXltT_L_ZNS4_17integral_constantImLm2EE5valueEEEvE4typeEPNS_18CassandraStatementEPmbbRKNS4_5tupleIJS1_dEEE
Line
Count
Source
627
2
      const ColumnsTuple& data) const {
628
2
    const bool this_is_key = is_key(column_names_[I], key_names_);
629
630
2
    if (this_is_key ? use_keys : use_values) {
631
2
      statement->Bind((*index)++, get<I>(data));
632
2
    }
633
634
2
    BindValues<I + 1>(statement, index, use_values, use_keys, data);
635
2
  }
_ZNK2yb9TestTableIJ11cass_bool_tdEE10BindValuesILm1EEENSt3__19enable_ifIXltT_L_ZNS4_17integral_constantImLm2EE5valueEEEvE4typeEPNS_18CassandraStatementEPmbbRKNS4_5tupleIJS1_dEEE
Line
Count
Source
627
2
      const ColumnsTuple& data) const {
628
2
    const bool this_is_key = is_key(column_names_[I], key_names_);
629
630
2
    if (this_is_key ? use_keys : use_values) {
631
1
      statement->Bind((*index)++, get<I>(data));
632
1
    }
633
634
2
    BindValues<I + 1>(statement, index, use_values, use_keys, data);
635
2
  }
_ZNK2yb9TestTableIJfdEE10BindValuesILm0EEENSt3__19enable_ifIXltT_L_ZNS3_17integral_constantImLm2EE5valueEEEvE4typeEPNS_18CassandraStatementEPmbbRKNS3_5tupleIJfdEEE
Line
Count
Source
627
2
      const ColumnsTuple& data) const {
628
2
    const bool this_is_key = is_key(column_names_[I], key_names_);
629
630
2
    if (this_is_key ? use_keys : use_values) {
631
2
      statement->Bind((*index)++, get<I>(data));
632
2
    }
633
634
2
    BindValues<I + 1>(statement, index, use_values, use_keys, data);
635
2
  }
_ZNK2yb9TestTableIJfdEE10BindValuesILm1EEENSt3__19enable_ifIXltT_L_ZNS3_17integral_constantImLm2EE5valueEEEvE4typeEPNS_18CassandraStatementEPmbbRKNS3_5tupleIJfdEEE
Line
Count
Source
627
2
      const ColumnsTuple& data) const {
628
2
    const bool this_is_key = is_key(column_names_[I], key_names_);
629
630
2
    if (this_is_key ? use_keys : use_values) {
631
1
      statement->Bind((*index)++, get<I>(data));
632
1
    }
633
634
2
    BindValues<I + 1>(statement, index, use_values, use_keys, data);
635
2
  }
_ZNK2yb9TestTableIJddEE10BindValuesILm0EEENSt3__19enable_ifIXltT_L_ZNS3_17integral_constantImLm2EE5valueEEEvE4typeEPNS_18CassandraStatementEPmbbRKNS3_5tupleIJddEEE
Line
Count
Source
627
2
      const ColumnsTuple& data) const {
628
2
    const bool this_is_key = is_key(column_names_[I], key_names_);
629
630
2
    if (this_is_key ? use_keys : use_values) {
631
2
      statement->Bind((*index)++, get<I>(data));
632
2
    }
633
634
2
    BindValues<I + 1>(statement, index, use_values, use_keys, data);
635
2
  }
_ZNK2yb9TestTableIJddEE10BindValuesILm1EEENSt3__19enable_ifIXltT_L_ZNS3_17integral_constantImLm2EE5valueEEEvE4typeEPNS_18CassandraStatementEPmbbRKNS3_5tupleIJddEEE
Line
Count
Source
627
2
      const ColumnsTuple& data) const {
628
2
    const bool this_is_key = is_key(column_names_[I], key_names_);
629
630
2
    if (this_is_key ? use_keys : use_values) {
631
1
      statement->Bind((*index)++, get<I>(data));
632
1
    }
633
634
2
    BindValues<I + 1>(statement, index, use_values, use_keys, data);
635
2
  }
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEidEE10BindValuesILm0EEENS1_9enable_ifIXltT_L_ZNS1_17integral_constantImLm3EE5valueEEEvE4typeEPNS_18CassandraStatementEPmbbRKNS1_5tupleIJS7_idEEE
Line
Count
Source
627
2
      const ColumnsTuple& data) const {
628
2
    const bool this_is_key = is_key(column_names_[I], key_names_);
629
630
2
    if (this_is_key ? use_keys : use_values) {
631
2
      statement->Bind((*index)++, get<I>(data));
632
2
    }
633
634
2
    BindValues<I + 1>(statement, index, use_values, use_keys, data);
635
2
  }
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEidEE10BindValuesILm1EEENS1_9enable_ifIXltT_L_ZNS1_17integral_constantImLm3EE5valueEEEvE4typeEPNS_18CassandraStatementEPmbbRKNS1_5tupleIJS7_idEEE
Line
Count
Source
627
2
      const ColumnsTuple& data) const {
628
2
    const bool this_is_key = is_key(column_names_[I], key_names_);
629
630
2
    if (this_is_key ? use_keys : use_values) {
631
2
      statement->Bind((*index)++, get<I>(data));
632
2
    }
633
634
2
    BindValues<I + 1>(statement, index, use_values, use_keys, data);
635
2
  }
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEidEE10BindValuesILm2EEENS1_9enable_ifIXltT_L_ZNS1_17integral_constantImLm3EE5valueEEEvE4typeEPNS_18CassandraStatementEPmbbRKNS1_5tupleIJS7_idEEE
Line
Count
Source
627
2
      const ColumnsTuple& data) const {
628
2
    const bool this_is_key = is_key(column_names_[I], key_names_);
629
630
2
    if (this_is_key ? use_keys : use_values) {
631
1
      statement->Bind((*index)++, get<I>(data));
632
1
    }
633
634
2
    BindValues<I + 1>(statement, index, use_values, use_keys, data);
635
2
  }
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES7_EE10BindValuesILm0EEENS1_9enable_ifIXltT_L_ZNS1_17integral_constantImLm2EE5valueEEEvE4typeEPNS_18CassandraStatementEPmbbRKNS1_5tupleIJS7_S7_EEE
Line
Count
Source
627
100
      const ColumnsTuple& data) const {
628
100
    const bool this_is_key = is_key(column_names_[I], key_names_);
629
630
100
    if (this_is_key ? use_keys : use_values) {
631
100
      statement->Bind((*index)++, get<I>(data));
632
100
    }
633
634
100
    BindValues<I + 1>(statement, index, use_values, use_keys, data);
635
100
  }
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES7_EE10BindValuesILm1EEENS1_9enable_ifIXltT_L_ZNS1_17integral_constantImLm2EE5valueEEEvE4typeEPNS_18CassandraStatementEPmbbRKNS1_5tupleIJS7_S7_EEE
Line
Count
Source
627
100
      const ColumnsTuple& data) const {
628
100
    const bool this_is_key = is_key(column_names_[I], key_names_);
629
630
100
    if (this_is_key ? use_keys : use_values) {
631
100
      statement->Bind((*index)++, get<I>(data));
632
100
    }
633
634
100
    BindValues<I + 1>(statement, index, use_values, use_keys, data);
635
100
  }
Unexecuted instantiation: _ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEExS7_EE10BindValuesILm0EEENS1_9enable_ifIXltT_L_ZNS1_17integral_constantImLm3EE5valueEEEvE4typeEPNS_18CassandraStatementEPmbbRKNS1_5tupleIJS7_xS7_EEE
Unexecuted instantiation: _ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEExS7_EE10BindValuesILm1EEENS1_9enable_ifIXltT_L_ZNS1_17integral_constantImLm3EE5valueEEEvE4typeEPNS_18CassandraStatementEPmbbRKNS1_5tupleIJS7_xS7_EEE
Unexecuted instantiation: _ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEExS7_EE10BindValuesILm2EEENS1_9enable_ifIXltT_L_ZNS1_17integral_constantImLm3EE5valueEEEvE4typeEPNS_18CassandraStatementEPmbbRKNS1_5tupleIJS7_xS7_EEE
_ZNK2yb9TestTableIJxxEE10BindValuesILm0EEENSt3__19enable_ifIXltT_L_ZNS3_17integral_constantImLm2EE5valueEEEvE4typeEPNS_18CassandraStatementEPmbbRKNS3_5tupleIJxxEEE
Line
Count
Source
627
9.00k
      const ColumnsTuple& data) const {
628
9.00k
    const bool this_is_key = is_key(column_names_[I], key_names_);
629
630
9.00k
    if (this_is_key ? use_keys : use_values) {
631
9.00k
      statement->Bind((*index)++, get<I>(data));
632
9.00k
    }
633
634
9.00k
    BindValues<I + 1>(statement, index, use_values, use_keys, data);
635
9.00k
  }
_ZNK2yb9TestTableIJxxEE10BindValuesILm1EEENSt3__19enable_ifIXltT_L_ZNS3_17integral_constantImLm2EE5valueEEEvE4typeEPNS_18CassandraStatementEPmbbRKNS3_5tupleIJxxEEE
Line
Count
Source
627
9.00k
      const ColumnsTuple& data) const {
628
9.00k
    const bool this_is_key = is_key(column_names_[I], key_names_);
629
630
9.00k
    if (this_is_key ? use_keys : use_values) {
631
9.00k
      statement->Bind((*index)++, get<I>(data));
632
9.00k
    }
633
634
9.00k
    BindValues<I + 1>(statement, index, use_values, use_keys, data);
635
9.00k
  }
636
637
  void DoBindValues(
638
      CassandraStatement* statement, bool keys_only, bool values_first,
639
19.1k
      const ColumnsTuple& data) const {
640
19.1k
    size_t i = 0;
641
19.1k
    if (keys_only) {
642
16
      BindValues<0>(statement, &i, false /* use_values */, true /* use_keys */, data);
643
19.1k
    } else if (values_first) {
644
      // Bind values.
645
1
      BindValues<0>(statement, &i, true /* use_values */, false /* use_keys */, data);
646
      // Bind keys.
647
1
      BindValues<0>(statement, &i, false /* use_values */, true /* use_keys */, data);
648
19.1k
    } else {
649
19.1k
      BindValues<0>(statement, &i, true /* use_values */, true /* use_keys */, data);
650
19.1k
    }
651
19.1k
  }
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE11cass_bool_tfdixS7_EE12DoBindValuesEPNS_18CassandraStatementEbbRKNS1_5tupleIJS7_S8_fdixS7_EEE
Line
Count
Source
639
2
      const ColumnsTuple& data) const {
640
2
    size_t i = 0;
641
2
    if (keys_only) {
642
1
      BindValues<0>(statement, &i, false /* use_values */, true /* use_keys */, data);
643
1
    } else if (values_first) {
644
      // Bind values.
645
0
      BindValues<0>(statement, &i, true /* use_values */, false /* use_keys */, data);
646
      // Bind keys.
647
0
      BindValues<0>(statement, &i, false /* use_values */, true /* use_keys */, data);
648
1
    } else {
649
1
      BindValues<0>(statement, &i, true /* use_values */, true /* use_keys */, data);
650
1
    }
651
2
  }
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_13CassandraJsonEEE12DoBindValuesEPNS_18CassandraStatementEbbRKNS1_5tupleIJS7_S8_EEE
Line
Count
Source
639
7
      const ColumnsTuple& data) const {
640
7
    size_t i = 0;
641
7
    if (keys_only) {
642
4
      BindValues<0>(statement, &i, false /* use_values */, true /* use_keys */, data);
643
3
    } else if (values_first) {
644
      // Bind values.
645
1
      BindValues<0>(statement, &i, true /* use_values */, false /* use_keys */, data);
646
      // Bind keys.
647
1
      BindValues<0>(statement, &i, false /* use_values */, true /* use_keys */, data);
648
2
    } else {
649
2
      BindValues<0>(statement, &i, true /* use_values */, true /* use_keys */, data);
650
2
    }
651
7
  }
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES7_S7_EE12DoBindValuesEPNS_18CassandraStatementEbbRKNS1_5tupleIJS7_S7_S7_EEE
Line
Count
Source
639
3.00k
      const ColumnsTuple& data) const {
640
3.00k
    size_t i = 0;
641
3.00k
    if (keys_only) {
642
0
      BindValues<0>(statement, &i, false /* use_values */, true /* use_keys */, data);
643
3.00k
    } else if (values_first) {
644
      // Bind values.
645
0
      BindValues<0>(statement, &i, true /* use_values */, false /* use_keys */, data);
646
      // Bind keys.
647
0
      BindValues<0>(statement, &i, false /* use_values */, true /* use_keys */, data);
648
3.00k
    } else {
649
3.00k
      BindValues<0>(statement, &i, true /* use_values */, true /* use_keys */, data);
650
3.00k
    }
651
3.00k
  }
_ZNK2yb9TestTableIJiiEE12DoBindValuesEPNS_18CassandraStatementEbbRKNSt3__15tupleIJiiEEE
Line
Count
Source
639
7.06k
      const ColumnsTuple& data) const {
640
7.06k
    size_t i = 0;
641
7.06k
    if (keys_only) {
642
0
      BindValues<0>(statement, &i, false /* use_values */, true /* use_keys */, data);
643
7.06k
    } else if (values_first) {
644
      // Bind values.
645
0
      BindValues<0>(statement, &i, true /* use_values */, false /* use_keys */, data);
646
      // Bind keys.
647
0
      BindValues<0>(statement, &i, false /* use_values */, true /* use_keys */, data);
648
7.06k
    } else {
649
7.06k
      BindValues<0>(statement, &i, true /* use_values */, true /* use_keys */, data);
650
7.06k
    }
651
7.06k
  }
_ZNK2yb9TestTableIJ11cass_bool_tiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEiS8_EE12DoBindValuesEPNS_18CassandraStatementEbbRKNS2_5tupleIJS1_iS8_iS8_EEE
Line
Count
Source
639
8
      const ColumnsTuple& data) const {
640
8
    size_t i = 0;
641
8
    if (keys_only) {
642
4
      BindValues<0>(statement, &i, false /* use_values */, true /* use_keys */, data);
643
4
    } else if (values_first) {
644
      // Bind values.
645
0
      BindValues<0>(statement, &i, true /* use_values */, false /* use_keys */, data);
646
      // Bind keys.
647
0
      BindValues<0>(statement, &i, false /* use_values */, true /* use_keys */, data);
648
4
    } else {
649
4
      BindValues<0>(statement, &i, true /* use_values */, true /* use_keys */, data);
650
4
    }
651
8
  }
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEdEE12DoBindValuesEPNS_18CassandraStatementEbbRKNS1_5tupleIJS7_dEEE
Line
Count
Source
639
2
      const ColumnsTuple& data) const {
640
2
    size_t i = 0;
641
2
    if (keys_only) {
642
1
      BindValues<0>(statement, &i, false /* use_values */, true /* use_keys */, data);
643
1
    } else if (values_first) {
644
      // Bind values.
645
0
      BindValues<0>(statement, &i, true /* use_values */, false /* use_keys */, data);
646
      // Bind keys.
647
0
      BindValues<0>(statement, &i, false /* use_values */, true /* use_keys */, data);
648
1
    } else {
649
1
      BindValues<0>(statement, &i, true /* use_values */, true /* use_keys */, data);
650
1
    }
651
2
  }
_ZNK2yb9TestTableIJidEE12DoBindValuesEPNS_18CassandraStatementEbbRKNSt3__15tupleIJidEEE
Line
Count
Source
639
2
      const ColumnsTuple& data) const {
640
2
    size_t i = 0;
641
2
    if (keys_only) {
642
1
      BindValues<0>(statement, &i, false /* use_values */, true /* use_keys */, data);
643
1
    } else if (values_first) {
644
      // Bind values.
645
0
      BindValues<0>(statement, &i, true /* use_values */, false /* use_keys */, data);
646
      // Bind keys.
647
0
      BindValues<0>(statement, &i, false /* use_values */, true /* use_keys */, data);
648
1
    } else {
649
1
      BindValues<0>(statement, &i, true /* use_values */, true /* use_keys */, data);
650
1
    }
651
2
  }
_ZNK2yb9TestTableIJxdEE12DoBindValuesEPNS_18CassandraStatementEbbRKNSt3__15tupleIJxdEEE
Line
Count
Source
639
2
      const ColumnsTuple& data) const {
640
2
    size_t i = 0;
641
2
    if (keys_only) {
642
1
      BindValues<0>(statement, &i, false /* use_values */, true /* use_keys */, data);
643
1
    } else if (values_first) {
644
      // Bind values.
645
0
      BindValues<0>(statement, &i, true /* use_values */, false /* use_keys */, data);
646
      // Bind keys.
647
0
      BindValues<0>(statement, &i, false /* use_values */, true /* use_keys */, data);
648
1
    } else {
649
1
      BindValues<0>(statement, &i, true /* use_values */, true /* use_keys */, data);
650
1
    }
651
2
  }
_ZNK2yb9TestTableIJ11cass_bool_tdEE12DoBindValuesEPNS_18CassandraStatementEbbRKNSt3__15tupleIJS1_dEEE
Line
Count
Source
639
2
      const ColumnsTuple& data) const {
640
2
    size_t i = 0;
641
2
    if (keys_only) {
642
1
      BindValues<0>(statement, &i, false /* use_values */, true /* use_keys */, data);
643
1
    } else if (values_first) {
644
      // Bind values.
645
0
      BindValues<0>(statement, &i, true /* use_values */, false /* use_keys */, data);
646
      // Bind keys.
647
0
      BindValues<0>(statement, &i, false /* use_values */, true /* use_keys */, data);
648
1
    } else {
649
1
      BindValues<0>(statement, &i, true /* use_values */, true /* use_keys */, data);
650
1
    }
651
2
  }
_ZNK2yb9TestTableIJfdEE12DoBindValuesEPNS_18CassandraStatementEbbRKNSt3__15tupleIJfdEEE
Line
Count
Source
639
2
      const ColumnsTuple& data) const {
640
2
    size_t i = 0;
641
2
    if (keys_only) {
642
1
      BindValues<0>(statement, &i, false /* use_values */, true /* use_keys */, data);
643
1
    } else if (values_first) {
644
      // Bind values.
645
0
      BindValues<0>(statement, &i, true /* use_values */, false /* use_keys */, data);
646
      // Bind keys.
647
0
      BindValues<0>(statement, &i, false /* use_values */, true /* use_keys */, data);
648
1
    } else {
649
1
      BindValues<0>(statement, &i, true /* use_values */, true /* use_keys */, data);
650
1
    }
651
2
  }
_ZNK2yb9TestTableIJddEE12DoBindValuesEPNS_18CassandraStatementEbbRKNSt3__15tupleIJddEEE
Line
Count
Source
639
2
      const ColumnsTuple& data) const {
640
2
    size_t i = 0;
641
2
    if (keys_only) {
642
1
      BindValues<0>(statement, &i, false /* use_values */, true /* use_keys */, data);
643
1
    } else if (values_first) {
644
      // Bind values.
645
0
      BindValues<0>(statement, &i, true /* use_values */, false /* use_keys */, data);
646
      // Bind keys.
647
0
      BindValues<0>(statement, &i, false /* use_values */, true /* use_keys */, data);
648
1
    } else {
649
1
      BindValues<0>(statement, &i, true /* use_values */, true /* use_keys */, data);
650
1
    }
651
2
  }
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEidEE12DoBindValuesEPNS_18CassandraStatementEbbRKNS1_5tupleIJS7_idEEE
Line
Count
Source
639
2
      const ColumnsTuple& data) const {
640
2
    size_t i = 0;
641
2
    if (keys_only) {
642
1
      BindValues<0>(statement, &i, false /* use_values */, true /* use_keys */, data);
643
1
    } else if (values_first) {
644
      // Bind values.
645
0
      BindValues<0>(statement, &i, true /* use_values */, false /* use_keys */, data);
646
      // Bind keys.
647
0
      BindValues<0>(statement, &i, false /* use_values */, true /* use_keys */, data);
648
1
    } else {
649
1
      BindValues<0>(statement, &i, true /* use_values */, true /* use_keys */, data);
650
1
    }
651
2
  }
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES7_EE12DoBindValuesEPNS_18CassandraStatementEbbRKNS1_5tupleIJS7_S7_EEE
Line
Count
Source
639
100
      const ColumnsTuple& data) const {
640
100
    size_t i = 0;
641
100
    if (keys_only) {
642
0
      BindValues<0>(statement, &i, false /* use_values */, true /* use_keys */, data);
643
100
    } else if (values_first) {
644
      // Bind values.
645
0
      BindValues<0>(statement, &i, true /* use_values */, false /* use_keys */, data);
646
      // Bind keys.
647
0
      BindValues<0>(statement, &i, false /* use_values */, true /* use_keys */, data);
648
100
    } else {
649
100
      BindValues<0>(statement, &i, true /* use_values */, true /* use_keys */, data);
650
100
    }
651
100
  }
Unexecuted instantiation: _ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEExS7_EE12DoBindValuesEPNS_18CassandraStatementEbbRKNS1_5tupleIJS7_xS7_EEE
_ZNK2yb9TestTableIJxxEE12DoBindValuesEPNS_18CassandraStatementEbbRKNSt3__15tupleIJxxEEE
Line
Count
Source
639
9.00k
      const ColumnsTuple& data) const {
640
9.00k
    size_t i = 0;
641
9.00k
    if (keys_only) {
642
0
      BindValues<0>(statement, &i, false /* use_values */, true /* use_keys */, data);
643
9.00k
    } else if (values_first) {
644
      // Bind values.
645
0
      BindValues<0>(statement, &i, true /* use_values */, false /* use_keys */, data);
646
      // Bind keys.
647
0
      BindValues<0>(statement, &i, false /* use_values */, true /* use_keys */, data);
648
9.00k
    } else {
649
9.00k
      BindValues<0>(statement, &i, true /* use_values */, true /* use_keys */, data);
650
9.00k
    }
651
9.00k
  }
652
653
  template<size_t I>
654
  typename std::enable_if<I >= std::tuple_size<ColumnsTuple>::value, void>::type
655
40
  ReadValues(const CassandraRow& row, size_t*, bool, ColumnsTuple*) const {}
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE11cass_bool_tfdixS7_EE10ReadValuesILm7EEENS1_9enable_ifIXgeT_L_ZNS1_17integral_constantImLm7EE5valueEEEvE4typeERKNS_12CassandraRowEPmbPNS1_5tupleIJS7_S8_fdixS7_EEE
Line
Count
Source
655
2
  ReadValues(const CassandraRow& row, size_t*, bool, ColumnsTuple*) const {}
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_13CassandraJsonEEE10ReadValuesILm2EEENS1_9enable_ifIXgeT_L_ZNS1_17integral_constantImLm2EE5valueEEEvE4typeERKNS_12CassandraRowEPmbPNS1_5tupleIJS7_S8_EEE
Line
Count
Source
655
8
  ReadValues(const CassandraRow& row, size_t*, bool, ColumnsTuple*) const {}
_ZNK2yb9TestTableIJ11cass_bool_tiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEiS8_EE10ReadValuesILm5EEENS2_9enable_ifIXgeT_L_ZNS2_17integral_constantImLm5EE5valueEEEvE4typeERKNS_12CassandraRowEPmbPNS2_5tupleIJS1_iS8_iS8_EEE
Line
Count
Source
655
8
  ReadValues(const CassandraRow& row, size_t*, bool, ColumnsTuple*) const {}
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEdEE10ReadValuesILm2EEENS1_9enable_ifIXgeT_L_ZNS1_17integral_constantImLm2EE5valueEEEvE4typeERKNS_12CassandraRowEPmbPNS1_5tupleIJS7_dEEE
Line
Count
Source
655
4
  ReadValues(const CassandraRow& row, size_t*, bool, ColumnsTuple*) const {}
_ZNK2yb9TestTableIJidEE10ReadValuesILm2EEENSt3__19enable_ifIXgeT_L_ZNS3_17integral_constantImLm2EE5valueEEEvE4typeERKNS_12CassandraRowEPmbPNS3_5tupleIJidEEE
Line
Count
Source
655
4
  ReadValues(const CassandraRow& row, size_t*, bool, ColumnsTuple*) const {}
_ZNK2yb9TestTableIJxdEE10ReadValuesILm2EEENSt3__19enable_ifIXgeT_L_ZNS3_17integral_constantImLm2EE5valueEEEvE4typeERKNS_12CassandraRowEPmbPNS3_5tupleIJxdEEE
Line
Count
Source
655
2
  ReadValues(const CassandraRow& row, size_t*, bool, ColumnsTuple*) const {}
_ZNK2yb9TestTableIJ11cass_bool_tdEE10ReadValuesILm2EEENSt3__19enable_ifIXgeT_L_ZNS4_17integral_constantImLm2EE5valueEEEvE4typeERKNS_12CassandraRowEPmbPNS4_5tupleIJS1_dEEE
Line
Count
Source
655
4
  ReadValues(const CassandraRow& row, size_t*, bool, ColumnsTuple*) const {}
_ZNK2yb9TestTableIJfdEE10ReadValuesILm2EEENSt3__19enable_ifIXgeT_L_ZNS3_17integral_constantImLm2EE5valueEEEvE4typeERKNS_12CassandraRowEPmbPNS3_5tupleIJfdEEE
Line
Count
Source
655
4
  ReadValues(const CassandraRow& row, size_t*, bool, ColumnsTuple*) const {}
_ZNK2yb9TestTableIJddEE10ReadValuesILm2EEENSt3__19enable_ifIXgeT_L_ZNS3_17integral_constantImLm2EE5valueEEEvE4typeERKNS_12CassandraRowEPmbPNS3_5tupleIJddEEE
Line
Count
Source
655
2
  ReadValues(const CassandraRow& row, size_t*, bool, ColumnsTuple*) const {}
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEidEE10ReadValuesILm3EEENS1_9enable_ifIXgeT_L_ZNS1_17integral_constantImLm3EE5valueEEEvE4typeERKNS_12CassandraRowEPmbPNS1_5tupleIJS7_idEEE
Line
Count
Source
655
2
  ReadValues(const CassandraRow& row, size_t*, bool, ColumnsTuple*) const {}
656
657
  template<size_t I>
658
  typename std::enable_if<I < std::tuple_size<ColumnsTuple>::value, void>::type
659
  ReadValues(
660
      const CassandraRow& row, size_t* index, bool use_keys,
661
116
      ColumnsTuple* data) const {
662
116
    const bool this_is_key = is_key(column_names_[I], key_names_);
663
664
116
    if (this_is_key == use_keys) {
665
58
      row.Get(*index, &get<I>(*data));
666
58
      ++*index;
667
58
    }
668
669
116
    ReadValues<I + 1>(row, index, use_keys, data);
670
116
  }
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE11cass_bool_tfdixS7_EE10ReadValuesILm0EEENS1_9enable_ifIXltT_L_ZNS1_17integral_constantImLm7EE5valueEEEvE4typeERKNS_12CassandraRowEPmbPNS1_5tupleIJS7_S8_fdixS7_EEE
Line
Count
Source
661
2
      ColumnsTuple* data) const {
662
2
    const bool this_is_key = is_key(column_names_[I], key_names_);
663
664
2
    if (this_is_key == use_keys) {
665
1
      row.Get(*index, &get<I>(*data));
666
1
      ++*index;
667
1
    }
668
669
2
    ReadValues<I + 1>(row, index, use_keys, data);
670
2
  }
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE11cass_bool_tfdixS7_EE10ReadValuesILm1EEENS1_9enable_ifIXltT_L_ZNS1_17integral_constantImLm7EE5valueEEEvE4typeERKNS_12CassandraRowEPmbPNS1_5tupleIJS7_S8_fdixS7_EEE
Line
Count
Source
661
2
      ColumnsTuple* data) const {
662
2
    const bool this_is_key = is_key(column_names_[I], key_names_);
663
664
2
    if (this_is_key == use_keys) {
665
1
      row.Get(*index, &get<I>(*data));
666
1
      ++*index;
667
1
    }
668
669
2
    ReadValues<I + 1>(row, index, use_keys, data);
670
2
  }
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE11cass_bool_tfdixS7_EE10ReadValuesILm2EEENS1_9enable_ifIXltT_L_ZNS1_17integral_constantImLm7EE5valueEEEvE4typeERKNS_12CassandraRowEPmbPNS1_5tupleIJS7_S8_fdixS7_EEE
Line
Count
Source
661
2
      ColumnsTuple* data) const {
662
2
    const bool this_is_key = is_key(column_names_[I], key_names_);
663
664
2
    if (this_is_key == use_keys) {
665
1
      row.Get(*index, &get<I>(*data));
666
1
      ++*index;
667
1
    }
668
669
2
    ReadValues<I + 1>(row, index, use_keys, data);
670
2
  }
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE11cass_bool_tfdixS7_EE10ReadValuesILm3EEENS1_9enable_ifIXltT_L_ZNS1_17integral_constantImLm7EE5valueEEEvE4typeERKNS_12CassandraRowEPmbPNS1_5tupleIJS7_S8_fdixS7_EEE
Line
Count
Source
661
2
      ColumnsTuple* data) const {
662
2
    const bool this_is_key = is_key(column_names_[I], key_names_);
663
664
2
    if (this_is_key == use_keys) {
665
1
      row.Get(*index, &get<I>(*data));
666
1
      ++*index;
667
1
    }
668
669
2
    ReadValues<I + 1>(row, index, use_keys, data);
670
2
  }
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE11cass_bool_tfdixS7_EE10ReadValuesILm4EEENS1_9enable_ifIXltT_L_ZNS1_17integral_constantImLm7EE5valueEEEvE4typeERKNS_12CassandraRowEPmbPNS1_5tupleIJS7_S8_fdixS7_EEE
Line
Count
Source
661
2
      ColumnsTuple* data) const {
662
2
    const bool this_is_key = is_key(column_names_[I], key_names_);
663
664
2
    if (this_is_key == use_keys) {
665
1
      row.Get(*index, &get<I>(*data));
666
1
      ++*index;
667
1
    }
668
669
2
    ReadValues<I + 1>(row, index, use_keys, data);
670
2
  }
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE11cass_bool_tfdixS7_EE10ReadValuesILm5EEENS1_9enable_ifIXltT_L_ZNS1_17integral_constantImLm7EE5valueEEEvE4typeERKNS_12CassandraRowEPmbPNS1_5tupleIJS7_S8_fdixS7_EEE
Line
Count
Source
661
2
      ColumnsTuple* data) const {
662
2
    const bool this_is_key = is_key(column_names_[I], key_names_);
663
664
2
    if (this_is_key == use_keys) {
665
1
      row.Get(*index, &get<I>(*data));
666
1
      ++*index;
667
1
    }
668
669
2
    ReadValues<I + 1>(row, index, use_keys, data);
670
2
  }
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE11cass_bool_tfdixS7_EE10ReadValuesILm6EEENS1_9enable_ifIXltT_L_ZNS1_17integral_constantImLm7EE5valueEEEvE4typeERKNS_12CassandraRowEPmbPNS1_5tupleIJS7_S8_fdixS7_EEE
Line
Count
Source
661
2
      ColumnsTuple* data) const {
662
2
    const bool this_is_key = is_key(column_names_[I], key_names_);
663
664
2
    if (this_is_key == use_keys) {
665
1
      row.Get(*index, &get<I>(*data));
666
1
      ++*index;
667
1
    }
668
669
2
    ReadValues<I + 1>(row, index, use_keys, data);
670
2
  }
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_13CassandraJsonEEE10ReadValuesILm0EEENS1_9enable_ifIXltT_L_ZNS1_17integral_constantImLm2EE5valueEEEvE4typeERKNS_12CassandraRowEPmbPNS1_5tupleIJS7_S8_EEE
Line
Count
Source
661
8
      ColumnsTuple* data) const {
662
8
    const bool this_is_key = is_key(column_names_[I], key_names_);
663
664
8
    if (this_is_key == use_keys) {
665
4
      row.Get(*index, &get<I>(*data));
666
4
      ++*index;
667
4
    }
668
669
8
    ReadValues<I + 1>(row, index, use_keys, data);
670
8
  }
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_13CassandraJsonEEE10ReadValuesILm1EEENS1_9enable_ifIXltT_L_ZNS1_17integral_constantImLm2EE5valueEEEvE4typeERKNS_12CassandraRowEPmbPNS1_5tupleIJS7_S8_EEE
Line
Count
Source
661
8
      ColumnsTuple* data) const {
662
8
    const bool this_is_key = is_key(column_names_[I], key_names_);
663
664
8
    if (this_is_key == use_keys) {
665
4
      row.Get(*index, &get<I>(*data));
666
4
      ++*index;
667
4
    }
668
669
8
    ReadValues<I + 1>(row, index, use_keys, data);
670
8
  }
_ZNK2yb9TestTableIJ11cass_bool_tiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEiS8_EE10ReadValuesILm0EEENS2_9enable_ifIXltT_L_ZNS2_17integral_constantImLm5EE5valueEEEvE4typeERKNS_12CassandraRowEPmbPNS2_5tupleIJS1_iS8_iS8_EEE
Line
Count
Source
661
8
      ColumnsTuple* data) const {
662
8
    const bool this_is_key = is_key(column_names_[I], key_names_);
663
664
8
    if (this_is_key == use_keys) {
665
4
      row.Get(*index, &get<I>(*data));
666
4
      ++*index;
667
4
    }
668
669
8
    ReadValues<I + 1>(row, index, use_keys, data);
670
8
  }
_ZNK2yb9TestTableIJ11cass_bool_tiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEiS8_EE10ReadValuesILm1EEENS2_9enable_ifIXltT_L_ZNS2_17integral_constantImLm5EE5valueEEEvE4typeERKNS_12CassandraRowEPmbPNS2_5tupleIJS1_iS8_iS8_EEE
Line
Count
Source
661
8
      ColumnsTuple* data) const {
662
8
    const bool this_is_key = is_key(column_names_[I], key_names_);
663
664
8
    if (this_is_key == use_keys) {
665
4
      row.Get(*index, &get<I>(*data));
666
4
      ++*index;
667
4
    }
668
669
8
    ReadValues<I + 1>(row, index, use_keys, data);
670
8
  }
_ZNK2yb9TestTableIJ11cass_bool_tiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEiS8_EE10ReadValuesILm2EEENS2_9enable_ifIXltT_L_ZNS2_17integral_constantImLm5EE5valueEEEvE4typeERKNS_12CassandraRowEPmbPNS2_5tupleIJS1_iS8_iS8_EEE
Line
Count
Source
661
8
      ColumnsTuple* data) const {
662
8
    const bool this_is_key = is_key(column_names_[I], key_names_);
663
664
8
    if (this_is_key == use_keys) {
665
4
      row.Get(*index, &get<I>(*data));
666
4
      ++*index;
667
4
    }
668
669
8
    ReadValues<I + 1>(row, index, use_keys, data);
670
8
  }
_ZNK2yb9TestTableIJ11cass_bool_tiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEiS8_EE10ReadValuesILm3EEENS2_9enable_ifIXltT_L_ZNS2_17integral_constantImLm5EE5valueEEEvE4typeERKNS_12CassandraRowEPmbPNS2_5tupleIJS1_iS8_iS8_EEE
Line
Count
Source
661
8
      ColumnsTuple* data) const {
662
8
    const bool this_is_key = is_key(column_names_[I], key_names_);
663
664
8
    if (this_is_key == use_keys) {
665
4
      row.Get(*index, &get<I>(*data));
666
4
      ++*index;
667
4
    }
668
669
8
    ReadValues<I + 1>(row, index, use_keys, data);
670
8
  }
_ZNK2yb9TestTableIJ11cass_bool_tiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEiS8_EE10ReadValuesILm4EEENS2_9enable_ifIXltT_L_ZNS2_17integral_constantImLm5EE5valueEEEvE4typeERKNS_12CassandraRowEPmbPNS2_5tupleIJS1_iS8_iS8_EEE
Line
Count
Source
661
8
      ColumnsTuple* data) const {
662
8
    const bool this_is_key = is_key(column_names_[I], key_names_);
663
664
8
    if (this_is_key == use_keys) {
665
4
      row.Get(*index, &get<I>(*data));
666
4
      ++*index;
667
4
    }
668
669
8
    ReadValues<I + 1>(row, index, use_keys, data);
670
8
  }
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEdEE10ReadValuesILm0EEENS1_9enable_ifIXltT_L_ZNS1_17integral_constantImLm2EE5valueEEEvE4typeERKNS_12CassandraRowEPmbPNS1_5tupleIJS7_dEEE
Line
Count
Source
661
4
      ColumnsTuple* data) const {
662
4
    const bool this_is_key = is_key(column_names_[I], key_names_);
663
664
4
    if (this_is_key == use_keys) {
665
2
      row.Get(*index, &get<I>(*data));
666
2
      ++*index;
667
2
    }
668
669
4
    ReadValues<I + 1>(row, index, use_keys, data);
670
4
  }
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEdEE10ReadValuesILm1EEENS1_9enable_ifIXltT_L_ZNS1_17integral_constantImLm2EE5valueEEEvE4typeERKNS_12CassandraRowEPmbPNS1_5tupleIJS7_dEEE
Line
Count
Source
661
4
      ColumnsTuple* data) const {
662
4
    const bool this_is_key = is_key(column_names_[I], key_names_);
663
664
4
    if (this_is_key == use_keys) {
665
2
      row.Get(*index, &get<I>(*data));
666
2
      ++*index;
667
2
    }
668
669
4
    ReadValues<I + 1>(row, index, use_keys, data);
670
4
  }
_ZNK2yb9TestTableIJidEE10ReadValuesILm0EEENSt3__19enable_ifIXltT_L_ZNS3_17integral_constantImLm2EE5valueEEEvE4typeERKNS_12CassandraRowEPmbPNS3_5tupleIJidEEE
Line
Count
Source
661
4
      ColumnsTuple* data) const {
662
4
    const bool this_is_key = is_key(column_names_[I], key_names_);
663
664
4
    if (this_is_key == use_keys) {
665
2
      row.Get(*index, &get<I>(*data));
666
2
      ++*index;
667
2
    }
668
669
4
    ReadValues<I + 1>(row, index, use_keys, data);
670
4
  }
_ZNK2yb9TestTableIJidEE10ReadValuesILm1EEENSt3__19enable_ifIXltT_L_ZNS3_17integral_constantImLm2EE5valueEEEvE4typeERKNS_12CassandraRowEPmbPNS3_5tupleIJidEEE
Line
Count
Source
661
4
      ColumnsTuple* data) const {
662
4
    const bool this_is_key = is_key(column_names_[I], key_names_);
663
664
4
    if (this_is_key == use_keys) {
665
2
      row.Get(*index, &get<I>(*data));
666
2
      ++*index;
667
2
    }
668
669
4
    ReadValues<I + 1>(row, index, use_keys, data);
670
4
  }
_ZNK2yb9TestTableIJxdEE10ReadValuesILm0EEENSt3__19enable_ifIXltT_L_ZNS3_17integral_constantImLm2EE5valueEEEvE4typeERKNS_12CassandraRowEPmbPNS3_5tupleIJxdEEE
Line
Count
Source
661
2
      ColumnsTuple* data) const {
662
2
    const bool this_is_key = is_key(column_names_[I], key_names_);
663
664
2
    if (this_is_key == use_keys) {
665
1
      row.Get(*index, &get<I>(*data));
666
1
      ++*index;
667
1
    }
668
669
2
    ReadValues<I + 1>(row, index, use_keys, data);
670
2
  }
_ZNK2yb9TestTableIJxdEE10ReadValuesILm1EEENSt3__19enable_ifIXltT_L_ZNS3_17integral_constantImLm2EE5valueEEEvE4typeERKNS_12CassandraRowEPmbPNS3_5tupleIJxdEEE
Line
Count
Source
661
2
      ColumnsTuple* data) const {
662
2
    const bool this_is_key = is_key(column_names_[I], key_names_);
663
664
2
    if (this_is_key == use_keys) {
665
1
      row.Get(*index, &get<I>(*data));
666
1
      ++*index;
667
1
    }
668
669
2
    ReadValues<I + 1>(row, index, use_keys, data);
670
2
  }
_ZNK2yb9TestTableIJ11cass_bool_tdEE10ReadValuesILm0EEENSt3__19enable_ifIXltT_L_ZNS4_17integral_constantImLm2EE5valueEEEvE4typeERKNS_12CassandraRowEPmbPNS4_5tupleIJS1_dEEE
Line
Count
Source
661
4
      ColumnsTuple* data) const {
662
4
    const bool this_is_key = is_key(column_names_[I], key_names_);
663
664
4
    if (this_is_key == use_keys) {
665
2
      row.Get(*index, &get<I>(*data));
666
2
      ++*index;
667
2
    }
668
669
4
    ReadValues<I + 1>(row, index, use_keys, data);
670
4
  }
_ZNK2yb9TestTableIJ11cass_bool_tdEE10ReadValuesILm1EEENSt3__19enable_ifIXltT_L_ZNS4_17integral_constantImLm2EE5valueEEEvE4typeERKNS_12CassandraRowEPmbPNS4_5tupleIJS1_dEEE
Line
Count
Source
661
4
      ColumnsTuple* data) const {
662
4
    const bool this_is_key = is_key(column_names_[I], key_names_);
663
664
4
    if (this_is_key == use_keys) {
665
2
      row.Get(*index, &get<I>(*data));
666
2
      ++*index;
667
2
    }
668
669
4
    ReadValues<I + 1>(row, index, use_keys, data);
670
4
  }
_ZNK2yb9TestTableIJfdEE10ReadValuesILm0EEENSt3__19enable_ifIXltT_L_ZNS3_17integral_constantImLm2EE5valueEEEvE4typeERKNS_12CassandraRowEPmbPNS3_5tupleIJfdEEE
Line
Count
Source
661
4
      ColumnsTuple* data) const {
662
4
    const bool this_is_key = is_key(column_names_[I], key_names_);
663
664
4
    if (this_is_key == use_keys) {
665
2
      row.Get(*index, &get<I>(*data));
666
2
      ++*index;
667
2
    }
668
669
4
    ReadValues<I + 1>(row, index, use_keys, data);
670
4
  }
_ZNK2yb9TestTableIJfdEE10ReadValuesILm1EEENSt3__19enable_ifIXltT_L_ZNS3_17integral_constantImLm2EE5valueEEEvE4typeERKNS_12CassandraRowEPmbPNS3_5tupleIJfdEEE
Line
Count
Source
661
4
      ColumnsTuple* data) const {
662
4
    const bool this_is_key = is_key(column_names_[I], key_names_);
663
664
4
    if (this_is_key == use_keys) {
665
2
      row.Get(*index, &get<I>(*data));
666
2
      ++*index;
667
2
    }
668
669
4
    ReadValues<I + 1>(row, index, use_keys, data);
670
4
  }
_ZNK2yb9TestTableIJddEE10ReadValuesILm0EEENSt3__19enable_ifIXltT_L_ZNS3_17integral_constantImLm2EE5valueEEEvE4typeERKNS_12CassandraRowEPmbPNS3_5tupleIJddEEE
Line
Count
Source
661
2
      ColumnsTuple* data) const {
662
2
    const bool this_is_key = is_key(column_names_[I], key_names_);
663
664
2
    if (this_is_key == use_keys) {
665
1
      row.Get(*index, &get<I>(*data));
666
1
      ++*index;
667
1
    }
668
669
2
    ReadValues<I + 1>(row, index, use_keys, data);
670
2
  }
_ZNK2yb9TestTableIJddEE10ReadValuesILm1EEENSt3__19enable_ifIXltT_L_ZNS3_17integral_constantImLm2EE5valueEEEvE4typeERKNS_12CassandraRowEPmbPNS3_5tupleIJddEEE
Line
Count
Source
661
2
      ColumnsTuple* data) const {
662
2
    const bool this_is_key = is_key(column_names_[I], key_names_);
663
664
2
    if (this_is_key == use_keys) {
665
1
      row.Get(*index, &get<I>(*data));
666
1
      ++*index;
667
1
    }
668
669
2
    ReadValues<I + 1>(row, index, use_keys, data);
670
2
  }
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEidEE10ReadValuesILm0EEENS1_9enable_ifIXltT_L_ZNS1_17integral_constantImLm3EE5valueEEEvE4typeERKNS_12CassandraRowEPmbPNS1_5tupleIJS7_idEEE
Line
Count
Source
661
2
      ColumnsTuple* data) const {
662
2
    const bool this_is_key = is_key(column_names_[I], key_names_);
663
664
2
    if (this_is_key == use_keys) {
665
1
      row.Get(*index, &get<I>(*data));
666
1
      ++*index;
667
1
    }
668
669
2
    ReadValues<I + 1>(row, index, use_keys, data);
670
2
  }
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEidEE10ReadValuesILm1EEENS1_9enable_ifIXltT_L_ZNS1_17integral_constantImLm3EE5valueEEEvE4typeERKNS_12CassandraRowEPmbPNS1_5tupleIJS7_idEEE
Line
Count
Source
661
2
      ColumnsTuple* data) const {
662
2
    const bool this_is_key = is_key(column_names_[I], key_names_);
663
664
2
    if (this_is_key == use_keys) {
665
1
      row.Get(*index, &get<I>(*data));
666
1
      ++*index;
667
1
    }
668
669
2
    ReadValues<I + 1>(row, index, use_keys, data);
670
2
  }
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEidEE10ReadValuesILm2EEENS1_9enable_ifIXltT_L_ZNS1_17integral_constantImLm3EE5valueEEEvE4typeERKNS_12CassandraRowEPmbPNS1_5tupleIJS7_idEEE
Line
Count
Source
661
2
      ColumnsTuple* data) const {
662
2
    const bool this_is_key = is_key(column_names_[I], key_names_);
663
664
2
    if (this_is_key == use_keys) {
665
1
      row.Get(*index, &get<I>(*data));
666
1
      ++*index;
667
1
    }
668
669
2
    ReadValues<I + 1>(row, index, use_keys, data);
670
2
  }
671
672
20
  void DoReadValues(const CassandraRow& row, ColumnsTuple* data) const {
673
20
    size_t i = 0;
674
    // Read keys.
675
20
    ReadValues<0>(row, &i, true /* use_keys */, data);
676
    // Read values.
677
20
    ReadValues<0>(row, &i, false /* use_keys */, data);
678
20
  }
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE11cass_bool_tfdixS7_EE12DoReadValuesERKNS_12CassandraRowEPNS1_5tupleIJS7_S8_fdixS7_EEE
Line
Count
Source
672
1
  void DoReadValues(const CassandraRow& row, ColumnsTuple* data) const {
673
1
    size_t i = 0;
674
    // Read keys.
675
1
    ReadValues<0>(row, &i, true /* use_keys */, data);
676
    // Read values.
677
1
    ReadValues<0>(row, &i, false /* use_keys */, data);
678
1
  }
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_13CassandraJsonEEE12DoReadValuesERKNS_12CassandraRowEPNS1_5tupleIJS7_S8_EEE
Line
Count
Source
672
4
  void DoReadValues(const CassandraRow& row, ColumnsTuple* data) const {
673
4
    size_t i = 0;
674
    // Read keys.
675
4
    ReadValues<0>(row, &i, true /* use_keys */, data);
676
    // Read values.
677
4
    ReadValues<0>(row, &i, false /* use_keys */, data);
678
4
  }
_ZNK2yb9TestTableIJ11cass_bool_tiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEiS8_EE12DoReadValuesERKNS_12CassandraRowEPNS2_5tupleIJS1_iS8_iS8_EEE
Line
Count
Source
672
4
  void DoReadValues(const CassandraRow& row, ColumnsTuple* data) const {
673
4
    size_t i = 0;
674
    // Read keys.
675
4
    ReadValues<0>(row, &i, true /* use_keys */, data);
676
    // Read values.
677
4
    ReadValues<0>(row, &i, false /* use_keys */, data);
678
4
  }
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEdEE12DoReadValuesERKNS_12CassandraRowEPNS1_5tupleIJS7_dEEE
Line
Count
Source
672
2
  void DoReadValues(const CassandraRow& row, ColumnsTuple* data) const {
673
2
    size_t i = 0;
674
    // Read keys.
675
2
    ReadValues<0>(row, &i, true /* use_keys */, data);
676
    // Read values.
677
2
    ReadValues<0>(row, &i, false /* use_keys */, data);
678
2
  }
_ZNK2yb9TestTableIJidEE12DoReadValuesERKNS_12CassandraRowEPNSt3__15tupleIJidEEE
Line
Count
Source
672
2
  void DoReadValues(const CassandraRow& row, ColumnsTuple* data) const {
673
2
    size_t i = 0;
674
    // Read keys.
675
2
    ReadValues<0>(row, &i, true /* use_keys */, data);
676
    // Read values.
677
2
    ReadValues<0>(row, &i, false /* use_keys */, data);
678
2
  }
_ZNK2yb9TestTableIJxdEE12DoReadValuesERKNS_12CassandraRowEPNSt3__15tupleIJxdEEE
Line
Count
Source
672
1
  void DoReadValues(const CassandraRow& row, ColumnsTuple* data) const {
673
1
    size_t i = 0;
674
    // Read keys.
675
1
    ReadValues<0>(row, &i, true /* use_keys */, data);
676
    // Read values.
677
1
    ReadValues<0>(row, &i, false /* use_keys */, data);
678
1
  }
_ZNK2yb9TestTableIJ11cass_bool_tdEE12DoReadValuesERKNS_12CassandraRowEPNSt3__15tupleIJS1_dEEE
Line
Count
Source
672
2
  void DoReadValues(const CassandraRow& row, ColumnsTuple* data) const {
673
2
    size_t i = 0;
674
    // Read keys.
675
2
    ReadValues<0>(row, &i, true /* use_keys */, data);
676
    // Read values.
677
2
    ReadValues<0>(row, &i, false /* use_keys */, data);
678
2
  }
_ZNK2yb9TestTableIJfdEE12DoReadValuesERKNS_12CassandraRowEPNSt3__15tupleIJfdEEE
Line
Count
Source
672
2
  void DoReadValues(const CassandraRow& row, ColumnsTuple* data) const {
673
2
    size_t i = 0;
674
    // Read keys.
675
2
    ReadValues<0>(row, &i, true /* use_keys */, data);
676
    // Read values.
677
2
    ReadValues<0>(row, &i, false /* use_keys */, data);
678
2
  }
_ZNK2yb9TestTableIJddEE12DoReadValuesERKNS_12CassandraRowEPNSt3__15tupleIJddEEE
Line
Count
Source
672
1
  void DoReadValues(const CassandraRow& row, ColumnsTuple* data) const {
673
1
    size_t i = 0;
674
    // Read keys.
675
1
    ReadValues<0>(row, &i, true /* use_keys */, data);
676
    // Read values.
677
1
    ReadValues<0>(row, &i, false /* use_keys */, data);
678
1
  }
_ZNK2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEidEE12DoReadValuesERKNS_12CassandraRowEPNS1_5tupleIJS7_idEEE
Line
Count
Source
672
1
  void DoReadValues(const CassandraRow& row, ColumnsTuple* data) const {
673
1
    size_t i = 0;
674
    // Read keys.
675
1
    ReadValues<0>(row, &i, true /* use_keys */, data);
676
    // Read values.
677
1
    ReadValues<0>(row, &i, false /* use_keys */, data);
678
1
  }
679
680
  // Strings for CQL requests.
681
682
  static string create_table_str(
683
52
      const string& table, const StringVec& columns, const StringVec& keys, bool transactional) {
684
52
    CHECK_GT(columns.size(), 0);
685
52
    CHECK_GT(keys.size(), 0);
686
52
    CHECK_GE(columns.size(), keys.size());
687
688
52
    StringVec types;
689
52
    do_get_type_names(&types, ColumnsTuple());
690
52
    CHECK_EQ(types.size(), columns.size());
691
692
183
    for (size_t i = 0; i < columns.size(); ++i) {
693
131
      types[i] = columns[i] + ' ' + types[i];
694
131
    }
695
696
697
52
    return Format("CREATE TABLE IF NOT EXISTS $0 ($1, PRIMARY KEY ($2))$3;",
698
52
                  table, JoinStrings(types, ", "), JoinStrings(keys, ", "),
699
27
                  transactional ? " WITH transactions = { 'enabled' : true }" : "");
700
52
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE11cass_bool_tfdixS7_EE16create_table_strERKS7_RKNS1_6vectorIS7_NS5_IS7_EEEESG_b
Line
Count
Source
683
1
      const string& table, const StringVec& columns, const StringVec& keys, bool transactional) {
684
1
    CHECK_GT(columns.size(), 0);
685
1
    CHECK_GT(keys.size(), 0);
686
1
    CHECK_GE(columns.size(), keys.size());
687
688
1
    StringVec types;
689
1
    do_get_type_names(&types, ColumnsTuple());
690
1
    CHECK_EQ(types.size(), columns.size());
691
692
8
    for (size_t i = 0; i < columns.size(); ++i) {
693
7
      types[i] = columns[i] + ' ' + types[i];
694
7
    }
695
696
697
1
    return Format("CREATE TABLE IF NOT EXISTS $0 ($1, PRIMARY KEY ($2))$3;",
698
1
                  table, JoinStrings(types, ", "), JoinStrings(keys, ", "),
699
1
                  transactional ? " WITH transactions = { 'enabled' : true }" : "");
700
1
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_13CassandraJsonEEE16create_table_strERKS7_RKNS1_6vectorIS7_NS5_IS7_EEEESG_b
Line
Count
Source
683
2
      const string& table, const StringVec& columns, const StringVec& keys, bool transactional) {
684
2
    CHECK_GT(columns.size(), 0);
685
2
    CHECK_GT(keys.size(), 0);
686
2
    CHECK_GE(columns.size(), keys.size());
687
688
2
    StringVec types;
689
2
    do_get_type_names(&types, ColumnsTuple());
690
2
    CHECK_EQ(types.size(), columns.size());
691
692
6
    for (size_t i = 0; i < columns.size(); ++i) {
693
4
      types[i] = columns[i] + ' ' + types[i];
694
4
    }
695
696
697
2
    return Format("CREATE TABLE IF NOT EXISTS $0 ($1, PRIMARY KEY ($2))$3;",
698
2
                  table, JoinStrings(types, ", "), JoinStrings(keys, ", "),
699
2
                  transactional ? " WITH transactions = { 'enabled' : true }" : "");
700
2
  }
_ZN2yb9TestTableIJiNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEEE16create_table_strERKS7_RKNS1_6vectorIS7_NS5_IS7_EEEESF_b
Line
Count
Source
683
14
      const string& table, const StringVec& columns, const StringVec& keys, bool transactional) {
684
14
    CHECK_GT(columns.size(), 0);
685
14
    CHECK_GT(keys.size(), 0);
686
14
    CHECK_GE(columns.size(), keys.size());
687
688
14
    StringVec types;
689
14
    do_get_type_names(&types, ColumnsTuple());
690
14
    CHECK_EQ(types.size(), columns.size());
691
692
42
    for (size_t i = 0; i < columns.size(); ++i) {
693
28
      types[i] = columns[i] + ' ' + types[i];
694
28
    }
695
696
697
14
    return Format("CREATE TABLE IF NOT EXISTS $0 ($1, PRIMARY KEY ($2))$3;",
698
14
                  table, JoinStrings(types, ", "), JoinStrings(keys, ", "),
699
14
                  transactional ? " WITH transactions = { 'enabled' : true }" : "");
700
14
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES7_S7_EE16create_table_strERKS7_RKNS1_6vectorIS7_NS5_IS7_EEEESF_b
Line
Count
Source
683
10
      const string& table, const StringVec& columns, const StringVec& keys, bool transactional) {
684
10
    CHECK_GT(columns.size(), 0);
685
10
    CHECK_GT(keys.size(), 0);
686
10
    CHECK_GE(columns.size(), keys.size());
687
688
10
    StringVec types;
689
10
    do_get_type_names(&types, ColumnsTuple());
690
10
    CHECK_EQ(types.size(), columns.size());
691
692
40
    for (size_t i = 0; i < columns.size(); ++i) {
693
30
      types[i] = columns[i] + ' ' + types[i];
694
30
    }
695
696
697
10
    return Format("CREATE TABLE IF NOT EXISTS $0 ($1, PRIMARY KEY ($2))$3;",
698
10
                  table, JoinStrings(types, ", "), JoinStrings(keys, ", "),
699
8
                  transactional ? " WITH transactions = { 'enabled' : true }" : "");
700
10
  }
_ZN2yb9TestTableIJiNS_13CassandraJsonEEE16create_table_strERKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEERKNS3_6vectorIS9_NS7_IS9_EEEESG_b
Line
Count
Source
683
1
      const string& table, const StringVec& columns, const StringVec& keys, bool transactional) {
684
1
    CHECK_GT(columns.size(), 0);
685
1
    CHECK_GT(keys.size(), 0);
686
1
    CHECK_GE(columns.size(), keys.size());
687
688
1
    StringVec types;
689
1
    do_get_type_names(&types, ColumnsTuple());
690
1
    CHECK_EQ(types.size(), columns.size());
691
692
3
    for (size_t i = 0; i < columns.size(); ++i) {
693
2
      types[i] = columns[i] + ' ' + types[i];
694
2
    }
695
696
697
1
    return Format("CREATE TABLE IF NOT EXISTS $0 ($1, PRIMARY KEY ($2))$3;",
698
1
                  table, JoinStrings(types, ", "), JoinStrings(keys, ", "),
699
1
                  transactional ? " WITH transactions = { 'enabled' : true }" : "");
700
1
  }
_ZN2yb9TestTableIJiiEE16create_table_strERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKNS2_6vectorIS8_NS6_IS8_EEEESF_b
Line
Count
Source
683
7
      const string& table, const StringVec& columns, const StringVec& keys, bool transactional) {
684
7
    CHECK_GT(columns.size(), 0);
685
7
    CHECK_GT(keys.size(), 0);
686
7
    CHECK_GE(columns.size(), keys.size());
687
688
7
    StringVec types;
689
7
    do_get_type_names(&types, ColumnsTuple());
690
7
    CHECK_EQ(types.size(), columns.size());
691
692
21
    for (size_t i = 0; i < columns.size(); ++i) {
693
14
      types[i] = columns[i] + ' ' + types[i];
694
14
    }
695
696
697
7
    return Format("CREATE TABLE IF NOT EXISTS $0 ($1, PRIMARY KEY ($2))$3;",
698
7
                  table, JoinStrings(types, ", "), JoinStrings(keys, ", "),
699
4
                  transactional ? " WITH transactions = { 'enabled' : true }" : "");
700
7
  }
_ZN2yb9TestTableIJ11cass_bool_tiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEiS8_EE16create_table_strERKS8_RKNS2_6vectorIS8_NS6_IS8_EEEESG_b
Line
Count
Source
683
4
      const string& table, const StringVec& columns, const StringVec& keys, bool transactional) {
684
4
    CHECK_GT(columns.size(), 0);
685
4
    CHECK_GT(keys.size(), 0);
686
4
    CHECK_GE(columns.size(), keys.size());
687
688
4
    StringVec types;
689
4
    do_get_type_names(&types, ColumnsTuple());
690
4
    CHECK_EQ(types.size(), columns.size());
691
692
24
    for (size_t i = 0; i < columns.size(); ++i) {
693
20
      types[i] = columns[i] + ' ' + types[i];
694
20
    }
695
696
697
4
    return Format("CREATE TABLE IF NOT EXISTS $0 ($1, PRIMARY KEY ($2))$3;",
698
4
                  table, JoinStrings(types, ", "), JoinStrings(keys, ", "),
699
4
                  transactional ? " WITH transactions = { 'enabled' : true }" : "");
700
4
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEdEE16create_table_strERKS7_RKNS1_6vectorIS7_NS5_IS7_EEEESF_b
Line
Count
Source
683
1
      const string& table, const StringVec& columns, const StringVec& keys, bool transactional) {
684
1
    CHECK_GT(columns.size(), 0);
685
1
    CHECK_GT(keys.size(), 0);
686
1
    CHECK_GE(columns.size(), keys.size());
687
688
1
    StringVec types;
689
1
    do_get_type_names(&types, ColumnsTuple());
690
1
    CHECK_EQ(types.size(), columns.size());
691
692
3
    for (size_t i = 0; i < columns.size(); ++i) {
693
2
      types[i] = columns[i] + ' ' + types[i];
694
2
    }
695
696
697
1
    return Format("CREATE TABLE IF NOT EXISTS $0 ($1, PRIMARY KEY ($2))$3;",
698
1
                  table, JoinStrings(types, ", "), JoinStrings(keys, ", "),
699
1
                  transactional ? " WITH transactions = { 'enabled' : true }" : "");
700
1
  }
_ZN2yb9TestTableIJidEE16create_table_strERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKNS2_6vectorIS8_NS6_IS8_EEEESF_b
Line
Count
Source
683
1
      const string& table, const StringVec& columns, const StringVec& keys, bool transactional) {
684
1
    CHECK_GT(columns.size(), 0);
685
1
    CHECK_GT(keys.size(), 0);
686
1
    CHECK_GE(columns.size(), keys.size());
687
688
1
    StringVec types;
689
1
    do_get_type_names(&types, ColumnsTuple());
690
1
    CHECK_EQ(types.size(), columns.size());
691
692
3
    for (size_t i = 0; i < columns.size(); ++i) {
693
2
      types[i] = columns[i] + ' ' + types[i];
694
2
    }
695
696
697
1
    return Format("CREATE TABLE IF NOT EXISTS $0 ($1, PRIMARY KEY ($2))$3;",
698
1
                  table, JoinStrings(types, ", "), JoinStrings(keys, ", "),
699
1
                  transactional ? " WITH transactions = { 'enabled' : true }" : "");
700
1
  }
_ZN2yb9TestTableIJxdEE16create_table_strERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKNS2_6vectorIS8_NS6_IS8_EEEESF_b
Line
Count
Source
683
1
      const string& table, const StringVec& columns, const StringVec& keys, bool transactional) {
684
1
    CHECK_GT(columns.size(), 0);
685
1
    CHECK_GT(keys.size(), 0);
686
1
    CHECK_GE(columns.size(), keys.size());
687
688
1
    StringVec types;
689
1
    do_get_type_names(&types, ColumnsTuple());
690
1
    CHECK_EQ(types.size(), columns.size());
691
692
3
    for (size_t i = 0; i < columns.size(); ++i) {
693
2
      types[i] = columns[i] + ' ' + types[i];
694
2
    }
695
696
697
1
    return Format("CREATE TABLE IF NOT EXISTS $0 ($1, PRIMARY KEY ($2))$3;",
698
1
                  table, JoinStrings(types, ", "), JoinStrings(keys, ", "),
699
1
                  transactional ? " WITH transactions = { 'enabled' : true }" : "");
700
1
  }
_ZN2yb9TestTableIJ11cass_bool_tdEE16create_table_strERKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEERKNS3_6vectorIS9_NS7_IS9_EEEESG_b
Line
Count
Source
683
1
      const string& table, const StringVec& columns, const StringVec& keys, bool transactional) {
684
1
    CHECK_GT(columns.size(), 0);
685
1
    CHECK_GT(keys.size(), 0);
686
1
    CHECK_GE(columns.size(), keys.size());
687
688
1
    StringVec types;
689
1
    do_get_type_names(&types, ColumnsTuple());
690
1
    CHECK_EQ(types.size(), columns.size());
691
692
3
    for (size_t i = 0; i < columns.size(); ++i) {
693
2
      types[i] = columns[i] + ' ' + types[i];
694
2
    }
695
696
697
1
    return Format("CREATE TABLE IF NOT EXISTS $0 ($1, PRIMARY KEY ($2))$3;",
698
1
                  table, JoinStrings(types, ", "), JoinStrings(keys, ", "),
699
1
                  transactional ? " WITH transactions = { 'enabled' : true }" : "");
700
1
  }
_ZN2yb9TestTableIJfdEE16create_table_strERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKNS2_6vectorIS8_NS6_IS8_EEEESF_b
Line
Count
Source
683
1
      const string& table, const StringVec& columns, const StringVec& keys, bool transactional) {
684
1
    CHECK_GT(columns.size(), 0);
685
1
    CHECK_GT(keys.size(), 0);
686
1
    CHECK_GE(columns.size(), keys.size());
687
688
1
    StringVec types;
689
1
    do_get_type_names(&types, ColumnsTuple());
690
1
    CHECK_EQ(types.size(), columns.size());
691
692
3
    for (size_t i = 0; i < columns.size(); ++i) {
693
2
      types[i] = columns[i] + ' ' + types[i];
694
2
    }
695
696
697
1
    return Format("CREATE TABLE IF NOT EXISTS $0 ($1, PRIMARY KEY ($2))$3;",
698
1
                  table, JoinStrings(types, ", "), JoinStrings(keys, ", "),
699
1
                  transactional ? " WITH transactions = { 'enabled' : true }" : "");
700
1
  }
_ZN2yb9TestTableIJddEE16create_table_strERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKNS2_6vectorIS8_NS6_IS8_EEEESF_b
Line
Count
Source
683
1
      const string& table, const StringVec& columns, const StringVec& keys, bool transactional) {
684
1
    CHECK_GT(columns.size(), 0);
685
1
    CHECK_GT(keys.size(), 0);
686
1
    CHECK_GE(columns.size(), keys.size());
687
688
1
    StringVec types;
689
1
    do_get_type_names(&types, ColumnsTuple());
690
1
    CHECK_EQ(types.size(), columns.size());
691
692
3
    for (size_t i = 0; i < columns.size(); ++i) {
693
2
      types[i] = columns[i] + ' ' + types[i];
694
2
    }
695
696
697
1
    return Format("CREATE TABLE IF NOT EXISTS $0 ($1, PRIMARY KEY ($2))$3;",
698
1
                  table, JoinStrings(types, ", "), JoinStrings(keys, ", "),
699
1
                  transactional ? " WITH transactions = { 'enabled' : true }" : "");
700
1
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEidEE16create_table_strERKS7_RKNS1_6vectorIS7_NS5_IS7_EEEESF_b
Line
Count
Source
683
1
      const string& table, const StringVec& columns, const StringVec& keys, bool transactional) {
684
1
    CHECK_GT(columns.size(), 0);
685
1
    CHECK_GT(keys.size(), 0);
686
1
    CHECK_GE(columns.size(), keys.size());
687
688
1
    StringVec types;
689
1
    do_get_type_names(&types, ColumnsTuple());
690
1
    CHECK_EQ(types.size(), columns.size());
691
692
4
    for (size_t i = 0; i < columns.size(); ++i) {
693
3
      types[i] = columns[i] + ' ' + types[i];
694
3
    }
695
696
697
1
    return Format("CREATE TABLE IF NOT EXISTS $0 ($1, PRIMARY KEY ($2))$3;",
698
1
                  table, JoinStrings(types, ", "), JoinStrings(keys, ", "),
699
1
                  transactional ? " WITH transactions = { 'enabled' : true }" : "");
700
1
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES7_EE16create_table_strERKS7_RKNS1_6vectorIS7_NS5_IS7_EEEESF_b
Line
Count
Source
683
1
      const string& table, const StringVec& columns, const StringVec& keys, bool transactional) {
684
1
    CHECK_GT(columns.size(), 0);
685
1
    CHECK_GT(keys.size(), 0);
686
1
    CHECK_GE(columns.size(), keys.size());
687
688
1
    StringVec types;
689
1
    do_get_type_names(&types, ColumnsTuple());
690
1
    CHECK_EQ(types.size(), columns.size());
691
692
3
    for (size_t i = 0; i < columns.size(); ++i) {
693
2
      types[i] = columns[i] + ' ' + types[i];
694
2
    }
695
696
697
1
    return Format("CREATE TABLE IF NOT EXISTS $0 ($1, PRIMARY KEY ($2))$3;",
698
1
                  table, JoinStrings(types, ", "), JoinStrings(keys, ", "),
699
1
                  transactional ? " WITH transactions = { 'enabled' : true }" : "");
700
1
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEExS7_EE16create_table_strERKS7_RKNS1_6vectorIS7_NS5_IS7_EEEESF_b
Line
Count
Source
683
1
      const string& table, const StringVec& columns, const StringVec& keys, bool transactional) {
684
1
    CHECK_GT(columns.size(), 0);
685
1
    CHECK_GT(keys.size(), 0);
686
1
    CHECK_GE(columns.size(), keys.size());
687
688
1
    StringVec types;
689
1
    do_get_type_names(&types, ColumnsTuple());
690
1
    CHECK_EQ(types.size(), columns.size());
691
692
4
    for (size_t i = 0; i < columns.size(); ++i) {
693
3
      types[i] = columns[i] + ' ' + types[i];
694
3
    }
695
696
697
1
    return Format("CREATE TABLE IF NOT EXISTS $0 ($1, PRIMARY KEY ($2))$3;",
698
1
                  table, JoinStrings(types, ", "), JoinStrings(keys, ", "),
699
1
                  transactional ? " WITH transactions = { 'enabled' : true }" : "");
700
1
  }
_ZN2yb9TestTableIJxxEE16create_table_strERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKNS2_6vectorIS8_NS6_IS8_EEEESF_b
Line
Count
Source
683
2
      const string& table, const StringVec& columns, const StringVec& keys, bool transactional) {
684
2
    CHECK_GT(columns.size(), 0);
685
2
    CHECK_GT(keys.size(), 0);
686
2
    CHECK_GE(columns.size(), keys.size());
687
688
2
    StringVec types;
689
2
    do_get_type_names(&types, ColumnsTuple());
690
2
    CHECK_EQ(types.size(), columns.size());
691
692
6
    for (size_t i = 0; i < columns.size(); ++i) {
693
4
      types[i] = columns[i] + ' ' + types[i];
694
4
    }
695
696
697
2
    return Format("CREATE TABLE IF NOT EXISTS $0 ($1, PRIMARY KEY ($2))$3;",
698
2
                  table, JoinStrings(types, ", "), JoinStrings(keys, ", "),
699
2
                  transactional ? " WITH transactions = { 'enabled' : true }" : "");
700
2
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEEE16create_table_strERKS7_RKNS1_6vectorIS7_NS5_IS7_EEEESF_b
Line
Count
Source
683
2
      const string& table, const StringVec& columns, const StringVec& keys, bool transactional) {
684
2
    CHECK_GT(columns.size(), 0);
685
2
    CHECK_GT(keys.size(), 0);
686
2
    CHECK_GE(columns.size(), keys.size());
687
688
2
    StringVec types;
689
2
    do_get_type_names(&types, ColumnsTuple());
690
2
    CHECK_EQ(types.size(), columns.size());
691
692
4
    for (size_t i = 0; i < columns.size(); ++i) {
693
2
      types[i] = columns[i] + ' ' + types[i];
694
2
    }
695
696
697
2
    return Format("CREATE TABLE IF NOT EXISTS $0 ($1, PRIMARY KEY ($2))$3;",
698
2
                  table, JoinStrings(types, ", "), JoinStrings(keys, ", "),
699
2
                  transactional ? " WITH transactions = { 'enabled' : true }" : "");
700
2
  }
701
702
617
  static string insert_with_bindings_str(const string& table, const StringVec& columns) {
703
617
    CHECK_GT(columns.size(), 0);
704
617
    const StringVec values(columns.size(), "?");
705
706
617
    return "INSERT INTO " + table + " (" +
707
617
        JoinStrings(columns, ", ") + ") VALUES (" + JoinStrings(values, ", ") + ");";
708
617
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE11cass_bool_tfdixS7_EE24insert_with_bindings_strERKS7_RKNS1_6vectorIS7_NS5_IS7_EEEE
Line
Count
Source
702
1
  static string insert_with_bindings_str(const string& table, const StringVec& columns) {
703
1
    CHECK_GT(columns.size(), 0);
704
1
    const StringVec values(columns.size(), "?");
705
706
1
    return "INSERT INTO " + table + " (" +
707
1
        JoinStrings(columns, ", ") + ") VALUES (" + JoinStrings(values, ", ") + ");";
708
1
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_13CassandraJsonEEE24insert_with_bindings_strERKS7_RKNS1_6vectorIS7_NS5_IS7_EEEE
Line
Count
Source
702
2
  static string insert_with_bindings_str(const string& table, const StringVec& columns) {
703
2
    CHECK_GT(columns.size(), 0);
704
2
    const StringVec values(columns.size(), "?");
705
706
2
    return "INSERT INTO " + table + " (" +
707
2
        JoinStrings(columns, ", ") + ") VALUES (" + JoinStrings(values, ", ") + ");";
708
2
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES7_S7_EE24insert_with_bindings_strERKS7_RKNS1_6vectorIS7_NS5_IS7_EEEE
Line
Count
Source
702
300
  static string insert_with_bindings_str(const string& table, const StringVec& columns) {
703
300
    CHECK_GT(columns.size(), 0);
704
300
    const StringVec values(columns.size(), "?");
705
706
300
    return "INSERT INTO " + table + " (" +
707
300
        JoinStrings(columns, ", ") + ") VALUES (" + JoinStrings(values, ", ") + ");";
708
300
  }
_ZN2yb9TestTableIJiiEE24insert_with_bindings_strERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKNS2_6vectorIS8_NS6_IS8_EEEE
Line
Count
Source
702
2
  static string insert_with_bindings_str(const string& table, const StringVec& columns) {
703
2
    CHECK_GT(columns.size(), 0);
704
2
    const StringVec values(columns.size(), "?");
705
706
2
    return "INSERT INTO " + table + " (" +
707
2
        JoinStrings(columns, ", ") + ") VALUES (" + JoinStrings(values, ", ") + ");";
708
2
  }
_ZN2yb9TestTableIJ11cass_bool_tiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEiS8_EE24insert_with_bindings_strERKS8_RKNS2_6vectorIS8_NS6_IS8_EEEE
Line
Count
Source
702
4
  static string insert_with_bindings_str(const string& table, const StringVec& columns) {
703
4
    CHECK_GT(columns.size(), 0);
704
4
    const StringVec values(columns.size(), "?");
705
706
4
    return "INSERT INTO " + table + " (" +
707
4
        JoinStrings(columns, ", ") + ") VALUES (" + JoinStrings(values, ", ") + ");";
708
4
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEdEE24insert_with_bindings_strERKS7_RKNS1_6vectorIS7_NS5_IS7_EEEE
Line
Count
Source
702
1
  static string insert_with_bindings_str(const string& table, const StringVec& columns) {
703
1
    CHECK_GT(columns.size(), 0);
704
1
    const StringVec values(columns.size(), "?");
705
706
1
    return "INSERT INTO " + table + " (" +
707
1
        JoinStrings(columns, ", ") + ") VALUES (" + JoinStrings(values, ", ") + ");";
708
1
  }
_ZN2yb9TestTableIJidEE24insert_with_bindings_strERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKNS2_6vectorIS8_NS6_IS8_EEEE
Line
Count
Source
702
1
  static string insert_with_bindings_str(const string& table, const StringVec& columns) {
703
1
    CHECK_GT(columns.size(), 0);
704
1
    const StringVec values(columns.size(), "?");
705
706
1
    return "INSERT INTO " + table + " (" +
707
1
        JoinStrings(columns, ", ") + ") VALUES (" + JoinStrings(values, ", ") + ");";
708
1
  }
_ZN2yb9TestTableIJxdEE24insert_with_bindings_strERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKNS2_6vectorIS8_NS6_IS8_EEEE
Line
Count
Source
702
1
  static string insert_with_bindings_str(const string& table, const StringVec& columns) {
703
1
    CHECK_GT(columns.size(), 0);
704
1
    const StringVec values(columns.size(), "?");
705
706
1
    return "INSERT INTO " + table + " (" +
707
1
        JoinStrings(columns, ", ") + ") VALUES (" + JoinStrings(values, ", ") + ");";
708
1
  }
_ZN2yb9TestTableIJ11cass_bool_tdEE24insert_with_bindings_strERKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEERKNS3_6vectorIS9_NS7_IS9_EEEE
Line
Count
Source
702
1
  static string insert_with_bindings_str(const string& table, const StringVec& columns) {
703
1
    CHECK_GT(columns.size(), 0);
704
1
    const StringVec values(columns.size(), "?");
705
706
1
    return "INSERT INTO " + table + " (" +
707
1
        JoinStrings(columns, ", ") + ") VALUES (" + JoinStrings(values, ", ") + ");";
708
1
  }
_ZN2yb9TestTableIJfdEE24insert_with_bindings_strERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKNS2_6vectorIS8_NS6_IS8_EEEE
Line
Count
Source
702
1
  static string insert_with_bindings_str(const string& table, const StringVec& columns) {
703
1
    CHECK_GT(columns.size(), 0);
704
1
    const StringVec values(columns.size(), "?");
705
706
1
    return "INSERT INTO " + table + " (" +
707
1
        JoinStrings(columns, ", ") + ") VALUES (" + JoinStrings(values, ", ") + ");";
708
1
  }
_ZN2yb9TestTableIJddEE24insert_with_bindings_strERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKNS2_6vectorIS8_NS6_IS8_EEEE
Line
Count
Source
702
1
  static string insert_with_bindings_str(const string& table, const StringVec& columns) {
703
1
    CHECK_GT(columns.size(), 0);
704
1
    const StringVec values(columns.size(), "?");
705
706
1
    return "INSERT INTO " + table + " (" +
707
1
        JoinStrings(columns, ", ") + ") VALUES (" + JoinStrings(values, ", ") + ");";
708
1
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEidEE24insert_with_bindings_strERKS7_RKNS1_6vectorIS7_NS5_IS7_EEEE
Line
Count
Source
702
1
  static string insert_with_bindings_str(const string& table, const StringVec& columns) {
703
1
    CHECK_GT(columns.size(), 0);
704
1
    const StringVec values(columns.size(), "?");
705
706
1
    return "INSERT INTO " + table + " (" +
707
1
        JoinStrings(columns, ", ") + ") VALUES (" + JoinStrings(values, ", ") + ");";
708
1
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES7_EE24insert_with_bindings_strERKS7_RKNS1_6vectorIS7_NS5_IS7_EEEE
Line
Count
Source
702
1
  static string insert_with_bindings_str(const string& table, const StringVec& columns) {
703
1
    CHECK_GT(columns.size(), 0);
704
1
    const StringVec values(columns.size(), "?");
705
706
1
    return "INSERT INTO " + table + " (" +
707
1
        JoinStrings(columns, ", ") + ") VALUES (" + JoinStrings(values, ", ") + ");";
708
1
  }
Unexecuted instantiation: _ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEExS7_EE24insert_with_bindings_strERKS7_RKNS1_6vectorIS7_NS5_IS7_EEEE
_ZN2yb9TestTableIJxxEE24insert_with_bindings_strERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKNS2_6vectorIS8_NS6_IS8_EEEE
Line
Count
Source
702
300
  static string insert_with_bindings_str(const string& table, const StringVec& columns) {
703
300
    CHECK_GT(columns.size(), 0);
704
300
    const StringVec values(columns.size(), "?");
705
706
300
    return "INSERT INTO " + table + " (" +
707
300
        JoinStrings(columns, ", ") + ") VALUES (" + JoinStrings(values, ", ") + ");";
708
300
  }
709
710
  static string update_with_bindings_str(
711
1
      const string& table, const StringVec& columns, const StringVec& keys) {
712
1
    CHECK_GT(columns.size(), 0);
713
1
    CHECK_GT(keys.size(), 0);
714
1
    CHECK_GE(columns.size(), keys.size());
715
1
    StringVec values, key_values;
716
717
2
    for (const string& col : columns) {
718
1
      (is_key(col, keys) ? key_values : values).push_back(col + " = ?");
719
2
    }
720
721
1
    return "UPDATE " + table + " SET " +
722
1
        JoinStrings(values, ", ") + " WHERE " + JoinStrings(key_values, ", ") + ";";
723
1
  }
724
725
16
  static string select_with_bindings_str(const string& table, const StringVec& keys) {
726
16
    CHECK_GT(keys.size(), 0);
727
16
    StringVec key_values = keys;
728
729
21
    for (string& k : key_values) {
730
21
       k += " = ?";
731
21
    }
732
733
16
    return "SELECT * FROM " + table + " WHERE " + JoinStrings(key_values, " AND ") + ";";
734
16
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE11cass_bool_tfdixS7_EE24select_with_bindings_strERKS7_RKNS1_6vectorIS7_NS5_IS7_EEEE
Line
Count
Source
725
1
  static string select_with_bindings_str(const string& table, const StringVec& keys) {
726
1
    CHECK_GT(keys.size(), 0);
727
1
    StringVec key_values = keys;
728
729
1
    for (string& k : key_values) {
730
1
       k += " = ?";
731
1
    }
732
733
1
    return "SELECT * FROM " + table + " WHERE " + JoinStrings(key_values, " AND ") + ";";
734
1
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_13CassandraJsonEEE24select_with_bindings_strERKS7_RKNS1_6vectorIS7_NS5_IS7_EEEE
Line
Count
Source
725
4
  static string select_with_bindings_str(const string& table, const StringVec& keys) {
726
4
    CHECK_GT(keys.size(), 0);
727
4
    StringVec key_values = keys;
728
729
4
    for (string& k : key_values) {
730
4
       k += " = ?";
731
4
    }
732
733
4
    return "SELECT * FROM " + table + " WHERE " + JoinStrings(key_values, " AND ") + ";";
734
4
  }
_ZN2yb9TestTableIJ11cass_bool_tiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEiS8_EE24select_with_bindings_strERKS8_RKNS2_6vectorIS8_NS6_IS8_EEEE
Line
Count
Source
725
4
  static string select_with_bindings_str(const string& table, const StringVec& keys) {
726
4
    CHECK_GT(keys.size(), 0);
727
4
    StringVec key_values = keys;
728
729
8
    for (string& k : key_values) {
730
8
       k += " = ?";
731
8
    }
732
733
4
    return "SELECT * FROM " + table + " WHERE " + JoinStrings(key_values, " AND ") + ";";
734
4
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEdEE24select_with_bindings_strERKS7_RKNS1_6vectorIS7_NS5_IS7_EEEE
Line
Count
Source
725
1
  static string select_with_bindings_str(const string& table, const StringVec& keys) {
726
1
    CHECK_GT(keys.size(), 0);
727
1
    StringVec key_values = keys;
728
729
1
    for (string& k : key_values) {
730
1
       k += " = ?";
731
1
    }
732
733
1
    return "SELECT * FROM " + table + " WHERE " + JoinStrings(key_values, " AND ") + ";";
734
1
  }
_ZN2yb9TestTableIJidEE24select_with_bindings_strERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKNS2_6vectorIS8_NS6_IS8_EEEE
Line
Count
Source
725
1
  static string select_with_bindings_str(const string& table, const StringVec& keys) {
726
1
    CHECK_GT(keys.size(), 0);
727
1
    StringVec key_values = keys;
728
729
1
    for (string& k : key_values) {
730
1
       k += " = ?";
731
1
    }
732
733
1
    return "SELECT * FROM " + table + " WHERE " + JoinStrings(key_values, " AND ") + ";";
734
1
  }
_ZN2yb9TestTableIJxdEE24select_with_bindings_strERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKNS2_6vectorIS8_NS6_IS8_EEEE
Line
Count
Source
725
1
  static string select_with_bindings_str(const string& table, const StringVec& keys) {
726
1
    CHECK_GT(keys.size(), 0);
727
1
    StringVec key_values = keys;
728
729
1
    for (string& k : key_values) {
730
1
       k += " = ?";
731
1
    }
732
733
1
    return "SELECT * FROM " + table + " WHERE " + JoinStrings(key_values, " AND ") + ";";
734
1
  }
_ZN2yb9TestTableIJ11cass_bool_tdEE24select_with_bindings_strERKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEERKNS3_6vectorIS9_NS7_IS9_EEEE
Line
Count
Source
725
1
  static string select_with_bindings_str(const string& table, const StringVec& keys) {
726
1
    CHECK_GT(keys.size(), 0);
727
1
    StringVec key_values = keys;
728
729
1
    for (string& k : key_values) {
730
1
       k += " = ?";
731
1
    }
732
733
1
    return "SELECT * FROM " + table + " WHERE " + JoinStrings(key_values, " AND ") + ";";
734
1
  }
_ZN2yb9TestTableIJfdEE24select_with_bindings_strERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKNS2_6vectorIS8_NS6_IS8_EEEE
Line
Count
Source
725
1
  static string select_with_bindings_str(const string& table, const StringVec& keys) {
726
1
    CHECK_GT(keys.size(), 0);
727
1
    StringVec key_values = keys;
728
729
1
    for (string& k : key_values) {
730
1
       k += " = ?";
731
1
    }
732
733
1
    return "SELECT * FROM " + table + " WHERE " + JoinStrings(key_values, " AND ") + ";";
734
1
  }
_ZN2yb9TestTableIJddEE24select_with_bindings_strERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKNS2_6vectorIS8_NS6_IS8_EEEE
Line
Count
Source
725
1
  static string select_with_bindings_str(const string& table, const StringVec& keys) {
726
1
    CHECK_GT(keys.size(), 0);
727
1
    StringVec key_values = keys;
728
729
1
    for (string& k : key_values) {
730
1
       k += " = ?";
731
1
    }
732
733
1
    return "SELECT * FROM " + table + " WHERE " + JoinStrings(key_values, " AND ") + ";";
734
1
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEidEE24select_with_bindings_strERKS7_RKNS1_6vectorIS7_NS5_IS7_EEEE
Line
Count
Source
725
1
  static string select_with_bindings_str(const string& table, const StringVec& keys) {
726
1
    CHECK_GT(keys.size(), 0);
727
1
    StringVec key_values = keys;
728
729
2
    for (string& k : key_values) {
730
2
       k += " = ?";
731
2
    }
732
733
1
    return "SELECT * FROM " + table + " WHERE " + JoinStrings(key_values, " AND ") + ";";
734
1
  }
735
736
7
  static string select_by_token_str(const string& table, const StringVec& keys) {
737
7
    CHECK_GT(keys.size(), 0);
738
7
    return "SELECT * FROM " + table + " WHERE TOKEN(" + JoinStrings(keys, ", ") + ") = ?;";
739
7
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEdEE19select_by_token_strERKS7_RKNS1_6vectorIS7_NS5_IS7_EEEE
Line
Count
Source
736
1
  static string select_by_token_str(const string& table, const StringVec& keys) {
737
1
    CHECK_GT(keys.size(), 0);
738
1
    return "SELECT * FROM " + table + " WHERE TOKEN(" + JoinStrings(keys, ", ") + ") = ?;";
739
1
  }
_ZN2yb9TestTableIJidEE19select_by_token_strERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKNS2_6vectorIS8_NS6_IS8_EEEE
Line
Count
Source
736
1
  static string select_by_token_str(const string& table, const StringVec& keys) {
737
1
    CHECK_GT(keys.size(), 0);
738
1
    return "SELECT * FROM " + table + " WHERE TOKEN(" + JoinStrings(keys, ", ") + ") = ?;";
739
1
  }
_ZN2yb9TestTableIJxdEE19select_by_token_strERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKNS2_6vectorIS8_NS6_IS8_EEEE
Line
Count
Source
736
1
  static string select_by_token_str(const string& table, const StringVec& keys) {
737
1
    CHECK_GT(keys.size(), 0);
738
1
    return "SELECT * FROM " + table + " WHERE TOKEN(" + JoinStrings(keys, ", ") + ") = ?;";
739
1
  }
_ZN2yb9TestTableIJ11cass_bool_tdEE19select_by_token_strERKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEERKNS3_6vectorIS9_NS7_IS9_EEEE
Line
Count
Source
736
1
  static string select_by_token_str(const string& table, const StringVec& keys) {
737
1
    CHECK_GT(keys.size(), 0);
738
1
    return "SELECT * FROM " + table + " WHERE TOKEN(" + JoinStrings(keys, ", ") + ") = ?;";
739
1
  }
_ZN2yb9TestTableIJfdEE19select_by_token_strERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKNS2_6vectorIS8_NS6_IS8_EEEE
Line
Count
Source
736
1
  static string select_by_token_str(const string& table, const StringVec& keys) {
737
1
    CHECK_GT(keys.size(), 0);
738
1
    return "SELECT * FROM " + table + " WHERE TOKEN(" + JoinStrings(keys, ", ") + ") = ?;";
739
1
  }
_ZN2yb9TestTableIJddEE19select_by_token_strERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKNS2_6vectorIS8_NS6_IS8_EEEE
Line
Count
Source
736
1
  static string select_by_token_str(const string& table, const StringVec& keys) {
737
1
    CHECK_GT(keys.size(), 0);
738
1
    return "SELECT * FROM " + table + " WHERE TOKEN(" + JoinStrings(keys, ", ") + ") = ?;";
739
1
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEidEE19select_by_token_strERKS7_RKNS1_6vectorIS7_NS5_IS7_EEEE
Line
Count
Source
736
1
  static string select_by_token_str(const string& table, const StringVec& keys) {
737
1
    CHECK_GT(keys.size(), 0);
738
1
    return "SELECT * FROM " + table + " WHERE TOKEN(" + JoinStrings(keys, ", ") + ") = ?;";
739
1
  }
740
741
41.5k
  static bool is_key(const string& name, const StringVec& keys) {
742
41.5k
    return find(keys.begin(), keys.end(), name) != keys.end();
743
41.5k
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE11cass_bool_tfdixS7_EE6is_keyERKS7_RKNS1_6vectorIS7_NS5_IS7_EEEE
Line
Count
Source
741
28
  static bool is_key(const string& name, const StringVec& keys) {
742
28
    return find(keys.begin(), keys.end(), name) != keys.end();
743
28
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_13CassandraJsonEEE6is_keyERKS7_RKNS1_6vectorIS7_NS5_IS7_EEEE
Line
Count
Source
741
34
  static bool is_key(const string& name, const StringVec& keys) {
742
34
    return find(keys.begin(), keys.end(), name) != keys.end();
743
34
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES7_S7_EE6is_keyERKS7_RKNS1_6vectorIS7_NS5_IS7_EEEE
Line
Count
Source
741
9.00k
  static bool is_key(const string& name, const StringVec& keys) {
742
9.00k
    return find(keys.begin(), keys.end(), name) != keys.end();
743
9.00k
  }
_ZN2yb9TestTableIJiiEE6is_keyERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKNS2_6vectorIS8_NS6_IS8_EEEE
Line
Count
Source
741
14.1k
  static bool is_key(const string& name, const StringVec& keys) {
742
14.1k
    return find(keys.begin(), keys.end(), name) != keys.end();
743
14.1k
  }
_ZN2yb9TestTableIJ11cass_bool_tiNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEiS8_EE6is_keyERKS8_RKNS2_6vectorIS8_NS6_IS8_EEEE
Line
Count
Source
741
80
  static bool is_key(const string& name, const StringVec& keys) {
742
80
    return find(keys.begin(), keys.end(), name) != keys.end();
743
80
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEdEE6is_keyERKS7_RKNS1_6vectorIS7_NS5_IS7_EEEE
Line
Count
Source
741
12
  static bool is_key(const string& name, const StringVec& keys) {
742
12
    return find(keys.begin(), keys.end(), name) != keys.end();
743
12
  }
_ZN2yb9TestTableIJidEE6is_keyERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKNS2_6vectorIS8_NS6_IS8_EEEE
Line
Count
Source
741
12
  static bool is_key(const string& name, const StringVec& keys) {
742
12
    return find(keys.begin(), keys.end(), name) != keys.end();
743
12
  }
_ZN2yb9TestTableIJxdEE6is_keyERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKNS2_6vectorIS8_NS6_IS8_EEEE
Line
Count
Source
741
8
  static bool is_key(const string& name, const StringVec& keys) {
742
8
    return find(keys.begin(), keys.end(), name) != keys.end();
743
8
  }
_ZN2yb9TestTableIJ11cass_bool_tdEE6is_keyERKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEERKNS3_6vectorIS9_NS7_IS9_EEEE
Line
Count
Source
741
12
  static bool is_key(const string& name, const StringVec& keys) {
742
12
    return find(keys.begin(), keys.end(), name) != keys.end();
743
12
  }
_ZN2yb9TestTableIJfdEE6is_keyERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKNS2_6vectorIS8_NS6_IS8_EEEE
Line
Count
Source
741
12
  static bool is_key(const string& name, const StringVec& keys) {
742
12
    return find(keys.begin(), keys.end(), name) != keys.end();
743
12
  }
_ZN2yb9TestTableIJddEE6is_keyERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKNS2_6vectorIS8_NS6_IS8_EEEE
Line
Count
Source
741
8
  static bool is_key(const string& name, const StringVec& keys) {
742
8
    return find(keys.begin(), keys.end(), name) != keys.end();
743
8
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEidEE6is_keyERKS7_RKNS1_6vectorIS7_NS5_IS7_EEEE
Line
Count
Source
741
12
  static bool is_key(const string& name, const StringVec& keys) {
742
12
    return find(keys.begin(), keys.end(), name) != keys.end();
743
12
  }
_ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEES7_EE6is_keyERKS7_RKNS1_6vectorIS7_NS5_IS7_EEEE
Line
Count
Source
741
200
  static bool is_key(const string& name, const StringVec& keys) {
742
200
    return find(keys.begin(), keys.end(), name) != keys.end();
743
200
  }
Unexecuted instantiation: _ZN2yb9TestTableIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEExS7_EE6is_keyERKS7_RKNS1_6vectorIS7_NS5_IS7_EEEE
_ZN2yb9TestTableIJxxEE6is_keyERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEERKNS2_6vectorIS8_NS6_IS8_EEEE
Line
Count
Source
741
18.0k
  static bool is_key(const string& name, const StringVec& keys) {
742
18.0k
    return find(keys.begin(), keys.end(), name) != keys.end();
743
18.0k
  }
744
745
 protected:
746
  string table_name_;
747
  StringVec column_names_;
748
  StringVec key_names_;
749
};
750
751
//------------------------------------------------------------------------------
752
753
template<size_t I, class Tuple>
754
typename std::enable_if<I >= std::tuple_size<Tuple>::value, void>::type
755
18
ExpectEqualTuplesHelper(const Tuple&, const Tuple&) {}
_ZN2yb23ExpectEqualTuplesHelperILm7ENSt3__15tupleIJNS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE11cass_bool_tfdixS8_EEEEENS1_9enable_ifIXgeT_sr3std10tuple_sizeIT0_EE5valueEvE4typeERKSC_SG_
Line
Count
Source
755
1
ExpectEqualTuplesHelper(const Tuple&, const Tuple&) {}
_ZN2yb23ExpectEqualTuplesHelperILm2ENSt3__15tupleIJNS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_13CassandraJsonEEEEEENS1_9enable_ifIXgeT_sr3std10tuple_sizeIT0_EE5valueEvE4typeERKSC_SG_
Line
Count
Source
755
2
ExpectEqualTuplesHelper(const Tuple&, const Tuple&) {}
_ZN2yb23ExpectEqualTuplesHelperILm5ENSt3__15tupleIJ11cass_bool_tiNS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEiS9_EEEEENS1_9enable_ifIXgeT_sr3std10tuple_sizeIT0_EE5valueEvE4typeERKSC_SG_
Line
Count
Source
755
4
ExpectEqualTuplesHelper(const Tuple&, const Tuple&) {}
_ZN2yb23ExpectEqualTuplesHelperILm2ENSt3__15tupleIJNS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEdEEEEENS1_9enable_ifIXgeT_sr3std10tuple_sizeIT0_EE5valueEvE4typeERKSB_SF_
Line
Count
Source
755
2
ExpectEqualTuplesHelper(const Tuple&, const Tuple&) {}
_ZN2yb23ExpectEqualTuplesHelperILm2ENSt3__15tupleIJidEEEEENS1_9enable_ifIXgeT_sr3std10tuple_sizeIT0_EE5valueEvE4typeERKS5_S9_
Line
Count
Source
755
2
ExpectEqualTuplesHelper(const Tuple&, const Tuple&) {}
_ZN2yb23ExpectEqualTuplesHelperILm2ENSt3__15tupleIJxdEEEEENS1_9enable_ifIXgeT_sr3std10tuple_sizeIT0_EE5valueEvE4typeERKS5_S9_
Line
Count
Source
755
1
ExpectEqualTuplesHelper(const Tuple&, const Tuple&) {}
_ZN2yb23ExpectEqualTuplesHelperILm2ENSt3__15tupleIJ11cass_bool_tdEEEEENS1_9enable_ifIXgeT_sr3std10tuple_sizeIT0_EE5valueEvE4typeERKS6_SA_
Line
Count
Source
755
2
ExpectEqualTuplesHelper(const Tuple&, const Tuple&) {}
_ZN2yb23ExpectEqualTuplesHelperILm2ENSt3__15tupleIJfdEEEEENS1_9enable_ifIXgeT_sr3std10tuple_sizeIT0_EE5valueEvE4typeERKS5_S9_
Line
Count
Source
755
2
ExpectEqualTuplesHelper(const Tuple&, const Tuple&) {}
_ZN2yb23ExpectEqualTuplesHelperILm2ENSt3__15tupleIJddEEEEENS1_9enable_ifIXgeT_sr3std10tuple_sizeIT0_EE5valueEvE4typeERKS5_S9_
Line
Count
Source
755
1
ExpectEqualTuplesHelper(const Tuple&, const Tuple&) {}
_ZN2yb23ExpectEqualTuplesHelperILm3ENSt3__15tupleIJNS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEidEEEEENS1_9enable_ifIXgeT_sr3std10tuple_sizeIT0_EE5valueEvE4typeERKSB_SF_
Line
Count
Source
755
1
ExpectEqualTuplesHelper(const Tuple&, const Tuple&) {}
756
757
template<size_t I, class Tuple>
758
typename std::enable_if<I < std::tuple_size<Tuple>::value, void>::type
759
54
ExpectEqualTuplesHelper(const Tuple& t1, const Tuple& t2) {
760
54
  EXPECT_EQ(get<I>(t1), get<I>(t2));
761
54
  LOG(INFO) << "COMPARE: " << get<I>(t1) << " == " << get<I>(t2);
762
54
  ExpectEqualTuplesHelper<I + 1>(t1, t2);
763
54
}
_ZN2yb23ExpectEqualTuplesHelperILm0ENSt3__15tupleIJNS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE11cass_bool_tfdixS8_EEEEENS1_9enable_ifIXltT_sr3std10tuple_sizeIT0_EE5valueEvE4typeERKSC_SG_
Line
Count
Source
759
1
ExpectEqualTuplesHelper(const Tuple& t1, const Tuple& t2) {
760
1
  EXPECT_EQ(get<I>(t1), get<I>(t2));
761
1
  LOG(INFO) << "COMPARE: " << get<I>(t1) << " == " << get<I>(t2);
762
1
  ExpectEqualTuplesHelper<I + 1>(t1, t2);
763
1
}
_ZN2yb23ExpectEqualTuplesHelperILm1ENSt3__15tupleIJNS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE11cass_bool_tfdixS8_EEEEENS1_9enable_ifIXltT_sr3std10tuple_sizeIT0_EE5valueEvE4typeERKSC_SG_
Line
Count
Source
759
1
ExpectEqualTuplesHelper(const Tuple& t1, const Tuple& t2) {
760
1
  EXPECT_EQ(get<I>(t1), get<I>(t2));
761
1
  LOG(INFO) << "COMPARE: " << get<I>(t1) << " == " << get<I>(t2);
762
1
  ExpectEqualTuplesHelper<I + 1>(t1, t2);
763
1
}
_ZN2yb23ExpectEqualTuplesHelperILm2ENSt3__15tupleIJNS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE11cass_bool_tfdixS8_EEEEENS1_9enable_ifIXltT_sr3std10tuple_sizeIT0_EE5valueEvE4typeERKSC_SG_
Line
Count
Source
759
1
ExpectEqualTuplesHelper(const Tuple& t1, const Tuple& t2) {
760
1
  EXPECT_EQ(get<I>(t1), get<I>(t2));
761
1
  LOG(INFO) << "COMPARE: " << get<I>(t1) << " == " << get<I>(t2);
762
1
  ExpectEqualTuplesHelper<I + 1>(t1, t2);
763
1
}
_ZN2yb23ExpectEqualTuplesHelperILm3ENSt3__15tupleIJNS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE11cass_bool_tfdixS8_EEEEENS1_9enable_ifIXltT_sr3std10tuple_sizeIT0_EE5valueEvE4typeERKSC_SG_
Line
Count
Source
759
1
ExpectEqualTuplesHelper(const Tuple& t1, const Tuple& t2) {
760
1
  EXPECT_EQ(get<I>(t1), get<I>(t2));
761
1
  LOG(INFO) << "COMPARE: " << get<I>(t1) << " == " << get<I>(t2);
762
1
  ExpectEqualTuplesHelper<I + 1>(t1, t2);
763
1
}
_ZN2yb23ExpectEqualTuplesHelperILm4ENSt3__15tupleIJNS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE11cass_bool_tfdixS8_EEEEENS1_9enable_ifIXltT_sr3std10tuple_sizeIT0_EE5valueEvE4typeERKSC_SG_
Line
Count
Source
759
1
ExpectEqualTuplesHelper(const Tuple& t1, const Tuple& t2) {
760
1
  EXPECT_EQ(get<I>(t1), get<I>(t2));
761
1
  LOG(INFO) << "COMPARE: " << get<I>(t1) << " == " << get<I>(t2);
762
1
  ExpectEqualTuplesHelper<I + 1>(t1, t2);
763
1
}
_ZN2yb23ExpectEqualTuplesHelperILm5ENSt3__15tupleIJNS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE11cass_bool_tfdixS8_EEEEENS1_9enable_ifIXltT_sr3std10tuple_sizeIT0_EE5valueEvE4typeERKSC_SG_
Line
Count
Source
759
1
ExpectEqualTuplesHelper(const Tuple& t1, const Tuple& t2) {
760
1
  EXPECT_EQ(get<I>(t1), get<I>(t2));
761
1
  LOG(INFO) << "COMPARE: " << get<I>(t1) << " == " << get<I>(t2);
762
1
  ExpectEqualTuplesHelper<I + 1>(t1, t2);
763
1
}
_ZN2yb23ExpectEqualTuplesHelperILm6ENSt3__15tupleIJNS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE11cass_bool_tfdixS8_EEEEENS1_9enable_ifIXltT_sr3std10tuple_sizeIT0_EE5valueEvE4typeERKSC_SG_
Line
Count
Source
759
1
ExpectEqualTuplesHelper(const Tuple& t1, const Tuple& t2) {
760
1
  EXPECT_EQ(get<I>(t1), get<I>(t2));
761
1
  LOG(INFO) << "COMPARE: " << get<I>(t1) << " == " << get<I>(t2);
762
1
  ExpectEqualTuplesHelper<I + 1>(t1, t2);
763
1
}
_ZN2yb23ExpectEqualTuplesHelperILm0ENSt3__15tupleIJNS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_13CassandraJsonEEEEEENS1_9enable_ifIXltT_sr3std10tuple_sizeIT0_EE5valueEvE4typeERKSC_SG_
Line
Count
Source
759
2
ExpectEqualTuplesHelper(const Tuple& t1, const Tuple& t2) {
760
2
  EXPECT_EQ(get<I>(t1), get<I>(t2));
761
2
  LOG(INFO) << "COMPARE: " << get<I>(t1) << " == " << get<I>(t2);
762
2
  ExpectEqualTuplesHelper<I + 1>(t1, t2);
763
2
}
_ZN2yb23ExpectEqualTuplesHelperILm1ENSt3__15tupleIJNS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_13CassandraJsonEEEEEENS1_9enable_ifIXltT_sr3std10tuple_sizeIT0_EE5valueEvE4typeERKSC_SG_
Line
Count
Source
759
2
ExpectEqualTuplesHelper(const Tuple& t1, const Tuple& t2) {
760
2
  EXPECT_EQ(get<I>(t1), get<I>(t2));
761
2
  LOG(INFO) << "COMPARE: " << get<I>(t1) << " == " << get<I>(t2);
762
2
  ExpectEqualTuplesHelper<I + 1>(t1, t2);
763
2
}
_ZN2yb23ExpectEqualTuplesHelperILm0ENSt3__15tupleIJ11cass_bool_tiNS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEiS9_EEEEENS1_9enable_ifIXltT_sr3std10tuple_sizeIT0_EE5valueEvE4typeERKSC_SG_
Line
Count
Source
759
4
ExpectEqualTuplesHelper(const Tuple& t1, const Tuple& t2) {
760
4
  EXPECT_EQ(get<I>(t1), get<I>(t2));
761
4
  LOG(INFO) << "COMPARE: " << get<I>(t1) << " == " << get<I>(t2);
762
4
  ExpectEqualTuplesHelper<I + 1>(t1, t2);
763
4
}
_ZN2yb23ExpectEqualTuplesHelperILm1ENSt3__15tupleIJ11cass_bool_tiNS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEiS9_EEEEENS1_9enable_ifIXltT_sr3std10tuple_sizeIT0_EE5valueEvE4typeERKSC_SG_
Line
Count
Source
759
4
ExpectEqualTuplesHelper(const Tuple& t1, const Tuple& t2) {
760
4
  EXPECT_EQ(get<I>(t1), get<I>(t2));
761
4
  LOG(INFO) << "COMPARE: " << get<I>(t1) << " == " << get<I>(t2);
762
4
  ExpectEqualTuplesHelper<I + 1>(t1, t2);
763
4
}
_ZN2yb23ExpectEqualTuplesHelperILm2ENSt3__15tupleIJ11cass_bool_tiNS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEiS9_EEEEENS1_9enable_ifIXltT_sr3std10tuple_sizeIT0_EE5valueEvE4typeERKSC_SG_
Line
Count
Source
759
4
ExpectEqualTuplesHelper(const Tuple& t1, const Tuple& t2) {
760
4
  EXPECT_EQ(get<I>(t1), get<I>(t2));
761
4
  LOG(INFO) << "COMPARE: " << get<I>(t1) << " == " << get<I>(t2);
762
4
  ExpectEqualTuplesHelper<I + 1>(t1, t2);
763
4
}
_ZN2yb23ExpectEqualTuplesHelperILm3ENSt3__15tupleIJ11cass_bool_tiNS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEiS9_EEEEENS1_9enable_ifIXltT_sr3std10tuple_sizeIT0_EE5valueEvE4typeERKSC_SG_
Line
Count
Source
759
4
ExpectEqualTuplesHelper(const Tuple& t1, const Tuple& t2) {
760
4
  EXPECT_EQ(get<I>(t1), get<I>(t2));
761
4
  LOG(INFO) << "COMPARE: " << get<I>(t1) << " == " << get<I>(t2);
762
4
  ExpectEqualTuplesHelper<I + 1>(t1, t2);
763
4
}
_ZN2yb23ExpectEqualTuplesHelperILm4ENSt3__15tupleIJ11cass_bool_tiNS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEiS9_EEEEENS1_9enable_ifIXltT_sr3std10tuple_sizeIT0_EE5valueEvE4typeERKSC_SG_
Line
Count
Source
759
4
ExpectEqualTuplesHelper(const Tuple& t1, const Tuple& t2) {
760
4
  EXPECT_EQ(get<I>(t1), get<I>(t2));
761
4
  LOG(INFO) << "COMPARE: " << get<I>(t1) << " == " << get<I>(t2);
762
4
  ExpectEqualTuplesHelper<I + 1>(t1, t2);
763
4
}
_ZN2yb23ExpectEqualTuplesHelperILm0ENSt3__15tupleIJNS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEdEEEEENS1_9enable_ifIXltT_sr3std10tuple_sizeIT0_EE5valueEvE4typeERKSB_SF_
Line
Count
Source
759
2
ExpectEqualTuplesHelper(const Tuple& t1, const Tuple& t2) {
760
2
  EXPECT_EQ(get<I>(t1), get<I>(t2));
761
2
  LOG(INFO) << "COMPARE: " << get<I>(t1) << " == " << get<I>(t2);
762
2
  ExpectEqualTuplesHelper<I + 1>(t1, t2);
763
2
}
_ZN2yb23ExpectEqualTuplesHelperILm1ENSt3__15tupleIJNS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEdEEEEENS1_9enable_ifIXltT_sr3std10tuple_sizeIT0_EE5valueEvE4typeERKSB_SF_
Line
Count
Source
759
2
ExpectEqualTuplesHelper(const Tuple& t1, const Tuple& t2) {
760
2
  EXPECT_EQ(get<I>(t1), get<I>(t2));
761
2
  LOG(INFO) << "COMPARE: " << get<I>(t1) << " == " << get<I>(t2);
762
2
  ExpectEqualTuplesHelper<I + 1>(t1, t2);
763
2
}
_ZN2yb23ExpectEqualTuplesHelperILm0ENSt3__15tupleIJidEEEEENS1_9enable_ifIXltT_sr3std10tuple_sizeIT0_EE5valueEvE4typeERKS5_S9_
Line
Count
Source
759
2
ExpectEqualTuplesHelper(const Tuple& t1, const Tuple& t2) {
760
2
  EXPECT_EQ(get<I>(t1), get<I>(t2));
761
2
  LOG(INFO) << "COMPARE: " << get<I>(t1) << " == " << get<I>(t2);
762
2
  ExpectEqualTuplesHelper<I + 1>(t1, t2);
763
2
}
_ZN2yb23ExpectEqualTuplesHelperILm1ENSt3__15tupleIJidEEEEENS1_9enable_ifIXltT_sr3std10tuple_sizeIT0_EE5valueEvE4typeERKS5_S9_
Line
Count
Source
759
2
ExpectEqualTuplesHelper(const Tuple& t1, const Tuple& t2) {
760
2
  EXPECT_EQ(get<I>(t1), get<I>(t2));
761
2
  LOG(INFO) << "COMPARE: " << get<I>(t1) << " == " << get<I>(t2);
762
2
  ExpectEqualTuplesHelper<I + 1>(t1, t2);
763
2
}
_ZN2yb23ExpectEqualTuplesHelperILm0ENSt3__15tupleIJxdEEEEENS1_9enable_ifIXltT_sr3std10tuple_sizeIT0_EE5valueEvE4typeERKS5_S9_
Line
Count
Source
759
1
ExpectEqualTuplesHelper(const Tuple& t1, const Tuple& t2) {
760
1
  EXPECT_EQ(get<I>(t1), get<I>(t2));
761
1
  LOG(INFO) << "COMPARE: " << get<I>(t1) << " == " << get<I>(t2);
762
1
  ExpectEqualTuplesHelper<I + 1>(t1, t2);
763
1
}
_ZN2yb23ExpectEqualTuplesHelperILm1ENSt3__15tupleIJxdEEEEENS1_9enable_ifIXltT_sr3std10tuple_sizeIT0_EE5valueEvE4typeERKS5_S9_
Line
Count
Source
759
1
ExpectEqualTuplesHelper(const Tuple& t1, const Tuple& t2) {
760
1
  EXPECT_EQ(get<I>(t1), get<I>(t2));
761
1
  LOG(INFO) << "COMPARE: " << get<I>(t1) << " == " << get<I>(t2);
762
1
  ExpectEqualTuplesHelper<I + 1>(t1, t2);
763
1
}
_ZN2yb23ExpectEqualTuplesHelperILm0ENSt3__15tupleIJ11cass_bool_tdEEEEENS1_9enable_ifIXltT_sr3std10tuple_sizeIT0_EE5valueEvE4typeERKS6_SA_
Line
Count
Source
759
2
ExpectEqualTuplesHelper(const Tuple& t1, const Tuple& t2) {
760
2
  EXPECT_EQ(get<I>(t1), get<I>(t2));
761
2
  LOG(INFO) << "COMPARE: " << get<I>(t1) << " == " << get<I>(t2);
762
2
  ExpectEqualTuplesHelper<I + 1>(t1, t2);
763
2
}
_ZN2yb23ExpectEqualTuplesHelperILm1ENSt3__15tupleIJ11cass_bool_tdEEEEENS1_9enable_ifIXltT_sr3std10tuple_sizeIT0_EE5valueEvE4typeERKS6_SA_
Line
Count
Source
759
2
ExpectEqualTuplesHelper(const Tuple& t1, const Tuple& t2) {
760
2
  EXPECT_EQ(get<I>(t1), get<I>(t2));
761
2
  LOG(INFO) << "COMPARE: " << get<I>(t1) << " == " << get<I>(t2);
762
2
  ExpectEqualTuplesHelper<I + 1>(t1, t2);
763
2
}
_ZN2yb23ExpectEqualTuplesHelperILm0ENSt3__15tupleIJfdEEEEENS1_9enable_ifIXltT_sr3std10tuple_sizeIT0_EE5valueEvE4typeERKS5_S9_
Line
Count
Source
759
2
ExpectEqualTuplesHelper(const Tuple& t1, const Tuple& t2) {
760
2
  EXPECT_EQ(get<I>(t1), get<I>(t2));
761
2
  LOG(INFO) << "COMPARE: " << get<I>(t1) << " == " << get<I>(t2);
762
2
  ExpectEqualTuplesHelper<I + 1>(t1, t2);
763
2
}
_ZN2yb23ExpectEqualTuplesHelperILm1ENSt3__15tupleIJfdEEEEENS1_9enable_ifIXltT_sr3std10tuple_sizeIT0_EE5valueEvE4typeERKS5_S9_
Line
Count
Source
759
2
ExpectEqualTuplesHelper(const Tuple& t1, const Tuple& t2) {
760
2
  EXPECT_EQ(get<I>(t1), get<I>(t2));
761
2
  LOG(INFO) << "COMPARE: " << get<I>(t1) << " == " << get<I>(t2);
762
2
  ExpectEqualTuplesHelper<I + 1>(t1, t2);
763
2
}
_ZN2yb23ExpectEqualTuplesHelperILm0ENSt3__15tupleIJddEEEEENS1_9enable_ifIXltT_sr3std10tuple_sizeIT0_EE5valueEvE4typeERKS5_S9_
Line
Count
Source
759
1
ExpectEqualTuplesHelper(const Tuple& t1, const Tuple& t2) {
760
1
  EXPECT_EQ(get<I>(t1), get<I>(t2));
761
1
  LOG(INFO) << "COMPARE: " << get<I>(t1) << " == " << get<I>(t2);
762
1
  ExpectEqualTuplesHelper<I + 1>(t1, t2);
763
1
}
_ZN2yb23ExpectEqualTuplesHelperILm1ENSt3__15tupleIJddEEEEENS1_9enable_ifIXltT_sr3std10tuple_sizeIT0_EE5valueEvE4typeERKS5_S9_
Line
Count
Source
759
1
ExpectEqualTuplesHelper(const Tuple& t1, const Tuple& t2) {
760
1
  EXPECT_EQ(get<I>(t1), get<I>(t2));
761
1
  LOG(INFO) << "COMPARE: " << get<I>(t1) << " == " << get<I>(t2);
762
1
  ExpectEqualTuplesHelper<I + 1>(t1, t2);
763
1
}
_ZN2yb23ExpectEqualTuplesHelperILm0ENSt3__15tupleIJNS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEidEEEEENS1_9enable_ifIXltT_sr3std10tuple_sizeIT0_EE5valueEvE4typeERKSB_SF_
Line
Count
Source
759
1
ExpectEqualTuplesHelper(const Tuple& t1, const Tuple& t2) {
760
1
  EXPECT_EQ(get<I>(t1), get<I>(t2));
761
1
  LOG(INFO) << "COMPARE: " << get<I>(t1) << " == " << get<I>(t2);
762
1
  ExpectEqualTuplesHelper<I + 1>(t1, t2);
763
1
}
_ZN2yb23ExpectEqualTuplesHelperILm1ENSt3__15tupleIJNS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEidEEEEENS1_9enable_ifIXltT_sr3std10tuple_sizeIT0_EE5valueEvE4typeERKSB_SF_
Line
Count
Source
759
1
ExpectEqualTuplesHelper(const Tuple& t1, const Tuple& t2) {
760
1
  EXPECT_EQ(get<I>(t1), get<I>(t2));
761
1
  LOG(INFO) << "COMPARE: " << get<I>(t1) << " == " << get<I>(t2);
762
1
  ExpectEqualTuplesHelper<I + 1>(t1, t2);
763
1
}
_ZN2yb23ExpectEqualTuplesHelperILm2ENSt3__15tupleIJNS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEidEEEEENS1_9enable_ifIXltT_sr3std10tuple_sizeIT0_EE5valueEvE4typeERKSB_SF_
Line
Count
Source
759
1
ExpectEqualTuplesHelper(const Tuple& t1, const Tuple& t2) {
760
1
  EXPECT_EQ(get<I>(t1), get<I>(t2));
761
1
  LOG(INFO) << "COMPARE: " << get<I>(t1) << " == " << get<I>(t2);
762
1
  ExpectEqualTuplesHelper<I + 1>(t1, t2);
763
1
}
764
765
template <class Tuple>
766
18
void ExpectEqualTuples(const Tuple& t1, const Tuple& t2) {
767
18
  ExpectEqualTuplesHelper<0>(t1, t2);
768
18
}
_ZN2yb17ExpectEqualTuplesINSt3__15tupleIJNS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE11cass_bool_tfdixS8_EEEEEvRKT_SD_
Line
Count
Source
766
1
void ExpectEqualTuples(const Tuple& t1, const Tuple& t2) {
767
1
  ExpectEqualTuplesHelper<0>(t1, t2);
768
1
}
_ZN2yb17ExpectEqualTuplesINSt3__15tupleIJNS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_13CassandraJsonEEEEEEvRKT_SD_
Line
Count
Source
766
2
void ExpectEqualTuples(const Tuple& t1, const Tuple& t2) {
767
2
  ExpectEqualTuplesHelper<0>(t1, t2);
768
2
}
_ZN2yb17ExpectEqualTuplesINSt3__15tupleIJ11cass_bool_tiNS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEiS9_EEEEEvRKT_SD_
Line
Count
Source
766
4
void ExpectEqualTuples(const Tuple& t1, const Tuple& t2) {
767
4
  ExpectEqualTuplesHelper<0>(t1, t2);
768
4
}
_ZN2yb17ExpectEqualTuplesINSt3__15tupleIJNS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEdEEEEEvRKT_SC_
Line
Count
Source
766
2
void ExpectEqualTuples(const Tuple& t1, const Tuple& t2) {
767
2
  ExpectEqualTuplesHelper<0>(t1, t2);
768
2
}
_ZN2yb17ExpectEqualTuplesINSt3__15tupleIJidEEEEEvRKT_S6_
Line
Count
Source
766
2
void ExpectEqualTuples(const Tuple& t1, const Tuple& t2) {
767
2
  ExpectEqualTuplesHelper<0>(t1, t2);
768
2
}
_ZN2yb17ExpectEqualTuplesINSt3__15tupleIJxdEEEEEvRKT_S6_
Line
Count
Source
766
1
void ExpectEqualTuples(const Tuple& t1, const Tuple& t2) {
767
1
  ExpectEqualTuplesHelper<0>(t1, t2);
768
1
}
_ZN2yb17ExpectEqualTuplesINSt3__15tupleIJ11cass_bool_tdEEEEEvRKT_S7_
Line
Count
Source
766
2
void ExpectEqualTuples(const Tuple& t1, const Tuple& t2) {
767
2
  ExpectEqualTuplesHelper<0>(t1, t2);
768
2
}
_ZN2yb17ExpectEqualTuplesINSt3__15tupleIJfdEEEEEvRKT_S6_
Line
Count
Source
766
2
void ExpectEqualTuples(const Tuple& t1, const Tuple& t2) {
767
2
  ExpectEqualTuplesHelper<0>(t1, t2);
768
2
}
_ZN2yb17ExpectEqualTuplesINSt3__15tupleIJddEEEEEvRKT_S6_
Line
Count
Source
766
1
void ExpectEqualTuples(const Tuple& t1, const Tuple& t2) {
767
1
  ExpectEqualTuplesHelper<0>(t1, t2);
768
1
}
_ZN2yb17ExpectEqualTuplesINSt3__15tupleIJNS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEidEEEEEvRKT_SC_
Line
Count
Source
766
1
void ExpectEqualTuples(const Tuple& t1, const Tuple& t2) {
767
1
  ExpectEqualTuplesHelper<0>(t1, t2);
768
1
}
769
770
0
void LogResult(const CassandraResult& result) {
771
0
  auto iterator = result.CreateIterator();
772
0
  int i = 0;
773
0
  while (iterator.Next()) {
774
0
    ++i;
775
0
    std::string line;
776
0
    auto row = iterator.Row();
777
0
    auto row_iterator = row.CreateIterator();
778
0
    bool first = true;
779
0
    while (row_iterator.Next()) {
780
0
      if (first) {
781
0
        first = false;
782
0
      } else {
783
0
        line += ", ";
784
0
      }
785
0
      line += row_iterator.Value().ToString();
786
0
    }
787
0
    LOG(INFO) << i << ") " << line;
788
0
  }
789
0
}
790
791
//------------------------------------------------------------------------------
792
793
1
TEST_F(CppCassandraDriverTest, TestBasicTypes) {
794
1
  typedef TestTable<
795
1
      string, cass_bool_t, cass_float_t, cass_double_t, cass_int32_t, cass_int64_t, string> MyTable;
796
1
  MyTable table;
797
1
  ASSERT_OK(table.CreateTable(
798
1
      &session_, "test.basic", {"key", "bln", "flt", "dbl", "i32", "i64", "str"}, {"key"}));
799
800
1
  const MyTable::ColumnsTuple input("test", cass_true, 11.01f, 22.002, 3, 4, "text");
801
1
  table.Insert(&session_, input);
802
803
1
  MyTable::ColumnsTuple output("test", cass_false, 0.f, 0., 0, 0, "");
804
1
  table.SelectOneRow(&session_, &output);
805
1
  table.Print("RESULT OUTPUT", output);
806
807
1
  LOG(INFO) << "Checking selected values...";
808
1
  ExpectEqualTuples(input, output);
809
1
}
810
811
1
TEST_F(CppCassandraDriverTest, TestJsonBType) {
812
1
  typedef TestTable<string, CassandraJson> MyTable;
813
1
  MyTable table;
814
1
  ASSERT_OK(table.CreateTable(&session_, "test.json", {"key", "json"}, {"key"}));
815
816
1
  MyTable::ColumnsTuple input("test", CassandraJson("{\"a\":1}"));
817
1
  table.Insert(&session_, input);
818
819
1
  MyTable::ColumnsTuple output("test", CassandraJson(""));
820
1
  table.SelectOneRow(&session_, &output);
821
1
  table.Print("RESULT OUTPUT", output);
822
823
1
  LOG(INFO) << "Checking selected values...";
824
1
  ExpectEqualTuples(input, output);
825
826
1
  get<1>(input) = CassandraJson("{\"b\":1}"); // 'json'
827
1
  table.Update(&session_, input);
828
829
1
  MyTable::ColumnsTuple updated_output("test", CassandraJson(""));
830
1
  table.SelectOneRow(&session_, &updated_output);
831
1
  table.Print("UPDATED RESULT OUTPUT", updated_output);
832
833
1
  LOG(INFO) << "Checking selected values...";
834
1
  ExpectEqualTuples(input, updated_output);
835
1
}
836
837
2
void VerifyLongJson(const string& json) {
838
  // Parse JSON.
839
2
  JsonReader r(json);
840
2
  ASSERT_OK(r.Init());
841
2
  const Value* json_obj = nullptr;
842
2
  EXPECT_OK(r.ExtractObject(r.root(), NULL, &json_obj));
843
2
  EXPECT_EQ(rapidjson::kObjectType, CHECK_NOTNULL(json_obj)->GetType());
844
845
2
  EXPECT_TRUE(json_obj->HasMember("b"));
846
2
  EXPECT_EQ(rapidjson::kNumberType, (*json_obj)["b"].GetType());
847
2
  EXPECT_EQ(1, (*json_obj)["b"].GetInt());
848
849
2
  EXPECT_TRUE(json_obj->HasMember("a1"));
850
2
  EXPECT_EQ(rapidjson::kArrayType, (*json_obj)["a1"].GetType());
851
2
  const Value::ConstArray arr = (*json_obj)["a1"].GetArray();
852
853
2
  EXPECT_EQ(rapidjson::kNumberType, arr[2].GetType());
854
2
  EXPECT_EQ(3., arr[2].GetDouble());
855
856
2
  EXPECT_EQ(rapidjson::kFalseType, arr[3].GetType());
857
2
  EXPECT_EQ(false, arr[3].GetBool());
858
859
2
  EXPECT_EQ(rapidjson::kTrueType, arr[4].GetType());
860
2
  EXPECT_EQ(true, arr[4].GetBool());
861
862
2
  EXPECT_EQ(rapidjson::kObjectType, arr[5].GetType());
863
2
  const Value::ConstObject obj = arr[5].GetObject();
864
2
  EXPECT_TRUE(obj.HasMember("k2"));
865
2
  EXPECT_EQ(rapidjson::kArrayType, obj["k2"].GetType());
866
2
  EXPECT_EQ(rapidjson::kNumberType, obj["k2"].GetArray()[1].GetType());
867
2
  EXPECT_EQ(200, obj["k2"].GetArray()[1].GetInt());
868
869
2
  EXPECT_TRUE(json_obj->HasMember("a"));
870
2
  EXPECT_EQ(rapidjson::kObjectType, (*json_obj)["a"].GetType());
871
2
  const Value::ConstObject obj_a = (*json_obj)["a"].GetObject();
872
873
2
  EXPECT_TRUE(obj_a.HasMember("q"));
874
2
  EXPECT_EQ(rapidjson::kObjectType, obj_a["q"].GetType());
875
2
  const Value::ConstObject obj_q = obj_a["q"].GetObject();
876
2
  EXPECT_TRUE(obj_q.HasMember("s"));
877
2
  EXPECT_EQ(rapidjson::kNumberType, obj_q["s"].GetType());
878
2
  EXPECT_EQ(2147483647, obj_q["s"].GetInt());
879
880
2
  EXPECT_TRUE(obj_a.HasMember("f"));
881
2
  EXPECT_EQ(rapidjson::kStringType, obj_a["f"].GetType());
882
2
  EXPECT_EQ("hello", string(obj_a["f"].GetString()));
883
2
}
884
885
1
TEST_F(CppCassandraDriverTest, TestLongJson) {
886
1
  const string long_json =
887
1
      "{ "
888
1
        "\"b\" : 1,"
889
1
        "\"a2\" : {},"
890
1
        "\"a3\" : \"\","
891
1
        "\"a1\" : [1, 2, 3.0, false, true, { \"k1\" : 1, \"k2\" : [100, 200, 300], \"k3\" : true}],"
892
1
        "\"a\" :"
893
1
        "{"
894
1
          "\"d\" : true,"
895
1
          "\"q\" :"
896
1
            "{"
897
1
              "\"p\" : 4294967295,"
898
1
              "\"r\" : -2147483648,"
899
1
              "\"s\" : 2147483647"
900
1
            "},"
901
1
          "\"g\" : -100,"
902
1
          "\"c\" : false,"
903
1
          "\"f\" : \"hello\","
904
1
          "\"x\" : 2.0,"
905
1
          "\"y\" : 9223372036854775807,"
906
1
          "\"z\" : -9223372036854775808,"
907
1
          "\"u\" : 18446744073709551615,"
908
1
          "\"l\" : 2147483647.123123e+75,"
909
1
          "\"e\" : null"
910
1
        "}"
911
1
      "}";
912
913
914
1
  typedef TestTable<string, CassandraJson> MyTable;
915
1
  MyTable table;
916
1
  ASSERT_OK(table.CreateTable(&session_, "basic", {"key", "json"}, {"key"}));
917
918
1
  MyTable::ColumnsTuple input("test", CassandraJson(long_json));
919
1
  table.Insert(&session_, input);
920
921
1
  ASSERT_OK(session_.ExecuteQuery(
922
1
      "INSERT INTO basic(key, json) values ('test0', '" + long_json + "');"));
923
1
  ASSERT_OK(session_.ExecuteQuery(
924
1
      "INSERT INTO basic(key, json) values ('test1', '{ \"a\" : 1 }');"));
925
1
  ASSERT_OK(session_.ExecuteQuery("INSERT INTO basic(key, json) values ('test2', '\"abc\"');"));
926
1
  ASSERT_OK(session_.ExecuteQuery("INSERT INTO basic(key, json) values ('test3', '3');"));
927
1
  ASSERT_OK(session_.ExecuteQuery("INSERT INTO basic(key, json) values ('test4', 'true');"));
928
1
  ASSERT_OK(session_.ExecuteQuery("INSERT INTO basic(key, json) values ('test5', 'false');"));
929
1
  ASSERT_OK(session_.ExecuteQuery("INSERT INTO basic(key, json) values ('test6', 'null');"));
930
1
  ASSERT_OK(session_.ExecuteQuery("INSERT INTO basic(key, json) values ('test7', '2.0');"));
931
1
  ASSERT_OK(session_.ExecuteQuery("INSERT INTO basic(key, json) values ('test8', '{\"b\" : 1}');"));
932
933
2
  for (const string& key : {"test", "test0"} ) {
934
2
    MyTable::ColumnsTuple output(key, CassandraJson(""));
935
2
    table.SelectOneRow(&session_, &output);
936
2
    table.Print("RESULT OUTPUT", output);
937
938
2
    LOG(INFO) << "Checking selected JSON object for key=" << key;
939
2
    const string json = get<1>(output).value(); // 'json'
940
941
2
    ASSERT_EQ(json,
942
2
        "{"
943
2
          "\"a\":"
944
2
          "{"
945
2
            "\"c\":false,"
946
2
            "\"d\":true,"
947
2
            "\"e\":null,"
948
2
            "\"f\":\"hello\","
949
2
            "\"g\":-100,"
950
2
            "\"l\":2.147483647123123e84,"
951
2
            "\"q\":"
952
2
            "{"
953
2
              "\"p\":4294967295,"
954
2
              "\"r\":-2147483648,"
955
2
              "\"s\":2147483647"
956
2
            "},"
957
2
            "\"u\":18446744073709551615,"
958
2
            "\"x\":2.0,"
959
2
            "\"y\":9223372036854775807,"
960
2
            "\"z\":-9223372036854775808"
961
2
          "},"
962
2
          "\"a1\":[1,2,3.0,false,true,{\"k1\":1,\"k2\":[100,200,300],\"k3\":true}],"
963
2
          "\"a2\":{},"
964
2
          "\"a3\":\"\","
965
2
          "\"b\":1"
966
2
        "}");
967
968
2
    VerifyLongJson(json);
969
2
  }
970
1
}
971
972
namespace {
973
974
2
Result<IndexPermissions> TestBackfillCreateIndexTableSimple(CppCassandraDriverTestIndex* test) {
975
2
  return TestBackfillCreateIndexTableSimple(
976
2
      test, false, IndexPermissions::INDEX_PERM_READ_WRITE_AND_DELETE);
977
2
}
978
979
8
Status ExecuteQueryWithRetriesOnSchemaMismatch(CassandraSession* session, const string& query) {
980
8
  return LoggedWaitFor(
981
8
      [session, &query]() -> Result<bool> {
982
8
        auto result = session->ExecuteQuery(query);
983
8
        if (result.ok()) {
984
8
          return true;
985
8
        }
986
0
        if (result.IsQLError() &&
987
0
            result.message().ToBuffer().find("Wrong Metadata Version.") != string::npos) {
988
0
          return false;  // Retry.
989
0
        }
990
0
        return result;
991
0
      },
992
8
      MonoDelta::FromSeconds(90), yb::Format("Retrying query: $0", query));
993
8
}
994
995
}  // namespace
996
997
Result<IndexPermissions> TestBackfillCreateIndexTableSimple(
998
4
    CppCassandraDriverTestIndex* test, bool deferred, IndexPermissions target_permission) {
999
4
  TestTable<cass_int32_t, string> table;
1000
4
  RETURN_NOT_OK(table.CreateTable(&test->session_, "test.test_table",
1001
4
                                  {"k", "v"}, {"(k)"}, true));
1002
1003
4
  LOG(INFO) << "Inserting one row";
1004
4
  RETURN_NOT_OK(test->session_.ExecuteQuery(
1005
4
      "insert into test_table (k, v) values (1, 'one');"));
1006
4
  LOG(INFO) << "Creating index";
1007
4
  WARN_NOT_OK(test->session_.ExecuteQuery(yb::Format(
1008
4
                  "create $0 index test_table_index_by_v on test_table (v);",
1009
4
                  (deferred ? "deferred" : ""))),
1010
4
              "create-index failed.");
1011
1012
4
  LOG(INFO) << "Inserting two rows";
1013
4
  RETURN_NOT_OK(ExecuteQueryWithRetriesOnSchemaMismatch(
1014
4
      &test->session_, "insert into test_table (k, v) values (2, 'two');"));
1015
4
  RETURN_NOT_OK(ExecuteQueryWithRetriesOnSchemaMismatch(
1016
4
      &test->session_, "insert into test_table (k, v) values (3, 'three');"));
1017
1018
4
  constexpr auto kNamespace = "test";
1019
4
  const YBTableName table_name(YQL_DATABASE_CQL, kNamespace, "test_table");
1020
4
  const YBTableName index_table_name(YQL_DATABASE_CQL, kNamespace, "test_table_index_by_v");
1021
4
  return test->client_->WaitUntilIndexPermissionsAtLeast(
1022
4
      table_name, index_table_name, target_permission);
1023
4
}
1024
1025
1
TEST_F_EX(CppCassandraDriverTest, TestCreateIndex, CppCassandraDriverTestIndexSlow) {
1026
1
  IndexPermissions perm = ASSERT_RESULT(TestBackfillCreateIndexTableSimple(this));
1027
1
  ASSERT_EQ(perm, IndexPermissions::INDEX_PERM_READ_WRITE_AND_DELETE);
1028
1
}
1029
1030
1
TEST_F_EX(CppCassandraDriverTest, TestCreateIndexDeferred, CppCassandraDriverTestIndex) {
1031
1
  IndexPermissions perm = ASSERT_RESULT(
1032
1
      TestBackfillCreateIndexTableSimple(this, true, IndexPermissions::INDEX_PERM_DO_BACKFILL));
1033
1
  ASSERT_EQ(perm, IndexPermissions::INDEX_PERM_DO_BACKFILL);
1034
1035
1
  constexpr auto kNamespace = "test";
1036
1
  const YBTableName table_name(YQL_DATABASE_CQL, kNamespace, "test_table");
1037
1
  const YBTableName index_table_name(YQL_DATABASE_CQL, kNamespace, "test_table_index_by_v");
1038
  // Sleep a little and check again. We expect no further progress.
1039
1
  const size_t kSleepTimeMs = 10000;
1040
1
  SleepFor(MonoDelta::FromMilliseconds(kSleepTimeMs));
1041
1
  perm = ASSERT_RESULT(client_->GetIndexPermissions(table_name, index_table_name));
1042
1
  ASSERT_EQ(perm, IndexPermissions::INDEX_PERM_DO_BACKFILL);
1043
1044
  // create another index without backfill being deferred. Both the indexes should backfill
1045
  // and go to INDEX_PERM_READ_WRITE_AND_DELETE.
1046
1
  auto s = session_.ExecuteQuery("create index test_table_index_by_v_2 on test_table(v);");
1047
1
  const YBTableName index_table_name2(YQL_DATABASE_CQL, "test", "test_table_index_by_v_2");
1048
1049
1
  perm = ASSERT_RESULT(client_->WaitUntilIndexPermissionsAtLeast(
1050
1
      table_name, index_table_name2, IndexPermissions::INDEX_PERM_READ_WRITE_AND_DELETE));
1051
1
  ASSERT_TRUE(perm == IndexPermissions::INDEX_PERM_READ_WRITE_AND_DELETE);
1052
1
  perm = ASSERT_RESULT(client_->GetIndexPermissions(table_name, index_table_name));
1053
1
  ASSERT_TRUE(perm == IndexPermissions::INDEX_PERM_READ_WRITE_AND_DELETE);
1054
1
}
1055
1056
TEST_F_EX(CppCassandraDriverTest, TestDeferredIndexBackfillsAfterWait,
1057
1
          CppCassandraDriverTestIndex) {
1058
1
  constexpr auto kNamespace = "test";
1059
1
  const YBTableName table_name(YQL_DATABASE_CQL, kNamespace, "test_table");
1060
1
  const YBTableName index_table_name(YQL_DATABASE_CQL, kNamespace, "test_table_index_by_v");
1061
1062
1
  IndexPermissions perm = ASSERT_RESULT(
1063
1
      TestBackfillCreateIndexTableSimple(this, /* deferred */ true,
1064
1
                                         IndexPermissions::INDEX_PERM_DO_BACKFILL));
1065
1
  ASSERT_EQ(perm, IndexPermissions::INDEX_PERM_DO_BACKFILL);
1066
1067
  // Ensure there is no progress even if we wait for a while.
1068
1
  constexpr auto kWaitSec = 10;
1069
1
  SleepFor(MonoDelta::FromSeconds(kWaitSec));
1070
1
  perm = ASSERT_RESULT(client_->GetIndexPermissions(table_name, index_table_name));
1071
1
  ASSERT_EQ(perm, IndexPermissions::INDEX_PERM_DO_BACKFILL);
1072
1073
  // Launch Backfill through yb-admin
1074
1
  constexpr auto kAdminRpcTimeout = 5;
1075
1
  auto yb_admin_client = std::make_unique<tools::enterprise::ClusterAdminClient>(
1076
1
      cluster_->GetMasterAddresses(), MonoDelta::FromSeconds(kAdminRpcTimeout));
1077
1
  ASSERT_OK(yb_admin_client->Init());
1078
1
  ASSERT_OK(yb_admin_client->LaunchBackfillIndexForTable(table_name));
1079
1080
  // Confirm that the backfill should proceed to completion.
1081
1
  perm = ASSERT_RESULT(client_->WaitUntilIndexPermissionsAtLeast(
1082
1
      table_name, index_table_name, IndexPermissions::INDEX_PERM_READ_WRITE_AND_DELETE));
1083
1
  ASSERT_EQ(perm, IndexPermissions::INDEX_PERM_READ_WRITE_AND_DELETE);
1084
1
}
1085
1086
TEST_F_EX(
1087
    CppCassandraDriverTest, TestCreateIndexSlowTServer,
1088
1
    CppCassandraDriverTestIndexNonResponsiveTServers) {
1089
  // We expect the create index to fail.
1090
1
  auto res = TestBackfillCreateIndexTableSimple(this);
1091
1
  if (res.ok()) {
1092
0
    ASSERT_NE(*res, IndexPermissions::INDEX_PERM_READ_WRITE_AND_DELETE);
1093
1
  } else if (res.status().IsTimedOut()) {
1094
    // It was probably on NotFound retry loop, so just send some request to the index and expect
1095
    // NotFound.  See issue #5932 to alleviate the need to do this.
1096
1
    const YBTableName index_table_name(YQL_DATABASE_CQL, "test", "test_table_index_by_v");
1097
1
    auto res2 = client_->GetYBTableInfo(index_table_name);
1098
1
    ASSERT_TRUE(!res2.ok());
1099
2
    ASSERT_TRUE(res2.status().IsNotFound()) << res2.status();
1100
0
  } else {
1101
0
    ASSERT_TRUE(res.status().IsNotFound()) << res.status();
1102
0
  }
1103
1
}
1104
1105
32
Result<int64_t> GetTableSize(CassandraSession *session, const std::string& table_name) {
1106
32
  int64_t size = 0;
1107
32
  RETURN_NOT_OK(session->ExecuteAndProcessOneRow(
1108
32
      Format("select count(*) from $0;", table_name),
1109
32
      [&size](const CassandraRow& row) {
1110
32
        size = row.Value(0).As<int64_t>();
1111
32
      }));
1112
31
  return size;
1113
32
}
1114
1115
void TestBackfillIndexTable(
1116
    CppCassandraDriverTestIndex* test, PKOnlyIndex is_pk_only,
1117
    IsUnique is_unique = IsUnique::kFalse,
1118
    IncludeAllColumns include_primary_key = IncludeAllColumns::kFalse,
1119
10
    UserEnforced user_enforced = UserEnforced::kFalse) {
1120
10
  constexpr int kLoops = 3;
1121
10
  constexpr size_t kBatchSize = 10;
1122
10
  constexpr size_t kNumBatches = 10;
1123
10
  constexpr size_t kExpectedCount = kBatchSize * kNumBatches;
1124
1125
10
  typedef TestTable<string, string, string> MyTable;
1126
10
  typedef MyTable::ColumnsTuple ColumnsType;
1127
10
  MyTable table;
1128
10
  ASSERT_OK(table.CreateTable(&test->session_, "test.key_value",
1129
10
                              {"key1", "key2", "value"}, {"(key1, key2)"},
1130
10
                              !user_enforced));
1131
1132
1133
10
  LOG(INFO) << "Creating index";
1134
10
  constexpr auto kNamespace = "test";
1135
10
  const YBTableName table_name(YQL_DATABASE_CQL, kNamespace, "key_value");
1136
10
  const YBTableName index_table_name(YQL_DATABASE_CQL, kNamespace, "index_by_value");
1137
1138
10
  std::vector<CassandraFuture> futures;
1139
1140
10
  int num_failures = 0;
1141
10
  CassandraFuture create_index_future(nullptr);
1142
40
  for (int loop = 1; loop <= kLoops; ++loop) {
1143
330
    for (int batch_idx = 0; batch_idx != kNumBatches; ++batch_idx) {
1144
300
      CassandraBatch batch(CassBatchType::CASS_BATCH_TYPE_LOGGED);
1145
300
      auto prepared = table.PrepareInsert(&test->session_);
1146
300
      if (!prepared.ok()) {
1147
        // Prepare could be failed because cluster has heavy load.
1148
        // It is ok to just retry in this case, because we check that process did not crash.
1149
0
        continue;
1150
0
      }
1151
3.30k
      for (int i = 0; i != kBatchSize; ++i) {
1152
3.00k
        const int key = batch_idx * kBatchSize + i;
1153
        // For non-unique tests, the value will be of the form v-l0xx where l is
1154
        // the loop number, and xx is the key.
1155
        // For unique index tests, the value will be a permutation of
1156
        //  1 .. kExpectedCount; or -1 .. -kExpectedCount for odd and even
1157
        //  loops.
1158
3.00k
        const int value =
1159
1.20k
            (is_unique ? (loop % 2 ? 1 : -1) *
1160
1.20k
                             ((loop * 1000 + key) % kExpectedCount + 1)
1161
1.80k
                       : loop * 1000 + key);
1162
3.00k
        ColumnsType tuple(Format("k-$0", key), Format("k-$0", key),
1163
3.00k
                          Format("v-$0", value));
1164
3.00k
        auto statement = prepared->Bind();
1165
3.00k
        table.BindInsert(&statement, tuple);
1166
3.00k
        batch.Add(&statement);
1167
3.00k
      }
1168
300
      futures.push_back(test->session_.SubmitBatch(batch));
1169
300
    }
1170
1171
    // For unique index tests, we want to make sure each loop of writes is
1172
    // complete before issuing the next one. For non-unique index tests,
1173
    // we only wait for the writes to persist before issuing the
1174
    // create index command.
1175
30
    if (is_unique || loop == 2) {
1176
      // Let us make sure that the writes so far have persisted.
1177
240
      for (auto& future : futures) {
1178
240
        if (!future.Wait().ok()) {
1179
0
          num_failures++;
1180
0
        }
1181
240
      }
1182
18
      futures.clear();
1183
18
    }
1184
1185
    // At the end of the second loop, we will issue the create index.
1186
    // The remaining loop(s) of writes will be concurrent with the create index.
1187
30
    if (loop == 2) {
1188
10
      create_index_future = test->session_.ExecuteGetFuture(
1189
10
          Format("create $0 index index_by_value on test.key_value ($1) $2 $3;",
1190
9
                 (is_unique ? "unique" : ""), (is_pk_only ? "key2" : "value"),
1191
7
                 (include_primary_key ? "include (key1, key2, value)" : " "),
1192
2
                 (user_enforced ? "with transactions = { 'enabled' : false,"
1193
2
                                  "'consistency_level' : 'user_enforced' }"
1194
8
                                : "")));
1195
10
    }
1196
30
  }
1197
1198
60
  for (auto& future : futures) {
1199
60
    auto res = future.Wait();
1200
60
    if (!res.ok()) {
1201
0
      num_failures++;
1202
0
    }
1203
60
    WARN_NOT_OK(res, "Write batch failed: ")
1204
60
  }
1205
10
  if (num_failures > 0) {
1206
0
    LOG(INFO) << num_failures << " write batches failed.";
1207
0
  }
1208
1209
  // It is fine for user enforced create index to timeout because
1210
  // index_backfill_upperbound_for_user_enforced_txn_duration_ms is longer than
1211
  // client_read_write_timeout_ms
1212
10
  auto s = create_index_future.Wait();
1213
10
  WARN_NOT_OK(s, "Create index failed.");
1214
1215
10
  const auto kLowerBound = kExpectedCount - kBatchSize * num_failures;
1216
10
  const auto kUpperBound = kExpectedCount + kBatchSize * num_failures;
1217
1218
  // Verified implicitly here that the backfill job has met the expected total number of
1219
  // records
1220
10
  const auto kMaxWait = kTimeMultiplier * 60s;
1221
10
  WARN_NOT_OK(WaitForBackfillSafeTimeOn(test->cluster_.get(), table_name, kMaxWait),
1222
10
      "Could not get safe time. May be OK, if the backfill is already done.");
1223
10
  WARN_NOT_OK(WaitForBackfillSatisfyCondition(
1224
10
      test->cluster_->GetMasterProxy<master::MasterDdlProxy>(), table_name,
1225
10
      [kLowerBound](Result<master::BackfillJobPB> backfill_job) -> Result<bool> {
1226
10
        if (!backfill_job) {
1227
10
          return backfill_job.status();
1228
10
        }
1229
10
        const auto number_rows_processed = backfill_job->num_rows_processed();
1230
10
        return number_rows_processed >= kLowerBound;
1231
10
      }, kMaxWait),
1232
10
      "Could not get BackfillJobPB. May be OK, if the backfill is already done.");
1233
1234
10
  IndexPermissions perm = ASSERT_RESULT(test->client_->WaitUntilIndexPermissionsAtLeast(
1235
10
      table_name, index_table_name, IndexPermissions::INDEX_PERM_READ_WRITE_AND_DELETE, kMaxWait));
1236
10
  ASSERT_TRUE(perm == IndexPermissions::INDEX_PERM_READ_WRITE_AND_DELETE);
1237
1238
10
  auto main_table_size = ASSERT_RESULT(GetTableSize(&test->session_, "key_value"));
1239
10
  auto index_table_size = ASSERT_RESULT(GetTableSize(&test->session_, "index_by_value"));
1240
1241
10
  EXPECT_GE(main_table_size, kLowerBound);
1242
10
  EXPECT_LE(main_table_size, kUpperBound);
1243
10
  EXPECT_GE(index_table_size, kLowerBound);
1244
10
  EXPECT_LE(index_table_size, kUpperBound);
1245
10
  if (!user_enforced || num_failures == 0) {
1246
10
    EXPECT_EQ(main_table_size, index_table_size);
1247
10
  }
1248
10
}
1249
1250
1
TEST_F_EX(CppCassandraDriverTest, TestTableCreateIndex, CppCassandraDriverTestIndexSlow) {
1251
1
  TestBackfillIndexTable(this, PKOnlyIndex::kFalse, IsUnique::kFalse,
1252
1
                         IncludeAllColumns::kFalse);
1253
1
}
1254
1255
1
TEST_F_EX(CppCassandraDriverTest, TestTableCreateIndexPKOnly, CppCassandraDriverTestIndexSlow) {
1256
1
  TestBackfillIndexTable(this, PKOnlyIndex::kTrue, IsUnique::kFalse,
1257
1
                         IncludeAllColumns::kFalse);
1258
1
}
1259
1260
1
TEST_F_EX(CppCassandraDriverTest, TestTableCreateIndexCovered, CppCassandraDriverTestIndexSlow) {
1261
1
  TestBackfillIndexTable(this, PKOnlyIndex::kFalse, IsUnique::kFalse,
1262
1
                         IncludeAllColumns::kTrue);
1263
1
}
1264
1265
TEST_F_EX(CppCassandraDriverTest, TestTableCreateIndexUserEnforced,
1266
1
          CppCassandraDriverTestUserEnforcedIndex) {
1267
1
  TestBackfillIndexTable(this, PKOnlyIndex::kFalse, IsUnique::kFalse,
1268
1
                         IncludeAllColumns::kTrue, UserEnforced::kTrue);
1269
1
}
1270
1271
1
TEST_F_EX(CppCassandraDriverTest, TestTableCreateUniqueIndex, CppCassandraDriverTestIndexSlow) {
1272
1
  TestBackfillIndexTable(this, PKOnlyIndex::kFalse, IsUnique::kTrue,
1273
1
                         IncludeAllColumns::kFalse);
1274
1
}
1275
1276
TEST_F_EX(
1277
1
    CppCassandraDriverTest, TestTableCreateUniqueIndexCovered, CppCassandraDriverTestIndexSlow) {
1278
1
  TestBackfillIndexTable(this, PKOnlyIndex::kFalse, IsUnique::kTrue,
1279
1
                         IncludeAllColumns::kTrue);
1280
1
}
1281
1282
TEST_F_EX(CppCassandraDriverTest, TestTableCreateUniqueIndexUserEnforced,
1283
1
          CppCassandraDriverTestUserEnforcedIndex) {
1284
1
  TestBackfillIndexTable(this, PKOnlyIndex::kFalse, IsUnique::kTrue,
1285
1
                         IncludeAllColumns::kTrue, UserEnforced::kTrue);
1286
1
}
1287
1288
17
bool CreateTableSuccessOrTimedOut(const Status& s) {
1289
  // We sometimes get a Runtime Error from cql_test_util wrapping the actual Timeout.
1290
17
  return s.ok() || s.IsTimedOut() ||
1291
0
         string::npos != s.ToUserMessage().find("Timed out waiting for Table Creation");
1292
17
}
1293
1294
1
TEST_F_EX(CppCassandraDriverTest, TestCreateJsonbIndex, CppCassandraDriverTestIndexSlow) {
1295
1
  TestTable<cass_int32_t, CassandraJson> table;
1296
1
  ASSERT_OK(table.CreateTable(&session_, "test.test_table", {"k", "v"}, {"(k)"},
1297
1
                              true));
1298
1299
1
  LOG(INFO) << "Inserting three rows";
1300
1
  ASSERT_OK(session_.ExecuteQuery(
1301
1
      "insert into test_table (k, v) values (1, '{\"f1\": \"one\", \"f2\": \"one\"}');"));
1302
1
  ASSERT_OK(session_.ExecuteQuery(
1303
1
      "insert into test_table (k, v) values (2, '{\"f1\": \"two\", \"f2\": \"two\"}');"));
1304
1
  ASSERT_OK(session_.ExecuteQuery(
1305
1
      "insert into test_table (k, v) values (3, '{\"f1\": \"three\", \"f2\": \"three\"}');"));
1306
1307
1
  LOG(INFO) << "Creating index";
1308
1
  auto s = session_.ExecuteQuery(
1309
1
      "create unique index test_table_index_by_v_f1 on test_table (v->>'f1');");
1310
1
  ASSERT_TRUE(CreateTableSuccessOrTimedOut(s));
1311
1
  WARN_NOT_OK(s, "Create index command failed. " + s.ToString());
1312
1313
1
  constexpr auto kNamespace = "test";
1314
1
  const YBTableName table_name(YQL_DATABASE_CQL, kNamespace, "test_table");
1315
1
  const YBTableName index_table_name(YQL_DATABASE_CQL, kNamespace,
1316
1
                                     "test_table_index_by_v_f1");
1317
1
  IndexPermissions perm = ASSERT_RESULT(client_->WaitUntilIndexPermissionsAtLeast(
1318
1
      table_name, index_table_name, IndexPermissions::INDEX_PERM_READ_WRITE_AND_DELETE));
1319
1
  ASSERT_TRUE(perm == IndexPermissions::INDEX_PERM_READ_WRITE_AND_DELETE);
1320
1321
1
  auto main_table_size =
1322
1
      ASSERT_RESULT(GetTableSize(&session_, "test_table"));
1323
1
  auto index_table_size =
1324
1
      ASSERT_RESULT(GetTableSize(&session_, "test_table_index_by_v_f1"));
1325
1
  ASSERT_EQ(main_table_size, index_table_size);
1326
1
}
1327
1328
1
TEST_F_EX(CppCassandraDriverTest, TestCreateUniqueIndexPasses, CppCassandraDriverTestIndexSlow) {
1329
1
  TestTable<cass_int32_t, string> table;
1330
1
  ASSERT_OK(table.CreateTable(&session_, "test.test_table", {"k", "v"}, {"(k)"},
1331
1
                              true));
1332
1333
1
  LOG(INFO) << "Inserting three rows";
1334
1
  ASSERT_OK(session_.ExecuteQuery(
1335
1
      "insert into test_table (k, v) values (1, 'one');"));
1336
1
  ASSERT_OK(session_.ExecuteQuery(
1337
1
      "insert into test_table (k, v) values (2, 'two');"));
1338
1
  ASSERT_OK(session_.ExecuteQuery(
1339
1
      "insert into test_table (k, v) values (3, 'three');"));
1340
1341
1
  LOG(INFO) << "Creating index";
1342
1
  auto s = session_.ExecuteQuery(
1343
1
      "create unique index test_table_index_by_v on test_table (v);");
1344
1
  ASSERT_TRUE(CreateTableSuccessOrTimedOut(s));
1345
1
  WARN_NOT_OK(s, "Create index command failed. " + s.ToString());
1346
1347
1
  constexpr auto kNamespace = "test";
1348
1
  const YBTableName table_name(YQL_DATABASE_CQL, kNamespace, "test_table");
1349
1
  const YBTableName index_table_name(YQL_DATABASE_CQL, kNamespace,
1350
1
                                     "test_table_index_by_v");
1351
1
  IndexPermissions perm = ASSERT_RESULT(client_->WaitUntilIndexPermissionsAtLeast(
1352
1
      table_name, index_table_name, IndexPermissions::INDEX_PERM_READ_WRITE_AND_DELETE));
1353
1
  ASSERT_TRUE(perm == IndexPermissions::INDEX_PERM_READ_WRITE_AND_DELETE);
1354
1355
1
  LOG(INFO) << "Inserting more rows -- collisions will be detected.";
1356
1
  ASSERT_TRUE(!session_
1357
1
                   .ExecuteGetFuture(
1358
1
                       "insert into test_table (k, v) values (-1, 'one');")
1359
1
                   .Wait()
1360
1
                   .ok());
1361
1
  ASSERT_OK(session_.ExecuteQuery(
1362
1
      "insert into test_table (k, v) values (4, 'four');"));
1363
1
  ASSERT_OK(session_.ExecuteQuery(
1364
1
      "insert into test_table (k, v) values (5, 'five');"));
1365
1
  ASSERT_TRUE(!session_
1366
1
                   .ExecuteGetFuture(
1367
1
                       "insert into test_table (k, v) values (-4, 'four');")
1368
1
                   .Wait()
1369
1
                   .ok());
1370
1
}
1371
1372
1
TEST_F_EX(CppCassandraDriverTest, TestCreateUniqueIndexIntent, CppCassandraDriverTestIndexSlow) {
1373
1
  TestTable<cass_int32_t, cass_int32_t> table;
1374
1
  ASSERT_OK(table.CreateTable(&session_, "test.test_table", {"k", "v"}, {"(k)"},
1375
1
                              true));
1376
1377
1
  constexpr int kNumRows = 10;
1378
1
  LOG(INFO) << "Inserting " << kNumRows << " rows";
1379
11
  for (int i = 1; i <= kNumRows; i++) {
1380
10
    ASSERT_OK(session_.ExecuteQuery(
1381
10
        Substitute("insert into test_table (k, v) values ($0, $0);", i)));
1382
10
  }
1383
1384
1
  LOG(INFO) << "Creating index";
1385
1
  auto session2 = CHECK_RESULT(EstablishSession());
1386
1
  CassandraFuture create_index_future = session2.ExecuteGetFuture(
1387
1
      "create unique index test_table_index_by_v on test_table (v);");
1388
1389
1
  constexpr auto kNamespace = "test";
1390
1
  const YBTableName table_name(YQL_DATABASE_CQL, kNamespace, "test_table");
1391
1
  const YBTableName index_table_name(YQL_DATABASE_CQL, kNamespace,
1392
1
                                     "test_table_index_by_v");
1393
1
  IndexPermissions perm = ASSERT_RESULT(client_->WaitUntilIndexPermissionsAtLeast(
1394
1
      table_name,
1395
1
      index_table_name,
1396
1
      IndexPermissions::INDEX_PERM_WRITE_AND_DELETE,
1397
1
      50ms /* max_wait */));
1398
1
  if (perm != IndexPermissions::INDEX_PERM_WRITE_AND_DELETE) {
1399
0
    LOG(WARNING) << "IndexPermissions is already past WRITE_AND_DELETE. "
1400
0
                 << "This run of the test may not actually be doing anything "
1401
0
                    "non-trivial.";
1402
0
  }
1403
1404
1
  const size_t kSleepTimeMs = 20;
1405
1
  LOG(INFO) << "Inserting " << kNumRows / 2 << " rows again.";
1406
5
  for (int i = 1; i < kNumRows / 2; i++) {
1407
4
    if (session_
1408
4
            .ExecuteQuery(Substitute("delete from test_table where k=$0;", i))
1409
4
            .ok()) {
1410
4
      WARN_NOT_OK(session_.ExecuteQuery(Substitute(
1411
4
                      "insert into test_table (k, v) values ($0, $0);", i)),
1412
4
                  "Overwrite failed");
1413
4
      SleepFor(MonoDelta::FromMilliseconds(kSleepTimeMs));
1414
0
    } else {
1415
0
      LOG(ERROR) << "Deleting & Inserting failed for " << i;
1416
0
    }
1417
4
  }
1418
1419
1
  perm = ASSERT_RESULT(client_->WaitUntilIndexPermissionsAtLeast(
1420
1
      table_name,
1421
1
      index_table_name,
1422
1
      IndexPermissions::INDEX_PERM_DO_BACKFILL,
1423
1
      50ms /* max_wait */));
1424
1
  if (perm != IndexPermissions::INDEX_PERM_DO_BACKFILL) {
1425
0
    LOG(WARNING) << "IndexPermissions already past DO_BACKFILL";
1426
0
  }
1427
1428
1
  LOG(INFO) << "Inserting " << kNumRows / 2 << " more rows again.";
1429
7
  for (int i = kNumRows / 2; i <= kNumRows; i++) {
1430
6
    if (session_
1431
6
            .ExecuteQuery(Substitute("delete from test_table where k=$0;", i))
1432
6
            .ok()) {
1433
6
      WARN_NOT_OK(session_.ExecuteQuery(Substitute(
1434
6
                      "insert into test_table (k, v) values (-$0, $0);", i)),
1435
6
                  "Overwrite failed");
1436
6
      SleepFor(MonoDelta::FromMilliseconds(kSleepTimeMs));
1437
0
    } else {
1438
0
      LOG(ERROR) << "Deleting & Inserting failed for " << i;
1439
0
    }
1440
6
  }
1441
1442
1
  LOG(INFO) << "Waited on the Create Index to finish. Status  = "
1443
1
            << create_index_future.Wait();
1444
1445
1
  perm = ASSERT_RESULT(client_->WaitUntilIndexPermissionsAtLeast(
1446
1
      table_name, index_table_name, IndexPermissions::INDEX_PERM_READ_WRITE_AND_DELETE));
1447
1
  ASSERT_EQ(perm, IndexPermissions::INDEX_PERM_READ_WRITE_AND_DELETE);
1448
1
}
1449
1450
TEST_F_EX(
1451
    CppCassandraDriverTest, TestCreateUniqueIndexPassesManyWrites,
1452
1
    CppCassandraDriverTestIndexSlow) {
1453
1
  TestTable<cass_int32_t, string> table;
1454
1
  ASSERT_OK(table.CreateTable(&session_, "test.test_table", {"k", "v"}, {"(k)"},
1455
1
                              true));
1456
1457
1
  constexpr int kNumRows = 100;
1458
1
  LOG(INFO) << "Inserting " << kNumRows << " rows";
1459
101
  for (int i = 1; i <= kNumRows; i++) {
1460
100
    ASSERT_OK(session_.ExecuteQuery(
1461
100
        Substitute("insert into test_table (k, v) values ($0, 'v-$0');", i)));
1462
100
  }
1463
1464
1
  LOG(INFO) << "Creating index";
1465
1
  auto session2 = ASSERT_RESULT(EstablishSession());
1466
1
  CassandraFuture create_index_future = session2.ExecuteGetFuture(
1467
1
      "create unique index test_table_index_by_v on test_table (v);");
1468
1469
1
  constexpr auto kNamespace = "test";
1470
1
  const YBTableName table_name(YQL_DATABASE_CQL, kNamespace, "test_table");
1471
1
  const YBTableName index_table_name(YQL_DATABASE_CQL, kNamespace,
1472
1
                                     "test_table_index_by_v");
1473
1
  IndexPermissions perm = ASSERT_RESULT(client_->WaitUntilIndexPermissionsAtLeast(
1474
1
      table_name,
1475
1
      index_table_name,
1476
1
      IndexPermissions::INDEX_PERM_WRITE_AND_DELETE,
1477
1
      50ms /* max_wait */));
1478
1
  if (perm != IndexPermissions::INDEX_PERM_WRITE_AND_DELETE) {
1479
0
    LOG(WARNING) << "IndexPermissions is already past WRITE_AND_DELETE. "
1480
0
                 << "This run of the test may not actually be doing anything "
1481
0
                    "non-trivial.";
1482
0
  }
1483
1484
1
  const size_t kSleepTimeMs = 20;
1485
1
  LOG(INFO) << "Inserting " << kNumRows / 2 << " rows again.";
1486
50
  for (int i = 1; i < kNumRows / 2; i++) {
1487
49
    if (session_
1488
49
            .ExecuteQuery(Substitute("delete from test_table where k=$0;", i))
1489
49
            .ok()) {
1490
49
      WARN_NOT_OK(
1491
49
          session_.ExecuteQuery(Substitute(
1492
49
              "insert into test_table (k, v) values (-$0, 'v-$0');", i)),
1493
49
          "Overwrite failed");
1494
49
      SleepFor(MonoDelta::FromMilliseconds(kSleepTimeMs));
1495
0
    } else {
1496
0
      LOG(ERROR) << "Deleting & Inserting failed for " << i;
1497
0
    }
1498
49
  }
1499
1500
1
  perm = ASSERT_RESULT(client_->WaitUntilIndexPermissionsAtLeast(
1501
1
      table_name,
1502
1
      index_table_name,
1503
1
      IndexPermissions::INDEX_PERM_DO_BACKFILL,
1504
1
      50ms /* max_wait */));
1505
1
  if (perm != IndexPermissions::INDEX_PERM_DO_BACKFILL) {
1506
1
    LOG(WARNING) << "IndexPermissions already past DO_BACKFILL";
1507
1
  }
1508
1509
1
  LOG(INFO) << "Inserting " << kNumRows / 2 << " more rows again.";
1510
52
  for (int i = kNumRows / 2; i <= kNumRows; i++) {
1511
51
    if (session_
1512
51
            .ExecuteQuery(Substitute("delete from test_table where k=$0;", i))
1513
51
            .ok()) {
1514
51
      WARN_NOT_OK(
1515
51
          session_.ExecuteQuery(Substitute(
1516
51
              "insert into test_table (k, v) values (-$0, 'v-$0');", i)),
1517
51
          "Overwrite failed");
1518
51
      SleepFor(MonoDelta::FromMilliseconds(kSleepTimeMs));
1519
0
    } else {
1520
0
      LOG(ERROR) << "Deleting & Inserting failed for " << i;
1521
0
    }
1522
51
  }
1523
1524
1
  LOG(INFO) << "Waited on the Create Index to finish. Status  = "
1525
1
            << create_index_future.Wait();
1526
1527
1
  perm = ASSERT_RESULT(client_->WaitUntilIndexPermissionsAtLeast(
1528
1
      table_name, index_table_name, IndexPermissions::INDEX_PERM_READ_WRITE_AND_DELETE));
1529
1
  ASSERT_EQ(perm, IndexPermissions::INDEX_PERM_READ_WRITE_AND_DELETE);
1530
1
}
1531
1532
TEST_F_EX(
1533
1
    CppCassandraDriverTest, TestCreateIdxTripleCollisionTest, CppCassandraDriverTestIndexSlow) {
1534
1
  TestTable<cass_int32_t, string> table;
1535
1
  ASSERT_OK(table.CreateTable(&session_, "test.test_table", {"k", "v"}, {"(k)"},
1536
1
                              true));
1537
1538
1
  ASSERT_OK(
1539
1
      session_.ExecuteQuery("insert into test_table (k, v) values (1, 'a')"));
1540
1
  ASSERT_OK(
1541
1
      session_.ExecuteQuery("insert into test_table (k, v) values (3, 'a')"));
1542
1
  ASSERT_OK(
1543
1
      session_.ExecuteQuery("insert into test_table (k, v) values (4, 'a')"));
1544
1545
1
  LOG(INFO) << "Creating index";
1546
  // session_.ExecuteQuery("create unique index test_table_index_by_v on
1547
  // test_table (v);");
1548
1
  auto session2 = ASSERT_RESULT(EstablishSession());
1549
1
  CassandraFuture create_index_future = session2.ExecuteGetFuture(
1550
1
      "create unique index test_table_index_by_v on test_table (v);");
1551
1552
1
  constexpr auto kNamespace = "test";
1553
1
  const YBTableName table_name(YQL_DATABASE_CQL, kNamespace, "test_table");
1554
1
  const YBTableName index_table_name(YQL_DATABASE_CQL, kNamespace,
1555
1
                                     "test_table_index_by_v");
1556
1
  {
1557
1
    IndexPermissions perm = ASSERT_RESULT(client_->WaitUntilIndexPermissionsAtLeast(
1558
1
        table_name,
1559
1
        index_table_name,
1560
1
        IndexPermissions::INDEX_PERM_DELETE_ONLY,
1561
1
        50ms /* max_wait */));
1562
1
    EXPECT_EQ(perm, IndexPermissions::INDEX_PERM_DELETE_ONLY);
1563
1
  }
1564
1565
1
  CoarseBackoffWaiter waiter(CoarseMonoClock::Now() + 90s,
1566
1
                             CoarseMonoClock::Duration::max());
1567
1
  auto res = session_.ExecuteQuery("DELETE from test_table WHERE k=4");
1568
1
  LOG(INFO) << "Got " << yb::ToString(res);
1569
1
  while (!res.ok()) {
1570
0
    waiter.Wait();
1571
0
    res = session_.ExecuteQuery("DELETE from test_table WHERE k=4");
1572
0
    LOG(INFO) << "Got " << yb::ToString(res);
1573
0
  }
1574
1575
1
  LOG(INFO) << "Waited on the Create Index to finish. Status  = "
1576
1
            << create_index_future.Wait();
1577
1
  {
1578
1
    auto res = client_->WaitUntilIndexPermissionsAtLeast(
1579
1
        table_name,
1580
1
        index_table_name,
1581
1
        IndexPermissions::INDEX_PERM_NOT_USED,
1582
1
        50ms /* max_wait */);
1583
1
    ASSERT_TRUE(!res.ok());
1584
1
    ASSERT_TRUE(res.status().IsNotFound());
1585
1586
1
    ASSERT_OK(LoggedWaitFor(
1587
1
        [this, index_table_name]() {
1588
1
          Result<YBTableInfo> index_table_info = client_->GetYBTableInfo(index_table_name);
1589
1
          return !index_table_info && index_table_info.status().IsNotFound();
1590
1
        },
1591
1
        10s, "waiting for index to be deleted"));
1592
1
  }
1593
1
}
1594
1595
// Simulate this situation:
1596
//   Session A                                    Session B
1597
//   ------------------------------------         -------------------------------------------
1598
//   CREATE TABLE (i, j, PRIMARY KEY (i))
1599
//                                                INSERT (1, 'a')
1600
//   CREATE UNIQUE INDEX (j)
1601
//   - DELETE_ONLY perm
1602
//                                                DELETE (1, 'a')
1603
//                                                (delete (1, 'a') to index)
1604
//                                                INSERT (2, 'a')
1605
//   - WRITE_DELETE perm
1606
//   - BACKFILL perm
1607
//     - get safe time for read
1608
//                                                INSERT (3, 'a')
1609
//                                                (insert (3, 'a') to index)
1610
//     - do the actual backfill
1611
//                                                (insert (2, 'a') to index--detect conflict)
1612
//   - READ_WRITE_DELETE perm
1613
// This test is for issue #5811.
1614
TEST_F_EX(
1615
    CppCassandraDriverTest,
1616
    YB_DISABLE_TEST_IN_SANITIZERS(CreateUniqueIndexWriteAfterSafeTime),
1617
1
    CppCassandraDriverTestIndexSlower) {
1618
1
  TestTable<cass_int32_t, string> table;
1619
1
  ASSERT_OK(table.CreateTable(&session_, "test.test_table", {"k", "v"}, {"(k)"}, true));
1620
1621
1
  ASSERT_OK(session_.ExecuteQuery("INSERT INTO test_table (k, v) VALUES (1, 'a')"));
1622
1623
1
  LOG(INFO) << "Creating index";
1624
1
  auto session2 = ASSERT_RESULT(EstablishSession());
1625
1
  CassandraFuture create_index_future = session2.ExecuteGetFuture(
1626
1
      "CREATE UNIQUE INDEX test_table_index_by_v ON test_table (v)");
1627
1628
1
  constexpr auto kNamespace = "test";
1629
1
  const YBTableName table_name(YQL_DATABASE_CQL, kNamespace, "test_table");
1630
1
  const YBTableName index_table_name(YQL_DATABASE_CQL, kNamespace, "test_table_index_by_v");
1631
1632
1
  LOG(INFO) << "Wait for DELETE permission";
1633
1
  {
1634
    // Deadline is
1635
    //   3s for before WRITE perm sleep
1636
    // + 3s for extra
1637
    // = 6s
1638
    // Right after the "before WRITE", the index permissions become WRITE while the fully applied
1639
    // index permissions become DELETE.  (Actually, the index should already be fully applied DELETE
1640
    // before this since that's the starting permission.)
1641
1
    IndexPermissions perm = ASSERT_RESULT(client_->WaitUntilIndexPermissionsAtLeast(
1642
1
        table_name,
1643
1
        index_table_name,
1644
1
        IndexPermissions::INDEX_PERM_DELETE_ONLY,
1645
1
        CoarseMonoClock::Now() + 6s /* deadline */,
1646
1
        50ms /* max_wait */));
1647
1
    ASSERT_EQ(perm, IndexPermissions::INDEX_PERM_DELETE_ONLY);
1648
1
  }
1649
1650
1
  LOG(INFO) << "Do insert and delete before WRITE permission";
1651
1
  {
1652
    // Deadline is
1653
    //   3s for before WRITE perm sleep
1654
    // + 3s for extra
1655
    // = 6s
1656
    // We want to make sure the latest permissions are not WRITE.  The latest permissions become
1657
    // WRITE after "before WRITE".
1658
1
    CoarseBackoffWaiter waiter(CoarseMonoClock::Now() + 6s, CoarseMonoClock::Duration::max());
1659
1
    Status status;
1660
1
    do {
1661
1
      status = session_.ExecuteQuery("DELETE from test_table WHERE k = 1");
1662
1
      LOG(INFO) << "Got " << yb::ToString(status);
1663
1
      if (status.ok()) {
1664
1
        status = session_.ExecuteQuery("INSERT INTO test_table (k, v) VALUES (2, 'a')");
1665
1
      }
1666
1
      ASSERT_TRUE(waiter.Wait());
1667
1
    } while (!status.ok());
1668
1
  }
1669
1670
1
  LOG(INFO) << "Ensure it is still DELETE permission";
1671
1
  {
1672
1
    IndexPermissions perm = ASSERT_RESULT(client_->GetIndexPermissions(
1673
1
        table_name,
1674
1
        index_table_name));
1675
1
    ASSERT_EQ(perm, IndexPermissions::INDEX_PERM_DELETE_ONLY);
1676
1
  }
1677
1678
1
  LOG(INFO) << "Wait for BACKFILL permission";
1679
1
  {
1680
    // Deadline is
1681
    //   3s for before WRITE perm sleep
1682
    // + 3s for after WRITE perm sleep
1683
    // + 3s for before BACKFILL perm sleep
1684
    // + 3s for after BACKFILL perm sleep
1685
    // + 3s for extra
1686
    // = 15s
1687
1
    IndexPermissions perm = ASSERT_RESULT(client_->WaitUntilIndexPermissionsAtLeast(
1688
1
        table_name,
1689
1
        index_table_name,
1690
1
        IndexPermissions::INDEX_PERM_DO_BACKFILL,
1691
1
        CoarseMonoClock::Now() + 15s /* deadline */,
1692
1
        50ms /* max_wait */));
1693
1
    EXPECT_EQ(perm, IndexPermissions::INDEX_PERM_DO_BACKFILL);
1694
1
  }
1695
1696
1
  LOG(INFO) << "Wait to get safe time for backfill (currently approximated using 1s sleep)";
1697
1
  SleepFor(1s);
1698
1699
1
  LOG(INFO) << "Do insert before backfill";
1700
1
  {
1701
    // Deadline is
1702
    //   2s for remainder of 3s sleep of backfill
1703
    // + 3s for extra
1704
    // = 5s
1705
1
    CoarseBackoffWaiter waiter(CoarseMonoClock::Now() + 5s, CoarseMonoClock::Duration::max());
1706
1
    while (true) {
1707
1
      Status status = session_.ExecuteQuery("INSERT INTO test_table (k, v) VALUES (3, 'a')");
1708
1
      LOG(INFO) << "Got " << yb::ToString(status);
1709
1
      if (status.ok()) {
1710
1
        break;
1711
0
      } else {
1712
0
        ASSERT_FALSE(status.IsIllegalState() &&
1713
0
                     status.message().ToBuffer().find("Duplicate value") != std::string::npos)
1714
0
            << "The insert should come before backfill, so it should not cause duplicate conflict.";
1715
0
        ASSERT_TRUE(waiter.Wait());
1716
0
      }
1717
1
    }
1718
1
  }
1719
1720
1
  LOG(INFO) << "Wait for CREATE INDEX to finish (either succeed or fail)";
1721
1
  bool is_index_created;
1722
1
  {
1723
    // Deadline is
1724
    //   2s for remainder of 3s sleep of backfill
1725
    // + 3s for before READ or WRITE_WHILE_REMOVING perm sleep
1726
    // + 3s for after WRITE_WHILE_REMOVING perm sleep
1727
    // + 3s for before DELETE_WHILE_REMOVING perm sleep
1728
    // + 3s for extra
1729
    // = 14s
1730
    // (In the fail case) Right after the "before DELETE_WHILE_REMOVING", the index permissions
1731
    // become DELETE_WHILE_REMOVING while the fully applied index permissions become
1732
    // WRITE_WHILE_REMOVING, and WRITE_WHILE_REMOVING is the first permission in the fail case >=
1733
    // READ permission.
1734
1
    IndexPermissions perm = ASSERT_RESULT(client_->WaitUntilIndexPermissionsAtLeast(
1735
1
        table_name,
1736
1
        index_table_name,
1737
1
        IndexPermissions::INDEX_PERM_READ_WRITE_AND_DELETE,
1738
1
        CoarseMonoClock::Now() + 14s /* deadline */,
1739
1
        50ms /* max_wait */));
1740
1
    if (perm != IndexPermissions::INDEX_PERM_READ_WRITE_AND_DELETE) {
1741
1
      LOG(INFO) << "Wait for index to get deleted";
1742
1
      auto result = client_->WaitUntilIndexPermissionsAtLeast(
1743
1
          table_name,
1744
1
          index_table_name,
1745
1
          IndexPermissions::INDEX_PERM_NOT_USED,
1746
1
          50ms /* max_wait */);
1747
1
      ASSERT_TRUE(!result.ok());
1748
1
      ASSERT_TRUE(result.status().IsNotFound());
1749
1
      is_index_created = false;
1750
0
    } else {
1751
0
      is_index_created = true;
1752
0
    }
1753
1
  }
1754
1755
  // Check.
1756
1
  {
1757
1
    auto result = GetTableSize(&session_, "test_table");
1758
1
    CoarseBackoffWaiter waiter(CoarseMonoClock::Now() + 10s, CoarseMonoClock::Duration::max());
1759
1
    while (!result.ok()) {
1760
0
      ASSERT_TRUE(waiter.Wait());
1761
0
      ASSERT_TRUE(result.status().IsQLError()) << result.status();
1762
0
      ASSERT_TRUE(result.status().message().ToBuffer().find("schema version mismatch")
1763
0
                  != std::string::npos) << result.status();
1764
      // Retry.
1765
0
      result = GetTableSize(&session_, "test_table");
1766
0
    }
1767
1
    const int64_t main_table_size = *result;
1768
1
    result = GetTableSize(&session_, "test_table_index_by_v");
1769
1770
1
    ASSERT_EQ(main_table_size, 2);
1771
1
    if (is_index_created) {
1772
      // This is to demonstrate issue #5811.  These statements should not fail.
1773
0
      const int64_t index_table_size = ASSERT_RESULT(std::move(result));
1774
0
      ASSERT_EQ(index_table_size, 1);
1775
      // Since the main table has two rows while the index has one row, the index is inconsistent.
1776
0
      ASSERT_TRUE(false) << "index was created and is inconsistent with its indexed table";
1777
1
    } else {
1778
1
      ASSERT_NOK(result);
1779
1
    }
1780
1
  }
1781
1
}
1782
1783
class CppCassandraDriverTestSlowTServer : public CppCassandraDriverTest {
1784
 public:
1785
1
  std::vector<std::string> ExtraTServerFlags() override {
1786
1
    auto flags = CppCassandraDriverTest::ExtraTServerFlags();
1787
1
    flags.push_back("--TEST_slowdown_backfill_by_ms=5000");
1788
1
    flags.push_back("--ycql_num_tablets=1");
1789
1
    flags.push_back("--ysql_num_tablets=1");
1790
1
    return flags;
1791
1
  }
1792
};
1793
1794
TEST_F_EX(
1795
    CppCassandraDriverTest,
1796
    DeleteIndexWhileBackfilling,
1797
1
    CppCassandraDriverTestSlowTServer) {
1798
1
  TestTable<cass_int32_t, string> table;
1799
1
  ASSERT_OK(table.CreateTable(&session_, "test.test_table", {"k", "v"}, {"(k)"}, true));
1800
1801
1
  LOG(INFO) << "Creating two indexes that will backfill together";
1802
  // Create 2 indexes that backfill together. One of them will be deleted while the backfill
1803
  // is happening. The deleted index should be successfully deleted, and the other index will
1804
  // be successfully backfilled.
1805
1
  auto session2 = ASSERT_RESULT(EstablishSession());
1806
1
  CassandraFuture create_index_future0 =
1807
1
      session2.ExecuteGetFuture("CREATE DEFERRED INDEX test_table_index_by_v0 ON test_table (v)");
1808
1
  CassandraFuture create_index_future1 =
1809
1
      session2.ExecuteGetFuture("CREATE INDEX test_table_index_by_v1 ON test_table (v)");
1810
1811
1
  constexpr auto kNamespace = "test";
1812
1
  const YBTableName table_name(YQL_DATABASE_CQL, kNamespace, "test_table");
1813
1
  const YBTableName index_table_name0(YQL_DATABASE_CQL, kNamespace, "test_table_index_by_v0");
1814
1
  const YBTableName index_table_name1(YQL_DATABASE_CQL, kNamespace, "test_table_index_by_v1");
1815
1816
1
  auto res = client_->WaitUntilIndexPermissionsAtLeast(
1817
1
      table_name, index_table_name1, IndexPermissions::INDEX_PERM_DO_BACKFILL, 50ms /* max_wait */);
1818
  // Allow backfill to get past GetSafeTime
1819
1
  ASSERT_OK(WaitForBackfillSafeTimeOn(cluster_.get(), table_name));
1820
1821
1
  ASSERT_OK(session_.ExecuteQuery("drop index test_table_index_by_v1"));
1822
1823
  // Wait for the backfill to actually run to completion/failure.
1824
1
  SleepFor(MonoDelta::FromSeconds(10));
1825
1
  res = client_->WaitUntilIndexPermissionsAtLeast(
1826
1
      table_name, index_table_name1, IndexPermissions::INDEX_PERM_NOT_USED, 50ms /* max_wait */);
1827
1
  ASSERT_TRUE(!res.ok());
1828
1
  ASSERT_TRUE(res.status().IsNotFound());
1829
1830
1
  auto perm = ASSERT_RESULT(client_->WaitUntilIndexPermissionsAtLeast(
1831
1
      table_name, index_table_name0, IndexPermissions::INDEX_PERM_READ_WRITE_AND_DELETE));
1832
1
  ASSERT_EQ(perm, IndexPermissions::INDEX_PERM_READ_WRITE_AND_DELETE);
1833
1
}
1834
1835
1
TEST_F_EX(CppCassandraDriverTest, TestPartialFailureDeferred, CppCassandraDriverTestIndex) {
1836
1
  TestTable<cass_int32_t, string> table;
1837
1
  ASSERT_OK(table.CreateTable(&session_, "test.test_table", {"k", "v"}, {"(k)"}, true));
1838
1839
1
  LOG(INFO) << "Inserting three rows";
1840
1
  ASSERT_OK(session_.ExecuteQuery("insert into test_table (k, v) values (1, 'one');"));
1841
1
  ASSERT_OK(session_.ExecuteQuery("insert into test_table (k, v) values (2, 'two');"));
1842
1
  ASSERT_OK(session_.ExecuteQuery("insert into test_table (k, v) values (3, 'three');"));
1843
1
  LOG(INFO) << "Inserting one more to violate uniqueness";
1844
1
  ASSERT_OK(session_.ExecuteQuery("insert into test_table (k, v) values (-2, 'two');"));
1845
1
  LOG(INFO) << "Creating index";
1846
1847
1
  auto s =
1848
1
      session_.ExecuteQuery("create deferred index test_table_index_by_v_1 on test_table (v);");
1849
1
  ASSERT_TRUE(CreateTableSuccessOrTimedOut(s));
1850
1
  WARN_NOT_OK(s, "Create index command failed. " + s.ToString());
1851
1852
1
  s = session_.ExecuteQuery(
1853
1
      "create deferred unique index test_table_index_by_v_unq on test_table (v);");
1854
1
  ASSERT_TRUE(CreateTableSuccessOrTimedOut(s));
1855
1
  WARN_NOT_OK(s, "Create index command failed. " + s.ToString());
1856
1857
  // Non deferred index.
1858
1
  s = session_.ExecuteQuery("create unique index test_table_index_by_k on test_table (k);");
1859
1
  ASSERT_TRUE(CreateTableSuccessOrTimedOut(s));
1860
1
  WARN_NOT_OK(s, "Create index command failed. " + s.ToString());
1861
1862
1
  constexpr auto kNamespace = "test";
1863
1
  const YBTableName table_name(YQL_DATABASE_CQL, kNamespace, "test_table");
1864
1
  const YBTableName index_table_name_1(YQL_DATABASE_CQL, kNamespace, "test_table_index_by_v_1");
1865
1
  const YBTableName index_table_name_2(YQL_DATABASE_CQL, kNamespace, "test_table_index_by_k");
1866
1
  const YBTableName index_table_name_unq(YQL_DATABASE_CQL, kNamespace, "test_table_index_by_v_unq");
1867
1
  ASSERT_OK(client_->WaitUntilIndexPermissionsAtLeast(
1868
1
      table_name,
1869
1
      index_table_name_2,
1870
1
      IndexPermissions::INDEX_PERM_READ_WRITE_AND_DELETE,
1871
1
      50ms /* max_wait */));
1872
1873
1
  auto res = client_->WaitUntilIndexPermissionsAtLeast(
1874
1
      table_name, index_table_name_unq, IndexPermissions::INDEX_PERM_NOT_USED, 50ms /* max_wait */);
1875
1
  ASSERT_TRUE(!res.ok());
1876
1
  ASSERT_TRUE(res.status().IsNotFound());
1877
1878
1
  ASSERT_OK(client_->WaitUntilIndexPermissionsAtLeast(
1879
1
      table_name,
1880
1
      index_table_name_1,
1881
1
      IndexPermissions::INDEX_PERM_READ_WRITE_AND_DELETE,
1882
1
      50ms /* max_wait */));
1883
1
}
1884
1885
1
TEST_F_EX(CppCassandraDriverTest, TestCreateUniqueIndexFails, CppCassandraDriverTestIndexSlow) {
1886
1
  TestTable<cass_int32_t, string> table;
1887
1
  ASSERT_OK(table.CreateTable(&session_, "test.test_table", {"k", "v"}, {"(k)"},
1888
1
                              true));
1889
1890
1
  LOG(INFO) << "Inserting three rows";
1891
1
  ASSERT_OK(session_.ExecuteQuery(
1892
1
      "insert into test_table (k, v) values (1, 'one');"));
1893
1
  ASSERT_OK(session_.ExecuteQuery(
1894
1
      "insert into test_table (k, v) values (2, 'two');"));
1895
1
  ASSERT_OK(session_.ExecuteQuery(
1896
1
      "insert into test_table (k, v) values (3, 'three');"));
1897
1
  ASSERT_OK(session_.ExecuteQuery(
1898
1
      "insert into test_table (k, v) values (-2, 'two');"));
1899
1
  LOG(INFO) << "Creating index";
1900
1901
1
  auto s = session_.ExecuteQuery(
1902
1
      "create unique index test_table_index_by_v on test_table (v);");
1903
1
  ASSERT_TRUE(CreateTableSuccessOrTimedOut(s));
1904
1
  WARN_NOT_OK(s, "Create index command failed. " + s.ToString());
1905
1906
1
  constexpr auto kNamespace = "test";
1907
1
  const YBTableName table_name(YQL_DATABASE_CQL, kNamespace, "test_table");
1908
1
  const YBTableName index_table_name(YQL_DATABASE_CQL, kNamespace,
1909
1
                                     "test_table_index_by_v");
1910
1
  auto res = client_->WaitUntilIndexPermissionsAtLeast(
1911
1
      table_name,
1912
1
      index_table_name,
1913
1
      IndexPermissions::INDEX_PERM_NOT_USED,
1914
1
      50ms /* max_wait */);
1915
1
  ASSERT_TRUE(!res.ok());
1916
1
  ASSERT_TRUE(res.status().IsNotFound());
1917
1918
1
  ASSERT_OK(LoggedWaitFor(
1919
1
      [this, index_table_name]() {
1920
1
        Result<YBTableInfo> index_table_info = client_->GetYBTableInfo(index_table_name);
1921
1
        return !index_table_info && index_table_info.status().IsNotFound();
1922
1
      },
1923
1
      10s, "waiting for index to be deleted"));
1924
1925
1
  LOG(INFO)
1926
1
      << "Inserting more rows -- No collision checking for a failed index.";
1927
1
  ASSERT_OK(LoggedWaitFor(
1928
1
      [this]() {
1929
1
        return session_.ExecuteQuery("insert into test_table (k, v) values (-1, 'one');").ok();
1930
1
      },
1931
1
      10s, "insert after unique index creation failed."));
1932
1
  ASSERT_OK(LoggedWaitFor(
1933
1
      [this]() {
1934
1
        return session_.ExecuteQuery("insert into test_table (k, v) values (-3, 'three');").ok();
1935
1
      },
1936
1
      10s, "insert after unique index creation failed."));
1937
1
  ASSERT_OK(LoggedWaitFor(
1938
1
      [this]() {
1939
1
        return session_.ExecuteQuery("insert into test_table (k, v) values (4, 'four');").ok();
1940
1
      },
1941
1
      10s, "insert after unique index creation failed."));
1942
1
  ASSERT_OK(LoggedWaitFor(
1943
1
      [this]() {
1944
1
        return session_.ExecuteQuery("insert into test_table (k, v) values (-4, 'four');").ok();
1945
1
      },
1946
1
      10s, "insert after unique index creation failed."));
1947
1
  ASSERT_OK(LoggedWaitFor(
1948
1
      [this]() {
1949
1
        return session_.ExecuteQuery("insert into test_table (k, v) values (5, 'five');").ok();
1950
1
      },
1951
1
      10s, "insert after unique index creation failed."));
1952
1
  ASSERT_OK(LoggedWaitFor(
1953
1
      [this]() {
1954
1
        return session_.ExecuteQuery("insert into test_table (k, v) values (-5, 'five');").ok();
1955
1
      },
1956
1
      10s, "insert after unique index creation failed."));
1957
1
}
1958
1959
TEST_F_EX(
1960
    CppCassandraDriverTest, TestCreateUniqueIndexWithOnlineWriteFails,
1961
1
    CppCassandraDriverTestIndexSlow) {
1962
1
  DoTestCreateUniqueIndexWithOnlineWrites(this,
1963
1
                                          /* delete_before_insert */ false);
1964
1
}
1965
1966
TEST_F_EX(
1967
    CppCassandraDriverTest, TestCreateUniqueIndexWithOnlineWriteSuccess,
1968
1
    CppCassandraDriverTestIndexSlow) {
1969
1
  DoTestCreateUniqueIndexWithOnlineWrites(this,
1970
1
                                          /* delete_before_insert */ true);
1971
1
}
1972
1973
void DoTestCreateUniqueIndexWithOnlineWrites(CppCassandraDriverTestIndex* test,
1974
2
                                             bool delete_before_insert) {
1975
2
  constexpr auto kNamespace = "test";
1976
2
  const YBTableName table_name(YQL_DATABASE_CQL, kNamespace, "test_table");
1977
2
  const YBTableName index_table_name(YQL_DATABASE_CQL, kNamespace,
1978
2
                                     "test_table_index_by_v");
1979
2
  IndexInfoPB index_info_pb;
1980
2
  YBTableInfo index_table_info;
1981
1982
2
  TestTable<cass_int32_t, string> table;
1983
2
  ASSERT_OK(table.CreateTable(&test->session_, "test.test_table", {"k", "v"},
1984
2
                              {"(k)"}, true));
1985
1986
2
  LOG(INFO) << "Inserting three rows";
1987
2
  ASSERT_OK(test->session_.ExecuteQuery(
1988
2
      "insert into test_table (k, v) values (1, 'one');"));
1989
2
  ASSERT_OK(test->session_.ExecuteQuery(
1990
2
      "insert into test_table (k, v) values (2, 'two');"));
1991
2
  ASSERT_OK(test->session_.ExecuteQuery(
1992
2
      "insert into test_table (k, v) values (3, 'three');"));
1993
2
  LOG(INFO) << "Creating index";
1994
1995
2
  bool create_index_failed = false;
1996
2
  bool duplicate_insert_failed = false;
1997
2
  {
1998
2
    auto session2 = ASSERT_RESULT(test->EstablishSession());
1999
2000
2
    CassandraFuture create_index_future = session2.ExecuteGetFuture(
2001
2
        "create unique index test_table_index_by_v on test_table (v);");
2002
2003
2
    auto session3 = ASSERT_RESULT(test->EstablishSession());
2004
2
    ASSERT_RESULT(test->client_->WaitUntilIndexPermissionsAtLeast(
2005
2
        table_name, index_table_name, IndexPermissions::INDEX_PERM_WRITE_AND_DELETE));
2006
2
    CoarseBackoffWaiter waiter(CoarseMonoClock::Now() + 90s,
2007
2
                               CoarseMonoClock::Duration::max());
2008
2
    if (delete_before_insert) {
2009
1
      while (true) {
2010
1
        auto res = session3
2011
1
                       .ExecuteGetFuture(
2012
1
                           "update test_table set v = 'foo' where  k = 2;")
2013
1
                       .Wait();
2014
1
        LOG(INFO) << "Got " << yb::ToString(res);
2015
1
        if (res.ok()) {
2016
1
          break;
2017
1
        }
2018
0
        waiter.Wait();
2019
0
      }
2020
1
      LOG(INFO) << "Successfully deleted the old value before inserting the "
2021
1
                   "duplicate value";
2022
1
    }
2023
2
    int retries = 0;
2024
2
    const int kMaxRetries = 12;
2025
2
    Status res;
2026
2
    while (++retries < kMaxRetries) {
2027
2
      res = session3.ExecuteGetFuture(
2028
2
                        "insert into test_table (k, v) values (-2, 'two');")
2029
2
                    .Wait();
2030
2
      LOG(INFO) << "Got " << yb::ToString(res);
2031
2
      if (res.ok()) {
2032
2
        break;
2033
2
      }
2034
0
      waiter.Wait();
2035
0
    }
2036
2
    duplicate_insert_failed = !res.ok();
2037
2
    if (!duplicate_insert_failed) {
2038
2
      LOG(INFO) << "Successfully inserted the duplicate value";
2039
0
    } else {
2040
0
      LOG(ERROR) << "Giving up on inserting the duplicate value after "
2041
0
                 << kMaxRetries << " tries.";
2042
0
    }
2043
2044
2
    LOG(INFO) << "Waited on the Create Index to finish. Status  = "
2045
2
              << create_index_future.Wait();
2046
2
  }
2047
2048
2
  Result<IndexPermissions> perm = test->client_->WaitUntilIndexPermissionsAtLeast(
2049
2
      table_name, index_table_name, IndexPermissions::INDEX_PERM_READ_WRITE_AND_DELETE);
2050
2051
2
  create_index_failed = (!perm.ok() || *perm > IndexPermissions::INDEX_PERM_READ_WRITE_AND_DELETE);
2052
2
  LOG(INFO) << "create_index_failed  = " << create_index_failed
2053
2
            << ", duplicate_insert_failed = " << duplicate_insert_failed;
2054
2055
2
  auto main_table_size =
2056
2
      ASSERT_RESULT(GetTableSize(&test->session_, "test_table"));
2057
2
  auto index_table_size_result = GetTableSize(&test->session_, "test_table_index_by_v");
2058
2059
2
  if (!create_index_failed) {
2060
1
    EXPECT_TRUE(index_table_size_result);
2061
1
    EXPECT_EQ(main_table_size, *index_table_size_result);
2062
1
  } else {
2063
1
    LOG(INFO) << "create index failed. "
2064
1
              << "main_table_size " << main_table_size << " is allowed to differ from "
2065
1
              << "index_table_size_result " << index_table_size_result;
2066
1
  }
2067
2
  if (delete_before_insert) {
2068
    // Expect both the create index, and the duplicate insert to succeed.
2069
1
    ASSERT_TRUE(!create_index_failed && !duplicate_insert_failed);
2070
1
  } else {
2071
    // Expect exactly one of create index or the duplicate insert to succeed.
2072
1
    ASSERT_TRUE((create_index_failed && !duplicate_insert_failed) ||
2073
1
                (!create_index_failed && duplicate_insert_failed));
2074
1
  }
2075
2
}
2076
2077
TEST_F_EX(CppCassandraDriverTest, TestTableBackfillInChunks,
2078
1
          CppCassandraDriverTestIndexMultipleChunks) {
2079
1
  TestBackfillIndexTable(this, PKOnlyIndex::kFalse, IsUnique::kFalse,
2080
1
                         IncludeAllColumns::kTrue, UserEnforced::kFalse);
2081
1
}
2082
2083
TEST_F_EX(
2084
    CppCassandraDriverTest, TestTableBackfillWithLeaderMoves,
2085
1
    CppCassandraDriverTestIndexMultipleChunksWithLeaderMoves) {
2086
1
  TestBackfillIndexTable(
2087
1
      this, PKOnlyIndex::kFalse, IsUnique::kFalse, IncludeAllColumns::kTrue, UserEnforced::kFalse);
2088
1
}
2089
2090
TEST_F_EX(CppCassandraDriverTest, TestTableBackfillUniqueInChunks,
2091
1
          CppCassandraDriverTestIndexMultipleChunks) {
2092
1
  TestBackfillIndexTable(this, PKOnlyIndex::kFalse, IsUnique::kTrue,
2093
1
                         IncludeAllColumns::kTrue, UserEnforced::kFalse);
2094
1
}
2095
2096
1
TEST_F_EX(CppCassandraDriverTest, TestIndexUpdateConcurrentTxn, CppCassandraDriverTestIndexSlow) {
2097
1
  constexpr auto kNamespace = "test";
2098
1
  const YBTableName table_name(YQL_DATABASE_CQL, kNamespace, "test_table");
2099
1
  const YBTableName index_table_name(YQL_DATABASE_CQL, kNamespace, "test_table_index_by_v");
2100
1
  IndexInfoPB index_info_pb;
2101
1
  YBTableInfo index_table_info;
2102
2103
1
  TestTable<cass_int32_t, string> table;
2104
1
  ASSERT_OK(table.CreateTable(&session_, "test.test_table", {"k", "v"}, {"(k)"}, true));
2105
2106
1
  LOG(INFO) << "Inserting rows";
2107
1
  ASSERT_OK(session_.ExecuteQuery("insert into test_table (k, v) values (1, 'one');"));
2108
1
  ASSERT_OK(session_.ExecuteQuery("insert into test_table (k, v) values (2, 'two');"));
2109
2110
1
  LOG(INFO) << "Creating index";
2111
1
  {
2112
1
    auto session2 = ASSERT_RESULT(EstablishSession());
2113
2114
1
    CassandraFuture create_index_future =
2115
1
        session2.ExecuteGetFuture("create index test_table_index_by_v on test_table (v);");
2116
2117
1
    auto session3 = ASSERT_RESULT(EstablishSession());
2118
1
    ASSERT_RESULT(client_->WaitUntilIndexPermissionsAtLeast(
2119
1
        table_name, index_table_name, IndexPermissions::INDEX_PERM_DELETE_ONLY));
2120
2121
1
    WARN_NOT_OK(session_.ExecuteQuery("insert into test_table (k, v) values (1, 'foo');"),
2122
1
                "updating k = 1 failed.");
2123
1
    WARN_NOT_OK(session3.ExecuteQuery("update test_table set v = 'bar' where  k = 2;"),
2124
1
                "updating k =2 failed.");
2125
2126
1
    auto perm = ASSERT_RESULT(client_->WaitUntilIndexPermissionsAtLeast(
2127
1
        table_name, index_table_name, IndexPermissions::INDEX_PERM_READ_WRITE_AND_DELETE));
2128
1
    LOG(INFO) << "IndexPermissions is now " << IndexPermissions_Name(perm);
2129
1
  }
2130
2131
1
  auto main_table_size = ASSERT_RESULT(GetTableSize(&session_, "test_table"));
2132
1
  auto index_table_size = ASSERT_RESULT(GetTableSize(&session_, "test_table_index_by_v"));
2133
1
  EXPECT_EQ(main_table_size, index_table_size);
2134
1
}
2135
2136
TEST_F_EX(
2137
1
    CppCassandraDriverTest, TestCreateMultipleIndex, CppCassandraDriverTestIndexSlowBackfill) {
2138
1
  ASSERT_OK(session_.ExecuteQuery(
2139
1
      "create table test_table (k1 int, k2 int, v text, PRIMARY KEY ((k1), k2)) "
2140
1
      "with transactions = {'enabled' : true};"));
2141
2142
1
  constexpr int32_t kNumKeys = 1000;
2143
1.00k
  for (int i = 0; i < kNumKeys; i++) {
2144
1.00k
    ASSERT_OK(session_.ExecuteQuery(
2145
1.00k
        yb::Format("insert into test_table (k1, k2, v) values ($0, $0, 'v-$0');", i)));
2146
1.00k
  }
2147
1
  LOG(INFO) << "Inserted " << kNumKeys << " rows.";
2148
2149
1
  std::atomic<int32_t> failed_cnt(0);
2150
1
  std::atomic<int32_t> read_cnt(0);
2151
1
  TestThreadHolder thread_holder;
2152
1
  thread_holder.AddThreadFunctor([this, &stop = thread_holder.stop_flag(), &read_cnt, &failed_cnt] {
2153
1
    SetFlagOnExit set_flag_on_exit(&stop);
2154
1
    auto session = CHECK_RESULT(driver_->CreateSession());
2155
1
    int32_t key = 0;
2156
1
    constexpr int32_t kSleepTimeMs = 100;
2157
2
    while (!stop) {
2158
1
      key = (key + 1) % kNumKeys;
2159
1
      SleepFor(MonoDelta::FromMilliseconds(kSleepTimeMs));
2160
1
      read_cnt++;
2161
1
      WARN_NOT_OK(
2162
1
          session_.ExecuteQuery(
2163
1
              yb::Format("select * from test_table where k1 = $0 and k2 = $0;", key)),
2164
1
          yb::Format("Select failed for key = $0. failed count = $0", key, ++failed_cnt));
2165
1
    }
2166
1
  });
2167
1
  LOG(INFO) << "Creating index";
2168
1
  auto session = ASSERT_RESULT(EstablishSession());
2169
1
  CassandraFuture create_index_future =
2170
1
      session.ExecuteGetFuture("create index test_table_index_by_v on test_table (v);");
2171
2172
1
  constexpr auto kNamespace = "test";
2173
1
  const YBTableName table_name(YQL_DATABASE_CQL, kNamespace, "test_table");
2174
1
  const YBTableName index_table_name(YQL_DATABASE_CQL, kNamespace, "test_table_index_by_v");
2175
2176
1
  LOG(INFO) << "Creating index 2";
2177
1
  auto session2 = ASSERT_RESULT(EstablishSession());
2178
2179
1
  IndexPermissions perm;
2180
0
  perm = ASSERT_RESULT(client_->WaitUntilIndexPermissionsAtLeast(
2181
0
      table_name, index_table_name, IndexPermissions::INDEX_PERM_DO_BACKFILL));
2182
0
  ASSERT_EQ(perm, IndexPermissions::INDEX_PERM_DO_BACKFILL);
2183
0
  LOG(INFO) << "Index table " << index_table_name.ToString()
2184
0
            << " created to INDEX_PERM_DO_BACKFILL";
2185
2186
  // Launch a 2nd create-index while the first create index is still backfilling. We do this
2187
  // from a different client session to prevent any client side serialization.
2188
0
  CassandraFuture create_index_future2 =
2189
0
      session2.ExecuteGetFuture("create index test_table_index_by_k2 on test_table (k2);");
2190
0
  const YBTableName index_table_name2(YQL_DATABASE_CQL, kNamespace, "test_table_index_by_k2");
2191
2192
0
  const auto kMargin = 2;  // Account for time "wasted" due to RPC backoff delays.
2193
0
  const auto kExpectedDuration = kMargin *
2194
0
      kTimeMultiplier * static_cast<size_t>(ceil(1.0 * kNumKeys / kMaxBackfillRatePerSec)) * 1s;
2195
2196
0
  ASSERT_OK(WaitForBackfillSafeTimeOn(cluster_.get(), table_name));
2197
0
  perm = ASSERT_RESULT(client_->WaitUntilIndexPermissionsAtLeast(
2198
0
      table_name, index_table_name, IndexPermissions::INDEX_PERM_READ_WRITE_AND_DELETE,
2199
0
      CoarseMonoClock::now() + kExpectedDuration, 50ms));
2200
0
  ASSERT_EQ(perm, IndexPermissions::INDEX_PERM_READ_WRITE_AND_DELETE);
2201
0
  LOG(INFO) << "Index table " << index_table_name.ToString()
2202
0
            << " created to INDEX_PERM_READ_WRITE_AND_DELETE";
2203
2204
0
  perm = ASSERT_RESULT(client_->GetIndexPermissions(table_name, index_table_name2));
2205
0
  if (perm != IndexPermissions::INDEX_PERM_READ_WRITE_AND_DELETE) {
2206
0
    ASSERT_OK(WaitForBackfillSafeTimeOn(cluster_.get(), table_name));
2207
0
    perm = ASSERT_RESULT(client_->WaitUntilIndexPermissionsAtLeast(
2208
0
        table_name, index_table_name2, IndexPermissions::INDEX_PERM_READ_WRITE_AND_DELETE,
2209
0
        CoarseMonoClock::now() + kExpectedDuration, 50ms));
2210
0
    ASSERT_EQ(perm, IndexPermissions::INDEX_PERM_READ_WRITE_AND_DELETE);
2211
0
  }
2212
0
  LOG(INFO) << "Index " << index_table_name2.ToString()
2213
0
            << " created to INDEX_PERM_READ_WRITE_AND_DELETE";
2214
2215
0
  LOG(INFO) << "Waited on the Create Index to finish. Status  = " << create_index_future.Wait();
2216
0
  LOG(INFO) << "Waited on the Create Index to finish. Status  = " << create_index_future2.Wait();
2217
2218
0
  thread_holder.Stop();
2219
0
  LOG(INFO) << "Total failed read operations " << failed_cnt << " out of " << read_cnt;
2220
0
  constexpr auto kFailurePctThreshold = 1;
2221
0
  ASSERT_LE(failed_cnt.load(), read_cnt.load() * 0.01 * kFailurePctThreshold);
2222
0
}
2223
2224
1
TEST_F_EX(CppCassandraDriverTest, TestDeleteAndCreateIndex, CppCassandraDriverTestIndex) {
2225
1
  std::atomic<bool> stop(false);
2226
1
  std::vector<std::thread> threads;
2227
2228
1
  typedef TestTable<int, int> MyTable;
2229
1
  typedef MyTable::ColumnsTuple ColumnsType;
2230
1
  MyTable table;
2231
1
  WARN_NOT_OK(
2232
1
      table.CreateTable(&session_, "test.key_value", {"key", "value"}, {"(key)"}, true, 60s),
2233
1
      "Request timed out");
2234
2235
1
  std::thread write_thread([this, table, &stop] {
2236
1
    CDSAttacher attacher;
2237
1
    auto session = CHECK_RESULT(driver_->CreateSession());
2238
1
    auto prepared = ASSERT_RESULT(table.PrepareInsert(&session, 10s));
2239
1
    int32_t key = 0;
2240
1
    constexpr int32_t kNumKeys = 10000;
2241
6.46k
    while (!stop) {
2242
6.46k
      key = (key + 1) % kNumKeys;
2243
6.46k
      auto statement = prepared.Bind();
2244
6.46k
      ColumnsType tuple(key, key);
2245
6.46k
      table.BindInsert(&statement, tuple);
2246
6.46k
      WARN_NOT_OK(session.Execute(statement), "Insert failed.");
2247
6.46k
    }
2248
1
  });
2249
2250
1
  CoarseBackoffWaiter waiter(CoarseMonoClock::Now() + 90s, CoarseMonoClock::Duration::max());
2251
1
  const int32_t kNumLoops = 10;
2252
1
  vector<CassandraFuture> create_futures;
2253
1
  create_futures.reserve(kNumLoops + 1);
2254
1
  constexpr int kDelayMs = 50;
2255
2256
1
  vector<unique_ptr<CppCassandraDriver>> drivers;
2257
1
  std::vector<std::string> hosts;
2258
4
  for (size_t i = 0; i < cluster_->num_tablet_servers(); ++i) {
2259
3
    hosts.push_back(cluster_->tablet_server(i)->bind_host());
2260
3
  }
2261
12
  for (size_t i = 0; i <= kNumLoops; i++) {
2262
11
    drivers.emplace_back(new CppCassandraDriver(
2263
11
        hosts, cluster_->tablet_server(0)->cql_rpc_port(), UsePartitionAwareRouting::kTrue));
2264
11
  }
2265
2266
12
  for (int i = 0; i <= kNumLoops; i++) {
2267
11
    const string curr_index_name = yb::Format("index_by_value_$0", i);
2268
11
    LOG(INFO) << "Creating index " << curr_index_name;
2269
11
    auto session = CHECK_RESULT(drivers[i]->CreateSession());
2270
11
    create_futures.emplace_back(
2271
11
        session.ExecuteGetFuture("create index " + curr_index_name + " on test.key_value (value)"));
2272
11
    SleepFor(MonoDelta::FromMilliseconds(kDelayMs));
2273
11
  }
2274
2275
12
  for (int i = 0; i <= kNumLoops; i++) {
2276
11
    const string curr_index_name = yb::Format("index_by_value_$0", i);
2277
11
    Status s = create_futures[i].Wait();
2278
11
    WARN_NOT_OK(s, "Create index failed/TimedOut");
2279
11
    EXPECT_TRUE(CreateTableSuccessOrTimedOut(s));
2280
11
  }
2281
2282
1
  vector<CassandraFuture> delete_futures;
2283
1
  delete_futures.reserve(kNumLoops);
2284
12
  for (int i = 0; i <= kNumLoops; i++) {
2285
11
    const string prev_index_name = yb::Format("index_by_value_$0", i - 1);
2286
11
    const string curr_index_name = yb::Format("index_by_value_$0", i);
2287
2288
11
    constexpr auto kNamespace = "test";
2289
11
    const YBTableName table_name(YQL_DATABASE_CQL, kNamespace, "key_value");
2290
11
    const YBTableName index_table_name(YQL_DATABASE_CQL, kNamespace, curr_index_name);
2291
11
    auto perm = ASSERT_RESULT(client_->WaitUntilIndexPermissionsAtLeast(
2292
11
        table_name,
2293
11
        index_table_name,
2294
11
        IndexPermissions::INDEX_PERM_READ_WRITE_AND_DELETE,
2295
11
        CoarseMonoClock::Now() + 60s /* deadline */,
2296
11
        CoarseDuration::max() /* max_wait */));
2297
11
    ASSERT_EQ(perm, IndexPermissions::INDEX_PERM_READ_WRITE_AND_DELETE);
2298
2299
11
    LOG(INFO) << "Waiting before deleting the index";
2300
11
    waiter.Wait();
2301
11
    LOG(INFO) << "Waiting done.";
2302
2303
    // Delete the existing index.
2304
11
    if (i > 0) {
2305
10
      auto session = CHECK_RESULT(drivers[i]->CreateSession());
2306
10
      delete_futures.emplace_back(session.ExecuteGetFuture("drop index test." + prev_index_name));
2307
10
      SleepFor(MonoDelta::FromMilliseconds(kDelayMs));
2308
10
    }
2309
11
  }
2310
2311
11
  for (int i = 0; i < kNumLoops; i++) {
2312
10
    const string curr_index_name = yb::Format("index_by_value_$0", i);
2313
10
    Status s = delete_futures[i].Wait();
2314
10
    WARN_NOT_OK(s, "Drop index failed/TimedOut");
2315
10
    EXPECT_TRUE(
2316
10
        s.ok() || string::npos != s.ToUserMessage().find("Timed out waiting for Table Creation"));
2317
2318
10
    constexpr auto kNamespace = "test";
2319
10
    const YBTableName table_name(YQL_DATABASE_CQL, kNamespace, "key_value");
2320
10
    const YBTableName index_table_name(YQL_DATABASE_CQL, kNamespace, curr_index_name);
2321
10
    auto res = client_->WaitUntilIndexPermissionsAtLeast(
2322
10
        table_name,
2323
10
        index_table_name,
2324
10
        IndexPermissions::INDEX_PERM_NOT_USED,
2325
10
        CoarseMonoClock::Now() + 60s /* deadline */,
2326
10
        CoarseDuration::max() /* max_wait */);
2327
10
    LOG(INFO) << "Got " << res << " for " << curr_index_name;
2328
10
    ASSERT_TRUE(!res.ok());
2329
10
    ASSERT_TRUE(res.status().IsNotFound());
2330
10
  }
2331
2332
1
  stop.store(true, std::memory_order_release);
2333
1
  write_thread.join();
2334
2335
1
  auto main_table_size = ASSERT_RESULT(GetTableSize(&session_, "test.key_value"));
2336
1
  auto index_table_size =
2337
1
      ASSERT_RESULT(GetTableSize(&session_, Format("test.index_by_value_$0", kNumLoops)));
2338
1
  EXPECT_EQ(main_table_size, index_table_size);
2339
1
}
2340
2341
1
TEST_F_EX(CppCassandraDriverTest, ConcurrentIndexUpdate, CppCassandraDriverTestIndex) {
2342
1
  constexpr int kLoops = RegularBuildVsSanitizers(20, 10);
2343
1
  constexpr int kKeys = 30;
2344
2345
1
  typedef TestTable<int, int> MyTable;
2346
1
  typedef MyTable::ColumnsTuple ColumnsType;
2347
1
  MyTable table;
2348
1
  ASSERT_OK(table.CreateTable(&session_, "test.key_value",
2349
1
                              {"key", "value"}, {"(key)"},
2350
1
                              true));
2351
2352
1
  LOG(INFO) << "Creating index";
2353
1
  ASSERT_OK(session_.ExecuteQuery("create index index_by_value on test.key_value (value)"));
2354
2355
1
  std::vector<CassandraFuture> futures;
2356
1
  int num_failures = 0;
2357
1
  auto prepared = ASSERT_RESULT(table.PrepareInsert(&session_, 10s));
2358
21
  for (int loop = 1; loop <= kLoops; ++loop) {
2359
620
    for (int key = 0; key != kKeys; ++key) {
2360
600
      auto statement = prepared.Bind();
2361
600
      ColumnsType tuple(key, loop * 1000 + key);
2362
600
      table.BindInsert(&statement, tuple);
2363
600
      futures.push_back(session_.ExecuteGetFuture(statement));
2364
600
    }
2365
20
  }
2366
2367
16
  for (auto it = futures.begin(); it != futures.end();) {
2368
615
    while (it != futures.end() && it->Ready()) {
2369
600
      auto status = it->Wait();
2370
600
      if (!status.ok()) {
2371
140
        LOG(WARNING) << "Failure: " << status;
2372
140
        num_failures++;
2373
140
      }
2374
600
      ++it;
2375
600
    }
2376
16
    for (;;) {
2377
16
      auto result = session_.ExecuteWithResult("select * from index_by_value");
2378
16
      if (!result.ok()) {
2379
1
        LOG(WARNING) << "Read failed: " << result.status();
2380
1
        continue;
2381
1
      }
2382
15
      auto iterator = result->CreateIterator();
2383
15
      std::unordered_map<int, int> table_content;
2384
464
      while (iterator.Next()) {
2385
449
        auto row = iterator.Row();
2386
449
        auto key = row.Value(0).As<int>();
2387
449
        auto value = row.Value(1).As<int>();
2388
449
        auto p = table_content.emplace(key, value);
2389
898
        ASSERT_TRUE(p.second)
2390
898
            << "Duplicate key: " << key << ", value: " << value
2391
898
            << ", existing value: " << p.first->second;
2392
449
      }
2393
15
      break;
2394
15
    }
2395
15
  }
2396
2397
1
  for (;;) {
2398
1
    constexpr int kBatchKey = 42;
2399
2400
1
    auto insert_status = session_.ExecuteQuery(Format(
2401
1
        "BEGIN TRANSACTION "
2402
1
        "INSERT INTO key_value (key, value) VALUES ($0, $1);"
2403
1
        "INSERT INTO key_value (key, value) VALUES ($0, $2);"
2404
1
        "END TRANSACTION;",
2405
1
        kBatchKey, -100, -200));
2406
1
    if (!insert_status.ok()) {
2407
0
      LOG(INFO) << "Insert failed: " << insert_status;
2408
0
      continue;
2409
0
    }
2410
2411
1
    for (;;) {
2412
1
      auto result = session_.ExecuteWithResult("select * from index_by_value");
2413
1
      if (!result.ok()) {
2414
0
        LOG(WARNING) << "Read failed: " << result.status();
2415
0
        continue;
2416
0
      }
2417
1
      auto iterator = result->CreateIterator();
2418
1
      int num_bad = 0;
2419
1
      int num_good = 0;
2420
32
      while (iterator.Next()) {
2421
31
        auto row = iterator.Row();
2422
31
        auto key = row.Value(0).As<int>();
2423
31
        auto value = row.Value(1).As<int>();
2424
31
        if (value < 0) {
2425
1
          LOG(INFO) << "Key: " << key << ", value: " << value;
2426
1
          ASSERT_EQ(key, kBatchKey);
2427
1
          if (value == -200) {
2428
1
            ++num_good;
2429
0
          } else {
2430
0
            ++num_bad;
2431
0
          }
2432
1
        }
2433
31
      }
2434
1
      ASSERT_EQ(num_good, 1);
2435
1
      ASSERT_EQ(num_bad, 0);
2436
1
      break;
2437
1
    }
2438
1
    break;
2439
1
  }
2440
1
}
2441
2442
YB_STRONGLY_TYPED_BOOL(RestartTS);
2443
2444
CQLMetrics TestPrepareWithTSRestart(const std::unique_ptr<ExternalMiniCluster>& cluster,
2445
                                    CassandraSession* session,
2446
                                    RestartTS restart_ts,
2447
4
                                    const string& local_keyspace = string()) {
2448
4
  CQLMetrics pre_metrics(*cluster);
2449
4
  typedef TestTable<cass_bool_t, cass_int32_t, string, cass_int32_t, string> MyTable;
2450
4
  MyTable table;
2451
4
  CHECK_OK(table.CreateTable(
2452
4
      session, "test.basic", {"b", "val", "key", "int_key", "str"}, {"key", "int_key"}));
2453
2454
4
  const MyTable::ColumnsTuple input(cass_true, 0xAABBCCDD, "key1test", 0xDEADBEAF, "mystr");
2455
4
  {
2456
4
    auto prepared = CHECK_RESULT(table.PrepareInsert(session, MonoDelta::kZero, local_keyspace));
2457
2458
4
    if (restart_ts) {
2459
2
      LOG(INFO) << "Restart TS...";
2460
2
      cluster->tablet_server(0)->Shutdown(); // Restart first TS.
2461
2
      CHECK_OK(cluster->tablet_server(0)->Restart());
2462
2
      LOG(INFO) << "Restart TS - DONE";
2463
2
    }
2464
2465
4
    auto statement = prepared.Bind();
2466
    // Prepared object can now be used to create new statement.
2467
4
    table.Print("Execute prepared INSERT with INPUT", input);
2468
4
    table.BindInsert(&statement, input);
2469
4
    CHECK_OK(session->Execute(statement));
2470
4
  }
2471
2472
4
  MyTable::ColumnsTuple output(cass_false, 0, "key1test", 0xDEADBEAF, "");
2473
4
  table.SelectOneRow(session, &output);
2474
4
  table.Print("RESULT OUTPUT", output);
2475
4
  LOG(INFO) << "Checking selected values...";
2476
4
  ExpectEqualTuples(input, output);
2477
2478
4
  SleepFor(MonoDelta::FromSeconds(2)); // Let the metrics to be updated.
2479
4
  const auto metrics = CQLMetrics(*cluster) - pre_metrics;
2480
4
  LOG(INFO) << "DELTA Metrics: " << metrics;
2481
4
  EXPECT_EQ(1, metrics.get("insert_count"));
2482
4
  return CQLMetrics(metrics);
2483
4
}
2484
2485
1
TEST_F(CppCassandraDriverTest, TestPrepare) {
2486
1
  CQLMetrics metrics = TestPrepareWithTSRestart(cluster_, &session_, RestartTS::kFalse);
2487
1
  EXPECT_EQ(2, metrics.get("use_count"));
2488
1
}
2489
2490
1
TEST_F(CppCassandraDriverTest, TestPrepareWithLocalKeyspace) {
2491
1
  CQLMetrics metrics = TestPrepareWithTSRestart(
2492
1
      cluster_, &session_, RestartTS::kFalse, "ANY_KEYSPACE");
2493
1
  EXPECT_EQ(2, metrics.get("use_count"));
2494
1
}
2495
2496
class CppCassandraDriverTestWithoutUse : public CppCassandraDriverTest {
2497
 protected:
2498
2
  CHECKED_STATUS SetupSession(CassandraSession* session) override {
2499
2
    LOG(INFO) << "Skipping 'USE test'";
2500
2
    return CreateDefaultKeyspace(session);
2501
2
  }
2502
};
2503
2504
1
TEST_F_EX(CppCassandraDriverTest, TestPrepareWithRestart, CppCassandraDriverTestWithoutUse) {
2505
1
  CQLMetrics metrics = TestPrepareWithTSRestart(cluster_, &session_, RestartTS::kTrue);
2506
1
  EXPECT_EQ(0, metrics.get("use_count"));
2507
1
}
2508
2509
TEST_F_EX(CppCassandraDriverTest,
2510
          TestPrepareWithRestartAndLocalKeyspace,
2511
1
          CppCassandraDriverTestWithoutUse) {
2512
1
  CQLMetrics metrics = TestPrepareWithTSRestart(
2513
1
      cluster_, &session_, RestartTS::kTrue, "ANY_KEYSPACE");
2514
1
  EXPECT_EQ(0, metrics.get("use_count"));
2515
1
}
2516
2517
template <typename... ColumnsTypes>
2518
void TestTokenForTypes(
2519
    CassandraSession* session,
2520
    const vector<string>& columns,
2521
    const vector<string>& keys,
2522
    const tuple<ColumnsTypes...>& input_data,
2523
    const tuple<ColumnsTypes...>& input_keys,
2524
    const tuple<ColumnsTypes...>& input_empty,
2525
7
    int64_t exp_token = 0) {
2526
7
  typedef TestTable<ColumnsTypes...> MyTable;
2527
7
  typedef typename MyTable::ColumnsTuple ColumnsTuple;
2528
2529
7
  MyTable table;
2530
7
  ASSERT_OK(table.CreateTable(session, "test.basic", columns, keys));
2531
2532
7
  auto prepared = ASSERT_RESULT(table.PrepareInsert(session));
2533
7
  auto statement = prepared.Bind();
2534
2535
7
  const ColumnsTuple input(input_data);
2536
7
  table.Print("Execute prepared INSERT with INPUT", input);
2537
7
  table.BindInsert(&statement, input);
2538
2539
7
  int64_t token = 0;
2540
7
  bool token_available = cass_partition_aware_policy_get_yb_hash_code(
2541
7
      statement.get(), &token);
2542
7
  LOG(INFO) << "Got token: " << (token_available ? "OK" : "ERROR") << " token=" << token
2543
7
            << " (0x" << std::hex << token << ")";
2544
7
  ASSERT_TRUE(token_available);
2545
2546
7
  if (exp_token > 0) {
2547
0
    ASSERT_EQ(exp_token, token);
2548
0
  }
2549
2550
7
  ASSERT_OK(session->Execute(statement));
2551
2552
7
  ColumnsTuple output_by_key(input_keys);
2553
7
  table.SelectOneRow(session, &output_by_key);
2554
7
  table.Print("RESULT OUTPUT", output_by_key);
2555
7
  LOG(INFO) << "Checking selected values...";
2556
7
  ExpectEqualTuples(input, output_by_key);
2557
2558
4
  ColumnsTuple output = ASSERT_RESULT(table.SelectByToken(session, token));
2559
4
  table.Print("RESULT OUTPUT", output);
2560
4
  LOG(INFO) << "Checking selected by TOKEN values...";
2561
4
  ExpectEqualTuples(input, output);
2562
4
}
_ZN2yb17TestTokenForTypesIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEdEEEvPNS_16CassandraSessionERKNS1_6vectorIS7_NS5_IS7_EEEESE_RKNS1_5tupleIJDpT_EEESK_SK_x
Line
Count
Source
2525
1
    int64_t exp_token = 0) {
2526
1
  typedef TestTable<ColumnsTypes...> MyTable;
2527
1
  typedef typename MyTable::ColumnsTuple ColumnsTuple;
2528
2529
1
  MyTable table;
2530
1
  ASSERT_OK(table.CreateTable(session, "test.basic", columns, keys));
2531
2532
1
  auto prepared = ASSERT_RESULT(table.PrepareInsert(session));
2533
1
  auto statement = prepared.Bind();
2534
2535
1
  const ColumnsTuple input(input_data);
2536
1
  table.Print("Execute prepared INSERT with INPUT", input);
2537
1
  table.BindInsert(&statement, input);
2538
2539
1
  int64_t token = 0;
2540
1
  bool token_available = cass_partition_aware_policy_get_yb_hash_code(
2541
1
      statement.get(), &token);
2542
1
  LOG(INFO) << "Got token: " << (token_available ? "OK" : "ERROR") << " token=" << token
2543
1
            << " (0x" << std::hex << token << ")";
2544
1
  ASSERT_TRUE(token_available);
2545
2546
1
  if (exp_token > 0) {
2547
0
    ASSERT_EQ(exp_token, token);
2548
0
  }
2549
2550
1
  ASSERT_OK(session->Execute(statement));
2551
2552
1
  ColumnsTuple output_by_key(input_keys);
2553
1
  table.SelectOneRow(session, &output_by_key);
2554
1
  table.Print("RESULT OUTPUT", output_by_key);
2555
1
  LOG(INFO) << "Checking selected values...";
2556
1
  ExpectEqualTuples(input, output_by_key);
2557
2558
1
  ColumnsTuple output = ASSERT_RESULT(table.SelectByToken(session, token));
2559
1
  table.Print("RESULT OUTPUT", output);
2560
1
  LOG(INFO) << "Checking selected by TOKEN values...";
2561
1
  ExpectEqualTuples(input, output);
2562
1
}
_ZN2yb17TestTokenForTypesIJidEEEvPNS_16CassandraSessionERKNSt3__16vectorINS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEENS8_ISA_EEEESE_RKNS3_5tupleIJDpT_EEESK_SK_x
Line
Count
Source
2525
1
    int64_t exp_token = 0) {
2526
1
  typedef TestTable<ColumnsTypes...> MyTable;
2527
1
  typedef typename MyTable::ColumnsTuple ColumnsTuple;
2528
2529
1
  MyTable table;
2530
1
  ASSERT_OK(table.CreateTable(session, "test.basic", columns, keys));
2531
2532
1
  auto prepared = ASSERT_RESULT(table.PrepareInsert(session));
2533
1
  auto statement = prepared.Bind();
2534
2535
1
  const ColumnsTuple input(input_data);
2536
1
  table.Print("Execute prepared INSERT with INPUT", input);
2537
1
  table.BindInsert(&statement, input);
2538
2539
1
  int64_t token = 0;
2540
1
  bool token_available = cass_partition_aware_policy_get_yb_hash_code(
2541
1
      statement.get(), &token);
2542
1
  LOG(INFO) << "Got token: " << (token_available ? "OK" : "ERROR") << " token=" << token
2543
1
            << " (0x" << std::hex << token << ")";
2544
1
  ASSERT_TRUE(token_available);
2545
2546
1
  if (exp_token > 0) {
2547
0
    ASSERT_EQ(exp_token, token);
2548
0
  }
2549
2550
1
  ASSERT_OK(session->Execute(statement));
2551
2552
1
  ColumnsTuple output_by_key(input_keys);
2553
1
  table.SelectOneRow(session, &output_by_key);
2554
1
  table.Print("RESULT OUTPUT", output_by_key);
2555
1
  LOG(INFO) << "Checking selected values...";
2556
1
  ExpectEqualTuples(input, output_by_key);
2557
2558
1
  ColumnsTuple output = ASSERT_RESULT(table.SelectByToken(session, token));
2559
1
  table.Print("RESULT OUTPUT", output);
2560
1
  LOG(INFO) << "Checking selected by TOKEN values...";
2561
1
  ExpectEqualTuples(input, output);
2562
1
}
_ZN2yb17TestTokenForTypesIJxdEEEvPNS_16CassandraSessionERKNSt3__16vectorINS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEENS8_ISA_EEEESE_RKNS3_5tupleIJDpT_EEESK_SK_x
Line
Count
Source
2525
1
    int64_t exp_token = 0) {
2526
1
  typedef TestTable<ColumnsTypes...> MyTable;
2527
1
  typedef typename MyTable::ColumnsTuple ColumnsTuple;
2528
2529
1
  MyTable table;
2530
1
  ASSERT_OK(table.CreateTable(session, "test.basic", columns, keys));
2531
2532
1
  auto prepared = ASSERT_RESULT(table.PrepareInsert(session));
2533
1
  auto statement = prepared.Bind();
2534
2535
1
  const ColumnsTuple input(input_data);
2536
1
  table.Print("Execute prepared INSERT with INPUT", input);
2537
1
  table.BindInsert(&statement, input);
2538
2539
1
  int64_t token = 0;
2540
1
  bool token_available = cass_partition_aware_policy_get_yb_hash_code(
2541
1
      statement.get(), &token);
2542
1
  LOG(INFO) << "Got token: " << (token_available ? "OK" : "ERROR") << " token=" << token
2543
1
            << " (0x" << std::hex << token << ")";
2544
1
  ASSERT_TRUE(token_available);
2545
2546
1
  if (exp_token > 0) {
2547
0
    ASSERT_EQ(exp_token, token);
2548
0
  }
2549
2550
1
  ASSERT_OK(session->Execute(statement));
2551
2552
1
  ColumnsTuple output_by_key(input_keys);
2553
1
  table.SelectOneRow(session, &output_by_key);
2554
1
  table.Print("RESULT OUTPUT", output_by_key);
2555
1
  LOG(INFO) << "Checking selected values...";
2556
1
  ExpectEqualTuples(input, output_by_key);
2557
2558
0
  ColumnsTuple output = ASSERT_RESULT(table.SelectByToken(session, token));
2559
0
  table.Print("RESULT OUTPUT", output);
2560
0
  LOG(INFO) << "Checking selected by TOKEN values...";
2561
0
  ExpectEqualTuples(input, output);
2562
0
}
_ZN2yb17TestTokenForTypesIJ11cass_bool_tdEEEvPNS_16CassandraSessionERKNSt3__16vectorINS4_12basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEENS9_ISB_EEEESF_RKNS4_5tupleIJDpT_EEESL_SL_x
Line
Count
Source
2525
1
    int64_t exp_token = 0) {
2526
1
  typedef TestTable<ColumnsTypes...> MyTable;
2527
1
  typedef typename MyTable::ColumnsTuple ColumnsTuple;
2528
2529
1
  MyTable table;
2530
1
  ASSERT_OK(table.CreateTable(session, "test.basic", columns, keys));
2531
2532
1
  auto prepared = ASSERT_RESULT(table.PrepareInsert(session));
2533
1
  auto statement = prepared.Bind();
2534
2535
1
  const ColumnsTuple input(input_data);
2536
1
  table.Print("Execute prepared INSERT with INPUT", input);
2537
1
  table.BindInsert(&statement, input);
2538
2539
1
  int64_t token = 0;
2540
1
  bool token_available = cass_partition_aware_policy_get_yb_hash_code(
2541
1
      statement.get(), &token);
2542
1
  LOG(INFO) << "Got token: " << (token_available ? "OK" : "ERROR") << " token=" << token
2543
1
            << " (0x" << std::hex << token << ")";
2544
1
  ASSERT_TRUE(token_available);
2545
2546
1
  if (exp_token > 0) {
2547
0
    ASSERT_EQ(exp_token, token);
2548
0
  }
2549
2550
1
  ASSERT_OK(session->Execute(statement));
2551
2552
1
  ColumnsTuple output_by_key(input_keys);
2553
1
  table.SelectOneRow(session, &output_by_key);
2554
1
  table.Print("RESULT OUTPUT", output_by_key);
2555
1
  LOG(INFO) << "Checking selected values...";
2556
1
  ExpectEqualTuples(input, output_by_key);
2557
2558
1
  ColumnsTuple output = ASSERT_RESULT(table.SelectByToken(session, token));
2559
1
  table.Print("RESULT OUTPUT", output);
2560
1
  LOG(INFO) << "Checking selected by TOKEN values...";
2561
1
  ExpectEqualTuples(input, output);
2562
1
}
_ZN2yb17TestTokenForTypesIJfdEEEvPNS_16CassandraSessionERKNSt3__16vectorINS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEENS8_ISA_EEEESE_RKNS3_5tupleIJDpT_EEESK_SK_x
Line
Count
Source
2525
1
    int64_t exp_token = 0) {
2526
1
  typedef TestTable<ColumnsTypes...> MyTable;
2527
1
  typedef typename MyTable::ColumnsTuple ColumnsTuple;
2528
2529
1
  MyTable table;
2530
1
  ASSERT_OK(table.CreateTable(session, "test.basic", columns, keys));
2531
2532
1
  auto prepared = ASSERT_RESULT(table.PrepareInsert(session));
2533
1
  auto statement = prepared.Bind();
2534
2535
1
  const ColumnsTuple input(input_data);
2536
1
  table.Print("Execute prepared INSERT with INPUT", input);
2537
1
  table.BindInsert(&statement, input);
2538
2539
1
  int64_t token = 0;
2540
1
  bool token_available = cass_partition_aware_policy_get_yb_hash_code(
2541
1
      statement.get(), &token);
2542
1
  LOG(INFO) << "Got token: " << (token_available ? "OK" : "ERROR") << " token=" << token
2543
1
            << " (0x" << std::hex << token << ")";
2544
1
  ASSERT_TRUE(token_available);
2545
2546
1
  if (exp_token > 0) {
2547
0
    ASSERT_EQ(exp_token, token);
2548
0
  }
2549
2550
1
  ASSERT_OK(session->Execute(statement));
2551
2552
1
  ColumnsTuple output_by_key(input_keys);
2553
1
  table.SelectOneRow(session, &output_by_key);
2554
1
  table.Print("RESULT OUTPUT", output_by_key);
2555
1
  LOG(INFO) << "Checking selected values...";
2556
1
  ExpectEqualTuples(input, output_by_key);
2557
2558
1
  ColumnsTuple output = ASSERT_RESULT(table.SelectByToken(session, token));
2559
1
  table.Print("RESULT OUTPUT", output);
2560
1
  LOG(INFO) << "Checking selected by TOKEN values...";
2561
1
  ExpectEqualTuples(input, output);
2562
1
}
_ZN2yb17TestTokenForTypesIJddEEEvPNS_16CassandraSessionERKNSt3__16vectorINS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEENS8_ISA_EEEESE_RKNS3_5tupleIJDpT_EEESK_SK_x
Line
Count
Source
2525
1
    int64_t exp_token = 0) {
2526
1
  typedef TestTable<ColumnsTypes...> MyTable;
2527
1
  typedef typename MyTable::ColumnsTuple ColumnsTuple;
2528
2529
1
  MyTable table;
2530
1
  ASSERT_OK(table.CreateTable(session, "test.basic", columns, keys));
2531
2532
1
  auto prepared = ASSERT_RESULT(table.PrepareInsert(session));
2533
1
  auto statement = prepared.Bind();
2534
2535
1
  const ColumnsTuple input(input_data);
2536
1
  table.Print("Execute prepared INSERT with INPUT", input);
2537
1
  table.BindInsert(&statement, input);
2538
2539
1
  int64_t token = 0;
2540
1
  bool token_available = cass_partition_aware_policy_get_yb_hash_code(
2541
1
      statement.get(), &token);
2542
1
  LOG(INFO) << "Got token: " << (token_available ? "OK" : "ERROR") << " token=" << token
2543
1
            << " (0x" << std::hex << token << ")";
2544
1
  ASSERT_TRUE(token_available);
2545
2546
1
  if (exp_token > 0) {
2547
0
    ASSERT_EQ(exp_token, token);
2548
0
  }
2549
2550
1
  ASSERT_OK(session->Execute(statement));
2551
2552
1
  ColumnsTuple output_by_key(input_keys);
2553
1
  table.SelectOneRow(session, &output_by_key);
2554
1
  table.Print("RESULT OUTPUT", output_by_key);
2555
1
  LOG(INFO) << "Checking selected values...";
2556
1
  ExpectEqualTuples(input, output_by_key);
2557
2558
0
  ColumnsTuple output = ASSERT_RESULT(table.SelectByToken(session, token));
2559
0
  table.Print("RESULT OUTPUT", output);
2560
0
  LOG(INFO) << "Checking selected by TOKEN values...";
2561
0
  ExpectEqualTuples(input, output);
2562
0
}
_ZN2yb17TestTokenForTypesIJNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEidEEEvPNS_16CassandraSessionERKNS1_6vectorIS7_NS5_IS7_EEEESE_RKNS1_5tupleIJDpT_EEESK_SK_x
Line
Count
Source
2525
1
    int64_t exp_token = 0) {
2526
1
  typedef TestTable<ColumnsTypes...> MyTable;
2527
1
  typedef typename MyTable::ColumnsTuple ColumnsTuple;
2528
2529
1
  MyTable table;
2530
1
  ASSERT_OK(table.CreateTable(session, "test.basic", columns, keys));
2531
2532
1
  auto prepared = ASSERT_RESULT(table.PrepareInsert(session));
2533
1
  auto statement = prepared.Bind();
2534
2535
1
  const ColumnsTuple input(input_data);
2536
1
  table.Print("Execute prepared INSERT with INPUT", input);
2537
1
  table.BindInsert(&statement, input);
2538
2539
1
  int64_t token = 0;
2540
1
  bool token_available = cass_partition_aware_policy_get_yb_hash_code(
2541
1
      statement.get(), &token);
2542
1
  LOG(INFO) << "Got token: " << (token_available ? "OK" : "ERROR") << " token=" << token
2543
1
            << " (0x" << std::hex << token << ")";
2544
1
  ASSERT_TRUE(token_available);
2545
2546
1
  if (exp_token > 0) {
2547
0
    ASSERT_EQ(exp_token, token);
2548
0
  }
2549
2550
1
  ASSERT_OK(session->Execute(statement));
2551
2552
1
  ColumnsTuple output_by_key(input_keys);
2553
1
  table.SelectOneRow(session, &output_by_key);
2554
1
  table.Print("RESULT OUTPUT", output_by_key);
2555
1
  LOG(INFO) << "Checking selected values...";
2556
1
  ExpectEqualTuples(input, output_by_key);
2557
2558
0
  ColumnsTuple output = ASSERT_RESULT(table.SelectByToken(session, token));
2559
0
  table.Print("RESULT OUTPUT", output);
2560
0
  LOG(INFO) << "Checking selected by TOKEN values...";
2561
0
  ExpectEqualTuples(input, output);
2562
0
}
2563
2564
template <typename KeyType>
2565
void TestTokenForType(
2566
6
    CassandraSession* session, const KeyType& key, int64_t exp_token = 0) {
2567
6
  typedef tuple<KeyType, cass_double_t> Tuple;
2568
6
  TestTokenForTypes(session,
2569
6
                    {"key", "value"}, // column names
2570
6
                    {"(key)"}, // key names
2571
6
                    Tuple(key, 0.56789), // data
2572
6
                    Tuple(key, 0.), // only keys
2573
6
                    Tuple((KeyType()), 0.), // empty
2574
6
                    exp_token);
2575
6
}
_ZN2yb16TestTokenForTypeINSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEEEvPNS_16CassandraSessionERKT_x
Line
Count
Source
2566
1
    CassandraSession* session, const KeyType& key, int64_t exp_token = 0) {
2567
1
  typedef tuple<KeyType, cass_double_t> Tuple;
2568
1
  TestTokenForTypes(session,
2569
1
                    {"key", "value"}, // column names
2570
1
                    {"(key)"}, // key names
2571
1
                    Tuple(key, 0.56789), // data
2572
1
                    Tuple(key, 0.), // only keys
2573
1
                    Tuple((KeyType()), 0.), // empty
2574
1
                    exp_token);
2575
1
}
_ZN2yb16TestTokenForTypeIiEEvPNS_16CassandraSessionERKT_x
Line
Count
Source
2566
1
    CassandraSession* session, const KeyType& key, int64_t exp_token = 0) {
2567
1
  typedef tuple<KeyType, cass_double_t> Tuple;
2568
1
  TestTokenForTypes(session,
2569
1
                    {"key", "value"}, // column names
2570
1
                    {"(key)"}, // key names
2571
1
                    Tuple(key, 0.56789), // data
2572
1
                    Tuple(key, 0.), // only keys
2573
1
                    Tuple((KeyType()), 0.), // empty
2574
1
                    exp_token);
2575
1
}
_ZN2yb16TestTokenForTypeIxEEvPNS_16CassandraSessionERKT_x
Line
Count
Source
2566
1
    CassandraSession* session, const KeyType& key, int64_t exp_token = 0) {
2567
1
  typedef tuple<KeyType, cass_double_t> Tuple;
2568
1
  TestTokenForTypes(session,
2569
1
                    {"key", "value"}, // column names
2570
1
                    {"(key)"}, // key names
2571
1
                    Tuple(key, 0.56789), // data
2572
1
                    Tuple(key, 0.), // only keys
2573
1
                    Tuple((KeyType()), 0.), // empty
2574
1
                    exp_token);
2575
1
}
_ZN2yb16TestTokenForTypeI11cass_bool_tEEvPNS_16CassandraSessionERKT_x
Line
Count
Source
2566
1
    CassandraSession* session, const KeyType& key, int64_t exp_token = 0) {
2567
1
  typedef tuple<KeyType, cass_double_t> Tuple;
2568
1
  TestTokenForTypes(session,
2569
1
                    {"key", "value"}, // column names
2570
1
                    {"(key)"}, // key names
2571
1
                    Tuple(key, 0.56789), // data
2572
1
                    Tuple(key, 0.), // only keys
2573
1
                    Tuple((KeyType()), 0.), // empty
2574
1
                    exp_token);
2575
1
}
_ZN2yb16TestTokenForTypeIfEEvPNS_16CassandraSessionERKT_x
Line
Count
Source
2566
1
    CassandraSession* session, const KeyType& key, int64_t exp_token = 0) {
2567
1
  typedef tuple<KeyType, cass_double_t> Tuple;
2568
1
  TestTokenForTypes(session,
2569
1
                    {"key", "value"}, // column names
2570
1
                    {"(key)"}, // key names
2571
1
                    Tuple(key, 0.56789), // data
2572
1
                    Tuple(key, 0.), // only keys
2573
1
                    Tuple((KeyType()), 0.), // empty
2574
1
                    exp_token);
2575
1
}
_ZN2yb16TestTokenForTypeIdEEvPNS_16CassandraSessionERKT_x
Line
Count
Source
2566
1
    CassandraSession* session, const KeyType& key, int64_t exp_token = 0) {
2567
1
  typedef tuple<KeyType, cass_double_t> Tuple;
2568
1
  TestTokenForTypes(session,
2569
1
                    {"key", "value"}, // column names
2570
1
                    {"(key)"}, // key names
2571
1
                    Tuple(key, 0.56789), // data
2572
1
                    Tuple(key, 0.), // only keys
2573
1
                    Tuple((KeyType()), 0.), // empty
2574
1
                    exp_token);
2575
1
}
2576
2577
1
TEST_F(CppCassandraDriverTest, TestTokenForText) {
2578
1
  TestTokenForType<string>(&session_, "test", 0x8753000000000000);
2579
1
}
2580
2581
1
TEST_F(CppCassandraDriverTest, TestTokenForInt) {
2582
1
  TestTokenForType<int32_t>(&session_, 0xDEADBEAF);
2583
1
}
2584
2585
1
TEST_F(CppCassandraDriverTest, TestTokenForBigInt) {
2586
1
  TestTokenForType<int64_t>(&session_, 0xDEADBEAFDEADBEAFULL);
2587
1
}
2588
2589
1
TEST_F(CppCassandraDriverTest, TestTokenForBoolean) {
2590
1
  TestTokenForType<cass_bool_t>(&session_, cass_true);
2591
1
}
2592
2593
1
TEST_F(CppCassandraDriverTest, TestTokenForFloat) {
2594
1
  TestTokenForType<cass_float_t>(&session_, 0.123f);
2595
1
}
2596
2597
1
TEST_F(CppCassandraDriverTest, TestTokenForDouble) {
2598
1
  TestTokenForType<cass_double_t>(&session_, 0.12345);
2599
1
}
2600
2601
1
TEST_F(CppCassandraDriverTest, TestTokenForDoubleKey) {
2602
1
  typedef tuple<string, cass_int32_t, cass_double_t> Tuple;
2603
1
  TestTokenForTypes(&session_,
2604
1
                    {"key", "int_key", "value"}, // column names
2605
1
                    {"(key", "int_key)"}, // key names
2606
1
                    Tuple("test", 0xDEADBEAF, 0.123), // data
2607
1
                    Tuple("test", 0xDEADBEAF, 0.), // only keys
2608
1
                    Tuple("", 0, 0.)); // empty
2609
1
}
2610
2611
//------------------------------------------------------------------------------
2612
class CppCassandraDriverTestNoPartitionBgRefresh : public CppCassandraDriverTest {
2613
 protected:
2614
2
  std::vector<std::string> ExtraMasterFlags() override {
2615
2
    auto flags = CppCassandraDriverTest::ExtraMasterFlags();
2616
2
    flags.push_back("--partitions_vtable_cache_refresh_secs=0");
2617
2
    return flags;
2618
2
  }
2619
};
2620
2621
1
TEST_F_EX(CppCassandraDriverTest, TestInsertLocality, CppCassandraDriverTestNoPartitionBgRefresh) {
2622
1
  typedef TestTable<string, string> MyTable;
2623
1
  typedef typename MyTable::ColumnsTuple ColumnsTuple;
2624
2625
1
  MyTable table;
2626
1
  ASSERT_OK(table.CreateTable(&session_, "test.basic", {"id", "data"}, {"(id)"}));
2627
2628
1
  LOG(INFO) << "Wait 5 sec to refresh metadata in driver by time";
2629
1
  SleepFor(MonoDelta::FromMicroseconds(5*1000000));
2630
2631
1
  IOMetrics pre_metrics(*cluster_);
2632
2633
1
  auto prepared = ASSERT_RESULT(table.PrepareInsert(&session_));
2634
1
  const int total_keys = 100;
2635
1
  ColumnsTuple input("", "test_value");
2636
2637
101
  for (int i = 0; i < total_keys; ++i) {
2638
100
    get<0>(input) = Substitute("key_$0", i);
2639
2640
    // Prepared object can now be used to create new statement.
2641
100
    auto statement = prepared.Bind();
2642
100
    table.BindInsert(&statement, input);
2643
100
    ASSERT_OK(session_.Execute(statement));
2644
100
  }
2645
2646
1
  IOMetrics post_metrics(*cluster_);
2647
1
  const auto delta_metrics = post_metrics - pre_metrics;
2648
1
  LOG(INFO) << "DELTA Metrics: " << delta_metrics;
2649
2650
  // Expect minimum 70% of all requests to be local.
2651
1
  ASSERT_GT(delta_metrics.get("local_write")*10, total_keys*7);
2652
1
}
2653
2654
class CppCassandraDriverLowSoftLimitTest : public CppCassandraDriverTest {
2655
 public:
2656
1
  std::vector<std::string> ExtraTServerFlags() override {
2657
1
    return {"--memory_limit_soft_percentage=0"s,
2658
1
            "--throttle_cql_calls_on_soft_memory_limit=false"s};
2659
1
  }
2660
};
2661
2662
TEST_F_EX(CppCassandraDriverTest, BatchWriteDuringSoftMemoryLimit,
2663
1
          CppCassandraDriverLowSoftLimitTest) {
2664
1
  FLAGS_external_mini_cluster_max_log_bytes = 512_MB;
2665
2666
1
  constexpr int kBatchSize = 500;
2667
1
  constexpr int kWriters = 4;
2668
1
  constexpr int kNumMetrics = 5;
2669
2670
1
  typedef TestTable<std::string, int64_t, std::string> MyTable;
2671
1
  typedef MyTable::ColumnsTuple ColumnsType;
2672
1
  MyTable table;
2673
1
  ASSERT_OK(table.CreateTable(
2674
1
      &session_, "test.batch_ts_metrics_raw", {"metric_id", "ts", "value"},
2675
1
      {"(metric_id, ts)"}));
2676
2677
1
  TestThreadHolder thread_holder;
2678
1
  std::array<std::atomic<int>, kNumMetrics> metric_ts;
2679
1
  std::atomic<int> total_writes(0);
2680
6
  for (int i = 0; i != kNumMetrics; ++i) {
2681
5
    metric_ts[i].store(0);
2682
5
  }
2683
2684
5
  for (int i = 0; i != kWriters; ++i) {
2685
4
    thread_holder.AddThreadFunctor(
2686
4
        [this, &stop = thread_holder.stop_flag(), &table, &metric_ts, &total_writes] {
2687
4
      SetFlagOnExit set_flag_on_exit(&stop);
2688
3
      auto session = ASSERT_RESULT(EstablishSession());
2689
3
      std::vector<CassandraFuture> futures;
2690
3
      while (!stop.load()) {
2691
0
        CassandraBatch batch(CassBatchType::CASS_BATCH_TYPE_LOGGED);
2692
0
        auto prepared = table.PrepareInsert(&session);
2693
0
        if (!prepared.ok()) {
2694
          // Prepare could be failed because cluster has heavy load.
2695
          // It is ok to just retry in this case, because we expect total number of writes.
2696
0
          continue;
2697
0
        }
2698
0
        int metric_idx = RandomUniformInt(1, kNumMetrics);
2699
0
        auto metric = "metric_" + std::to_string(metric_idx);
2700
0
        int ts = metric_ts[metric_idx - 1].fetch_add(kBatchSize);
2701
0
        for (int i = 0; i != kBatchSize; ++i) {
2702
0
          ColumnsType tuple(metric, ts, "value_" + std::to_string(ts));
2703
0
          auto statement = prepared->Bind();
2704
0
          table.BindInsert(&statement, tuple);
2705
0
          batch.Add(&statement);
2706
0
          ++ts;
2707
0
        }
2708
0
        futures.push_back(session.SubmitBatch(batch));
2709
0
        ++total_writes;
2710
0
      }
2711
3
    });
2712
4
  }
2713
2714
1
  thread_holder.WaitAndStop(30s);
2715
1
  auto total_writes_value = total_writes.load();
2716
1
  LOG(INFO) << "Total writes: " << total_writes_value;
2717
1
#ifndef NDEBUG
2718
1
  auto min_total_writes = RegularBuildVsSanitizers(750, 50);
2719
#else
2720
  auto min_total_writes = 1500;
2721
#endif
2722
1
  ASSERT_GE(total_writes_value, min_total_writes);
2723
1
}
2724
2725
class CppCassandraDriverBackpressureTest : public CppCassandraDriverTest {
2726
 public:
2727
1
  std::vector<std::string> ExtraTServerFlags() override {
2728
1
    return {"--tablet_server_svc_queue_length=10"s, "--max_time_in_queue_ms=-1"s};
2729
1
  }
2730
};
2731
2732
1
TEST_F_EX(CppCassandraDriverTest, LocalCallBackpressure, CppCassandraDriverBackpressureTest) {
2733
1
  constexpr int kBatchSize = 30;
2734
1
  constexpr int kNumBatches = 300;
2735
2736
1
  typedef TestTable<int64_t, int64_t> MyTable;
2737
1
  typedef MyTable::ColumnsTuple ColumnsType;
2738
1
  MyTable table;
2739
1
  ASSERT_OK(table.CreateTable(&session_, "test.key_value", {"key", "value"}, {"(key)"}));
2740
2741
1
  std::vector<CassandraFuture> futures;
2742
2743
301
  for (int batch_idx = 0; batch_idx != kNumBatches; ++batch_idx) {
2744
300
    CassandraBatch batch(CassBatchType::CASS_BATCH_TYPE_LOGGED);
2745
300
    auto prepared = table.PrepareInsert(&session_);
2746
300
    if (!prepared.ok()) {
2747
      // Prepare could be failed because cluster has heavy load.
2748
      // It is ok to just retry in this case, because we check that process did not crash.
2749
0
      continue;
2750
0
    }
2751
9.30k
    for (int i = 0; i != kBatchSize; ++i) {
2752
9.00k
      ColumnsType tuple(batch_idx * kBatchSize + i, -1);
2753
9.00k
      auto statement = prepared->Bind();
2754
9.00k
      table.BindInsert(&statement, tuple);
2755
9.00k
      batch.Add(&statement);
2756
9.00k
    }
2757
300
    futures.push_back(session_.SubmitBatch(batch));
2758
300
  }
2759
2760
300
  for (auto& future : futures) {
2761
300
    WARN_NOT_OK(future.Wait(), "Write failed");
2762
300
  }
2763
1
}
2764
2765
class CppCassandraDriverTransactionalWriteTest : public CppCassandraDriverTest {
2766
 public:
2767
1
  std::vector<std::string> ExtraTServerFlags() override {
2768
1
    return {"--TEST_transaction_inject_flushed_delay_ms=10"s};
2769
1
  }
2770
};
2771
2772
1
TEST_F_EX(CppCassandraDriverTest, TransactionalWrite, CppCassandraDriverTransactionalWriteTest) {
2773
1
  const std::string kTableName = "test.key_value";
2774
1
  typedef TestTable<int32_t, int32_t> MyTable;
2775
1
  MyTable table;
2776
1
  ASSERT_OK(table.CreateTable(
2777
1
      &session_, kTableName, {"key", "value"}, {"(key)"}, true /* transactional */));
2778
2779
1
  constexpr int kIterations = 20;
2780
1
  auto prepared = ASSERT_RESULT(session_.Prepare(Format(
2781
1
      "BEGIN TRANSACTION"
2782
1
      "  INSERT INTO $0 (key, value) VALUES (?, ?);"
2783
1
      "  INSERT INTO $0 (key, value) VALUES (?, ?);"
2784
1
      "END TRANSACTION;", kTableName)));
2785
21
  for (int i = 1; i <= kIterations; ++i) {
2786
20
    auto statement = prepared.Bind();
2787
20
    statement.Bind(0, i);
2788
20
    statement.Bind(1, i * 3);
2789
20
    statement.Bind(2, -i);
2790
20
    statement.Bind(3, i * -4);
2791
20
    ASSERT_OK(session_.Execute(statement));
2792
20
  }
2793
1
}
2794
2795
class CppCassandraDriverTestThreeMasters : public CppCassandraDriverTestNoPartitionBgRefresh {
2796
 private:
2797
1
  int NumMasters() override {
2798
1
    return 3;
2799
1
  }
2800
2801
1
  std::vector<std::string> ExtraMasterFlags() override {
2802
1
    auto flags = CppCassandraDriverTestNoPartitionBgRefresh::ExtraMasterFlags();
2803
  // Just want to test the cache, so turn off automatic updating for this vtable.
2804
1
    flags.push_back("--generate_partitions_vtable_on_changes=false");
2805
1
    return flags;
2806
1
  }
2807
};
2808
2809
1
TEST_F_EX(CppCassandraDriverTest, ManyTables, CppCassandraDriverTestThreeMasters) {
2810
1
  FLAGS_external_mini_cluster_max_log_bytes = 512_MB;
2811
2812
1
  constexpr int kThreads = RegularBuildVsSanitizers(5, 2);
2813
1
  constexpr int kTables = RegularBuildVsSanitizers(15, 5);
2814
1
  constexpr int kReads = 20;
2815
2816
1
  const std::string kTableNameFormat = "test.key_value_$0_$1";
2817
1
  typedef TestTable<int32_t, int32_t> MyTable;
2818
2819
1
  TestThreadHolder thread_holder;
2820
1
  std::atomic<int> tables(0);
2821
2822
6
  for (int i = 0; i != kThreads; ++i) {
2823
5
    thread_holder.AddThreadFunctor(
2824
5
        [this, &stop = thread_holder.stop_flag(), thread = i, &kTableNameFormat, &tables] {
2825
5
          SetFlagOnExit set_flag_on_exit(&stop);
2826
0
          auto session = ASSERT_RESULT(EstablishSession());
2827
0
          int idx = 0;
2828
0
          while (!stop.load(std::memory_order_acquire)) {
2829
0
            MyTable table;
2830
0
            auto status = table.CreateTable(
2831
0
                &session, Format(kTableNameFormat, thread, idx), {"key", "value"}, {"(key)"});
2832
0
            if (status.ok()) {
2833
0
              LOG(INFO) << "Created table " << thread << ", " << idx;
2834
              // We need at least kTables tables.
2835
0
              if (tables.fetch_add(1, std::memory_order_acq_rel) >= kTables) {
2836
0
                break;
2837
0
              }
2838
0
            } else {
2839
0
              LOG(INFO) << "Failed to create table " << thread << ", " << idx << ": " << status;
2840
0
            }
2841
0
            ++idx;
2842
0
          }
2843
0
        });
2844
5
  }
2845
2846
1
  thread_holder.WaitAndStop(180s);
2847
2848
1
  ASSERT_GE(tables.load(std::memory_order_acquire), kTables);
2849
2850
0
  CassandraStatement statement("SELECT * FROM system.partitions");
2851
0
  std::vector<MonoDelta> read_times;
2852
0
  read_times.reserve(kReads);
2853
0
  int i = 0;
2854
0
  for (;;) {
2855
0
    auto start = MonoTime::Now();
2856
0
    auto result = session_.ExecuteWithResult(statement);
2857
0
    auto finish = MonoTime::Now();
2858
0
    if (!result.ok()) {
2859
0
      LOG(INFO) << "Read failed: " << result.status();
2860
0
      continue;
2861
0
    }
2862
0
    read_times.push_back(finish - start);
2863
0
    ++i;
2864
0
    if (i == kReads) {
2865
0
      LogResult(*result);
2866
0
      break;
2867
0
    }
2868
0
  }
2869
2870
0
  LOG(INFO) << "Read times: " << AsString(read_times);
2871
0
  std::sort(read_times.begin(), read_times.end());
2872
2873
0
  if (!IsSanitizer()) {
2874
0
    ASSERT_LE(read_times.front() * 2, read_times.back()); // Check that cache works
2875
0
  }
2876
0
}
2877
2878
class CppCassandraDriverTestPartitionsVtableCache : public CppCassandraDriverTest {
2879
 public:
2880
  static constexpr int kCacheRefreshSecs = 30;
2881
2882
86
  vector<string> ResultsToList(const CassandraResult& result) {
2883
86
    vector<string> out;
2884
86
    auto iterator = result.CreateIterator();
2885
1.47k
    while (iterator.Next()) {
2886
1.38k
      auto row = iterator.Row();
2887
1.38k
      auto row_iterator = row.CreateIterator();
2888
9.69k
      while (row_iterator.Next()) {
2889
8.31k
        out.push_back(row_iterator.Value().ToString());
2890
8.31k
      }
2891
1.38k
    }
2892
86
    std::sort(out.begin(), out.end());
2893
86
    return out;
2894
86
  }
2895
2896
3
  Status AddTable() {
2897
3
    auto session = VERIFY_RESULT(EstablishSession());
2898
3
    TestTable<int32_t, int32_t>  table;
2899
3
    return table.CreateTable(
2900
3
        &session, Format("test.key_value_$0", ++table_idx_), {"key", "value"}, {"(key)"});
2901
3
  }
2902
2903
1
  Status DropTable() {
2904
1
    auto session = VERIFY_RESULT(EstablishSession());
2905
1
    CassandraStatement statement(Format("DROP TABLE test.key_value_$0", table_idx_--));
2906
1
    return ResultToStatus(session.ExecuteWithResult(statement));
2907
1
  }
2908
2909
 private:
2910
1
  std::vector<std::string> ExtraMasterFlags() override {
2911
1
    auto flags = CppCassandraDriverTest::ExtraMasterFlags();
2912
1
    flags.push_back(Substitute("--partitions_vtable_cache_refresh_secs=$0", kCacheRefreshSecs));
2913
1
    flags.push_back(Substitute("--generate_partitions_vtable_on_changes=$0", false));
2914
1
    flags.push_back(Substitute(
2915
1
        "--TEST_catalog_manager_check_yql_partitions_exist_for_is_create_table_done=$0",
2916
1
        false));
2917
1
    return flags;
2918
1
  }
2919
2920
  int table_idx_ = 0;
2921
};
2922
2923
TEST_F_EX(CppCassandraDriverTest,
2924
          YQLPartitionsVtableCacheRefresh,
2925
1
          CppCassandraDriverTestPartitionsVtableCache) {
2926
  // Get the initial system.partitions and store the result.
2927
1
  CassandraStatement statement("SELECT * FROM system.partitions");
2928
1
  auto old_result = ASSERT_RESULT(session_.ExecuteWithResult(statement));
2929
1
  auto old_results = ResultsToList(old_result);
2930
2931
  // Add a table to update system.partitions.
2932
1
  ASSERT_OK(AddTable());
2933
2934
  // Since we don't know when the bg task started, let's wait for a cache update.
2935
1
  ASSERT_OK(LoggedWaitFor(
2936
1
      [this, &old_results]() {
2937
1
        CassandraStatement statement("SELECT * FROM system.partitions");
2938
1
        auto new_result = session_.ExecuteWithResult(statement);
2939
1
        if (!new_result.ok()) {
2940
1
          return false;
2941
1
        }
2942
1
        auto new_results = ResultsToList(*new_result);
2943
1
        if (old_results != new_results) {
2944
          // Update the old_results.
2945
1
          old_results = new_results;
2946
1
          return true;
2947
1
        }
2948
1
        return false;
2949
1
      },
2950
1
      MonoDelta::FromSeconds(kCacheRefreshSecs), "Waiting for cache to refresh"));
2951
2952
  // We are now just after a cache update, so we should expect that we only get the cached value
2953
  // for the next kCacheRefreshSecs seconds.
2954
2955
  // Add a table to update system.partitions again.
2956
1
  ASSERT_OK(AddTable());
2957
2958
  // Check that we still get the same cached version as the bg task has not run yet.
2959
1
  auto new_results = ResultsToList(ASSERT_RESULT(session_.ExecuteWithResult(statement)));
2960
1
  ASSERT_EQ(old_results, new_results);
2961
2962
  // Wait for the cache to update.
2963
1
  SleepFor(MonoDelta::FromSeconds(kCacheRefreshSecs));
2964
  // Verify that we get the new cached value.
2965
0
  new_results = ResultsToList(ASSERT_RESULT(session_.ExecuteWithResult(statement)));
2966
0
  ASSERT_NE(old_results, new_results);
2967
0
  old_results = new_results;
2968
2969
  // Test dropping a table as well.
2970
0
  ASSERT_OK(DropTable());
2971
  // Should still get the old cached values.
2972
0
  new_results = ResultsToList(ASSERT_RESULT(session_.ExecuteWithResult(statement)));
2973
0
  ASSERT_EQ(old_results, new_results);
2974
2975
  // Wait for the cache to update, then verify that we get the new cached value.
2976
0
  SleepFor(MonoDelta::FromSeconds(kCacheRefreshSecs));
2977
0
  new_results = ResultsToList(ASSERT_RESULT(session_.ExecuteWithResult(statement)));
2978
0
  ASSERT_NE(old_results, new_results);
2979
0
}
2980
2981
class CppCassandraDriverTestPartitionsVtableCacheUpdateOnChanges :
2982
    public CppCassandraDriverTestPartitionsVtableCache {
2983
1
  std::vector<std::string> ExtraMasterFlags() override {
2984
1
    auto flags = CppCassandraDriverTest::ExtraMasterFlags();
2985
    // Test for generating system.partitions as changes occur, rather than via a bg task.
2986
1
    flags.push_back(Substitute("--partitions_vtable_cache_refresh_secs=$0", 0));
2987
1
    flags.push_back(Substitute("--generate_partitions_vtable_on_changes=$0", true));
2988
1
    flags.push_back(Substitute(
2989
1
        "--TEST_catalog_manager_check_yql_partitions_exist_for_is_create_table_done=$0",
2990
1
        true));
2991
1
    return flags;
2992
1
  }
2993
};
2994
2995
TEST_F_EX(CppCassandraDriverTest,
2996
          YQLPartitionsVtableCacheUpdateOnChanges,
2997
1
          CppCassandraDriverTestPartitionsVtableCacheUpdateOnChanges) {
2998
  // Get the initial system.partitions and store the result.
2999
1
  CassandraStatement statement("SELECT * FROM system.partitions");
3000
1
  auto old_result = ASSERT_RESULT(session_.ExecuteWithResult(statement));
3001
1
  auto old_results = ResultsToList(old_result);
3002
3003
  // Add a table to update system.partitions.
3004
1
  ASSERT_OK(AddTable());
3005
3006
  // Verify that the table is in the cache.
3007
1
  auto new_results = ResultsToList(ASSERT_RESULT(session_.ExecuteWithResult(statement)));
3008
1
  ASSERT_NE(old_results, new_results);
3009
1
  old_results = new_results;
3010
3011
  // Test dropping a table as well.
3012
1
  ASSERT_OK(DropTable());
3013
  // Cache should again be automatically updated.
3014
1
  new_results = ResultsToList(ASSERT_RESULT(session_.ExecuteWithResult(statement)));
3015
1
  ASSERT_NE(old_results, new_results);
3016
1
}
3017
3018
class CppCassandraDriverRejectionTest : public CppCassandraDriverTest {
3019
 public:
3020
1
  std::vector<std::string> ExtraTServerFlags() override {
3021
1
    return {"--TEST_write_rejection_percentage=15"s,
3022
1
            "--linear_backoff_ms=10"};
3023
1
  }
3024
};
3025
3026
1
TEST_F_EX(CppCassandraDriverTest, Rejection, CppCassandraDriverRejectionTest) {
3027
1
  constexpr int kBatchSize = 50;
3028
1
  constexpr int kWriters = 21;
3029
3030
1
  typedef TestTable<int64_t, int64_t> MyTable;
3031
1
  typedef MyTable::ColumnsTuple ColumnsType;
3032
1
  MyTable table;
3033
1
  ASSERT_OK(table.CreateTable(&session_, "test.key_value", {"key", "value"}, {"(key)"}));
3034
3035
1
  TestThreadHolder thread_holder;
3036
1
  std::atomic<int64_t> key(0);
3037
1
  std::atomic<int> pending_writes(0);
3038
1
  std::atomic<int> max_pending_writes(0);
3039
3040
22
  for (int i = 0; i != kWriters; ++i) {
3041
21
    thread_holder.AddThreadFunctor(
3042
21
        [this, &stop = thread_holder.stop_flag(), &table, &key, &pending_writes,
3043
21
         &max_pending_writes] {
3044
0
      auto session = ASSERT_RESULT(EstablishSession());
3045
0
      CassandraPrepared prepared;
3046
0
      ASSERT_OK(WaitFor([&table, &session, &prepared] {
3047
0
        auto prepared_result = table.PrepareInsert(&session);
3048
0
        if (!prepared_result.ok()) {
3049
          // Prepare could be failed because cluster has heavy load.
3050
          // It is ok to just retry in this case, because we expect total number of writes.
3051
0
          LOG(INFO) << "Prepare failed: " << prepared_result.status();
3052
0
          return false;
3053
0
        }
3054
0
        prepared = std::move(*prepared_result);
3055
0
        return true;
3056
0
      }, kCassandraTimeOut * 5, "Prepare statement"));
3057
0
      while (!stop.load()) {
3058
0
        CassandraBatch batch(CassBatchType::CASS_BATCH_TYPE_LOGGED);
3059
0
        for (int i = 0; i != kBatchSize; ++i) {
3060
0
          auto current_key = key++;
3061
0
          ColumnsType tuple(current_key, -current_key);
3062
0
          auto statement = prepared.Bind();
3063
0
          table.BindInsert(&statement, tuple);
3064
0
          batch.Add(&statement);
3065
0
        }
3066
0
        auto future = session.SubmitBatch(batch);
3067
0
        auto status = future.WaitFor(kCassandraTimeOut / 2);
3068
0
        if (status.IsTimedOut()) {
3069
0
          auto pw = ++pending_writes;
3070
0
          auto mpw = max_pending_writes.load();
3071
0
          while (pw > mpw) {
3072
0
            if (max_pending_writes.compare_exchange_weak(mpw, pw)) {
3073
0
              break;
3074
0
            }
3075
0
          }
3076
0
          auto wait_status = future.Wait();
3077
0
          ASSERT_TRUE(wait_status.ok() || wait_status.IsTimedOut()) << wait_status;
3078
0
          --pending_writes;
3079
0
        } else {
3080
0
          ASSERT_OK(status);
3081
0
        }
3082
0
      }
3083
0
    });
3084
21
  }
3085
3086
1
  thread_holder.WaitAndStop(30s);
3087
1
  LOG(INFO) << "Max pending writes: " << max_pending_writes.load();
3088
  // Assert that we don't have too many pending writers.
3089
1
  ASSERT_LE(max_pending_writes.load(), kWriters / 3);
3090
1
}
3091
3092
1
TEST_F(CppCassandraDriverTest, BigQueryExpr) {
3093
1
  const std::string kTableName = "test.key_value";
3094
1
  typedef TestTable<std::string> MyTable;
3095
1
  MyTable table;
3096
1
  ASSERT_OK(table.CreateTable(&session_, kTableName, {"key"}, {"(key)"}));
3097
3098
1
  constexpr size_t kRows = 400;
3099
1
  constexpr size_t kValueSize = RegularBuildVsSanitizers(256_KB, 4_KB);
3100
3101
1
  auto prepared = ASSERT_RESULT(session_.Prepare(
3102
1
      Format("INSERT INTO $0 (key) VALUES (?);", kTableName)));
3103
3104
401
  for (int32_t i = 0; i != kRows; ++i) {
3105
400
    auto statement = prepared.Bind();
3106
400
    statement.Bind(0, RandomHumanReadableString(kValueSize));
3107
400
    ASSERT_OK(session_.Execute(statement));
3108
400
  }
3109
3110
1
  auto start = MonoTime::Now();
3111
1
  auto result = ASSERT_RESULT(session_.FetchValue<std::string>(Format(
3112
1
      "SELECT MAX(key) FROM $0", kTableName)));
3113
1
  auto finish = MonoTime::Now();
3114
1
  LOG(INFO) << "Time: " << finish - start;
3115
3116
1
  LOG(INFO) << "Result: " << result;
3117
1
}
3118
3119
class CppCassandraDriverSmallSoftLimitTest : public CppCassandraDriverTest {
3120
 public:
3121
1
  std::vector <std::string> ExtraTServerFlags() override {
3122
1
    return {
3123
1
        Format("--memory_limit_hard_bytes=$0", 100_MB),
3124
1
        "--memory_limit_soft_percentage=10"
3125
1
    };
3126
1
  }
3127
};
3128
3129
1
TEST_F_EX(CppCassandraDriverTest, Throttle, CppCassandraDriverSmallSoftLimitTest) {
3130
1
  const std::string kTableName = "test.key_value";
3131
1
  typedef TestTable<std::string> MyTable;
3132
1
  MyTable table;
3133
1
  ASSERT_OK(table.CreateTable(&session_, kTableName, {"key"}, {"(key)"}));
3134
3135
1
  constexpr size_t kValueSize = 1_KB;
3136
3137
1
  CassandraPrepared prepared;
3138
1
  for (;;) {
3139
1
    auto temp_prepared = session_.Prepare(
3140
1
        Format("INSERT INTO $0 (key) VALUES (?);", kTableName));
3141
1
    if (temp_prepared.ok()) {
3142
1
      prepared = std::move(*temp_prepared);
3143
1
      break;
3144
1
    }
3145
0
    LOG(INFO) << "Prepare failure: " << temp_prepared.status();
3146
0
  }
3147
3148
1
  bool has_failure = false;
3149
3150
1
  auto deadline = CoarseMonoClock::now() + 60s;
3151
12.8k
  while (CoarseMonoClock::now() < deadline) {
3152
12.8k
    auto statement = prepared.Bind();
3153
12.8k
    statement.Bind(0, RandomHumanReadableString(kValueSize));
3154
12.8k
    auto status = session_.Execute(statement);
3155
12.8k
    if (!status.ok()) {
3156
2
      ASSERT_TRUE(status.IsServiceUnavailable() || status.IsTimedOut()) << status;
3157
1
      has_failure = true;
3158
1
      break;
3159
1
    }
3160
12.8k
  }
3161
3162
1
  ASSERT_TRUE(RegularBuildVsSanitizers(has_failure, true));
3163
1
}
3164
3165
}  // namespace yb