@@ -3307,20 +3307,50 @@ TEST_F(PgMiniTest, TabletMetadataOidMatchesPgClass) {
33073307TEST_F (PgMiniTest, TabletMetadataSizeColumns) {
33083308 auto pg_conn = ASSERT_RESULT (Connect ());
33093309 ASSERT_OK (pg_conn.Execute (
3310- " CREATE TABLE size_test (id INT PRIMARY KEY, data TEXT)" ));
3311- ASSERT_OK (pg_conn.Execute (
3312- " INSERT INTO size_test SELECT g, repeat('x', 100) FROM generate_series(1, 100) g" ));
3313-
3314- // Verify that the size columns exist and are non-null arrays whose length
3315- // matches the replicas array length.
3316- auto result = ASSERT_RESULT (pg_conn.FetchRow <bool >(
3317- " SELECT bool_and("
3318- " active_ssts_size IS NOT NULL AND"
3319- " wals_size IS NOT NULL AND"
3320- " array_length(active_ssts_size, 1) = array_length(replicas, 1) AND"
3321- " array_length(wals_size, 1) = array_length(replicas, 1)"
3322- " ) FROM yb_tablet_metadata WHERE relname = 'size_test'" ));
3323- ASSERT_TRUE (result) << " Size array columns must be non-null and parallel to replicas" ;
3310+ " CREATE TABLE size_test (id INT PRIMARY KEY, data TEXT) SPLIT INTO 1 TABLETS" ));
3311+
3312+ // All three arrays must exist and have one element per replica.
3313+ auto [replicas_len, ssts_len, wals_len] = ASSERT_RESULT (
3314+ (pg_conn.FetchRow <int32_t , int32_t , int32_t >(
3315+ " SELECT array_length(replicas, 1),"
3316+ " array_length(active_ssts_size, 1),"
3317+ " array_length(wals_size, 1) "
3318+ " FROM yb_tablet_metadata WHERE relname = 'size_test'" )));
3319+ ASSERT_EQ (replicas_len, ssts_len);
3320+ ASSERT_EQ (replicas_len, wals_len);
3321+ ASSERT_EQ (static_cast <size_t >(replicas_len), NumTabletServers ());
3322+
3323+ // Unnest all three arrays in parallel to verify ordering and alignment.
3324+ // Uses WITH ORDINALITY to join corresponding elements in a single snapshot.
3325+ auto result = ASSERT_RESULT (pg_conn.Fetch (
3326+ " SELECT r.val, s.val, w.val "
3327+ " FROM yb_tablet_metadata tm, "
3328+ " unnest(tm.replicas) WITH ORDINALITY AS r(val, ord), "
3329+ " unnest(tm.active_ssts_size) WITH ORDINALITY AS s(val, ord), "
3330+ " unnest(tm.wals_size) WITH ORDINALITY AS w(val, ord) "
3331+ " WHERE tm.relname = 'size_test' "
3332+ " AND r.ord = s.ord AND r.ord = w.ord "
3333+ " ORDER BY r.ord" ));
3334+
3335+ auto num_rows = PQntuples (result.get ());
3336+ ASSERT_EQ (static_cast <size_t >(num_rows), NumTabletServers ());
3337+
3338+ for (int i = 0 ; i < num_rows; ++i) {
3339+ auto replica = ASSERT_RESULT (GetValue<std::string>(result.get (), i, 0 ));
3340+ auto sst_size = ASSERT_RESULT (GetValue<int64_t >(result.get (), i, 1 ));
3341+ auto wal_size = ASSERT_RESULT (GetValue<int64_t >(result.get (), i, 2 ));
3342+ ASSERT_FALSE (replica.empty ());
3343+ ASSERT_GE (sst_size, 0 ) << " replica " << replica;
3344+ ASSERT_GE (wal_size, 0 ) << " replica " << replica;
3345+ }
3346+
3347+ // Every replica address must correspond to a live tserver.
3348+ auto valid_count = ASSERT_RESULT (pg_conn.FetchRow <int64_t >(
3349+ " SELECT count(*) FROM yb_servers() s "
3350+ " WHERE s.host || ':' || s.port IN ("
3351+ " SELECT unnest(replicas) FROM yb_tablet_metadata WHERE relname = 'size_test'"
3352+ " )" ));
3353+ ASSERT_EQ (static_cast <size_t >(valid_count), NumTabletServers ());
33243354}
33253355
33263356TEST_F (PgMiniTest, TestYbGetLocalTserverUuid) {
0 commit comments