/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 |