@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.
- package/README.md +90 -147
- package/dist/create-db-context.d.ts +10 -10
- package/dist/create-db-context.js +312 -276
- package/dist/create-db-context.js.map +1 -6
- package/dist/ddl/column-ddl.d.ts +4 -4
- package/dist/ddl/column-ddl.js +41 -35
- package/dist/ddl/column-ddl.js.map +1 -6
- package/dist/ddl/initialize.d.ts +17 -17
- package/dist/ddl/initialize.js +200 -142
- package/dist/ddl/initialize.js.map +1 -6
- package/dist/ddl/relation-ddl.d.ts +6 -6
- package/dist/ddl/relation-ddl.js +55 -48
- package/dist/ddl/relation-ddl.js.map +1 -6
- package/dist/ddl/schema-ddl.d.ts +4 -4
- package/dist/ddl/schema-ddl.js +21 -15
- package/dist/ddl/schema-ddl.js.map +1 -6
- package/dist/ddl/table-ddl.d.ts +20 -20
- package/dist/ddl/table-ddl.js +139 -93
- package/dist/ddl/table-ddl.js.map +1 -6
- package/dist/define-db-context.js +10 -13
- package/dist/define-db-context.js.map +1 -6
- package/dist/errors/db-transaction-error.d.ts +15 -15
- package/dist/errors/db-transaction-error.d.ts.map +1 -1
- package/dist/errors/db-transaction-error.js +53 -19
- package/dist/errors/db-transaction-error.js.map +1 -6
- package/dist/exec/executable.d.ts +23 -23
- package/dist/exec/executable.js +94 -40
- package/dist/exec/executable.js.map +1 -6
- package/dist/exec/queryable.d.ts +97 -97
- package/dist/exec/queryable.js +1310 -1204
- package/dist/exec/queryable.js.map +1 -6
- package/dist/exec/search-parser.d.ts +31 -31
- package/dist/exec/search-parser.d.ts.map +1 -1
- package/dist/exec/search-parser.js +158 -59
- package/dist/exec/search-parser.js.map +1 -6
- package/dist/expr/expr-unit.d.ts +4 -4
- package/dist/expr/expr-unit.js +24 -18
- package/dist/expr/expr-unit.js.map +1 -6
- package/dist/expr/expr.d.ts +108 -108
- package/dist/expr/expr.js +1872 -1844
- package/dist/expr/expr.js.map +1 -6
- package/dist/index.js +23 -1
- package/dist/index.js.map +1 -6
- package/dist/models/system-migration.js +7 -7
- package/dist/models/system-migration.js.map +1 -6
- package/dist/query-builder/base/expr-renderer-base.d.ts +10 -10
- package/dist/query-builder/base/expr-renderer-base.js +27 -21
- package/dist/query-builder/base/expr-renderer-base.js.map +1 -6
- package/dist/query-builder/base/query-builder-base.d.ts +21 -21
- package/dist/query-builder/base/query-builder-base.d.ts.map +1 -1
- package/dist/query-builder/base/query-builder-base.js +90 -80
- package/dist/query-builder/base/query-builder-base.js.map +1 -6
- package/dist/query-builder/mssql/mssql-expr-renderer.d.ts +5 -5
- package/dist/query-builder/mssql/mssql-expr-renderer.d.ts.map +1 -1
- package/dist/query-builder/mssql/mssql-expr-renderer.js +447 -420
- package/dist/query-builder/mssql/mssql-expr-renderer.js.map +1 -6
- package/dist/query-builder/mssql/mssql-query-builder.d.ts +2 -2
- package/dist/query-builder/mssql/mssql-query-builder.d.ts.map +1 -1
- package/dist/query-builder/mssql/mssql-query-builder.js +483 -443
- package/dist/query-builder/mssql/mssql-query-builder.js.map +1 -6
- package/dist/query-builder/mysql/mysql-expr-renderer.d.ts +5 -5
- package/dist/query-builder/mysql/mysql-expr-renderer.d.ts.map +1 -1
- package/dist/query-builder/mysql/mysql-expr-renderer.js +451 -419
- package/dist/query-builder/mysql/mysql-expr-renderer.js.map +1 -6
- package/dist/query-builder/mysql/mysql-query-builder.d.ts +10 -10
- package/dist/query-builder/mysql/mysql-query-builder.d.ts.map +1 -1
- package/dist/query-builder/mysql/mysql-query-builder.js +570 -479
- package/dist/query-builder/mysql/mysql-query-builder.js.map +1 -6
- package/dist/query-builder/postgresql/postgresql-expr-renderer.d.ts +5 -5
- package/dist/query-builder/postgresql/postgresql-expr-renderer.d.ts.map +1 -1
- package/dist/query-builder/postgresql/postgresql-expr-renderer.js +449 -422
- package/dist/query-builder/postgresql/postgresql-expr-renderer.js.map +1 -6
- package/dist/query-builder/postgresql/postgresql-query-builder.d.ts +8 -8
- package/dist/query-builder/postgresql/postgresql-query-builder.d.ts.map +1 -1
- package/dist/query-builder/postgresql/postgresql-query-builder.js +511 -460
- package/dist/query-builder/postgresql/postgresql-query-builder.js.map +1 -6
- package/dist/query-builder/query-builder.d.ts +1 -1
- package/dist/query-builder/query-builder.js +13 -13
- package/dist/query-builder/query-builder.js.map +1 -6
- package/dist/schema/factory/column-builder.d.ts +84 -84
- package/dist/schema/factory/column-builder.js +248 -185
- package/dist/schema/factory/column-builder.js.map +1 -6
- package/dist/schema/factory/index-builder.d.ts +38 -38
- package/dist/schema/factory/index-builder.js +144 -85
- package/dist/schema/factory/index-builder.js.map +1 -6
- package/dist/schema/factory/relation-builder.d.ts +99 -99
- package/dist/schema/factory/relation-builder.d.ts.map +1 -1
- package/dist/schema/factory/relation-builder.js +274 -136
- package/dist/schema/factory/relation-builder.js.map +1 -6
- package/dist/schema/procedure-builder.d.ts +51 -51
- package/dist/schema/procedure-builder.d.ts.map +1 -1
- package/dist/schema/procedure-builder.js +205 -131
- package/dist/schema/procedure-builder.js.map +1 -6
- package/dist/schema/table-builder.d.ts +55 -55
- package/dist/schema/table-builder.d.ts.map +1 -1
- package/dist/schema/table-builder.js +274 -205
- package/dist/schema/table-builder.js.map +1 -6
- package/dist/schema/view-builder.d.ts +44 -44
- package/dist/schema/view-builder.d.ts.map +1 -1
- package/dist/schema/view-builder.js +189 -116
- package/dist/schema/view-builder.js.map +1 -6
- package/dist/types/column.d.ts +21 -21
- package/dist/types/column.js +60 -30
- package/dist/types/column.js.map +1 -6
- package/dist/types/db-context-def.d.ts +9 -9
- package/dist/types/db-context-def.js +2 -1
- package/dist/types/db-context-def.js.map +1 -6
- package/dist/types/db.d.ts +47 -47
- package/dist/types/db.js +15 -5
- package/dist/types/db.js.map +1 -6
- package/dist/types/expr.d.ts +81 -81
- package/dist/types/expr.d.ts.map +1 -1
- package/dist/types/expr.js +3 -1
- package/dist/types/expr.js.map +1 -6
- package/dist/types/query-def.d.ts +46 -46
- package/dist/types/query-def.d.ts.map +1 -1
- package/dist/types/query-def.js +31 -24
- package/dist/types/query-def.js.map +1 -6
- package/dist/utils/result-parser.d.ts +11 -11
- package/dist/utils/result-parser.js +362 -221
- package/dist/utils/result-parser.js.map +1 -6
- package/docs/core.md +117 -145
- package/docs/expression.md +186 -203
- package/docs/query-builder.md +75 -42
- package/docs/queryable.md +189 -151
- package/docs/schema-builders.md +172 -283
- package/docs/types.md +229 -173
- package/package.json +7 -5
- package/src/create-db-context.ts +31 -31
- package/src/ddl/column-ddl.ts +4 -4
- package/src/ddl/initialize.ts +38 -38
- package/src/ddl/relation-ddl.ts +6 -6
- package/src/ddl/schema-ddl.ts +4 -4
- package/src/ddl/table-ddl.ts +24 -24
- package/src/errors/db-transaction-error.ts +13 -13
- package/src/exec/executable.ts +25 -25
- package/src/exec/queryable.ts +152 -152
- package/src/exec/search-parser.ts +50 -50
- package/src/expr/expr-unit.ts +4 -4
- package/src/expr/expr.ts +118 -118
- package/src/index.ts +8 -8
- package/src/models/system-migration.ts +1 -1
- package/src/query-builder/base/expr-renderer-base.ts +21 -21
- package/src/query-builder/base/query-builder-base.ts +33 -33
- package/src/query-builder/mssql/mssql-expr-renderer.ts +28 -28
- package/src/query-builder/mssql/mssql-query-builder.ts +37 -37
- package/src/query-builder/mysql/mysql-expr-renderer.ts +29 -29
- package/src/query-builder/mysql/mysql-query-builder.ts +70 -70
- package/src/query-builder/postgresql/postgresql-expr-renderer.ts +22 -22
- package/src/query-builder/postgresql/postgresql-query-builder.ts +54 -54
- package/src/query-builder/query-builder.ts +1 -1
- package/src/schema/factory/column-builder.ts +86 -86
- package/src/schema/factory/index-builder.ts +38 -38
- package/src/schema/factory/relation-builder.ts +102 -102
- package/src/schema/procedure-builder.ts +52 -52
- package/src/schema/table-builder.ts +56 -56
- package/src/schema/view-builder.ts +47 -47
- package/src/types/column.ts +24 -24
- package/src/types/db-context-def.ts +15 -15
- package/src/types/db.ts +50 -50
- package/src/types/expr.ts +103 -103
- package/src/types/query-def.ts +50 -50
- package/src/utils/result-parser.ts +88 -88
- package/docs/utilities.md +0 -27
- package/tests/db-context/create-db-context.spec.ts +0 -193
- package/tests/db-context/define-db-context.spec.ts +0 -17
- package/tests/ddl/basic.expected.ts +0 -341
- package/tests/ddl/basic.spec.ts +0 -557
- package/tests/ddl/column-builder.expected.ts +0 -310
- package/tests/ddl/column-builder.spec.ts +0 -525
- package/tests/ddl/index-builder.expected.ts +0 -38
- package/tests/ddl/index-builder.spec.ts +0 -148
- package/tests/ddl/procedure-builder.expected.ts +0 -52
- package/tests/ddl/procedure-builder.spec.ts +0 -128
- package/tests/ddl/relation-builder.expected.ts +0 -36
- package/tests/ddl/relation-builder.spec.ts +0 -171
- package/tests/ddl/table-builder.expected.ts +0 -113
- package/tests/ddl/table-builder.spec.ts +0 -399
- package/tests/ddl/view-builder.expected.ts +0 -38
- package/tests/ddl/view-builder.spec.ts +0 -116
- package/tests/dml/delete.expected.ts +0 -96
- package/tests/dml/delete.spec.ts +0 -127
- package/tests/dml/insert.expected.ts +0 -192
- package/tests/dml/insert.spec.ts +0 -210
- package/tests/dml/update.expected.ts +0 -176
- package/tests/dml/update.spec.ts +0 -222
- package/tests/dml/upsert.expected.ts +0 -215
- package/tests/dml/upsert.spec.ts +0 -190
- package/tests/errors/queryable-errors.spec.ts +0 -126
- package/tests/escape.spec.ts +0 -59
- package/tests/examples/pivot.expected.ts +0 -211
- package/tests/examples/pivot.spec.ts +0 -200
- package/tests/examples/sampling.expected.ts +0 -69
- package/tests/examples/sampling.spec.ts +0 -42
- package/tests/examples/unpivot.expected.ts +0 -120
- package/tests/examples/unpivot.spec.ts +0 -161
- package/tests/exec/search-parser.spec.ts +0 -267
- package/tests/executable/basic.expected.ts +0 -18
- package/tests/executable/basic.spec.ts +0 -54
- package/tests/expr/comparison.expected.ts +0 -282
- package/tests/expr/comparison.spec.ts +0 -334
- package/tests/expr/conditional.expected.ts +0 -134
- package/tests/expr/conditional.spec.ts +0 -249
- package/tests/expr/date.expected.ts +0 -332
- package/tests/expr/date.spec.ts +0 -459
- package/tests/expr/math.expected.ts +0 -62
- package/tests/expr/math.spec.ts +0 -59
- package/tests/expr/string.expected.ts +0 -218
- package/tests/expr/string.spec.ts +0 -300
- package/tests/expr/utility.expected.ts +0 -147
- package/tests/expr/utility.spec.ts +0 -155
- package/tests/select/basic.expected.ts +0 -322
- package/tests/select/basic.spec.ts +0 -433
- package/tests/select/filter.expected.ts +0 -357
- package/tests/select/filter.spec.ts +0 -954
- package/tests/select/group.expected.ts +0 -169
- package/tests/select/group.spec.ts +0 -159
- package/tests/select/join.expected.ts +0 -582
- package/tests/select/join.spec.ts +0 -692
- package/tests/select/order.expected.ts +0 -150
- package/tests/select/order.spec.ts +0 -140
- package/tests/select/recursive-cte.expected.ts +0 -244
- package/tests/select/recursive-cte.spec.ts +0 -514
- package/tests/select/result-meta.spec.ts +0 -270
- package/tests/select/subquery.expected.ts +0 -363
- package/tests/select/subquery.spec.ts +0 -441
- package/tests/select/view.expected.ts +0 -155
- package/tests/select/view.spec.ts +0 -235
- package/tests/select/window.expected.ts +0 -345
- package/tests/select/window.spec.ts +0 -433
- package/tests/setup/MockExecutor.ts +0 -18
- package/tests/setup/TestDbContext.ts +0 -59
- package/tests/setup/models/Company.ts +0 -13
- package/tests/setup/models/Employee.ts +0 -10
- package/tests/setup/models/MonthlySales.ts +0 -11
- package/tests/setup/models/Post.ts +0 -16
- package/tests/setup/models/Sales.ts +0 -10
- package/tests/setup/models/User.ts +0 -19
- package/tests/setup/procedure/GetAllUsers.ts +0 -9
- package/tests/setup/procedure/GetUserById.ts +0 -12
- package/tests/setup/test-utils.ts +0 -72
- package/tests/setup/views/ActiveUsers.ts +0 -8
- package/tests/setup/views/UserSummary.ts +0 -11
- package/tests/types/nullable-queryable-record.spec.ts +0 -97
- package/tests/utils/result-parser-perf.spec.ts +0 -143
- package/tests/utils/result-parser.spec.ts +0 -667
package/docs/expression.md
CHANGED
|
@@ -1,45 +1,166 @@
|
|
|
1
|
-
# Expression
|
|
1
|
+
# Expression DSL
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Dialect-independent SQL expression builder. Generates JSON AST (`Expr`) instead of SQL strings. The QueryBuilder transforms the AST to target DBMS syntax.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
## expr
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
class ExprUnit<TPrimitive extends ColumnPrimitive> {
|
|
9
|
-
readonly $infer!: TPrimitive;
|
|
10
|
-
get n(): ExprUnit<NonNullable<TPrimitive>>;
|
|
11
|
-
constructor(readonly dataType: ColumnPrimitiveStr, readonly expr: Expr);
|
|
12
|
-
}
|
|
13
|
-
```
|
|
7
|
+
Constant object with all expression builder methods. Used inside Queryable callbacks for `where()`, `select()`, `orderBy()`, etc.
|
|
14
8
|
|
|
15
|
-
|
|
16
|
-
|----------|------|-------------|
|
|
17
|
-
| `$infer` | `TPrimitive` | Type inference marker (not used at runtime) |
|
|
18
|
-
| `n` | `ExprUnit<NonNullable<TPrimitive>>` | Non-nullable version of this expression |
|
|
19
|
-
| `dataType` | `ColumnPrimitiveStr` | Column data type name |
|
|
20
|
-
| `expr` | `Expr` | Internal expression AST |
|
|
9
|
+
### Value Generation
|
|
21
10
|
|
|
22
|
-
|
|
11
|
+
| Method | Signature | Description |
|
|
12
|
+
|---|---|---|
|
|
13
|
+
| `val` | `(dataType: ColumnPrimitiveStr, value) => ExprUnit` | Wrap literal value as ExprUnit |
|
|
14
|
+
| `col` | `(dataType, ...path: string[]) => ExprUnit` | Generate column reference (internal use) |
|
|
15
|
+
| `raw` | `(dataType) => tagged template => ExprUnit` | Raw SQL expression (escape hatch). Interpolated values are auto-parameterized. |
|
|
23
16
|
|
|
24
|
-
|
|
17
|
+
**Example:**
|
|
25
18
|
|
|
26
19
|
```typescript
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
20
|
+
expr.val("string", "active")
|
|
21
|
+
expr.val("number", 100)
|
|
22
|
+
expr.val("DateOnly", DateOnly.today())
|
|
23
|
+
expr.raw("string")`JSON_EXTRACT(${u.metadata}, '$.email')`
|
|
30
24
|
```
|
|
31
25
|
|
|
32
|
-
|
|
26
|
+
### Comparison Operators (WHERE)
|
|
27
|
+
|
|
28
|
+
| Method | Signature | Description |
|
|
29
|
+
|---|---|---|
|
|
30
|
+
| `eq` | `(source, target) => WhereExprUnit` | Equality (NULL-safe: MySQL `<=>`) |
|
|
31
|
+
| `gt` | `(source, target) => WhereExprUnit` | Greater than (`>`) |
|
|
32
|
+
| `lt` | `(source, target) => WhereExprUnit` | Less than (`<`) |
|
|
33
|
+
| `gte` | `(source, target) => WhereExprUnit` | Greater than or equal (`>=`) |
|
|
34
|
+
| `lte` | `(source, target) => WhereExprUnit` | Less than or equal (`<=`) |
|
|
35
|
+
| `between` | `(source, from?, to?) => WhereExprUnit` | Range (BETWEEN). Undefined bounds are unbounded. |
|
|
36
|
+
|
|
37
|
+
### NULL Check
|
|
38
|
+
|
|
39
|
+
| Method | Signature | Description |
|
|
40
|
+
|---|---|---|
|
|
41
|
+
| `null` | `(source) => WhereExprUnit` | IS NULL check |
|
|
42
|
+
|
|
43
|
+
### String Search
|
|
44
|
+
|
|
45
|
+
| Method | Signature | Description |
|
|
46
|
+
|---|---|---|
|
|
47
|
+
| `like` | `(source, pattern) => WhereExprUnit` | LIKE pattern matching (`%`, `_` wildcards) |
|
|
48
|
+
| `regexp` | `(source, pattern) => WhereExprUnit` | Regular expression matching |
|
|
49
|
+
|
|
50
|
+
### IN / EXISTS
|
|
51
|
+
|
|
52
|
+
| Method | Signature | Description |
|
|
53
|
+
|---|---|---|
|
|
54
|
+
| `in` | `(source, values[]) => WhereExprUnit` | IN value list |
|
|
55
|
+
| `inQuery` | `(source, query: Queryable) => WhereExprUnit` | IN subquery (single-column SELECT) |
|
|
56
|
+
| `exists` | `(query: Queryable) => WhereExprUnit` | EXISTS subquery |
|
|
57
|
+
|
|
58
|
+
### Logical Operators
|
|
59
|
+
|
|
60
|
+
| Method | Signature | Description |
|
|
61
|
+
|---|---|---|
|
|
62
|
+
| `not` | `(arg: WhereExprUnit) => WhereExprUnit` | NOT |
|
|
63
|
+
| `and` | `(conditions: WhereExprUnit[]) => WhereExprUnit` | AND (all must match) |
|
|
64
|
+
| `or` | `(conditions: WhereExprUnit[]) => WhereExprUnit` | OR (any must match) |
|
|
65
|
+
|
|
66
|
+
### String Functions (SELECT)
|
|
67
|
+
|
|
68
|
+
| Method | Signature | Description |
|
|
69
|
+
|---|---|---|
|
|
70
|
+
| `concat` | `(...args) => ExprUnit<string>` | String concatenation (CONCAT) |
|
|
71
|
+
| `left` | `(source, length) => ExprUnit` | Left N characters |
|
|
72
|
+
| `right` | `(source, length) => ExprUnit` | Right N characters |
|
|
73
|
+
| `trim` | `(source) => ExprUnit` | Trim whitespace |
|
|
74
|
+
| `padStart` | `(source, length, fillString) => ExprUnit` | Left padding (LPAD) |
|
|
75
|
+
| `replace` | `(source, from, to) => ExprUnit` | String replacement |
|
|
76
|
+
| `upper` | `(source) => ExprUnit` | Uppercase |
|
|
77
|
+
| `lower` | `(source) => ExprUnit` | Lowercase |
|
|
78
|
+
| `length` | `(source) => ExprUnit<number>` | Character length |
|
|
79
|
+
| `byteLength` | `(source) => ExprUnit<number>` | Byte length |
|
|
80
|
+
| `substring` | `(source, start, length?) => ExprUnit` | Substring (1-based index) |
|
|
81
|
+
| `indexOf` | `(source, search) => ExprUnit<number>` | Find position (1-based, 0 if not found) |
|
|
82
|
+
|
|
83
|
+
### Number Functions (SELECT)
|
|
84
|
+
|
|
85
|
+
| Method | Signature | Description |
|
|
86
|
+
|---|---|---|
|
|
87
|
+
| `abs` | `(source) => ExprUnit` | Absolute value |
|
|
88
|
+
| `round` | `(source, digits) => ExprUnit` | Round |
|
|
89
|
+
| `ceil` | `(source) => ExprUnit` | Ceiling |
|
|
90
|
+
| `floor` | `(source) => ExprUnit` | Floor |
|
|
91
|
+
|
|
92
|
+
### Date/Time Functions (SELECT)
|
|
93
|
+
|
|
94
|
+
| Method | Signature | Description |
|
|
95
|
+
|---|---|---|
|
|
96
|
+
| `year` | `(source) => ExprUnit<number>` | Extract year |
|
|
97
|
+
| `month` | `(source) => ExprUnit<number>` | Extract month |
|
|
98
|
+
| `day` | `(source) => ExprUnit<number>` | Extract day |
|
|
99
|
+
| `hour` | `(source) => ExprUnit<number>` | Extract hour |
|
|
100
|
+
| `minute` | `(source) => ExprUnit<number>` | Extract minute |
|
|
101
|
+
| `second` | `(source) => ExprUnit<number>` | Extract second |
|
|
102
|
+
| `isoWeek` | `(source) => ExprUnit<number>` | ISO week number |
|
|
103
|
+
| `isoWeekStartDate` | `(source) => ExprUnit<DateOnly>` | ISO week start date (Monday) |
|
|
104
|
+
| `isoYearMonth` | `(source) => ExprUnit<DateOnly>` | ISO year-month (YYYYMM format) |
|
|
105
|
+
| `dateDiff` | `(unit: DateUnit, from, to) => ExprUnit<number>` | Date difference |
|
|
106
|
+
| `dateAdd` | `(unit: DateUnit, source, value) => ExprUnit` | Date arithmetic |
|
|
107
|
+
| `formatDate` | `(source, format: string) => ExprUnit<string>` | Date formatting |
|
|
108
|
+
|
|
109
|
+
### Conditional
|
|
110
|
+
|
|
111
|
+
| Method | Signature | Description |
|
|
112
|
+
|---|---|---|
|
|
113
|
+
| `coalesce` | `(...args) => ExprUnit` | First non-null value (COALESCE) |
|
|
114
|
+
| `nullIf` | `(source, value) => ExprUnit` | NULL if equal (NULLIF) |
|
|
115
|
+
| `is` | `(condition: WhereExprUnit) => ExprUnit<boolean>` | Convert condition to boolean (0/1) |
|
|
116
|
+
| `switch` | `() => SwitchExprBuilder` | CASE WHEN expression (chain `.case().default()`) |
|
|
117
|
+
| `if` | `(condition, then, else?) => ExprUnit` | IIF conditional expression |
|
|
118
|
+
|
|
119
|
+
### Aggregate Functions
|
|
33
120
|
|
|
34
|
-
|
|
121
|
+
| Method | Signature | Description |
|
|
122
|
+
|---|---|---|
|
|
123
|
+
| `count` | `(arg?, distinct?) => ExprUnit<number>` | COUNT |
|
|
124
|
+
| `sum` | `(arg) => ExprUnit<number \| undefined>` | SUM |
|
|
125
|
+
| `avg` | `(arg) => ExprUnit<number \| undefined>` | AVG |
|
|
126
|
+
| `max` | `(arg) => ExprUnit<T \| undefined>` | MAX |
|
|
127
|
+
| `min` | `(arg) => ExprUnit<T \| undefined>` | MIN |
|
|
128
|
+
|
|
129
|
+
### Utility
|
|
130
|
+
|
|
131
|
+
| Method | Signature | Description |
|
|
132
|
+
|---|---|---|
|
|
133
|
+
| `greatest` | `(...args) => ExprUnit` | Greatest of values |
|
|
134
|
+
| `least` | `(...args) => ExprUnit` | Least of values |
|
|
135
|
+
| `rowNum` | `() => ExprUnit<number>` | Simple row number |
|
|
136
|
+
| `random` | `() => ExprUnit<number>` | Random number (RAND/RANDOM) |
|
|
137
|
+
| `cast` | `(source, targetType: DataType) => ExprUnit` | Type cast |
|
|
138
|
+
| `subquery` | `(dataType, queryDef: SelectQueryDef) => ExprUnit` | Scalar subquery |
|
|
139
|
+
| `toExpr` | `(value: ExprInput) => Expr` | Convert ExprInput to raw Expr AST |
|
|
35
140
|
|
|
36
|
-
|
|
37
|
-
type ExprInput<TPrimitive extends ColumnPrimitive> = ExprUnit<TPrimitive> | TPrimitive;
|
|
38
|
-
```
|
|
141
|
+
### Window Functions
|
|
39
142
|
|
|
40
|
-
|
|
143
|
+
All window functions accept a `WinSpecInput: { partitionBy?: ExprInput[]; orderBy?: [ExprInput, ("ASC" | "DESC")?][] }`.
|
|
41
144
|
|
|
42
|
-
|
|
145
|
+
| Method | Signature | Description |
|
|
146
|
+
|---|---|---|
|
|
147
|
+
| `rowNumber` | `(spec) => ExprUnit<number>` | ROW_NUMBER() OVER(...) |
|
|
148
|
+
| `rank` | `(spec) => ExprUnit<number>` | RANK() OVER(...) |
|
|
149
|
+
| `denseRank` | `(spec) => ExprUnit<number>` | DENSE_RANK() OVER(...) |
|
|
150
|
+
| `ntile` | `(n, spec) => ExprUnit<number>` | NTILE(n) OVER(...) |
|
|
151
|
+
| `lag` | `(column, spec, offset?, defaultValue?) => ExprUnit` | Previous row value |
|
|
152
|
+
| `lead` | `(column, spec, offset?, defaultValue?) => ExprUnit` | Next row value |
|
|
153
|
+
| `firstValue` | `(column, spec) => ExprUnit` | First value in partition |
|
|
154
|
+
| `lastValue` | `(column, spec) => ExprUnit` | Last value in partition |
|
|
155
|
+
| `sumOver` | `(column, spec) => ExprUnit<number \| undefined>` | Window SUM |
|
|
156
|
+
| `avgOver` | `(column, spec) => ExprUnit<number \| undefined>` | Window AVG |
|
|
157
|
+
| `countOver` | `(spec, column?) => ExprUnit<number>` | Window COUNT |
|
|
158
|
+
| `minOver` | `(column, spec) => ExprUnit` | Window MIN |
|
|
159
|
+
| `maxOver` | `(column, spec) => ExprUnit` | Window MAX |
|
|
160
|
+
|
|
161
|
+
## SwitchExprBuilder
|
|
162
|
+
|
|
163
|
+
Builder interface for CASE WHEN expressions. Created by `expr.switch()`.
|
|
43
164
|
|
|
44
165
|
```typescript
|
|
45
166
|
interface SwitchExprBuilder<TPrimitive extends ColumnPrimitive> {
|
|
@@ -48,187 +169,49 @@ interface SwitchExprBuilder<TPrimitive extends ColumnPrimitive> {
|
|
|
48
169
|
}
|
|
49
170
|
```
|
|
50
171
|
|
|
51
|
-
|
|
172
|
+
**Example:**
|
|
173
|
+
|
|
174
|
+
```typescript
|
|
175
|
+
db.user().select((u) => ({
|
|
176
|
+
tier: expr.switch<string>()
|
|
177
|
+
.case(expr.gte(u.score, 90), "gold")
|
|
178
|
+
.case(expr.gte(u.score, 70), "silver")
|
|
179
|
+
.default("bronze"),
|
|
180
|
+
}))
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
## ExprUnit
|
|
52
184
|
|
|
53
|
-
|
|
185
|
+
Type-safe expression wrapper that tracks the return type through TypeScript generics.
|
|
54
186
|
|
|
55
187
|
```typescript
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
gte<T extends ColumnPrimitive>(source: ExprUnit<T>, target: ExprInput<T>): WhereExprUnit;
|
|
67
|
-
lte<T extends ColumnPrimitive>(source: ExprUnit<T>, target: ExprInput<T>): WhereExprUnit;
|
|
68
|
-
between<T extends ColumnPrimitive>(source: ExprUnit<T>, from?: ExprInput<T>, to?: ExprInput<T>): WhereExprUnit;
|
|
69
|
-
isNull(arg: ExprUnit<ColumnPrimitive>): WhereExprUnit;
|
|
70
|
-
like(source: ExprUnit<string | undefined>, pattern: ExprInput<string>): WhereExprUnit;
|
|
71
|
-
regexp(source: ExprUnit<string | undefined>, pattern: ExprInput<string>): WhereExprUnit;
|
|
72
|
-
in<T extends ColumnPrimitive>(source: ExprUnit<T>, values: ExprInput<T>[]): WhereExprUnit;
|
|
73
|
-
inQuery<T extends ColumnPrimitive>(source: ExprUnit<T>, query: Queryable<any, any>): WhereExprUnit;
|
|
74
|
-
exists(query: Queryable<any, any>): WhereExprUnit;
|
|
75
|
-
|
|
76
|
-
// Logical
|
|
77
|
-
not(condition: WhereExprUnit): WhereExprUnit;
|
|
78
|
-
and(...conditions: WhereExprUnit[]): WhereExprUnit;
|
|
79
|
-
or(...conditions: WhereExprUnit[]): WhereExprUnit;
|
|
80
|
-
|
|
81
|
-
// String
|
|
82
|
-
concat(...args: ExprInput<string | undefined>[]): ExprUnit<string>;
|
|
83
|
-
left(source: ExprInput<string | undefined>, length: ExprInput<number>): ExprUnit<string>;
|
|
84
|
-
right(source: ExprInput<string | undefined>, length: ExprInput<number>): ExprUnit<string>;
|
|
85
|
-
trim(arg: ExprInput<string | undefined>): ExprUnit<string>;
|
|
86
|
-
padStart(source: ExprInput<string | undefined>, length: ExprInput<number>, fillString: ExprInput<string>): ExprUnit<string>;
|
|
87
|
-
replace(source: ExprInput<string | undefined>, from: ExprInput<string>, to: ExprInput<string>): ExprUnit<string>;
|
|
88
|
-
upper(arg: ExprInput<string | undefined>): ExprUnit<string>;
|
|
89
|
-
lower(arg: ExprInput<string | undefined>): ExprUnit<string>;
|
|
90
|
-
length(arg: ExprInput<string | undefined>): ExprUnit<number>;
|
|
91
|
-
byteLength(arg: ExprInput<string | undefined>): ExprUnit<number>;
|
|
92
|
-
substring(source: ExprInput<string | undefined>, start: ExprInput<number>, length?: ExprInput<number>): ExprUnit<string>;
|
|
93
|
-
indexOf(source: ExprInput<string | undefined>, search: ExprInput<string>): ExprUnit<number>;
|
|
94
|
-
|
|
95
|
-
// Numeric
|
|
96
|
-
abs(arg: ExprInput<number | undefined>): ExprUnit<number>;
|
|
97
|
-
round(arg: ExprInput<number | undefined>, digits: number): ExprUnit<number>;
|
|
98
|
-
ceil(arg: ExprInput<number | undefined>): ExprUnit<number>;
|
|
99
|
-
floor(arg: ExprInput<number | undefined>): ExprUnit<number>;
|
|
100
|
-
|
|
101
|
-
// Date
|
|
102
|
-
year(arg: ExprInput<DateTime | DateOnly | undefined>): ExprUnit<number>;
|
|
103
|
-
month(arg: ExprInput<DateTime | DateOnly | undefined>): ExprUnit<number>;
|
|
104
|
-
day(arg: ExprInput<DateTime | DateOnly | undefined>): ExprUnit<number>;
|
|
105
|
-
hour(arg: ExprInput<DateTime | undefined>): ExprUnit<number>;
|
|
106
|
-
minute(arg: ExprInput<DateTime | undefined>): ExprUnit<number>;
|
|
107
|
-
second(arg: ExprInput<DateTime | undefined>): ExprUnit<number>;
|
|
108
|
-
isoWeek(arg: ExprInput<DateTime | DateOnly | undefined>): ExprUnit<number>;
|
|
109
|
-
isoWeekStartDate(arg: ExprInput<DateTime | DateOnly | undefined>): ExprUnit<DateOnly>;
|
|
110
|
-
isoYearMonth(arg: ExprInput<DateTime | DateOnly | undefined>): ExprUnit<string>;
|
|
111
|
-
dateDiff(unit: DateUnit, from: ExprInput<ColumnPrimitive>, to: ExprInput<ColumnPrimitive>): ExprUnit<number>;
|
|
112
|
-
dateAdd(unit: DateUnit, source: ExprInput<ColumnPrimitive>, value: ExprInput<number>): ExprUnit<DateTime>;
|
|
113
|
-
formatDate(source: ExprInput<ColumnPrimitive>, format: string): ExprUnit<string>;
|
|
114
|
-
|
|
115
|
-
// Conditional
|
|
116
|
-
coalesce<T extends ColumnPrimitive>(...args: ExprInput<T | undefined>[]): ExprUnit<T>;
|
|
117
|
-
nullIf<T extends ColumnPrimitive>(source: ExprInput<T>, value: ExprInput<T>): ExprUnit<T | undefined>;
|
|
118
|
-
is(condition: WhereExprUnit): ExprUnit<number>;
|
|
119
|
-
switch<T extends ColumnPrimitive>(dataType: ColumnPrimitiveStr): SwitchExprBuilder<T>;
|
|
120
|
-
if<T extends ColumnPrimitive>(condition: WhereExprUnit, then: ExprInput<T>, elseVal?: ExprInput<T>): ExprUnit<T>;
|
|
121
|
-
|
|
122
|
-
// Aggregate
|
|
123
|
-
count(arg?: ExprUnit<ColumnPrimitive>, distinct?: boolean): ExprUnit<number>;
|
|
124
|
-
sum(arg: ExprUnit<number | undefined>): ExprUnit<number>;
|
|
125
|
-
avg(arg: ExprUnit<number | undefined>): ExprUnit<number>;
|
|
126
|
-
max<T extends ColumnPrimitive>(arg: ExprUnit<T>): ExprUnit<T>;
|
|
127
|
-
min<T extends ColumnPrimitive>(arg: ExprUnit<T>): ExprUnit<T>;
|
|
128
|
-
|
|
129
|
-
// Other
|
|
130
|
-
greatest<T extends ColumnPrimitive>(...args: ExprInput<T>[]): ExprUnit<T>;
|
|
131
|
-
least<T extends ColumnPrimitive>(...args: ExprInput<T>[]): ExprUnit<T>;
|
|
132
|
-
rowNum(): ExprUnit<number>;
|
|
133
|
-
random(): ExprUnit<number>;
|
|
134
|
-
cast<TDataType extends DataType>(source: ExprInput<ColumnPrimitive>, targetType: TDataType): ExprUnit<InferColumnPrimitiveFromDataType<TDataType>>;
|
|
135
|
-
|
|
136
|
-
// Window
|
|
137
|
-
window(fn: WinFn, spec?: WinSpecInput): ExprUnit<number>;
|
|
138
|
-
|
|
139
|
-
// Subquery
|
|
140
|
-
subquery<T extends ColumnPrimitive>(query: Queryable<any, any>, selectFn: (q: ...) => ExprUnit<T>): ExprUnit<T>;
|
|
141
|
-
};
|
|
188
|
+
class ExprUnit<TPrimitive extends ColumnPrimitive> {
|
|
189
|
+
readonly $infer!: TPrimitive;
|
|
190
|
+
readonly dataType: ColumnPrimitiveStr;
|
|
191
|
+
readonly expr: Expr;
|
|
192
|
+
|
|
193
|
+
/** Non-nullable assertion accessor */
|
|
194
|
+
get n(): ExprUnit<NonNullable<TPrimitive>>;
|
|
195
|
+
|
|
196
|
+
constructor(dataType: ColumnPrimitiveStr, expr: Expr);
|
|
197
|
+
}
|
|
142
198
|
```
|
|
143
199
|
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
| Method | Description |
|
|
147
|
-
|--------|-------------|
|
|
148
|
-
| `val()` | Wrap literal value as ExprUnit |
|
|
149
|
-
| `col()` | Generate column reference |
|
|
150
|
-
| `raw()` | Raw SQL expression (escape hatch, tagged template literal) |
|
|
151
|
-
|
|
152
|
-
### Comparison (WHERE)
|
|
153
|
-
|
|
154
|
-
| Method | SQL | Description |
|
|
155
|
-
|--------|-----|-------------|
|
|
156
|
-
| `eq()` | `=` | Equality comparison (NULL-safe) |
|
|
157
|
-
| `gt()` | `>` | Greater than |
|
|
158
|
-
| `lt()` | `<` | Less than |
|
|
159
|
-
| `gte()` | `>=` | Greater than or equal |
|
|
160
|
-
| `lte()` | `<=` | Less than or equal |
|
|
161
|
-
| `between()` | `BETWEEN` | Range comparison |
|
|
162
|
-
| `isNull()` | `IS NULL` | NULL check |
|
|
163
|
-
| `like()` | `LIKE` | Pattern matching |
|
|
164
|
-
| `regexp()` | `REGEXP` | Regular expression matching |
|
|
165
|
-
| `in()` | `IN` | Value list inclusion |
|
|
166
|
-
| `inQuery()` | `IN (SELECT)` | Subquery inclusion |
|
|
167
|
-
| `exists()` | `EXISTS` | Subquery existence |
|
|
168
|
-
|
|
169
|
-
### Logical
|
|
170
|
-
|
|
171
|
-
| Method | SQL | Description |
|
|
172
|
-
|--------|-----|-------------|
|
|
173
|
-
| `not()` | `NOT` | Logical negation |
|
|
174
|
-
| `and()` | `AND` | Logical conjunction |
|
|
175
|
-
| `or()` | `OR` | Logical disjunction |
|
|
176
|
-
|
|
177
|
-
### String Functions
|
|
178
|
-
|
|
179
|
-
| Method | SQL | Description |
|
|
180
|
-
|--------|-----|-------------|
|
|
181
|
-
| `concat()` | `CONCAT` | String concatenation |
|
|
182
|
-
| `left()` | `LEFT` | Extract left N characters |
|
|
183
|
-
| `right()` | `RIGHT` | Extract right N characters |
|
|
184
|
-
| `trim()` | `TRIM` | Remove leading/trailing whitespace |
|
|
185
|
-
| `padStart()` | `LPAD` | Left padding |
|
|
186
|
-
| `replace()` | `REPLACE` | String replacement |
|
|
187
|
-
| `upper()` | `UPPER` | Uppercase |
|
|
188
|
-
| `lower()` | `LOWER` | Lowercase |
|
|
189
|
-
| `length()` | `CHAR_LENGTH` | Character length |
|
|
190
|
-
| `byteLength()` | `LENGTH/DATALENGTH` | Byte length |
|
|
191
|
-
| `substring()` | `SUBSTRING` | Substring extraction |
|
|
192
|
-
| `indexOf()` | `LOCATE/CHARINDEX` | Find string position |
|
|
193
|
-
|
|
194
|
-
### Numeric Functions
|
|
195
|
-
|
|
196
|
-
| Method | SQL | Description |
|
|
197
|
-
|--------|-----|-------------|
|
|
198
|
-
| `abs()` | `ABS` | Absolute value |
|
|
199
|
-
| `round()` | `ROUND` | Rounding |
|
|
200
|
-
| `ceil()` | `CEIL` | Ceiling |
|
|
201
|
-
| `floor()` | `FLOOR` | Floor |
|
|
202
|
-
|
|
203
|
-
### Date Functions
|
|
204
|
-
|
|
205
|
-
| Method | SQL | Description |
|
|
206
|
-
|--------|-----|-------------|
|
|
207
|
-
| `year()` | `YEAR` | Extract year |
|
|
208
|
-
| `month()` | `MONTH` | Extract month |
|
|
209
|
-
| `day()` | `DAY` | Extract day |
|
|
210
|
-
| `hour()` | `HOUR` | Extract hour |
|
|
211
|
-
| `minute()` | `MINUTE` | Extract minute |
|
|
212
|
-
| `second()` | `SECOND` | Extract second |
|
|
213
|
-
| `isoWeek()` | `WEEK` | ISO week number |
|
|
214
|
-
| `isoWeekStartDate()` | - | ISO week start date |
|
|
215
|
-
| `isoYearMonth()` | - | ISO year-month (YYYYMM) |
|
|
216
|
-
| `dateDiff()` | `DATEDIFF` | Date difference |
|
|
217
|
-
| `dateAdd()` | `DATEADD` | Date arithmetic |
|
|
218
|
-
| `formatDate()` | `FORMAT/DATE_FORMAT` | Date formatting |
|
|
200
|
+
## WhereExprUnit
|
|
219
201
|
|
|
220
|
-
|
|
202
|
+
WHERE clause expression wrapper.
|
|
221
203
|
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
| `min()` | `MIN` | Minimum |
|
|
204
|
+
```typescript
|
|
205
|
+
class WhereExprUnit {
|
|
206
|
+
readonly expr: WhereExpr;
|
|
207
|
+
constructor(expr: WhereExpr);
|
|
208
|
+
}
|
|
209
|
+
```
|
|
229
210
|
|
|
230
|
-
|
|
211
|
+
## ExprInput
|
|
231
212
|
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
213
|
+
Union type accepting either an `ExprUnit` or a literal value.
|
|
214
|
+
|
|
215
|
+
```typescript
|
|
216
|
+
type ExprInput<TPrimitive extends ColumnPrimitive> = ExprUnit<TPrimitive> | TPrimitive;
|
|
217
|
+
```
|
package/docs/query-builder.md
CHANGED
|
@@ -1,36 +1,62 @@
|
|
|
1
1
|
# Query Builder
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Transforms `QueryDef` AST into dialect-specific SQL strings.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
## createQueryBuilder
|
|
6
|
+
|
|
7
|
+
Factory function that creates the appropriate `QueryBuilderBase` for a given dialect.
|
|
6
8
|
|
|
7
9
|
```typescript
|
|
8
10
|
function createQueryBuilder(dialect: Dialect): QueryBuilderBase;
|
|
9
11
|
```
|
|
10
12
|
|
|
13
|
+
**Parameters:**
|
|
14
|
+
|
|
11
15
|
| Parameter | Type | Description |
|
|
12
|
-
|
|
13
|
-
| `dialect` | `
|
|
16
|
+
|---|---|---|
|
|
17
|
+
| `dialect` | `"mysql" \| "mssql" \| "postgresql"` | Target database dialect |
|
|
18
|
+
|
|
19
|
+
**Returns:** `QueryBuilderBase` instance (`MysqlQueryBuilder`, `MssqlQueryBuilder`, or `PostgresqlQueryBuilder`)
|
|
20
|
+
|
|
21
|
+
**Example:**
|
|
22
|
+
|
|
23
|
+
```typescript
|
|
24
|
+
const builder = createQueryBuilder("mysql");
|
|
25
|
+
const result = builder.build(selectQueryDef);
|
|
26
|
+
console.log(result.sql);
|
|
27
|
+
```
|
|
14
28
|
|
|
15
|
-
##
|
|
29
|
+
## QueryBuilderBase
|
|
16
30
|
|
|
17
|
-
Abstract base class
|
|
31
|
+
Abstract base class for QueryDef-to-SQL rendering. Implements dispatch logic shared across all dialects. Dialect-specific differences are delegated to abstract methods.
|
|
18
32
|
|
|
19
33
|
```typescript
|
|
20
34
|
abstract class QueryBuilderBase {
|
|
21
|
-
|
|
35
|
+
abstract readonly exprRenderer: ExprRendererBase;
|
|
22
36
|
|
|
23
37
|
build(def: QueryDef): QueryBuildResult;
|
|
24
38
|
}
|
|
25
39
|
```
|
|
26
40
|
|
|
27
|
-
|
|
28
|
-
|--------|-------------|
|
|
29
|
-
| `build()` | Render a `QueryDef` to SQL. Dispatches to the appropriate method by `def.type`. |
|
|
41
|
+
### build
|
|
30
42
|
|
|
31
|
-
|
|
43
|
+
The main entry point. Accepts any `QueryDef` (SELECT, INSERT, UPDATE, DELETE, UPSERT, DDL, etc.) and returns a `QueryBuildResult` containing the SQL string and optional result set metadata.
|
|
32
44
|
|
|
33
|
-
|
|
45
|
+
```typescript
|
|
46
|
+
build(def: QueryDef): QueryBuildResult;
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
**Returns:** `QueryBuildResult` with:
|
|
50
|
+
|
|
51
|
+
| Field | Type | Description |
|
|
52
|
+
|---|---|---|
|
|
53
|
+
| `sql` | `string` | Generated SQL |
|
|
54
|
+
| `resultSetIndex?` | `number` | Which result set to read (default: 0) |
|
|
55
|
+
| `resultSetStride?` | `number` | For multi-result sets, read every Nth |
|
|
56
|
+
|
|
57
|
+
## ExprRendererBase
|
|
58
|
+
|
|
59
|
+
Abstract base class for rendering `Expr` and `WhereExpr` AST nodes to SQL strings. Each dialect implements its own renderer for DBMS-specific syntax.
|
|
34
60
|
|
|
35
61
|
```typescript
|
|
36
62
|
abstract class ExprRendererBase {
|
|
@@ -39,55 +65,62 @@ abstract class ExprRendererBase {
|
|
|
39
65
|
}
|
|
40
66
|
```
|
|
41
67
|
|
|
42
|
-
|
|
43
|
-
|--------|-------------|
|
|
44
|
-
| `render()` | Render a value expression to SQL |
|
|
45
|
-
| `renderWhere()` | Render a WHERE expression to SQL |
|
|
46
|
-
|
|
47
|
-
## `MysqlQueryBuilder`
|
|
68
|
+
## MysqlQueryBuilder
|
|
48
69
|
|
|
49
70
|
MySQL-specific query builder. Extends `QueryBuilderBase`.
|
|
50
71
|
|
|
51
72
|
```typescript
|
|
52
|
-
class MysqlQueryBuilder extends QueryBuilderBase {
|
|
73
|
+
class MysqlQueryBuilder extends QueryBuilderBase {
|
|
74
|
+
readonly exprRenderer: MysqlExprRenderer;
|
|
75
|
+
}
|
|
53
76
|
```
|
|
54
77
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
78
|
+
MySQL-specific behaviors:
|
|
79
|
+
- Uses `<=>` for NULL-safe equality
|
|
80
|
+
- Uses backtick quoting for identifiers
|
|
81
|
+
- INSERT OUTPUT via separate SELECT with `LAST_INSERT_ID()`
|
|
82
|
+
- UPSERT via `INSERT ... ON DUPLICATE KEY UPDATE`
|
|
58
83
|
|
|
59
|
-
|
|
60
|
-
class MysqlExprRenderer extends ExprRendererBase { ... }
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
## `MssqlQueryBuilder`
|
|
84
|
+
## MssqlQueryBuilder
|
|
64
85
|
|
|
65
86
|
MSSQL-specific query builder. Extends `QueryBuilderBase`.
|
|
66
87
|
|
|
67
88
|
```typescript
|
|
68
|
-
class MssqlQueryBuilder extends QueryBuilderBase {
|
|
89
|
+
class MssqlQueryBuilder extends QueryBuilderBase {
|
|
90
|
+
readonly exprRenderer: MssqlExprRenderer;
|
|
91
|
+
}
|
|
69
92
|
```
|
|
70
93
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
94
|
+
MSSQL-specific behaviors:
|
|
95
|
+
- Uses `[` `]` for identifier quoting
|
|
96
|
+
- TOP instead of LIMIT
|
|
97
|
+
- OUTPUT clause for INSERT/UPDATE/DELETE
|
|
98
|
+
- `IDENTITY_INSERT` for auto-increment override
|
|
99
|
+
- `OFFSET...FETCH` for pagination
|
|
74
100
|
|
|
75
|
-
|
|
76
|
-
class MssqlExprRenderer extends ExprRendererBase { ... }
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
## `PostgresqlQueryBuilder`
|
|
101
|
+
## PostgresqlQueryBuilder
|
|
80
102
|
|
|
81
103
|
PostgreSQL-specific query builder. Extends `QueryBuilderBase`.
|
|
82
104
|
|
|
83
105
|
```typescript
|
|
84
|
-
class PostgresqlQueryBuilder extends QueryBuilderBase {
|
|
106
|
+
class PostgresqlQueryBuilder extends QueryBuilderBase {
|
|
107
|
+
readonly exprRenderer: PostgresqlExprRenderer;
|
|
108
|
+
}
|
|
85
109
|
```
|
|
86
110
|
|
|
87
|
-
|
|
111
|
+
PostgreSQL-specific behaviors:
|
|
112
|
+
- Uses `"` for identifier quoting
|
|
113
|
+
- `RETURNING` clause for INSERT/UPDATE/DELETE output
|
|
114
|
+
- `LIMIT...OFFSET` for pagination
|
|
115
|
+
- `LATERAL` subquery JOINs
|
|
116
|
+
- `IS NOT DISTINCT FROM` for NULL-safe equality
|
|
88
117
|
|
|
89
|
-
|
|
118
|
+
## Dialect-Specific Expression Renderers
|
|
90
119
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
120
|
+
| Class | Dialect | Description |
|
|
121
|
+
|---|---|---|
|
|
122
|
+
| `MysqlExprRenderer` | MySQL | Renders Expr AST to MySQL SQL syntax |
|
|
123
|
+
| `MssqlExprRenderer` | MSSQL | Renders Expr AST to MSSQL SQL syntax |
|
|
124
|
+
| `PostgresqlExprRenderer` | PostgreSQL | Renders Expr AST to PostgreSQL SQL syntax |
|
|
125
|
+
|
|
126
|
+
Each renderer extends `ExprRendererBase` and overrides methods for dialect-specific expression rendering (e.g., date functions, string functions, type casting).
|