Skip to content

Commit a63b4d9

Browse files
authored
fix(db-postgres): limit index and foreign key names length (#14236)
Continuation of #13428. Ensures `buildIndexName` is used everywhere and adds the same logic for foreign keys
1 parent 2ced43d commit a63b4d9

File tree

9 files changed

+86
-20
lines changed

9 files changed

+86
-20
lines changed

packages/db-d1-sqlite/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ export function sqliteD1Adapter(args: Args): DatabaseAdapterObj<SQLiteD1Adapter>
102102
json: true,
103103
},
104104
fieldConstraints: {},
105+
foreignKeys: new Set(),
105106
generateSchema: createSchemaGenerator({
106107
columnToCodeConverter,
107108
corePackageSuffix: 'sqlite-core',

packages/db-postgres/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,7 @@ export function postgresAdapter(args: Args): DatabaseAdapterObj<PostgresAdapter>
182182
findGlobalVersions,
183183
findOne,
184184
findVersions,
185+
foreignKeys: new Set(),
185186
indexes: new Set<string>(),
186187
init,
187188
insert,

packages/db-sqlite/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,7 @@ export function sqliteAdapter(args: Args): DatabaseAdapterObj<SQLiteAdapter> {
169169
findGlobalVersions,
170170
findOne,
171171
findVersions,
172+
foreignKeys: new Set(),
172173
indexes: new Set<string>(),
173174
init,
174175
insert,

packages/db-vercel-postgres/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ export function vercelPostgresAdapter(args: Args = {}): DatabaseAdapterObj<Verce
111111
},
112112
fieldConstraints: {},
113113
forceUseVercelPostgres: args.forceUseVercelPostgres ?? false,
114+
foreignKeys: new Set(),
114115
generateSchema: createSchemaGenerator({
115116
columnToCodeConverter,
116117
corePackageSuffix: 'pg-core',

packages/drizzle/src/schema/build.ts

Lines changed: 43 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import type {
1616
} from '../types.js'
1717

1818
import { createTableName } from '../createTableName.js'
19+
import { buildForeignKeyName } from '../utilities/buildForeignKeyName.js'
1920
import { buildIndexName } from '../utilities/buildIndexName.js'
2021
import { traverseFields } from './traverseFields.js'
2122

@@ -187,6 +188,8 @@ export const buildTable = ({
187188

188189
if (hasLocalizedField || localizedRelations.size) {
189190
const localeTableName = `${tableName}${adapter.localesSuffix}`
191+
adapter.rawTables[localeTableName] = localesTable
192+
190193
localesColumns.id = {
191194
name: 'id',
192195
type: 'serial',
@@ -207,7 +210,11 @@ export const buildTable = ({
207210
}
208211

209212
localesIndexes._localeParent = {
210-
name: `${localeTableName}_locale_parent_id_unique`,
213+
name: buildIndexName({
214+
name: `${localeTableName}_locale_parent_id_unique`,
215+
adapter,
216+
appendSuffix: false,
217+
}),
211218
on: ['_locale', '_parentID'],
212219
unique: true,
213220
}
@@ -217,7 +224,7 @@ export const buildTable = ({
217224
columns: localesColumns,
218225
foreignKeys: {
219226
_parentIdFk: {
220-
name: `${localeTableName}_parent_id_fk`,
227+
name: buildForeignKeyName({ name: `${localeTableName}_parent_id`, adapter }),
221228
columns: ['_parentID'],
222229
foreignColumns: [
223230
{
@@ -332,6 +339,7 @@ export const buildTable = ({
332339
if (isRoot) {
333340
if (hasManyTextField) {
334341
const textsTableName = `${rootTableName}_texts`
342+
adapter.rawTables[textsTableName] = textsTable
335343

336344
const columns: Record<string, RawColumn> = {
337345
id: {
@@ -371,21 +379,29 @@ export const buildTable = ({
371379

372380
const textsTableIndexes: Record<string, RawIndex> = {
373381
orderParentIdx: {
374-
name: `${textsTableName}_order_parent_idx`,
382+
name: buildIndexName({
383+
name: `${textsTableName}_order_parent`,
384+
adapter,
385+
appendSuffix: false,
386+
}),
375387
on: ['order', 'parent'],
376388
},
377389
}
378390

379391
if (hasManyTextField === 'index') {
380392
textsTableIndexes.text_idx = {
381-
name: `${textsTableName}_text_idx`,
393+
name: buildIndexName({ name: `${textsTableName}_text`, adapter }),
382394
on: 'text',
383395
}
384396
}
385397

386398
if (hasLocalizedManyTextField) {
387399
textsTableIndexes.localeParent = {
388-
name: `${textsTableName}_locale_parent`,
400+
name: buildIndexName({
401+
name: `${textsTableName}_locale_parent`,
402+
adapter,
403+
appendSuffix: false,
404+
}),
389405
on: ['locale', 'parent'],
390406
}
391407
}
@@ -395,7 +411,7 @@ export const buildTable = ({
395411
columns,
396412
foreignKeys: {
397413
parentFk: {
398-
name: `${textsTableName}_parent_fk`,
414+
name: buildForeignKeyName({ name: `${textsTableName}_parent`, adapter }),
399415
columns: ['parent'],
400416
foreignColumns: [
401417
{
@@ -429,6 +445,7 @@ export const buildTable = ({
429445

430446
if (hasManyNumberField) {
431447
const numbersTableName = `${rootTableName}_numbers`
448+
adapter.rawTables[numbersTableName] = numbersTable
432449
const columns: Record<string, RawColumn> = {
433450
id: {
434451
name: 'id',
@@ -465,19 +482,26 @@ export const buildTable = ({
465482
}
466483

467484
const numbersTableIndexes: Record<string, RawIndex> = {
468-
orderParentIdx: { name: `${numbersTableName}_order_parent_idx`, on: ['order', 'parent'] },
485+
orderParentIdx: {
486+
name: buildIndexName({ name: `${numbersTableName}_order_parent`, adapter }),
487+
on: ['order', 'parent'],
488+
},
469489
}
470490

471491
if (hasManyNumberField === 'index') {
472492
numbersTableIndexes.numberIdx = {
473-
name: `${numbersTableName}_number_idx`,
493+
name: buildIndexName({ name: `${numbersTableName}_number`, adapter }),
474494
on: 'number',
475495
}
476496
}
477497

478498
if (hasLocalizedManyNumberField) {
479499
numbersTableIndexes.localeParent = {
480-
name: `${numbersTableName}_locale_parent`,
500+
name: buildIndexName({
501+
name: `${numbersTableName}_locale_parent`,
502+
adapter,
503+
appendSuffix: false,
504+
}),
481505
on: ['locale', 'parent'],
482506
}
483507
}
@@ -487,7 +511,7 @@ export const buildTable = ({
487511
columns,
488512
foreignKeys: {
489513
parentFk: {
490-
name: `${numbersTableName}_parent_fk`,
514+
name: buildForeignKeyName({ name: `${numbersTableName}_parent`, adapter }),
491515
columns: ['parent'],
492516
foreignColumns: [
493517
{
@@ -554,29 +578,29 @@ export const buildTable = ({
554578

555579
const relationshipIndexes: Record<string, RawIndex> = {
556580
order: {
557-
name: `${relationshipsTableName}_order_idx`,
581+
name: buildIndexName({ name: `${relationshipsTableName}_order`, adapter }),
558582
on: 'order',
559583
},
560584
parentIdx: {
561-
name: `${relationshipsTableName}_parent_idx`,
585+
name: buildIndexName({ name: `${relationshipsTableName}_parent`, adapter }),
562586
on: 'parent',
563587
},
564588
pathIdx: {
565-
name: `${relationshipsTableName}_path_idx`,
589+
name: buildIndexName({ name: `${relationshipsTableName}_path`, adapter }),
566590
on: 'path',
567591
},
568592
}
569593

570594
if (hasLocalizedRelationshipField) {
571595
relationshipIndexes.localeIdx = {
572-
name: `${relationshipsTableName}_locale_idx`,
596+
name: buildIndexName({ name: `${relationshipsTableName}_locale`, adapter }),
573597
on: 'locale',
574598
}
575599
}
576600

577601
const relationshipForeignKeys: Record<string, RawForeignKey> = {
578602
parentFk: {
579-
name: `${relationshipsTableName}_parent_fk`,
603+
name: buildIndexName({ name: `${relationshipsTableName}_parent`, adapter }),
580604
columns: ['parent'],
581605
foreignColumns: [
582606
{
@@ -615,7 +639,10 @@ export const buildTable = ({
615639
}
616640

617641
relationshipForeignKeys[`${relationTo}IdFk`] = {
618-
name: `${relationshipsTableName}_${toSnakeCase(relationTo)}_fk`,
642+
name: buildForeignKeyName({
643+
name: `${relationshipsTableName}_${toSnakeCase(relationTo)}`,
644+
adapter,
645+
}),
619646
columns: [colName],
620647
foreignColumns: [
621648
{

packages/drizzle/src/schema/buildRawSchema.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import toSnakeCase from 'to-snake-case'
88
import type { DrizzleAdapter, RawIndex, SetColumnID } from '../types.js'
99

1010
import { createTableName } from '../createTableName.js'
11+
import { buildIndexName } from '../utilities/buildIndexName.js'
1112
import { buildTable } from './build.js'
1213

1314
/**
@@ -21,6 +22,7 @@ export const buildRawSchema = ({
2122
setColumnID: SetColumnID
2223
}) => {
2324
adapter.indexes = new Set()
25+
adapter.foreignKeys = new Set()
2426

2527
adapter.payload.config.collections.forEach((collection) => {
2628
createTableName({
@@ -45,7 +47,7 @@ export const buildRawSchema = ({
4547
const baseIndexes: Record<string, RawIndex> = {}
4648

4749
if (collection.upload.filenameCompoundIndex) {
48-
const indexName = `${tableName}_filename_compound_idx`
50+
const indexName = buildIndexName({ name: `${tableName}_filename_compound_idx`, adapter })
4951

5052
baseIndexes.filename_compound_index = {
5153
name: indexName,

packages/drizzle/src/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,7 @@ export interface DrizzleAdapter extends BaseDatabaseAdapter {
354354
* Used for returning properly formed errors from unique fields
355355
*/
356356
fieldConstraints: Record<string, Record<string, string>>
357+
foreignKeys: Set<string>
357358
idType: 'serial' | 'uuid'
358359
indexes: Set<string>
359360
initializing: Promise<void>
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import type { DrizzleAdapter } from '../types.js'
2+
3+
export const buildForeignKeyName = ({
4+
name,
5+
adapter,
6+
number = 0,
7+
}: {
8+
adapter: DrizzleAdapter
9+
name: string
10+
number?: number
11+
}): string => {
12+
let foreignKeyName = `${name}${number ? `_${number}` : ''}_fk`
13+
14+
if (foreignKeyName.length > 60) {
15+
const suffix = `${number ? `_${number}` : ''}_fk`
16+
foreignKeyName = `${name.slice(0, 60 - suffix.length)}${suffix}`
17+
}
18+
19+
if (!adapter.foreignKeys.has(foreignKeyName)) {
20+
adapter.foreignKeys.add(foreignKeyName)
21+
return foreignKeyName
22+
}
23+
24+
return buildForeignKeyName({
25+
name,
26+
adapter,
27+
number: number + 1,
28+
})
29+
}

packages/drizzle/src/utilities/buildIndexName.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,27 +3,30 @@ import type { DrizzleAdapter } from '../types.js'
33
export const buildIndexName = ({
44
name,
55
adapter,
6+
appendSuffix = true,
67
number = 0,
78
}: {
89
adapter: DrizzleAdapter
10+
appendSuffix?: boolean
911
name: string
1012
number?: number
1113
}): string => {
12-
let indexName = `${name}${number ? `_${number}` : ''}_idx`
14+
let indexName = `${name}${number ? `_${number}` : ''}${appendSuffix ? '_idx' : ''}`
1315

1416
if (indexName.length > 60) {
15-
const suffix = `${number ? `_${number}` : ''}_idx`
17+
const suffix = `${number ? `_${number}` : ''}${appendSuffix ? '_idx' : ''}`
1618
indexName = `${name.slice(0, 60 - suffix.length)}${suffix}`
1719
}
1820

19-
if (!adapter.indexes.has(indexName)) {
21+
if (!adapter.indexes.has(indexName) && !(indexName in adapter.rawTables)) {
2022
adapter.indexes.add(indexName)
2123
return indexName
2224
}
2325

2426
return buildIndexName({
2527
name,
2628
adapter,
29+
appendSuffix,
2730
number: number + 1,
2831
})
2932
}

0 commit comments

Comments
 (0)