@@ -2391,6 +2391,40 @@ func TestMismatchColIDs(t *testing.T) {
2391
2391
jobutils .WaitForJobToPause (t , sqlA , jobID )
2392
2392
}
2393
2393
2394
+ func TestPartialIndexes (t * testing.T ) {
2395
+ defer leaktest .AfterTest (t )()
2396
+ skip .UnderDeadlock (t )
2397
+ defer log .Scope (t ).Close (t )
2398
+
2399
+ ctx := context .Background ()
2400
+
2401
+ server , s , dbA , dbB := setupLogicalTestServer (t , ctx , testClusterBaseClusterArgs , 1 )
2402
+ defer server .Stopper ().Stop (ctx )
2403
+
2404
+ dbA .Exec (t , "SET CLUSTER SETTING logical_replication.consumer.immediate_mode_writer = 'sql'" )
2405
+
2406
+ dbBURL := replicationtestutils .GetExternalConnectionURI (t , s , s , serverutils .DBName ("b" ))
2407
+
2408
+ dbA .Exec (t , "CREATE TABLE foo (pk INT PRIMARY KEY, pi INT, payload STRING)" )
2409
+ dbA .Exec (t , "CREATE INDEX idx ON foo (pi) WHERE pk > 0" )
2410
+ dbB .Exec (t , "CREATE TABLE b.foo (pk INT PRIMARY KEY, pi INT, payload STRING)" )
2411
+ dbB .Exec (t , "CREATE INDEX idx ON b.foo (pi) WHERE pk < 0" )
2412
+ dbB .Exec (t , "INSERT INTO foo VALUES (1, 2, 'hello')" )
2413
+ dbB .Exec (t , "INSERT INTO foo VALUES (-1, -2, 'world')" )
2414
+
2415
+ var jobAID jobspb.JobID
2416
+ dbA .QueryRow (t , "CREATE LOGICAL REPLICATION STREAM FROM TABLE foo ON $1 INTO TABLE foo" , dbBURL .String ()).Scan (& jobAID )
2417
+ now := s .Clock ().Now ()
2418
+ WaitUntilReplicatedTime (t , now , dbA , jobAID )
2419
+
2420
+ dbA .CheckQueryResultsRetry (t , "SELECT * FROM foo WHERE pi = 2" , [][]string {{"1" , "2" , "hello" }})
2421
+ dbA .CheckQueryResultsRetry (t , "SELECT * FROM foo WHERE pi = -2" , [][]string {{"-1" , "-2" , "world" }})
2422
+
2423
+ // Check for partial indexes when using legacy kv writer.
2424
+ dbA .Exec (t , "SET CLUSTER SETTING logical_replication.consumer.immediate_mode_writer = 'legacy-kv'" )
2425
+ dbA .ExpectErr (t , "cannot create logical replication stream: table foo has a partial index idx" , "CREATE LOGICAL REPLICATION STREAM FROM TABLE foo ON $1 INTO TABLE foo" , dbBURL .String ())
2426
+ }
2427
+
2394
2428
// TestLogicalReplicationCreationChecks verifies that we check that the table
2395
2429
// schemas are compatible when creating the replication stream.
2396
2430
func TestLogicalReplicationCreationChecks (t * testing.T ) {
@@ -2442,15 +2476,9 @@ func TestLogicalReplicationCreationChecks(t *testing.T) {
2442
2476
dbA .Exec (t , "ALTER TABLE tab ALTER PRIMARY KEY USING COLUMNS (pk, composite_col)" )
2443
2477
expectErr (t , "tab" , `cannot create logical replication stream: table tab has a primary key column \(composite_col\) with composite encoding` )
2444
2478
replicationtestutils .WaitForAllProducerJobsToFail (t , dbB )
2445
-
2446
- // Check for partial indexes.
2447
2479
dbA .Exec (t , "ALTER TABLE tab ALTER PRIMARY KEY USING COLUMNS (pk)" )
2448
- dbA .Exec (t , "CREATE INDEX partial_idx ON tab(composite_col) WHERE pk > 0" )
2449
- expectErr (t , "tab" , "cannot create logical replication stream: table tab has a partial index partial_idx" )
2450
- replicationtestutils .WaitForAllProducerJobsToFail (t , dbB )
2451
2480
2452
2481
// Check for hash sharded indexes.
2453
- dbA .Exec (t , "DROP INDEX partial_idx" )
2454
2482
dbA .Exec (t , "CREATE INDEX hash_idx ON tab(pk) USING HASH WITH (bucket_count = 4)" )
2455
2483
dbB .Exec (t , "CREATE INDEX hash_idx ON b.tab(pk) USING HASH WITH (bucket_count = 4)" )
2456
2484
expectErr (t , "tab" , "tab has a virtual computed column crdb_internal_pk_shard_4 that is a key of index hash_idx" )
0 commit comments