@@ -80,6 +80,7 @@ import (
80
80
"github.com/cockroachdb/cockroach/pkg/util/cidr"
81
81
"github.com/cockroachdb/cockroach/pkg/util/ctxgroup"
82
82
"github.com/cockroachdb/cockroach/pkg/util/hlc"
83
+ "github.com/cockroachdb/cockroach/pkg/util/keysutil"
83
84
"github.com/cockroachdb/cockroach/pkg/util/leaktest"
84
85
"github.com/cockroachdb/cockroach/pkg/util/log"
85
86
"github.com/cockroachdb/cockroach/pkg/util/log/eventpb"
@@ -7716,22 +7717,66 @@ func TestDistSenderRangeFeedPopulatesVirtualTable(t *testing.T) {
7716
7717
defer leaktest .AfterTest (t )()
7717
7718
defer log .Scope (t ).Close (t )
7718
7719
7719
- s , cleanup := makeServer (t )
7720
- defer cleanup ()
7720
+ scanner := keysutil .MakePrettyScanner (nil , nil )
7721
7721
7722
- sqlDB := sqlutils .MakeSQLRunner (s .DB )
7723
- sqlDB .Exec (t , `CREATE TABLE tbl (a INT, b STRING);` )
7724
- sqlDB .Exec (t , `INSERT INTO tbl VALUES (1, 'one'), (2, 'two'), (3, 'three');` )
7725
- sqlDB .Exec (t , `CREATE CHANGEFEED FOR tbl INTO 'null://';` )
7726
-
7727
- var tableID int
7728
- sqlDB .QueryRow (t , "SELECT table_id FROM crdb_internal.tables WHERE name='tbl'" ).Scan (& tableID )
7729
- tableKey := s .Codec .TablePrefix (uint32 (tableID ))
7730
-
7731
- numRangesQuery := fmt .Sprintf (
7732
- "SELECT count(*) FROM crdb_internal.active_range_feeds WHERE range_start LIKE '%s/%%'" ,
7733
- tableKey )
7734
- sqlDB .CheckQueryResultsRetry (t , numRangesQuery , [][]string {{"1" }})
7722
+ observeTables := func (sqlDB * sqlutils.SQLRunner , codec keys.SQLCodec ) []int {
7723
+ rows := sqlDB .Query (t , "SELECT range_start FROM crdb_internal.active_range_feeds" )
7724
+ defer rows .Close ()
7725
+ var tableIDs []int
7726
+ for rows .Next () {
7727
+ var prettyKey string
7728
+ require .NoError (t , rows .Scan (& prettyKey ))
7729
+ key , err := scanner .Scan (prettyKey )
7730
+ require .NoError (t , err )
7731
+ _ , tableID , err := codec .DecodeTablePrefix (key )
7732
+ require .NoError (t , err )
7733
+ tableIDs = append (tableIDs , int (tableID ))
7734
+ }
7735
+ return tableIDs
7736
+ }
7737
+
7738
+ cases := []struct {
7739
+ user string
7740
+ shouldSeeTable bool
7741
+ }{
7742
+ {`feedCreator` , false },
7743
+ {`regularUser` , false },
7744
+ {`adminUser` , true },
7745
+ {`viewClusterMetadataUser` , true },
7746
+ }
7747
+
7748
+ testFn := func (t * testing.T , s TestServer , f cdctest.TestFeedFactory ) {
7749
+ sqlDB := sqlutils .MakeSQLRunner (s .DB )
7750
+
7751
+ // Creates several different tables, users, and roles for us to use.
7752
+ ChangefeedJobPermissionsTestSetup (t , s )
7753
+
7754
+ var tableID int
7755
+ sqlDB .QueryRow (t , "SELECT table_id FROM crdb_internal.tables WHERE name = 'table_a'" ).Scan (& tableID )
7756
+
7757
+ var cf cdctest.TestFeed
7758
+ asUser (t , f , `feedCreator` , func (userDB * sqlutils.SQLRunner ) {
7759
+ cf = feed (t , f , `CREATE CHANGEFEED FOR table_a;` )
7760
+ })
7761
+ defer closeFeed (t , cf )
7762
+
7763
+ for _ , c := range cases {
7764
+ testutils .SucceedsSoon (t , func () error {
7765
+ asUser (t , f , c .user , func (userDB * sqlutils.SQLRunner ) {
7766
+ tableIDs := observeTables (userDB , s .Codec )
7767
+ if c .shouldSeeTable {
7768
+ require .Containsf (t , tableIDs , tableID , "user %s should see table %d" , c .user , tableID )
7769
+ } else {
7770
+ require .Emptyf (t , tableIDs , "user %s should not see any tables" , c .user )
7771
+ }
7772
+ })
7773
+ return nil
7774
+ })
7775
+ }
7776
+
7777
+ }
7778
+
7779
+ cdcTest (t , testFn , feedTestEnterpriseSinks )
7735
7780
}
7736
7781
7737
7782
func TestChangefeedCaseInsensitiveOpts (t * testing.T ) {
0 commit comments