@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,444 @@
1
+ import Docker from 'dockerode';
2
+ import { SQL, sql } from 'drizzle-orm';
3
+ import {
4
+ bigint,
5
+ binary,
6
+ char,
7
+ date,
8
+ decimal,
9
+ double,
10
+ float,
11
+ int,
12
+ mediumint,
13
+ primaryKey,
14
+ singlestoreEnum,
15
+ singlestoreTable,
16
+ smallint,
17
+ text,
18
+ time,
19
+ timestamp,
20
+ tinyint,
21
+ varbinary,
22
+ varchar,
23
+ vector,
24
+ year,
25
+ } from 'drizzle-orm/singlestore-core';
26
+ import getPort from 'get-port';
27
+ import { Connection, createConnection } from 'mysql2/promise';
28
+ import { diffTestSchemasPushSingleStore, diffTestSchemasSingleStore } from 'tests/schemaDiffer';
29
+ import { v4 as uuid } from 'uuid';
30
+ import { expect } from 'vitest';
31
+ import { DialectSuite, run } from './common';
32
+
33
+ async function createDockerDB(context: any): Promise<string> {
34
+ const docker = new Docker();
35
+ const port = await getPort({ port: 3306 });
36
+ const image = 'ghcr.io/singlestore-labs/singlestoredb-dev:latest';
37
+
38
+ const pullStream = await docker.pull(image);
39
+ await new Promise((resolve, reject) =>
40
+ docker.modem.followProgress(pullStream, (err) => err ? reject(err) : resolve(err))
41
+ );
42
+
43
+ context.singlestoreContainer = await docker.createContainer({
44
+ Image: image,
45
+ Env: ['ROOT_PASSWORD=singlestore'],
46
+ name: `drizzle-integration-tests-${uuid()}`,
47
+ HostConfig: {
48
+ AutoRemove: true,
49
+ PortBindings: {
50
+ '3306/tcp': [{ HostPort: `${port}` }],
51
+ },
52
+ },
53
+ });
54
+
55
+ await context.singlestoreContainer.start();
56
+ await new Promise((resolve) => setTimeout(resolve, 4000));
57
+
58
+ return `singlestore://root:singlestore@localhost:${port}/`;
59
+ }
60
+
61
+ const singlestoreSuite: DialectSuite = {
62
+ allTypes: async function(context: any): Promise<void> {
63
+ const schema1 = {
64
+ allBigInts: singlestoreTable('all_big_ints', {
65
+ simple: bigint('simple', { mode: 'number' }),
66
+ columnNotNull: bigint('column_not_null', { mode: 'number' }).notNull(),
67
+ columnDefault: bigint('column_default', { mode: 'number' }).default(12),
68
+ columnDefaultSql: bigint('column_default_sql', {
69
+ mode: 'number',
70
+ }).default(12),
71
+ }),
72
+ allBools: singlestoreTable('all_bools', {
73
+ simple: tinyint('simple'),
74
+ columnNotNull: tinyint('column_not_null').notNull(),
75
+ columnDefault: tinyint('column_default').default(1),
76
+ }),
77
+ allChars: singlestoreTable('all_chars', {
78
+ simple: char('simple', { length: 1 }),
79
+ columnNotNull: char('column_not_null', { length: 45 }).notNull(),
80
+ // columnDefault: char("column_default", { length: 1 }).default("h"),
81
+ columnDefaultSql: char('column_default_sql', { length: 1 }).default(
82
+ 'h',
83
+ ),
84
+ }),
85
+ // allDateTimes: singlestoreTable("all_date_times", {
86
+ // simple: datetime("simple", { mode: "string", fsp: 1 }),
87
+ // columnNotNull: datetime("column_not_null", {
88
+ // mode: "string",
89
+ // }).notNull(),
90
+ // columnDefault: datetime("column_default", { mode: "string" }).default(
91
+ // "2023-03-01 14:05:29"
92
+ // ),
93
+ // }),
94
+ allDates: singlestoreTable('all_dates', {
95
+ simple: date('simple', { mode: 'string' }),
96
+ column_not_null: date('column_not_null', { mode: 'string' }).notNull(),
97
+ column_default: date('column_default', { mode: 'string' }).default(
98
+ '2023-03-01',
99
+ ),
100
+ }),
101
+ allDecimals: singlestoreTable('all_decimals', {
102
+ simple: decimal('simple', { precision: 1, scale: 0 }),
103
+ columnNotNull: decimal('column_not_null', {
104
+ precision: 45,
105
+ scale: 3,
106
+ }).notNull(),
107
+ columnDefault: decimal('column_default', {
108
+ precision: 10,
109
+ scale: 0,
110
+ }).default('100'),
111
+ columnDefaultSql: decimal('column_default_sql', {
112
+ precision: 10,
113
+ scale: 0,
114
+ }).default('101'),
115
+ }),
116
+
117
+ allDoubles: singlestoreTable('all_doubles', {
118
+ simple: double('simple'),
119
+ columnNotNull: double('column_not_null').notNull(),
120
+ columnDefault: double('column_default').default(100),
121
+ columnDefaultSql: double('column_default_sql').default(101),
122
+ }),
123
+
124
+ allEnums: singlestoreTable('all_enums', {
125
+ simple: singlestoreEnum('simple', ['hi', 'hello']),
126
+ }),
127
+
128
+ allEnums1: singlestoreTable('all_enums1', {
129
+ simple: singlestoreEnum('simple', ['hi', 'hello']).default('hi'),
130
+ }),
131
+
132
+ allFloats: singlestoreTable('all_floats', {
133
+ columnNotNull: float('column_not_null').notNull(),
134
+ columnDefault: float('column_default').default(100),
135
+ columnDefaultSql: float('column_default_sql').default(101),
136
+ }),
137
+
138
+ allInts: singlestoreTable('all_ints', {
139
+ simple: int('simple'),
140
+ columnNotNull: int('column_not_null').notNull(),
141
+ columnDefault: int('column_default').default(100),
142
+ columnDefaultSql: int('column_default_sql').default(101),
143
+ }),
144
+
145
+ allIntsRef: singlestoreTable('all_ints_ref', {
146
+ simple: int('simple'),
147
+ columnNotNull: int('column_not_null').notNull(),
148
+ columnDefault: int('column_default').default(100),
149
+ columnDefaultSql: int('column_default_sql').default(101),
150
+ }),
151
+
152
+ // allJsons: singlestoreTable("all_jsons", {
153
+ // columnDefaultObject: json("column_default_object")
154
+ // .default({ hello: "world world" })
155
+ // .notNull(),
156
+ // columnDefaultArray: json("column_default_array").default({
157
+ // hello: { "world world": ["foo", "bar"] },
158
+ // foo: "bar",
159
+ // fe: 23,
160
+ // }),
161
+ // column: json("column"),
162
+ // }),
163
+
164
+ allMInts: singlestoreTable('all_m_ints', {
165
+ simple: mediumint('simple'),
166
+ columnNotNull: mediumint('column_not_null').notNull(),
167
+ columnDefault: mediumint('column_default').default(100),
168
+ columnDefaultSql: mediumint('column_default_sql').default(101),
169
+ }),
170
+
171
+ allReals: singlestoreTable('all_reals', {
172
+ simple: double('simple', { precision: 5, scale: 2 }),
173
+ columnNotNull: double('column_not_null').notNull(),
174
+ columnDefault: double('column_default').default(100),
175
+ columnDefaultSql: double('column_default_sql').default(101),
176
+ }),
177
+
178
+ allSInts: singlestoreTable('all_s_ints', {
179
+ simple: smallint('simple'),
180
+ columnNotNull: smallint('column_not_null').notNull(),
181
+ columnDefault: smallint('column_default').default(100),
182
+ columnDefaultSql: smallint('column_default_sql').default(101),
183
+ }),
184
+
185
+ // allSmallSerials: singlestoreTable("all_small_serials", {
186
+ // columnAll: serial("column_all").notNull(),
187
+ // }),
188
+
189
+ allTInts: singlestoreTable('all_t_ints', {
190
+ simple: tinyint('simple'),
191
+ columnNotNull: tinyint('column_not_null').notNull(),
192
+ columnDefault: tinyint('column_default').default(10),
193
+ columnDefaultSql: tinyint('column_default_sql').default(11),
194
+ }),
195
+
196
+ allTexts: singlestoreTable('all_texts', {
197
+ simple: text('simple'),
198
+ columnNotNull: text('column_not_null').notNull(),
199
+ columnDefault: text('column_default').default('hello'),
200
+ columnDefaultSql: text('column_default_sql').default('hello'),
201
+ }),
202
+
203
+ allTimes: singlestoreTable('all_times', {
204
+ // simple: time("simple", { fsp: 1 }),
205
+ columnNotNull: time('column_not_null').notNull(),
206
+ columnDefault: time('column_default').default('22:12:12'),
207
+ }),
208
+
209
+ allTimestamps: singlestoreTable('all_timestamps', {
210
+ // columnDateNow: timestamp("column_date_now", {
211
+ // fsp: 1,
212
+ // mode: "string",
213
+ // }).default(sql`(now())`),
214
+ columnAll: timestamp('column_all', { mode: 'string' })
215
+ .default('2023-03-01 14:05:29')
216
+ .notNull(),
217
+ column: timestamp('column', { mode: 'string' }).default(
218
+ '2023-02-28 16:18:31',
219
+ ),
220
+ }),
221
+
222
+ allVarChars: singlestoreTable('all_var_chars', {
223
+ simple: varchar('simple', { length: 100 }),
224
+ columnNotNull: varchar('column_not_null', { length: 45 }).notNull(),
225
+ columnDefault: varchar('column_default', { length: 100 }).default(
226
+ 'hello',
227
+ ),
228
+ columnDefaultSql: varchar('column_default_sql', {
229
+ length: 100,
230
+ }).default('hello'),
231
+ }),
232
+
233
+ allVarbinaries: singlestoreTable('all_varbinaries', {
234
+ simple: varbinary('simple', { length: 100 }),
235
+ columnNotNull: varbinary('column_not_null', { length: 100 }).notNull(),
236
+ columnDefault: varbinary('column_default', { length: 12 }),
237
+ }),
238
+
239
+ allYears: singlestoreTable('all_years', {
240
+ simple: year('simple'),
241
+ columnNotNull: year('column_not_null').notNull(),
242
+ columnDefault: year('column_default').default(2022),
243
+ }),
244
+
245
+ binafry: singlestoreTable('binary', {
246
+ simple: binary('simple', { length: 1 }),
247
+ columnNotNull: binary('column_not_null', { length: 1 }).notNull(),
248
+ columnDefault: binary('column_default', { length: 12 }),
249
+ }),
250
+
251
+ allVectors: singlestoreTable('all_vectors', {
252
+ vectorSimple: vector('vector_simple', { dimensions: 1 }),
253
+ vectorElementType: vector('vector_element_type', { dimensions: 1, elementType: 'I8' }),
254
+ vectorNotNull: vector('vector_not_null', { dimensions: 1 }).notNull(),
255
+ vectorDefault: vector('vector_default', { dimensions: 1 }).default([1]),
256
+ }),
257
+ };
258
+
259
+ const { statements } = await diffTestSchemasPushSingleStore(
260
+ context.client as Connection,
261
+ schema1,
262
+ schema1,
263
+ [],
264
+ 'drizzle',
265
+ false,
266
+ );
267
+ console.log(statements);
268
+ expect(statements.length).toBe(0);
269
+ expect(statements).toEqual([]);
270
+
271
+ const { sqlStatements: dropStatements } = await diffTestSchemasSingleStore(
272
+ schema1,
273
+ {},
274
+ [],
275
+ false,
276
+ );
277
+
278
+ for (const st of dropStatements) {
279
+ await context.client.query(st);
280
+ }
281
+ },
282
+ addBasicIndexes: function(context?: any): Promise<void> {
283
+ return {} as any;
284
+ },
285
+ changeIndexFields: function(context?: any): Promise<void> {
286
+ return {} as any;
287
+ },
288
+ dropIndex: function(context?: any): Promise<void> {
289
+ return {} as any;
290
+ },
291
+ indexesToBeNotTriggered: function(context?: any): Promise<void> {
292
+ return {} as any;
293
+ },
294
+ indexesTestCase1: function(context?: any): Promise<void> {
295
+ return {} as any;
296
+ },
297
+ async case1() {
298
+ // TODO: implement if needed
299
+ expect(true).toBe(true);
300
+ },
301
+ addNotNull: function(context?: any): Promise<void> {
302
+ return {} as any;
303
+ },
304
+ addNotNullWithDataNoRollback: function(context?: any): Promise<void> {
305
+ return {} as any;
306
+ },
307
+ addBasicSequences: function(context?: any): Promise<void> {
308
+ return {} as any;
309
+ },
310
+ addGeneratedColumn: async function(context: any): Promise<void> {
311
+ return {} as any;
312
+ },
313
+ addGeneratedToColumn: async function(context: any): Promise<void> {
314
+ return {} as any;
315
+ },
316
+ dropGeneratedConstraint: async function(context: any): Promise<void> {
317
+ return {} as any;
318
+ },
319
+ alterGeneratedConstraint: async function(context: any): Promise<void> {
320
+ return {} as any;
321
+ },
322
+ createTableWithGeneratedConstraint: function(context?: any): Promise<void> {
323
+ return {} as any;
324
+ },
325
+ createCompositePrimaryKey: async function(context: any): Promise<void> {
326
+ const schema1 = {};
327
+
328
+ const schema2 = {
329
+ table: singlestoreTable('table', {
330
+ col1: int('col1').notNull(),
331
+ col2: int('col2').notNull(),
332
+ }, (t) => ({
333
+ pk: primaryKey({
334
+ columns: [t.col1, t.col2],
335
+ }),
336
+ })),
337
+ };
338
+
339
+ const { statements, sqlStatements } = await diffTestSchemasPushSingleStore(
340
+ context.client as Connection,
341
+ schema1,
342
+ schema2,
343
+ [],
344
+ 'drizzle',
345
+ false,
346
+ );
347
+
348
+ expect(statements).toStrictEqual([
349
+ {
350
+ type: 'create_table',
351
+ tableName: 'table',
352
+ schema: undefined,
353
+ internals: {
354
+ indexes: {},
355
+ tables: {},
356
+ },
357
+ compositePKs: ['table_col1_col2_pk;col1,col2'],
358
+ compositePkName: 'table_col1_col2_pk',
359
+ uniqueConstraints: [],
360
+ columns: [
361
+ { name: 'col1', type: 'int', primaryKey: false, notNull: true, autoincrement: false },
362
+ { name: 'col2', type: 'int', primaryKey: false, notNull: true, autoincrement: false },
363
+ ],
364
+ },
365
+ ]);
366
+ expect(sqlStatements).toStrictEqual([
367
+ 'CREATE TABLE `table` (\n\t`col1` int NOT NULL,\n\t`col2` int NOT NULL,\n\tCONSTRAINT `table_col1_col2_pk` PRIMARY KEY(`col1`,`col2`)\n);\n',
368
+ ]);
369
+ },
370
+ renameTableWithCompositePrimaryKey: async function(context?: any): Promise<void> {
371
+ const productsCategoriesTable = (tableName: string) => {
372
+ return singlestoreTable(tableName, {
373
+ productId: varchar('product_id', { length: 10 }).notNull(),
374
+ categoryId: varchar('category_id', { length: 10 }).notNull(),
375
+ }, (t) => ({
376
+ pk: primaryKey({
377
+ columns: [t.productId, t.categoryId],
378
+ }),
379
+ }));
380
+ };
381
+
382
+ const schema1 = {
383
+ table: productsCategoriesTable('products_categories'),
384
+ };
385
+ const schema2 = {
386
+ test: productsCategoriesTable('products_to_categories'),
387
+ };
388
+
389
+ const { sqlStatements } = await diffTestSchemasPushSingleStore(
390
+ context.client as Connection,
391
+ schema1,
392
+ schema2,
393
+ ['public.products_categories->public.products_to_categories'],
394
+ 'drizzle',
395
+ false,
396
+ );
397
+
398
+ // It's not possible to create/alter/drop primary keys in SingleStore
399
+ expect(sqlStatements).toStrictEqual([
400
+ 'ALTER TABLE `products_categories` RENAME TO `products_to_categories`;',
401
+ ]);
402
+
403
+ await context.client.query(`DROP TABLE \`products_categories\``);
404
+ },
405
+ };
406
+
407
+ run(
408
+ singlestoreSuite,
409
+ async (context: any) => {
410
+ const connectionString = process.env.SINGLESTORE_CONNECTION_STRING
411
+ ?? (await createDockerDB(context));
412
+
413
+ const sleep = 1000;
414
+ let timeLeft = 20000;
415
+ let connected = false;
416
+ let lastError: unknown | undefined;
417
+ do {
418
+ try {
419
+ context.client = await createConnection(connectionString);
420
+ await context.client.connect();
421
+ connected = true;
422
+ break;
423
+ } catch (e) {
424
+ lastError = e;
425
+ await new Promise((resolve) => setTimeout(resolve, sleep));
426
+ timeLeft -= sleep;
427
+ }
428
+ } while (timeLeft > 0);
429
+ if (!connected) {
430
+ console.error('Cannot connect to SingleStore');
431
+ await context.client?.end().catch(console.error);
432
+ await context.singlestoreContainer?.stop().catch(console.error);
433
+ throw lastError;
434
+ }
435
+
436
+ await context.client.query(`DROP DATABASE IF EXISTS \`drizzle\`;`);
437
+ await context.client.query('CREATE DATABASE drizzle;');
438
+ await context.client.query('USE drizzle;');
439
+ },
440
+ async (context: any) => {
441
+ await context.client?.end().catch(console.error);
442
+ await context.singlestoreContainer?.stop().catch(console.error);
443
+ },
444
+ );