@@ -140,7 +140,9 @@ func (og *operationGenerator) tableHasDependencies(
140
140
}
141
141
142
142
// columnRemovalWillDropFKBackingIndexes determines if dropping this column
143
- // will lead to no indexes backing a foreign key.
143
+ // will lead to no indexes backing a foreign key. CockroachDB will consider
144
+ // alternative indexes backing a foreign key if they have the same number of
145
+ // key columns as the FK in any order.
144
146
func (og * operationGenerator ) columnRemovalWillDropFKBackingIndexes (
145
147
ctx context.Context , tx pgx.Tx , tableName * tree.TableName , columName tree.Name ,
146
148
) (bool , error ) {
@@ -218,58 +220,51 @@ WITH
218
220
NOT LIKE '%%_pkey' -- renames would keep the old table name
219
221
)
220
222
),
221
- matching_indexes
223
+ fk_col_counts
222
224
AS (
223
225
SELECT
224
- oid,
225
- index_name,
226
- count(base_ordinal) AS count_base_ordinal,
227
- count(seq_in_index) AS count_seq_in_index
226
+ oid, count(*) AS num_cols
228
227
FROM
229
- fk, valid_indexes
230
- WHERE
231
- storing = 'f'
232
- AND non_unique = 'f'
233
- AND base_col = column_name
228
+ fk
234
229
GROUP BY
235
- ( oid, index_name)
230
+ oid
236
231
),
237
- valid_index_attrib_count
232
+ index_col_counts
238
233
AS (
239
234
SELECT
240
- index_name,
241
- max(seq_in_index) AS max_seq_in_index
235
+ index_name, count(*) AS num_cols
242
236
FROM
243
237
valid_indexes
244
238
WHERE
245
239
storing = 'f'
246
240
GROUP BY
247
241
index_name
248
242
),
249
- valid_fk_count
250
- AS (
251
- SELECT
252
- oid, max(base_ordinal) AS max_base_ordinal
253
- FROM
254
- fk
255
- GROUP BY
256
- fk
257
- ),
258
243
matching_fks
259
244
AS (
260
245
SELECT
261
- DISTINCT f .oid
246
+ fk .oid
262
247
FROM
263
- valid_index_attrib_count AS i,
264
- valid_fk_count AS f,
265
- matching_indexes AS m
248
+ fk
249
+ JOIN valid_indexes
250
+ ON
251
+ fk.base_col = valid_indexes.column_name
252
+ JOIN fk_col_counts
253
+ ON
254
+ fk.oid = fk_col_counts.oid
255
+ JOIN index_col_counts
256
+ ON
257
+ valid_indexes.index_name = index_col_counts.index_name
266
258
WHERE
267
- f.oid = m.oid
268
- AND i.index_name = m.index_name
269
- AND i.max_seq_in_index
270
- = m.count_seq_in_index
271
- AND f.max_base_ordinal
272
- = m.count_base_ordinal
259
+ valid_indexes.storing = 'f'
260
+ AND valid_indexes.non_unique = 'f'
261
+ AND fk_col_counts.num_cols = index_col_counts.num_cols
262
+ GROUP BY
263
+ fk.oid,
264
+ valid_indexes.index_name,
265
+ fk_col_counts.num_cols
266
+ HAVING
267
+ count(*) = fk_col_counts.num_cols
273
268
)
274
269
SELECT
275
270
EXISTS(
@@ -278,7 +273,7 @@ SELECT
278
273
FROM
279
274
fk
280
275
WHERE
281
- oid NOT IN (SELECT oid FROM matching_fks)
276
+ oid NOT IN (SELECT DISTINCT oid FROM matching_fks)
282
277
);
283
278
` , tableName .String (), tableName .String ()), tableName .String (), columName )
284
279
}
0 commit comments