-
-
Notifications
You must be signed in to change notification settings - Fork 108
Expand file tree
/
Copy pathindexes.ts
More file actions
98 lines (91 loc) · 3.19 KB
/
Copy pathindexes.ts
File metadata and controls
98 lines (91 loc) · 3.19 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
import { type } from 'arktype'
import { sql } from 'kysely'
import { createQuery } from '../query'
export const indexesType = type({
schema: 'string',
table: 'string',
name: 'string',
column: 'string',
is_unique: 'boolean | 1 | 0',
is_primary: 'boolean | 1 | 0',
}).pipe(data => ({
...data,
isUnique: !!data.is_unique,
isPrimary: !!data.is_primary,
}))
export const indexesQuery = createQuery({
type: indexesType.array(),
query: () => ({
postgres: db => db
.selectFrom('pg_catalog.pg_class as t')
.innerJoin('pg_catalog.pg_index as ix', 't.oid', 'ix.indrelid')
.innerJoin('pg_catalog.pg_class as i', 'i.oid', 'ix.indexrelid')
.innerJoin('pg_catalog.pg_attribute as a', join => join
.onRef('a.attrelid', '=', 't.oid')
.on(sql<boolean>`a.attnum = ANY(ix.indkey)`))
.innerJoin('pg_catalog.pg_namespace as n', 'n.oid', 't.relnamespace')
.select([
'n.nspname as schema',
't.relname as table',
'i.relname as name',
'a.attname as column',
'ix.indisunique as is_unique',
'ix.indisprimary as is_primary',
])
.where('n.nspname', 'not in', ['pg_catalog', 'information_schema'])
.where('t.relkind', '=', 'r')
.execute(),
mysql: db => db
.selectFrom('information_schema.STATISTICS')
.select([
'TABLE_SCHEMA as schema',
'TABLE_NAME as table',
'INDEX_NAME as name',
'COLUMN_NAME as column',
eb => eb('NON_UNIQUE', '=', 0).as('is_unique'),
eb => eb('INDEX_NAME', '=', 'PRIMARY').as('is_primary'),
])
.where('TABLE_SCHEMA', 'not in', ['mysql', 'information_schema', 'performance_schema', 'sys'])
.execute(),
mssql: db => db
.selectFrom('sys.indexes as i')
.innerJoin('sys.tables as t', 't.object_id', 'i.object_id')
.innerJoin('sys.schemas as s', 's.schema_id', 't.schema_id')
.innerJoin('sys.index_columns as ic', join => join
.onRef('ic.object_id', '=', 'i.object_id')
.onRef('ic.index_id', '=', 'i.index_id'))
.innerJoin('sys.columns as c', join => join
.onRef('c.object_id', '=', 'ic.object_id')
.onRef('c.column_id', '=', 'ic.column_id'))
.select([
's.name as schema',
't.name as table',
'i.name as name',
'c.name as column',
'i.is_unique as is_unique',
'i.is_primary_key as is_primary',
])
.execute(),
clickhouse: async (db) => {
/* ClickHouse uses ORDER BY as its primary key/sorting key (similar to clustered index).
It doesn't enforce constraints like traditional RDBMS (no foreign keys, unique constraints, etc.).
We show ORDER BY columns as primary key indexes since that's how ClickHouse optimizes queries. */
const query = await db
.selectFrom('system.columns')
.select([
'database as schema',
'table',
'name as column',
])
.where('is_in_primary_key', '=', 1)
.where('database', 'not in', ['system', 'information_schema'])
.execute()
return query.map(row => ({
...row,
name: 'primary_key',
is_unique: true,
is_primary: true,
}))
},
}),
})