diff --git a/server/db/mysql/group_schema_test.go b/server/db/mysql/group_schema_test.go index 9573112..c749da7 100644 --- a/server/db/mysql/group_schema_test.go +++ b/server/db/mysql/group_schema_test.go @@ -116,7 +116,7 @@ func TestTenantPartitionTableNames(t *testing.T) { } func TestTenantShardSQL(t *testing.T) { - query := tenantShardSQL(7, "SELECT * FROM im_topics t JOIN im_group_members gm ON gm.topic=t.name JOIN im_subscriptions s ON s.topic=gm.topic; INSERT INTO im_system_notifications(event_id) VALUES(?)") + query := tenantShardSQL(7, "SELECT * FROM im_topics t JOIN im_group_members AS gm FORCE INDEX (`idx_im_group_members_topic_role`) ON gm.topic=t.name JOIN im_subscriptions s ON s.topic=gm.topic; INSERT INTO im_system_notifications(event_id) VALUES(?)") for _, expected := range []string{"im_007_topics", "im_007_group_members", "im_007_subscriptions", "im_007_system_notifications"} { if !strings.Contains(query, expected) { t.Fatalf("tenant shard query is missing %q: %s", expected, query) @@ -127,4 +127,10 @@ func TestTenantShardSQL(t *testing.T) { t.Fatalf("tenant shard query should not reference shared table %q: %s", shared, query) } } + if !strings.Contains(query, "idx_im_group_members_topic_role") { + t.Fatalf("tenant shard query should not rewrite index names: %s", query) + } + if strings.Contains(query, "idx_im_007_group_members_topic_role") { + t.Fatalf("tenant shard query rewrote index name: %s", query) + } } diff --git a/server/db/mysql/tenant_groups.go b/server/db/mysql/tenant_groups.go index 05aad15..b18534c 100644 --- a/server/db/mysql/tenant_groups.go +++ b/server/db/mysql/tenant_groups.go @@ -1235,7 +1235,7 @@ func (a *adapter) TenantGroupCreate(id t.TenantID, topic *t.Topic, owner t.Uid, return err } defer tx.Rollback() - if err = a.topicCreate(tx, topic); err != nil { + if err = tenantTopicCreate(tx, topic); err != nil { return err } ownerSub := &t.Subscription{TenantID: id, ObjHeader: t.ObjHeader{CreatedAt: topic.CreatedAt}, User: owner.String(), diff --git a/server/db/mysql/tenant_tables.go b/server/db/mysql/tenant_tables.go index 4f1f0af..99cc8db 100644 --- a/server/db/mysql/tenant_tables.go +++ b/server/db/mysql/tenant_tables.go @@ -5,16 +5,23 @@ package mysql import ( "fmt" - "strings" + "regexp" t "github.com/tinode/chat/server/store/types" ) +var ( + tenantTopicsTableRE = regexp.MustCompile(`\bim_topics\b`) + tenantGroupMembersTableRE = regexp.MustCompile(`\bim_group_members\b`) + tenantSubscriptionsTableRE = regexp.MustCompile(`\bim_subscriptions\b`) + tenantSystemNotificationsTableRE = regexp.MustCompile(`\bim_system_notifications\b`) +) + func tenantShardSQL(tenantID t.TenantID, query string) string { - query = strings.ReplaceAll(query, "im_topics", tenantTopicsTable(tenantID)) - query = strings.ReplaceAll(query, "im_group_members", tenantGroupMembersTable(tenantID)) - query = strings.ReplaceAll(query, "im_subscriptions", tenantSubscriptionsTable(tenantID)) - return strings.ReplaceAll(query, "im_system_notifications", tenantSystemNotificationsTable(tenantID)) + query = tenantTopicsTableRE.ReplaceAllString(query, tenantTopicsTable(tenantID)) + query = tenantGroupMembersTableRE.ReplaceAllString(query, tenantGroupMembersTable(tenantID)) + query = tenantSubscriptionsTableRE.ReplaceAllString(query, tenantSubscriptionsTable(tenantID)) + return tenantSystemNotificationsTableRE.ReplaceAllString(query, tenantSystemNotificationsTable(tenantID)) } func tenantTablePrefix(tenantID t.TenantID) string {