@anthonyalayo/drizzle-kit 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (161) hide show
  1. package/.gitignore +25 -0
  2. package/README.md +79 -0
  3. package/build.dev.ts +51 -0
  4. package/build.ts +112 -0
  5. package/imports-checker/analyze.ts +78 -0
  6. package/imports-checker/checker.ts +296 -0
  7. package/imports-checker/grammar/grammar.ohm +121 -0
  8. package/imports-checker/grammar/grammar.ohm-bundle.d.ts +164 -0
  9. package/imports-checker/grammar/grammar.ohm-bundle.js +753 -0
  10. package/imports-checker/index.ts +48 -0
  11. package/package.json +142 -0
  12. package/patches/difflib@0.2.4.patch +31 -0
  13. package/src/@types/utils.ts +58 -0
  14. package/src/api.ts +504 -0
  15. package/src/cli/commands/_es5.ts +2 -0
  16. package/src/cli/commands/check.ts +52 -0
  17. package/src/cli/commands/drop.ts +60 -0
  18. package/src/cli/commands/introspect.ts +772 -0
  19. package/src/cli/commands/libSqlPushUtils.ts +355 -0
  20. package/src/cli/commands/migrate.ts +1526 -0
  21. package/src/cli/commands/mysqlIntrospect.ts +53 -0
  22. package/src/cli/commands/mysqlPushUtils.ts +352 -0
  23. package/src/cli/commands/mysqlUp.ts +102 -0
  24. package/src/cli/commands/pgIntrospect.ts +55 -0
  25. package/src/cli/commands/pgPushUtils.ts +269 -0
  26. package/src/cli/commands/pgUp.ts +217 -0
  27. package/src/cli/commands/push.ts +637 -0
  28. package/src/cli/commands/singlestoreIntrospect.ts +53 -0
  29. package/src/cli/commands/singlestorePushUtils.ts +456 -0
  30. package/src/cli/commands/singlestoreUp.ts +1 -0
  31. package/src/cli/commands/sqliteIntrospect.ts +96 -0
  32. package/src/cli/commands/sqlitePushUtils.ts +322 -0
  33. package/src/cli/commands/sqliteUp.ts +52 -0
  34. package/src/cli/commands/utils.ts +858 -0
  35. package/src/cli/connections.ts +914 -0
  36. package/src/cli/index.ts +48 -0
  37. package/src/cli/schema.ts +794 -0
  38. package/src/cli/selector-ui.ts +38 -0
  39. package/src/cli/utils.ts +112 -0
  40. package/src/cli/validations/cli.ts +79 -0
  41. package/src/cli/validations/common.ts +193 -0
  42. package/src/cli/validations/libsql.ts +27 -0
  43. package/src/cli/validations/mysql.ts +61 -0
  44. package/src/cli/validations/outputs.ts +91 -0
  45. package/src/cli/validations/postgres.ts +83 -0
  46. package/src/cli/validations/singlestore.ts +61 -0
  47. package/src/cli/validations/sqlite.ts +104 -0
  48. package/src/cli/validations/studio.ts +24 -0
  49. package/src/cli/views.ts +658 -0
  50. package/src/extensions/getTablesFilterByExtensions.ts +16 -0
  51. package/src/extensions/vector.ts +10 -0
  52. package/src/global.ts +61 -0
  53. package/src/index.ts +326 -0
  54. package/src/introspect-mysql.ts +1030 -0
  55. package/src/introspect-pg.ts +1435 -0
  56. package/src/introspect-singlestore.ts +913 -0
  57. package/src/introspect-sqlite.ts +533 -0
  58. package/src/jsonDiffer.js +882 -0
  59. package/src/jsonStatements.ts +3590 -0
  60. package/src/loader.mjs +57 -0
  61. package/src/migrationPreparator.ts +217 -0
  62. package/src/schemaValidator.ts +23 -0
  63. package/src/serializer/index.ts +142 -0
  64. package/src/serializer/mysqlImports.ts +38 -0
  65. package/src/serializer/mysqlSchema.ts +423 -0
  66. package/src/serializer/mysqlSerializer.ts +999 -0
  67. package/src/serializer/pgImports.ts +106 -0
  68. package/src/serializer/pgSchema.ts +937 -0
  69. package/src/serializer/pgSerializer.ts +2223 -0
  70. package/src/serializer/singlestoreImports.ts +38 -0
  71. package/src/serializer/singlestoreSchema.ts +257 -0
  72. package/src/serializer/singlestoreSerializer.ts +767 -0
  73. package/src/serializer/sqliteImports.ts +41 -0
  74. package/src/serializer/sqliteSchema.ts +352 -0
  75. package/src/serializer/sqliteSerializer.ts +931 -0
  76. package/src/serializer/studio.ts +694 -0
  77. package/src/serializer/utils.ts +45 -0
  78. package/src/simulator.ts +157 -0
  79. package/src/snapshotsDiffer.ts +4398 -0
  80. package/src/sqlgenerator.ts +4212 -0
  81. package/src/statementCombiner.ts +597 -0
  82. package/src/utils/certs.ts +44 -0
  83. package/src/utils/words.ts +1333 -0
  84. package/src/utils.ts +370 -0
  85. package/tests/bin.test.ts +58 -0
  86. package/tests/cli/d1http.config.ts +12 -0
  87. package/tests/cli/drizzle.config.ts +9 -0
  88. package/tests/cli/durable-sqlite.config.ts +7 -0
  89. package/tests/cli/expo.config.ts +7 -0
  90. package/tests/cli/postgres.config.ts +13 -0
  91. package/tests/cli/postgres2.config.ts +17 -0
  92. package/tests/cli/schema.ts +1 -0
  93. package/tests/cli/turso.config.ts +10 -0
  94. package/tests/cli-export.test.ts +79 -0
  95. package/tests/cli-generate.test.ts +259 -0
  96. package/tests/cli-migrate.test.ts +103 -0
  97. package/tests/cli-push.test.ts +126 -0
  98. package/tests/common.ts +15 -0
  99. package/tests/indexes/common.ts +21 -0
  100. package/tests/indexes/pg.test.ts +245 -0
  101. package/tests/introspect/libsql.test.ts +35 -0
  102. package/tests/introspect/mysql.test.ts +319 -0
  103. package/tests/introspect/pg.test.ts +894 -0
  104. package/tests/introspect/singlestore.test.ts +275 -0
  105. package/tests/introspect/sqlite.test.ts +122 -0
  106. package/tests/libsql-checks.test.ts +308 -0
  107. package/tests/libsql-statements.test.ts +989 -0
  108. package/tests/libsql-views.test.ts +218 -0
  109. package/tests/migrate/libsq-schema.ts +6 -0
  110. package/tests/migrate/libsql-migrate.test.ts +58 -0
  111. package/tests/migrate/migrations/0000_little_blizzard.sql +4 -0
  112. package/tests/migrate/migrations/0001_nebulous_storm.sql +10 -0
  113. package/tests/migrate/migrations/meta/0000_snapshot.json +40 -0
  114. package/tests/migrate/migrations/meta/0001_snapshot.json +40 -0
  115. package/tests/migrate/migrations/meta/_journal.json +20 -0
  116. package/tests/mysql-checks.test.ts +291 -0
  117. package/tests/mysql-generated.test.ts +1290 -0
  118. package/tests/mysql-schemas.test.ts +156 -0
  119. package/tests/mysql-views.test.ts +553 -0
  120. package/tests/mysql.test.ts +863 -0
  121. package/tests/pg-array.test.ts +368 -0
  122. package/tests/pg-checks.test.ts +329 -0
  123. package/tests/pg-columns.test.ts +484 -0
  124. package/tests/pg-domains.test.ts +306 -0
  125. package/tests/pg-enums.test.ts +751 -0
  126. package/tests/pg-generated.test.ts +529 -0
  127. package/tests/pg-identity.test.ts +447 -0
  128. package/tests/pg-schemas.test.ts +105 -0
  129. package/tests/pg-sequences.test.ts +298 -0
  130. package/tests/pg-tables.test.ts +1021 -0
  131. package/tests/pg-views.test.ts +1929 -0
  132. package/tests/push/common.ts +58 -0
  133. package/tests/push/libsql.test.ts +1400 -0
  134. package/tests/push/mysql-push.test.ts +345 -0
  135. package/tests/push/mysql.test.ts +788 -0
  136. package/tests/push/pg.test.ts +4341 -0
  137. package/tests/push/singlestore-push.test.ts +894 -0
  138. package/tests/push/singlestore.test.ts +444 -0
  139. package/tests/push/sqlite.test.ts +1613 -0
  140. package/tests/rls/pg-policy.test.ts +1656 -0
  141. package/tests/rls/pg-role.test.ts +234 -0
  142. package/tests/schemaDiffer.ts +2852 -0
  143. package/tests/singlestore-generated.test.ts +1290 -0
  144. package/tests/singlestore-schemas.test.ts +155 -0
  145. package/tests/singlestore.test.ts +978 -0
  146. package/tests/sqlite-checks.test.ts +308 -0
  147. package/tests/sqlite-columns.test.ts +1049 -0
  148. package/tests/sqlite-generated.test.ts +1726 -0
  149. package/tests/sqlite-tables.test.ts +637 -0
  150. package/tests/sqlite-views.test.ts +218 -0
  151. package/tests/statements-combiner/libsql-statements-combiner.test.ts +1812 -0
  152. package/tests/statements-combiner/singlestore-statements-combiner.test.ts +882 -0
  153. package/tests/statements-combiner/sqlite-statements-combiner.test.ts +1211 -0
  154. package/tests/test/sqlite.test.ts +39 -0
  155. package/tests/testsinglestore.ts +29 -0
  156. package/tests/validations.test.ts +869 -0
  157. package/tests/wrap-param.test.ts +16 -0
  158. package/tsconfig.build.json +4 -0
  159. package/tsconfig.cli-types.json +9 -0
  160. package/tsconfig.json +28 -0
  161. package/vitest.config.ts +34 -0
@@ -0,0 +1,529 @@
1
+ // test cases
2
+
3
+ import { SQL, sql } from 'drizzle-orm';
4
+ import { integer, pgTable, text } from 'drizzle-orm/pg-core';
5
+ import { expect, test } from 'vitest';
6
+ import { diffTestSchemas } from './schemaDiffer';
7
+
8
+ test('generated as callback: add column with generated constraint', async () => {
9
+ const from = {
10
+ users: pgTable('users', {
11
+ id: integer('id'),
12
+ id2: integer('id2'),
13
+ name: text('name'),
14
+ }),
15
+ };
16
+ const to = {
17
+ users: pgTable('users', {
18
+ id: integer('id'),
19
+ id2: integer('id2'),
20
+ name: text('name'),
21
+ generatedName: text('gen_name').generatedAlwaysAs(
22
+ (): SQL => sql`${to.users.name} || 'hello'`,
23
+ ),
24
+ }),
25
+ };
26
+
27
+ const { statements, sqlStatements } = await diffTestSchemas(from, to, []);
28
+
29
+ expect(statements).toStrictEqual([
30
+ {
31
+ column: {
32
+ generated: {
33
+ as: '"users"."name" || \'hello\'',
34
+ type: 'stored',
35
+ },
36
+ name: 'gen_name',
37
+ notNull: false,
38
+ primaryKey: false,
39
+ type: 'text',
40
+ },
41
+ schema: '',
42
+ tableName: 'users',
43
+ type: 'alter_table_add_column',
44
+ },
45
+ ]);
46
+ expect(sqlStatements).toStrictEqual([
47
+ `ALTER TABLE "users" ADD COLUMN "gen_name" text GENERATED ALWAYS AS (\"users\".\"name\" || 'hello') STORED;`,
48
+ ]);
49
+ });
50
+
51
+ test('generated as callback: add generated constraint to an exisiting column', async () => {
52
+ const from = {
53
+ users: pgTable('users', {
54
+ id: integer('id'),
55
+ id2: integer('id2'),
56
+ name: text('name'),
57
+ generatedName: text('gen_name').notNull(),
58
+ }),
59
+ };
60
+ const to = {
61
+ users: pgTable('users', {
62
+ id: integer('id'),
63
+ id2: integer('id2'),
64
+ name: text('name'),
65
+ generatedName: text('gen_name')
66
+ .notNull()
67
+ .generatedAlwaysAs((): SQL => sql`${from.users.name} || 'to add'`),
68
+ }),
69
+ };
70
+
71
+ const { statements, sqlStatements } = await diffTestSchemas(from, to, []);
72
+
73
+ expect(statements).toStrictEqual([
74
+ {
75
+ columnAutoIncrement: undefined,
76
+ columnDefault: undefined,
77
+ columnGenerated: { as: '"users"."name" || \'to add\'', type: 'stored' },
78
+ columnName: 'gen_name',
79
+ columnNotNull: true,
80
+ columnOnUpdate: undefined,
81
+ columnPk: false,
82
+ newDataType: 'text',
83
+ schema: '',
84
+ tableName: 'users',
85
+ type: 'alter_table_alter_column_set_generated',
86
+ },
87
+ ]);
88
+ expect(sqlStatements).toStrictEqual([
89
+ 'ALTER TABLE "users" drop column "gen_name";',
90
+ 'ALTER TABLE "users" ADD COLUMN "gen_name" text GENERATED ALWAYS AS ("users"."name" || \'to add\') STORED NOT NULL;',
91
+ ]);
92
+ });
93
+
94
+ test('generated as callback: drop generated constraint', async () => {
95
+ const from = {
96
+ users: pgTable('users', {
97
+ id: integer('id'),
98
+ id2: integer('id2'),
99
+ name: text('name'),
100
+ generatedName: text('gen_name').generatedAlwaysAs(
101
+ (): SQL => sql`${from.users.name} || 'to delete'`,
102
+ ),
103
+ }),
104
+ };
105
+ const to = {
106
+ users: pgTable('users', {
107
+ id: integer('id'),
108
+ id2: integer('id2'),
109
+ name: text('name'),
110
+ generatedName1: text('gen_name'),
111
+ }),
112
+ };
113
+
114
+ const { statements, sqlStatements } = await diffTestSchemas(from, to, []);
115
+
116
+ expect(statements).toStrictEqual([
117
+ {
118
+ columnAutoIncrement: undefined,
119
+ columnDefault: undefined,
120
+ columnGenerated: undefined,
121
+ columnName: 'gen_name',
122
+ columnNotNull: false,
123
+ columnOnUpdate: undefined,
124
+ columnPk: false,
125
+ newDataType: 'text',
126
+ schema: '',
127
+ tableName: 'users',
128
+ type: 'alter_table_alter_column_drop_generated',
129
+ },
130
+ ]);
131
+ expect(sqlStatements).toStrictEqual([
132
+ `ALTER TABLE \"users\" ALTER COLUMN \"gen_name\" DROP EXPRESSION;`,
133
+ ]);
134
+ });
135
+
136
+ test('generated as callback: change generated constraint', async () => {
137
+ const from = {
138
+ users: pgTable('users', {
139
+ id: integer('id'),
140
+ id2: integer('id2'),
141
+ name: text('name'),
142
+ generatedName: text('gen_name').generatedAlwaysAs(
143
+ (): SQL => sql`${from.users.name}`,
144
+ ),
145
+ }),
146
+ };
147
+ const to = {
148
+ users: pgTable('users', {
149
+ id: integer('id'),
150
+ id2: integer('id2'),
151
+ name: text('name'),
152
+ generatedName: text('gen_name').generatedAlwaysAs(
153
+ (): SQL => sql`${to.users.name} || 'hello'`,
154
+ ),
155
+ }),
156
+ };
157
+
158
+ const { statements, sqlStatements } = await diffTestSchemas(from, to, []);
159
+
160
+ expect(statements).toStrictEqual([
161
+ {
162
+ columnAutoIncrement: undefined,
163
+ columnDefault: undefined,
164
+ columnGenerated: { as: '"users"."name" || \'hello\'', type: 'stored' },
165
+ columnName: 'gen_name',
166
+ columnNotNull: false,
167
+ columnOnUpdate: undefined,
168
+ columnPk: false,
169
+ newDataType: 'text',
170
+ schema: '',
171
+ tableName: 'users',
172
+ type: 'alter_table_alter_column_alter_generated',
173
+ },
174
+ ]);
175
+ expect(sqlStatements).toStrictEqual([
176
+ 'ALTER TABLE "users" drop column "gen_name";',
177
+ 'ALTER TABLE "users" ADD COLUMN "gen_name" text GENERATED ALWAYS AS ("users"."name" || \'hello\') STORED;',
178
+ ]);
179
+ });
180
+
181
+ // ---
182
+
183
+ test('generated as sql: add column with generated constraint', async () => {
184
+ const from = {
185
+ users: pgTable('users', {
186
+ id: integer('id'),
187
+ id2: integer('id2'),
188
+ name: text('name'),
189
+ }),
190
+ };
191
+ const to = {
192
+ users: pgTable('users', {
193
+ id: integer('id'),
194
+ id2: integer('id2'),
195
+ name: text('name'),
196
+ generatedName: text('gen_name').generatedAlwaysAs(
197
+ sql`\"users\".\"name\" || 'hello'`,
198
+ ),
199
+ }),
200
+ };
201
+
202
+ const { statements, sqlStatements } = await diffTestSchemas(from, to, []);
203
+
204
+ expect(statements).toStrictEqual([
205
+ {
206
+ column: {
207
+ generated: {
208
+ as: '"users"."name" || \'hello\'',
209
+ type: 'stored',
210
+ },
211
+ name: 'gen_name',
212
+ notNull: false,
213
+ primaryKey: false,
214
+ type: 'text',
215
+ },
216
+ schema: '',
217
+ tableName: 'users',
218
+ type: 'alter_table_add_column',
219
+ },
220
+ ]);
221
+ expect(sqlStatements).toStrictEqual([
222
+ `ALTER TABLE "users" ADD COLUMN "gen_name" text GENERATED ALWAYS AS (\"users\".\"name\" || 'hello') STORED;`,
223
+ ]);
224
+ });
225
+
226
+ test('generated as sql: add generated constraint to an exisiting column', async () => {
227
+ const from = {
228
+ users: pgTable('users', {
229
+ id: integer('id'),
230
+ id2: integer('id2'),
231
+ name: text('name'),
232
+ generatedName: text('gen_name').notNull(),
233
+ }),
234
+ };
235
+ const to = {
236
+ users: pgTable('users', {
237
+ id: integer('id'),
238
+ id2: integer('id2'),
239
+ name: text('name'),
240
+ generatedName: text('gen_name')
241
+ .notNull()
242
+ .generatedAlwaysAs(sql`\"users\".\"name\" || 'to add'`),
243
+ }),
244
+ };
245
+
246
+ const { statements, sqlStatements } = await diffTestSchemas(from, to, []);
247
+
248
+ expect(statements).toStrictEqual([
249
+ {
250
+ columnAutoIncrement: undefined,
251
+ columnDefault: undefined,
252
+ columnGenerated: { as: '"users"."name" || \'to add\'', type: 'stored' },
253
+ columnName: 'gen_name',
254
+ columnNotNull: true,
255
+ columnOnUpdate: undefined,
256
+ columnPk: false,
257
+ newDataType: 'text',
258
+ schema: '',
259
+ tableName: 'users',
260
+ type: 'alter_table_alter_column_set_generated',
261
+ },
262
+ ]);
263
+ expect(sqlStatements).toStrictEqual([
264
+ 'ALTER TABLE "users" drop column "gen_name";',
265
+ 'ALTER TABLE "users" ADD COLUMN "gen_name" text GENERATED ALWAYS AS ("users"."name" || \'to add\') STORED NOT NULL;',
266
+ ]);
267
+ });
268
+
269
+ test('generated as sql: drop generated constraint', async () => {
270
+ const from = {
271
+ users: pgTable('users', {
272
+ id: integer('id'),
273
+ id2: integer('id2'),
274
+ name: text('name'),
275
+ generatedName: text('gen_name').generatedAlwaysAs(
276
+ sql`\"users\".\"name\" || 'to delete'`,
277
+ ),
278
+ }),
279
+ };
280
+ const to = {
281
+ users: pgTable('users', {
282
+ id: integer('id'),
283
+ id2: integer('id2'),
284
+ name: text('name'),
285
+ generatedName1: text('gen_name'),
286
+ }),
287
+ };
288
+
289
+ const { statements, sqlStatements } = await diffTestSchemas(from, to, []);
290
+
291
+ expect(statements).toStrictEqual([
292
+ {
293
+ columnAutoIncrement: undefined,
294
+ columnDefault: undefined,
295
+ columnGenerated: undefined,
296
+ columnName: 'gen_name',
297
+ columnNotNull: false,
298
+ columnOnUpdate: undefined,
299
+ columnPk: false,
300
+ newDataType: 'text',
301
+ schema: '',
302
+ tableName: 'users',
303
+ type: 'alter_table_alter_column_drop_generated',
304
+ },
305
+ ]);
306
+ expect(sqlStatements).toStrictEqual([
307
+ `ALTER TABLE \"users\" ALTER COLUMN \"gen_name\" DROP EXPRESSION;`,
308
+ ]);
309
+ });
310
+
311
+ test('generated as sql: change generated constraint', async () => {
312
+ const from = {
313
+ users: pgTable('users', {
314
+ id: integer('id'),
315
+ id2: integer('id2'),
316
+ name: text('name'),
317
+ generatedName: text('gen_name').generatedAlwaysAs(
318
+ sql`\"users\".\"name\"`,
319
+ ),
320
+ }),
321
+ };
322
+ const to = {
323
+ users: pgTable('users', {
324
+ id: integer('id'),
325
+ id2: integer('id2'),
326
+ name: text('name'),
327
+ generatedName: text('gen_name').generatedAlwaysAs(
328
+ sql`\"users\".\"name\" || 'hello'`,
329
+ ),
330
+ }),
331
+ };
332
+
333
+ const { statements, sqlStatements } = await diffTestSchemas(from, to, []);
334
+
335
+ expect(statements).toStrictEqual([
336
+ {
337
+ columnAutoIncrement: undefined,
338
+ columnDefault: undefined,
339
+ columnGenerated: { as: '"users"."name" || \'hello\'', type: 'stored' },
340
+ columnName: 'gen_name',
341
+ columnNotNull: false,
342
+ columnOnUpdate: undefined,
343
+ columnPk: false,
344
+ newDataType: 'text',
345
+ schema: '',
346
+ tableName: 'users',
347
+ type: 'alter_table_alter_column_alter_generated',
348
+ },
349
+ ]);
350
+ expect(sqlStatements).toStrictEqual([
351
+ 'ALTER TABLE "users" drop column "gen_name";',
352
+ 'ALTER TABLE "users" ADD COLUMN "gen_name" text GENERATED ALWAYS AS ("users"."name" || \'hello\') STORED;',
353
+ ]);
354
+ });
355
+
356
+ // ---
357
+
358
+ test('generated as string: add column with generated constraint', async () => {
359
+ const from = {
360
+ users: pgTable('users', {
361
+ id: integer('id'),
362
+ id2: integer('id2'),
363
+ name: text('name'),
364
+ }),
365
+ };
366
+ const to = {
367
+ users: pgTable('users', {
368
+ id: integer('id'),
369
+ id2: integer('id2'),
370
+ name: text('name'),
371
+ generatedName: text('gen_name').generatedAlwaysAs(
372
+ `\"users\".\"name\" || 'hello'`,
373
+ ),
374
+ }),
375
+ };
376
+
377
+ const { statements, sqlStatements } = await diffTestSchemas(from, to, []);
378
+
379
+ expect(statements).toStrictEqual([
380
+ {
381
+ column: {
382
+ generated: {
383
+ as: '"users"."name" || \'hello\'',
384
+ type: 'stored',
385
+ },
386
+ name: 'gen_name',
387
+ notNull: false,
388
+ primaryKey: false,
389
+ type: 'text',
390
+ },
391
+ schema: '',
392
+ tableName: 'users',
393
+ type: 'alter_table_add_column',
394
+ },
395
+ ]);
396
+ expect(sqlStatements).toStrictEqual([
397
+ `ALTER TABLE "users" ADD COLUMN "gen_name" text GENERATED ALWAYS AS (\"users\".\"name\" || 'hello') STORED;`,
398
+ ]);
399
+ });
400
+
401
+ test('generated as string: add generated constraint to an exisiting column', async () => {
402
+ const from = {
403
+ users: pgTable('users', {
404
+ id: integer('id'),
405
+ id2: integer('id2'),
406
+ name: text('name'),
407
+ generatedName: text('gen_name').notNull(),
408
+ }),
409
+ };
410
+ const to = {
411
+ users: pgTable('users', {
412
+ id: integer('id'),
413
+ id2: integer('id2'),
414
+ name: text('name'),
415
+ generatedName: text('gen_name')
416
+ .notNull()
417
+ .generatedAlwaysAs(`\"users\".\"name\" || 'to add'`),
418
+ }),
419
+ };
420
+
421
+ const { statements, sqlStatements } = await diffTestSchemas(from, to, []);
422
+
423
+ expect(statements).toStrictEqual([
424
+ {
425
+ columnAutoIncrement: undefined,
426
+ columnDefault: undefined,
427
+ columnGenerated: { as: '"users"."name" || \'to add\'', type: 'stored' },
428
+ columnName: 'gen_name',
429
+ columnNotNull: true,
430
+ columnOnUpdate: undefined,
431
+ columnPk: false,
432
+ newDataType: 'text',
433
+ schema: '',
434
+ tableName: 'users',
435
+ type: 'alter_table_alter_column_set_generated',
436
+ },
437
+ ]);
438
+ expect(sqlStatements).toStrictEqual([
439
+ 'ALTER TABLE "users" drop column "gen_name";',
440
+ 'ALTER TABLE "users" ADD COLUMN "gen_name" text GENERATED ALWAYS AS ("users"."name" || \'to add\') STORED NOT NULL;',
441
+ ]);
442
+ });
443
+
444
+ test('generated as string: drop generated constraint', async () => {
445
+ const from = {
446
+ users: pgTable('users', {
447
+ id: integer('id'),
448
+ id2: integer('id2'),
449
+ name: text('name'),
450
+ generatedName: text('gen_name').generatedAlwaysAs(
451
+ `\"users\".\"name\" || 'to delete'`,
452
+ ),
453
+ }),
454
+ };
455
+ const to = {
456
+ users: pgTable('users', {
457
+ id: integer('id'),
458
+ id2: integer('id2'),
459
+ name: text('name'),
460
+ generatedName1: text('gen_name'),
461
+ }),
462
+ };
463
+
464
+ const { statements, sqlStatements } = await diffTestSchemas(from, to, []);
465
+
466
+ expect(statements).toStrictEqual([
467
+ {
468
+ columnAutoIncrement: undefined,
469
+ columnDefault: undefined,
470
+ columnGenerated: undefined,
471
+ columnName: 'gen_name',
472
+ columnNotNull: false,
473
+ columnOnUpdate: undefined,
474
+ columnPk: false,
475
+ newDataType: 'text',
476
+ schema: '',
477
+ tableName: 'users',
478
+ type: 'alter_table_alter_column_drop_generated',
479
+ },
480
+ ]);
481
+ expect(sqlStatements).toStrictEqual([
482
+ `ALTER TABLE \"users\" ALTER COLUMN \"gen_name\" DROP EXPRESSION;`,
483
+ ]);
484
+ });
485
+
486
+ test('generated as string: change generated constraint', async () => {
487
+ const from = {
488
+ users: pgTable('users', {
489
+ id: integer('id'),
490
+ id2: integer('id2'),
491
+ name: text('name'),
492
+ generatedName: text('gen_name').generatedAlwaysAs(
493
+ (): SQL => sql`${from.users.name}`,
494
+ ),
495
+ }),
496
+ };
497
+ const to = {
498
+ users: pgTable('users', {
499
+ id: integer('id'),
500
+ id2: integer('id2'),
501
+ name: text('name'),
502
+ generatedName: text('gen_name').generatedAlwaysAs(
503
+ `\"users\".\"name\" || 'hello'`,
504
+ ),
505
+ }),
506
+ };
507
+
508
+ const { statements, sqlStatements } = await diffTestSchemas(from, to, []);
509
+
510
+ expect(statements).toStrictEqual([
511
+ {
512
+ columnAutoIncrement: undefined,
513
+ columnDefault: undefined,
514
+ columnGenerated: { as: '"users"."name" || \'hello\'', type: 'stored' },
515
+ columnName: 'gen_name',
516
+ columnNotNull: false,
517
+ columnOnUpdate: undefined,
518
+ columnPk: false,
519
+ newDataType: 'text',
520
+ schema: '',
521
+ tableName: 'users',
522
+ type: 'alter_table_alter_column_alter_generated',
523
+ },
524
+ ]);
525
+ expect(sqlStatements).toStrictEqual([
526
+ 'ALTER TABLE "users" drop column "gen_name";',
527
+ 'ALTER TABLE "users" ADD COLUMN "gen_name" text GENERATED ALWAYS AS ("users"."name" || \'hello\') STORED;',
528
+ ]);
529
+ });