@simplysm/orm-common 13.0.69 → 13.0.71

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 (204) hide show
  1. package/README.md +54 -1447
  2. package/dist/create-db-context.d.ts +10 -10
  3. package/dist/create-db-context.js +9 -9
  4. package/dist/create-db-context.js.map +1 -1
  5. package/dist/ddl/column-ddl.d.ts +4 -4
  6. package/dist/ddl/initialize.d.ts +17 -17
  7. package/dist/ddl/initialize.js +2 -2
  8. package/dist/ddl/initialize.js.map +1 -1
  9. package/dist/ddl/relation-ddl.d.ts +6 -6
  10. package/dist/ddl/schema-ddl.d.ts +4 -4
  11. package/dist/ddl/table-ddl.d.ts +24 -24
  12. package/dist/ddl/table-ddl.js +4 -4
  13. package/dist/ddl/table-ddl.js.map +1 -1
  14. package/dist/errors/db-transaction-error.d.ts +15 -15
  15. package/dist/errors/db-transaction-error.d.ts.map +1 -1
  16. package/dist/exec/executable.d.ts +23 -23
  17. package/dist/exec/executable.js +3 -3
  18. package/dist/exec/executable.js.map +1 -1
  19. package/dist/exec/queryable.d.ts +160 -160
  20. package/dist/exec/queryable.js +119 -119
  21. package/dist/exec/queryable.js.map +1 -1
  22. package/dist/exec/search-parser.d.ts +37 -37
  23. package/dist/exec/search-parser.d.ts.map +1 -1
  24. package/dist/expr/expr-unit.d.ts +4 -4
  25. package/dist/expr/expr.d.ts +257 -257
  26. package/dist/expr/expr.js +265 -265
  27. package/dist/expr/expr.js.map +1 -1
  28. package/dist/query-builder/base/expr-renderer-base.d.ts +9 -9
  29. package/dist/query-builder/base/expr-renderer-base.js +2 -2
  30. package/dist/query-builder/base/expr-renderer-base.js.map +1 -1
  31. package/dist/query-builder/base/query-builder-base.d.ts +26 -26
  32. package/dist/query-builder/base/query-builder-base.d.ts.map +1 -1
  33. package/dist/query-builder/base/query-builder-base.js +22 -22
  34. package/dist/query-builder/base/query-builder-base.js.map +1 -1
  35. package/dist/query-builder/mssql/mssql-expr-renderer.d.ts +4 -4
  36. package/dist/query-builder/mssql/mssql-expr-renderer.d.ts.map +1 -1
  37. package/dist/query-builder/mssql/mssql-expr-renderer.js +18 -18
  38. package/dist/query-builder/mssql/mssql-expr-renderer.js.map +1 -1
  39. package/dist/query-builder/mssql/mssql-query-builder.d.ts +2 -2
  40. package/dist/query-builder/mssql/mssql-query-builder.d.ts.map +1 -1
  41. package/dist/query-builder/mssql/mssql-query-builder.js +11 -11
  42. package/dist/query-builder/mssql/mssql-query-builder.js.map +1 -1
  43. package/dist/query-builder/mysql/mysql-expr-renderer.d.ts +4 -4
  44. package/dist/query-builder/mysql/mysql-expr-renderer.d.ts.map +1 -1
  45. package/dist/query-builder/mysql/mysql-expr-renderer.js +17 -17
  46. package/dist/query-builder/mysql/mysql-expr-renderer.js.map +1 -1
  47. package/dist/query-builder/mysql/mysql-query-builder.d.ts +8 -8
  48. package/dist/query-builder/mysql/mysql-query-builder.d.ts.map +1 -1
  49. package/dist/query-builder/mysql/mysql-query-builder.js +5 -5
  50. package/dist/query-builder/mysql/mysql-query-builder.js.map +1 -1
  51. package/dist/query-builder/postgresql/postgresql-expr-renderer.d.ts +4 -4
  52. package/dist/query-builder/postgresql/postgresql-expr-renderer.d.ts.map +1 -1
  53. package/dist/query-builder/postgresql/postgresql-expr-renderer.js +17 -17
  54. package/dist/query-builder/postgresql/postgresql-expr-renderer.js.map +1 -1
  55. package/dist/query-builder/postgresql/postgresql-query-builder.d.ts +5 -5
  56. package/dist/query-builder/postgresql/postgresql-query-builder.d.ts.map +1 -1
  57. package/dist/query-builder/postgresql/postgresql-query-builder.js +8 -8
  58. package/dist/query-builder/postgresql/postgresql-query-builder.js.map +1 -1
  59. package/dist/query-builder/query-builder.d.ts +1 -1
  60. package/dist/schema/factory/column-builder.d.ts +79 -79
  61. package/dist/schema/factory/column-builder.js +42 -42
  62. package/dist/schema/factory/index-builder.d.ts +39 -39
  63. package/dist/schema/factory/index-builder.js +26 -26
  64. package/dist/schema/factory/relation-builder.d.ts +99 -99
  65. package/dist/schema/factory/relation-builder.d.ts.map +1 -1
  66. package/dist/schema/factory/relation-builder.js +38 -38
  67. package/dist/schema/procedure-builder.d.ts +49 -49
  68. package/dist/schema/procedure-builder.d.ts.map +1 -1
  69. package/dist/schema/procedure-builder.js +33 -33
  70. package/dist/schema/table-builder.d.ts +59 -59
  71. package/dist/schema/table-builder.d.ts.map +1 -1
  72. package/dist/schema/table-builder.js +43 -43
  73. package/dist/schema/view-builder.d.ts +49 -49
  74. package/dist/schema/view-builder.d.ts.map +1 -1
  75. package/dist/schema/view-builder.js +32 -32
  76. package/dist/types/column.d.ts +22 -22
  77. package/dist/types/column.js +1 -1
  78. package/dist/types/column.js.map +1 -1
  79. package/dist/types/db.d.ts +40 -40
  80. package/dist/types/expr.d.ts +59 -59
  81. package/dist/types/expr.d.ts.map +1 -1
  82. package/dist/types/query-def.d.ts +44 -44
  83. package/dist/types/query-def.d.ts.map +1 -1
  84. package/dist/utils/result-parser.d.ts +11 -11
  85. package/dist/utils/result-parser.js +3 -3
  86. package/dist/utils/result-parser.js.map +1 -1
  87. package/package.json +5 -5
  88. package/src/create-db-context.ts +20 -20
  89. package/src/ddl/column-ddl.ts +4 -4
  90. package/src/ddl/initialize.ts +259 -259
  91. package/src/ddl/relation-ddl.ts +89 -89
  92. package/src/ddl/schema-ddl.ts +4 -4
  93. package/src/ddl/table-ddl.ts +189 -189
  94. package/src/errors/db-transaction-error.ts +13 -13
  95. package/src/exec/executable.ts +25 -25
  96. package/src/exec/queryable.ts +2033 -2033
  97. package/src/exec/search-parser.ts +57 -57
  98. package/src/expr/expr-unit.ts +4 -4
  99. package/src/expr/expr.ts +2140 -2140
  100. package/src/query-builder/base/expr-renderer-base.ts +237 -237
  101. package/src/query-builder/base/query-builder-base.ts +213 -213
  102. package/src/query-builder/mssql/mssql-expr-renderer.ts +607 -607
  103. package/src/query-builder/mssql/mssql-query-builder.ts +650 -650
  104. package/src/query-builder/mysql/mysql-expr-renderer.ts +613 -613
  105. package/src/query-builder/mysql/mysql-query-builder.ts +759 -759
  106. package/src/query-builder/postgresql/postgresql-expr-renderer.ts +611 -611
  107. package/src/query-builder/postgresql/postgresql-query-builder.ts +686 -686
  108. package/src/query-builder/query-builder.ts +19 -19
  109. package/src/schema/factory/column-builder.ts +423 -423
  110. package/src/schema/factory/index-builder.ts +164 -164
  111. package/src/schema/factory/relation-builder.ts +453 -453
  112. package/src/schema/procedure-builder.ts +232 -232
  113. package/src/schema/table-builder.ts +319 -319
  114. package/src/schema/view-builder.ts +221 -221
  115. package/src/types/column.ts +188 -188
  116. package/src/types/db.ts +208 -208
  117. package/src/types/expr.ts +697 -697
  118. package/src/types/query-def.ts +513 -513
  119. package/src/utils/result-parser.ts +458 -458
  120. package/tests/db-context/create-db-context.spec.ts +224 -0
  121. package/tests/db-context/define-db-context.spec.ts +68 -0
  122. package/tests/ddl/basic.expected.ts +341 -0
  123. package/tests/ddl/basic.spec.ts +714 -0
  124. package/tests/ddl/column-builder.expected.ts +310 -0
  125. package/tests/ddl/column-builder.spec.ts +637 -0
  126. package/tests/ddl/index-builder.expected.ts +38 -0
  127. package/tests/ddl/index-builder.spec.ts +202 -0
  128. package/tests/ddl/procedure-builder.expected.ts +52 -0
  129. package/tests/ddl/procedure-builder.spec.ts +234 -0
  130. package/tests/ddl/relation-builder.expected.ts +36 -0
  131. package/tests/ddl/relation-builder.spec.ts +372 -0
  132. package/tests/ddl/table-builder.expected.ts +113 -0
  133. package/tests/ddl/table-builder.spec.ts +433 -0
  134. package/tests/ddl/view-builder.expected.ts +38 -0
  135. package/tests/ddl/view-builder.spec.ts +176 -0
  136. package/tests/dml/delete.expected.ts +96 -0
  137. package/tests/dml/delete.spec.ts +160 -0
  138. package/tests/dml/insert.expected.ts +192 -0
  139. package/tests/dml/insert.spec.ts +288 -0
  140. package/tests/dml/update.expected.ts +176 -0
  141. package/tests/dml/update.spec.ts +318 -0
  142. package/tests/dml/upsert.expected.ts +215 -0
  143. package/tests/dml/upsert.spec.ts +242 -0
  144. package/tests/errors/queryable-errors.spec.ts +177 -0
  145. package/tests/escape.spec.ts +100 -0
  146. package/tests/examples/pivot.expected.ts +211 -0
  147. package/tests/examples/pivot.spec.ts +533 -0
  148. package/tests/examples/sampling.expected.ts +69 -0
  149. package/tests/examples/sampling.spec.ts +105 -0
  150. package/tests/examples/unpivot.expected.ts +120 -0
  151. package/tests/examples/unpivot.spec.ts +226 -0
  152. package/tests/exec/search-parser.spec.ts +283 -0
  153. package/tests/executable/basic.expected.ts +18 -0
  154. package/tests/executable/basic.spec.ts +54 -0
  155. package/tests/expr/comparison.expected.ts +282 -0
  156. package/tests/expr/comparison.spec.ts +400 -0
  157. package/tests/expr/conditional.expected.ts +134 -0
  158. package/tests/expr/conditional.spec.ts +276 -0
  159. package/tests/expr/date.expected.ts +332 -0
  160. package/tests/expr/date.spec.ts +526 -0
  161. package/tests/expr/math.expected.ts +62 -0
  162. package/tests/expr/math.spec.ts +106 -0
  163. package/tests/expr/string.expected.ts +218 -0
  164. package/tests/expr/string.spec.ts +356 -0
  165. package/tests/expr/utility.expected.ts +147 -0
  166. package/tests/expr/utility.spec.ts +182 -0
  167. package/tests/select/basic.expected.ts +322 -0
  168. package/tests/select/basic.spec.ts +502 -0
  169. package/tests/select/filter.expected.ts +357 -0
  170. package/tests/select/filter.spec.ts +1068 -0
  171. package/tests/select/group.expected.ts +169 -0
  172. package/tests/select/group.spec.ts +244 -0
  173. package/tests/select/join.expected.ts +582 -0
  174. package/tests/select/join.spec.ts +805 -0
  175. package/tests/select/order.expected.ts +150 -0
  176. package/tests/select/order.spec.ts +189 -0
  177. package/tests/select/recursive-cte.expected.ts +244 -0
  178. package/tests/select/recursive-cte.spec.ts +514 -0
  179. package/tests/select/result-meta.spec.ts +270 -0
  180. package/tests/select/subquery.expected.ts +363 -0
  181. package/tests/select/subquery.spec.ts +537 -0
  182. package/tests/select/view.expected.ts +155 -0
  183. package/tests/select/view.spec.ts +235 -0
  184. package/tests/select/window.expected.ts +345 -0
  185. package/tests/select/window.spec.ts +618 -0
  186. package/tests/setup/MockExecutor.ts +18 -0
  187. package/tests/setup/TestDbContext.ts +59 -0
  188. package/tests/setup/models/Company.ts +13 -0
  189. package/tests/setup/models/Employee.ts +10 -0
  190. package/tests/setup/models/MonthlySales.ts +11 -0
  191. package/tests/setup/models/Post.ts +16 -0
  192. package/tests/setup/models/Sales.ts +10 -0
  193. package/tests/setup/models/User.ts +19 -0
  194. package/tests/setup/procedure/GetAllUsers.ts +9 -0
  195. package/tests/setup/procedure/GetUserById.ts +12 -0
  196. package/tests/setup/test-utils.ts +72 -0
  197. package/tests/setup/views/ActiveUsers.ts +8 -0
  198. package/tests/setup/views/UserSummary.ts +11 -0
  199. package/tests/types/nullable-queryable-record.spec.ts +145 -0
  200. package/tests/utils/result-parser-perf.spec.ts +210 -0
  201. package/tests/utils/result-parser.spec.ts +701 -0
  202. package/docs/expressions.md +0 -172
  203. package/docs/queries.md +0 -444
  204. package/docs/schema.md +0 -245
@@ -0,0 +1,270 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { createTestDb } from "../setup/TestDbContext";
3
+ import { Post } from "../setup/models/Post";
4
+ import { User } from "../setup/models/User";
5
+ import { Company } from "../setup/models/Company";
6
+ import { expr } from "../../src/expr/expr";
7
+
8
+ describe("getResultMeta", () => {
9
+ it("Basic table", () => {
10
+ const db = createTestDb();
11
+ const meta = db.user().getResultMeta();
12
+
13
+ expect(meta).toEqual({
14
+ columns: {
15
+ id: "number",
16
+ name: "string",
17
+ email: "string",
18
+ age: "number",
19
+ isActive: "boolean",
20
+ companyId: "number",
21
+ createdAt: "DateTime",
22
+ },
23
+ joins: {},
24
+ });
25
+ });
26
+
27
+ it("join (1:N array)", () => {
28
+ const db = createTestDb();
29
+ const meta = db
30
+ .user()
31
+ .join("posts", (q, c) => q.from(Post).where((item) => [expr.eq(item.userId, c.id)]))
32
+ .getResultMeta();
33
+
34
+ expect(meta).toEqual({
35
+ columns: {
36
+ "id": "number",
37
+ "name": "string",
38
+ "email": "string",
39
+ "age": "number",
40
+ "isActive": "boolean",
41
+ "companyId": "number",
42
+ "createdAt": "DateTime",
43
+ "posts.id": "number",
44
+ "posts.userId": "number",
45
+ "posts.title": "string",
46
+ "posts.content": "string",
47
+ "posts.viewCount": "number",
48
+ "posts.publishedAt": "DateTime",
49
+ },
50
+ joins: {
51
+ posts: { isSingle: false },
52
+ },
53
+ });
54
+ });
55
+
56
+ it("joinSingle (N:1 single)", () => {
57
+ const db = createTestDb();
58
+ const meta = db
59
+ .post()
60
+ .joinSingle("user", (q, c) => q.from(User).where((item) => [expr.eq(item.id, c.userId)]))
61
+ .getResultMeta();
62
+
63
+ expect(meta).toEqual({
64
+ columns: {
65
+ "id": "number",
66
+ "userId": "number",
67
+ "title": "string",
68
+ "content": "string",
69
+ "viewCount": "number",
70
+ "publishedAt": "DateTime",
71
+ "user.id": "number",
72
+ "user.name": "string",
73
+ "user.email": "string",
74
+ "user.age": "number",
75
+ "user.isActive": "boolean",
76
+ "user.companyId": "number",
77
+ "user.createdAt": "DateTime",
78
+ },
79
+ joins: {
80
+ user: { isSingle: true },
81
+ },
82
+ });
83
+ });
84
+
85
+ it("Multi-level join", () => {
86
+ const db = createTestDb();
87
+ const meta = db
88
+ .post()
89
+ .joinSingle("user", (q, c) =>
90
+ q
91
+ .from(User)
92
+ .joinSingle("company", (q2, c2) =>
93
+ q2.from(Company).where((item) => [expr.eq(item.id, c2.companyId)]),
94
+ )
95
+ .where((item) => [expr.eq(item.id, c.userId)]),
96
+ )
97
+ .getResultMeta();
98
+
99
+ expect(meta).toEqual({
100
+ columns: {
101
+ "id": "number",
102
+ "userId": "number",
103
+ "title": "string",
104
+ "content": "string",
105
+ "viewCount": "number",
106
+ "publishedAt": "DateTime",
107
+ "user.id": "number",
108
+ "user.name": "string",
109
+ "user.email": "string",
110
+ "user.age": "number",
111
+ "user.isActive": "boolean",
112
+ "user.companyId": "number",
113
+ "user.createdAt": "DateTime",
114
+ "user.company.id": "number",
115
+ "user.company.name": "string",
116
+ "user.company.foundedAt": "DateOnly",
117
+ },
118
+ joins: {
119
+ "user": { isSingle: true },
120
+ "user.company": { isSingle: true },
121
+ },
122
+ });
123
+ });
124
+
125
+ it("Multiple join (array + single)", () => {
126
+ const db = createTestDb();
127
+ const meta = db
128
+ .user()
129
+ .join("posts", (q, c) => q.from(Post).where((item) => [expr.eq(item.userId, c.id)]))
130
+ .joinSingle("company", (q, c) =>
131
+ q.from(Company).where((item) => [expr.eq(item.id, c.companyId)]),
132
+ )
133
+ .getResultMeta();
134
+
135
+ expect(meta).toEqual({
136
+ columns: {
137
+ "id": "number",
138
+ "name": "string",
139
+ "email": "string",
140
+ "age": "number",
141
+ "isActive": "boolean",
142
+ "companyId": "number",
143
+ "createdAt": "DateTime",
144
+ "posts.id": "number",
145
+ "posts.userId": "number",
146
+ "posts.title": "string",
147
+ "posts.content": "string",
148
+ "posts.viewCount": "number",
149
+ "posts.publishedAt": "DateTime",
150
+ "company.id": "number",
151
+ "company.name": "string",
152
+ "company.foundedAt": "DateOnly",
153
+ },
154
+ joins: {
155
+ posts: { isSingle: false },
156
+ company: { isSingle: true },
157
+ },
158
+ });
159
+ });
160
+
161
+ it("Custom columns with select", () => {
162
+ const db = createTestDb();
163
+ const meta = db
164
+ .user()
165
+ .select((cols) => ({
166
+ userId: cols.id,
167
+ userName: cols.name,
168
+ }))
169
+ .getResultMeta();
170
+
171
+ expect(meta).toEqual({
172
+ columns: {
173
+ userId: "number",
174
+ userName: "string",
175
+ },
176
+ joins: {},
177
+ });
178
+ });
179
+
180
+ it("include (FK N:1)", () => {
181
+ const db = createTestDb();
182
+ const meta = db
183
+ .post()
184
+ .include((item) => item.user)
185
+ .getResultMeta();
186
+
187
+ expect(meta).toEqual({
188
+ columns: {
189
+ "id": "number",
190
+ "userId": "number",
191
+ "title": "string",
192
+ "content": "string",
193
+ "viewCount": "number",
194
+ "publishedAt": "DateTime",
195
+ "user.id": "number",
196
+ "user.name": "string",
197
+ "user.email": "string",
198
+ "user.age": "number",
199
+ "user.isActive": "boolean",
200
+ "user.companyId": "number",
201
+ "user.createdAt": "DateTime",
202
+ },
203
+ joins: {
204
+ user: { isSingle: true },
205
+ },
206
+ });
207
+ });
208
+
209
+ it("include (FKT 1:N)", () => {
210
+ const db = createTestDb();
211
+ const meta = db
212
+ .user()
213
+ .include((item) => item.posts)
214
+ .getResultMeta();
215
+
216
+ expect(meta).toEqual({
217
+ columns: {
218
+ "id": "number",
219
+ "name": "string",
220
+ "email": "string",
221
+ "age": "number",
222
+ "isActive": "boolean",
223
+ "companyId": "number",
224
+ "createdAt": "DateTime",
225
+ "posts.id": "number",
226
+ "posts.userId": "number",
227
+ "posts.title": "string",
228
+ "posts.content": "string",
229
+ "posts.viewCount": "number",
230
+ "posts.publishedAt": "DateTime",
231
+ },
232
+ joins: {
233
+ posts: { isSingle: false },
234
+ },
235
+ });
236
+ });
237
+
238
+ it("Multi-level include", () => {
239
+ const db = createTestDb();
240
+ const meta = db
241
+ .post()
242
+ .include((item) => item.user.company)
243
+ .getResultMeta();
244
+
245
+ expect(meta).toEqual({
246
+ columns: {
247
+ "id": "number",
248
+ "userId": "number",
249
+ "title": "string",
250
+ "content": "string",
251
+ "viewCount": "number",
252
+ "publishedAt": "DateTime",
253
+ "user.id": "number",
254
+ "user.name": "string",
255
+ "user.email": "string",
256
+ "user.age": "number",
257
+ "user.isActive": "boolean",
258
+ "user.companyId": "number",
259
+ "user.createdAt": "DateTime",
260
+ "user.company.id": "number",
261
+ "user.company.name": "string",
262
+ "user.company.foundedAt": "DateOnly",
263
+ },
264
+ joins: {
265
+ "user": { isSingle: true },
266
+ "user.company": { isSingle: true },
267
+ },
268
+ });
269
+ });
270
+ });
@@ -0,0 +1,363 @@
1
+ /**
2
+ * SELECT - Subquery/WRAP/UNION test expected SQL
3
+ */
4
+ import { mysql, pgsql, tsql } from "@simplysm/core-common";
5
+ import type { ExpectedSql } from "../setup/test-utils";
6
+
7
+ //#region ========== WRAP (Subquery) ==========
8
+
9
+ export const wrapBasic: ExpectedSql = {
10
+ mysql: mysql`
11
+ SELECT *
12
+ FROM (SELECT * FROM \`TestDb\`.\`User\` AS \`T1\`) AS \`T2\`
13
+ `,
14
+ mssql: tsql`
15
+ SELECT *
16
+ FROM (SELECT * FROM [TestDb].[TestSchema].[User] AS [T1]) AS [T2]
17
+ `,
18
+ postgresql: pgsql`
19
+ SELECT *
20
+ FROM (SELECT * FROM "TestSchema"."User" AS "T1") AS "T2"
21
+ `,
22
+ };
23
+
24
+ export const wrapThenSelect: ExpectedSql = {
25
+ mysql: mysql`
26
+ SELECT \`T2\`.\`id\` AS \`id\`, \`T2\`.\`name\` AS \`name\`
27
+ FROM (SELECT * FROM \`TestDb\`.\`User\` AS \`T1\`) AS \`T2\`
28
+ `,
29
+ mssql: tsql`
30
+ SELECT [T2].[id] AS [id], [T2].[name] AS [name]
31
+ FROM (SELECT * FROM [TestDb].[TestSchema].[User] AS [T1]) AS [T2]
32
+ `,
33
+ postgresql: pgsql`
34
+ SELECT "T2"."id" AS "id", "T2"."name" AS "name"
35
+ FROM (SELECT * FROM "TestSchema"."User" AS "T1") AS "T2"
36
+ `,
37
+ };
38
+
39
+ export const selectThenWrap: ExpectedSql = {
40
+ mysql: mysql`
41
+ SELECT *
42
+ FROM (
43
+ SELECT \`T1\`.\`id\` AS \`id\`, \`T1\`.\`name\` AS \`name\`
44
+ FROM \`TestDb\`.\`User\` AS \`T1\`
45
+ ) AS \`T2\`
46
+ `,
47
+ mssql: tsql`
48
+ SELECT *
49
+ FROM (
50
+ SELECT [T1].[id] AS [id], [T1].[name] AS [name]
51
+ FROM [TestDb].[TestSchema].[User] AS [T1]
52
+ ) AS [T2]
53
+ `,
54
+ postgresql: pgsql`
55
+ SELECT *
56
+ FROM (
57
+ SELECT "T1"."id" AS "id", "T1"."name" AS "name"
58
+ FROM "TestSchema"."User" AS "T1"
59
+ ) AS "T2"
60
+ `,
61
+ };
62
+
63
+ export const whereThenWrapThenWhere: ExpectedSql = {
64
+ mysql: mysql`
65
+ SELECT *
66
+ FROM (
67
+ SELECT * FROM \`TestDb\`.\`User\` AS \`T1\`
68
+ WHERE \`T1\`.\`isActive\` <=> TRUE
69
+ ) AS \`T2\`
70
+ WHERE \`T2\`.\`age\` > 20
71
+ `,
72
+ mssql: tsql`
73
+ SELECT *
74
+ FROM (
75
+ SELECT * FROM [TestDb].[TestSchema].[User] AS [T1]
76
+ WHERE (([T1].[isActive] IS NULL AND 1 IS NULL) OR [T1].[isActive] = 1)
77
+ ) AS [T2]
78
+ WHERE [T2].[age] > 20
79
+ `,
80
+ postgresql: pgsql`
81
+ SELECT *
82
+ FROM (
83
+ SELECT * FROM "TestSchema"."User" AS "T1"
84
+ WHERE "T1"."isActive" IS NOT DISTINCT FROM TRUE
85
+ ) AS "T2"
86
+ WHERE "T2"."age" > 20
87
+ `,
88
+ };
89
+
90
+ export const includeThenWrapThenSelect: ExpectedSql = {
91
+ mysql: mysql`
92
+ SELECT \`T2\`.\`posts.userId\` AS \`postUserId\`
93
+ FROM (
94
+ SELECT \`T1\`.\`id\` AS \`id\`, \`T1\`.\`name\` AS \`name\`, \`T1\`.\`email\` AS \`email\`,
95
+ \`T1\`.\`age\` AS \`age\`, \`T1\`.\`isActive\` AS \`isActive\`, \`T1\`.\`companyId\` AS \`companyId\`,
96
+ \`T1\`.\`createdAt\` AS \`createdAt\`,
97
+ \`T1.posts\`.\`id\` AS \`posts.id\`, \`T1.posts\`.\`userId\` AS \`posts.userId\`,
98
+ \`T1.posts\`.\`title\` AS \`posts.title\`, \`T1.posts\`.\`content\` AS \`posts.content\`,
99
+ \`T1.posts\`.\`viewCount\` AS \`posts.viewCount\`, \`T1.posts\`.\`publishedAt\` AS \`posts.publishedAt\`
100
+ FROM \`TestDb\`.\`User\` AS \`T1\`
101
+ LEFT OUTER JOIN \`TestDb\`.\`Post\` AS \`T1.posts\` ON \`T1.posts\`.\`userId\` <=> \`T1\`.\`id\`
102
+ ) AS \`T2\`
103
+ `,
104
+ mssql: tsql`
105
+ SELECT [T2].[posts.userId] AS [postUserId]
106
+ FROM (
107
+ SELECT [T1].[id] AS [id], [T1].[name] AS [name], [T1].[email] AS [email],
108
+ [T1].[age] AS [age], [T1].[isActive] AS [isActive], [T1].[companyId] AS [companyId],
109
+ [T1].[createdAt] AS [createdAt],
110
+ [T1.posts].[id] AS [posts.id], [T1.posts].[userId] AS [posts.userId],
111
+ [T1.posts].[title] AS [posts.title], [T1.posts].[content] AS [posts.content],
112
+ [T1.posts].[viewCount] AS [posts.viewCount], [T1.posts].[publishedAt] AS [posts.publishedAt]
113
+ FROM [TestDb].[TestSchema].[User] AS [T1]
114
+ LEFT OUTER JOIN [TestDb].[TestSchema].[Post] AS [T1.posts]
115
+ ON (([T1.posts].[userId] IS NULL AND [T1].[id] IS NULL) OR [T1.posts].[userId] = [T1].[id])
116
+ ) AS [T2]
117
+ `,
118
+ postgresql: pgsql`
119
+ SELECT "T2"."posts.userId" AS "postUserId"
120
+ FROM (
121
+ SELECT "T1"."id" AS "id", "T1"."name" AS "name", "T1"."email" AS "email",
122
+ "T1"."age" AS "age", "T1"."isActive" AS "isActive", "T1"."companyId" AS "companyId",
123
+ "T1"."createdAt" AS "createdAt",
124
+ "T1.posts"."id" AS "posts.id", "T1.posts"."userId" AS "posts.userId",
125
+ "T1.posts"."title" AS "posts.title", "T1.posts"."content" AS "posts.content",
126
+ "T1.posts"."viewCount" AS "posts.viewCount", "T1.posts"."publishedAt" AS "posts.publishedAt"
127
+ FROM "TestSchema"."User" AS "T1"
128
+ LEFT OUTER JOIN "TestSchema"."Post" AS "T1.posts"
129
+ ON "T1.posts"."userId" IS NOT DISTINCT FROM "T1"."id"
130
+ ) AS "T2"
131
+ `,
132
+ };
133
+
134
+ export const groupByThenWrapThenOrderBy: ExpectedSql = {
135
+ mysql: mysql`
136
+ SELECT *
137
+ FROM (
138
+ SELECT \`T1\`.\`name\` AS \`name\`, COUNT(\`T1\`.\`id\`) AS \`cnt\`
139
+ FROM \`TestDb\`.\`User\` AS \`T1\`
140
+ GROUP BY \`T1\`.\`name\`
141
+ ) AS \`T2\`
142
+ ORDER BY \`T2\`.\`cnt\` DESC
143
+ `,
144
+ mssql: tsql`
145
+ SELECT *
146
+ FROM (
147
+ SELECT [T1].[name] AS [name], COUNT([T1].[id]) AS [cnt]
148
+ FROM [TestDb].[TestSchema].[User] AS [T1]
149
+ GROUP BY [T1].[name]
150
+ ) AS [T2]
151
+ ORDER BY [T2].[cnt] DESC
152
+ `,
153
+ postgresql: pgsql`
154
+ SELECT *
155
+ FROM (
156
+ SELECT "T1"."name" AS "name", COUNT("T1"."id") AS "cnt"
157
+ FROM "TestSchema"."User" AS "T1"
158
+ GROUP BY "T1"."name"
159
+ ) AS "T2"
160
+ ORDER BY "T2"."cnt" DESC
161
+ `,
162
+ };
163
+
164
+ //#endregion
165
+
166
+ //#region ========== UNION ==========
167
+
168
+ export const unionBasic: ExpectedSql = {
169
+ mysql: mysql`
170
+ SELECT *
171
+ FROM (
172
+ SELECT * FROM \`TestDb\`.\`User\` AS \`T1\` WHERE \`T1\`.\`isActive\` <=> TRUE
173
+ UNION ALL
174
+ SELECT * FROM \`TestDb\`.\`User\` AS \`T2\` WHERE \`T2\`.\`age\` > 30
175
+ ) AS \`T3\`
176
+ `,
177
+ mssql: tsql`
178
+ SELECT *
179
+ FROM (
180
+ SELECT * FROM [TestDb].[TestSchema].[User] AS [T1]
181
+ WHERE (([T1].[isActive] IS NULL AND 1 IS NULL) OR [T1].[isActive] = 1)
182
+ UNION ALL
183
+ SELECT * FROM [TestDb].[TestSchema].[User] AS [T2] WHERE [T2].[age] > 30
184
+ ) AS [T3]
185
+ `,
186
+ postgresql: pgsql`
187
+ SELECT *
188
+ FROM (
189
+ SELECT * FROM "TestSchema"."User" AS "T1"
190
+ WHERE "T1"."isActive" IS NOT DISTINCT FROM TRUE
191
+ UNION ALL
192
+ SELECT * FROM "TestSchema"."User" AS "T2" WHERE "T2"."age" > 30
193
+ ) AS "T3"
194
+ `,
195
+ };
196
+
197
+ export const unionThree: ExpectedSql = {
198
+ mysql: mysql`
199
+ SELECT *
200
+ FROM (
201
+ SELECT * FROM \`TestDb\`.\`User\` AS \`T1\` WHERE \`T1\`.\`age\` <=> 20
202
+ UNION ALL
203
+ SELECT * FROM \`TestDb\`.\`User\` AS \`T2\` WHERE \`T2\`.\`age\` <=> 30
204
+ UNION ALL
205
+ SELECT * FROM \`TestDb\`.\`User\` AS \`T3\` WHERE \`T3\`.\`age\` <=> 40
206
+ ) AS \`T4\`
207
+ `,
208
+ mssql: tsql`
209
+ SELECT *
210
+ FROM (
211
+ SELECT * FROM [TestDb].[TestSchema].[User] AS [T1]
212
+ WHERE (([T1].[age] IS NULL AND 20 IS NULL) OR [T1].[age] = 20)
213
+ UNION ALL
214
+ SELECT * FROM [TestDb].[TestSchema].[User] AS [T2]
215
+ WHERE (([T2].[age] IS NULL AND 30 IS NULL) OR [T2].[age] = 30)
216
+ UNION ALL
217
+ SELECT * FROM [TestDb].[TestSchema].[User] AS [T3]
218
+ WHERE (([T3].[age] IS NULL AND 40 IS NULL) OR [T3].[age] = 40)
219
+ ) AS [T4]
220
+ `,
221
+ postgresql: pgsql`
222
+ SELECT *
223
+ FROM (
224
+ SELECT * FROM "TestSchema"."User" AS "T1"
225
+ WHERE "T1"."age" IS NOT DISTINCT FROM 20
226
+ UNION ALL
227
+ SELECT * FROM "TestSchema"."User" AS "T2"
228
+ WHERE "T2"."age" IS NOT DISTINCT FROM 30
229
+ UNION ALL
230
+ SELECT * FROM "TestSchema"."User" AS "T3"
231
+ WHERE "T3"."age" IS NOT DISTINCT FROM 40
232
+ ) AS "T4"
233
+ `,
234
+ };
235
+
236
+ export const unionThenWhere: ExpectedSql = {
237
+ mysql: mysql`
238
+ SELECT *
239
+ FROM (
240
+ SELECT * FROM \`TestDb\`.\`User\` AS \`T1\` WHERE \`T1\`.\`isActive\` <=> TRUE
241
+ UNION ALL
242
+ SELECT * FROM \`TestDb\`.\`User\` AS \`T2\` WHERE \`T2\`.\`isActive\` <=> TRUE
243
+ ) AS \`T3\`
244
+ `,
245
+ mssql: tsql`
246
+ SELECT *
247
+ FROM (
248
+ SELECT * FROM [TestDb].[TestSchema].[User] AS [T1]
249
+ WHERE (([T1].[isActive] IS NULL AND 1 IS NULL) OR [T1].[isActive] = 1)
250
+ UNION ALL
251
+ SELECT * FROM [TestDb].[TestSchema].[User] AS [T2]
252
+ WHERE (([T2].[isActive] IS NULL AND 1 IS NULL) OR [T2].[isActive] = 1)
253
+ ) AS [T3]
254
+ `,
255
+ postgresql: pgsql`
256
+ SELECT *
257
+ FROM (
258
+ SELECT * FROM "TestSchema"."User" AS "T1"
259
+ WHERE "T1"."isActive" IS NOT DISTINCT FROM TRUE
260
+ UNION ALL
261
+ SELECT * FROM "TestSchema"."User" AS "T2"
262
+ WHERE "T2"."isActive" IS NOT DISTINCT FROM TRUE
263
+ ) AS "T3"
264
+ `,
265
+ };
266
+
267
+ export const unionThenWrapThenOrderByLimit: ExpectedSql = {
268
+ mysql: mysql`
269
+ SELECT *
270
+ FROM (
271
+ SELECT *
272
+ FROM (
273
+ SELECT * FROM \`TestDb\`.\`User\` AS \`T1\` WHERE \`T1\`.\`isActive\` <=> TRUE
274
+ UNION ALL
275
+ SELECT * FROM \`TestDb\`.\`User\` AS \`T2\` WHERE \`T2\`.\`age\` > 30
276
+ ) AS \`T3\`
277
+ ) AS \`T4\`
278
+ ORDER BY \`T4\`.\`id\` DESC
279
+ LIMIT 0, 10
280
+ `,
281
+ mssql: tsql`
282
+ SELECT *
283
+ FROM (
284
+ SELECT *
285
+ FROM (
286
+ SELECT * FROM [TestDb].[TestSchema].[User] AS [T1]
287
+ WHERE (([T1].[isActive] IS NULL AND 1 IS NULL) OR [T1].[isActive] = 1)
288
+ UNION ALL
289
+ SELECT * FROM [TestDb].[TestSchema].[User] AS [T2] WHERE [T2].[age] > 30
290
+ ) AS [T3]
291
+ ) AS [T4]
292
+ ORDER BY [T4].[id] DESC
293
+ OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY
294
+ `,
295
+ postgresql: pgsql`
296
+ SELECT *
297
+ FROM (
298
+ SELECT *
299
+ FROM (
300
+ SELECT * FROM "TestSchema"."User" AS "T1"
301
+ WHERE "T1"."isActive" IS NOT DISTINCT FROM TRUE
302
+ UNION ALL
303
+ SELECT * FROM "TestSchema"."User" AS "T2" WHERE "T2"."age" > 30
304
+ ) AS "T3"
305
+ ) AS "T4"
306
+ ORDER BY "T4"."id" DESC
307
+ LIMIT 10 OFFSET 0
308
+ `,
309
+ };
310
+
311
+ export const unionThenSelect: ExpectedSql = {
312
+ mysql: mysql`
313
+ SELECT *
314
+ FROM (
315
+ SELECT \`T1\`.\`id\` AS \`id\`, \`T1\`.\`name\` AS \`name\` FROM \`TestDb\`.\`User\` AS \`T1\`
316
+ UNION ALL
317
+ SELECT \`T2\`.\`id\` AS \`id\`, \`T2\`.\`name\` AS \`name\` FROM \`TestDb\`.\`User\` AS \`T2\`
318
+ ) AS \`T3\`
319
+ `,
320
+ mssql: tsql`
321
+ SELECT *
322
+ FROM (
323
+ SELECT [T1].[id] AS [id], [T1].[name] AS [name] FROM [TestDb].[TestSchema].[User] AS [T1]
324
+ UNION ALL
325
+ SELECT [T2].[id] AS [id], [T2].[name] AS [name] FROM [TestDb].[TestSchema].[User] AS [T2]
326
+ ) AS [T3]
327
+ `,
328
+ postgresql: pgsql`
329
+ SELECT *
330
+ FROM (
331
+ SELECT "T1"."id" AS "id", "T1"."name" AS "name" FROM "TestSchema"."User" AS "T1"
332
+ UNION ALL
333
+ SELECT "T2"."id" AS "id", "T2"."name" AS "name" FROM "TestSchema"."User" AS "T2"
334
+ ) AS "T3"
335
+ `,
336
+ };
337
+
338
+ //#endregion
339
+
340
+ //#region ========== SCALAR SUBQUERY ==========
341
+
342
+ export const scalarSubquery: ExpectedSql = {
343
+ mysql: mysql`
344
+ SELECT
345
+ \`T1\`.\`id\` AS \`id\`,
346
+ (SELECT COUNT(*) AS \`cnt\` FROM \`TestDb\`.\`Post\` AS \`T2\` WHERE \`T2\`.\`userId\`<=>\`T1\`.\`id\`) AS \`postCount\`
347
+ FROM \`TestDb\`.\`User\` AS \`T1\`
348
+ `,
349
+ mssql: tsql`
350
+ SELECT
351
+ [T1].[id] AS [id],
352
+ (SELECT COUNT(*) AS [cnt] FROM [TestDb].[TestSchema].[Post] AS [T2] WHERE (([T2].[userId] IS NULL AND [T1].[id] IS NULL) OR [T2].[userId] = [T1].[id])) AS [postCount]
353
+ FROM [TestDb].[TestSchema].[User] AS [T1]
354
+ `,
355
+ postgresql: pgsql`
356
+ SELECT
357
+ "T1"."id" AS "id",
358
+ (SELECT COUNT(*) AS "cnt" FROM "TestSchema"."Post" AS "T2" WHERE "T2"."userId" IS NOT DISTINCT FROM "T1"."id") AS "postCount"
359
+ FROM "TestSchema"."User" AS "T1"
360
+ `,
361
+ };
362
+
363
+ //#endregion