@simplysm/orm-common 13.0.100 → 14.0.4

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 (246) hide show
  1. package/README.md +90 -147
  2. package/dist/create-db-context.d.ts +10 -10
  3. package/dist/create-db-context.js +312 -276
  4. package/dist/create-db-context.js.map +1 -6
  5. package/dist/ddl/column-ddl.d.ts +4 -4
  6. package/dist/ddl/column-ddl.js +41 -35
  7. package/dist/ddl/column-ddl.js.map +1 -6
  8. package/dist/ddl/initialize.d.ts +17 -17
  9. package/dist/ddl/initialize.js +200 -142
  10. package/dist/ddl/initialize.js.map +1 -6
  11. package/dist/ddl/relation-ddl.d.ts +6 -6
  12. package/dist/ddl/relation-ddl.js +55 -48
  13. package/dist/ddl/relation-ddl.js.map +1 -6
  14. package/dist/ddl/schema-ddl.d.ts +4 -4
  15. package/dist/ddl/schema-ddl.js +21 -15
  16. package/dist/ddl/schema-ddl.js.map +1 -6
  17. package/dist/ddl/table-ddl.d.ts +20 -20
  18. package/dist/ddl/table-ddl.js +139 -93
  19. package/dist/ddl/table-ddl.js.map +1 -6
  20. package/dist/define-db-context.js +10 -13
  21. package/dist/define-db-context.js.map +1 -6
  22. package/dist/errors/db-transaction-error.d.ts +15 -15
  23. package/dist/errors/db-transaction-error.d.ts.map +1 -1
  24. package/dist/errors/db-transaction-error.js +53 -19
  25. package/dist/errors/db-transaction-error.js.map +1 -6
  26. package/dist/exec/executable.d.ts +23 -23
  27. package/dist/exec/executable.js +94 -40
  28. package/dist/exec/executable.js.map +1 -6
  29. package/dist/exec/queryable.d.ts +97 -97
  30. package/dist/exec/queryable.js +1310 -1204
  31. package/dist/exec/queryable.js.map +1 -6
  32. package/dist/exec/search-parser.d.ts +31 -31
  33. package/dist/exec/search-parser.d.ts.map +1 -1
  34. package/dist/exec/search-parser.js +158 -59
  35. package/dist/exec/search-parser.js.map +1 -6
  36. package/dist/expr/expr-unit.d.ts +4 -4
  37. package/dist/expr/expr-unit.js +24 -18
  38. package/dist/expr/expr-unit.js.map +1 -6
  39. package/dist/expr/expr.d.ts +108 -108
  40. package/dist/expr/expr.js +1872 -1844
  41. package/dist/expr/expr.js.map +1 -6
  42. package/dist/index.js +23 -1
  43. package/dist/index.js.map +1 -6
  44. package/dist/models/system-migration.js +7 -7
  45. package/dist/models/system-migration.js.map +1 -6
  46. package/dist/query-builder/base/expr-renderer-base.d.ts +10 -10
  47. package/dist/query-builder/base/expr-renderer-base.js +27 -21
  48. package/dist/query-builder/base/expr-renderer-base.js.map +1 -6
  49. package/dist/query-builder/base/query-builder-base.d.ts +21 -21
  50. package/dist/query-builder/base/query-builder-base.d.ts.map +1 -1
  51. package/dist/query-builder/base/query-builder-base.js +90 -80
  52. package/dist/query-builder/base/query-builder-base.js.map +1 -6
  53. package/dist/query-builder/mssql/mssql-expr-renderer.d.ts +5 -5
  54. package/dist/query-builder/mssql/mssql-expr-renderer.d.ts.map +1 -1
  55. package/dist/query-builder/mssql/mssql-expr-renderer.js +447 -420
  56. package/dist/query-builder/mssql/mssql-expr-renderer.js.map +1 -6
  57. package/dist/query-builder/mssql/mssql-query-builder.d.ts +2 -2
  58. package/dist/query-builder/mssql/mssql-query-builder.d.ts.map +1 -1
  59. package/dist/query-builder/mssql/mssql-query-builder.js +483 -443
  60. package/dist/query-builder/mssql/mssql-query-builder.js.map +1 -6
  61. package/dist/query-builder/mysql/mysql-expr-renderer.d.ts +5 -5
  62. package/dist/query-builder/mysql/mysql-expr-renderer.d.ts.map +1 -1
  63. package/dist/query-builder/mysql/mysql-expr-renderer.js +451 -419
  64. package/dist/query-builder/mysql/mysql-expr-renderer.js.map +1 -6
  65. package/dist/query-builder/mysql/mysql-query-builder.d.ts +10 -10
  66. package/dist/query-builder/mysql/mysql-query-builder.d.ts.map +1 -1
  67. package/dist/query-builder/mysql/mysql-query-builder.js +570 -479
  68. package/dist/query-builder/mysql/mysql-query-builder.js.map +1 -6
  69. package/dist/query-builder/postgresql/postgresql-expr-renderer.d.ts +5 -5
  70. package/dist/query-builder/postgresql/postgresql-expr-renderer.d.ts.map +1 -1
  71. package/dist/query-builder/postgresql/postgresql-expr-renderer.js +449 -422
  72. package/dist/query-builder/postgresql/postgresql-expr-renderer.js.map +1 -6
  73. package/dist/query-builder/postgresql/postgresql-query-builder.d.ts +8 -8
  74. package/dist/query-builder/postgresql/postgresql-query-builder.d.ts.map +1 -1
  75. package/dist/query-builder/postgresql/postgresql-query-builder.js +511 -460
  76. package/dist/query-builder/postgresql/postgresql-query-builder.js.map +1 -6
  77. package/dist/query-builder/query-builder.d.ts +1 -1
  78. package/dist/query-builder/query-builder.js +13 -13
  79. package/dist/query-builder/query-builder.js.map +1 -6
  80. package/dist/schema/factory/column-builder.d.ts +84 -84
  81. package/dist/schema/factory/column-builder.js +248 -185
  82. package/dist/schema/factory/column-builder.js.map +1 -6
  83. package/dist/schema/factory/index-builder.d.ts +38 -38
  84. package/dist/schema/factory/index-builder.js +144 -85
  85. package/dist/schema/factory/index-builder.js.map +1 -6
  86. package/dist/schema/factory/relation-builder.d.ts +99 -99
  87. package/dist/schema/factory/relation-builder.d.ts.map +1 -1
  88. package/dist/schema/factory/relation-builder.js +274 -136
  89. package/dist/schema/factory/relation-builder.js.map +1 -6
  90. package/dist/schema/procedure-builder.d.ts +51 -51
  91. package/dist/schema/procedure-builder.d.ts.map +1 -1
  92. package/dist/schema/procedure-builder.js +205 -131
  93. package/dist/schema/procedure-builder.js.map +1 -6
  94. package/dist/schema/table-builder.d.ts +55 -55
  95. package/dist/schema/table-builder.d.ts.map +1 -1
  96. package/dist/schema/table-builder.js +274 -205
  97. package/dist/schema/table-builder.js.map +1 -6
  98. package/dist/schema/view-builder.d.ts +44 -44
  99. package/dist/schema/view-builder.d.ts.map +1 -1
  100. package/dist/schema/view-builder.js +189 -116
  101. package/dist/schema/view-builder.js.map +1 -6
  102. package/dist/types/column.d.ts +21 -21
  103. package/dist/types/column.js +60 -30
  104. package/dist/types/column.js.map +1 -6
  105. package/dist/types/db-context-def.d.ts +9 -9
  106. package/dist/types/db-context-def.js +2 -1
  107. package/dist/types/db-context-def.js.map +1 -6
  108. package/dist/types/db.d.ts +47 -47
  109. package/dist/types/db.js +15 -5
  110. package/dist/types/db.js.map +1 -6
  111. package/dist/types/expr.d.ts +81 -81
  112. package/dist/types/expr.d.ts.map +1 -1
  113. package/dist/types/expr.js +3 -1
  114. package/dist/types/expr.js.map +1 -6
  115. package/dist/types/query-def.d.ts +46 -46
  116. package/dist/types/query-def.d.ts.map +1 -1
  117. package/dist/types/query-def.js +31 -24
  118. package/dist/types/query-def.js.map +1 -6
  119. package/dist/utils/result-parser.d.ts +11 -11
  120. package/dist/utils/result-parser.js +362 -221
  121. package/dist/utils/result-parser.js.map +1 -6
  122. package/docs/core.md +117 -145
  123. package/docs/expression.md +186 -203
  124. package/docs/query-builder.md +75 -42
  125. package/docs/queryable.md +189 -151
  126. package/docs/schema-builders.md +172 -283
  127. package/docs/types.md +229 -173
  128. package/package.json +7 -5
  129. package/src/create-db-context.ts +31 -31
  130. package/src/ddl/column-ddl.ts +4 -4
  131. package/src/ddl/initialize.ts +38 -38
  132. package/src/ddl/relation-ddl.ts +6 -6
  133. package/src/ddl/schema-ddl.ts +4 -4
  134. package/src/ddl/table-ddl.ts +24 -24
  135. package/src/errors/db-transaction-error.ts +13 -13
  136. package/src/exec/executable.ts +25 -25
  137. package/src/exec/queryable.ts +152 -152
  138. package/src/exec/search-parser.ts +50 -50
  139. package/src/expr/expr-unit.ts +4 -4
  140. package/src/expr/expr.ts +118 -118
  141. package/src/index.ts +8 -8
  142. package/src/models/system-migration.ts +1 -1
  143. package/src/query-builder/base/expr-renderer-base.ts +21 -21
  144. package/src/query-builder/base/query-builder-base.ts +33 -33
  145. package/src/query-builder/mssql/mssql-expr-renderer.ts +28 -28
  146. package/src/query-builder/mssql/mssql-query-builder.ts +37 -37
  147. package/src/query-builder/mysql/mysql-expr-renderer.ts +29 -29
  148. package/src/query-builder/mysql/mysql-query-builder.ts +70 -70
  149. package/src/query-builder/postgresql/postgresql-expr-renderer.ts +22 -22
  150. package/src/query-builder/postgresql/postgresql-query-builder.ts +54 -54
  151. package/src/query-builder/query-builder.ts +1 -1
  152. package/src/schema/factory/column-builder.ts +86 -86
  153. package/src/schema/factory/index-builder.ts +38 -38
  154. package/src/schema/factory/relation-builder.ts +102 -102
  155. package/src/schema/procedure-builder.ts +52 -52
  156. package/src/schema/table-builder.ts +56 -56
  157. package/src/schema/view-builder.ts +47 -47
  158. package/src/types/column.ts +24 -24
  159. package/src/types/db-context-def.ts +15 -15
  160. package/src/types/db.ts +50 -50
  161. package/src/types/expr.ts +103 -103
  162. package/src/types/query-def.ts +50 -50
  163. package/src/utils/result-parser.ts +88 -88
  164. package/docs/utilities.md +0 -27
  165. package/tests/db-context/create-db-context.spec.ts +0 -193
  166. package/tests/db-context/define-db-context.spec.ts +0 -17
  167. package/tests/ddl/basic.expected.ts +0 -341
  168. package/tests/ddl/basic.spec.ts +0 -557
  169. package/tests/ddl/column-builder.expected.ts +0 -310
  170. package/tests/ddl/column-builder.spec.ts +0 -525
  171. package/tests/ddl/index-builder.expected.ts +0 -38
  172. package/tests/ddl/index-builder.spec.ts +0 -148
  173. package/tests/ddl/procedure-builder.expected.ts +0 -52
  174. package/tests/ddl/procedure-builder.spec.ts +0 -128
  175. package/tests/ddl/relation-builder.expected.ts +0 -36
  176. package/tests/ddl/relation-builder.spec.ts +0 -171
  177. package/tests/ddl/table-builder.expected.ts +0 -113
  178. package/tests/ddl/table-builder.spec.ts +0 -399
  179. package/tests/ddl/view-builder.expected.ts +0 -38
  180. package/tests/ddl/view-builder.spec.ts +0 -116
  181. package/tests/dml/delete.expected.ts +0 -96
  182. package/tests/dml/delete.spec.ts +0 -127
  183. package/tests/dml/insert.expected.ts +0 -192
  184. package/tests/dml/insert.spec.ts +0 -210
  185. package/tests/dml/update.expected.ts +0 -176
  186. package/tests/dml/update.spec.ts +0 -222
  187. package/tests/dml/upsert.expected.ts +0 -215
  188. package/tests/dml/upsert.spec.ts +0 -190
  189. package/tests/errors/queryable-errors.spec.ts +0 -126
  190. package/tests/escape.spec.ts +0 -59
  191. package/tests/examples/pivot.expected.ts +0 -211
  192. package/tests/examples/pivot.spec.ts +0 -200
  193. package/tests/examples/sampling.expected.ts +0 -69
  194. package/tests/examples/sampling.spec.ts +0 -42
  195. package/tests/examples/unpivot.expected.ts +0 -120
  196. package/tests/examples/unpivot.spec.ts +0 -161
  197. package/tests/exec/search-parser.spec.ts +0 -267
  198. package/tests/executable/basic.expected.ts +0 -18
  199. package/tests/executable/basic.spec.ts +0 -54
  200. package/tests/expr/comparison.expected.ts +0 -282
  201. package/tests/expr/comparison.spec.ts +0 -334
  202. package/tests/expr/conditional.expected.ts +0 -134
  203. package/tests/expr/conditional.spec.ts +0 -249
  204. package/tests/expr/date.expected.ts +0 -332
  205. package/tests/expr/date.spec.ts +0 -459
  206. package/tests/expr/math.expected.ts +0 -62
  207. package/tests/expr/math.spec.ts +0 -59
  208. package/tests/expr/string.expected.ts +0 -218
  209. package/tests/expr/string.spec.ts +0 -300
  210. package/tests/expr/utility.expected.ts +0 -147
  211. package/tests/expr/utility.spec.ts +0 -155
  212. package/tests/select/basic.expected.ts +0 -322
  213. package/tests/select/basic.spec.ts +0 -433
  214. package/tests/select/filter.expected.ts +0 -357
  215. package/tests/select/filter.spec.ts +0 -954
  216. package/tests/select/group.expected.ts +0 -169
  217. package/tests/select/group.spec.ts +0 -159
  218. package/tests/select/join.expected.ts +0 -582
  219. package/tests/select/join.spec.ts +0 -692
  220. package/tests/select/order.expected.ts +0 -150
  221. package/tests/select/order.spec.ts +0 -140
  222. package/tests/select/recursive-cte.expected.ts +0 -244
  223. package/tests/select/recursive-cte.spec.ts +0 -514
  224. package/tests/select/result-meta.spec.ts +0 -270
  225. package/tests/select/subquery.expected.ts +0 -363
  226. package/tests/select/subquery.spec.ts +0 -441
  227. package/tests/select/view.expected.ts +0 -155
  228. package/tests/select/view.spec.ts +0 -235
  229. package/tests/select/window.expected.ts +0 -345
  230. package/tests/select/window.spec.ts +0 -433
  231. package/tests/setup/MockExecutor.ts +0 -18
  232. package/tests/setup/TestDbContext.ts +0 -59
  233. package/tests/setup/models/Company.ts +0 -13
  234. package/tests/setup/models/Employee.ts +0 -10
  235. package/tests/setup/models/MonthlySales.ts +0 -11
  236. package/tests/setup/models/Post.ts +0 -16
  237. package/tests/setup/models/Sales.ts +0 -10
  238. package/tests/setup/models/User.ts +0 -19
  239. package/tests/setup/procedure/GetAllUsers.ts +0 -9
  240. package/tests/setup/procedure/GetUserById.ts +0 -12
  241. package/tests/setup/test-utils.ts +0 -72
  242. package/tests/setup/views/ActiveUsers.ts +0 -8
  243. package/tests/setup/views/UserSummary.ts +0 -11
  244. package/tests/types/nullable-queryable-record.spec.ts +0 -97
  245. package/tests/utils/result-parser-perf.spec.ts +0 -143
  246. package/tests/utils/result-parser.spec.ts +0 -667
@@ -1,193 +0,0 @@
1
- import { describe, expect, it } from "vitest";
2
- import { defineDbContext } from "../../src/define-db-context";
3
- import { createDbContext } from "../../src/create-db-context";
4
- import { User } from "../setup/models/User";
5
- import { Post } from "../setup/models/Post";
6
- import { MockExecutor } from "../setup/MockExecutor";
7
- import "../setup/test-utils";
8
-
9
- const TestDb = defineDbContext({
10
- tables: { user: User, post: Post },
11
- });
12
-
13
- describe("createDbContext", () => {
14
- it("creates instance with queryable accessors", () => {
15
- const db = createDbContext(TestDb, new MockExecutor(), {
16
- database: "TestDb",
17
- schema: "TestSchema",
18
- });
19
-
20
- expect(db.database).toBe("TestDb");
21
- expect(db.schema).toBe("TestSchema");
22
- expect(db.status).toBe("ready");
23
- expect(typeof db.user).toBe("function");
24
- expect(typeof db.post).toBe("function");
25
- });
26
-
27
- it("queryable functions create correct QueryDef", () => {
28
- const db = createDbContext(TestDb, new MockExecutor(), {
29
- database: "TestDb",
30
- schema: "TestSchema",
31
- });
32
-
33
- const def = db.user().getSelectQueryDef();
34
- expect(def).toEqual({
35
- type: "select",
36
- as: "T1",
37
- from: { database: "TestDb", schema: "TestSchema", name: "User" },
38
- });
39
- });
40
-
41
- it("alias counter increments between queryable calls", () => {
42
- const db = createDbContext(TestDb, new MockExecutor(), {
43
- database: "TestDb",
44
- schema: "TestSchema",
45
- });
46
-
47
- const userDef = db.user().getSelectQueryDef();
48
- const postDef = db.post().getSelectQueryDef();
49
- expect(userDef.as).toBe("T1");
50
- expect(postDef.as).toBe("T2");
51
- });
52
-
53
- it("DDL QueryDef generators produce correct output", () => {
54
- const db = createDbContext(TestDb, new MockExecutor(), {
55
- database: "TestDb",
56
- schema: "TestSchema",
57
- });
58
-
59
- const clearDef = db.getClearSchemaQueryDef({ database: "TestDb", schema: "TestSchema" });
60
- expect(clearDef).toEqual({
61
- type: "clearSchema",
62
- database: "TestDb",
63
- schema: "TestSchema",
64
- });
65
- });
66
-
67
- it("connect/transaction methods exist", () => {
68
- const db = createDbContext(TestDb, new MockExecutor(), {
69
- database: "TestDb",
70
- });
71
-
72
- expect(typeof db.connect).toBe("function");
73
- expect(typeof db.connectWithoutTransaction).toBe("function");
74
- expect(typeof db.transaction).toBe("function");
75
- });
76
-
77
- it("connect manages status lifecycle", async () => {
78
- const db = createDbContext(TestDb, new MockExecutor(), {
79
- database: "TestDb",
80
- });
81
-
82
- expect(db.status).toBe("ready");
83
- await db.connect(async () => {
84
- await Promise.resolve();
85
- expect(db.status).toBe("transact");
86
- });
87
- expect(db.status).toBe("ready");
88
- });
89
-
90
- it("connectWithoutTransaction manages status lifecycle", async () => {
91
- const db = createDbContext(TestDb, new MockExecutor(), {
92
- database: "TestDb",
93
- });
94
-
95
- expect(db.status).toBe("ready");
96
- await db.connectWithoutTransaction(async () => {
97
- await Promise.resolve();
98
- expect(db.status).toBe("connect");
99
- });
100
- expect(db.status).toBe("ready");
101
- });
102
-
103
- it("transaction manages status lifecycle within connectWithoutTransaction", async () => {
104
- const db = createDbContext(TestDb, new MockExecutor(), {
105
- database: "TestDb",
106
- });
107
-
108
- await db.connectWithoutTransaction(async () => {
109
- await Promise.resolve();
110
- expect(db.status).toBe("connect");
111
- await db.transaction(async () => {
112
- await Promise.resolve();
113
- expect(db.status).toBe("transact");
114
- });
115
- expect(db.status).toBe("connect");
116
- });
117
- expect(db.status).toBe("ready");
118
- });
119
-
120
- it("connect resets alias counter", async () => {
121
- const db = createDbContext(TestDb, new MockExecutor(), {
122
- database: "TestDb",
123
- });
124
-
125
- // Use some aliases
126
- db.getNextAlias(); // T1
127
- db.getNextAlias(); // T2
128
-
129
- await db.connect(async () => {
130
- await Promise.resolve();
131
- // After connect, alias counter should be reset
132
- const userDef = db.user().getSelectQueryDef();
133
- expect(userDef.as).toBe("T1");
134
- });
135
- });
136
-
137
- it("connect rolls back and rethrows on callback error", async () => {
138
- const db = createDbContext(TestDb, new MockExecutor(), {
139
- database: "TestDb",
140
- });
141
-
142
- const testError = new Error("test error");
143
- await expect(
144
- db.connect(async () => {
145
- await Promise.resolve();
146
- throw testError;
147
- }),
148
- ).rejects.toThrow("test error");
149
-
150
- expect(db.status).toBe("ready");
151
- });
152
-
153
- it("connectWithoutTransaction rethrows on callback error", async () => {
154
- const db = createDbContext(TestDb, new MockExecutor(), {
155
- database: "TestDb",
156
- });
157
-
158
- const testError = new Error("test error");
159
- await expect(
160
- db.connectWithoutTransaction(async () => {
161
- await Promise.resolve();
162
- throw testError;
163
- }),
164
- ).rejects.toThrow("test error");
165
-
166
- expect(db.status).toBe("ready");
167
- });
168
-
169
- it("transaction throws when already in transaction state", async () => {
170
- const db = createDbContext(TestDb, new MockExecutor(), {
171
- database: "TestDb",
172
- });
173
-
174
- await db.connect(async () => {
175
- // Already in transact state via connect
176
- await expect(db.transaction(async () => {})).rejects.toThrow("Already in TRANSACTION state.");
177
- });
178
- });
179
-
180
- it("getQueryDefObjectName resolves table with defaults", () => {
181
- const db = createDbContext(TestDb, new MockExecutor(), {
182
- database: "TestDb",
183
- schema: "TestSchema",
184
- });
185
-
186
- const objName = db.getQueryDefObjectName(User);
187
- expect(objName).toEqual({
188
- database: "TestDb",
189
- schema: "TestSchema",
190
- name: "User",
191
- });
192
- });
193
- });
@@ -1,17 +0,0 @@
1
- import { describe, expect, it } from "vitest";
2
- import { defineDbContext } from "../../src/define-db-context";
3
- import { User } from "../setup/models/User";
4
- import { Post } from "../setup/models/Post";
5
-
6
- describe("defineDbContext", () => {
7
- it("creates a DbContextDef with tables", () => {
8
- const MyDb = defineDbContext({
9
- tables: { user: User, post: Post },
10
- });
11
-
12
- expect(MyDb.meta.tables.user).toBe(User);
13
- expect(MyDb.meta.tables.post).toBe(Post);
14
- expect(MyDb.meta.migrations).toEqual([]);
15
- });
16
-
17
- });
@@ -1,341 +0,0 @@
1
- import { mysql, pgsql, tsql } from "@simplysm/core-common";
2
- import type { ExpectedSql } from "../setup/test-utils";
3
-
4
- //#region ========== Database ==========
5
-
6
- export const clearSchema: ExpectedSql = {
7
- mysql: mysql`
8
- SET FOREIGN_KEY_CHECKS = 0;
9
- SET @tables = NULL;
10
- SELECT GROUP_CONCAT(table_name) INTO @tables FROM information_schema.tables WHERE table_schema = 'TestDb';
11
- SET @drop_stmt = IF(@tables IS NULL, 'SELECT 1', CONCAT('DROP TABLE IF EXISTS ', @tables));
12
- PREPARE stmt FROM @drop_stmt;
13
- EXECUTE stmt;
14
- DEALLOCATE PREPARE stmt;
15
- SET FOREIGN_KEY_CHECKS = 1
16
- `,
17
- mssql: tsql`
18
- DECLARE @sql NVARCHAR(MAX);
19
- SET @sql = N'';
20
-
21
- -- Drop FK constraints
22
- SELECT @sql = @sql + N'ALTER TABLE ' + QUOTENAME(OBJECT_SCHEMA_NAME(parent_object_id)) + '.' + QUOTENAME(OBJECT_NAME(parent_object_id)) + N' DROP CONSTRAINT ' + QUOTENAME(name) + N';' + CHAR(13)
23
- FROM [TestDb].sys.foreign_keys
24
- WHERE OBJECT_SCHEMA_NAME(parent_object_id) = 'TestSchema';
25
-
26
- -- Drop tables
27
- SELECT @sql = @sql + N'DROP TABLE ' + QUOTENAME(SCHEMA_NAME(schema_id)) + '.' + QUOTENAME(name) + N';' + CHAR(13)
28
- FROM [TestDb].sys.tables
29
- WHERE SCHEMA_NAME(schema_id) = 'TestSchema';
30
-
31
- -- Drop views
32
- SELECT @sql = @sql + N'DROP VIEW ' + QUOTENAME(SCHEMA_NAME(schema_id)) + '.' + QUOTENAME(name) + N';' + CHAR(13)
33
- FROM [TestDb].sys.views
34
- WHERE schema_id = SCHEMA_ID('TestSchema');
35
-
36
- -- Drop procedures
37
- SELECT @sql = @sql + N'DROP PROCEDURE ' + QUOTENAME(SCHEMA_NAME(schema_id)) + '.' + QUOTENAME(name) + N';' + CHAR(13)
38
- FROM [TestDb].sys.procedures
39
- WHERE SCHEMA_NAME(schema_id) = 'TestSchema';
40
-
41
- EXEC sp_executesql @sql;
42
- `,
43
- postgresql: pgsql`
44
- DO $$
45
- DECLARE
46
- r RECORD;
47
- BEGIN
48
- -- Drop FK constraints
49
- FOR r IN (SELECT conname, conrelid::regclass AS tablename
50
- FROM pg_constraint
51
- WHERE contype = 'f' AND connamespace = 'TestSchema'::regnamespace)
52
- LOOP
53
- EXECUTE 'ALTER TABLE ' || r.tablename || ' DROP CONSTRAINT ' || quote_ident(r.conname);
54
- END LOOP;
55
-
56
- -- Drop tables
57
- FOR r IN (SELECT tablename FROM pg_tables WHERE schemaname = 'TestSchema')
58
- LOOP
59
- EXECUTE 'DROP TABLE IF EXISTS ' || quote_ident(r.tablename) || ' CASCADE';
60
- END LOOP;
61
-
62
- -- Drop views
63
- FOR r IN (SELECT viewname FROM pg_views WHERE schemaname = 'TestSchema')
64
- LOOP
65
- EXECUTE 'DROP VIEW IF EXISTS ' || quote_ident(r.viewname) || ' CASCADE';
66
- END LOOP;
67
-
68
- -- Drop functions
69
- FOR r IN (SELECT proname, pg_get_function_identity_arguments(oid) AS args
70
- FROM pg_proc WHERE pronamespace = 'TestSchema'::regnamespace)
71
- LOOP
72
- EXECUTE 'DROP FUNCTION IF EXISTS ' || quote_ident(r.proname) || '(' || r.args || ') CASCADE';
73
- END LOOP;
74
- END $$
75
- `,
76
- };
77
-
78
- export const schemaExists: ExpectedSql = {
79
- mysql: mysql`SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = 'TestDb'`,
80
- mssql: tsql`
81
- DECLARE @result NVARCHAR(MAX) = NULL;
82
- IF EXISTS (SELECT 1 FROM sys.databases WHERE name = 'TestDb')
83
- BEGIN
84
- DECLARE @sql NVARCHAR(MAX) = N'SELECT @result = name FROM ' + QUOTENAME('TestDb') + N'.sys.schemas WHERE name = ''TestSchema''';
85
- EXEC sp_executesql @sql, N'@result NVARCHAR(MAX) OUTPUT', @result OUTPUT;
86
- END
87
- SELECT @result AS name WHERE @result IS NOT NULL
88
- `,
89
- postgresql: pgsql`SELECT nspname FROM pg_namespace WHERE nspname = 'TestSchema'`,
90
- };
91
-
92
- //#endregion
93
-
94
- //#region ========== Table ==========
95
-
96
- export const createTable: ExpectedSql = {
97
- mysql: mysql`
98
- CREATE TABLE \`TestDb\`.\`User\` (
99
- \`id\` BIGINT NOT NULL AUTO_INCREMENT,
100
- \`name\` VARCHAR(100) NOT NULL,
101
- \`email\` VARCHAR(200) NULL,
102
- \`age\` INT NULL,
103
- \`isActive\` BOOLEAN NOT NULL DEFAULT TRUE,
104
- \`companyId\` BIGINT NULL,
105
- \`createdAt\` DATETIME NOT NULL,
106
- CONSTRAINT \`PK_User\` PRIMARY KEY (\`id\`)
107
- )
108
- `,
109
- mssql: tsql`
110
- CREATE TABLE [TestDb].[TestSchema].[User] (
111
- [id] BIGINT NOT NULL IDENTITY(1,1),
112
- [name] NVARCHAR(100) NOT NULL,
113
- [email] NVARCHAR(200) NULL,
114
- [age] INT NULL,
115
- [isActive] BIT NOT NULL DEFAULT 1,
116
- [companyId] BIGINT NULL,
117
- [createdAt] DATETIME2 NOT NULL,
118
- CONSTRAINT [PK_User] PRIMARY KEY ([id])
119
- )
120
- `,
121
- postgresql: pgsql`
122
- CREATE TABLE "TestSchema"."User" (
123
- "id" BIGINT NOT NULL GENERATED BY DEFAULT AS IDENTITY,
124
- "name" VARCHAR(100) NOT NULL,
125
- "email" VARCHAR(200) NULL,
126
- "age" INTEGER NULL,
127
- "isActive" BOOLEAN NOT NULL DEFAULT TRUE,
128
- "companyId" BIGINT NULL,
129
- "createdAt" TIMESTAMP NOT NULL,
130
- CONSTRAINT "PK_User" PRIMARY KEY ("id")
131
- )
132
- `,
133
- };
134
-
135
- export const truncate: ExpectedSql = {
136
- mysql: mysql`TRUNCATE TABLE \`TestDb\`.\`User\``,
137
- mssql: tsql`TRUNCATE TABLE [TestDb].[TestSchema].[User]`,
138
- postgresql: pgsql`TRUNCATE TABLE "TestSchema"."User" RESTART IDENTITY`,
139
- };
140
-
141
- export const switchFkOn: ExpectedSql = {
142
- mysql: mysql`SET FOREIGN_KEY_CHECKS = 1`,
143
- mssql: tsql`ALTER TABLE [TestDb].[TestSchema].[User] WITH CHECK CHECK CONSTRAINT ALL`,
144
- postgresql: pgsql`ALTER TABLE "TestSchema"."User" ENABLE TRIGGER ALL`,
145
- };
146
-
147
- export const switchFkOff: ExpectedSql = {
148
- mysql: mysql`SET FOREIGN_KEY_CHECKS = 0`,
149
- mssql: tsql`ALTER TABLE [TestDb].[TestSchema].[User] NOCHECK CONSTRAINT ALL`,
150
- postgresql: pgsql`ALTER TABLE "TestSchema"."User" DISABLE TRIGGER ALL`,
151
- };
152
-
153
- export const dropTable: ExpectedSql = {
154
- mysql: mysql`DROP TABLE \`TestDb\`.\`User\``,
155
- mssql: tsql`DROP TABLE [TestDb].[TestSchema].[User]`,
156
- postgresql: pgsql`DROP TABLE "TestSchema"."User"`,
157
- };
158
-
159
- export const renameTable: ExpectedSql = {
160
- mysql: mysql`RENAME TABLE \`TestDb\`.\`User\` TO \`Member\``,
161
- mssql: tsql`EXEC sp_rename '[TestDb].[TestSchema].[User]', 'Member'`,
162
- postgresql: pgsql`ALTER TABLE "TestSchema"."User" RENAME TO "Member"`,
163
- };
164
-
165
- //#endregion
166
-
167
- //#region ========== Column ==========
168
-
169
- export const addColumn: ExpectedSql = {
170
- mysql: mysql`ALTER TABLE \`TestDb\`.\`User\` ADD COLUMN \`nickname\` VARCHAR(50) NULL`,
171
- mssql: tsql`ALTER TABLE [TestDb].[TestSchema].[User] ADD [nickname] NVARCHAR(50) NULL`,
172
- postgresql: pgsql`ALTER TABLE "TestSchema"."User" ADD COLUMN "nickname" VARCHAR(50) NULL`,
173
- };
174
-
175
- export const addColumnWithDefault: ExpectedSql = {
176
- mysql: mysql`ALTER TABLE \`TestDb\`.\`User\` ADD COLUMN \`score\` INT NOT NULL DEFAULT 0`,
177
- mssql: tsql`ALTER TABLE [TestDb].[TestSchema].[User] ADD [score] INT NOT NULL DEFAULT 0`,
178
- postgresql: pgsql`ALTER TABLE "TestSchema"."User" ADD COLUMN "score" INTEGER NOT NULL DEFAULT 0`,
179
- };
180
-
181
- export const addColumnWithAutoIncrement: ExpectedSql = {
182
- mysql: mysql`ALTER TABLE \`TestDb\`.\`User\` ADD COLUMN \`seq\` BIGINT NOT NULL AUTO_INCREMENT`,
183
- mssql: tsql`ALTER TABLE [TestDb].[TestSchema].[User] ADD [seq] BIGINT NOT NULL IDENTITY(1,1)`,
184
- postgresql: pgsql`ALTER TABLE "TestSchema"."User" ADD COLUMN "seq" BIGINT NOT NULL GENERATED BY DEFAULT AS IDENTITY`,
185
- };
186
-
187
- export const dropColumn: ExpectedSql = {
188
- mysql: mysql`ALTER TABLE \`TestDb\`.\`User\` DROP COLUMN \`email\``,
189
- mssql: tsql`ALTER TABLE [TestDb].[TestSchema].[User] DROP COLUMN [email]`,
190
- postgresql: pgsql`ALTER TABLE "TestSchema"."User" DROP COLUMN "email"`,
191
- };
192
-
193
- export const modifyColumn: ExpectedSql = {
194
- mysql: mysql`ALTER TABLE \`TestDb\`.\`User\` MODIFY COLUMN \`name\` VARCHAR(200) NULL`,
195
- mssql: tsql`ALTER TABLE [TestDb].[TestSchema].[User] ALTER COLUMN [name] NVARCHAR(200) NULL`,
196
- postgresql: pgsql`ALTER TABLE "TestSchema"."User" ALTER COLUMN "name" TYPE VARCHAR(200), ALTER COLUMN "name" DROP NOT NULL`,
197
- };
198
-
199
- export const modifyColumnTypeAndDefault: ExpectedSql = {
200
- mysql: mysql`ALTER TABLE \`TestDb\`.\`User\` MODIFY COLUMN \`score\` INT NOT NULL DEFAULT 100`,
201
- mssql: tsql`ALTER TABLE [TestDb].[TestSchema].[User] ALTER COLUMN [score] INT NOT NULL`,
202
- postgresql: pgsql`ALTER TABLE "TestSchema"."User" ALTER COLUMN "score" TYPE INTEGER, ALTER COLUMN "score" DROP NOT NULL, ALTER COLUMN "score" SET DEFAULT 100`,
203
- };
204
-
205
- export const renameColumn: ExpectedSql = {
206
- mysql: mysql`ALTER TABLE \`TestDb\`.\`User\` RENAME COLUMN \`name\` TO \`fullName\``,
207
- mssql: tsql`EXEC sp_rename '[TestDb].[TestSchema].[User].name', 'fullName', 'COLUMN'`,
208
- postgresql: pgsql`ALTER TABLE "TestSchema"."User" RENAME COLUMN "name" TO "fullName"`,
209
- };
210
-
211
- //#endregion
212
-
213
- //#region ========== Primary Key ==========
214
-
215
- export const dropPrimaryKey: ExpectedSql = {
216
- mysql: mysql`ALTER TABLE \`TestDb\`.\`User\` DROP PRIMARY KEY`,
217
- mssql: tsql`ALTER TABLE [TestDb].[TestSchema].[User] DROP CONSTRAINT [PK_User]`,
218
- postgresql: pgsql`ALTER TABLE "TestSchema"."User" DROP CONSTRAINT "PK_User"`,
219
- };
220
-
221
- export const addPrimaryKey: ExpectedSql = {
222
- mysql: mysql`ALTER TABLE \`TestDb\`.\`User\` ADD PRIMARY KEY (\`id\`)`,
223
- mssql: tsql`ALTER TABLE [TestDb].[TestSchema].[User] ADD CONSTRAINT [PK_User] PRIMARY KEY ([id])`,
224
- postgresql: pgsql`ALTER TABLE "TestSchema"."User" ADD CONSTRAINT "PK_User" PRIMARY KEY ("id")`,
225
- };
226
-
227
- export const addPrimaryKeyComposite: ExpectedSql = {
228
- mysql: mysql`ALTER TABLE \`TestDb\`.\`UserRole\` ADD PRIMARY KEY (\`userId\`, \`roleId\`)`,
229
- mssql: tsql`ALTER TABLE [TestDb].[TestSchema].[UserRole] ADD CONSTRAINT [PK_UserRole] PRIMARY KEY ([userId], [roleId])`,
230
- postgresql: pgsql`ALTER TABLE "TestSchema"."UserRole" ADD CONSTRAINT "PK_UserRole" PRIMARY KEY ("userId", "roleId")`,
231
- };
232
-
233
- //#endregion
234
-
235
- //#region ========== Foreign Key / Index ==========
236
-
237
- export const addForeignKey: ExpectedSql = {
238
- mysql: mysql`
239
- ALTER TABLE \`TestDb\`.\`Post\` ADD CONSTRAINT \`FK_Post_user\`
240
- FOREIGN KEY (\`userId\`) REFERENCES \`TestDb\`.\`User\` (\`id\`)
241
- `,
242
- mssql: tsql`
243
- ALTER TABLE [TestDb].[TestSchema].[Post] ADD CONSTRAINT [FK_Post_user]
244
- FOREIGN KEY ([userId]) REFERENCES [TestDb].[TestSchema].[User] ([id]);
245
- CREATE INDEX [IDX_Post_Post_user] ON [TestDb].[TestSchema].[Post] ([userId]);
246
- `,
247
- postgresql: pgsql`
248
- ALTER TABLE "TestSchema"."Post" ADD CONSTRAINT "FK_Post_user"
249
- FOREIGN KEY ("userId") REFERENCES "TestSchema"."User" ("id");
250
- CREATE INDEX "IDX_Post_Post_user" ON "TestSchema"."Post" ("userId");
251
- `,
252
- };
253
-
254
- export const dropForeignKey: ExpectedSql = {
255
- mysql: mysql`ALTER TABLE \`TestDb\`.\`Post\` DROP FOREIGN KEY \`FK_Post_user\``,
256
- mssql: tsql`ALTER TABLE [TestDb].[TestSchema].[Post] DROP CONSTRAINT [FK_Post_user]`,
257
- postgresql: pgsql`ALTER TABLE "TestSchema"."Post" DROP CONSTRAINT "FK_Post_user"`,
258
- };
259
-
260
- export const addIndex: ExpectedSql = {
261
- mysql: mysql`CREATE UNIQUE INDEX \`IDX_User_email\` ON \`TestDb\`.\`User\` (\`email\` ASC)`,
262
- mssql: tsql`CREATE UNIQUE INDEX [IDX_User_email] ON [TestDb].[TestSchema].[User] ([email] ASC)`,
263
- postgresql: pgsql`CREATE UNIQUE INDEX "IDX_User_email" ON "TestSchema"."User" ("email" ASC)`,
264
- };
265
-
266
- export const dropIndex: ExpectedSql = {
267
- mysql: mysql`DROP INDEX \`IDX_User_email\` ON \`TestDb\`.\`User\``,
268
- mssql: tsql`DROP INDEX [IDX_User_email] ON [TestDb].[TestSchema].[User]`,
269
- postgresql: pgsql`DROP INDEX "TestSchema"."IDX_User_email"`,
270
- };
271
-
272
- export const dropIndexComposite: ExpectedSql = {
273
- mysql: mysql`DROP INDEX \`IDX_User_name_email\` ON \`TestDb\`.\`User\``,
274
- mssql: tsql`DROP INDEX [IDX_User_name_email] ON [TestDb].[TestSchema].[User]`,
275
- postgresql: pgsql`DROP INDEX "TestSchema"."IDX_User_name_email"`,
276
- };
277
-
278
- //#endregion
279
-
280
- //#region ========== View ==========
281
-
282
- export const createView: ExpectedSql = {
283
- mysql: mysql`
284
- CREATE OR REPLACE VIEW \`TestDb\`.\`ActiveUsers\` AS
285
- SELECT * FROM \`TestDb\`.\`User\` AS \`T1\`
286
- WHERE \`T1\`.\`isActive\` <=> TRUE
287
- `,
288
- mssql: tsql`
289
- CREATE OR ALTER VIEW [TestDb].[TestSchema].[ActiveUsers] AS
290
- SELECT * FROM [TestDb].[TestSchema].[User] AS [T1]
291
- WHERE (([T1].[isActive] IS NULL AND 1 IS NULL) OR [T1].[isActive] = 1)
292
- `,
293
- postgresql: pgsql`
294
- CREATE OR REPLACE VIEW "TestSchema"."ActiveUsers" AS
295
- SELECT * FROM "TestSchema"."User" AS "T1"
296
- WHERE "T1"."isActive" IS NOT DISTINCT FROM TRUE
297
- `,
298
- };
299
-
300
- export const dropView: ExpectedSql = {
301
- mysql: mysql`DROP VIEW IF EXISTS \`TestDb\`.\`ActiveUsers\``,
302
- mssql: tsql`DROP VIEW IF EXISTS [TestDb].[TestSchema].[ActiveUsers]`,
303
- postgresql: pgsql`DROP VIEW IF EXISTS "TestSchema"."ActiveUsers"`,
304
- };
305
-
306
- //#endregion
307
-
308
- //#region ========== Procedure ==========
309
-
310
- export const createProc: ExpectedSql = {
311
- mysql: mysql`
312
- CREATE PROCEDURE \`TestDb\`.\`GetUserById\`(IN \`userId\` BIGINT)
313
- BEGIN
314
- -- DBMSwrite matching query --;
315
- END
316
- `,
317
- mssql: tsql`
318
- CREATE OR ALTER PROCEDURE [TestDb].[TestSchema].[GetUserById] @userId BIGINT
319
- AS
320
- BEGIN
321
- SET NOCOUNT ON;
322
- -- DBMSwrite matching query --
323
- END
324
- `,
325
- postgresql: pgsql`
326
- CREATE OR REPLACE FUNCTION "TestSchema"."GetUserById"("userId" BIGINT)
327
- RETURNS TABLE("id" BIGINT, "name" VARCHAR(100), "email" VARCHAR(200)) AS $$
328
- BEGIN
329
- -- DBMSwrite matching query --;
330
- END;
331
- $$ LANGUAGE plpgsql
332
- `,
333
- };
334
-
335
- export const dropProc: ExpectedSql = {
336
- mysql: mysql`DROP PROCEDURE IF EXISTS \`TestDb\`.\`GetUserById\``,
337
- mssql: tsql`DROP PROCEDURE IF EXISTS [TestDb].[TestSchema].[GetUserById]`,
338
- postgresql: pgsql`DROP FUNCTION IF EXISTS "TestSchema"."GetUserById"()`,
339
- };
340
-
341
- //#endregion