-
Notifications
You must be signed in to change notification settings - Fork 180
/
alterColumn.ts
120 lines (96 loc) · 2.74 KB
/
alterColumn.ts
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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
import type { MigrationOptions } from '../../types';
import {
applyTypeAdapters,
escapeValue,
formatLines,
makeComment,
} from '../../utils';
import type { Name, Value } from '../generalTypes';
import { parseSequenceOptions } from '../sequences';
import type { SequenceGeneratedOptions } from './shared';
export interface AlterColumnOptions {
type?: string;
default?: Value;
notNull?: boolean;
allowNull?: boolean;
collation?: string;
using?: string;
comment?: string | null;
/**
* @deprecated use sequenceGenerated
*/
generated?: null | false | SequenceGeneratedOptions;
sequenceGenerated?: null | false | SequenceGeneratedOptions;
}
export type AlterColumn = (
tableName: Name,
columnName: string,
options: AlterColumnOptions
) => string;
export function alterColumn(mOptions: MigrationOptions): AlterColumn {
return (tableName, columnName, options) => {
const {
default: defaultValue,
type,
collation,
using,
notNull,
allowNull,
comment,
} = options;
const sequenceGenerated =
options.sequenceGenerated === undefined
? options.generated
: options.sequenceGenerated;
const actions: string[] = [];
if (defaultValue === null) {
actions.push('DROP DEFAULT');
} else if (defaultValue !== undefined) {
actions.push(`SET DEFAULT ${escapeValue(defaultValue)}`);
}
if (type) {
const typeStr = applyTypeAdapters(type);
const collationStr = collation ? ` COLLATE ${collation}` : '';
const usingStr = using ? ` USING ${using}` : '';
actions.push(`SET DATA TYPE ${typeStr}${collationStr}${usingStr}`);
}
if (notNull) {
actions.push('SET NOT NULL');
} else if (notNull === false || allowNull) {
actions.push('DROP NOT NULL');
}
if (sequenceGenerated !== undefined) {
if (sequenceGenerated) {
const sequenceOptions = parseSequenceOptions(
mOptions.typeShorthands,
sequenceGenerated
).join(' ');
actions.push(
`ADD GENERATED ${sequenceGenerated.precedence} AS IDENTITY${sequenceOptions ? ` (${sequenceOptions})` : ''}`
);
} else {
actions.push('DROP IDENTITY');
}
}
const queries: string[] = [];
if (actions.length > 0) {
const columnsStr = formatLines(
actions,
` ALTER ${mOptions.literal(columnName)} `
);
queries.push(
`ALTER TABLE ${mOptions.literal(tableName)}\n${columnsStr};`
);
}
if (comment !== undefined) {
queries.push(
makeComment(
'COLUMN',
`${mOptions.literal(tableName)}.${mOptions.literal(columnName)}`,
comment
)
);
}
return queries.join('\n');
};
}