@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,1726 @@
1
+ // 1. add stored column to existing table - not supported +
2
+ // 2. add virtual column to existing table - supported +
3
+ // 3. create table with stored/virtual columns(pg, mysql, sqlite)
4
+ // 4. add stored generated to column -> not supported +
5
+ // 5. add virtual generated to column -> supported with drop+add column +
6
+ // 6. drop stored/virtual expression -> supported with drop+add column
7
+ // 7. alter generated expession -> stored not supported, virtual supported
8
+
9
+ import { SQL, sql } from 'drizzle-orm';
10
+ import { int, sqliteTable, text } from 'drizzle-orm/sqlite-core';
11
+ import { expect, test } from 'vitest';
12
+ import { diffTestSchemasSqlite } from './schemaDiffer';
13
+
14
+ // should generate 0 statements + warning/error in console
15
+ test('generated as callback: add column with stored generated constraint', async () => {
16
+ const from = {
17
+ users: sqliteTable('users', {
18
+ id: int('id'),
19
+ id2: int('id2'),
20
+ name: text('name'),
21
+ }),
22
+ };
23
+ const to = {
24
+ users: sqliteTable('users', {
25
+ id: int('id'),
26
+ id2: int('id2'),
27
+ name: text('name'),
28
+ generatedName: text('gen_name').generatedAlwaysAs(
29
+ (): SQL => sql`${to.users.name} || 'hello'`,
30
+ { mode: 'stored' },
31
+ ),
32
+ }),
33
+ };
34
+
35
+ const { statements, sqlStatements } = await diffTestSchemasSqlite(
36
+ from,
37
+ to,
38
+ [],
39
+ );
40
+
41
+ expect(statements).toStrictEqual([]);
42
+ expect(sqlStatements).toStrictEqual([]);
43
+ });
44
+
45
+ test('generated as callback: add column with virtual generated constraint', async () => {
46
+ const from = {
47
+ users: sqliteTable('users', {
48
+ id: int('id'),
49
+ id2: int('id2'),
50
+ name: text('name'),
51
+ }),
52
+ };
53
+ const to = {
54
+ users: sqliteTable('users', {
55
+ id: int('id'),
56
+ id2: int('id2'),
57
+ name: text('name'),
58
+ generatedName: text('gen_name').generatedAlwaysAs(
59
+ (): SQL => sql`${to.users.name} || 'hello'`,
60
+ { mode: 'virtual' },
61
+ ),
62
+ }),
63
+ };
64
+
65
+ const { statements, sqlStatements } = await diffTestSchemasSqlite(
66
+ from,
67
+ to,
68
+ [],
69
+ );
70
+
71
+ expect(statements).toStrictEqual([
72
+ {
73
+ column: {
74
+ generated: {
75
+ as: '("name" || \'hello\')',
76
+ type: 'virtual',
77
+ },
78
+ autoincrement: false,
79
+ name: 'gen_name',
80
+ notNull: false,
81
+ primaryKey: false,
82
+ type: 'text',
83
+ },
84
+ referenceData: undefined,
85
+ tableName: 'users',
86
+ type: 'sqlite_alter_table_add_column',
87
+ },
88
+ ]);
89
+ expect(sqlStatements).toStrictEqual([
90
+ 'ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS ("name" || \'hello\') VIRTUAL;',
91
+ ]);
92
+ });
93
+
94
+ test('generated as callback: add generated constraint to an exisiting column as stored', async () => {
95
+ const from = {
96
+ users: sqliteTable('users', {
97
+ id: int('id'),
98
+ id2: int('id2'),
99
+ name: text('name'),
100
+ generatedName: text('gen_name').notNull(),
101
+ }),
102
+ };
103
+ const to = {
104
+ users: sqliteTable('users', {
105
+ id: int('id'),
106
+ id2: int('id2'),
107
+ name: text('name'),
108
+ generatedName: text('gen_name')
109
+ .notNull()
110
+ .generatedAlwaysAs((): SQL => sql`${from.users.name} || 'to add'`, {
111
+ mode: 'stored',
112
+ }),
113
+ }),
114
+ };
115
+
116
+ const { statements, sqlStatements } = await diffTestSchemasSqlite(
117
+ from,
118
+ to,
119
+ [],
120
+ );
121
+
122
+ expect(statements).toStrictEqual([]);
123
+ expect(sqlStatements).toStrictEqual([]);
124
+ });
125
+
126
+ test('generated as callback: add generated constraint to an exisiting column as virtual', async () => {
127
+ const from = {
128
+ users: sqliteTable('users', {
129
+ id: int('id'),
130
+ id2: int('id2'),
131
+ name: text('name'),
132
+ generatedName: text('gen_name').notNull(),
133
+ }),
134
+ };
135
+ const to = {
136
+ users: sqliteTable('users', {
137
+ id: int('id'),
138
+ id2: int('id2'),
139
+ name: text('name'),
140
+ generatedName: text('gen_name')
141
+ .notNull()
142
+ .generatedAlwaysAs((): SQL => sql`${from.users.name} || 'to add'`, {
143
+ mode: 'virtual',
144
+ }),
145
+ }),
146
+ };
147
+
148
+ const { statements, sqlStatements } = await diffTestSchemasSqlite(
149
+ from,
150
+ to,
151
+ [],
152
+ );
153
+
154
+ expect(statements).toStrictEqual([
155
+ {
156
+ columnAutoIncrement: false,
157
+ columnDefault: undefined,
158
+ columnGenerated: {
159
+ as: '("name" || \'to add\')',
160
+ type: 'virtual',
161
+ },
162
+ columnName: 'gen_name',
163
+ columnNotNull: true,
164
+ columnOnUpdate: undefined,
165
+ columnPk: false,
166
+ newDataType: 'text',
167
+ schema: '',
168
+ tableName: 'users',
169
+ type: 'alter_table_alter_column_set_generated',
170
+ },
171
+ ]);
172
+ expect(sqlStatements).toStrictEqual([
173
+ 'ALTER TABLE `users` DROP COLUMN `gen_name`;',
174
+ 'ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS ("name" || \'to add\') VIRTUAL NOT NULL;',
175
+ ]);
176
+ });
177
+
178
+ test('generated as callback: drop generated constraint as stored', async () => {
179
+ const from = {
180
+ users: sqliteTable('users', {
181
+ id: int('id'),
182
+ id2: int('id2'),
183
+ name: text('name'),
184
+ generatedName: text('gen_name').generatedAlwaysAs(
185
+ (): SQL => sql`${from.users.name} || 'to delete'`,
186
+ { mode: 'stored' },
187
+ ),
188
+ }),
189
+ };
190
+ const to = {
191
+ users: sqliteTable('users', {
192
+ id: int('id'),
193
+ id2: int('id2'),
194
+ name: text('name'),
195
+ generatedName1: text('gen_name'),
196
+ }),
197
+ };
198
+
199
+ const { statements, sqlStatements } = await diffTestSchemasSqlite(
200
+ from,
201
+ to,
202
+ [],
203
+ );
204
+
205
+ expect(statements).toStrictEqual([
206
+ {
207
+ columnAutoIncrement: false,
208
+ columnDefault: undefined,
209
+ columnGenerated: undefined,
210
+ columnName: 'gen_name',
211
+ columnNotNull: false,
212
+ columnOnUpdate: undefined,
213
+ columnPk: false,
214
+ newDataType: 'text',
215
+ schema: '',
216
+ tableName: 'users',
217
+ type: 'alter_table_alter_column_drop_generated',
218
+ },
219
+ ]);
220
+ expect(sqlStatements).toStrictEqual([
221
+ 'ALTER TABLE `users` DROP COLUMN `gen_name`;',
222
+ 'ALTER TABLE `users` ADD `gen_name` text;',
223
+ ]);
224
+ });
225
+
226
+ test('generated as callback: drop generated constraint as virtual', async () => {
227
+ const from = {
228
+ users: sqliteTable('users', {
229
+ id: int('id'),
230
+ id2: int('id2'),
231
+ name: text('name'),
232
+ generatedName: text('gen_name').generatedAlwaysAs(
233
+ (): SQL => sql`${from.users.name} || 'to delete'`,
234
+ { mode: 'virtual' },
235
+ ),
236
+ }),
237
+ };
238
+ const to = {
239
+ users: sqliteTable('users', {
240
+ id: int('id'),
241
+ id2: int('id2'),
242
+ name: text('name'),
243
+ generatedName1: text('gen_name'),
244
+ }),
245
+ };
246
+
247
+ const { statements, sqlStatements } = await diffTestSchemasSqlite(
248
+ from,
249
+ to,
250
+ [],
251
+ );
252
+
253
+ expect(statements).toStrictEqual([
254
+ {
255
+ columnAutoIncrement: false,
256
+ columnDefault: undefined,
257
+ columnGenerated: undefined,
258
+ columnName: 'gen_name',
259
+ columnNotNull: false,
260
+ columnOnUpdate: undefined,
261
+ columnPk: false,
262
+ newDataType: 'text',
263
+ schema: '',
264
+ tableName: 'users',
265
+ type: 'alter_table_alter_column_drop_generated',
266
+ },
267
+ ]);
268
+ expect(sqlStatements).toStrictEqual([
269
+ 'ALTER TABLE `users` DROP COLUMN `gen_name`;',
270
+ 'ALTER TABLE `users` ADD `gen_name` text;',
271
+ ]);
272
+ });
273
+
274
+ // no way to do it
275
+ test('generated as callback: change generated constraint type from virtual to stored', async () => {
276
+ const from = {
277
+ users: sqliteTable('users', {
278
+ id: int('id'),
279
+ id2: int('id2'),
280
+ name: text('name'),
281
+ generatedName: text('gen_name').generatedAlwaysAs(
282
+ (): SQL => sql`${from.users.name}`,
283
+ { mode: 'virtual' },
284
+ ),
285
+ }),
286
+ };
287
+ const to = {
288
+ users: sqliteTable('users', {
289
+ id: int('id'),
290
+ id2: int('id2'),
291
+ name: text('name'),
292
+ generatedName: text('gen_name').generatedAlwaysAs(
293
+ (): SQL => sql`${to.users.name} || 'hello'`,
294
+ { mode: 'stored' },
295
+ ),
296
+ }),
297
+ };
298
+
299
+ const { statements, sqlStatements } = await diffTestSchemasSqlite(
300
+ from,
301
+ to,
302
+ [],
303
+ );
304
+
305
+ expect(statements).toStrictEqual([]);
306
+ expect(sqlStatements).toStrictEqual([]);
307
+ });
308
+
309
+ test('generated as callback: change generated constraint type from stored to virtual', async () => {
310
+ const from = {
311
+ users: sqliteTable('users', {
312
+ id: int('id'),
313
+ id2: int('id2'),
314
+ name: text('name'),
315
+ generatedName: text('gen_name').generatedAlwaysAs(
316
+ (): SQL => sql`${from.users.name}`,
317
+ { mode: 'stored' },
318
+ ),
319
+ }),
320
+ };
321
+ const to = {
322
+ users: sqliteTable('users', {
323
+ id: int('id'),
324
+ id2: int('id2'),
325
+ name: text('name'),
326
+ generatedName: text('gen_name').generatedAlwaysAs(
327
+ (): SQL => sql`${to.users.name} || 'hello'`,
328
+ { mode: 'virtual' },
329
+ ),
330
+ }),
331
+ };
332
+
333
+ const { statements, sqlStatements } = await diffTestSchemasSqlite(
334
+ from,
335
+ to,
336
+ [],
337
+ );
338
+
339
+ expect(statements).toStrictEqual([
340
+ {
341
+ columnAutoIncrement: false,
342
+ columnDefault: undefined,
343
+ columnGenerated: {
344
+ as: '("name" || \'hello\')',
345
+ type: 'virtual',
346
+ },
347
+ columnName: 'gen_name',
348
+ columnNotNull: false,
349
+ columnOnUpdate: undefined,
350
+ columnPk: false,
351
+ newDataType: 'text',
352
+ schema: '',
353
+ tableName: 'users',
354
+ type: 'alter_table_alter_column_alter_generated',
355
+ },
356
+ ]);
357
+ expect(sqlStatements).toStrictEqual([
358
+ 'ALTER TABLE `users` DROP COLUMN `gen_name`;',
359
+ 'ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS ("name" || \'hello\') VIRTUAL;',
360
+ ]);
361
+ });
362
+
363
+ // not supported
364
+ test('generated as callback: change stored generated constraint', async () => {
365
+ const from = {
366
+ users: sqliteTable('users', {
367
+ id: int('id'),
368
+ id2: int('id2'),
369
+ name: text('name'),
370
+ generatedName: text('gen_name').generatedAlwaysAs(
371
+ (): SQL => sql`${from.users.name}`,
372
+ { mode: 'stored' },
373
+ ),
374
+ }),
375
+ };
376
+ const to = {
377
+ users: sqliteTable('users', {
378
+ id: int('id'),
379
+ id2: int('id2'),
380
+ name: text('name'),
381
+ generatedName: text('gen_name').generatedAlwaysAs(
382
+ (): SQL => sql`${to.users.name} || 'hello'`,
383
+ { mode: 'stored' },
384
+ ),
385
+ }),
386
+ };
387
+
388
+ const { statements, sqlStatements } = await diffTestSchemasSqlite(
389
+ from,
390
+ to,
391
+ [],
392
+ );
393
+
394
+ expect(statements).toStrictEqual([]);
395
+ expect(sqlStatements).toStrictEqual([]);
396
+ });
397
+
398
+ test('generated as callback: change virtual generated constraint', async () => {
399
+ const from = {
400
+ users: sqliteTable('users', {
401
+ id: int('id'),
402
+ id2: int('id2'),
403
+ name: text('name'),
404
+ generatedName: text('gen_name').generatedAlwaysAs(
405
+ (): SQL => sql`${from.users.name}`,
406
+ ),
407
+ }),
408
+ };
409
+ const to = {
410
+ users: sqliteTable('users', {
411
+ id: int('id'),
412
+ id2: int('id2'),
413
+ name: text('name'),
414
+ generatedName: text('gen_name').generatedAlwaysAs(
415
+ (): SQL => sql`${to.users.name} || 'hello'`,
416
+ ),
417
+ }),
418
+ };
419
+
420
+ const { statements, sqlStatements } = await diffTestSchemasSqlite(
421
+ from,
422
+ to,
423
+ [],
424
+ );
425
+
426
+ expect(statements).toStrictEqual([
427
+ {
428
+ columnAutoIncrement: false,
429
+ columnDefault: undefined,
430
+ columnGenerated: {
431
+ as: '("name" || \'hello\')',
432
+ type: 'virtual',
433
+ },
434
+ columnName: 'gen_name',
435
+ columnNotNull: false,
436
+ columnOnUpdate: undefined,
437
+ columnPk: false,
438
+ newDataType: 'text',
439
+ schema: '',
440
+ tableName: 'users',
441
+ type: 'alter_table_alter_column_alter_generated',
442
+ },
443
+ ]);
444
+ expect(sqlStatements).toStrictEqual([
445
+ 'ALTER TABLE `users` DROP COLUMN `gen_name`;',
446
+ 'ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS ("name" || \'hello\') VIRTUAL;',
447
+ ]);
448
+ });
449
+
450
+ test('generated as callback: add table with column with stored generated constraint', async () => {
451
+ const from = {};
452
+ const to = {
453
+ users: sqliteTable('users', {
454
+ id: int('id'),
455
+ id2: int('id2'),
456
+ name: text('name'),
457
+ generatedName: text('gen_name').generatedAlwaysAs(
458
+ (): SQL => sql`${to.users.name} || 'hello'`,
459
+ { mode: 'stored' },
460
+ ),
461
+ }),
462
+ };
463
+
464
+ const { statements, sqlStatements } = await diffTestSchemasSqlite(
465
+ from,
466
+ to,
467
+ [],
468
+ );
469
+
470
+ expect(statements).toStrictEqual([
471
+ {
472
+ columns: [
473
+ {
474
+ autoincrement: false,
475
+ name: 'id',
476
+ notNull: false,
477
+ primaryKey: false,
478
+ type: 'integer',
479
+ },
480
+ {
481
+ autoincrement: false,
482
+ name: 'id2',
483
+ notNull: false,
484
+ primaryKey: false,
485
+ type: 'integer',
486
+ },
487
+ {
488
+ autoincrement: false,
489
+ name: 'name',
490
+ notNull: false,
491
+ primaryKey: false,
492
+ type: 'text',
493
+ },
494
+ {
495
+ autoincrement: false,
496
+ generated: {
497
+ as: '("name" || \'hello\')',
498
+ type: 'stored',
499
+ },
500
+ name: 'gen_name',
501
+ notNull: false,
502
+ primaryKey: false,
503
+ type: 'text',
504
+ },
505
+ ],
506
+ compositePKs: [],
507
+ referenceData: [],
508
+ tableName: 'users',
509
+ type: 'sqlite_create_table',
510
+ uniqueConstraints: [],
511
+ checkConstraints: [],
512
+ },
513
+ ]);
514
+ expect(sqlStatements).toStrictEqual([
515
+ 'CREATE TABLE `users` (\n\t`id` integer,\n\t`id2` integer,\n\t`name` text,\n\t`gen_name` text GENERATED ALWAYS AS ("name" || \'hello\') STORED\n);\n',
516
+ ]);
517
+ });
518
+
519
+ test('generated as callback: add table with column with virtual generated constraint', async () => {
520
+ const from = {};
521
+ const to = {
522
+ users: sqliteTable('users', {
523
+ id: int('id'),
524
+ id2: int('id2'),
525
+ name: text('name'),
526
+ generatedName: text('gen_name').generatedAlwaysAs(
527
+ (): SQL => sql`${to.users.name} || 'hello'`,
528
+ { mode: 'virtual' },
529
+ ),
530
+ }),
531
+ };
532
+
533
+ const { statements, sqlStatements } = await diffTestSchemasSqlite(
534
+ from,
535
+ to,
536
+ [],
537
+ );
538
+
539
+ expect(statements).toStrictEqual([
540
+ {
541
+ columns: [
542
+ {
543
+ autoincrement: false,
544
+ name: 'id',
545
+ notNull: false,
546
+ primaryKey: false,
547
+ type: 'integer',
548
+ },
549
+ {
550
+ autoincrement: false,
551
+ name: 'id2',
552
+ notNull: false,
553
+ primaryKey: false,
554
+ type: 'integer',
555
+ },
556
+ {
557
+ autoincrement: false,
558
+ name: 'name',
559
+ notNull: false,
560
+ primaryKey: false,
561
+ type: 'text',
562
+ },
563
+ {
564
+ autoincrement: false,
565
+ generated: {
566
+ as: '("name" || \'hello\')',
567
+ type: 'virtual',
568
+ },
569
+ name: 'gen_name',
570
+ notNull: false,
571
+ primaryKey: false,
572
+ type: 'text',
573
+ },
574
+ ],
575
+ compositePKs: [],
576
+ referenceData: [],
577
+ tableName: 'users',
578
+ type: 'sqlite_create_table',
579
+ uniqueConstraints: [],
580
+ checkConstraints: [],
581
+ },
582
+ ]);
583
+ expect(sqlStatements).toStrictEqual([
584
+ 'CREATE TABLE `users` (\n\t`id` integer,\n\t`id2` integer,\n\t`name` text,\n\t`gen_name` text GENERATED ALWAYS AS ("name" || \'hello\') VIRTUAL\n);\n',
585
+ ]);
586
+ });
587
+
588
+ // ---
589
+
590
+ test('generated as sql: add column with stored generated constraint', async () => {
591
+ const from = {
592
+ users: sqliteTable('users', {
593
+ id: int('id'),
594
+ id2: int('id2'),
595
+ name: text('name'),
596
+ }),
597
+ };
598
+ const to = {
599
+ users: sqliteTable('users', {
600
+ id: int('id'),
601
+ id2: int('id2'),
602
+ name: text('name'),
603
+ generatedName: text('gen_name').generatedAlwaysAs(
604
+ sql`"users"."name" || \'hello\' || 'hello'`,
605
+ { mode: 'stored' },
606
+ ),
607
+ }),
608
+ };
609
+
610
+ const { statements, sqlStatements } = await diffTestSchemasSqlite(
611
+ from,
612
+ to,
613
+ [],
614
+ );
615
+
616
+ expect(statements).toStrictEqual([]);
617
+ expect(sqlStatements).toStrictEqual([]);
618
+ });
619
+
620
+ test('generated as sql: add column with virtual generated constraint', async () => {
621
+ const from = {
622
+ users: sqliteTable('users', {
623
+ id: int('id'),
624
+ id2: int('id2'),
625
+ name: text('name'),
626
+ }),
627
+ };
628
+ const to = {
629
+ users: sqliteTable('users', {
630
+ id: int('id'),
631
+ id2: int('id2'),
632
+ name: text('name'),
633
+ generatedName: text('gen_name').generatedAlwaysAs(
634
+ sql`"users"."name" || \'hello\'`,
635
+ { mode: 'virtual' },
636
+ ),
637
+ }),
638
+ };
639
+
640
+ const { statements, sqlStatements } = await diffTestSchemasSqlite(
641
+ from,
642
+ to,
643
+ [],
644
+ );
645
+
646
+ expect(statements).toStrictEqual([
647
+ {
648
+ column: {
649
+ generated: {
650
+ as: '("users"."name" || \'hello\')',
651
+ type: 'virtual',
652
+ },
653
+ autoincrement: false,
654
+ name: 'gen_name',
655
+ notNull: false,
656
+ primaryKey: false,
657
+ type: 'text',
658
+ },
659
+ referenceData: undefined,
660
+ tableName: 'users',
661
+ type: 'sqlite_alter_table_add_column',
662
+ },
663
+ ]);
664
+ expect(sqlStatements).toStrictEqual([
665
+ 'ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS ("users"."name" || \'hello\') VIRTUAL;',
666
+ ]);
667
+ });
668
+
669
+ test('generated as sql: add generated constraint to an exisiting column as stored', async () => {
670
+ const from = {
671
+ users: sqliteTable('users', {
672
+ id: int('id'),
673
+ id2: int('id2'),
674
+ name: text('name'),
675
+ generatedName: text('gen_name').notNull(),
676
+ }),
677
+ };
678
+ const to = {
679
+ users: sqliteTable('users', {
680
+ id: int('id'),
681
+ id2: int('id2'),
682
+ name: text('name'),
683
+ generatedName: text('gen_name')
684
+ .notNull()
685
+ .generatedAlwaysAs(sql`"users"."name" || 'to add'`, {
686
+ mode: 'stored',
687
+ }),
688
+ }),
689
+ };
690
+
691
+ const { statements, sqlStatements } = await diffTestSchemasSqlite(
692
+ from,
693
+ to,
694
+ [],
695
+ );
696
+
697
+ expect(statements).toStrictEqual([]);
698
+ expect(sqlStatements).toStrictEqual([]);
699
+ });
700
+
701
+ test('generated as sql: add generated constraint to an exisiting column as virtual', async () => {
702
+ const from = {
703
+ users: sqliteTable('users', {
704
+ id: int('id'),
705
+ id2: int('id2'),
706
+ name: text('name'),
707
+ generatedName: text('gen_name').notNull(),
708
+ }),
709
+ };
710
+ const to = {
711
+ users: sqliteTable('users', {
712
+ id: int('id'),
713
+ id2: int('id2'),
714
+ name: text('name'),
715
+ generatedName: text('gen_name')
716
+ .notNull()
717
+ .generatedAlwaysAs(sql`"users"."name" || 'to add'`, {
718
+ mode: 'virtual',
719
+ }),
720
+ }),
721
+ };
722
+
723
+ const { statements, sqlStatements } = await diffTestSchemasSqlite(
724
+ from,
725
+ to,
726
+ [],
727
+ );
728
+
729
+ expect(statements).toStrictEqual([
730
+ {
731
+ columnAutoIncrement: false,
732
+ columnDefault: undefined,
733
+ columnGenerated: {
734
+ as: '("users"."name" || \'to add\')',
735
+ type: 'virtual',
736
+ },
737
+ columnName: 'gen_name',
738
+ columnNotNull: true,
739
+ columnOnUpdate: undefined,
740
+ columnPk: false,
741
+ newDataType: 'text',
742
+ schema: '',
743
+ tableName: 'users',
744
+ type: 'alter_table_alter_column_set_generated',
745
+ },
746
+ ]);
747
+ expect(sqlStatements).toStrictEqual([
748
+ 'ALTER TABLE `users` DROP COLUMN `gen_name`;',
749
+ 'ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS ("users"."name" || \'to add\') VIRTUAL NOT NULL;',
750
+ ]);
751
+ });
752
+
753
+ test('generated as sql: drop generated constraint as stored', async () => {
754
+ const from = {
755
+ users: sqliteTable('users', {
756
+ id: int('id'),
757
+ id2: int('id2'),
758
+ name: text('name'),
759
+ generatedName: text('gen_name').generatedAlwaysAs(
760
+ sql`"users"."name" || 'to delete'`,
761
+ { mode: 'stored' },
762
+ ),
763
+ }),
764
+ };
765
+ const to = {
766
+ users: sqliteTable('users', {
767
+ id: int('id'),
768
+ id2: int('id2'),
769
+ name: text('name'),
770
+ generatedName1: text('gen_name'),
771
+ }),
772
+ };
773
+
774
+ const { statements, sqlStatements } = await diffTestSchemasSqlite(
775
+ from,
776
+ to,
777
+ [],
778
+ );
779
+
780
+ expect(statements).toStrictEqual([
781
+ {
782
+ columnAutoIncrement: false,
783
+ columnDefault: undefined,
784
+ columnGenerated: undefined,
785
+ columnName: 'gen_name',
786
+ columnNotNull: false,
787
+ columnOnUpdate: undefined,
788
+ columnPk: false,
789
+ newDataType: 'text',
790
+ schema: '',
791
+ tableName: 'users',
792
+ type: 'alter_table_alter_column_drop_generated',
793
+ },
794
+ ]);
795
+ expect(sqlStatements).toStrictEqual([
796
+ 'ALTER TABLE `users` DROP COLUMN `gen_name`;',
797
+ 'ALTER TABLE `users` ADD `gen_name` text;',
798
+ ]);
799
+ });
800
+
801
+ test('generated as sql: drop generated constraint as virtual', async () => {
802
+ const from = {
803
+ users: sqliteTable('users', {
804
+ id: int('id'),
805
+ id2: int('id2'),
806
+ name: text('name'),
807
+ generatedName: text('gen_name').generatedAlwaysAs(
808
+ sql`"users"."name" || 'to delete'`,
809
+ { mode: 'virtual' },
810
+ ),
811
+ }),
812
+ };
813
+ const to = {
814
+ users: sqliteTable('users', {
815
+ id: int('id'),
816
+ id2: int('id2'),
817
+ name: text('name'),
818
+ generatedName1: text('gen_name'),
819
+ }),
820
+ };
821
+
822
+ const { statements, sqlStatements } = await diffTestSchemasSqlite(
823
+ from,
824
+ to,
825
+ [],
826
+ );
827
+
828
+ expect(statements).toStrictEqual([
829
+ {
830
+ columnAutoIncrement: false,
831
+ columnDefault: undefined,
832
+ columnGenerated: undefined,
833
+ columnName: 'gen_name',
834
+ columnNotNull: false,
835
+ columnOnUpdate: undefined,
836
+ columnPk: false,
837
+ newDataType: 'text',
838
+ schema: '',
839
+ tableName: 'users',
840
+ type: 'alter_table_alter_column_drop_generated',
841
+ },
842
+ ]);
843
+ expect(sqlStatements).toStrictEqual([
844
+ 'ALTER TABLE `users` DROP COLUMN `gen_name`;',
845
+ 'ALTER TABLE `users` ADD `gen_name` text;',
846
+ ]);
847
+ });
848
+
849
+ // no way to do it
850
+ test('generated as sql: change generated constraint type from virtual to stored', async () => {
851
+ const from = {
852
+ users: sqliteTable('users', {
853
+ id: int('id'),
854
+ id2: int('id2'),
855
+ name: text('name'),
856
+ generatedName: text('gen_name').generatedAlwaysAs(sql`"users"."name"`, {
857
+ mode: 'virtual',
858
+ }),
859
+ }),
860
+ };
861
+ const to = {
862
+ users: sqliteTable('users', {
863
+ id: int('id'),
864
+ id2: int('id2'),
865
+ name: text('name'),
866
+ generatedName: text('gen_name').generatedAlwaysAs(
867
+ sql`"users"."name" || 'hello'`,
868
+ { mode: 'stored' },
869
+ ),
870
+ }),
871
+ };
872
+
873
+ const { statements, sqlStatements } = await diffTestSchemasSqlite(
874
+ from,
875
+ to,
876
+ [],
877
+ );
878
+
879
+ expect(statements).toStrictEqual([]);
880
+ expect(sqlStatements).toStrictEqual([]);
881
+ });
882
+
883
+ test('generated as sql: change generated constraint type from stored to virtual', async () => {
884
+ const from = {
885
+ users: sqliteTable('users', {
886
+ id: int('id'),
887
+ id2: int('id2'),
888
+ name: text('name'),
889
+ generatedName: text('gen_name').generatedAlwaysAs(sql`"users"."name"`, {
890
+ mode: 'stored',
891
+ }),
892
+ }),
893
+ };
894
+ const to = {
895
+ users: sqliteTable('users', {
896
+ id: int('id'),
897
+ id2: int('id2'),
898
+ name: text('name'),
899
+ generatedName: text('gen_name').generatedAlwaysAs(
900
+ sql`"users"."name" || 'hello'`,
901
+ { mode: 'virtual' },
902
+ ),
903
+ }),
904
+ };
905
+
906
+ const { statements, sqlStatements } = await diffTestSchemasSqlite(
907
+ from,
908
+ to,
909
+ [],
910
+ );
911
+
912
+ expect(statements).toStrictEqual([
913
+ {
914
+ columnAutoIncrement: false,
915
+ columnDefault: undefined,
916
+ columnGenerated: {
917
+ as: '("users"."name" || \'hello\')',
918
+ type: 'virtual',
919
+ },
920
+ columnName: 'gen_name',
921
+ columnNotNull: false,
922
+ columnOnUpdate: undefined,
923
+ columnPk: false,
924
+ newDataType: 'text',
925
+ schema: '',
926
+ tableName: 'users',
927
+ type: 'alter_table_alter_column_alter_generated',
928
+ },
929
+ ]);
930
+ expect(sqlStatements).toStrictEqual([
931
+ 'ALTER TABLE `users` DROP COLUMN `gen_name`;',
932
+ 'ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS ("users"."name" || \'hello\') VIRTUAL;',
933
+ ]);
934
+ });
935
+
936
+ // not supported
937
+ test('generated as sql: change stored generated constraint', async () => {
938
+ const from = {
939
+ users: sqliteTable('users', {
940
+ id: int('id'),
941
+ id2: int('id2'),
942
+ name: text('name'),
943
+ generatedName: text('gen_name').generatedAlwaysAs(sql`"users"."name"`, {
944
+ mode: 'stored',
945
+ }),
946
+ }),
947
+ };
948
+ const to = {
949
+ users: sqliteTable('users', {
950
+ id: int('id'),
951
+ id2: int('id2'),
952
+ name: text('name'),
953
+ generatedName: text('gen_name').generatedAlwaysAs(
954
+ sql`"users"."name" || 'hello'`,
955
+ { mode: 'stored' },
956
+ ),
957
+ }),
958
+ };
959
+
960
+ const { statements, sqlStatements } = await diffTestSchemasSqlite(
961
+ from,
962
+ to,
963
+ [],
964
+ );
965
+
966
+ expect(statements).toStrictEqual([]);
967
+ expect(sqlStatements).toStrictEqual([]);
968
+ });
969
+
970
+ test('generated as sql: change virtual generated constraint', async () => {
971
+ const from = {
972
+ users: sqliteTable('users', {
973
+ id: int('id'),
974
+ id2: int('id2'),
975
+ name: text('name'),
976
+ generatedName: text('gen_name').generatedAlwaysAs(sql`"users"."name"`),
977
+ }),
978
+ };
979
+ const to = {
980
+ users: sqliteTable('users', {
981
+ id: int('id'),
982
+ id2: int('id2'),
983
+ name: text('name'),
984
+ generatedName: text('gen_name').generatedAlwaysAs(
985
+ sql`"users"."name" || 'hello'`,
986
+ ),
987
+ }),
988
+ };
989
+
990
+ const { statements, sqlStatements } = await diffTestSchemasSqlite(
991
+ from,
992
+ to,
993
+ [],
994
+ );
995
+
996
+ expect(statements).toStrictEqual([
997
+ {
998
+ columnAutoIncrement: false,
999
+ columnDefault: undefined,
1000
+ columnGenerated: {
1001
+ as: '("users"."name" || \'hello\')',
1002
+ type: 'virtual',
1003
+ },
1004
+ columnName: 'gen_name',
1005
+ columnNotNull: false,
1006
+ columnOnUpdate: undefined,
1007
+ columnPk: false,
1008
+ newDataType: 'text',
1009
+ schema: '',
1010
+ tableName: 'users',
1011
+ type: 'alter_table_alter_column_alter_generated',
1012
+ },
1013
+ ]);
1014
+ expect(sqlStatements).toStrictEqual([
1015
+ 'ALTER TABLE `users` DROP COLUMN `gen_name`;',
1016
+ 'ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS ("users"."name" || \'hello\') VIRTUAL;',
1017
+ ]);
1018
+ });
1019
+
1020
+ test('generated as sql: add table with column with stored generated constraint', async () => {
1021
+ const from = {};
1022
+ const to = {
1023
+ users: sqliteTable('users', {
1024
+ id: int('id'),
1025
+ id2: int('id2'),
1026
+ name: text('name'),
1027
+ generatedName: text('gen_name').generatedAlwaysAs(
1028
+ sql`"users"."name" || 'hello'`,
1029
+ { mode: 'stored' },
1030
+ ),
1031
+ }),
1032
+ };
1033
+
1034
+ const { statements, sqlStatements } = await diffTestSchemasSqlite(
1035
+ from,
1036
+ to,
1037
+ [],
1038
+ );
1039
+
1040
+ expect(statements).toStrictEqual([
1041
+ {
1042
+ columns: [
1043
+ {
1044
+ autoincrement: false,
1045
+ name: 'id',
1046
+ notNull: false,
1047
+ primaryKey: false,
1048
+ type: 'integer',
1049
+ },
1050
+ {
1051
+ autoincrement: false,
1052
+ name: 'id2',
1053
+ notNull: false,
1054
+ primaryKey: false,
1055
+ type: 'integer',
1056
+ },
1057
+ {
1058
+ autoincrement: false,
1059
+ name: 'name',
1060
+ notNull: false,
1061
+ primaryKey: false,
1062
+ type: 'text',
1063
+ },
1064
+ {
1065
+ autoincrement: false,
1066
+ generated: {
1067
+ as: '("users"."name" || \'hello\')',
1068
+ type: 'stored',
1069
+ },
1070
+ name: 'gen_name',
1071
+ notNull: false,
1072
+ primaryKey: false,
1073
+ type: 'text',
1074
+ },
1075
+ ],
1076
+ compositePKs: [],
1077
+ referenceData: [],
1078
+ tableName: 'users',
1079
+ type: 'sqlite_create_table',
1080
+ uniqueConstraints: [],
1081
+ checkConstraints: [],
1082
+ },
1083
+ ]);
1084
+ expect(sqlStatements).toStrictEqual([
1085
+ 'CREATE TABLE `users` (\n\t`id` integer,\n\t`id2` integer,\n\t`name` text,\n\t`gen_name` text GENERATED ALWAYS AS ("users"."name" || \'hello\') STORED\n);\n',
1086
+ ]);
1087
+ });
1088
+
1089
+ test('generated as sql: add table with column with virtual generated constraint', async () => {
1090
+ const from = {};
1091
+ const to = {
1092
+ users: sqliteTable('users', {
1093
+ id: int('id'),
1094
+ id2: int('id2'),
1095
+ name: text('name'),
1096
+ generatedName: text('gen_name').generatedAlwaysAs(
1097
+ sql`"users"."name" || 'hello'`,
1098
+ { mode: 'virtual' },
1099
+ ),
1100
+ }),
1101
+ };
1102
+
1103
+ const { statements, sqlStatements } = await diffTestSchemasSqlite(
1104
+ from,
1105
+ to,
1106
+ [],
1107
+ );
1108
+
1109
+ expect(statements).toStrictEqual([
1110
+ {
1111
+ columns: [
1112
+ {
1113
+ autoincrement: false,
1114
+ name: 'id',
1115
+ notNull: false,
1116
+ primaryKey: false,
1117
+ type: 'integer',
1118
+ },
1119
+ {
1120
+ autoincrement: false,
1121
+ name: 'id2',
1122
+ notNull: false,
1123
+ primaryKey: false,
1124
+ type: 'integer',
1125
+ },
1126
+ {
1127
+ autoincrement: false,
1128
+ name: 'name',
1129
+ notNull: false,
1130
+ primaryKey: false,
1131
+ type: 'text',
1132
+ },
1133
+ {
1134
+ autoincrement: false,
1135
+ generated: {
1136
+ as: '("users"."name" || \'hello\')',
1137
+ type: 'virtual',
1138
+ },
1139
+ name: 'gen_name',
1140
+ notNull: false,
1141
+ primaryKey: false,
1142
+ type: 'text',
1143
+ },
1144
+ ],
1145
+ compositePKs: [],
1146
+ referenceData: [],
1147
+ tableName: 'users',
1148
+ type: 'sqlite_create_table',
1149
+ uniqueConstraints: [],
1150
+ checkConstraints: [],
1151
+ },
1152
+ ]);
1153
+ expect(sqlStatements).toStrictEqual([
1154
+ 'CREATE TABLE `users` (\n\t`id` integer,\n\t`id2` integer,\n\t`name` text,\n\t`gen_name` text GENERATED ALWAYS AS ("users"."name" || \'hello\') VIRTUAL\n);\n',
1155
+ ]);
1156
+ });
1157
+
1158
+ // ---
1159
+
1160
+ test('generated as string: add column with stored generated constraint', async () => {
1161
+ const from = {
1162
+ users: sqliteTable('users', {
1163
+ id: int('id'),
1164
+ id2: int('id2'),
1165
+ name: text('name'),
1166
+ }),
1167
+ };
1168
+ const to = {
1169
+ users: sqliteTable('users', {
1170
+ id: int('id'),
1171
+ id2: int('id2'),
1172
+ name: text('name'),
1173
+ generatedName: text('gen_name').generatedAlwaysAs(
1174
+ `"users"."name" || \'hello\'`,
1175
+ { mode: 'stored' },
1176
+ ),
1177
+ }),
1178
+ };
1179
+
1180
+ const { statements, sqlStatements } = await diffTestSchemasSqlite(
1181
+ from,
1182
+ to,
1183
+ [],
1184
+ );
1185
+
1186
+ expect(statements).toStrictEqual([]);
1187
+ expect(sqlStatements).toStrictEqual([]);
1188
+ });
1189
+
1190
+ test('generated as string: add column with virtual generated constraint', async () => {
1191
+ const from = {
1192
+ users: sqliteTable('users', {
1193
+ id: int('id'),
1194
+ id2: int('id2'),
1195
+ name: text('name'),
1196
+ }),
1197
+ };
1198
+ const to = {
1199
+ users: sqliteTable('users', {
1200
+ id: int('id'),
1201
+ id2: int('id2'),
1202
+ name: text('name'),
1203
+ generatedName: text('gen_name').generatedAlwaysAs(
1204
+ `"users"."name" || \'hello\'`,
1205
+ { mode: 'virtual' },
1206
+ ),
1207
+ }),
1208
+ };
1209
+
1210
+ const { statements, sqlStatements } = await diffTestSchemasSqlite(
1211
+ from,
1212
+ to,
1213
+ [],
1214
+ );
1215
+
1216
+ expect(statements).toStrictEqual([
1217
+ {
1218
+ column: {
1219
+ generated: {
1220
+ as: '("users"."name" || \'hello\')',
1221
+ type: 'virtual',
1222
+ },
1223
+ autoincrement: false,
1224
+ name: 'gen_name',
1225
+ notNull: false,
1226
+ primaryKey: false,
1227
+ type: 'text',
1228
+ },
1229
+ referenceData: undefined,
1230
+ tableName: 'users',
1231
+ type: 'sqlite_alter_table_add_column',
1232
+ },
1233
+ ]);
1234
+ expect(sqlStatements).toStrictEqual([
1235
+ 'ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS ("users"."name" || \'hello\') VIRTUAL;',
1236
+ ]);
1237
+ });
1238
+
1239
+ test('generated as string: add generated constraint to an exisiting column as stored', async () => {
1240
+ const from = {
1241
+ users: sqliteTable('users', {
1242
+ id: int('id'),
1243
+ id2: int('id2'),
1244
+ name: text('name'),
1245
+ generatedName: text('gen_name').notNull(),
1246
+ }),
1247
+ };
1248
+ const to = {
1249
+ users: sqliteTable('users', {
1250
+ id: int('id'),
1251
+ id2: int('id2'),
1252
+ name: text('name'),
1253
+ generatedName: text('gen_name')
1254
+ .notNull()
1255
+ .generatedAlwaysAs(`"users"."name" || 'to add'`, {
1256
+ mode: 'stored',
1257
+ }),
1258
+ }),
1259
+ };
1260
+
1261
+ const { statements, sqlStatements } = await diffTestSchemasSqlite(
1262
+ from,
1263
+ to,
1264
+ [],
1265
+ );
1266
+
1267
+ expect(statements).toStrictEqual([]);
1268
+ expect(sqlStatements).toStrictEqual([]);
1269
+ });
1270
+
1271
+ test('generated as string: add generated constraint to an exisiting column as virtual', async () => {
1272
+ const from = {
1273
+ users: sqliteTable('users', {
1274
+ id: int('id'),
1275
+ id2: int('id2'),
1276
+ name: text('name'),
1277
+ generatedName: text('gen_name').notNull(),
1278
+ }),
1279
+ };
1280
+ const to = {
1281
+ users: sqliteTable('users', {
1282
+ id: int('id'),
1283
+ id2: int('id2'),
1284
+ name: text('name'),
1285
+ generatedName: text('gen_name')
1286
+ .notNull()
1287
+ .generatedAlwaysAs(`"users"."name" || 'to add'`, {
1288
+ mode: 'virtual',
1289
+ }),
1290
+ }),
1291
+ };
1292
+
1293
+ const { statements, sqlStatements } = await diffTestSchemasSqlite(
1294
+ from,
1295
+ to,
1296
+ [],
1297
+ );
1298
+
1299
+ expect(statements).toStrictEqual([
1300
+ {
1301
+ columnAutoIncrement: false,
1302
+ columnDefault: undefined,
1303
+ columnGenerated: {
1304
+ as: '("users"."name" || \'to add\')',
1305
+ type: 'virtual',
1306
+ },
1307
+ columnName: 'gen_name',
1308
+ columnNotNull: true,
1309
+ columnOnUpdate: undefined,
1310
+ columnPk: false,
1311
+ newDataType: 'text',
1312
+ schema: '',
1313
+ tableName: 'users',
1314
+ type: 'alter_table_alter_column_set_generated',
1315
+ },
1316
+ ]);
1317
+ expect(sqlStatements).toStrictEqual([
1318
+ 'ALTER TABLE `users` DROP COLUMN `gen_name`;',
1319
+ 'ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS ("users"."name" || \'to add\') VIRTUAL NOT NULL;',
1320
+ ]);
1321
+ });
1322
+
1323
+ test('generated as string: drop generated constraint as stored', async () => {
1324
+ const from = {
1325
+ users: sqliteTable('users', {
1326
+ id: int('id'),
1327
+ id2: int('id2'),
1328
+ name: text('name'),
1329
+ generatedName: text('gen_name').generatedAlwaysAs(
1330
+ `"users"."name" || 'to delete'`,
1331
+ { mode: 'stored' },
1332
+ ),
1333
+ }),
1334
+ };
1335
+ const to = {
1336
+ users: sqliteTable('users', {
1337
+ id: int('id'),
1338
+ id2: int('id2'),
1339
+ name: text('name'),
1340
+ generatedName1: text('gen_name'),
1341
+ }),
1342
+ };
1343
+
1344
+ const { statements, sqlStatements } = await diffTestSchemasSqlite(
1345
+ from,
1346
+ to,
1347
+ [],
1348
+ );
1349
+
1350
+ expect(statements).toStrictEqual([
1351
+ {
1352
+ columnAutoIncrement: false,
1353
+ columnDefault: undefined,
1354
+ columnGenerated: undefined,
1355
+ columnName: 'gen_name',
1356
+ columnNotNull: false,
1357
+ columnOnUpdate: undefined,
1358
+ columnPk: false,
1359
+ newDataType: 'text',
1360
+ schema: '',
1361
+ tableName: 'users',
1362
+ type: 'alter_table_alter_column_drop_generated',
1363
+ },
1364
+ ]);
1365
+ expect(sqlStatements).toStrictEqual([
1366
+ 'ALTER TABLE `users` DROP COLUMN `gen_name`;',
1367
+ 'ALTER TABLE `users` ADD `gen_name` text;',
1368
+ ]);
1369
+ });
1370
+
1371
+ test('generated as string: drop generated constraint as virtual', async () => {
1372
+ const from = {
1373
+ users: sqliteTable('users', {
1374
+ id: int('id'),
1375
+ id2: int('id2'),
1376
+ name: text('name'),
1377
+ generatedName: text('gen_name').generatedAlwaysAs(
1378
+ `"users"."name" || 'to delete'`,
1379
+ { mode: 'virtual' },
1380
+ ),
1381
+ }),
1382
+ };
1383
+ const to = {
1384
+ users: sqliteTable('users', {
1385
+ id: int('id'),
1386
+ id2: int('id2'),
1387
+ name: text('name'),
1388
+ generatedName1: text('gen_name'),
1389
+ }),
1390
+ };
1391
+
1392
+ const { statements, sqlStatements } = await diffTestSchemasSqlite(
1393
+ from,
1394
+ to,
1395
+ [],
1396
+ );
1397
+
1398
+ expect(statements).toStrictEqual([
1399
+ {
1400
+ columnAutoIncrement: false,
1401
+ columnDefault: undefined,
1402
+ columnGenerated: undefined,
1403
+ columnName: 'gen_name',
1404
+ columnNotNull: false,
1405
+ columnOnUpdate: undefined,
1406
+ columnPk: false,
1407
+ newDataType: 'text',
1408
+ schema: '',
1409
+ tableName: 'users',
1410
+ type: 'alter_table_alter_column_drop_generated',
1411
+ },
1412
+ ]);
1413
+ expect(sqlStatements).toStrictEqual([
1414
+ 'ALTER TABLE `users` DROP COLUMN `gen_name`;',
1415
+ 'ALTER TABLE `users` ADD `gen_name` text;',
1416
+ ]);
1417
+ });
1418
+
1419
+ // no way to do it
1420
+ test('generated as string: change generated constraint type from virtual to stored', async () => {
1421
+ const from = {
1422
+ users: sqliteTable('users', {
1423
+ id: int('id'),
1424
+ id2: int('id2'),
1425
+ name: text('name'),
1426
+ generatedName: text('gen_name').generatedAlwaysAs(`"users"."name"`, {
1427
+ mode: 'virtual',
1428
+ }),
1429
+ }),
1430
+ };
1431
+ const to = {
1432
+ users: sqliteTable('users', {
1433
+ id: int('id'),
1434
+ id2: int('id2'),
1435
+ name: text('name'),
1436
+ generatedName: text('gen_name').generatedAlwaysAs(
1437
+ `"users"."name" || 'hello'`,
1438
+ { mode: 'stored' },
1439
+ ),
1440
+ }),
1441
+ };
1442
+
1443
+ const { statements, sqlStatements } = await diffTestSchemasSqlite(
1444
+ from,
1445
+ to,
1446
+ [],
1447
+ );
1448
+
1449
+ expect(statements).toStrictEqual([]);
1450
+ expect(sqlStatements).toStrictEqual([]);
1451
+ });
1452
+
1453
+ test('generated as string: change generated constraint type from stored to virtual', async () => {
1454
+ const from = {
1455
+ users: sqliteTable('users', {
1456
+ id: int('id'),
1457
+ id2: int('id2'),
1458
+ name: text('name'),
1459
+ generatedName: text('gen_name').generatedAlwaysAs(`"users"."name"`, {
1460
+ mode: 'stored',
1461
+ }),
1462
+ }),
1463
+ };
1464
+ const to = {
1465
+ users: sqliteTable('users', {
1466
+ id: int('id'),
1467
+ id2: int('id2'),
1468
+ name: text('name'),
1469
+ generatedName: text('gen_name').generatedAlwaysAs(
1470
+ `"users"."name" || 'hello'`,
1471
+ { mode: 'virtual' },
1472
+ ),
1473
+ }),
1474
+ };
1475
+
1476
+ const { statements, sqlStatements } = await diffTestSchemasSqlite(
1477
+ from,
1478
+ to,
1479
+ [],
1480
+ );
1481
+
1482
+ expect(statements).toStrictEqual([
1483
+ {
1484
+ columnAutoIncrement: false,
1485
+ columnDefault: undefined,
1486
+ columnGenerated: {
1487
+ as: '("users"."name" || \'hello\')',
1488
+ type: 'virtual',
1489
+ },
1490
+ columnName: 'gen_name',
1491
+ columnNotNull: false,
1492
+ columnOnUpdate: undefined,
1493
+ columnPk: false,
1494
+ newDataType: 'text',
1495
+ schema: '',
1496
+ tableName: 'users',
1497
+ type: 'alter_table_alter_column_alter_generated',
1498
+ },
1499
+ ]);
1500
+ expect(sqlStatements).toStrictEqual([
1501
+ 'ALTER TABLE `users` DROP COLUMN `gen_name`;',
1502
+ 'ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS ("users"."name" || \'hello\') VIRTUAL;',
1503
+ ]);
1504
+ });
1505
+
1506
+ // not supported
1507
+ test('generated as string: change stored generated constraint', async () => {
1508
+ const from = {
1509
+ users: sqliteTable('users', {
1510
+ id: int('id'),
1511
+ id2: int('id2'),
1512
+ name: text('name'),
1513
+ generatedName: text('gen_name').generatedAlwaysAs(`"users"."name"`, {
1514
+ mode: 'stored',
1515
+ }),
1516
+ }),
1517
+ };
1518
+ const to = {
1519
+ users: sqliteTable('users', {
1520
+ id: int('id'),
1521
+ id2: int('id2'),
1522
+ name: text('name'),
1523
+ generatedName: text('gen_name').generatedAlwaysAs(
1524
+ `"users"."name" || 'hello'`,
1525
+ { mode: 'stored' },
1526
+ ),
1527
+ }),
1528
+ };
1529
+
1530
+ const { statements, sqlStatements } = await diffTestSchemasSqlite(
1531
+ from,
1532
+ to,
1533
+ [],
1534
+ );
1535
+
1536
+ expect(statements).toStrictEqual([]);
1537
+ expect(sqlStatements).toStrictEqual([]);
1538
+ });
1539
+
1540
+ test('generated as string: change virtual generated constraint', async () => {
1541
+ const from = {
1542
+ users: sqliteTable('users', {
1543
+ id: int('id'),
1544
+ id2: int('id2'),
1545
+ name: text('name'),
1546
+ generatedName: text('gen_name').generatedAlwaysAs(`"users"."name"`),
1547
+ }),
1548
+ };
1549
+ const to = {
1550
+ users: sqliteTable('users', {
1551
+ id: int('id'),
1552
+ id2: int('id2'),
1553
+ name: text('name'),
1554
+ generatedName: text('gen_name').generatedAlwaysAs(
1555
+ `"users"."name" || 'hello'`,
1556
+ ),
1557
+ }),
1558
+ };
1559
+
1560
+ const { statements, sqlStatements } = await diffTestSchemasSqlite(
1561
+ from,
1562
+ to,
1563
+ [],
1564
+ );
1565
+
1566
+ expect(statements).toStrictEqual([
1567
+ {
1568
+ columnAutoIncrement: false,
1569
+ columnDefault: undefined,
1570
+ columnGenerated: {
1571
+ as: '("users"."name" || \'hello\')',
1572
+ type: 'virtual',
1573
+ },
1574
+ columnName: 'gen_name',
1575
+ columnNotNull: false,
1576
+ columnOnUpdate: undefined,
1577
+ columnPk: false,
1578
+ newDataType: 'text',
1579
+ schema: '',
1580
+ tableName: 'users',
1581
+ type: 'alter_table_alter_column_alter_generated',
1582
+ },
1583
+ ]);
1584
+ expect(sqlStatements).toStrictEqual([
1585
+ 'ALTER TABLE `users` DROP COLUMN `gen_name`;',
1586
+ 'ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS ("users"."name" || \'hello\') VIRTUAL;',
1587
+ ]);
1588
+ });
1589
+
1590
+ test('generated as string: add table with column with stored generated constraint', async () => {
1591
+ const from = {};
1592
+ const to = {
1593
+ users: sqliteTable('users', {
1594
+ id: int('id'),
1595
+ id2: int('id2'),
1596
+ name: text('name'),
1597
+ generatedName: text('gen_name').generatedAlwaysAs(
1598
+ `"users"."name" || 'hello'`,
1599
+ { mode: 'stored' },
1600
+ ),
1601
+ }),
1602
+ };
1603
+
1604
+ const { statements, sqlStatements } = await diffTestSchemasSqlite(
1605
+ from,
1606
+ to,
1607
+ [],
1608
+ );
1609
+
1610
+ expect(statements).toStrictEqual([
1611
+ {
1612
+ columns: [
1613
+ {
1614
+ autoincrement: false,
1615
+ name: 'id',
1616
+ notNull: false,
1617
+ primaryKey: false,
1618
+ type: 'integer',
1619
+ },
1620
+ {
1621
+ autoincrement: false,
1622
+ name: 'id2',
1623
+ notNull: false,
1624
+ primaryKey: false,
1625
+ type: 'integer',
1626
+ },
1627
+ {
1628
+ autoincrement: false,
1629
+ name: 'name',
1630
+ notNull: false,
1631
+ primaryKey: false,
1632
+ type: 'text',
1633
+ },
1634
+ {
1635
+ autoincrement: false,
1636
+ generated: {
1637
+ as: '("users"."name" || \'hello\')',
1638
+ type: 'stored',
1639
+ },
1640
+ name: 'gen_name',
1641
+ notNull: false,
1642
+ primaryKey: false,
1643
+ type: 'text',
1644
+ },
1645
+ ],
1646
+ compositePKs: [],
1647
+ referenceData: [],
1648
+ tableName: 'users',
1649
+ type: 'sqlite_create_table',
1650
+ uniqueConstraints: [],
1651
+ checkConstraints: [],
1652
+ },
1653
+ ]);
1654
+ expect(sqlStatements).toStrictEqual([
1655
+ 'CREATE TABLE `users` (\n\t`id` integer,\n\t`id2` integer,\n\t`name` text,\n\t`gen_name` text GENERATED ALWAYS AS ("users"."name" || \'hello\') STORED\n);\n',
1656
+ ]);
1657
+ });
1658
+
1659
+ test('generated as string: add table with column with virtual generated constraint', async () => {
1660
+ const from = {};
1661
+ const to = {
1662
+ users: sqliteTable('users', {
1663
+ id: int('id'),
1664
+ id2: int('id2'),
1665
+ name: text('name'),
1666
+ generatedName: text('gen_name').generatedAlwaysAs(
1667
+ `"users"."name" || 'hello'`,
1668
+ { mode: 'virtual' },
1669
+ ),
1670
+ }),
1671
+ };
1672
+
1673
+ const { statements, sqlStatements } = await diffTestSchemasSqlite(
1674
+ from,
1675
+ to,
1676
+ [],
1677
+ );
1678
+
1679
+ expect(statements).toStrictEqual([
1680
+ {
1681
+ columns: [
1682
+ {
1683
+ autoincrement: false,
1684
+ name: 'id',
1685
+ notNull: false,
1686
+ primaryKey: false,
1687
+ type: 'integer',
1688
+ },
1689
+ {
1690
+ autoincrement: false,
1691
+ name: 'id2',
1692
+ notNull: false,
1693
+ primaryKey: false,
1694
+ type: 'integer',
1695
+ },
1696
+ {
1697
+ autoincrement: false,
1698
+ name: 'name',
1699
+ notNull: false,
1700
+ primaryKey: false,
1701
+ type: 'text',
1702
+ },
1703
+ {
1704
+ autoincrement: false,
1705
+ generated: {
1706
+ as: '("users"."name" || \'hello\')',
1707
+ type: 'virtual',
1708
+ },
1709
+ name: 'gen_name',
1710
+ notNull: false,
1711
+ primaryKey: false,
1712
+ type: 'text',
1713
+ },
1714
+ ],
1715
+ compositePKs: [],
1716
+ referenceData: [],
1717
+ tableName: 'users',
1718
+ type: 'sqlite_create_table',
1719
+ uniqueConstraints: [],
1720
+ checkConstraints: [],
1721
+ },
1722
+ ]);
1723
+ expect(sqlStatements).toStrictEqual([
1724
+ 'CREATE TABLE `users` (\n\t`id` integer,\n\t`id2` integer,\n\t`name` text,\n\t`gen_name` text GENERATED ALWAYS AS ("users"."name" || \'hello\') VIRTUAL\n);\n',
1725
+ ]);
1726
+ });