@spinajs/orm-sql 2.0.481 → 2.0.482
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 +61 -3
- package/lib/cjs/compilers.d.ts +67 -3
- package/lib/cjs/compilers.d.ts.map +1 -1
- package/lib/cjs/compilers.js +225 -105
- package/lib/cjs/compilers.js.map +1 -1
- package/lib/cjs/converters.d.ts.map +1 -1
- package/lib/cjs/converters.js +1 -4
- package/lib/cjs/converters.js.map +1 -1
- package/lib/cjs/index.d.ts.map +1 -1
- package/lib/cjs/index.js +10 -2
- package/lib/cjs/index.js.map +1 -1
- package/lib/cjs/statements.d.ts.map +1 -1
- package/lib/cjs/statements.js +84 -24
- package/lib/cjs/statements.js.map +1 -1
- package/lib/mjs/compilers.d.ts +67 -3
- package/lib/mjs/compilers.d.ts.map +1 -1
- package/lib/mjs/compilers.js +224 -106
- package/lib/mjs/compilers.js.map +1 -1
- package/lib/mjs/converters.d.ts.map +1 -1
- package/lib/mjs/converters.js +1 -4
- package/lib/mjs/converters.js.map +1 -1
- package/lib/mjs/index.d.ts.map +1 -1
- package/lib/mjs/index.js +10 -2
- package/lib/mjs/index.js.map +1 -1
- package/lib/mjs/statements.d.ts.map +1 -1
- package/lib/mjs/statements.js +85 -25
- package/lib/mjs/statements.js.map +1 -1
- package/lib/tsconfig.cjs.tsbuildinfo +1 -1
- package/lib/tsconfig.mjs.tsbuildinfo +1 -1
- package/package.json +13 -14
package/lib/mjs/compilers.d.ts
CHANGED
|
@@ -1,5 +1,27 @@
|
|
|
1
|
-
import { LimitBuilder, DropTableQueryBuilder, AlterColumnQueryBuilder, TableCloneQueryCompiler, OnDuplicateQueryBuilder, IJoinCompiler, DeleteQueryBuilder, IColumnsBuilder, IColumnsCompiler, ICompilerOutput, LimitQueryCompiler, IGroupByCompiler, InsertQueryBuilder, IWhereBuilder, IWhereCompiler, OrderByBuilder, QueryBuilder, SelectQueryBuilder, UpdateQueryBuilder, SelectQueryCompiler, TableQueryCompiler, TableQueryBuilder, ColumnQueryBuilder, ColumnQueryCompiler, IQueryBuilder, OrderByQueryCompiler, OnDuplicateQueryCompiler, IJoinBuilder, IndexQueryCompiler, IndexQueryBuilder, IRecursiveCompiler, IWithRecursiveBuilder, ForeignKeyBuilder, ForeignKeyQueryCompiler, IGroupByBuilder, AlterTableQueryBuilder, CloneTableQueryBuilder, AlterTableQueryCompiler, TableAliasCompiler, DropTableCompiler, DropEventQueryBuilder, TableHistoryQueryCompiler, EventQueryBuilder, EventIntervalDesc, IHavingCompiler, RawSchemaQueryCompiler, RawSchemaQueryBuilder, DropViewQueryBuilder, DropViewCompiler } from '@spinajs/orm';
|
|
1
|
+
import { LimitBuilder, DropTableQueryBuilder, AlterColumnQueryBuilder, TableCloneQueryCompiler, OnDuplicateQueryBuilder, IJoinCompiler, DeleteQueryBuilder, IColumnsBuilder, IColumnsCompiler, ICompilerOutput, LimitQueryCompiler, IGroupByCompiler, InsertQueryBuilder, IWhereBuilder, IWhereCompiler, OrderByBuilder, QueryBuilder, SelectQueryBuilder, UpdateQueryBuilder, SelectQueryCompiler, TableQueryCompiler, TableQueryBuilder, ColumnQueryBuilder, ColumnQueryCompiler, IQueryBuilder, OrderByQueryCompiler, OnDuplicateQueryCompiler, IJoinBuilder, IndexQueryCompiler, IndexQueryBuilder, IRecursiveCompiler, IWithRecursiveBuilder, ForeignKeyBuilder, ForeignKeyQueryCompiler, IGroupByBuilder, AlterTableQueryBuilder, CloneTableQueryBuilder, AlterTableQueryCompiler, AlterColumnQueryCompiler, TableAliasCompiler, DropTableCompiler, DropEventQueryBuilder, TableHistoryQueryCompiler, EventQueryBuilder, EventIntervalDesc, IHavingCompiler, RawSchemaQueryCompiler, RawSchemaQueryBuilder, DropViewQueryBuilder, DropViewCompiler } from '@spinajs/orm';
|
|
2
2
|
import { Container, IContainer } from '@spinajs/di';
|
|
3
|
+
/**
|
|
4
|
+
* Central identifier escaping for the MySQL-flavoured dialect.
|
|
5
|
+
*
|
|
6
|
+
* Wraps a table/column/alias/schema name in backticks and escapes any embedded
|
|
7
|
+
* backtick by doubling it (the MySQL rule). For a normal identifier (no special
|
|
8
|
+
* characters) the output is byte-identical to the previous raw interpolation
|
|
9
|
+
* (`` `${name}` ``), so existing generated SQL is unchanged; only names that
|
|
10
|
+
* actually contain a backtick produce different — and now safe — output.
|
|
11
|
+
*
|
|
12
|
+
* Dialects that quote differently (e.g. `[name]` with `]`-doubling) override
|
|
13
|
+
* this by shadowing the relevant compiler/statement, the same way
|
|
14
|
+
* {@link SqlTableAliasCompiler} is already overridden per driver.
|
|
15
|
+
*/
|
|
16
|
+
export declare function escapeIdentifier(name: string): string;
|
|
17
|
+
/**
|
|
18
|
+
* Escapes a DDL string *literal* (SET/ENUM member, COMMENT, CHARACTER SET,
|
|
19
|
+
* COLLATE, string DEFAULT). These are single-quoted string literals, NOT
|
|
20
|
+
* identifiers, so the correct escaping is doubling embedded single quotes.
|
|
21
|
+
* Returns the value WITHOUT the surrounding quotes so callers keep their exact
|
|
22
|
+
* quoting; for a value with no quote the output is byte-identical.
|
|
23
|
+
*/
|
|
24
|
+
export declare function escapeStringLiteral(value: string): string;
|
|
3
25
|
export declare class SqlTableAliasCompiler implements TableAliasCompiler {
|
|
4
26
|
compile(builder: IQueryBuilder, tbl?: string): string;
|
|
5
27
|
}
|
|
@@ -112,6 +134,18 @@ export declare class SqlInsertQueryCompiler extends SqlQueryCompiler<InsertQuery
|
|
|
112
134
|
expression: string;
|
|
113
135
|
};
|
|
114
136
|
protected upsort(): ICompilerOutput;
|
|
137
|
+
/**
|
|
138
|
+
* Indices of the columns that take part in this INSERT.
|
|
139
|
+
*
|
|
140
|
+
* An auto increment primary key is omitted only when NO row supplies a value
|
|
141
|
+
* for it. If at least one row supplies one the column stays, and the rows
|
|
142
|
+
* that don't emit NULL so the engine assigns the value.
|
|
143
|
+
*
|
|
144
|
+
* Both {@link columns} and {@link values} MUST derive their shape from this
|
|
145
|
+
* single decision - deciding per-row in one place and per-batch in the other
|
|
146
|
+
* produced value tuples whose arity did not match the column list.
|
|
147
|
+
*/
|
|
148
|
+
protected keptColumnIndices(): number[];
|
|
115
149
|
protected values(): {
|
|
116
150
|
bindings: any[];
|
|
117
151
|
data: string;
|
|
@@ -217,8 +251,38 @@ export declare class SqlColumnQueryCompiler implements ColumnQueryCompiler {
|
|
|
217
251
|
compile(): ICompilerOutput;
|
|
218
252
|
protected _defaultCompiler(): string;
|
|
219
253
|
}
|
|
220
|
-
export
|
|
221
|
-
|
|
254
|
+
export interface SqlAlterColumnQueryCompiler {
|
|
255
|
+
}
|
|
256
|
+
export declare class SqlAlterColumnQueryCompiler extends AlterColumnQueryCompiler {
|
|
257
|
+
protected container: Container;
|
|
258
|
+
protected builder: AlterColumnQueryBuilder;
|
|
259
|
+
constructor(container: Container, builder: AlterColumnQueryBuilder);
|
|
260
|
+
/**
|
|
261
|
+
* Renders the column body using the DRIVER's own column compiler, resolved
|
|
262
|
+
* from the container (late binding) - exactly like the CREATE TABLE path does.
|
|
263
|
+
* Previously this was `super.compile()`, which statically bound every driver
|
|
264
|
+
* to orm-sql's MySQL dialect.
|
|
265
|
+
*/
|
|
266
|
+
protected _columnDefinition(): ICompilerOutput;
|
|
267
|
+
/**
|
|
268
|
+
* Whether the expression produced by `compile()` is already a complete, standalone
|
|
269
|
+
* statement. When true, SqlAlterTableQueryCompiler emits it verbatim instead of
|
|
270
|
+
* prefixing it with `ALTER TABLE <table> `.
|
|
271
|
+
*
|
|
272
|
+
* Needed by dialects whose alteration is not expressible as a suffix of ALTER TABLE,
|
|
273
|
+
* eg. MSSQL's `EXEC sp_rename '[t].[old]', 'new', 'COLUMN'`.
|
|
274
|
+
*
|
|
275
|
+
* It is read AFTER `compile()`, so a subclass may decide per `builder.AlterType`.
|
|
276
|
+
* Defaults to false - MySQL (this class) always emits a suffix.
|
|
277
|
+
*/
|
|
278
|
+
get IsStandaloneStatement(): boolean;
|
|
279
|
+
/**
|
|
280
|
+
* Dialect hooks. Returning `null` means "emit no statement at all" - the
|
|
281
|
+
* parent AlterTableQueryCompiler filters such columns out.
|
|
282
|
+
*/
|
|
283
|
+
protected _add(definition: string): string | null;
|
|
284
|
+
protected _modify(definition: string): string | null;
|
|
285
|
+
protected _rename(): string | null;
|
|
222
286
|
compile(): ICompilerOutput;
|
|
223
287
|
}
|
|
224
288
|
export declare class SqlEventQueryCompiler extends SqlQueryCompiler<EventQueryBuilder> {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compilers.d.ts","sourceRoot":"","sources":["../../src/compilers.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,uBAAuB,EAAmB,uBAAuB,EAAE,aAAa,EAAE,kBAAkB,EAAE,eAAe,EAAE,gBAAgB,EAAE,eAAe,EAAiB,kBAAkB,EAAE,gBAAgB,EAAE,kBAAkB,EAAmB,aAAa,EAAE,cAAc,EAAE,cAAc,EAAE,YAAY,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,mBAAmB,EAAY,aAAa,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,eAAe,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,uBAAuB,
|
|
1
|
+
{"version":3,"file":"compilers.d.ts","sourceRoot":"","sources":["../../src/compilers.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,uBAAuB,EAAmB,uBAAuB,EAAE,aAAa,EAAE,kBAAkB,EAAE,eAAe,EAAE,gBAAgB,EAAE,eAAe,EAAiB,kBAAkB,EAAE,gBAAgB,EAAE,kBAAkB,EAAmB,aAAa,EAAE,cAAc,EAAE,cAAc,EAAE,YAAY,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,mBAAmB,EAAY,aAAa,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,eAAe,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,uBAAuB,EAAwB,wBAAwB,EAAE,kBAAkB,EAAE,iBAAiB,EAAkB,qBAAqB,EAAE,yBAAyB,EAAE,iBAAiB,EAAE,iBAAiB,EAAkB,eAAe,EAA4E,sBAAsB,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAE1sC,OAAO,EAAuB,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzE;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAErD;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,qBACa,qBAAsB,YAAW,kBAAkB;IACvD,OAAO,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,CAAC,EAAE,MAAM;CAepD;AAED,8BACsB,gBAAgB,CAAC,CAAC,SAAS,YAAY,CAAE,SAAQ,mBAAmB;IAC5E,SAAS,CAAC,QAAQ,EAAE,CAAC;IAAE,SAAS,CAAC,UAAU,EAAE,UAAU;gBAA7C,QAAQ,EAAE,CAAC,EAAY,UAAU,EAAE,UAAU;IAQnE,SAAS,CAAC,eAAe,CAAC,CAAC,EAAE,GAAG;aAWhB,OAAO,IAAI,eAAe;CAC3C;AAED,qBACa,uBAAwB,SAAQ,oBAAoB;IAC/D,SAAS,CAAC,QAAQ,EAAE,cAAc,CAAC;gBAEvB,OAAO,EAAE,cAAc;IAU5B,OAAO,IAAI,eAAe;CAclC;AACD,qBACa,wBAAyB,YAAW,kBAAkB;IAC1D,SAAS,CAAC,OAAO,EAAE,qBAAqB,GAAG,eAAe;CAkBlE;AAED,qBACa,0BAA2B,YAAW,uBAAuB;IAC5D,SAAS,CAAC,QAAQ,EAAE,iBAAiB;gBAA3B,QAAQ,EAAE,iBAAiB;IAM1C,OAAO,IAAI,eAAe;CAQlC;AAED,qBACa,qBAAsB,SAAQ,kBAAkB;IAC3D,SAAS,CAAC,QAAQ,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;gBAE9B,OAAO,EAAE,YAAY,CAAC,OAAO,CAAC;IAUnC,OAAO,IAAI,eAAe;CAwBlC;AAED,qBACa,kBAAmB,YAAW,gBAAgB;IAClD,KAAK,CAAC,OAAO,EAAE,eAAe,GAAG,eAAe;CAYxD;AAED,qBACa,kBAAmB,YAAW,gBAAgB;IAClD,OAAO,CAAC,OAAO,EAAE,eAAe;kBAEnB,GAAG,EAAE;;;CAS1B;AAED,qBACa,gBAAiB,YAAW,cAAc;IAC9C,KAAK,CAAC,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC;;;;CAwB7C;AAuCD,qBACa,iBAAkB,YAAW,eAAe;IAChD,MAAM,CAAC,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC;;;;CAU9C;AAED,qBACa,eAAgB,YAAW,aAAa;IAC5C,IAAI,CAAC,OAAO,EAAE,YAAY;;;;CAQlC;AAGD,MAAM,WAAW,sBAAuB,SAAQ,cAAc,EAAE,eAAe,EAAE,gBAAgB,EAAE,aAAa,EAAE,gBAAgB,EAAE,kBAAkB;CAAI;AAE1J,qBAEa,sBAAuB,SAAQ,gBAAgB,CAAC,kBAAkB,CAAC;IACmE,IAAI,EAAE,IAAI,CAAC;gBAEhJ,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,kBAAkB;IAIxD,OAAO,IAAI,eAAe;IAmCjC,SAAS,CAAC,KAAK;IAKf,SAAS,CAAC,IAAI;IAKd,SAAS,CAAC,MAAM;IAchB,SAAS,CAAC,IAAI;CAGf;AAGD,MAAM,WAAW,sBAAuB,SAAQ,cAAc;CAAI;AAElE,qBAEa,sBAAuB,SAAQ,gBAAgB,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAG3E,SAAS,CAAC,UAAU,EAAE,UAAU;IAFD,IAAI,EAAE,IAAI,CAAC;gBAEhC,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,kBAAkB,CAAC,OAAO,CAAC;IAI3E,OAAO,IAAI,eAAe;IAejC,SAAS,CAAC,GAAG;;;;IAkBb,SAAS,CAAC,KAAK;CAGhB;AAGD,MAAM,WAAW,sBAAuB,SAAQ,cAAc;CAAI;AAElE,qBAEa,sBAAuB,SAAQ,gBAAgB,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC5C,IAAI,EAAE,IAAI,CAAC;gBAE1C,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,kBAAkB,CAAC,OAAO,CAAC;IAIjE,OAAO;;;;IAmBd,SAAS,CAAC,KAAK;IAKf,SAAS,CAAC,IAAI;CAGf;AAED,qBACa,2BAA4B,YAAW,wBAAwB;IAC1E,SAAS,CAAC,QAAQ,EAAE,uBAAuB,CAAC;gBAEhC,OAAO,EAAE,uBAAuB;IAIrC,OAAO;;;;CA4Bf;AAED,qBACa,qBAAsB,SAAQ,kBAAkB;IAC3D,SAAS,CAAC,QAAQ,EAAE,iBAAiB,CAAC;gBAE1B,OAAO,EAAE,iBAAiB;IAM/B,OAAO,IAAI,eAAe;CAMlC;AAED,qBAEa,sBAAuB,SAAQ,gBAAgB,CAAC,kBAAkB,CAAC;IACrD,IAAI,EAAE,IAAI,CAAC;gBAExB,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,kBAAkB;IAIxD,OAAO;;;;IAYd,SAAS,CAAC,MAAM;IAWhB;;;;;;;;;;OAUG;IACH,SAAS,CAAC,iBAAiB,IAAI,MAAM,EAAE;IAcvC,SAAS,CAAC,MAAM;;;;IAiDhB,SAAS,CAAC,OAAO;IAmBjB,SAAS,CAAC,IAAI;CAGf;AAED,qBAEa,yBAA0B,SAAQ,iBAAiB;IAClD,SAAS,CAAC,SAAS,EAAE,SAAS;IAAE,SAAS,CAAC,OAAO,EAAE,qBAAqB;gBAA9D,SAAS,EAAE,SAAS,EAAY,OAAO,EAAE,qBAAqB;IAI7E,OAAO,IAAI,eAAe;CASlC;AAED,qBAEa,wBAAyB,SAAQ,gBAAgB;IAChD,SAAS,CAAC,SAAS,EAAE,SAAS;IAAE,SAAS,CAAC,OAAO,EAAE,oBAAoB;gBAA7D,SAAS,EAAE,SAAS,EAAY,OAAO,EAAE,oBAAoB;IAI5E,OAAO,IAAI,eAAe;CASlC;AAGD,MAAM,WAAW,0BAA0B;CAAI;AAE/C,qBAEa,0BAA2B,SAAQ,uBAAuB;IACzD,SAAS,CAAC,SAAS,EAAE,SAAS;IAAE,SAAS,CAAC,OAAO,EAAE,sBAAsB;gBAA/D,SAAS,EAAE,SAAS,EAAY,OAAO,EAAE,sBAAsB;IAI9E,OAAO,IAAI,eAAe,EAAE;IAkDnC,SAAS,CAAC,MAAM;CAGjB;AAED,MAAM,WAAW,0BAA0B;CAAI;AAE/C,qBAEa,0BAA2B,SAAQ,uBAAuB;IAGzD,SAAS,CAAC,SAAS,EAAE,SAAS;IAAE,SAAS,CAAC,OAAO,EAAE,sBAAsB;IAF5D,IAAI,EAAE,IAAI,CAAC;gBAEd,SAAS,EAAE,SAAS,EAAY,OAAO,EAAE,sBAAsB;IAI9E,OAAO,IAAI,eAAe,EAAE;IAkCnC,SAAS,CAAC,MAAM;CAGjB;AAED,MAAM,WAAW,6BAA6B;CAAI;AAElD,qBACa,6BAA8B,SAAQ,kBAAkB;IACvD,SAAS,CAAC,SAAS,EAAE,SAAS;IAAE,SAAS,CAAC,OAAO,EAAE,iBAAiB;gBAA1D,SAAS,EAAE,SAAS,EAAY,OAAO,EAAE,iBAAiB;IAIzE,OAAO,IAAI,eAAe;CAMlC;AAED,qBAEa,4BAA6B,SAAQ,yBAAyB;IAC7D,SAAS,CAAC,SAAS,EAAE,SAAS;IAAE,SAAS,CAAC,OAAO,EAAE,iBAAiB;gBAA1D,SAAS,EAAE,SAAS,EAAY,OAAO,EAAE,iBAAiB;IAIzE,OAAO,IAAI,eAAe,EAAE;CAmGpC;AAED,MAAM,WAAW,qBAAqB;CAAI;AAE1C,qBAEa,qBAAsB,SAAQ,kBAAkB;IAC/C,SAAS,CAAC,SAAS,EAAE,SAAS;IAAE,SAAS,CAAC,OAAO,EAAE,iBAAiB;gBAA1D,SAAS,EAAE,SAAS,EAAY,OAAO,EAAE,iBAAiB;IAIzE,OAAO,IAAI,eAAe,EAAE;IAmBnC,SAAS,CAAC,QAAQ;IAMlB,SAAS,CAAC,YAAY;IAMtB,SAAS,CAAC,YAAY;IAYtB,SAAS,CAAC,MAAM;CAGjB;AAED,qBACa,sBAAuB,YAAW,mBAAmB;IA2CpD,SAAS,CAAC,OAAO,EAAE,kBAAkB;IA1CjD,SAAS,CAAC,mBAAmB;uBACZ,kBAAkB;0BACf,kBAAkB;;yBAEnB,kBAAkB;0BAKjB,kBAAkB;2BACjB,kBAAkB;wBACrB,kBAAkB;0BAChB,kBAAkB;4BAChB,kBAAkB;2BACnB,kBAAkB;6BAChB,kBAAkB;uBACxB,kBAAkB;0BACf,kBAAkB;4BAChB,kBAAkB;8BAChB,kBAAkB;4BACpB,kBAAkB;wBACtB,kBAAkB;uBACnB,kBAAkB;wBACjB,kBAAkB;wBAClB,kBAAkB;4BACd,kBAAkB;6BACjB,kBAAkB;wBACvB,kBAAkB;4BACd,kBAAkB;8BAChB,kBAAkB;4BACpB,kBAAkB;;2BAInB,kBAAkB;6BAChB,kBAAkB;;;;2BAIpB,kBAAkB;MACrC;gBAEoB,OAAO,EAAE,kBAAkB;IAM1C,OAAO,IAAI,eAAe;IAqCjC,SAAS,CAAC,gBAAgB;CAiB3B;AAED,MAAM,WAAW,2BAA2B;CAAI;AAEhD,qBAEa,2BAA4B,SAAQ,wBAAwB;IAC3D,SAAS,CAAC,SAAS,EAAE,SAAS;IAAE,SAAS,CAAC,OAAO,EAAE,uBAAuB;gBAAhE,SAAS,EAAE,SAAS,EAAY,OAAO,EAAE,uBAAuB;IAQtF;;;;;OAKG;IACH,SAAS,CAAC,iBAAiB,IAAI,eAAe;IAI9C;;;;;;;;;;OAUG;IACH,IAAW,qBAAqB,IAAI,OAAO,CAE1C;IAED;;;OAGG;IACH,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAMjD,SAAS,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAIpD,SAAS,CAAC,OAAO,IAAI,MAAM,GAAG,IAAI;IAI3B,OAAO,IAAI,eAAe;CA6BlC;AAED,qBAEa,qBAAsB,SAAQ,gBAAgB,CAAC,iBAAiB,CAAC;gBAChE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,iBAAiB;IAItD,OAAO,IAAI,eAAe;IAUjC,eAAe;IAcf,YAAY,CAAC,IAAI,EAAE,iBAAiB;IAYpC,OAAO,IAAI;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,GAAG,EAAE,CAAA;KAAE;CAoCnD;AAED,qBAEa,yBAA0B,SAAQ,gBAAgB,CAAC,qBAAqB,CAAC;gBACxE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,qBAAqB;IAI1D,OAAO,IAAI,eAAe;CAMlC;AAED;;;GAGG;AACH,qBAEa,yBAA0B,SAAQ,sBAAsB;IACvD,SAAS,CAAC,SAAS,EAAE,UAAU;IAAE,SAAS,CAAC,OAAO,EAAE,qBAAqB;gBAA/D,SAAS,EAAE,UAAU,EAAY,OAAO,EAAE,qBAAqB;IAI9E,OAAO,IAAI,eAAe;CAMlC"}
|
package/lib/mjs/compilers.js
CHANGED
|
@@ -12,19 +12,45 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
12
12
|
/* eslint-disable @typescript-eslint/no-empty-interface */
|
|
13
13
|
/* eslint-disable prettier/prettier */
|
|
14
14
|
import { InvalidOperation, InvalidArgument } from '@spinajs/exceptions';
|
|
15
|
-
import { LimitBuilder, DropTableQueryBuilder, AlterColumnQueryBuilder, TableCloneQueryCompiler, OnDuplicateQueryBuilder, DeleteQueryBuilder, LimitQueryCompiler, InsertQueryBuilder, OrderByBuilder, SelectQueryBuilder, UpdateQueryBuilder, SelectQueryCompiler, TableQueryCompiler, TableQueryBuilder, ColumnQueryBuilder, ColumnQueryCompiler, RawQuery, OrderByQueryCompiler, OnDuplicateQueryCompiler, IndexQueryCompiler, IndexQueryBuilder, ForeignKeyBuilder, ForeignKeyQueryCompiler, AlterTableQueryBuilder, CloneTableQueryBuilder, AlterTableQueryCompiler, ColumnAlterationType, AlterColumnQueryCompiler, TableAliasCompiler, DropTableCompiler, DropEventQueryBuilder, TableHistoryQueryCompiler, EventQueryBuilder, LazyQueryStatement, RawSchemaQueryCompiler, RawSchemaQueryBuilder, DropViewQueryBuilder, DropViewCompiler } from '@spinajs/orm';
|
|
15
|
+
import { LimitBuilder, DropTableQueryBuilder, AlterColumnQueryBuilder, TableCloneQueryCompiler, OnDuplicateQueryBuilder, DeleteQueryBuilder, LimitQueryCompiler, InsertQueryBuilder, OrderByBuilder, SelectQueryBuilder, UpdateQueryBuilder, SelectQueryCompiler, TableQueryCompiler, TableQueryBuilder, ColumnQueryBuilder, ColumnQueryCompiler, RawQuery, OrderByQueryCompiler, OnDuplicateQueryCompiler, IndexQueryCompiler, IndexQueryBuilder, ForeignKeyBuilder, ForeignKeyQueryCompiler, AlterTableQueryBuilder, CloneTableQueryBuilder, AlterTableQueryCompiler, ColumnAlterationType, AlterColumnQueryCompiler, TableAliasCompiler, DropTableCompiler, DropEventQueryBuilder, TableHistoryQueryCompiler, EventQueryBuilder, LazyQueryStatement, WhereBoolean, RawSchemaQueryCompiler, RawSchemaQueryBuilder, DropViewQueryBuilder, DropViewCompiler } from '@spinajs/orm';
|
|
16
16
|
import { use } from 'typescript-mix';
|
|
17
17
|
import { NewInstance, Inject, Container } from '@spinajs/di';
|
|
18
18
|
import _ from 'lodash';
|
|
19
|
+
/**
|
|
20
|
+
* Central identifier escaping for the MySQL-flavoured dialect.
|
|
21
|
+
*
|
|
22
|
+
* Wraps a table/column/alias/schema name in backticks and escapes any embedded
|
|
23
|
+
* backtick by doubling it (the MySQL rule). For a normal identifier (no special
|
|
24
|
+
* characters) the output is byte-identical to the previous raw interpolation
|
|
25
|
+
* (`` `${name}` ``), so existing generated SQL is unchanged; only names that
|
|
26
|
+
* actually contain a backtick produce different — and now safe — output.
|
|
27
|
+
*
|
|
28
|
+
* Dialects that quote differently (e.g. `[name]` with `]`-doubling) override
|
|
29
|
+
* this by shadowing the relevant compiler/statement, the same way
|
|
30
|
+
* {@link SqlTableAliasCompiler} is already overridden per driver.
|
|
31
|
+
*/
|
|
32
|
+
export function escapeIdentifier(name) {
|
|
33
|
+
return '`' + String(name).replace(/`/g, '``') + '`';
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Escapes a DDL string *literal* (SET/ENUM member, COMMENT, CHARACTER SET,
|
|
37
|
+
* COLLATE, string DEFAULT). These are single-quoted string literals, NOT
|
|
38
|
+
* identifiers, so the correct escaping is doubling embedded single quotes.
|
|
39
|
+
* Returns the value WITHOUT the surrounding quotes so callers keep their exact
|
|
40
|
+
* quoting; for a value with no quote the output is byte-identical.
|
|
41
|
+
*/
|
|
42
|
+
export function escapeStringLiteral(value) {
|
|
43
|
+
return String(value).replace(/'/g, "''");
|
|
44
|
+
}
|
|
19
45
|
let SqlTableAliasCompiler = class SqlTableAliasCompiler {
|
|
20
46
|
compile(builder, tbl) {
|
|
21
47
|
let table = '';
|
|
22
48
|
if (builder.Database) {
|
|
23
|
-
table +=
|
|
49
|
+
table += `${escapeIdentifier(builder.Database)}.`;
|
|
24
50
|
}
|
|
25
|
-
table +=
|
|
51
|
+
table += escapeIdentifier(tbl ? tbl : builder.Table);
|
|
26
52
|
if (builder.TableAlias) {
|
|
27
|
-
table += ` as
|
|
53
|
+
table += ` as ${escapeIdentifier(builder.TableAlias)}`;
|
|
28
54
|
}
|
|
29
55
|
return table;
|
|
30
56
|
}
|
|
@@ -38,7 +64,7 @@ let SqlQueryCompiler = class SqlQueryCompiler extends SelectQueryCompiler {
|
|
|
38
64
|
super();
|
|
39
65
|
this._builder = _builder;
|
|
40
66
|
this._container = _container;
|
|
41
|
-
if (_builder === null
|
|
67
|
+
if (_builder === null || _builder === undefined) {
|
|
42
68
|
throw new InvalidArgument('builder cannot be null or undefined');
|
|
43
69
|
}
|
|
44
70
|
}
|
|
@@ -66,11 +92,11 @@ let SqlOrderByQueryCompiler = class SqlOrderByQueryCompiler extends OrderByQuery
|
|
|
66
92
|
this._builder = builder;
|
|
67
93
|
}
|
|
68
94
|
compile() {
|
|
69
|
-
const
|
|
95
|
+
const sorts = this._builder.getSorts();
|
|
70
96
|
let stmt = '';
|
|
71
97
|
const bindings = [];
|
|
72
|
-
if (
|
|
73
|
-
stmt = ` ORDER BY
|
|
98
|
+
if (sorts.length > 0) {
|
|
99
|
+
stmt = ` ORDER BY ${sorts.map((s) => `${escapeIdentifier(s.column)} ${s.order}`).join(', ')}`;
|
|
74
100
|
}
|
|
75
101
|
return {
|
|
76
102
|
bindings,
|
|
@@ -111,7 +137,7 @@ let SqlForeignKeyQueryCompiler = class SqlForeignKeyQueryCompiler {
|
|
|
111
137
|
}
|
|
112
138
|
}
|
|
113
139
|
compile() {
|
|
114
|
-
const exprr = `FOREIGN KEY (${this._builder.ForeignKeyField}) REFERENCES ${this._builder.Table}(${this._builder.PrimaryKey}) ON DELETE ${this._builder.OnDeleteAction} ON UPDATE ${this._builder.OnUpdateAction}`;
|
|
140
|
+
const exprr = `FOREIGN KEY (${escapeIdentifier(this._builder.ForeignKeyField)}) REFERENCES ${escapeIdentifier(this._builder.Table)}(${escapeIdentifier(this._builder.PrimaryKey)}) ON DELETE ${this._builder.OnDeleteAction} ON UPDATE ${this._builder.OnUpdateAction}`;
|
|
115
141
|
return {
|
|
116
142
|
bindings: [],
|
|
117
143
|
expression: exprr,
|
|
@@ -194,23 +220,24 @@ SqlColumnsCompiler = __decorate([
|
|
|
194
220
|
export { SqlColumnsCompiler };
|
|
195
221
|
let SqlWhereCompiler = class SqlWhereCompiler {
|
|
196
222
|
where(builder) {
|
|
197
|
-
const where = [];
|
|
198
223
|
const bindings = [];
|
|
199
|
-
|
|
200
|
-
builder
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
224
|
+
// Lazy statements must be built FIRST: their build() may have side effects
|
|
225
|
+
// that append further statements to the builder (e.g. a correlated EXISTS
|
|
226
|
+
// sub-query registers its correlation predicate lazily). Building them now and
|
|
227
|
+
// reusing the result guarantees the side effect runs exactly once, and lets the
|
|
228
|
+
// non-lazy pass below pick up any statements the lazy build appended. The lazy
|
|
229
|
+
// results are then emitted after the non-lazy ones (preserving legacy ordering).
|
|
230
|
+
const lazyEntries = builder.Statements.filter((x) => x instanceof LazyQueryStatement).map((stmt) => ({
|
|
231
|
+
boolean: stmt.Boolean,
|
|
232
|
+
result: stmt.build(),
|
|
233
|
+
}));
|
|
234
|
+
const nonLazyEntries = builder.Statements
|
|
235
|
+
.filter((x) => !x.IsAggregate)
|
|
236
|
+
.filter((x) => !(x instanceof LazyQueryStatement))
|
|
237
|
+
.map((stmt) => ({ boolean: stmt.Boolean, result: stmt.build() }));
|
|
211
238
|
return {
|
|
212
239
|
bindings,
|
|
213
|
-
expression:
|
|
240
|
+
expression: joinBuiltStatements(nonLazyEntries.concat(lazyEntries), bindings),
|
|
214
241
|
};
|
|
215
242
|
}
|
|
216
243
|
};
|
|
@@ -218,23 +245,41 @@ SqlWhereCompiler = __decorate([
|
|
|
218
245
|
NewInstance()
|
|
219
246
|
], SqlWhereCompiler);
|
|
220
247
|
export { SqlWhereCompiler };
|
|
248
|
+
/**
|
|
249
|
+
* Joins a list of already-built where/having statements into a single SQL
|
|
250
|
+
* expression, prefixing every statement after the first with its OWN boolean
|
|
251
|
+
* connector. This yields correct mixed grouping such as
|
|
252
|
+
* `a AND b OR c` for `where(a).where(b).orWhere(c)`, instead of applying a single
|
|
253
|
+
* builder-level connector uniformly. Bindings are collected in statement order.
|
|
254
|
+
*/
|
|
255
|
+
function joinBuiltStatements(statements, bindings) {
|
|
256
|
+
const parts = [];
|
|
257
|
+
statements.forEach(({ boolean, result }) => {
|
|
258
|
+
if (Array.isArray(result.Bindings)) {
|
|
259
|
+
bindings.push(...result.Bindings);
|
|
260
|
+
}
|
|
261
|
+
// A single statement always builds to one fragment; guard multi-fragment
|
|
262
|
+
// statements by joining them with AND (they carry no per-fragment connector).
|
|
263
|
+
const fragment = result.Statements.join(' AND ');
|
|
264
|
+
if (fragment === '') {
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
if (parts.length === 0) {
|
|
268
|
+
parts.push(fragment);
|
|
269
|
+
}
|
|
270
|
+
else {
|
|
271
|
+
parts.push(`${(boolean ?? WhereBoolean.AND).toUpperCase()} ${fragment}`);
|
|
272
|
+
}
|
|
273
|
+
});
|
|
274
|
+
return parts.join(' ');
|
|
275
|
+
}
|
|
221
276
|
let SqlHavingCompiler = class SqlHavingCompiler {
|
|
222
277
|
having(builder) {
|
|
223
|
-
const where = [];
|
|
224
278
|
const bindings = [];
|
|
225
|
-
builder.Statements.filter((x) => x.IsAggregate)
|
|
226
|
-
.map((x) => {
|
|
227
|
-
return x.build();
|
|
228
|
-
})
|
|
229
|
-
.forEach((r) => {
|
|
230
|
-
where.push(...r.Statements);
|
|
231
|
-
if (Array.isArray(r.Bindings)) {
|
|
232
|
-
bindings.push(...r.Bindings);
|
|
233
|
-
}
|
|
234
|
-
});
|
|
279
|
+
const aggregates = builder.Statements.filter((x) => x.IsAggregate).map((stmt) => ({ boolean: stmt.Boolean, result: stmt.build() }));
|
|
235
280
|
return {
|
|
236
281
|
bindings,
|
|
237
|
-
expression:
|
|
282
|
+
expression: joinBuiltStatements(aggregates, bindings),
|
|
238
283
|
};
|
|
239
284
|
}
|
|
240
285
|
};
|
|
@@ -342,7 +387,7 @@ let SqlUpdateQueryCompiler = class SqlUpdateQueryCompiler extends SqlQueryCompil
|
|
|
342
387
|
const exprr = [];
|
|
343
388
|
for (const prop of Object.keys(this._builder.Value)) {
|
|
344
389
|
const v = this._builder.Value[`${prop}`];
|
|
345
|
-
exprr.push(
|
|
390
|
+
exprr.push(`${escapeIdentifier(prop)} = ?`);
|
|
346
391
|
bindings = bindings.concat(this.tryConvertValue(v));
|
|
347
392
|
}
|
|
348
393
|
return {
|
|
@@ -409,22 +454,22 @@ let SqlOnDuplicateQueryCompiler = class SqlOnDuplicateQueryCompiler {
|
|
|
409
454
|
.getColumnsToUpdate()
|
|
410
455
|
.map((c) => {
|
|
411
456
|
if (_.isString(c)) {
|
|
412
|
-
|
|
457
|
+
// Reference the row being inserted via VALUES(col) instead of
|
|
458
|
+
// re-binding one specific row's value. Binding `parent.Values[0]`
|
|
459
|
+
// applied the FIRST row's values to every conflicting row in a
|
|
460
|
+
// multi row upsert.
|
|
461
|
+
return `${escapeIdentifier(c)} = VALUES(${escapeIdentifier(c)})`;
|
|
413
462
|
}
|
|
414
463
|
else {
|
|
415
464
|
return c.Query;
|
|
416
465
|
}
|
|
417
466
|
})
|
|
418
467
|
.join(',');
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
}
|
|
425
|
-
else {
|
|
426
|
-
return c.Bindings;
|
|
427
|
-
}
|
|
468
|
+
// Only RawQuery update columns contribute bindings - VALUES(col) needs
|
|
469
|
+
// none. flatMap keeps raw bindings flat; returning the array itself
|
|
470
|
+
// nested them and shifted every following placeholder.
|
|
471
|
+
const bindings = _.flatMap(this._builder.getColumnsToUpdate(), (c) => {
|
|
472
|
+
return _.isString(c) ? [] : c.Bindings ?? [];
|
|
428
473
|
});
|
|
429
474
|
return {
|
|
430
475
|
bindings,
|
|
@@ -445,7 +490,7 @@ let SqlIndexQueryCompiler = class SqlIndexQueryCompiler extends IndexQueryCompil
|
|
|
445
490
|
compile() {
|
|
446
491
|
return {
|
|
447
492
|
bindings: [],
|
|
448
|
-
expression: `CREATE ${this._builder.Unique ? 'UNIQUE ' : ''}INDEX
|
|
493
|
+
expression: `CREATE ${this._builder.Unique ? 'UNIQUE ' : ''}INDEX ${escapeIdentifier(this._builder.Name)} ON ${escapeIdentifier(this._builder.Table)} (${this._builder.Columns.map((c) => escapeIdentifier(c)).join(',')});`,
|
|
449
494
|
};
|
|
450
495
|
}
|
|
451
496
|
};
|
|
@@ -477,31 +522,54 @@ let SqlInsertQueryCompiler = class SqlInsertQueryCompiler extends SqlQueryCompil
|
|
|
477
522
|
expression: '',
|
|
478
523
|
};
|
|
479
524
|
}
|
|
525
|
+
/**
|
|
526
|
+
* Indices of the columns that take part in this INSERT.
|
|
527
|
+
*
|
|
528
|
+
* An auto increment primary key is omitted only when NO row supplies a value
|
|
529
|
+
* for it. If at least one row supplies one the column stays, and the rows
|
|
530
|
+
* that don't emit NULL so the engine assigns the value.
|
|
531
|
+
*
|
|
532
|
+
* Both {@link columns} and {@link values} MUST derive their shape from this
|
|
533
|
+
* single decision - deciding per-row in one place and per-batch in the other
|
|
534
|
+
* produced value tuples whose arity did not match the column list.
|
|
535
|
+
*/
|
|
536
|
+
keptColumnIndices() {
|
|
537
|
+
return this._builder
|
|
538
|
+
.getColumns()
|
|
539
|
+
.map((c, i) => ({ c, i }))
|
|
540
|
+
.filter(({ c, i }) => {
|
|
541
|
+
const descriptor = c.Descriptor;
|
|
542
|
+
if (descriptor && descriptor.AutoIncrement && descriptor.PrimaryKey) {
|
|
543
|
+
return this._builder.Values.some((x) => x[i] !== undefined && x[i] !== null);
|
|
544
|
+
}
|
|
545
|
+
return true;
|
|
546
|
+
})
|
|
547
|
+
.map(({ i }) => i);
|
|
548
|
+
}
|
|
480
549
|
values() {
|
|
481
550
|
if (this._builder.Values.length === 0) {
|
|
482
551
|
throw new InvalidArgument('values count invalid');
|
|
483
552
|
}
|
|
553
|
+
const kept = this.keptColumnIndices();
|
|
484
554
|
const bindings = [];
|
|
485
555
|
let data = 'VALUES ';
|
|
486
556
|
data += this._builder.Values.map((val) => {
|
|
487
|
-
const toInsert =
|
|
488
|
-
|
|
557
|
+
const toInsert = kept.map((i) => {
|
|
558
|
+
// eslint-disable-next-line security/detect-object-injection
|
|
559
|
+
const v = val[i];
|
|
489
560
|
// eslint-disable-next-line security/detect-object-injection
|
|
490
561
|
const descriptor = this._builder.getColumns()[i].Descriptor;
|
|
491
562
|
if (descriptor) {
|
|
492
563
|
if (!descriptor.Nullable && (v === null || v === undefined) && !descriptor.AutoIncrement) {
|
|
493
564
|
throw new InvalidArgument(`value column ${descriptor.Name} cannot be null`);
|
|
494
565
|
}
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
return
|
|
566
|
+
// Auto increment PK this row does not supply. NULL (not DEFAULT) lets
|
|
567
|
+
// the engine assign it and is portable - sqlite does not accept the
|
|
568
|
+
// DEFAULT keyword inside a VALUES tuple.
|
|
569
|
+
if (descriptor.AutoIncrement && descriptor.PrimaryKey && (v === undefined || v === null)) {
|
|
570
|
+
return 'NULL';
|
|
500
571
|
}
|
|
501
572
|
}
|
|
502
|
-
return true;
|
|
503
|
-
})
|
|
504
|
-
.map((v) => {
|
|
505
573
|
if (v === undefined) {
|
|
506
574
|
return 'DEFAULT';
|
|
507
575
|
}
|
|
@@ -519,23 +587,15 @@ let SqlInsertQueryCompiler = class SqlInsertQueryCompiler extends SqlQueryCompil
|
|
|
519
587
|
};
|
|
520
588
|
}
|
|
521
589
|
columns() {
|
|
522
|
-
const columns = this.
|
|
523
|
-
.
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
if (descriptor && descriptor.AutoIncrement && descriptor.PrimaryKey) {
|
|
527
|
-
if (this._builder.Values.every((x) => x[i] !== undefined && x[i] !== null)) {
|
|
528
|
-
return true;
|
|
529
|
-
}
|
|
530
|
-
return false;
|
|
531
|
-
}
|
|
532
|
-
return true;
|
|
533
|
-
})
|
|
534
|
-
.map((c) => {
|
|
535
|
-
return c.Column;
|
|
590
|
+
const columns = this.keptColumnIndices()
|
|
591
|
+
.map((i) => {
|
|
592
|
+
// eslint-disable-next-line security/detect-object-injection
|
|
593
|
+
return this._builder.getColumns()[i].Column;
|
|
536
594
|
})
|
|
537
595
|
.map((c) => {
|
|
538
|
-
|
|
596
|
+
// RawQuery columns carry raw SQL - preserve the existing (unescaped)
|
|
597
|
+
// backtick wrapping. String columns go through the identifier escaper.
|
|
598
|
+
return c instanceof RawQuery ? `\`${c.Query}\`` : escapeIdentifier(c);
|
|
539
599
|
});
|
|
540
600
|
if (columns.length === 0) {
|
|
541
601
|
throw new InvalidArgument('invalid column count');
|
|
@@ -623,10 +683,22 @@ let SqlAlterTableQueryCompiler = class SqlAlterTableQueryCompiler extends AlterT
|
|
|
623
683
|
}
|
|
624
684
|
if (this.builder.Columns.length !== 0) {
|
|
625
685
|
_outputs = _outputs.concat(this.builder.Columns.map((c) => {
|
|
626
|
-
|
|
686
|
+
// keep the compiler instance around - it carries the dialect's answer to
|
|
687
|
+
// "is my expression already a complete statement ?" (see IsStandaloneStatement)
|
|
688
|
+
const compiler = this.container.resolve(AlterColumnQueryCompiler, [c]);
|
|
689
|
+
return { compiler, output: compiler.compile() };
|
|
690
|
+
})
|
|
691
|
+
// a driver may legitimately skip an alteration by compiling it to nothing.
|
|
692
|
+
// emitting it anyway would yield a dangling `ALTER TABLE \`x\`` - invalid SQL.
|
|
693
|
+
.filter(({ output }) => (output.expression ?? '').trim().length !== 0)
|
|
694
|
+
.map(({ compiler, output }) => {
|
|
695
|
+
// some dialects cannot express an alteration as a suffix of `ALTER TABLE x`
|
|
696
|
+
// eg. MSSQL renames a column with `EXEC sp_rename '[t].[old]', 'new', 'COLUMN'`,
|
|
697
|
+
// which is a complete statement and must be emitted verbatim.
|
|
698
|
+
const standalone = compiler.IsStandaloneStatement === true;
|
|
627
699
|
return {
|
|
628
|
-
bindings:
|
|
629
|
-
expression: `${_table} ${
|
|
700
|
+
bindings: output.bindings,
|
|
701
|
+
expression: standalone ? output.expression : `${_table} ${output.expression}`,
|
|
630
702
|
};
|
|
631
703
|
}));
|
|
632
704
|
}
|
|
@@ -663,7 +735,7 @@ let SqlTableCloneQueryCompiler = class SqlTableCloneQueryCompiler extends TableC
|
|
|
663
735
|
// if no filter is provided, copy all the data
|
|
664
736
|
expression: `SELECT * FROM ${_tblName}`,
|
|
665
737
|
};
|
|
666
|
-
const fExprr = `INSERT INTO
|
|
738
|
+
const fExprr = `INSERT INTO ${escapeIdentifier(this.builder.Table)} ${fOut.expression}`;
|
|
667
739
|
return [
|
|
668
740
|
out1,
|
|
669
741
|
{
|
|
@@ -845,7 +917,7 @@ let SqlTableQueryCompiler = class SqlTableQueryCompiler extends TableQueryCompil
|
|
|
845
917
|
}
|
|
846
918
|
_primaryKeys() {
|
|
847
919
|
const _keys = this.builder.Columns.filter((x) => x.PrimaryKey)
|
|
848
|
-
.map((c) =>
|
|
920
|
+
.map((c) => escapeIdentifier(c.Name))
|
|
849
921
|
.join(',');
|
|
850
922
|
if (!_.isEmpty(_keys)) {
|
|
851
923
|
return `PRIMARY KEY (${_keys})`;
|
|
@@ -866,7 +938,7 @@ let SqlColumnQueryCompiler = class SqlColumnQueryCompiler {
|
|
|
866
938
|
constructor(builder) {
|
|
867
939
|
this.builder = builder;
|
|
868
940
|
this._statementsMappings = {
|
|
869
|
-
set: (builder) => `SET(${builder.Args[0].map((a) => `'${a}
|
|
941
|
+
set: (builder) => `SET(${builder.Args[0].map((a) => `'${escapeStringLiteral(a)}'`).join(',')})`,
|
|
870
942
|
string: (builder) => `VARCHAR(${builder.Args[0] ? builder.Args[0] : 255})`,
|
|
871
943
|
boolean: () => `BOOLEAN`,
|
|
872
944
|
float: (builder) => {
|
|
@@ -876,8 +948,8 @@ let SqlColumnQueryCompiler = class SqlColumnQueryCompiler {
|
|
|
876
948
|
},
|
|
877
949
|
double: (builder) => this._statementsMappings.float(builder),
|
|
878
950
|
decimal: (builder) => this._statementsMappings.float(builder),
|
|
879
|
-
enum: (builder) => `${builder.Type.toUpperCase()}(${builder.Args[0].map((a) => `'${a}'`).join(',')})`,
|
|
880
|
-
binary: (builder) => `BINARY(${builder.Args[0] ?? 255}`,
|
|
951
|
+
enum: (builder) => `${builder.Type.toUpperCase()}(${builder.Args[0].map((a) => `'${escapeStringLiteral(a)}'`).join(',')})`,
|
|
952
|
+
binary: (builder) => `BINARY(${builder.Args[0] ?? 255})`,
|
|
881
953
|
smallint: (builder) => builder.Type.toUpperCase(),
|
|
882
954
|
tinyint: (builder) => builder.Type.toUpperCase(),
|
|
883
955
|
mediumint: (builder) => builder.Type.toUpperCase(),
|
|
@@ -898,12 +970,12 @@ let SqlColumnQueryCompiler = class SqlColumnQueryCompiler {
|
|
|
898
970
|
longblob: (builder) => builder.Type.toUpperCase(),
|
|
899
971
|
// COLUMN ADDITIONA PROPS
|
|
900
972
|
unsigned: () => 'UNSIGNED',
|
|
901
|
-
charset: (builder) => `CHARACTER SET '${builder.Charset}'`,
|
|
902
|
-
collation: (builder) => `COLLATE '${builder.Collation}'`,
|
|
973
|
+
charset: (builder) => `CHARACTER SET '${escapeStringLiteral(builder.Charset)}'`,
|
|
974
|
+
collation: (builder) => `COLLATE '${escapeStringLiteral(builder.Collation)}'`,
|
|
903
975
|
notnull: () => `NOT NULL`,
|
|
904
976
|
default: () => this._defaultCompiler(),
|
|
905
977
|
autoincrement: () => `AUTO_INCREMENT`,
|
|
906
|
-
comment: (builder) => `COMMENT '${builder.Comment}'`,
|
|
978
|
+
comment: (builder) => `COMMENT '${escapeStringLiteral(builder.Comment)}'`,
|
|
907
979
|
};
|
|
908
980
|
if (!builder) {
|
|
909
981
|
throw new Error('column query builder cannot be null');
|
|
@@ -911,7 +983,7 @@ let SqlColumnQueryCompiler = class SqlColumnQueryCompiler {
|
|
|
911
983
|
}
|
|
912
984
|
compile() {
|
|
913
985
|
const _stmt = [];
|
|
914
|
-
_stmt.push(
|
|
986
|
+
_stmt.push(escapeIdentifier(this.builder.Name));
|
|
915
987
|
_stmt.push(this._statementsMappings[this.builder.Type](this.builder));
|
|
916
988
|
if (this.builder.Unsigned) {
|
|
917
989
|
_stmt.push(this._statementsMappings.unsigned());
|
|
@@ -948,7 +1020,7 @@ let SqlColumnQueryCompiler = class SqlColumnQueryCompiler {
|
|
|
948
1020
|
return _stmt;
|
|
949
1021
|
}
|
|
950
1022
|
if (_.isString(this.builder.Default.Value)) {
|
|
951
|
-
_stmt = `DEFAULT '${this.builder.Default.Value.trim()}'`;
|
|
1023
|
+
_stmt = `DEFAULT '${escapeStringLiteral(this.builder.Default.Value.trim())}'`;
|
|
952
1024
|
}
|
|
953
1025
|
else if (_.isNumber(this.builder.Default.Value)) {
|
|
954
1026
|
_stmt = `DEFAULT ${this.builder.Default.Value}`;
|
|
@@ -964,38 +1036,84 @@ SqlColumnQueryCompiler = __decorate([
|
|
|
964
1036
|
__metadata("design:paramtypes", [ColumnQueryBuilder])
|
|
965
1037
|
], SqlColumnQueryCompiler);
|
|
966
1038
|
export { SqlColumnQueryCompiler };
|
|
967
|
-
let SqlAlterColumnQueryCompiler = class SqlAlterColumnQueryCompiler extends
|
|
968
|
-
constructor(builder) {
|
|
969
|
-
super(
|
|
1039
|
+
let SqlAlterColumnQueryCompiler = class SqlAlterColumnQueryCompiler extends AlterColumnQueryCompiler {
|
|
1040
|
+
constructor(container, builder) {
|
|
1041
|
+
super();
|
|
1042
|
+
this.container = container;
|
|
1043
|
+
this.builder = builder;
|
|
1044
|
+
if (!builder) {
|
|
1045
|
+
throw new InvalidArgument('builder cannot be null or undefined');
|
|
1046
|
+
}
|
|
1047
|
+
}
|
|
1048
|
+
/**
|
|
1049
|
+
* Renders the column body using the DRIVER's own column compiler, resolved
|
|
1050
|
+
* from the container (late binding) - exactly like the CREATE TABLE path does.
|
|
1051
|
+
* Previously this was `super.compile()`, which statically bound every driver
|
|
1052
|
+
* to orm-sql's MySQL dialect.
|
|
1053
|
+
*/
|
|
1054
|
+
_columnDefinition() {
|
|
1055
|
+
return this.container.resolve(ColumnQueryCompiler, [this.builder]).compile();
|
|
1056
|
+
}
|
|
1057
|
+
/**
|
|
1058
|
+
* Whether the expression produced by `compile()` is already a complete, standalone
|
|
1059
|
+
* statement. When true, SqlAlterTableQueryCompiler emits it verbatim instead of
|
|
1060
|
+
* prefixing it with `ALTER TABLE <table> `.
|
|
1061
|
+
*
|
|
1062
|
+
* Needed by dialects whose alteration is not expressible as a suffix of ALTER TABLE,
|
|
1063
|
+
* eg. MSSQL's `EXEC sp_rename '[t].[old]', 'new', 'COLUMN'`.
|
|
1064
|
+
*
|
|
1065
|
+
* It is read AFTER `compile()`, so a subclass may decide per `builder.AlterType`.
|
|
1066
|
+
* Defaults to false - MySQL (this class) always emits a suffix.
|
|
1067
|
+
*/
|
|
1068
|
+
get IsStandaloneStatement() {
|
|
1069
|
+
return false;
|
|
1070
|
+
}
|
|
1071
|
+
/**
|
|
1072
|
+
* Dialect hooks. Returning `null` means "emit no statement at all" - the
|
|
1073
|
+
* parent AlterTableQueryCompiler filters such columns out.
|
|
1074
|
+
*/
|
|
1075
|
+
_add(definition) {
|
|
1076
|
+
// escapeIdentifier, not raw backticks: an identifier containing a backtick would
|
|
1077
|
+
// otherwise terminate the quote and splice arbitrary SQL into the DDL ( A3 ).
|
|
1078
|
+
return `ADD ${definition} ${this.builder.AfterColumn ? `AFTER ${escapeIdentifier(this.builder.AfterColumn)}` : ''}`;
|
|
1079
|
+
}
|
|
1080
|
+
_modify(definition) {
|
|
1081
|
+
return `MODIFY ${definition}`;
|
|
1082
|
+
}
|
|
1083
|
+
_rename() {
|
|
1084
|
+
return `RENAME COLUMN ${escapeIdentifier(this.builder.OldName)} TO ${escapeIdentifier(this.builder.Name)}`;
|
|
970
1085
|
}
|
|
971
1086
|
compile() {
|
|
972
|
-
|
|
973
|
-
if (builder.AlterType === ColumnAlterationType.Rename) {
|
|
974
|
-
const bld = this.builder;
|
|
1087
|
+
// rename never renders a column body, so it must not resolve one
|
|
1088
|
+
if (this.builder.AlterType === ColumnAlterationType.Rename) {
|
|
975
1089
|
return {
|
|
976
1090
|
bindings: [],
|
|
977
|
-
expression:
|
|
978
|
-
};
|
|
979
|
-
}
|
|
980
|
-
const cDefinition = super.compile();
|
|
981
|
-
if (builder.AlterType === ColumnAlterationType.Add) {
|
|
982
|
-
return {
|
|
983
|
-
bindings: cDefinition.bindings,
|
|
984
|
-
expression: `ADD ${cDefinition.expression} ${builder.AfterColumn ? `AFTER \`${builder.AfterColumn}\`` : ''}`,
|
|
1091
|
+
expression: this._rename() ?? '',
|
|
985
1092
|
};
|
|
986
1093
|
}
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
1094
|
+
const cDefinition = this._columnDefinition();
|
|
1095
|
+
let expression;
|
|
1096
|
+
switch (this.builder.AlterType) {
|
|
1097
|
+
case ColumnAlterationType.Add:
|
|
1098
|
+
expression = this._add(cDefinition.expression);
|
|
1099
|
+
break;
|
|
1100
|
+
case ColumnAlterationType.Modify:
|
|
1101
|
+
expression = this._modify(cDefinition.expression);
|
|
1102
|
+
break;
|
|
1103
|
+
default:
|
|
1104
|
+
expression = cDefinition.expression;
|
|
1105
|
+
break;
|
|
992
1106
|
}
|
|
993
|
-
return
|
|
1107
|
+
return {
|
|
1108
|
+
bindings: cDefinition.bindings,
|
|
1109
|
+
expression: expression ?? '',
|
|
1110
|
+
};
|
|
994
1111
|
}
|
|
995
1112
|
};
|
|
996
1113
|
SqlAlterColumnQueryCompiler = __decorate([
|
|
997
1114
|
NewInstance(),
|
|
998
|
-
|
|
1115
|
+
Inject(Container),
|
|
1116
|
+
__metadata("design:paramtypes", [Container, AlterColumnQueryBuilder])
|
|
999
1117
|
], SqlAlterColumnQueryCompiler);
|
|
1000
1118
|
export { SqlAlterColumnQueryCompiler };
|
|
1001
1119
|
let SqlEventQueryCompiler = class SqlEventQueryCompiler extends SqlQueryCompiler {
|