@@ -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"
@@ -9128,22 +9129,66 @@ func TestDistSenderRangeFeedPopulatesVirtualTable(t *testing.T) {
9128
9129
defer leaktest .AfterTest (t )()
9129
9130
defer log .Scope (t ).Close (t )
9130
9131
9131
- s , cleanup := makeServer (t )
9132
- defer cleanup ()
9132
+ scanner := keysutil .MakePrettyScanner (nil , nil )
9133
9133
9134
- sqlDB := sqlutils .MakeSQLRunner (s .DB )
9135
- sqlDB .Exec (t , `CREATE TABLE tbl (a INT, b STRING);` )
9136
- sqlDB .Exec (t , `INSERT INTO tbl VALUES (1, 'one'), (2, 'two'), (3, 'three');` )
9137
- sqlDB .Exec (t , `CREATE CHANGEFEED FOR tbl INTO 'null://';` )
9138
-
9139
- var tableID int
9140
- sqlDB .QueryRow (t , "SELECT table_id FROM crdb_internal.tables WHERE name='tbl'" ).Scan (& tableID )
9141
- tableKey := s .Codec .TablePrefix (uint32 (tableID ))
9142
-
9143
- numRangesQuery := fmt .Sprintf (
9144
- "SELECT count(*) FROM crdb_internal.active_range_feeds WHERE range_start LIKE '%s/%%'" ,
9145
- tableKey )
9146
- sqlDB .CheckQueryResultsRetry (t , numRangesQuery , [][]string {{"1" }})
9134
+ observeTables := func (sqlDB * sqlutils.SQLRunner , codec keys.SQLCodec ) []int {
9135
+ rows := sqlDB .Query (t , "SELECT range_start FROM crdb_internal.active_range_feeds" )
9136
+ defer rows .Close ()
9137
+ var tableIDs []int
9138
+ for rows .Next () {
9139
+ var prettyKey string
9140
+ require .NoError (t , rows .Scan (& prettyKey ))
9141
+ key , err := scanner .Scan (prettyKey )
9142
+ require .NoError (t , err )
9143
+ _ , tableID , err := codec .DecodeTablePrefix (key )
9144
+ require .NoError (t , err )
9145
+ tableIDs = append (tableIDs , int (tableID ))
9146
+ }
9147
+ return tableIDs
9148
+ }
9149
+
9150
+ cases := []struct {
9151
+ user string
9152
+ shouldSeeTable bool
9153
+ }{
9154
+ {`feedCreator` , false },
9155
+ {`regularUser` , false },
9156
+ {`adminUser` , true },
9157
+ {`viewClusterMetadataUser` , true },
9158
+ }
9159
+
9160
+ testFn := func (t * testing.T , s TestServer , f cdctest.TestFeedFactory ) {
9161
+ sqlDB := sqlutils .MakeSQLRunner (s .DB )
9162
+
9163
+ // Creates several different tables, users, and roles for us to use.
9164
+ ChangefeedJobPermissionsTestSetup (t , s )
9165
+
9166
+ var tableID int
9167
+ sqlDB .QueryRow (t , "SELECT table_id FROM crdb_internal.tables WHERE name = 'table_a'" ).Scan (& tableID )
9168
+
9169
+ var cf cdctest.TestFeed
9170
+ asUser (t , f , `feedCreator` , func (userDB * sqlutils.SQLRunner ) {
9171
+ cf = feed (t , f , `CREATE CHANGEFEED FOR table_a;` )
9172
+ })
9173
+ defer closeFeed (t , cf )
9174
+
9175
+ for _ , c := range cases {
9176
+ testutils .SucceedsSoon (t , func () error {
9177
+ asUser (t , f , c .user , func (userDB * sqlutils.SQLRunner ) {
9178
+ tableIDs := observeTables (userDB , s .Codec )
9179
+ if c .shouldSeeTable {
9180
+ require .Containsf (t , tableIDs , tableID , "user %s should see table %d" , c .user , tableID )
9181
+ } else {
9182
+ require .Emptyf (t , tableIDs , "user %s should not see any tables" , c .user )
9183
+ }
9184
+ })
9185
+ return nil
9186
+ })
9187
+ }
9188
+
9189
+ }
9190
+
9191
+ cdcTest (t , testFn , feedTestEnterpriseSinks )
9147
9192
}
9148
9193
9149
9194
func TestChangefeedCaseInsensitiveOpts (t * testing.T ) {
0 commit comments