@@ -91,6 +91,7 @@ import (
91
91
"github.com/cockroachdb/cockroach/pkg/util/ctxgroup"
92
92
"github.com/cockroachdb/cockroach/pkg/util/hlc"
93
93
"github.com/cockroachdb/cockroach/pkg/util/json"
94
+ "github.com/cockroachdb/cockroach/pkg/util/keysutil"
94
95
"github.com/cockroachdb/cockroach/pkg/util/leaktest"
95
96
"github.com/cockroachdb/cockroach/pkg/util/log"
96
97
"github.com/cockroachdb/cockroach/pkg/util/log/eventpb"
@@ -9192,22 +9193,66 @@ func TestDistSenderRangeFeedPopulatesVirtualTable(t *testing.T) {
9192
9193
defer leaktest .AfterTest (t )()
9193
9194
defer log .Scope (t ).Close (t )
9194
9195
9195
- s , cleanup := makeServer (t )
9196
- defer cleanup ()
9196
+ scanner := keysutil .MakePrettyScanner (nil , nil )
9197
9197
9198
- sqlDB := sqlutils .MakeSQLRunner (s .DB )
9199
- sqlDB .Exec (t , `CREATE TABLE tbl (a INT, b STRING);` )
9200
- sqlDB .Exec (t , `INSERT INTO tbl VALUES (1, 'one'), (2, 'two'), (3, 'three');` )
9201
- sqlDB .Exec (t , `CREATE CHANGEFEED FOR tbl INTO 'null://';` )
9202
-
9203
- var tableID int
9204
- sqlDB .QueryRow (t , "SELECT table_id FROM crdb_internal.tables WHERE name='tbl'" ).Scan (& tableID )
9205
- tableKey := s .Codec .TablePrefix (uint32 (tableID ))
9206
-
9207
- numRangesQuery := fmt .Sprintf (
9208
- "SELECT count(*) FROM crdb_internal.active_range_feeds WHERE range_start LIKE '%s/%%'" ,
9209
- tableKey )
9210
- sqlDB .CheckQueryResultsRetry (t , numRangesQuery , [][]string {{"1" }})
9198
+ observeTables := func (sqlDB * sqlutils.SQLRunner , codec keys.SQLCodec ) []int {
9199
+ rows := sqlDB .Query (t , "SELECT range_start FROM crdb_internal.active_range_feeds" )
9200
+ defer rows .Close ()
9201
+ var tableIDs []int
9202
+ for rows .Next () {
9203
+ var prettyKey string
9204
+ require .NoError (t , rows .Scan (& prettyKey ))
9205
+ key , err := scanner .Scan (prettyKey )
9206
+ require .NoError (t , err )
9207
+ _ , tableID , err := codec .DecodeTablePrefix (key )
9208
+ require .NoError (t , err )
9209
+ tableIDs = append (tableIDs , int (tableID ))
9210
+ }
9211
+ return tableIDs
9212
+ }
9213
+
9214
+ cases := []struct {
9215
+ user string
9216
+ shouldSeeTable bool
9217
+ }{
9218
+ {`feedCreator` , false },
9219
+ {`regularUser` , false },
9220
+ {`adminUser` , true },
9221
+ {`viewClusterMetadataUser` , true },
9222
+ }
9223
+
9224
+ testFn := func (t * testing.T , s TestServer , f cdctest.TestFeedFactory ) {
9225
+ sqlDB := sqlutils .MakeSQLRunner (s .DB )
9226
+
9227
+ // Creates several different tables, users, and roles for us to use.
9228
+ ChangefeedJobPermissionsTestSetup (t , s )
9229
+
9230
+ var tableID int
9231
+ sqlDB .QueryRow (t , "SELECT table_id FROM crdb_internal.tables WHERE name = 'table_a'" ).Scan (& tableID )
9232
+
9233
+ var cf cdctest.TestFeed
9234
+ asUser (t , f , `feedCreator` , func (userDB * sqlutils.SQLRunner ) {
9235
+ cf = feed (t , f , `CREATE CHANGEFEED FOR table_a;` )
9236
+ })
9237
+ defer closeFeed (t , cf )
9238
+
9239
+ for _ , c := range cases {
9240
+ testutils .SucceedsSoon (t , func () error {
9241
+ asUser (t , f , c .user , func (userDB * sqlutils.SQLRunner ) {
9242
+ tableIDs := observeTables (userDB , s .Codec )
9243
+ if c .shouldSeeTable {
9244
+ require .Containsf (t , tableIDs , tableID , "user %s should see table %d" , c .user , tableID )
9245
+ } else {
9246
+ require .Emptyf (t , tableIDs , "user %s should not see any tables" , c .user )
9247
+ }
9248
+ })
9249
+ return nil
9250
+ })
9251
+ }
9252
+
9253
+ }
9254
+
9255
+ cdcTest (t , testFn , feedTestEnterpriseSinks )
9211
9256
}
9212
9257
9213
9258
func TestChangefeedCaseInsensitiveOpts (t * testing.T ) {
0 commit comments