@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,1290 @@
1
+ import { SQL, sql } from 'drizzle-orm';
2
+ import { int, singlestoreTable, text } from 'drizzle-orm/singlestore-core';
3
+ import { expect, test } from 'vitest';
4
+ import { diffTestSchemasSingleStore } from './schemaDiffer';
5
+
6
+ test('generated as callback: add column with generated constraint', async () => {
7
+ const from = {
8
+ users: singlestoreTable('users', {
9
+ id: int('id'),
10
+ id2: int('id2'),
11
+ name: text('name'),
12
+ }),
13
+ };
14
+ const to = {
15
+ users: singlestoreTable('users', {
16
+ id: int('id'),
17
+ id2: int('id2'),
18
+ name: text('name'),
19
+ generatedName: text('gen_name').generatedAlwaysAs(
20
+ (): SQL => sql`${to.users.name} || 'hello'`,
21
+ { mode: 'stored' },
22
+ ),
23
+ }),
24
+ };
25
+
26
+ const { statements, sqlStatements } = await diffTestSchemasSingleStore(
27
+ from,
28
+ to,
29
+ [],
30
+ );
31
+
32
+ expect(statements).toStrictEqual([
33
+ {
34
+ column: {
35
+ generated: {
36
+ as: "`users`.`name` || 'hello'",
37
+ type: 'stored',
38
+ },
39
+ autoincrement: false,
40
+ name: 'gen_name',
41
+ notNull: false,
42
+ primaryKey: false,
43
+ type: 'text',
44
+ },
45
+ schema: '',
46
+ tableName: 'users',
47
+ type: 'alter_table_add_column',
48
+ },
49
+ ]);
50
+ expect(sqlStatements).toStrictEqual([
51
+ "ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS (`users`.`name` || 'hello') STORED;",
52
+ ]);
53
+ });
54
+
55
+ test('generated as callback: add generated constraint to an exisiting column as stored', async () => {
56
+ const from = {
57
+ users: singlestoreTable('users', {
58
+ id: int('id'),
59
+ id2: int('id2'),
60
+ name: text('name'),
61
+ generatedName: text('gen_name').notNull(),
62
+ }),
63
+ };
64
+ const to = {
65
+ users: singlestoreTable('users', {
66
+ id: int('id'),
67
+ id2: int('id2'),
68
+ name: text('name'),
69
+ generatedName: text('gen_name')
70
+ .notNull()
71
+ .generatedAlwaysAs((): SQL => sql`${from.users.name} || 'to add'`, {
72
+ mode: 'stored',
73
+ }),
74
+ }),
75
+ };
76
+
77
+ const { statements, sqlStatements } = await diffTestSchemasSingleStore(
78
+ from,
79
+ to,
80
+ [],
81
+ );
82
+
83
+ expect(statements).toStrictEqual([
84
+ {
85
+ columnDefault: undefined,
86
+ columnGenerated: {
87
+ as: "`users`.`name` || 'to add'",
88
+ type: 'stored',
89
+ },
90
+ columnAutoIncrement: false,
91
+ columnName: 'gen_name',
92
+ columnNotNull: true,
93
+ columnOnUpdate: undefined,
94
+ columnPk: false,
95
+ newDataType: 'text',
96
+ schema: '',
97
+ tableName: 'users',
98
+ type: 'alter_table_alter_column_set_generated',
99
+ },
100
+ ]);
101
+ expect(sqlStatements).toStrictEqual([
102
+ "ALTER TABLE `users` MODIFY COLUMN `gen_name` text NOT NULL GENERATED ALWAYS AS (`users`.`name` || 'to add') STORED;",
103
+ ]);
104
+ });
105
+
106
+ test('generated as callback: add generated constraint to an exisiting column as virtual', async () => {
107
+ const from = {
108
+ users: singlestoreTable('users', {
109
+ id: int('id'),
110
+ id2: int('id2'),
111
+ name: text('name'),
112
+ generatedName: text('gen_name').notNull(),
113
+ }),
114
+ };
115
+ const to = {
116
+ users: singlestoreTable('users', {
117
+ id: int('id'),
118
+ id2: int('id2'),
119
+ name: text('name'),
120
+ generatedName: text('gen_name')
121
+ .notNull()
122
+ .generatedAlwaysAs((): SQL => sql`${from.users.name} || 'to add'`, {
123
+ mode: 'virtual',
124
+ }),
125
+ }),
126
+ };
127
+
128
+ const { statements, sqlStatements } = await diffTestSchemasSingleStore(
129
+ from,
130
+ to,
131
+ [],
132
+ );
133
+
134
+ expect(statements).toStrictEqual([
135
+ {
136
+ columnAutoIncrement: false,
137
+ columnDefault: undefined,
138
+ columnGenerated: {
139
+ as: "`users`.`name` || 'to add'",
140
+ type: 'virtual',
141
+ },
142
+ columnName: 'gen_name',
143
+ columnNotNull: true,
144
+ columnOnUpdate: undefined,
145
+ columnPk: false,
146
+ newDataType: 'text',
147
+ schema: '',
148
+ tableName: 'users',
149
+ type: 'alter_table_alter_column_set_generated',
150
+ },
151
+ ]);
152
+ expect(sqlStatements).toStrictEqual([
153
+ 'ALTER TABLE `users` DROP COLUMN `gen_name`;',
154
+ "ALTER TABLE `users` ADD `gen_name` text NOT NULL GENERATED ALWAYS AS (`users`.`name` || 'to add') VIRTUAL;",
155
+ ]);
156
+ });
157
+
158
+ test('generated as callback: drop generated constraint as stored', async () => {
159
+ const from = {
160
+ users: singlestoreTable('users', {
161
+ id: int('id'),
162
+ id2: int('id2'),
163
+ name: text('name'),
164
+ generatedName: text('gen_name').generatedAlwaysAs(
165
+ (): SQL => sql`${from.users.name} || 'to delete'`,
166
+ { mode: 'stored' },
167
+ ),
168
+ }),
169
+ };
170
+ const to = {
171
+ users: singlestoreTable('users', {
172
+ id: int('id'),
173
+ id2: int('id2'),
174
+ name: text('name'),
175
+ generatedName1: text('gen_name'),
176
+ }),
177
+ };
178
+
179
+ const { statements, sqlStatements } = await diffTestSchemasSingleStore(
180
+ from,
181
+ to,
182
+ [],
183
+ );
184
+
185
+ expect(statements).toStrictEqual([
186
+ {
187
+ columnAutoIncrement: false,
188
+ columnDefault: undefined,
189
+ columnGenerated: undefined,
190
+ columnName: 'gen_name',
191
+ columnNotNull: false,
192
+ columnOnUpdate: undefined,
193
+ columnPk: false,
194
+ newDataType: 'text',
195
+ schema: '',
196
+ tableName: 'users',
197
+ oldColumn: {
198
+ autoincrement: false,
199
+ generated: {
200
+ as: "`users`.`name` || 'to delete'",
201
+ type: 'stored',
202
+ },
203
+ name: 'gen_name',
204
+ notNull: false,
205
+ onUpdate: undefined,
206
+ primaryKey: false,
207
+ type: 'text',
208
+ },
209
+ type: 'alter_table_alter_column_drop_generated',
210
+ },
211
+ ]);
212
+ expect(sqlStatements).toStrictEqual([
213
+ 'ALTER TABLE `users` MODIFY COLUMN `gen_name` text;',
214
+ ]);
215
+ });
216
+
217
+ test('generated as callback: drop generated constraint as virtual', async () => {
218
+ const from = {
219
+ users: singlestoreTable('users', {
220
+ id: int('id'),
221
+ id2: int('id2'),
222
+ name: text('name'),
223
+ generatedName: text('gen_name').generatedAlwaysAs(
224
+ (): SQL => sql`${from.users.name} || 'to delete'`,
225
+ { mode: 'virtual' },
226
+ ),
227
+ }),
228
+ };
229
+ const to = {
230
+ users: singlestoreTable('users', {
231
+ id: int('id'),
232
+ id2: int('id2'),
233
+ name: text('name'),
234
+ generatedName1: text('gen_name'),
235
+ }),
236
+ };
237
+
238
+ const { statements, sqlStatements } = await diffTestSchemasSingleStore(
239
+ from,
240
+ to,
241
+ [],
242
+ );
243
+
244
+ expect(statements).toStrictEqual([
245
+ {
246
+ columnAutoIncrement: false,
247
+ columnDefault: undefined,
248
+ columnGenerated: undefined,
249
+ columnName: 'gen_name',
250
+ columnNotNull: false,
251
+ columnOnUpdate: undefined,
252
+ columnPk: false,
253
+ newDataType: 'text',
254
+ schema: '',
255
+ oldColumn: {
256
+ autoincrement: false,
257
+ generated: {
258
+ as: "`users`.`name` || 'to delete'",
259
+ type: 'virtual',
260
+ },
261
+ name: 'gen_name',
262
+ notNull: false,
263
+ onUpdate: undefined,
264
+ primaryKey: false,
265
+ type: 'text',
266
+ },
267
+ tableName: 'users',
268
+ type: 'alter_table_alter_column_drop_generated',
269
+ },
270
+ ]);
271
+ expect(sqlStatements).toStrictEqual([
272
+ 'ALTER TABLE `users` DROP COLUMN `gen_name`;',
273
+ 'ALTER TABLE `users` ADD `gen_name` text;',
274
+ ]);
275
+ });
276
+
277
+ test('generated as callback: change generated constraint type from virtual to stored', async () => {
278
+ const from = {
279
+ users: singlestoreTable('users', {
280
+ id: int('id'),
281
+ id2: int('id2'),
282
+ name: text('name'),
283
+ generatedName: text('gen_name').generatedAlwaysAs(
284
+ (): SQL => sql`${from.users.name}`,
285
+ { mode: 'virtual' },
286
+ ),
287
+ }),
288
+ };
289
+ const to = {
290
+ users: singlestoreTable('users', {
291
+ id: int('id'),
292
+ id2: int('id2'),
293
+ name: text('name'),
294
+ generatedName: text('gen_name').generatedAlwaysAs(
295
+ (): SQL => sql`${to.users.name} || 'hello'`,
296
+ { mode: 'stored' },
297
+ ),
298
+ }),
299
+ };
300
+
301
+ const { statements, sqlStatements } = await diffTestSchemasSingleStore(
302
+ from,
303
+ to,
304
+ [],
305
+ );
306
+
307
+ expect(statements).toStrictEqual([
308
+ {
309
+ columnAutoIncrement: false,
310
+ columnDefault: undefined,
311
+ columnGenerated: {
312
+ as: "`users`.`name` || 'hello'",
313
+ type: 'stored',
314
+ },
315
+ columnName: 'gen_name',
316
+ columnNotNull: false,
317
+ columnOnUpdate: undefined,
318
+ columnPk: false,
319
+ newDataType: 'text',
320
+ schema: '',
321
+ tableName: 'users',
322
+ type: 'alter_table_alter_column_alter_generated',
323
+ },
324
+ ]);
325
+ expect(sqlStatements).toStrictEqual([
326
+ 'ALTER TABLE `users` drop column `gen_name`;',
327
+ "ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS (`users`.`name` || 'hello') STORED;",
328
+ ]);
329
+ });
330
+
331
+ test('generated as callback: change generated constraint type from stored to virtual', async () => {
332
+ const from = {
333
+ users: singlestoreTable('users', {
334
+ id: int('id'),
335
+ id2: int('id2'),
336
+ name: text('name'),
337
+ generatedName: text('gen_name').generatedAlwaysAs(
338
+ (): SQL => sql`${from.users.name}`,
339
+ ),
340
+ }),
341
+ };
342
+ const to = {
343
+ users: singlestoreTable('users', {
344
+ id: int('id'),
345
+ id2: int('id2'),
346
+ name: text('name'),
347
+ generatedName: text('gen_name').generatedAlwaysAs(
348
+ (): SQL => sql`${to.users.name} || 'hello'`,
349
+ ),
350
+ }),
351
+ };
352
+
353
+ const { statements, sqlStatements } = await diffTestSchemasSingleStore(
354
+ from,
355
+ to,
356
+ [],
357
+ );
358
+
359
+ expect(statements).toStrictEqual([
360
+ {
361
+ columnAutoIncrement: false,
362
+ columnDefault: undefined,
363
+ columnGenerated: {
364
+ as: "`users`.`name` || 'hello'",
365
+ type: 'virtual',
366
+ },
367
+ columnName: 'gen_name',
368
+ columnNotNull: false,
369
+ columnOnUpdate: undefined,
370
+ columnPk: false,
371
+ newDataType: 'text',
372
+ schema: '',
373
+ tableName: 'users',
374
+ type: 'alter_table_alter_column_alter_generated',
375
+ },
376
+ ]);
377
+ expect(sqlStatements).toStrictEqual([
378
+ 'ALTER TABLE `users` drop column `gen_name`;',
379
+ "ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS (`users`.`name` || 'hello') VIRTUAL;",
380
+ ]);
381
+ });
382
+
383
+ test('generated as callback: change generated constraint', async () => {
384
+ const from = {
385
+ users: singlestoreTable('users', {
386
+ id: int('id'),
387
+ id2: int('id2'),
388
+ name: text('name'),
389
+ generatedName: text('gen_name').generatedAlwaysAs(
390
+ (): SQL => sql`${from.users.name}`,
391
+ ),
392
+ }),
393
+ };
394
+ const to = {
395
+ users: singlestoreTable('users', {
396
+ id: int('id'),
397
+ id2: int('id2'),
398
+ name: text('name'),
399
+ generatedName: text('gen_name').generatedAlwaysAs(
400
+ (): SQL => sql`${to.users.name} || 'hello'`,
401
+ ),
402
+ }),
403
+ };
404
+
405
+ const { statements, sqlStatements } = await diffTestSchemasSingleStore(
406
+ from,
407
+ to,
408
+ [],
409
+ );
410
+
411
+ expect(statements).toStrictEqual([
412
+ {
413
+ columnAutoIncrement: false,
414
+ columnDefault: undefined,
415
+ columnGenerated: {
416
+ as: "`users`.`name` || 'hello'",
417
+ type: 'virtual',
418
+ },
419
+ columnName: 'gen_name',
420
+ columnNotNull: false,
421
+ columnOnUpdate: undefined,
422
+ columnPk: false,
423
+ newDataType: 'text',
424
+ schema: '',
425
+ tableName: 'users',
426
+ type: 'alter_table_alter_column_alter_generated',
427
+ },
428
+ ]);
429
+ expect(sqlStatements).toStrictEqual([
430
+ 'ALTER TABLE `users` drop column `gen_name`;',
431
+ "ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS (`users`.`name` || 'hello') VIRTUAL;",
432
+ ]);
433
+ });
434
+
435
+ // ---
436
+
437
+ test('generated as sql: add column with generated constraint', async () => {
438
+ const from = {
439
+ users: singlestoreTable('users', {
440
+ id: int('id'),
441
+ id2: int('id2'),
442
+ name: text('name'),
443
+ }),
444
+ };
445
+ const to = {
446
+ users: singlestoreTable('users', {
447
+ id: int('id'),
448
+ id2: int('id2'),
449
+ name: text('name'),
450
+ generatedName: text('gen_name').generatedAlwaysAs(
451
+ sql`\`users\`.\`name\` || 'hello'`,
452
+ { mode: 'stored' },
453
+ ),
454
+ }),
455
+ };
456
+
457
+ const { statements, sqlStatements } = await diffTestSchemasSingleStore(
458
+ from,
459
+ to,
460
+ [],
461
+ );
462
+
463
+ expect(statements).toStrictEqual([
464
+ {
465
+ column: {
466
+ generated: {
467
+ as: "`users`.`name` || 'hello'",
468
+ type: 'stored',
469
+ },
470
+ autoincrement: false,
471
+ name: 'gen_name',
472
+ notNull: false,
473
+ primaryKey: false,
474
+ type: 'text',
475
+ },
476
+ schema: '',
477
+ tableName: 'users',
478
+ type: 'alter_table_add_column',
479
+ },
480
+ ]);
481
+ expect(sqlStatements).toStrictEqual([
482
+ "ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS (`users`.`name` || 'hello') STORED;",
483
+ ]);
484
+ });
485
+
486
+ test('generated as sql: add generated constraint to an exisiting column as stored', async () => {
487
+ const from = {
488
+ users: singlestoreTable('users', {
489
+ id: int('id'),
490
+ id2: int('id2'),
491
+ name: text('name'),
492
+ generatedName: text('gen_name').notNull(),
493
+ }),
494
+ };
495
+ const to = {
496
+ users: singlestoreTable('users', {
497
+ id: int('id'),
498
+ id2: int('id2'),
499
+ name: text('name'),
500
+ generatedName: text('gen_name')
501
+ .notNull()
502
+ .generatedAlwaysAs(sql`\`users\`.\`name\` || 'to add'`, {
503
+ mode: 'stored',
504
+ }),
505
+ }),
506
+ };
507
+
508
+ const { statements, sqlStatements } = await diffTestSchemasSingleStore(
509
+ from,
510
+ to,
511
+ [],
512
+ );
513
+
514
+ expect(statements).toStrictEqual([
515
+ {
516
+ columnDefault: undefined,
517
+ columnGenerated: {
518
+ as: "`users`.`name` || 'to add'",
519
+ type: 'stored',
520
+ },
521
+ columnAutoIncrement: false,
522
+ columnName: 'gen_name',
523
+ columnNotNull: true,
524
+ columnOnUpdate: undefined,
525
+ columnPk: false,
526
+ newDataType: 'text',
527
+ schema: '',
528
+ tableName: 'users',
529
+ type: 'alter_table_alter_column_set_generated',
530
+ },
531
+ ]);
532
+ expect(sqlStatements).toStrictEqual([
533
+ "ALTER TABLE `users` MODIFY COLUMN `gen_name` text NOT NULL GENERATED ALWAYS AS (`users`.`name` || 'to add') STORED;",
534
+ ]);
535
+ });
536
+
537
+ test('generated as sql: add generated constraint to an exisiting column as virtual', async () => {
538
+ const from = {
539
+ users: singlestoreTable('users', {
540
+ id: int('id'),
541
+ id2: int('id2'),
542
+ name: text('name'),
543
+ generatedName: text('gen_name').notNull(),
544
+ }),
545
+ };
546
+ const to = {
547
+ users: singlestoreTable('users', {
548
+ id: int('id'),
549
+ id2: int('id2'),
550
+ name: text('name'),
551
+ generatedName: text('gen_name')
552
+ .notNull()
553
+ .generatedAlwaysAs(sql`\`users\`.\`name\` || 'to add'`, {
554
+ mode: 'virtual',
555
+ }),
556
+ }),
557
+ };
558
+
559
+ const { statements, sqlStatements } = await diffTestSchemasSingleStore(
560
+ from,
561
+ to,
562
+ [],
563
+ );
564
+
565
+ expect(statements).toStrictEqual([
566
+ {
567
+ columnAutoIncrement: false,
568
+ columnDefault: undefined,
569
+ columnGenerated: {
570
+ as: "`users`.`name` || 'to add'",
571
+ type: 'virtual',
572
+ },
573
+ columnName: 'gen_name',
574
+ columnNotNull: true,
575
+ columnOnUpdate: undefined,
576
+ columnPk: false,
577
+ newDataType: 'text',
578
+ schema: '',
579
+ tableName: 'users',
580
+ type: 'alter_table_alter_column_set_generated',
581
+ },
582
+ ]);
583
+ expect(sqlStatements).toStrictEqual([
584
+ 'ALTER TABLE `users` DROP COLUMN `gen_name`;',
585
+ "ALTER TABLE `users` ADD `gen_name` text NOT NULL GENERATED ALWAYS AS (`users`.`name` || 'to add') VIRTUAL;",
586
+ ]);
587
+ });
588
+
589
+ test('generated as sql: drop generated constraint as stored', async () => {
590
+ const from = {
591
+ users: singlestoreTable('users', {
592
+ id: int('id'),
593
+ id2: int('id2'),
594
+ name: text('name'),
595
+ generatedName: text('gen_name').generatedAlwaysAs(
596
+ sql`\`users\`.\`name\` || 'to delete'`,
597
+ { mode: 'stored' },
598
+ ),
599
+ }),
600
+ };
601
+ const to = {
602
+ users: singlestoreTable('users', {
603
+ id: int('id'),
604
+ id2: int('id2'),
605
+ name: text('name'),
606
+ generatedName1: text('gen_name'),
607
+ }),
608
+ };
609
+
610
+ const { statements, sqlStatements } = await diffTestSchemasSingleStore(
611
+ from,
612
+ to,
613
+ [],
614
+ );
615
+
616
+ expect(statements).toStrictEqual([
617
+ {
618
+ columnAutoIncrement: false,
619
+ columnDefault: undefined,
620
+ columnGenerated: undefined,
621
+ columnName: 'gen_name',
622
+ columnNotNull: false,
623
+ columnOnUpdate: undefined,
624
+ columnPk: false,
625
+ newDataType: 'text',
626
+ schema: '',
627
+ tableName: 'users',
628
+ oldColumn: {
629
+ autoincrement: false,
630
+ generated: {
631
+ as: "`users`.`name` || 'to delete'",
632
+ type: 'stored',
633
+ },
634
+ name: 'gen_name',
635
+ notNull: false,
636
+ onUpdate: undefined,
637
+ primaryKey: false,
638
+ type: 'text',
639
+ },
640
+ type: 'alter_table_alter_column_drop_generated',
641
+ },
642
+ ]);
643
+ expect(sqlStatements).toStrictEqual([
644
+ 'ALTER TABLE `users` MODIFY COLUMN `gen_name` text;',
645
+ ]);
646
+ });
647
+
648
+ test('generated as sql: drop generated constraint as virtual', async () => {
649
+ const from = {
650
+ users: singlestoreTable('users', {
651
+ id: int('id'),
652
+ id2: int('id2'),
653
+ name: text('name'),
654
+ generatedName: text('gen_name').generatedAlwaysAs(
655
+ sql`\`users\`.\`name\` || 'to delete'`,
656
+ { mode: 'virtual' },
657
+ ),
658
+ }),
659
+ };
660
+ const to = {
661
+ users: singlestoreTable('users', {
662
+ id: int('id'),
663
+ id2: int('id2'),
664
+ name: text('name'),
665
+ generatedName1: text('gen_name'),
666
+ }),
667
+ };
668
+
669
+ const { statements, sqlStatements } = await diffTestSchemasSingleStore(
670
+ from,
671
+ to,
672
+ [],
673
+ );
674
+
675
+ expect(statements).toStrictEqual([
676
+ {
677
+ columnAutoIncrement: false,
678
+ columnDefault: undefined,
679
+ columnGenerated: undefined,
680
+ columnName: 'gen_name',
681
+ columnNotNull: false,
682
+ columnOnUpdate: undefined,
683
+ columnPk: false,
684
+ newDataType: 'text',
685
+ schema: '',
686
+ oldColumn: {
687
+ autoincrement: false,
688
+ generated: {
689
+ as: "`users`.`name` || 'to delete'",
690
+ type: 'virtual',
691
+ },
692
+ name: 'gen_name',
693
+ notNull: false,
694
+ onUpdate: undefined,
695
+ primaryKey: false,
696
+ type: 'text',
697
+ },
698
+ tableName: 'users',
699
+ type: 'alter_table_alter_column_drop_generated',
700
+ },
701
+ ]);
702
+ expect(sqlStatements).toStrictEqual([
703
+ 'ALTER TABLE `users` DROP COLUMN `gen_name`;',
704
+ 'ALTER TABLE `users` ADD `gen_name` text;',
705
+ ]);
706
+ });
707
+
708
+ test('generated as sql: change generated constraint type from virtual to stored', async () => {
709
+ const from = {
710
+ users: singlestoreTable('users', {
711
+ id: int('id'),
712
+ id2: int('id2'),
713
+ name: text('name'),
714
+ generatedName: text('gen_name').generatedAlwaysAs(
715
+ sql`\`users\`.\`name\``,
716
+ { mode: 'virtual' },
717
+ ),
718
+ }),
719
+ };
720
+ const to = {
721
+ users: singlestoreTable('users', {
722
+ id: int('id'),
723
+ id2: int('id2'),
724
+ name: text('name'),
725
+ generatedName: text('gen_name').generatedAlwaysAs(
726
+ sql`\`users\`.\`name\` || 'hello'`,
727
+ { mode: 'stored' },
728
+ ),
729
+ }),
730
+ };
731
+
732
+ const { statements, sqlStatements } = await diffTestSchemasSingleStore(
733
+ from,
734
+ to,
735
+ [],
736
+ );
737
+
738
+ expect(statements).toStrictEqual([
739
+ {
740
+ columnAutoIncrement: false,
741
+ columnDefault: undefined,
742
+ columnGenerated: {
743
+ as: "`users`.`name` || 'hello'",
744
+ type: 'stored',
745
+ },
746
+ columnName: 'gen_name',
747
+ columnNotNull: false,
748
+ columnOnUpdate: undefined,
749
+ columnPk: false,
750
+ newDataType: 'text',
751
+ schema: '',
752
+ tableName: 'users',
753
+ type: 'alter_table_alter_column_alter_generated',
754
+ },
755
+ ]);
756
+ expect(sqlStatements).toStrictEqual([
757
+ 'ALTER TABLE `users` drop column `gen_name`;',
758
+ "ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS (`users`.`name` || 'hello') STORED;",
759
+ ]);
760
+ });
761
+
762
+ test('generated as sql: change generated constraint type from stored to virtual', async () => {
763
+ const from = {
764
+ users: singlestoreTable('users', {
765
+ id: int('id'),
766
+ id2: int('id2'),
767
+ name: text('name'),
768
+ generatedName: text('gen_name').generatedAlwaysAs(
769
+ sql`\`users\`.\`name\``,
770
+ ),
771
+ }),
772
+ };
773
+ const to = {
774
+ users: singlestoreTable('users', {
775
+ id: int('id'),
776
+ id2: int('id2'),
777
+ name: text('name'),
778
+ generatedName: text('gen_name').generatedAlwaysAs(
779
+ sql`\`users\`.\`name\` || 'hello'`,
780
+ ),
781
+ }),
782
+ };
783
+
784
+ const { statements, sqlStatements } = await diffTestSchemasSingleStore(
785
+ from,
786
+ to,
787
+ [],
788
+ );
789
+
790
+ expect(statements).toStrictEqual([
791
+ {
792
+ columnAutoIncrement: false,
793
+ columnDefault: undefined,
794
+ columnGenerated: {
795
+ as: "`users`.`name` || 'hello'",
796
+ type: 'virtual',
797
+ },
798
+ columnName: 'gen_name',
799
+ columnNotNull: false,
800
+ columnOnUpdate: undefined,
801
+ columnPk: false,
802
+ newDataType: 'text',
803
+ schema: '',
804
+ tableName: 'users',
805
+ type: 'alter_table_alter_column_alter_generated',
806
+ },
807
+ ]);
808
+ expect(sqlStatements).toStrictEqual([
809
+ 'ALTER TABLE `users` drop column `gen_name`;',
810
+ "ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS (`users`.`name` || 'hello') VIRTUAL;",
811
+ ]);
812
+ });
813
+
814
+ test('generated as sql: change generated constraint', async () => {
815
+ const from = {
816
+ users: singlestoreTable('users', {
817
+ id: int('id'),
818
+ id2: int('id2'),
819
+ name: text('name'),
820
+ generatedName: text('gen_name').generatedAlwaysAs(
821
+ sql`\`users\`.\`name\``,
822
+ ),
823
+ }),
824
+ };
825
+ const to = {
826
+ users: singlestoreTable('users', {
827
+ id: int('id'),
828
+ id2: int('id2'),
829
+ name: text('name'),
830
+ generatedName: text('gen_name').generatedAlwaysAs(
831
+ sql`\`users\`.\`name\` || 'hello'`,
832
+ ),
833
+ }),
834
+ };
835
+
836
+ const { statements, sqlStatements } = await diffTestSchemasSingleStore(
837
+ from,
838
+ to,
839
+ [],
840
+ );
841
+
842
+ expect(statements).toStrictEqual([
843
+ {
844
+ columnAutoIncrement: false,
845
+ columnDefault: undefined,
846
+ columnGenerated: {
847
+ as: "`users`.`name` || 'hello'",
848
+ type: 'virtual',
849
+ },
850
+ columnName: 'gen_name',
851
+ columnNotNull: false,
852
+ columnOnUpdate: undefined,
853
+ columnPk: false,
854
+ newDataType: 'text',
855
+ schema: '',
856
+ tableName: 'users',
857
+ type: 'alter_table_alter_column_alter_generated',
858
+ },
859
+ ]);
860
+ expect(sqlStatements).toStrictEqual([
861
+ 'ALTER TABLE `users` drop column `gen_name`;',
862
+ "ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS (`users`.`name` || 'hello') VIRTUAL;",
863
+ ]);
864
+ });
865
+
866
+ // ---
867
+
868
+ test('generated as string: add column with generated constraint', async () => {
869
+ const from = {
870
+ users: singlestoreTable('users', {
871
+ id: int('id'),
872
+ id2: int('id2'),
873
+ name: text('name'),
874
+ }),
875
+ };
876
+ const to = {
877
+ users: singlestoreTable('users', {
878
+ id: int('id'),
879
+ id2: int('id2'),
880
+ name: text('name'),
881
+ generatedName: text('gen_name').generatedAlwaysAs(
882
+ `\`users\`.\`name\` || 'hello'`,
883
+ { mode: 'stored' },
884
+ ),
885
+ }),
886
+ };
887
+
888
+ const { statements, sqlStatements } = await diffTestSchemasSingleStore(
889
+ from,
890
+ to,
891
+ [],
892
+ );
893
+
894
+ expect(statements).toStrictEqual([
895
+ {
896
+ column: {
897
+ generated: {
898
+ as: "`users`.`name` || 'hello'",
899
+ type: 'stored',
900
+ },
901
+ autoincrement: false,
902
+ name: 'gen_name',
903
+ notNull: false,
904
+ primaryKey: false,
905
+ type: 'text',
906
+ },
907
+ schema: '',
908
+ tableName: 'users',
909
+ type: 'alter_table_add_column',
910
+ },
911
+ ]);
912
+ expect(sqlStatements).toStrictEqual([
913
+ "ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS (`users`.`name` || 'hello') STORED;",
914
+ ]);
915
+ });
916
+
917
+ test('generated as string: add generated constraint to an exisiting column as stored', async () => {
918
+ const from = {
919
+ users: singlestoreTable('users', {
920
+ id: int('id'),
921
+ id2: int('id2'),
922
+ name: text('name'),
923
+ generatedName: text('gen_name').notNull(),
924
+ }),
925
+ };
926
+ const to = {
927
+ users: singlestoreTable('users', {
928
+ id: int('id'),
929
+ id2: int('id2'),
930
+ name: text('name'),
931
+ generatedName: text('gen_name')
932
+ .notNull()
933
+ .generatedAlwaysAs(`\`users\`.\`name\` || 'to add'`, {
934
+ mode: 'stored',
935
+ }),
936
+ }),
937
+ };
938
+
939
+ const { statements, sqlStatements } = await diffTestSchemasSingleStore(
940
+ from,
941
+ to,
942
+ [],
943
+ );
944
+
945
+ expect(statements).toStrictEqual([
946
+ {
947
+ columnDefault: undefined,
948
+ columnGenerated: {
949
+ as: "`users`.`name` || 'to add'",
950
+ type: 'stored',
951
+ },
952
+ columnAutoIncrement: false,
953
+ columnName: 'gen_name',
954
+ columnNotNull: true,
955
+ columnOnUpdate: undefined,
956
+ columnPk: false,
957
+ newDataType: 'text',
958
+ schema: '',
959
+ tableName: 'users',
960
+ type: 'alter_table_alter_column_set_generated',
961
+ },
962
+ ]);
963
+ expect(sqlStatements).toStrictEqual([
964
+ "ALTER TABLE `users` MODIFY COLUMN `gen_name` text NOT NULL GENERATED ALWAYS AS (`users`.`name` || 'to add') STORED;",
965
+ ]);
966
+ });
967
+
968
+ test('generated as string: add generated constraint to an exisiting column as virtual', async () => {
969
+ const from = {
970
+ users: singlestoreTable('users', {
971
+ id: int('id'),
972
+ id2: int('id2'),
973
+ name: text('name'),
974
+ generatedName: text('gen_name').notNull(),
975
+ }),
976
+ };
977
+ const to = {
978
+ users: singlestoreTable('users', {
979
+ id: int('id'),
980
+ id2: int('id2'),
981
+ name: text('name'),
982
+ generatedName: text('gen_name')
983
+ .notNull()
984
+ .generatedAlwaysAs(`\`users\`.\`name\` || 'to add'`, {
985
+ mode: 'virtual',
986
+ }),
987
+ }),
988
+ };
989
+
990
+ const { statements, sqlStatements } = await diffTestSchemasSingleStore(
991
+ from,
992
+ to,
993
+ [],
994
+ );
995
+
996
+ expect(statements).toStrictEqual([
997
+ {
998
+ columnAutoIncrement: false,
999
+ columnDefault: undefined,
1000
+ columnGenerated: {
1001
+ as: "`users`.`name` || 'to add'",
1002
+ type: 'virtual',
1003
+ },
1004
+ columnName: 'gen_name',
1005
+ columnNotNull: true,
1006
+ columnOnUpdate: undefined,
1007
+ columnPk: false,
1008
+ newDataType: 'text',
1009
+ schema: '',
1010
+ tableName: 'users',
1011
+ type: 'alter_table_alter_column_set_generated',
1012
+ },
1013
+ ]);
1014
+ expect(sqlStatements).toStrictEqual([
1015
+ 'ALTER TABLE `users` DROP COLUMN `gen_name`;',
1016
+ "ALTER TABLE `users` ADD `gen_name` text NOT NULL GENERATED ALWAYS AS (`users`.`name` || 'to add') VIRTUAL;",
1017
+ ]);
1018
+ });
1019
+
1020
+ test('generated as string: drop generated constraint as stored', async () => {
1021
+ const from = {
1022
+ users: singlestoreTable('users', {
1023
+ id: int('id'),
1024
+ id2: int('id2'),
1025
+ name: text('name'),
1026
+ generatedName: text('gen_name').generatedAlwaysAs(
1027
+ `\`users\`.\`name\` || 'to delete'`,
1028
+ { mode: 'stored' },
1029
+ ),
1030
+ }),
1031
+ };
1032
+ const to = {
1033
+ users: singlestoreTable('users', {
1034
+ id: int('id'),
1035
+ id2: int('id2'),
1036
+ name: text('name'),
1037
+ generatedName1: text('gen_name'),
1038
+ }),
1039
+ };
1040
+
1041
+ const { statements, sqlStatements } = await diffTestSchemasSingleStore(
1042
+ from,
1043
+ to,
1044
+ [],
1045
+ );
1046
+
1047
+ expect(statements).toStrictEqual([
1048
+ {
1049
+ columnAutoIncrement: false,
1050
+ columnDefault: undefined,
1051
+ columnGenerated: undefined,
1052
+ columnName: 'gen_name',
1053
+ columnNotNull: false,
1054
+ columnOnUpdate: undefined,
1055
+ columnPk: false,
1056
+ newDataType: 'text',
1057
+ schema: '',
1058
+ tableName: 'users',
1059
+ oldColumn: {
1060
+ autoincrement: false,
1061
+ generated: {
1062
+ as: "`users`.`name` || 'to delete'",
1063
+ type: 'stored',
1064
+ },
1065
+ name: 'gen_name',
1066
+ notNull: false,
1067
+ onUpdate: undefined,
1068
+ primaryKey: false,
1069
+ type: 'text',
1070
+ },
1071
+ type: 'alter_table_alter_column_drop_generated',
1072
+ },
1073
+ ]);
1074
+ expect(sqlStatements).toStrictEqual([
1075
+ 'ALTER TABLE `users` MODIFY COLUMN `gen_name` text;',
1076
+ ]);
1077
+ });
1078
+
1079
+ test('generated as string: drop generated constraint as virtual', async () => {
1080
+ const from = {
1081
+ users: singlestoreTable('users', {
1082
+ id: int('id'),
1083
+ id2: int('id2'),
1084
+ name: text('name'),
1085
+ generatedName: text('gen_name').generatedAlwaysAs(
1086
+ `\`users\`.\`name\` || 'to delete'`,
1087
+ { mode: 'virtual' },
1088
+ ),
1089
+ }),
1090
+ };
1091
+ const to = {
1092
+ users: singlestoreTable('users', {
1093
+ id: int('id'),
1094
+ id2: int('id2'),
1095
+ name: text('name'),
1096
+ generatedName1: text('gen_name'),
1097
+ }),
1098
+ };
1099
+
1100
+ const { statements, sqlStatements } = await diffTestSchemasSingleStore(
1101
+ from,
1102
+ to,
1103
+ [],
1104
+ );
1105
+
1106
+ expect(statements).toStrictEqual([
1107
+ {
1108
+ columnAutoIncrement: false,
1109
+ columnDefault: undefined,
1110
+ columnGenerated: undefined,
1111
+ columnName: 'gen_name',
1112
+ columnNotNull: false,
1113
+ columnOnUpdate: undefined,
1114
+ columnPk: false,
1115
+ newDataType: 'text',
1116
+ schema: '',
1117
+ oldColumn: {
1118
+ autoincrement: false,
1119
+ generated: {
1120
+ as: "`users`.`name` || 'to delete'",
1121
+ type: 'virtual',
1122
+ },
1123
+ name: 'gen_name',
1124
+ notNull: false,
1125
+ onUpdate: undefined,
1126
+ primaryKey: false,
1127
+ type: 'text',
1128
+ },
1129
+ tableName: 'users',
1130
+ type: 'alter_table_alter_column_drop_generated',
1131
+ },
1132
+ ]);
1133
+ expect(sqlStatements).toStrictEqual([
1134
+ 'ALTER TABLE `users` DROP COLUMN `gen_name`;',
1135
+ 'ALTER TABLE `users` ADD `gen_name` text;',
1136
+ ]);
1137
+ });
1138
+
1139
+ test('generated as string: change generated constraint type from virtual to stored', async () => {
1140
+ const from = {
1141
+ users: singlestoreTable('users', {
1142
+ id: int('id'),
1143
+ id2: int('id2'),
1144
+ name: text('name'),
1145
+ generatedName: text('gen_name').generatedAlwaysAs(`\`users\`.\`name\``, {
1146
+ mode: 'virtual',
1147
+ }),
1148
+ }),
1149
+ };
1150
+ const to = {
1151
+ users: singlestoreTable('users', {
1152
+ id: int('id'),
1153
+ id2: int('id2'),
1154
+ name: text('name'),
1155
+ generatedName: text('gen_name').generatedAlwaysAs(
1156
+ `\`users\`.\`name\` || 'hello'`,
1157
+ { mode: 'stored' },
1158
+ ),
1159
+ }),
1160
+ };
1161
+
1162
+ const { statements, sqlStatements } = await diffTestSchemasSingleStore(
1163
+ from,
1164
+ to,
1165
+ [],
1166
+ );
1167
+
1168
+ expect(statements).toStrictEqual([
1169
+ {
1170
+ columnAutoIncrement: false,
1171
+ columnDefault: undefined,
1172
+ columnGenerated: {
1173
+ as: "`users`.`name` || 'hello'",
1174
+ type: 'stored',
1175
+ },
1176
+ columnName: 'gen_name',
1177
+ columnNotNull: false,
1178
+ columnOnUpdate: undefined,
1179
+ columnPk: false,
1180
+ newDataType: 'text',
1181
+ schema: '',
1182
+ tableName: 'users',
1183
+ type: 'alter_table_alter_column_alter_generated',
1184
+ },
1185
+ ]);
1186
+ expect(sqlStatements).toStrictEqual([
1187
+ 'ALTER TABLE `users` drop column `gen_name`;',
1188
+ "ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS (`users`.`name` || 'hello') STORED;",
1189
+ ]);
1190
+ });
1191
+
1192
+ test('generated as string: change generated constraint type from stored to virtual', async () => {
1193
+ const from = {
1194
+ users: singlestoreTable('users', {
1195
+ id: int('id'),
1196
+ id2: int('id2'),
1197
+ name: text('name'),
1198
+ generatedName: text('gen_name').generatedAlwaysAs(`\`users\`.\`name\``),
1199
+ }),
1200
+ };
1201
+ const to = {
1202
+ users: singlestoreTable('users', {
1203
+ id: int('id'),
1204
+ id2: int('id2'),
1205
+ name: text('name'),
1206
+ generatedName: text('gen_name').generatedAlwaysAs(
1207
+ `\`users\`.\`name\` || 'hello'`,
1208
+ ),
1209
+ }),
1210
+ };
1211
+
1212
+ const { statements, sqlStatements } = await diffTestSchemasSingleStore(
1213
+ from,
1214
+ to,
1215
+ [],
1216
+ );
1217
+
1218
+ expect(statements).toStrictEqual([
1219
+ {
1220
+ columnAutoIncrement: false,
1221
+ columnDefault: undefined,
1222
+ columnGenerated: {
1223
+ as: "`users`.`name` || 'hello'",
1224
+ type: 'virtual',
1225
+ },
1226
+ columnName: 'gen_name',
1227
+ columnNotNull: false,
1228
+ columnOnUpdate: undefined,
1229
+ columnPk: false,
1230
+ newDataType: 'text',
1231
+ schema: '',
1232
+ tableName: 'users',
1233
+ type: 'alter_table_alter_column_alter_generated',
1234
+ },
1235
+ ]);
1236
+ expect(sqlStatements).toStrictEqual([
1237
+ 'ALTER TABLE `users` drop column `gen_name`;',
1238
+ "ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS (`users`.`name` || 'hello') VIRTUAL;",
1239
+ ]);
1240
+ });
1241
+
1242
+ test('generated as string: change generated constraint', async () => {
1243
+ const from = {
1244
+ users: singlestoreTable('users', {
1245
+ id: int('id'),
1246
+ id2: int('id2'),
1247
+ name: text('name'),
1248
+ generatedName: text('gen_name').generatedAlwaysAs(`\`users\`.\`name\``),
1249
+ }),
1250
+ };
1251
+ const to = {
1252
+ users: singlestoreTable('users', {
1253
+ id: int('id'),
1254
+ id2: int('id2'),
1255
+ name: text('name'),
1256
+ generatedName: text('gen_name').generatedAlwaysAs(
1257
+ `\`users\`.\`name\` || 'hello'`,
1258
+ ),
1259
+ }),
1260
+ };
1261
+
1262
+ const { statements, sqlStatements } = await diffTestSchemasSingleStore(
1263
+ from,
1264
+ to,
1265
+ [],
1266
+ );
1267
+
1268
+ expect(statements).toStrictEqual([
1269
+ {
1270
+ columnAutoIncrement: false,
1271
+ columnDefault: undefined,
1272
+ columnGenerated: {
1273
+ as: "`users`.`name` || 'hello'",
1274
+ type: 'virtual',
1275
+ },
1276
+ columnName: 'gen_name',
1277
+ columnNotNull: false,
1278
+ columnOnUpdate: undefined,
1279
+ columnPk: false,
1280
+ newDataType: 'text',
1281
+ schema: '',
1282
+ tableName: 'users',
1283
+ type: 'alter_table_alter_column_alter_generated',
1284
+ },
1285
+ ]);
1286
+ expect(sqlStatements).toStrictEqual([
1287
+ 'ALTER TABLE `users` drop column `gen_name`;',
1288
+ "ALTER TABLE `users` ADD `gen_name` text GENERATED ALWAYS AS (`users`.`name` || 'hello') VIRTUAL;",
1289
+ ]);
1290
+ });